运行CUDA程序时遇到以下问题:
我用一个包含2个线程的块
调用一个简单的内核 CUDAkernel<<<1,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
并行性是否错误完成?
提前感谢!
答案 0 :(得分:2)
这是一台SIMT机器。在任何给定时间,只有一条指令由warp处理。在控制流分歧的情况下,if路径和else路径的处理是顺序处理的,而不是并行处理的。当warp的所有线程到达你的第一个if语句时,线程0处理if路径,而所有其他线程什么都不做。然后warp在结束时重新同步,如果构造并开始并行处理。然后他们点击第二个if语句,只有线程1继续而其他人等待。然后它们在第二个if结构的末尾再次重新同步,并开始以锁步方式处理。
因此,您的示例的净效果是按顺序处理两个if语句。这是预期的。