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做矩阵乘可参考:
#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;
}