- たとえばSSE命令を使用するプログラムがある場合、SSEをサポートしていないCPUで実行できますか?
いいえ。ただし、一般に、これによりトラップまたは例外が生成されることが多く、トラップ/割り込みハンドラーは必要に応じてそれを処理できます。
たとえば、昔のソフトウェアにはx87のコードが含まれていることがよくあります。x87コプロセッサーが存在する場合、命令はハードウェアで正常に実行されますが、コンピューターにx87コプロセッサーがない場合は、トラップが生成されます。その後、命令はソフトウェアで処理され、通常どおり結果が返されます。MS-DOSでのx87浮動小数点エミュレーションのプロトコルは何ですか?を参照してください。
Hackintoshの最初のバージョンもこれを使用して、この命令セットをサポートしないCPUでSSE2をエミュレートします。もちろん、パフォーマンスはひどいですが、それは実行されます。
- そうでない場合、そのような新しい命令の実際のパフォーマンスへの影響は、ほとんどのCPUがそのようなテクノロジをサポートする数年後になることを意味します(したがって、非互換性はありません)。
はい。しかし、数年後、おそらくソフトウェアは更新が必要ですよね?重要なパフォーマンスソフトウェアの場合、新しい命令セットを利用するための書き直しが必要になる場合があります。他の人にとっては、パフォーマンスの向上は目立たないかもしれません
- 最適化を使用してC++プログラムをコンパイルすると、この新しい命令の一部が使用されるということですか?(私はそれが多くの要因、特にコードに依存することを知っていますが、私はいくつかの一般的な答えが欲しいです)またはそれらは主にasmで書かれたプログラムのために予約されていますか?
コンパイラと、コンパイル時に渡すオプションによって異なります。
最新のコンパイラは自動ベクトル化をサポートしているため、一般的なイディオムを検出して最適化します。新しい命令セットを利用するには、再コンパイルする必要があります。ただし、複雑なケースでは、SIMD組み込み関数を使用して手動で最適化する必要があります
外部ライブラリを使用する場合、プログラムで何もしなくても、新しい命令セットをサポートするようにライブラリが更新されると、速度が自動的に向上します。