OpenCL内置函数'select'

时间:2011-10-03 13:32:37

标签: opencl

我不清楚内置OpenCL函数select的目的是什么。请有人澄清一下吗?

来自OpenCL规范:

  

function select(gentype a,gentype b,igentype c)

     

返回:对于矢量类型的每个分量,result [i] =如果设置了c [i]的MSB? b [i]:a [i]。

在这种情况下,什么是MSB?我知道MSB代表最重要的位,但我不知道它与这种情况有什么关系。

3 个答案:

答案 0 :(得分:6)

OpenCL select是根据条件向量((a, b))的真值从一对向量c中选择元素,返回一个由元素组成的新向量向量ab

这里提到了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三元运算符?:等效。