我有一个关于CUDA同步的问题。特别是,我需要澄清if语句中的同步问题。我的意思是,如果我将一个__syncthreads()放在if语句的作用域内,那么会发生什么?我认为有些线程会“永远”等待其他不会触及同步点的线程。所以,我写和执行的一些示例代码来检查:CUDA:__syncthreads()里面if语句
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
index += gridSize;
}
}
令人惊讶的是,我观察到的输出是一个相当“正常”(64个元素,BLOCKSIZE 32):
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
100 100 100 100 100 100 100 100 100 100 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
所以我稍微修改我的代码以下列方式:
__global__ void kernel(float* vett, int n)
{
int index = blockIdx.x*blockDim.x + threadIdx.x;
int gridSize = blockDim.x*gridDim.x;
while(index < n)
{
vett[index] = 2;
if(threadIdx.x < 10)
{
vett[index] = 100;
__syncthreads();
}
__syncthreads();
vett[index] = 3;
__syncthreads();
index += gridSize;
}
}
输出功率为:
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
同样,我错了:我认为if语句中的线程在修改vector的元素之后将保持等待状态,并且永远不会超出if范围。所以......请你说清楚发生了什么?同步点之后获得的线程是否会阻止等待屏障的线程? 如果您需要重现我的情况,我使用SDK 4.2的CUDA Toolkit 5.0 RC。提前致谢。
给予回答您问题的人的选中标记(接受的答案)。 – Yakk