我尝试使用 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个线程以避免使用j1
(Nspb=5000
)的循环。我尝试过不同的方法,但我找不到使用两组不同线程的方法,第一个块与我使用它的方式相同,另外5个用来替换{{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卷积/交叉相关: