在向量中获取第一个“true”的索引

时间:2013-12-22 13:23:07

标签: vector opencl

如何有效地计算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/中的所有功能,但一无所获。

这是不常见的操作? 如何在没有太多分支/代码重复的情况下(我自己)计算它?

1 个答案:

答案 0 :(得分:2)

我不知道内置函数能完全符合您的要求,但我对如何做到这一点有一些想法。可能有一个更简单的解决方案,但到目前为止我只喝了一杯咖啡。这个想法是利用“计数前导零”功能“clz”。您只需将条件的结果转换为整数的位位置。

  1. 创建一个布尔向量,其中包含由比较设置的true / false状态
  2. 针对具有与位位置对应的预定义值的整数向量执行该点积。
  3. 第一位设置将与您要求的索引相对应。使用clz()或bithack来查找该位索引。
  4. 在代码中,类似这样(未经测试,可能需要调整):

    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));
    }