6

新世代のCPUごとに、MMX、3DNOW、SSEなどの新しい命令のセットが導入されます。

それらについての一般的な質問はほとんどありません。

  1. たとえばSSE命令を使用するプログラムがある場合、SSEをサポートしていないCPUで実行できますか?
  2. はいの場合、それらの命令がより多くのより単純な命令に変更されることを意味しますか?
  3. そうでない場合、そのような新しい命令の実際のパフォーマンスへの影響は、ほとんどのCPUがそのようなテクノロジをサポートする数年後になることを意味します(したがって、非互換性はありません)。
  4. 最適化を使用してC++プログラムをコンパイルすると、この新しい命令の一部が使用されるということですか?(私はそれが多くの要因、特にコードに依存することを知っていますが、私はいくつかの一般的な答えが欲しいです)。それとも、それらは主にasmで書かれたプログラムのために予約されていますか?
4

5 に答える 5

9
  1. はい、いいえ:CPUはそれらを無効と見なしますが、CPUがそれらの命令をサポートしているかどうかをプログラムがチェックすると、それらの命令を使用しないバージョンにフォールバックして、プログラムを実行できるようになります。
  2. プログラムは、より「基本的な」命令を使用して代替の実装を提供し、どの命令をいつ使用するかを知っている必要があります。
  3. プログラムはCPUをチェックできるので、今すぐにメリットを利用できますが、もちろん、ユーザーがこれらの命令をサポートしていないCPUを使用している場合、メリットはありません。
  4. これは、コンパイラとオプティマイザに完全に依存します。一部の命令セットは、コンパイラが指示しない限り常に使用するほど古いと見なされる場合がありますが、他の命令セットは逆になります。コンパイラに使用するように指示する必要があります。フォールバックも自動的に作成されるかどうかも、コンパイラーに依存します。
于 2010-03-27T17:09:10.640 に答える
2

質問4に対するMichaelMadsenの回答を詳しく説明するために、GCCはデフォルトでi386プロセッサ用のコードを生成します。これは、コンパイラが発行する命令の種類を決定する-march(とも呼ばれる)と呼ばれるフラグを提供します。-mcpuMicrosoftは、同じ目的でフラグをcl.exe提供しています。/arch:/Gx

フラグは、命令の順序にも影響します。これは、命令が表示される順序に応じて、特定のコードの実行が異なるCPUによって比較的遅くなったり速くなったりする可能性があるためです。

自動機能セットフォールバックコードを作成する静的コンパイラを知りません。通常、これはプログラマーが明示的に行う必要があります。しかし、良いニュースは、そのプログラマーがあなたである必要はないということです。たとえば、liboil(最適化された内部ループの)ライブラリは、実行時に、実行されているマシンに応じて実行するのに最適なコードを選択します。

于 2010-03-27T17:22:32.643 に答える
1

新しい命令を含む実行可能ファイルは、これらの新しい命令をサポートするCPUでのみ実行できます。特定のCPU用にコンパイルするようにコンパイラーを構成できます。

于 2010-03-27T17:08:37.710 に答える
1

MMXは1996年から存在し、SSEは1999年に発売され、SSE2は2001年にPentium 4でデビューしました。使用するCPUにはMMXとSSE、おそらくSSE2が搭載されていると考えて間違いありません。3DNOWはAMDのみだと思うので、これらの手順が利用できるとは思わないでください。

于 2010-03-27T17:19:39.930 に答える
1
  1. たとえばSSE命令を使用するプログラムがある場合、SSEをサポートしていないCPUで実行できますか?

いいえ。ただし、一般に、これによりトラップまたは例外が生成されることが多く、トラップ/割り込みハンドラーは必要に応じてそれを処理できます。

たとえば、昔のソフトウェアにはx87のコードが含まれていることがよくあります。x87コプロセッサーが存在する場合、命令はハードウェアで正常に実行されますが、コンピューターにx87コプロセッサーがない場合は、トラップが生成されます。その後、命令はソフトウェアで処理され、通常どおり結果が返されます。MS-DOSでのx87浮動小数点エミュレーションのプロトコルは何ですか?を参照してください。

Hackintoshの最初のバージョンもこれを使用して、この命令セットをサポートしないCPUでSSE2をエミュレートします。もちろん、パフォーマンスはひどいですが、それは実行されます。

  1. そうでない場合、そのような新しい命令の実際のパフォーマンスへの影響は、ほとんどのCPUがそのようなテクノロジをサポートする数年後になることを意味します(したがって、非互換性はありません)。

はい。しかし、数年後、おそらくソフトウェアは更新が必要ですよね?重要なパフォーマンスソフトウェアの場合、新しい命令セットを利用するための書き直しが必要になる場合があります。他の人にとっては、パフォーマンスの向上は目立たないかもしれません

  1. 最適化を使用してC++プログラムをコンパイルすると、この新しい命令の一部が使用されるということですか?(私はそれが多くの要因、特にコードに依存することを知っていますが、私はいくつかの一般的な答えが欲しいです)またはそれらは主にasmで書かれたプログラムのために予約されていますか?

コンパイラと、コンパイル時に渡すオプションによって異なります。

最新のコンパイラはをサポートしているため、一般的なイディオムを検出して最適化します。新しい命令セットを利用するには、再コンパイルする必要があります。ただし、複雑なケースでは、SIMD組み込み関数を使用して手動で最適化する必要があります

外部ライブラリを使用する場合、プログラムで何もしなくても、新しい命令セットをサポートするようにライブラリが更新されると、速度が自動的に向上します。

于 2013-08-15T14:03:58.640 に答える