如何在没有分支发散的情况下检查CUDA内核中数组的边界

时间:2014-10-27 21:55:46

标签: cuda

在以下内核中,我使用if语句来避免超出范围的计算。但如果我理解正确的话,`if'语句将导致分支差异,这会减慢计算速度 - 如果我在这里错了,请纠正我。

我的问题:如何在内核中进行超出范围的计算时避免使用if语句?

__global__ void vector_add(float *a, float *b, float *c)
{
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    if(index < N)
          c[index] = a[index]*a[index] + b[index]*b[index];
}
//kernel call here
vector_add<<< (N + (THREADS_PER_BLOCK+1)) / THREADS_PER_BLOCK, THREADS_PER_BLOCK >>>( d_a, d_b, d_c );

1 个答案:

答案 0 :(得分:5)

虽然它在技术上被称为&#34;分歧&#34; (因为并非warp中的所有线程都以相同的方式评估条件),它完全无害。

不将谓词评估为true的线程将被禁用:它不是性能问题,因为这些线程无论如何都不会参与计算。您没有丢失任何实际的工作线程。在N1 mod 32一致的病态情况下(或者无论经线大小是什么),只有一个经线几乎完全被浪费了#34;但同样,它是不是性能问题。

当warp中的线程采用需要串行执行的不同路径时,Warp分歧会损害您的性能。这不是这种情况。