最近、暗黙の SSE/AVX ロード/ストアに出くわしました。これらは GCC の特別な拡張機能だと思っていましたが、MSVC でも機能することに気付きました。
__m128 a = *(__m128*)data // same as __m128 a = _mm_load_ps(data)?
__m128 *b = (__m128*)result; // same as _mm_store_ps(result, a)?
これらの暗黙的なロード/ストアの適切な構文は何ですか?
私が読んだことから(非整数アドレスのアドレス指定と sse)、暗黙的なロード/ストアはアライメントされたロード/ストアを使用するため、メモリを適切にアライメントする必要があります。SSE/AVX 組み込み関数をサポートするほとんどのコンパイラ (GCC/ICC/MSVC/Clang/MinGW など) で同じように機能すると仮定するのは公平ですか? これらの暗黙的なロード/ストアを持つ動機は何ですか?
次の一連の質問は、SSE/AVX レジスタをスタックにプッシュおよびポップすることに関するものです。これはどのように実装されていますか?スタックが 16 バイトでアラインされていない場合はどうなりますか? 次に、アライメントされていないロード/ストアを使用しますか? 私が理解しているように、スタックは通常16バイトで整列されていますが、必ずしも32バイトで整列されているわけではありません(少なくとも64ビットモードでは)。アルゴリズムの AVX 占有率が高く、AVX レジスタを頻繁にスタックにプッシュする必要がある場合、パフォーマンスを向上させるためにスタックを 32 バイトに揃えることは理にかなっていますか?