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;
}
相关推荐
_nibel13 小时前
第三章:Details 剩余数据补读 ⭐教你读懂 Nsight Compute 报告 系列合集⭐
cuda·ncu·nsight compute
爱刷碗的苏泓舒21 小时前
RTKLIB Neville 插值法:源码推导与 GNSS 精密轨道应用
线性代数·rtklib·内维尔算法·neville
小飞象—木兮1 天前
经营分析核心思路:经营分析的六层执行框架、底层原则、 全行业通用经营分析方法论
大数据·人工智能·矩阵·数据分析·用户运营
javaDocker1 天前
从「五个窗口」到「一条流水线」:金融核心交易测试的 AI 协作矩阵设计
人工智能·金融·矩阵·研发效能·ai自测
坐看风云变幻1 天前
《飞控数学与控制 · 新手入门连载》第 1 期|线性代数入门:向量、矩阵与旋转矩阵 SO(3)
线性代数·矩阵·飞控·旋转矩阵
智行合一科技2 天前
CTR报告:AI营销成广告增长引擎,GEO与AIGC矩阵营销成破局关键
人工智能·矩阵·aigc
烂蜻蜓3 天前
Matplotlib入门教程(十三):imshow() 详解——灰度图、彩色图、热力图与矩阵可视化
线性代数·矩阵·matplotlib
没有钱的钱仔4 天前
协方差矩阵含义
算法·机器学习·矩阵
Starry-sky(jing)4 天前
onnxruntime 安装后 GPU 没加速?3 条命令确认它跑在 CPU 还是 GPU
python·gpu·cuda·onnxruntime·推理加速
爱刷碗的苏泓舒4 天前
泰勒级数与泰勒展开:GNSS卫地距线性化、Jacobian矩阵与Hessian矩阵
线性代数·算法·矩阵·gnss·雅可比矩阵·卫地距线性化·海森矩阵