如何有效地计算OpenCL向量中第一个“true”值的索引:
float4 f = (float4)(1, 2, 3, 4);
int i = firstTrue(f > 2);
在示例中,我想获得i=2
,因为3是第一个大于2的值。
我已查看http://www.khronos.org/registry/cl/sdk/1.2/docs/man/xhtml/中的所有功能,但一无所获。
这是不常见的操作? 如何在没有太多分支/代码重复的情况下(我自己)计算它?
答案 0 :(得分:2)
我不知道内置函数能完全符合您的要求,但我对如何做到这一点有一些想法。可能有一个更简单的解决方案,但到目前为止我只喝了一杯咖啡。这个想法是利用“计数前导零”功能“clz”。您只需将条件的结果转换为整数的位位置。
在代码中,类似这样(未经测试,可能需要调整):
float4 f = (float4)(1, 2, 3, 4);
int4 greater = (f > 2);
int4 bits = (int4)(8, 4, 2, 1);
int sum = dot(greater, bits); // maybe this needs to use float
int index = clz(sum); // might need offset applied
你需要将结果从clz偏移或反转得到0,1,2,3,但这只是加法或减法。
int firstTrue(int4 v) {
return 4 - (clz(0) - clz((v.x & 8) | (v.y & 4) | (v.z & 2) | (v.w & 1));
}