我有两个向量:double4 *sum
和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];
,但似乎&不允许双打。然而,硬件技术上应该是可能的,因为&只是在位水平。有没有办法模仿这种行为?我该怎么做才最好呢?
答案 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]));