0

运行 CUDA 程序时遇到以下问题:

  1. 我用一个有 2 个线程的块调用一个简单的内核

    CUDAkernel<<<1,2>>>

  2. 在内核内部,我执行以下操作:

    int i = threadIdx.x; if (i==0){ waitabit(); }

    if (i==1){ waitabit(); }

因此,两个内核线程都调用相同的函数waitabit(),这几乎浪费了一些时钟周期:

__device__ void waitabit(){
    clock_t start = clock();
        clock_t now;
        for (;;) {
        now = clock();
        clock_t cycles = now > start ? now - start : now + (0xffffffff - start);
            if (cycles >= 10000000  ) 
            {break;}
        }           
}

现在的问题是:该函数waitabit()将线程延迟 0.008 秒。我很自然地假设线程是并行运行的,所以它们都会并行停止0.008 秒(大约),整个内核的延迟大约是 0.008 秒。

然而,这种情况并非如此。内核串行执行,延迟为0.016,即2*0.008

并行性是否不正确?

提前致谢!

4

1 回答 1

2

这是一台 SIMT 机器。在任何给定时间,warp 只处理一条指令。在控制流发散的情况下,if 路径和 else 路径的处理是顺序处理的,而不是并行处理的。当 warp 的所有线程都到达您的第一个 if 语句时,线程 0 处理 if 路径,而所有其他线程什么都不做。然后,warp 在 if 构造结束时重新同步并开始并行处理。然后他们点击第二个 if 语句,只有线程 1 继续,而其他线程等待。然后它们在第二个 if 构造结束时再次重新同步,并开始同步处理。

因此,您的示例的最终效果是两个 if 语句是按顺序处理的。这是意料之中的。

于 2013-02-28T18:42:37.290 回答