【发布时间】:2013-05-20 07:22:53
【问题描述】:
当然,通过if 和switch 语句,在 GPU 上要不惜一切代价避免扭曲发散。
但是,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);
}
我的真实场景更复杂(更多条件)但想法相同。
问题:
warp 分歧的开销(在调度中)是否如此之大以至于版本 1)比版本 2 慢?
与版本 1 相比,版本 2 需要更多的 ALU,其中大部分都浪费在“乘以 0”上(只有少数几个条件计算结果为 1 而不是 0)。这是否会将有价值的 ALU 捆绑在无用的操作中,从而延迟其他 warp 中的指令?
【问题讨论】:
-
用if(A
-
禁用扭曲中的某些线程不允许其他线程占用这些核心,除非整个扭曲被禁用。线程指令只能在一个经线的基础上执行。未使用的曲速通道在其他地方没有任何好处
标签: cuda gpu warp-scheduler