AVX ロード/ストア操作の 32 バイト アライメントの処理方法
このコンテキストでは、AVX ロード/ストア操作でアライメントの問題が発生します。アライメントされていないメモリアクセスによるストア操作。この問題に対処する方法は次のとおりです。
_mm256_loadu_ps / _mm256_storeu_ps による非整列ロード/ストア操作
非整列メモリ アクセスの場合は、代わりに _mm256_loadu_ps および _mm256_storeu_ps を使用できます。これらの組み込み関数は、アライメントを必要とせずにロードおよびストア操作を実行します。ほとんどの場合、アライメントされたデータにこれらの組み込み関数を使用すると、アライメントが必要なロード/ストア操作を使用するのと同じくらい効率的です。
アライメントに関する考慮事項
アライメントは特に重要です512 ビット AVX-512 ベクトルの場合、適切なアライメントによりパフォーマンスが最大 20% 向上します。 AVX2 CPU の場合、特にデータが L2 または L1d キャッシュに保存されている場合、アライメントは依然として重要です。
アライメントされたメモリの動的割り当て
C 17 では、次のことができます。 aligned_new 演算子を使用して、整列されたメモリを割り当てます。この演算子は、割り当てられたメモリが、割り当てられる型に指定されたアライメントに従って確実にアライメントされるようにします。
たとえば、アライメントされた float の配列を割り当てるには、次のようにします。
float *arr = new (std::align_val_t(32)) float[size]; // C++17
回避策Plain-Delete 互換割り当ての場合
との互換性がないため、aligned_new を使用できない場合単純に削除する場合は、次の回避策を使用できます:
構造のラッピング:
struct alignas(32) s { float v; }; new s[numSteps];
配置パラメータ:
new (std::align_val_t(32)) float[numSteps];
その他の動的割り当てオプション
その他の動的割り当てオプションには、std::aligned_alloc、posix_memalign、および _mm_malloc が含まれます。ただし、これらのオプションには制限があり、free と互換性がない可能性があります。
配列と構造体を使用した Alignas()
C 11 以降では、alignas() を使用できます。 32) 構造体/クラス メンバーのアライメントを強制し、その型の静的および自動ストレージ オブジェクトが 32B アライメントを持つようにします。ただし、このような型の動的割り当てには C 17 との互換性が必要です。
不必要なパディングに注意してください
最後に、より大きなバッファーを割り当てて手動で位置合わせすることで、不必要なパディングを回避します。このアプローチは非効率的で非現実的です。
以上がAVX ロード/ストアのパフォーマンスを最適化するために 32 バイトのアライメントを確保するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。