Parallel processing CUDA并行线程
我在运行CUDA程序时遇到以下问题:Parallel processing CUDA并行线程,parallel-processing,cuda,Parallel Processing,Cuda,我在运行CUDA程序时遇到以下问题: 我用一个有两个线程的块调用一个简单内核 CUDAkernel 在内核中,我执行以下操作: inti=threadIdx.x if(i==0){ waitabit(); } if(i==1){ waitabit(); } 因此,两个内核线程调用相同的函数waitabit(),这几乎浪费了一些时间 时钟周期: __device__ void waitabit(){ clock_t start = clock(); clock_t now;
CUDAkernel
inti=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
并行性是否做得不正确
提前谢谢 这是一台SIMT机器。在任何给定时间,warp只处理一条指令。在控制流发散的情况下,if路径和else路径的处理是顺序处理的,而不是并行处理的。当warp的所有线程到达第一个if语句时,线程0处理if路径,而所有其他线程不执行任何操作。然后,扭曲在if构造结束时重新同步,并开始并行处理。然后,他们点击第二个if语句,只有线程1继续,而其他线程等待。然后,它们在第二个if构造结束时再次同步,并在lockstep中开始处理
因此,您的示例的净效果是两个if语句按顺序处理。这是意料之中的。非常感谢。如果是这样,那么如何在内核中并行运行两个函数“waitabit”?应该做什么而不是“如果”?如果你做
if(i<2)
,会发生什么?