5

0 から 1 の間の実数を実装するには、通常は ANSI float または double を使用します。ただし、0 から 1 の間の固定精度数 (1 を法とする 10 進数) は、32 ビット整数または 16 ビット ワードとして効率的に実装できます。これらは、通常の整数/ワードのように加算されますが、「間違った方法」で乗算されます。つまり、X 回乗算すると、 Y、製品の上位ビットを保持します。これは、0.X と 0.Y を乗算することと同じです。ここで、X のすべてのビットは小数点の後ろにあります。同様に、-1 と 1 の間の符号付き数値も、この方法で 1 ビット余分にシフトすることで実装できます。

固定精度の mod 1 または mod 2 を C で (特に MMX または SSE を使用して) どのように実装しますか? この表現は、ユニタリ行列の効率的な表現、数値集約的な物理シミュレーションに役立つと思います。より多くの MMX/SSE が整数の数量を持つようになりますが、PMULHW へのより高いレベルのアクセスが必要です。

4

1 に答える 1

10

16 ビットの固定小数点演算で十分で、x86 または同様のアーキテクチャを使用している場合は、SSE を直接使用できます。

SSE3 命令pmulhrswは、符号付き 0.15 固定小数点算術乗算 (-1..+1 から mod 2 と呼ぶ) をハードウェアで直接実装します。加算は、 を使用するだけで、標準の 16 ビット ベクトル演算と変わりませんpaddw

したがって、一度に 8 つの符号付き 16 ビット固定小数点変数の乗算と加算を処理するライブラリは次のようになります。

typedef __v8hi fixed16_t;

fixed16_t mul(fixed16_t a, fixed16_t b) {
    return _mm_mulhrs_epi16(a,b);
}

fixed16_t add(fixed16_t a, fixed16_t b) {
    return _mm_add_epi16(a,b);
}

あなたが好きな方法でそれを使用する許可が与えられました;-)

于 2012-05-07T08:21:39.310 に答える