CUDA内核中的不同线程组

时间:2017-10-30 10:57:20

标签: cuda

我尝试使用 CUDA 内核加速 C 中的互相关函数。现在这就是我所拥有的:

__global__ void xcorr(cuDoubleComplex *temp1, cuDoubleComplex *temp2, cuDoubleComplex *temp3, int Nb, int binM, int Nspb)
{
   for (int k1 = 0; k1 < Nb; k1++)
   {
       int idx = blockIdx.x * blockDim.x + threadIdx.x;
       for (int j1 = 0; j1 < Nspb; j1++)
       {
           if ((j1 + idx) <(Nspb + binM))
           {
               temp3[idx + k1*(binM + 1)].x += (temp1[idx + j1 + (k1*(binM + Nspb))].x*temp2[j1 + (k1*Nspb)].x) + (temp1[idx + j1 + (k1*(binM + Nspb))].y*temp2[j1 + (k1*Nspb)].y);
               temp3[idx + k1*(binM + 1)].y += (-temp1[idx + j1 + (k1*(binM + Nspb))].x*temp2[j1 + (k1*Nspb)].y) + (temp1[idx + j1 + (k1*(binM + Nspb))].y*temp2[j1 + (k1*Nspb)].x);
           }
       }
    }
}

结果是我的预期,但在50 seconds附近仍然需要一段时间才能运作。当我召唤内核时,我就是这样做的

xcorr << <1, 1000 >> > (cuda_E2, cuda_A2, cuda_temp, Nb, *binM, Nspb);

而我想的是发送6个块而不是一个,每个1000个线程以避免使用j1Nspb=5000)的循环。我尝试过不同的方法,但我找不到使用两组不同线程的方法,第一个块与我使用它的方式相同,另外5个用来替换{{1循环。有人可以告诉我怎么样?

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

为第一个块和其他块写入不同的代码,将它们放入if(blockIdx.x == 0)的分支中并启动&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&gt;&gt;&gt;&gt;&gt;格?

__global__ void xcorr(...)
{
   if (blockIdx.x==0) {
       // do block zero stuff
   }
   else {
       // what the other blocks shall do
   }
}

一般来说,对于1D卷积/交叉相关:

  1. 将内核置于常量内存中
  2. 让每个线程块执行相同的操作,但是对于结果数组的不同切片
  3. 让每个块/ tile将此tile所需的输入数组的所有元素加载到共享内存中(包括&#34; halo&#34;在边缘处)