OpenCL 的 select 运算符有什么用?
What is OpenCL's select operator useful for?
我注意到OpenCL有一个select()
function/builtin/operator,这似乎类似于C和C++中的三元运算符,但又不完全是。 select()
和 ?:
之间有什么区别,如果我们有后者,为什么还需要前者?
select
运算符是 necessary/useful 的原因是为了使用 OpenCL 向量类型,例如 int2
、float4
等。与 C++ 不同,在 C++ 中,您可以重载各种运算符以赋予它们自定义语义 - 在 C(和 OpenCL C)中,只有默认行为。对于三元运算符,这意味着 for
x ? expression_for_true : expression_for_false
a 将执行单个 检查,并且将使用单个适当的值 - 即使所有三个操作数都是 OpenCL 向量类型。
相反,select()
:
- 所有元素的维度必须与矢量类型相同,例如
int4
、float4
和 float4
。
- 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 );
我注意到OpenCL有一个select()
function/builtin/operator,这似乎类似于C和C++中的三元运算符,但又不完全是。 select()
和 ?:
之间有什么区别,如果我们有后者,为什么还需要前者?
select
运算符是 necessary/useful 的原因是为了使用 OpenCL 向量类型,例如 int2
、float4
等。与 C++ 不同,在 C++ 中,您可以重载各种运算符以赋予它们自定义语义 - 在 C(和 OpenCL C)中,只有默认行为。对于三元运算符,这意味着 for
x ? expression_for_true : expression_for_false
a 将执行单个 检查,并且将使用单个适当的值 - 即使所有三个操作数都是 OpenCL 向量类型。
相反,select()
:
- 所有元素的维度必须与矢量类型相同,例如
int4
、float4
和float4
。 - 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 );