SIMD拡張機能のランタイム検出を実装することを計画しています。プロセッサがAVX2をサポートしていることがわかった場合、SSE4.2とAVXもサポートすることが保証されているということですか?
最近のIntelSIMDのサポートISA拡張機能は、以前のSIMDのサポートを意味します。
AVX2は間違いなくAVX1を意味します。
AVX1は、すべてのSSE/SSE2/SSE3/SSSE3/SSE4.1 /SSE4.2機能ビットもCPUIDに設定する必要があることを意味すると思います。
popcnt
には独自の機能ビットがあるため、理論的にはAVX2とSSE4.2を備えたCPUを使用できますが、popcnt
は使用できません。
理論的には、AVXを使用してCPU(または仮想マシン)を作成できますが、pcmpistri
のようなSSE4.2命令の非VEXエンコーディングを受け入れませんでしたが、Intelの保証に違反していると思います。 AVX機能ビットが意味します。それが正式にマニュアルに書かれているかどうかはわかりませんが、ほとんどのソフトウェアはそれを想定しています。
ただし、AVX1 doesは、all SSE4.2および以前のSIMD命令のVEXエンコーディングのサポートを意味します。 vpcmpistri
または vminss
gcc -mavx2
は間違いなくAVX1および以前の拡張機能を意味しますが、VEXエンコーディングを使用するコードのみを出力します。ただし、__SSE4_2__
マクロなどを定義するため、gccはAVX2を以前のSSE拡張命令とpopcntを意味するものとして扱いますが、AESやPCLMULは扱いません。これらはGCC。
(MSVCにはSIMD ISA検出マクロがありません。AVX用に1つありますが、以前のSSE *拡張命令のすべてに対応しているわけではないことに注意してください。)
AVX512は一種の伝統を破っていることに注意してください。 AVX512Fは、AVX2とその前のすべてのサポートを意味しますが、それを超えると、たとえば、AVX512DQはAVX512ERの「前」または「後」にはなりません。あなたは(理論的には)どちらか、両方、またはどちらも持つことができません。 (実際には、Skylake-X/Cannonlake /etc。は、AVX512Fを超えて、Xeon Phi(Knight's Landing/Knight's Mill)と少しだけ重複しています。 https://en.wikipedia.org/wiki/AVX- 512#CPUs_with_AVX-512
コンパイラオプションを設定した場合-mavx2
AVXまたはSSE組み込み関数を使用する場合、GCCはエラーを生成しません。したがって、GCCは、AVX2フラグの存在がAVXを実行するのに十分であると想定し、SSE =コード。もちろん、誰かがAVX2とSSEなしでCPUを作成しないことを保証するものではありません。
原則として、CPUはSSE4命令をサポートせずにAVX2をサポートすることができます(これは思ったほど愚かな考えではありません!)。ただし、実際には、AVX2をサポートしている場合は、SSE4もサポートしています。