如何高效地进行并行选择?
例如,给定这个标量代码,是否有一种方法可以让Cg编译器使代码并行/SIMD执行(并且可能使用无分支选择)。
Out.x = ( A.x <= threshold) ? B.x : C.x ;
Out.y = ( A.y <= threshold) ? B.y : C.y ;
Out.z = ( A.z <= threshold) ? B.z : C.z ;
Out.w = ( A.w <= threshold) ? B.w : C.w ;
显然,我错过了Cg手册中的这一行:
The ?:, ||, &&, &, and comparison operators can
be used with bool vectors to perform multiple
conditional operations simultaneously.
所以我尝试了这个,它似乎工作:
Out.xyzw = ( A.xyzw <= threshold) ? B.xyzw : C.xyzw ;
我想我没想到最简单的解决方案就能起作用!
我的同事是一名图形程序员,他也建议在某些平台上,Cg编译器可能足够智能,可以为我优化原始源代码,但不能保证,如果可能的话,明确指定并行SIMD操作总是更好。