15

ということに最近気づきました

_m128 m = _mm_set_ps(0,1,2,3);

float 配列にキャストするときに、4 つの float を逆の順序にします。

(float*) p = (float*)(&m);
// p[0] == 3
// p[1] == 2
// p[2] == 1
// p[3] == 0

また、同じことが起こりunion { _m128 m; float[4] a; }ます。

SSE 操作がこの順序付けを使用するのはなぜですか? 大したことではありませんが、少し混乱します。

そして、フォローアップの質問:

インデックスによって配列内の要素にアクセスする場合、順序0..3または順序でアクセスする必要があり3..0ますか?

4

3 に答える 3

7

何をしたいかによって、_mm_set_ps または _mm_setr_ps のいずれかを使用できます。

__m128 _mm_setr_ps (float z, float y, float x, float w ) 4 つの SP FP 値を逆順で 4 つの入力に設定します。

于 2011-05-02T19:42:59.940 に答える
6

それは x86 ハードウェアのリトルエンディアンの性質と一致していませんか? long long のバイトを格納する方法。

于 2011-03-08T20:37:09.217 に答える
6

これは単なる慣習です。彼らはいくつかの順序を選択する必要があり、全員がそれに従う限り、順序が何であるかは実際には問題ではありません. Intel はたまたまリトルエンディアンを好みます。

インデックスによるアクセスに関する限り...最善の方法は、それを避けることです。要素単位のアクセスほどベクトルのパフォーマンスを損なうものはありません。必要に応じて、インデックスがハードウェア ベクター レーンと一致するように設定してみてください。これは、(私の経験では) ほとんどのベクトル プログラマーが期待することです。

于 2011-03-08T23:20:21.203 に答える