ホームページ >バックエンド開発 >C++ >ハードウェア SIMD ベクトル ポインターと対応する型の間のキャストの再解釈は C で未定義の動作ですか?

ハードウェア SIMD ベクトル ポインターと対応する型の間のキャストの再解釈は C で未定義の動作ですか?

DDD
DDDオリジナル
2024-12-27 14:38:09287ブラウズ

Is Reinterpreting Casts Between Hardware SIMD Vector Pointers and Corresponding Types Undefined Behavior in C  ?

ハードウェア SIMD ベクトル ポインターと対応する型の間の再解釈キャストは未定義の動作ですか?

C では、float を reinterpret_cast することは許可されますか? から __m256 にアクセスします別のポインター型を使用して float オブジェクトを使用しますか?

次のコード例は、これを示しています。

#include <immintrin.h>

constexpr size_t _m256_float_step_sz = sizeof(__m256) / sizeof(float);
alignas(__m256) float stack_store[100 * _m256_float_step_sz ]{};
__m256& hwvec1 = *reinterpret_cast<__m256*&>(&stack_store[0 * _m256_float_step_sz]);

using arr_t = float[_m256_float_step_sz];
arr_t& arr1 = *reinterpret_cast<float(*)[_m256_float_step_sz]&>(&hwvec1);

hwvec1 と arr1 には未定義の動作がありますか?厳密なエイリアス規則 ([basic.lval]/11) に違反していませんか?あるいは、定義された組み込みの方法は 1 つだけですか:

__m256 hwvec2 = _mm256_load_ps(&stack_store[0 * _m256_float_step_sz]);
_mm256_store_ps(&stack_store[1 * _m256_float_step_sz], hwvec2);

答え:

ISO C では __m256 が定義されていないため、何が定義されているかを確認する必要があります。それらをサポートする実装上での動作。 Intel の組み込み関数は、ISO C が char をエイリアスとして定義するのと同じように、__m256 のようなベクトル ポインターを他のエイリアスとして定義します。 (しかし、その逆はありません。実際には、__m256i で int* を指し、それを参照解除するのは UB であり、ブレークです。)

ですから、はい、_mm256_load_ps( を使用する代わりに __m256 を参照解除しても安全です) aligned-load 組み込み関数。しかし、特に float/double の場合は、float からのキャストも処理するため、組み込み関数を使用する方が簡単なことがよくあります。整数の場合、AVX512 のロード/ストア組み込み関数は void を取るように定義されていますが、AVX2 以前では (__m256i)&arr[i] のようなキャストが必要で、これはかなり不格好な API 設計であり、それを使用するとコードが乱雑になります。

いくつかの非 AVX512 組み込みも void を使用して追加されています。 movd/movq ロード/ストア アライメントと、_mm_loadu_si32(void) などのエイリアス安全な組み込み。以前は、Intel は、int を自分で安全にロードする必要がある _mm_cvtsi32_si128 を使用すると想定していたと思います。これは、UB を回避するために memcpy を使用することを意味していました (少なくとも、古典的な ICC と MSVC 以外のコンパイラーでは、非整列 int* が許可され、厳密なコンパイラーが強制されない場合)

これは、Intel が LLVM への移行を検討し始めた頃だったのかもしれません。 ICX/ICPX / OneAPI を使用し、厳密なエイリアシングを強制するコンパイラーでの狭い負荷を処理するのがどれほど面倒なことかを実感しました。

以上がハードウェア SIMD ベクトル ポインターと対応する型の間のキャストの再解釈は C で未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。