大多数情况下,CUDA 或 OpenCL 程序中都需要一个分支,例如:
for (int i=0; i<width; i++)
{
if( i % threadIdx.x == 0)
quantity += i*i;
}
代码总是可以(或至少在大多数情况下)以非分支方式重写:
for (int i=0; i<width; i++)
{
quantity += i*i* (i % threadIdx.x != 0);
}
权衡似乎是在单个扭曲槽中运行而不是在所有线程上进行更多计算(在第二种情况下,总和总是执行,只是有时值为零)
假设分支操作将为每个可能的分支占用多个扭曲槽,人们会期望第二个始终比第一个好,现在我的问题是;我是否可以依靠编译器将 1) 优化为 2),只要它有意义,或者没有广泛适用的标准,这意味着如果没有尝试和分析,通常无法确定哪个更好?