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;
}