什么是OpenCL';s select运算符对什么有用? 我注意到OpenCL有一个选择()//>函数/BuiTIN /操作符,它看起来类似于C和C++中的三元运算符,但不完全相同。选择()> >:,为什么前者即使在后者后面也需要?< /p> < p>为什么选择操作符是必要的/有用的,是用OpenCL 向量类型< /强>,如国际标准> 2>代码>, FLUAT4//COD> >不同于C++,在这里,您可以重载各种操作符,为它们提供自定义语义——在C(和OpenCLC)中,只有默认行为。对于三元运算符,这意味着 x ? expression_for_true : expression_for_false

什么是OpenCL';s select运算符对什么有用? 我注意到OpenCL有一个选择()//>函数/BuiTIN /操作符,它看起来类似于C和C++中的三元运算符,但不完全相同。选择()> >:,为什么前者即使在后者后面也需要?< /p> < p>为什么选择操作符是必要的/有用的,是用OpenCL 向量类型< /强>,如国际标准> 2>代码>, FLUAT4//COD> >不同于C++,在这里,您可以重载各种操作符,为它们提供自定义语义——在C(和OpenCLC)中,只有默认行为。对于三元运算符,这意味着 x ? expression_for_true : expression_for_false,opencl,gpgpu,conditional-operator,Opencl,Gpgpu,Conditional Operator,将执行单个检查,并使用单个适当的值-即使所有三个操作数都是OpenCL向量类型 相反,使用select(): 所有元素必须具有与向量类型相同的维度,例如int4、float4和float4 对向量类型中的每个位置执行不同的检查 对于向量类型中的每个位置,在真表达式和假表达式的元素之间进行不同的选择 另外,让我们有点困惑的是,select()的参数顺序不同于三元运算符:x?y:z对应于选择(z,y,x) 因此如果 x = (int4) ( 1, 0 ); y = (float4) ( 1.2,

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

相反,使用
select()

  • 所有元素必须具有与向量类型相同的维度,例如
    int4
    float4
    float4
  • 对向量类型中的每个位置执行不同的检查
  • 对于向量类型中的每个位置,在真表达式和假表达式的元素之间进行不同的选择
另外,让我们有点困惑的是,
select()
的参数顺序不同于三元运算符:
x?y:z
对应于
选择(z,y,x)

因此如果

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

另请参见Khronos OpenCL文档和

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