新しいアーキテクチャ状態を導入する拡張機能には、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でチェックしてください)。
@downvoters:非常に興味深い答えがないことが判明したとしても、これはほとんどの場合と比較して悪い質問ではありません。 OPはそれを知らなかった、または彼は尋ねなかっただろう。それは明らかで、OPが研究しようとしたように聞こえるが、何を検索するのか分からなかった(彼はまだ質問に対する答えを知らないので:P)私はSO/migrate SUには、しかしdownvotesではない。 –
私はそれがSUの質問だとは思わない、私は組み立てのコーディングが最もスーパーユーザーでさえ何かであるとは思わない。自分のプログラムでオペコードを利用しようとしていることをより明確にするために質問に言い換えてみましょう。 – Alexey
私はこの質問が「一般的なコンピュータソフトウェアについて」であるとは思わない。それが "Windows"を含んでいるという唯一の事実は、それがここで話題外であるということを意味しません。これはプログラマの観点からのプラットフォームに関する質問であり、SSE/AVX /などでコードする人にとっては明らかに重要です。 – stgatilov