A Warp中的cuda线程似乎不同步

时间:2017-07-21 01:50:00

标签: parallel-processing cuda simd

我是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()”时看起来不同步并且只是同步?

提前感谢您的帮助!

0 个答案:

没有答案