比Cuda更好的C ++时序

时间:2013-01-08 22:54:41

标签: c++ cuda

我在使用CUDA编写程序时遇到问题。我正在做的程序是一个加密,它通过向量执行矩阵的乘法,并根据我引入的向量给出结果。问题是我在C ++和CUDA中都花时间在C ++中给我一个比CUDA更好的结果。我做的是做一个循环,因为我需要几个加密密钥,代码如下:

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分钟

密钥数量为1,000,000。 矩阵7 x 7和矢量7。

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

感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

您的代码可能出现的问题:

  1. 大部分时间都花在cudaMemcpy()cout<<
  2. 速度可能受网格/块大小的限制。一般来说,网格中的#块应该是&gt; =#stream进程以充分利用GPU硬件;块中的#个线程应该至少为64,并且总是多个warp大小。
  3. 矩阵/矢量大小太小,无法实现良好的可扩展性
  4. 可能的解决方案:

    1. 尝试做1 m_ {7,000,000x7} * v_ {7};而不是做1,000,000 m_ {7x7} * v_ {7};
    2. 尝试将1,000,000 cudaMemcpy()合并为1;
    3. 使用cudaMallocPitch()为小矩阵分配内存,从而放松了对话问题;
    4. 如果矩阵/向量的元素类型为double / float,则尝试使用cublas库中提供的cublas_gemv()
    5. 您可能希望阅读CUDA C编程指南&amp;在编写自己的内核之前的C最佳实践指南