合乎逻辑的在OpenCL中加倍?

时间:2013-10-01 17:05:59

标签: if-statement vector opencl bit-manipulation

我有两个向量:double4 *sumdouble4 *elem。我想对向量中的每个元素做以下操作:如果elem是有限的,则将它从sum中减去,否则,什么都不做。

目前,我有以下代码:

   long4 finite = isfinite(elem[e].x);
   if (finite.x) sum.x-=elem[e].x;
   if (finite.y) sum.y-=elem[e].y;
   if (finite.z) sum.z-=elem[e].z;
   if (finite.w) sum.w-=elem[e].w;

然而,这是一堆不必要的if陈述。它可以简单地替换为sum-=isfinite(elem[e])&elem[e];,但似乎&不允许双打。然而,硬件技术上应该是可能的,因为&只是在位水平。有没有办法模仿这种行为?我该怎么做才最好呢?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案:显然union可以在这里提供帮助。

typedef struct {
    union {
        double4 asDouble;
        long4 asLong;
    };
} dubbel;

然后我可以用这个非分支代码替换我的if语句:

dubbel temp;
temp.asDouble = elem[e];
temp.asLong = temp.asLong & isfinite(temp.asDouble);
sum-=temp.asDouble;

奇怪的是,默认情况下这不是作为语法糖提供的,但是嘿,它有效!

编辑:正如ScottD在评论中指出的那样,存在一个更短的解决方案:

sum -= as_double4 (isfinite (elem[e]) & as_long4 (elem[e]));