写入CUDA代码的低速加速

时间:2013-05-14 21:07:04

标签: cuda

我为CPU(C ++)和CUDA中的相同程序编写了两个单独的代码。我不知道为什么CUDA代码的加速比CPU代码少。
我有三个矩阵HEF,并对这些矩阵执行操作。 CPU代码中的加速时间为0.004s,CUDA代码中的加速时间为:0.006s,其中矩阵的尺寸为32 * 32。在内核代码中,我定义了三个共享内存变量matrix_Hmatrix_Ematrix_F,并从全局内存中复制了dev_Hdev_Edev_F个值共享内存,用于加速内存访问时间,最后将计算出的共享内存变量复制到全局内存中 这是因为内核调用或其他地方有很多参数?

__global__ void kernel_ScoreMatrix(char *dev_seqA, char *dev_seqB, 
   int *dev_H, int *dev_E, int *dev_F, int *dev_i_side, int *dev_j_side,
   int *dev_lenA, int *dev_idx_array, int *dev_array_length)
{
   __shared__ int matrix_H[1024];
   __shared__ int matrix_E[1024];
   __shared__ int matrix_F[1024];

   int x= threadIdx.x;
   int y= threadIdx.y;

   //calculate current_cell that execute with threads
   int current_cell = *(dev_lenA)*(y) + x;

   matrix_H[current_cell]=dev_H[current_cell];
   matrix_E[current_cell]=dev_E[current_cell];
   matrix_F[current_cell]=dev_F[current_cell];

   int index=0;

   int scoreMatrix[4];

   //for determine cells  that must compute in this time
   for (int i=0; i<*(dev_array_length); i++)
    if (current_cell== dev_idx_array[i]){
            scoreMatrix[0] = H_Matrix(current_cell, x, y, matrix_H, dev_seqA, dev_seqB, dev_lenA); 
            scoreMatrix[1] = E_Matrix(current_cell, matrix_E, matrix_H, dev_lenA);
            scoreMatrix[2] = F_Matrix(current_cell, matrix_F, matrix_H, dev_lenA);
            scoreMatrix[3] = 0;
            dev_H[current_cell] = findMax(scoreMatrix,4, index);
}
主要功能

dim3 threadsPerBlock(32, 32);
kernel_ScoreMatrix<<<1,threadsPerBlock>>>(dev_seqA, dev_seqB, dev_H, dev_E, dev_F, 
        dev_i_side, dev_j_side, dev_lenA, dev_idx_array, dev_array_length);

1 个答案:

答案 0 :(得分:4)

线程块by definition在单个SM上执行。因此,无论threadblock包含多少个线程,您可用于执行该特定线程块的执行资源是该(单个)SM中的资源。由于几乎所有NVIDIA GPU都包含多个SM,为了保持GPU忙(这是获得大多数性能所必需的),因此需要启动具有多个线程块的网格。一个合理的经验法则是拥有至少2-4倍的线程块数量,因为你拥有SMs,并且通常没有比这更多的线程块。

但是如果你启动一个只有1个线程块的内核,你只能使用1个SM。因此,您可以从机器获得大约1/(number of SMs in your GPU)的性能。该线程块中的线程数不会影响此因素。