ホームページ > バックエンド開発 > C++ > SIMD ベクトル ポインターを別の型として再解釈することは C で未定義の動作ですか?

SIMD ベクトル ポインターを別の型として再解釈することは C で未定義の動作ですか?

Patricia Arquette
リリース: 2024-12-20 12:50:21
オリジナル
304 人が閲覧しました

Is Reinterpreting a SIMD Vector Pointer as a Different Type Undefined Behavior in C  ?

SIMD ベクトル ポインターと対応する型の間で未定義の動作として再解釈します

提起された質問は、reinterpret_cast

の使用が許容されるかどうかを調査します;(&(stack_store[0])) からfloat* を __m256* として再解釈し、この異なるポインター型を通じて float オブジェクトにアクセスします。次に、この実践が厳密なエイリアス規則に違反しているか、または C 言語標準のコンテキストで未定義動作 (UB) を構成しているかどうかを検査します。

未定義動作への対処

コンセンサスは次のとおりです。 ISO C では、__m256 型の動作を明示的に定義していません。ただし、これらのベクトル型に対する Intel の組み込み関数を調べると、ISO C の char* の動作と同様に、__m256* のようなベクトル ポインターを他のポインター型とエイリアスできることがわかります。したがって、_mm256_load_ps() のような aligned-load 組み込み関数を使用する代わりに、__m256* を逆参照する方が安全であると考えられます。

厳密なエイリアシングに関する懸念

さらに、 __m256* は厳密なエイリアシングに違反しませんC [basic.lval]/11 のルール。厳密なエイリアシングでは、異なる型のポインターを介してオブジェクトにアクセスすることは禁止されていますが、この例では、__m256* のようなベクトル ポインターは、スカラー型や他のベクトル型を含む他のものをエイリアスできるものとして明示的に指定されています。

ベクター要素へのアクセス

逆参照しても安全ですが、 __m256* を使用してベクトル要素にアクセスすること、__m256 ベクトルをスカラーの配列として処理しようとすること (たとえば、 hwvec1[0] のようなインデックス演算子を使用すること)、またはスカラー値をベクトル要素に直接割り当てることは、未定義の動作とみなされます。個々のベクトル要素を操作するには、シャッフル組み込み関数 (_mm_shuffle_epi16 / _mm_shuffle_epi8/32/64)、挿入/抽出組み込み関数 (_mm_insert_epi16 / _mm_extract_epi16)、または適切な GNU C ベクトル構文 (例: v[3] = 1.25).

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート