当然,在 GPU 上要不惜一切代价避免扭曲发散、viaif
和语句。switch
但是,warp 发散(仅调度一些线程来执行某些行)与额外的无用算术的开销是多少?
考虑以下虚拟示例:
版本 1:
__device__ int get_D (int A, int B, int C)
{
//The value A is potentially different for every thread.
int D = 0;
if (A < 10)
D = A*6;
else if (A < 17)
D = A*6 + B*2;
else if (A < 26)
D = A*6 + B*2 + C;
else
D = A*6 + B*2 + C*3;
return D;
}
对比
版本 2:
__device__ int get_D (int A, int B, int C)
{
//The value A is potentially different for every thread.
return A*6 + (A >= 10)*(B*2) + (A < 26)*C + (A >= 26)*(C*3);
}
我的真实情况更复杂(更多条件),但想法相同。
问题:
经线发散的开销(在调度中)是否如此之大以至于版本 1)比版本 2 慢?
版本 2 需要比版本 1 更多的 ALU,其中大部分都浪费在“乘以 0”上(只有少数几个条件计算为 1 而不是 0)。这是否会将有价值的 ALU 捆绑在无用的操作中,从而延迟其他 warp 中的指令?