我注意到OpenCL具有select()
函数/内建函数/运算符,它似乎与C和C ++中的三元运算符相似,但不完全相同。 select()
和?:
有什么区别,如果有后者,为什么甚至需要前者?
select
运算符必要/有用的原因是使用OpenCL vector types,例如int2
,float4
等。与C ++不同,您可以重载各种运算符以赋予它们自定义语义-在C语言(和OpenCL C语言)中,只有默认行为。对于三元运算符,这意味着对于
x ? expression_for_true : expression_for_false
a single检查将被执行,并且将使用单个适当的值-即使所有三个操作数均为OpenCL矢量类型。
相反,使用select()
:
int4
,float4
和float4
。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和here。