2

を呼び出すとどうなるか正確にはわかりません_mm_load_ps。つまり、4 つの浮動小数点数の配列を にロードし__m128、これを使用して SIMD アクセラレーション演算を実行し、それらを元に戻すことができますが、この__m128データ型はまだスタックにありませんか? つまり、任意の量のベクトルをロードするのに十分なレジスターがないことは明らかです。したがって、これらの 128 ビットのデータは、SIMD 命令を使用して計算を行うたびに前後に移動しますか? もしそうなら、のポイントは_mm_load_ps何ですか?

多分私はそれをすべて間違っていますか?

4

2 に答える 2

8

int変数がレジスターまたはメモリー (あるいはその両方) に常駐するのとまったく同じように、などの SSE 変数にも同じことが言えます__m128。十分な空き XMM レジスターがある場合、コンパイラーは通常、変数をレジスターに保持しようとします (変数のアドレスを取得するなど、役に立たないことをしない限り)。メモリー。

于 2013-10-29T23:20:04.373 に答える
4

SSE、AVX、または AVX-512 を搭載した Intel プロセッサは、8 ~ 32 の SIMD レジスタを持つことができます (以下を参照)。レジスタの数は、32 ビット コードか 64 ビット コードかによっても異なります。したがって、呼び出すと_mm_load_ps、値が SIMD レジスタにロードされます。すべてのレジスタが使用されている場合は、一部をスタックにスピルする必要があります。

多数の変数intまたはスカラーfloat変数があり、コンパイラーが現在「生きている」変数をすべてレジスターに保持できない場合とまったく同じです-ロード/ストア組み込み関数は、ほとんどの場合、アライメントについてコンパイラーに通知するため、およびポインターの代替として存在します-他の C データ型へのキャスト。実際のロードまたはストアにコンパイルする必要があるため、またはコンパイラがベクトルロードまたはストア命令を発行する唯一の方法であるという理由ではありません。


SSE を備えたプロセッサー

8  128-bit registers labeled XMM0 - XMM7  //32-bit operating mode
16 128-bit registers labeled XMM0 - XMM15 //64-bit operating mode

AVX/AVX2 搭載プロセッサー

8  256-bit registers labeled YMM0 - YMM7  //32-bit operating mode
16 256 bit registers labeled YMM0 - YMM15 //64-bt operating mode

AVX-512 搭載プロセッサー (2015/2016 サーバー、Ice Lake ラップトップ、?? デスクトップ)

8  512-bit registers labeled ZMM0 - ZMM31 //32-bit operating mode
32 512-bit registers labeled ZMM0 - ZMM31 //64-bit operating mode

ウィキペディアには、このAVX-512に関する優れた要約があります。

(もちろん、コンパイラは、AVX-512 命令の使用が許可されている場合、x/y/zmm16..31 のみを使用できます。AVX-512 対応の CPU を使用しても、動作するようにコンパイルされたマシン コードを実行する場合は役に立ちません。 AVX2 のみの CPU。)

于 2013-10-30T08:36:48.290 に答える