在以下内核中,我使用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 );
答案 0 :(得分:5)
虽然它在技术上被称为&#34;分歧&#34; (因为并非warp中的所有线程都以相同的方式评估条件),它完全无害。
不将谓词评估为true
的线程将被禁用:它不是性能问题,因为这些线程无论如何都不会参与计算。您没有丢失任何实际的工作线程。在N
与1 mod 32
一致的病态情况下(或者无论经线大小是什么),只有一个经线几乎完全被浪费了#34;但同样,它是不是性能问题。
当warp中的线程采用需要串行执行的不同路径时,Warp分歧会损害您的性能。这不是这种情况。