OpenCL 的 select 运算符有什么用?

What is OpenCL's select operator useful for?

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

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

x ? expression_for_true : expression_for_false

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

相反,select():

  • 所有元素的维度必须与矢量类型相同,例如int4float4float4
  • a 不同 检查向量类型中的每个位置。
  • a different 对向量类型中的每个位置进行真假表达式元素的选择

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

因此如果

x = (int4) ( 1, 0 );
y = (float4) ( 1.2, 3.4 );
z = (float4) ( 5.6, 7.8 );

然后

select(z, y, x) == (float4) ( 1.2, 7.8 );

另请参阅 Khronos OpenCL 文档,here and here