CUDA并行线程

时间:2013-02-28 18:27:43

标签: parallel-processing cuda

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

  1. 我用一个包含2个线程的块

    调用一个简单的内核

    CUDAkernel<<<1,2>>>

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

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

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

  3. 因此,两个内核线程都调用相同的函数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

    并行性是否错误完成?

    提前感谢!

1 个答案:

答案 0 :(得分:2)

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

因此,您的示例的净效果是按顺序处理两个if语句。这是预期的。