gpt4 book ai didi

c++ - 在 C++ 中比 Cuda 更好的计时

转载 作者:行者123 更新时间:2023-11-30 02:57:45 36 4
gpt4 key购买 nike

我在 CUDA 中编写程序时遇到问题。我正在做的程序是一个加密,它执行一个矩阵乘以一个 vector ,并根据我引入的 vector 给我一个结果。问题是我在 C++ 和 CUDA 上都花时间,并且在 C++ 上给我的结果比 CUDA 好。我做的是循环,因为我需要几个 key 来加密,代码如下:

t1 = clock();
do {

HANDLE_ERROR ( cudaMemcpy(MAT_dev, MAT, nBytes, cudaMemcpyHostToDevice) );
HANDLE_ERROR ( cudaMemcpy(VEC_dev, VEC, nBytes, cudaMemcpyHostToDevice) );

mult<<< 1, b >>>(MAT_dev, VEC_dev, SOL_dev, b);

HANDLE_ERROR ( cudaMemcpy(SOL, SOL_dev, nBytes, cudaMemcpyDeviceToHost) );

for (i = 0; i < b; i++) {
cout << SOL[i] << " ";
}
cout << endl;

for (i = 0; i < b; i++) {
VEC[i] = SOL[i];
}

cont = cont + 1;

} while (cont < w);
t2 = clock();

我的结果:

C++:11.474 分钟

CUDA:40.464 分钟

key 数量为 1,000,000。矩阵 7 x 7 和 vector 7。

不知道是否可以,或者我缺少一些可以让它更快的东西。

感谢您的帮助。

最佳答案

您的代码可能存在的问题:

  1. 大部分时间花在 cudaMemcpy() 上和 cout<<
  2. 速度可能会受到网格/ block 大小的限制。一般来说,网格中的 # blocks 应该 >= # stream processes 以充分利用 GPU 硬件; # block 中的线程数应至少为 64,并且始终是 warp 大小的倍数。
  3. 矩阵/vector 尺寸太小,无法实现良好的可扩展性

可能的解决方案:

  1. 不要做 1,000,000 m_{7x7} * v_{7},而是尝试做 1 m_{7,000,000x7} * v_{7};
  2. 尝试将 1,000,000 个 cudaMemcpy() 合并为 1;
  3. 使用 cudaMallocPitch() 为小矩阵分配内存,从而缓解对齐问题;
  4. 如果矩阵/vector 的元素类型是 double / float ,请尝试使用 cublas 库中提供的 cublas_gemv()

您可能希望在编写自己的内核之前阅读 CUDA C 编程指南和 C 最佳实践指南

关于c++ - 在 C++ 中比 Cuda 更好的计时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14225471/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com