Parallel processing 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;

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

  • 我用一个有两个线程的块调用一个简单内核

    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)
    ,会发生什么?