4

トリックを使用せずに、__m128インデックスでフィールドにアクセスできることに気付きました。gccunion

__m128 t;

float r(t[0] + t[1] + t[2] + t[3]);

__m128配列のようにa をロードすることもできます。

__m128 t{1.f, 2.f, 3.f, 4.f};

これはすべてgccのベクトル拡張と一致しています。ただし、これらは他の場所では入手できない場合があります。読み込み機能とアクセス機能は Intel コンパイラと msvc でサポートされていますか?

4

3 に答える 3

3

コードを他のコンパイラで動作させたい場合は、それらの GCC 拡張機能を使用しないでください。set/load/store 組み込み関数を使用します。 _mm_setr_ps定数値の設定には問題ありませんが、ループでは使用しないでください。要素にアクセスするには、通常、最初に値を配列に格納してから、配列を読み取ります。

配列がある場合は、aそれを読み取り/保存する必要があります

__m128 t = _mm_loadu_ps(a);
_mm_storeu_ps(a, t);

配列が 16 バイトにアラインされている場合、アラインされたロード/ストアを使用できます。これは、新しいシステムではわずかに高速ですが、古いシステムでははるかに高速です。

__m128 t = _mm_load_ps(a);
_mm_store_ps(a, t);

スタックで 16 バイト アラインされたメモリを取得するには、次を使用します。

__declspec(align(16)) const float a[] = ...//MSVC
__attribute__((aligned(16))) const float a[] ...//GCC, ICC

16 バイト アラインされた動的配列の場合は、次を使用します

float *a = (float*)_mm_malloc(sizeof(float)*n, 16); //MSVC, GCC, ICC, MinGW 
于 2013-10-25T11:59:44.840 に答える
1

をロードするには、GCC、ICC、MSVC、およびclangでサポートされている を__m128書くことができます。_mm_setr_ps(1.f, 2.f, 3.f, 4.f)

私の知る限り、clang と最近のバージョンの GCC は__m128、インデックスによるフィールドへのアクセスをサポートしています。ICC または MSVC でこれを行う方法がわかりません。4つのコンパイラすべてで機能すると思い_mm_extract_psますが、その戻り値の型は非常識で、使用するのが面倒です。

于 2013-10-25T07:45:41.963 に答える