ハードウェア SIMD ベクトル ポインターと対応する型の間の reinterpret_casting は未定義の動作ですか?
C では、浮動小数点数を変換するための reinterpret_cast の使用法__m256 ポインターへのポインターと、別のポインターを介して float オブジェクトにアクセスするtype は、潜在的な未定義の動作や厳密なエイリアシング ルールの違反に関する懸念を引き起こします。
未定義の動作
ISO C 標準によれば、異なるポインタ型間の reinterpret_cast の動作は次のとおりです。実装によって定義されるため、異なるプラットフォーム間での移植性は保証されません。
May-Alias 属性
ただし、インテルのこれらの組み込み関数の実装では、__m256* のようなベクトル ポインター型を「may-alias」属性を持つものとして定義することがよくあります。これは、コンパイラが、__m256* が他のベクトル型やそのスカラー コンポーネントを含む他のものを潜在的にエイリアスできると想定できることを意味します。その結果、一般に、次のような組み込み関数を使用せずに、__m256* を直接逆参照しても安全であると考えられています。 _mm256_load_ps。これは、コンパイラーが潜在的なエイリアシングを認識し、操作を安全に実行するための適切な命令を生成するためです。
厳密なエイリアシング違反
配列型と配列の使用法ベクトル要素に直接アクセスすると、C の厳密なエイリアス規則に違反するのではないかという懸念が生じます。 reinterpret_casting の行為は、必ずしも厳密なエイリアス規則に違反するわけではありません
。 ただし、結果の構造体へのポインターには元の型と同様にアクセスします。 厳密なエイリアス規則では、共用体型のオブジェクトの一部への直接アクセスが const の正確性に違反する可能性があると定義しています。つまり、const 共用体に直接アクセスすることはできず、非 const 共用体を const 修飾された共用体にキャストすることはできません。値を変更しながら入力します。このコンテキストでは、厳密なエイリアシングに違反するのは、reinterpret_cast ポインターに float ポインターとしてアクセスし、値を変更した場合のみです。 これは、C の厳密なエイリアス規則により、オブジェクトの const の正確性に違反する可能性がある場合、異なる型のポインターを介してオブジェクトにアクセスすることが禁止されているためです。この例ではそうではありません。概要
実際には、ハードウェア SIMD ベクトル ポインターと対応する浮動小数点ポインターの間で reinterpret_cast を使用することが一般的に使用されており、Intel の組み込みをサポートするプラットフォームでは安全であると受け入れられています。ただし、これはすべてのプラットフォームや実装に当てはまるわけではないことに注意することが重要です。組み込み関数と型変換の適切な使用方法については、使用している特定のコンパイラーとプラットフォームのドキュメントを常に参照してください。
以上がSIMD ベクトル ポインターと対応する型の間の Reinterpret_casting は C で未定義の動作ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。