2015-12-03 5 views
6

これまでのところ、私がいることを見つけるために管理している: CPUマルチメディア拡張をサポートする/必要とするWindowsのバージョンは何ですか?

    • SSEとSSE2は、Windows 8のために必須であり、後に(そしてもちろん、任意の64ビットOS用)AVXが唯一のWindows 7 SP1でサポートされていますまたはそれ以降

    WindowsでSSE3、SSSE3、SSE4.1、SSE 4.2、AVX2、およびAVX-512を使用する際には注意が必要ですか?

    いくつかの説明:SSE/AVXセットのいずれかから命令を使用する場合、私のプログラムが実行されるOSを決定するためにこれが必要です。

  • +0

    @downvoters:非常に興味深い答えがないことが判明したとしても、これはほとんどの場合と比較して悪い質問ではありません。 OPはそれを知らなかった、または彼は尋ねなかっただろう。それは明らかで、OPが研究しようとしたように聞こえるが、何を検索するのか分からなかった(彼はまだ質問に対する答えを知らないので:P)私はSO/migrate SUには、しかしdownvotesではない。 –

    +0

    私はそれがSUの質問だとは思わない、私は組み立てのコーディングが最もスーパーユーザーでさえ何かであるとは思わない。自分のプログラムでオペコードを利用しようとしていることをより明確にするために質問に言い換えてみましょう。 – Alexey

    +1

    私はこの質問が「一般的なコンピュータソフトウェアについて」であるとは思わない。それが "Windows"を含んでいるという唯一の事実は、それがここで話題外であるということを意味しません。これはプログラマの観点からのプラットフォームに関する質問であり、SSE/AVX /などでコードする人にとっては明らかに重要です。 – stgatilov

    答えて

    8

    新しいアーキテクチャ状態を導入する拡張機能には、OSが保存/復元するためにコンテキストスイッチ上のデータを復元する必要があるため、特別なOSサポートが必要です。だからOSesの観点からは、OSがSSEをサポートしているならば、SSSE3命令を実行させるために余分なことはありません。

    SSE、AVX、およびAVX512は、新しいアーキテクチャ状態を導入した拡張機能です。

    • SSEが(モードとFP例外状態を丸めるとMXCSR)XMMのREGSを導入
    • AVXはYMM(古いXMMのREGSであるの下半分)を導入しました。
    • AVX512はzmm(ymm regsを拡張)を導入し、64ビットモード(zmm0〜zmm31)でベクトルregsの数を2倍にしました。

    あなたは、CPUID命令で、SSEまたはAVXのためのCPUをサポートするための通常の方法を確認してください。

    コンテキストスイッチで新しいアーキテクチャ状態を保存/復元しないマルチタスクOSで新しい拡張機能を使用すると、サイレントデータが破損しないように、OSがset an OS-support bit in a control registerでない場合、SSE命令は不正な命令として失敗します。したがって、拡張機能の必要な状態を保存/復元することを知らないOSでは、ベクター拡張機能は「機能しません」。 SSEについて


    even reading a control register is privilegedので、CR4.OSXMMEXCPT、OSはCR4.OSFXSRを設定することによって、コンテキストスイッチでSSEの状態を保存/復元することを約束したことを検出する等のビット任意クリーンOSに依存しない方法ないかもしれません、設定を反映するCPUIDビットはありません。 Windowsでは、GetEnabledXStateFeaturesを使用して、ベクタ・レジスタの状態を保存/復元する方法をOSが知っていることを確認できます。私はあなたが他のOSで何を必要としているのかよく分かりません。 SSEのサポートは、これが問題になるためには本当に古代版(または自作)OSを使用しなければならないほど広まっています。


    はAVXのために、我々はAVXが使用可能であることを検出するために、OSのサポートを必要としない(ハードウェアでサポートされているとOSで有効):CPUIDはOSが持っているときに設定されますOSXSAVE機能ビットを含みます有効になったAVX。Intel's intro to AVXから

    • オペレーティングシステムが CPUID.1:ECX.OSXSAVE bit 27 = 1を使用してXGETBVをサポートしていることを確認してください。
    • 同時に、検証その CPUID.1:ECX bit 28=1(インテルAVXは、サポートされている)および/または25 = 1(サポートされているAES )... (及びFMA、AESのための他のビット、及びPCLMULQDQ)
    • 問題ビットXGETBVを入力し、ビット1および2のフィーチャイネーブルマスク が11b(XMMステートおよびYMMステートは オペレーティングシステムで有効)であることを確認します。

    代わりに、すべてこれを行うには、インラインアセンブラまたは機能検出ライブラリを使用するのでは、OSのサポートを検出するために、OSが提供する機能を呼び出すことが容易であろう。


    同じことがAVX512のために真である:あなたは命令セットのためのCPUID機能ビットをチェックすることができ、OSがコンテキストに新しいアーキテクチャ状態を管理することを約束したことをチェックが右のビットを有効にすることで、スイッチXSETBVで(だから、XGETBVでチェックしてください)。

    +0

    これは、それが発表されたとき以来、2013年以前にリリースされたOSで動作するプログラムでAVX512拡張機能を使用できないことを意味します。どのWindowsバージョンがzmmレジスタを正しく扱えるようにする更新プログラムを受け取るのか知っていますか? – Alexey

    +3

    実際には、 'IsProcessorFeaturePresent'と' GetEnabledXStateFeatures'は、CPU機能が存在するかどうかだけでなく、OSがそれをサポートしているかどうかを示すため、使うべきです。 OSがAVXコンテキスト切り替えをサポートしていないため、CPU内のAVXサポートを検出してAVX命令を使用するだけで、すべてのコンテキストスイッチでAVX状態が破損することがわかります。 –

    +0

    @Alexey:インテルが物事を発表した後、十分にテスト済みの実装が可能になるには時間がかかります。 AVX512はまだ販売されている通常のCPUには存在せず、Knight's Landingの多くのコアのものだけが存在します。とにかく、私はWindowsのAVX512のサポートがどんなものか分かりません。余分な状態を保存/復元するためのOSサポートを追加するのは簡単です。 XSAVE/XRSTORの特徴ビットをいくつか設定するだけで、CPUは余分な状態を保存します。 –

    関連する問題