如何在Cg中实现高效的并行SIMD比较和选择?

时间:2011-09-12 16:18:47

标签: selection parallel-processing shader simd cg

如何有效地进行平行选择?

例如,给定这个标量代码,是否有一种方法可以编写它,这样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 ;

1 个答案:

答案 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操作总是更好