如何有效地进行平行选择?
例如,给定这个标量代码,是否有一种方法可以编写它,这样Cg编译器就可以使代码并行/ SIMD执行(并且也可以使用branchfree选择)。
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 ;
答案 0 :(得分:0)
显然,我在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操作总是更好