質問
CPUのすべての新世代は、いくつかの新しい指示、すなわちMMX、3DNOW、SSEなどを紹介します。
それらについての一般的な質問はほとんどありません:
- たとえば、SSE命令などのプログラムを使用する場合、SSEをサポートしていないCPUで実行できますか?
- はいの場合、それらの命令がいくつかのより単純な指示に変更されることを意味しますか?
- そうでない場合、そのような新しい指示の実際のパフォーマンスの影響は、ほとんどのCPUがそのような技術をサポートする数年後になることを意味します(したがって、非互換性はありません)。
- 最適化でC ++プログラムをコンパイルするとき、この新しい指示の一部を使用することを意味しますか? (私はそれが多くの要因、特にコードに依存することを知っていますが、私はいくつかの一般的な答えが欲しいです)。それとも、主にASMで書かれたプログラム用に予約されていますか?
解決
1)はいといいえ:CPUはそれらを無効と見なしますが、プログラムがCPUがそれらの指示をサポートしているかどうかをチェックすると、それらの指示を使用しないバージョンにフォールバックし、とにかくプログラムを実行できます。
2)プログラムは、より「基本的な」命令を使用して代替の実装を提供し、いつ使用するかを知っておく必要があります。
3)プログラムはCPUをチェックできるため、今すぐ利益が利用できるようになりますが、もちろん、ユーザーがそれらの指示をサポートしていないCPUを使用する場合、利益は見られません。
4)これは、コンパイラとオプティマイザーに完全に依存します。一部の命令セットは、コンパイラがそうでないと言わない限り、常に使用するほど十分に古いと見なされる場合がありますが、他のものは反対です。コンパイラに使用するように指示する必要があります。自動的にフォールバックを作成するかどうかは、コンパイラに依存することもあります。
他のヒント
質問4に対するMichael Madsenの回答について詳しく説明するために、GCCはI386プロセッサのコードを生成するデフォルトです。それは呼ばれるフラグを提供します -march
(としても知られている -mcpu
)コンパイラがどのような命令を発するかを決定します。 Microsoft's cl.exe
提供します /arch:
と /Gx
同じ目的のためのフラグ。
また、命令が表示される順序に応じて、異なるCPUが特定のコードを比較的遅くするか、より速く実行することができるため、フラグは命令の順序付け方法にも影響します。
自動機能セットフォールバックコードを作成する静的コンパイラを知りません。通常、それはプログラマーが明示的に行う必要があります。しかし、良いニュースは、そのプログラマーがあなたである必要はないということです。たとえば、 liboil
(最適化された内部ループの)ライブラリは、実行時に実行されているマシンに応じて実行する最適なコードを選択します。
新しい指示を含む実行可能ファイルは、これらの新しい指示をサポートするCPUでのみ実行できます。特定のCPU用にコンパイルするコンパイラを構成できます。
MMXは1996年から存在し、SSEは1999年に発売され、SSE2は2001年にPentium 4でデビューしました。使用するCPUにはMMXとSSE、おそらくSSE2があると仮定するのは安全だと思います。 3dnow私はAMDのみだと思うので、それらの指示が利用可能になるとは思わないでください。
- たとえば、SSE命令などのプログラムを使用する場合、SSEをサポートしていないCPUで実行できますか?
いいえ。しかし、一般に、これはしばしばトラップまたは例外を生成し、トラップ/割り込みハンドラーは必要に応じて処理できます。
たとえば、ずっと前のソフトウェアには、多くの場合、x87のコードが含まれています。 x87コプロセッサが存在する場合、命令は通常ハードウェアで実行されますが、コンピューターにx87コプロセッサがない場合、トラップが生成されます。その後、命令はソフトウェアで処理され、通常どおりに結果を返します。見る MS-DOSのx87フローティングポイントエミュレーションのプロトコルは何ですか?
Hackintoshの最初のバージョンもこれを使用して、この命令セットをサポートしていないCPUでSSE2をエミュレートします。もちろん、パフォーマンスはひどいですが、実行されます。
- そうでない場合、そのような新しい指示の実際のパフォーマンスの影響は、ほとんどのCPUがそのような技術をサポートする数年後になることを意味します(したがって、非互換性はありません)。
はい。しかし、数年後、おそらくソフトウェアが更新が必要ですよね?重要なパフォーマンスソフトウェアの場合、新しい命令セットを活用するための書き直しが必要になる場合があります。他の人にとっては、パフォーマンスの増加は目立たないかもしれません
- 最適化でC ++プログラムをコンパイルするとき、この新しい指示の一部を使用することを意味しますか? (私はそれが多くの要因、特にコードに依存していることを知っていますが、私はいくつかの一般的な答えが欲しいです)、またはそれらは主にASMで書かれたプログラムのために予約されていますか?
コンパイラとコンパイル時に渡すオプションによって異なります。
モダンなコンパイラサポート 自動ベクトル化 だから彼らはそうするでしょう 一般的なイディオムを検出し、最適化します. 。必要なだけです 再コンパイル 新しい命令セットを活用します。しかし、複雑な場合にはまだ必要です 手で最適化します Simd Intrinsicsの使用
あなたが使用する場合 外部ライブラリ, 、プログラムで何もしていなくても、新しい命令セットをサポートするためにライブラリが更新されると、自動的に速度改善が得られます