1

double4 *sumaと aの 2 つのベクトルがありdouble4 *elemます。ベクトルの各要素に対して、次のことを行いたいと思います: elem が有限の場合は、合計から減算し、そうでない場合は何もしません。

現在、次のコードがあります。

   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];、 & は double では許可されていないようです。ただし、 & はちょうどビットレベルであるため、ハードウェア技術的には可能です。この動作を模倣する方法はありますか? これを行うにはどうすればよいですか?

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 に答える