我不清楚内置OpenCL函数select
的目的是什么。请有人澄清一下吗?
来自OpenCL规范:
function select(gentype a,gentype b,igentype c)
返回:对于矢量类型的每个分量,result [i] =如果设置了c [i]的MSB? b [i]:a [i]。
在这种情况下,什么是MSB?我知道MSB代表最重要的位,但我不知道它与这种情况有什么关系。
答案 0 :(得分:6)
OpenCL select
是根据条件向量((a, b)
)的真值从一对向量c
中选择元素,返回一个由元素组成的新向量向量a
和b
。
这里提到了MSB(最高有效位),因为向量元素的真值被定义为-1
,因此应该设置MSB(作为符号位):
a = {1 , 2} // Pseudocode for select operands
b = {3 , 4}
c = {0 ,-1}
r = {1 , 4} // The result r contains some of a and b
答案 1 :(得分:2)
这是一个非常有用的运算符,它与C中的条件表达式执行相同的工作。但是,条件表达式通常会编译为导致warp / wavefront分歧的条件分支。 'select'通常会生成一个谓词表达式 - 类似于x86上的CMOV或SSE中的blend_ps。
答案 2 :(得分:0)
我发现使用select
的2种基本模式:标量大小写和向量大小写。
标量情况非常简单:
if (a > 0.0f) b = 0.3f;
等同于
b = select(b, 0.3f, isgreater(a, 0.0f));
如果要处理向量,即从select
获得向量结果,则一切都会变得更加复杂:
if (a > 0.0f) b = (float2)(0.3f, 0.4f);
等同于
b = select(b, (float2)(0.3f, 0.4f), (int2)(isgreater(a, 0.0f) << 31));
该位位移需要使比较运算符的LSB结果成为MSB以符合select
规范。强制转换为int2
可确保所有组件都将占据其位置。
最后的结论是,使用上面的摘录有助于更多地了解select
的用法,而不是与C三元运算符?:
等效。