OpenCL 的 select 运算符有什么用?

ein*_*ica 2 gpgpu simd conditional-operator opencl

我注意到 OpenCL 有一个select()函数/内置/运算符,它似乎类似于 C 和 C++ 中的三元运算符,但又不完全一样。select()和之间有什么区别?:,如果我们有后者,为什么还需要前者?

ein*_*ica 5

该运算符是必要/有用的原因select是为了处理 OpenCL向量类型,例如等int2float4与 C++ 不同,您可以重载各种运算符以赋予它们自定义语义 - 在 C(和 OpenCL C)中只有默认行为。对于三元运算符,这意味着对于

x ? expression_for_true : expression_for_false
Run Code Online (Sandbox Code Playgroud)

将执行单个检查,并使用单个适当的值 - 即使所有三个操作数都是 OpenCL 向量类型

相反,用select()

  • 所有元素必须具有与向量类型相同的维度,例如int4float4float4
  • 对向量类型中的每个位置执行不同的检查。
  • 对于向量类型中的每个位置,在真假表达式的元素之间做出不同的选择

另外,让我们有点困惑的是,参数 to 的顺序select()与三元运算符不同:x ? y : z对应于select(z, y, x)

因此如果

x = (int4) ( 1, 0 );
y = (float4) ( 1.2, 3.4 );
z = (float4) ( 5.6, 7.8 );
Run Code Online (Sandbox Code Playgroud)

然后

select(z, y, x) == (float4) ( 1.2, 7.8 );
Run Code Online (Sandbox Code Playgroud)

另请参阅此处此处的Khronos OpenCL 文档。