VS2015+cublas实操记录(cuda加速GEMM矩阵乘加算子)

1. 环境配置:

cuda安装后一般的安装位置在:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8

把这个目录下的include和lib分别配置在vs中,安装cuda教程可参考:https://zhuanlan.zhihu.com/p/520995962(笔者实操ok版本:win11+cuda11.8+cdunn8.2.1.32+trt8.5.3.1)。

另外还要记得添加附加依赖项

复制代码
cublas.lib
cudart.lib

不然会报错:

error LNK2019: 无法解析的外部符号 cudaMalloc,该符号在函数 "class cv::Mat __cdecl CublasByCuda(class cv::Mat,class cv::Mat)" (?CublasByCuda@@YA?AVMat@cv@@V12@0@Z) 中被引用

2. 代码可参考:

https://blog.csdn.net/baishuiniyaonulia/article/details/120119380

  • 如果你是结合opencv,用cv::Mat做矩阵乘可参考:
py 复制代码
#include <iostream>
#include <opencv2/core.hpp>
#include <cuda_runtime.h>
#include <cublas_v2.h>

int main() {
    const int N = 1000;
    const int K = 500;
    const int M = 800;

    // 创建 cuBLAS 句柄
    cublasHandle_t cublasHandle;
    cublasCreate(&cublasHandle);

    // 分配设备内存
    float *d_A, *d_B, *d_C;
    cudaMalloc((void**)&d_A, N * K * sizeof(float));
    cudaMalloc((void**)&d_B, K * M * sizeof(float));
    cudaMalloc((void**)&d_C, N * M * sizeof(float));

    // 在这里可以将数据填充到 d_A 和 d_B
    // 例如,将 cv::Mat 转换为设备内存中的数据
    cv::Mat A(N, K, CV_32F);
    cv::Mat B(K, M, CV_32F);
    cv::randu(A, 0.0, 1.0);
    cv::randu(B, 0.0, 1.0);
    cudaMemcpy(d_A, A.data, N * K * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(d_B, B.data, K * M * sizeof(float), cudaMemcpyHostToDevice);

    const float alpha = 1.0f;
    const float beta = 0.0f;

    // 调用 cuBLAS 进行矩阵乘法计算
    cublasSgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N,
                M, N, K,
                &alpha, d_B, M,
                d_A, K,
                &beta, d_C, M);

    // 将结果从设备内存传回主机内存
    cv::Mat C(N, M, CV_32F);
    cudaMemcpy(C.data, d_C, N * M * sizeof(float), cudaMemcpyDeviceToHost);

    // 打印计算结果
    std::cout << "Result Matrix C:" << std::endl << C << std::endl;

    // 清理资源
    cublasDestroy(cublasHandle);
    cudaFree(d_A);
    cudaFree(d_B);
    cudaFree(d_C);

    return 0;
}
相关推荐
碧海潮生_CC8 小时前
【CUDA笔记】04 CUDA 归约, 原子操作,Warp 交换
笔记·cuda
做怪小疯子12 小时前
LeetCode 热题 100——矩阵——旋转图像
算法·leetcode·矩阵
passxgx19 小时前
11.1 高斯消元法的应用
线性代数·矩阵
在路上看风景1 天前
2.2 列空间和零空间
线性代数
前端小L2 天前
图论专题(十九):DAG上的“关键路径”——极限规划「并行课程 III」
算法·矩阵·深度优先·图论·宽度优先
艾莉丝努力练剑2 天前
【优选算法必刷100题】第031~32题(前缀和算法):连续数组、矩阵区域和
大数据·人工智能·线性代数·算法·矩阵·二维前缀和
Beginner x_u2 天前
线性代数 必背公式总结&&线代计算技巧总结_分块矩阵大总结_秩一矩阵大总结
线性代数·矩阵·特征值·特征向量·计算技巧
没书读了2 天前
计算机组成原理-考前记忆清单
线性代数·算法
Hcoco_me2 天前
大模型面试题5:矩阵(M*M)特征值分解的步骤
算法·机器学习·矩阵
oscar9992 天前
高等数学第四章 向量代数与空间解析几何
线性代数·矩阵