我不清楚内置OpenCL函数select的目的是什么。有谁能澄清一下吗?
来自OpenCL规范:
函数选择( gentype a,gentype b,igentype c)
返回:对于向量类型的每个组件,=是否设置了ci的MSB?bi : ai.
在这种情况下,什么是MSB?我知道MSB代表着最重要的一点,但我不知道它与这个案例有什么关系。
发布于 2011-10-03 13:43:45
OpenCL select是根据条件向量(c)的真值从一对向量(a, b)中选择元素,返回由向量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发布于 2012-07-25 13:53:20
这是一个非常有用的操作符,它的工作与C中的条件表达式相同。然而,条件表达式通常编译成一个条件分支,这会导致翘曲/波前发散。“select”通常生成一个谓词表达式,类似于SSE中的x86或blend_ps上的CMOV。
发布于 2018-10-18 11:23:59
我发现了两种使用select的基本模式:标量案例和向量案例。标量的情况非常简单:
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三元操作符?:的等价性。
https://stackoverflow.com/questions/7635706
复制相似问题