我是cuda的新手,目前正在使用cuda进行并行缩减。 我做了很多研究,并且知道warp中的线程应该同步而不调用“__syncthreads()”。 但是,当我使用以下内容测试内核时(仅启动32个线程的1个块):
__global__ void TestKernel()
{
int tid = threadIdx.x;
__shared__ float temp[32];
temp[threadIdx.x] = 1;
printf(" temp[%d] = %f\n", threadIdx.x, temp[threadIdx.x]);
int thread = tid % 32;
if (thread < 16){
temp[thread] += temp[thread + 16];
//__syncthreads();
temp[thread] += temp[thread + 8];
//__syncthreads();
temp[thread] += temp[thread + 4];
//__syncthreads();
temp[thread] += temp[thread + 2];
//__syncthreads();
temp[thread] += temp[thread + 1];
}
printf(" temp[%d] = %f\n", 0 , temp[0]);
}
我通过以下方式启动了内核:
dim3 Blockdim(32);
TestKernel << <1, Blockdim >> >();
我正在做的是将值1分配给大小为32的数组,并使用并行缩减将它们全部加在一起,并将最终结果存储到数组的第一个位置。 这不会给我正确的输出。它输出temp [0] = 6而不是32。 但是,如果我在每一步取消注释“__syncthreads()”,它将产生32的正确答案。
所以这基本上告诉我,warp中的线程并不像他们所说的那样是同步的。谁能解释一下这里发生了什么? 在程序中有一些我无法确定的事情: 1,在这个内核调用中,我在这个warp中只使用了一个warp和所有32个线程吗? 2,如果我只使用一个warp,并且所有线程都在这个warp中,为什么它们在我调用“__synthreads()”时看起来不同步并且只是同步?
提前感谢您的帮助!