我有一个 CUDA 程序的以下代码:
#include <stdio.h>
#define NUM_BLOCKS 4
#define THREADS_PER_BLOCK 4
__global__ void hello()
{
printf("Hello. I'm a thread %d in block %d\n", threadIdx.x, blockIdx.x);
}
int main(int argc,char **argv)
{
// launch the kernel
hello<<<NUM_BLOCKS, THREADS_PER_BLOCK>>>();
// force the printf()s to flush
cudaDeviceSynchronize();
return 0;
}
其中每个线程都会打印它的threadIdx.x
and blockIdx.x
。该程序的一种可能输出是这样的:
Hello. I'm a thread 0 in block 0
Hello. I'm a thread 1 in block 0
Hello. I'm a thread 2 in block 0
Hello. I'm a thread 3 in block 0
Hello. I'm a thread 0 in block 2
Hello. I'm a thread 1 in block 2
Hello. I'm a thread 2 in block 2
Hello. I'm a thread 3 in block 2
Hello. I'm a thread 0 in block 3
Hello. I'm a thread 1 in block 3
Hello. I'm a thread 2 in block 3
Hello. I'm a thread 3 in block 3
Hello. I'm a thread 0 in block 1
Hello. I'm a thread 1 in block 1
Hello. I'm a thread 2 in block 1
Hello. I'm a thread 3 in block 1
运行该程序几次我得到类似的结果,除了块顺序是随机的。例如,在上面的输出中,我们的块顺序为 0, 2, 3, 1。再次运行该问题,我得到 1,2,3, 0。这是预期的。然而,每个块中的线程顺序始终是0,1,2,3。为什么会发生这种情况?我也以为会是随机的。
我尝试更改代码以强制每个块中的线程 0 需要更长的时间来执行。我是这样做的:
__global__ void hello()
{
if (threadIdx.x == 0)
{
int k = 0;
for ( int i = 0; i < 1000000; i++ )
{
k = k + 1;
}
}
printf("Hello. I'm a thread %d in block %d\n", threadIdx.x, blockIdx.x);
}
我期望线程顺序为 1,2,3, 0。但是,我得到了与上面显示的结果类似的结果,其中线程顺序始终为 0,1,2,3。为什么会发生这种情况?