1

我有两个向量: adouble4 *sum和 a double4 *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];,但似乎 & 在双打中是不允许的。但是,从硬件技术上讲,它应该是可能的,因为 & 只是在位级别上。有没有办法模仿这种行为?我应该如何最好地做到这一点?

4

1 回答 1

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]));
于 2013-10-02T03:30:09.813 回答