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 サイトの他の関連記事を参照してください。