質問
私は興味があります、新しいコンパイラはMMX SSE、3DNOWなどの新しいCPUに組み込まれたいくつかの追加機能を使用していますか!など?
つまり、元の8086にはFPUさえありませんでしたので、古いものはそれを使用することさえできませんが、FPUはすべての新しいCPUの一部であるため、新しいコンパイラはできます。それで、新しいコンパイラはCPUの新しい機能を使用していますか?
または、新しいC/C ++ Standartライブラリ関数を使用しているのは、より正しいことです。
ご回答ありがとうございます。
編集:
わかりました。だから、皆さん全員が正しい場合、特にSSEをより速く使用してフロート数を実行できます。
それを使用するには、コンパイラでこの機能をサポートする場合は、この機能を有効にする必要があります。もしそうなら、ターゲットを絞ったプラットフォームがその機能をサポートすることを確認する必要があります。
OpenGL、DirectXなどのトップパフォーマンスを必要とする一部のシステムライブラリの場合、このサポートはシステムでサポートされる場合があります。
デフォルトでは、互換性の理由で、コンパイラはそれをサポートしていませんが、Intelなどによって配信される特別なC関数を使用してこのサポートを追加できます。 Wheatherを直接制御し、目的のプラットフォームの特別な機能を使用してマルチCPUサポートアプリケーションを作成することができるため、これは最良の方法です。
解決
GCCは、コマンドライン引数を介して新しい指示をサポートします。見る ここ 詳細については。引用する:
GCCは、最近のIntelおよびAMDプロセッサのMMX、SSE、SSE2、SSE3、および3DNOW拡張機能の追加指示を利用できます。 Options -MMMX、-MSSE、-MSSE2、-MSSE3、および-M3DNOWは、これらの追加命令を使用して、複数のデータの単語を並行して処理できるようにします。結果の実行可能ファイルは、適切な拡張機能をサポートするプロセッサでのみ実行されます。他のシステムでは、違法な命令エラー(または同様)でクラッシュします
他のヒント
これらの指示は、ISO C/C ++標準の一部ではありません。それらは介して利用可能です コンパイラの内因性, 、使用するコンパイラに応じて。
MSVCについては、参照してください http://msdn.microsoft.com/en-us/library/26td21ds(vs.80).aspx
GCCについては、見ることができます http://developer.apple.com/hardwaredrivers/ve/sse.html
AFAIK、SSE内シストスはGCCとMSVCの間で同じです。
コンパイラは、プロセッサ内の最小限の機能セットのコードを作成することを目指します。また、特定のプロセッサをターゲットにできるコンパイルスイッチも提供します。このようにして、彼らはより多くのコンパイラを販売することができます(古いプロセッサを持っている人々と、新しいものを持つトレンディな人々に)。
コンパイラに付属するドキュメントを調査する必要があります。
ランタイムライブラリに機能の複数の実装が含まれる場合があり、ライブラリはプログラムの実行時に実装を動的に選択します。オーバーヘッドは、直接関数呼び出しの代わりに関数ポインター呼び出しのコストである可能性がありますが、CPU固有の最適化機能を使用する場合、利点ははるかに大きくなる可能性があります。
JITコンパイラ(JavaやC#などのVM言語の場合)これをさらに一歩進めて、ByteCodeをコンパイルします 明確 実行中のCPU。これにより、独自のコードが特定のCPU最適化の利点を提供します。これがJavaコードが実際にできる理由の1つです もっと早く Java JITコンパイラは、プログラムが実際のターゲットマシンで実行されるまで最適化決定を遅らせることができるため、CコードをコンパイルしたCodeよりもコンパイルしたCodeよりも。 ACコンパイラは、ターゲットCPUが何であるかを常に知らずに、これらの決定を下す必要があります。さらに、JITコンパイラは進化し、何もすることなくプログラムを時間の経過とともに速くすることができます。
Intel Cコンパイラを使用し、十分に高い最適化オプションを設定すると、ループの一部が「ベクトル化」されることがわかります。つまり、コンパイラがSSEスタイルの指示を使用するように書き直しました。
SSE操作を直接使用する場合は、「xmmintrin.h」ヘッダーファイルで定義されている内因性を使用します。いう
#含むu003Cxmmintrin.h>
__m128 u、v、w;フロートWW [4];
v = _mm_set1_ps(1.5);
u = _mm_set_ps(0,1,2,3);
w = _mm_add_ps(u、v);
_mm_storeu_ps(ww、w);
さまざまなコンパイラがさまざまな新機能を使用します。 Visual StudioはSSE/2を使用します。Intelコンパイラが最新のCPU機能をサポートすると思います。もちろん、お気に入りの機能の市場浸透について警戒する必要があります。
お気に入りの標準ライブラリが使用するものに関しては、それがコンパイルされたものに依存します。ただし、C ++標準ライブラリは通常、非常に頻繁にテンプレートされているため、オンサイトでコンパイルされているため、SSE2を有効にすると、C ++ STD LIBSが使用する必要があります。 CRTに関しては、それらがコンパイルされたものによって異なります。
通常、コンパイラが次のような特別な機能を使用するコードを生成することができる2つの方法があります。
- コンパイラ自体がコンパイルされると、特定のアーキテクチャのコードを生成するように設定し、アーキテクチャが持つことがわかっている機能を利用できます。たとえば、その場合
gcc
Intelプロセッサ用に設定されているのは、統合されたFPUを含むために十分に新しく構成されています(または、「十分に年齢ではありませんか?)、フローティングポイント命令が生成されます。 - コンパイラが呼び出されると、フラグまたはパラメーターは、プログラムを実行するプロセッサで利用可能な機能のタイプを指定でき、コンパイラはこれらの機能を使用しても安全であることがわかります。フラグが存在しない場合、それらの機能によって提供される特別な指示を使用せずに同等のコードを生成します。
C/C ++で書かれたコードについて話している場合、コンパイラにそうするように伝えた場合、新しい機能が説明されます。デフォルトでは、コンパイラはおそらく「Plain x86」(当然FPU :))をターゲットにしています。通常、現時点で最も広範囲にわたるプロセッサ生成用に最適化されていますが、古いプロセッサで実行できます。
コンパイラに新しい命令セットを考慮してコードを生成したい場合は、適切なコマンドラインスイッチ/プロジェクト設定でそれを行うように指示する必要があります。 /アーチ.
新しい命令セットの多くの機能を「通常の」コードで直接活用できないため、通常、新しい命令セットのネイティブの特定のデータ型で動作するコンパイラの内因性が提供されます。
Intelは、新しいCPUをリリースするたびに更新されたCPUID例コードを提供して、新しい機能を確認できるようにし、覚えている限り長くしています。少なくとも、これは私がこの同じ質問について自分で考えたときに私が見つけたものです。
CPUIDを使用して、SSE 4.1およびSSE 4.2命令セットの存在を検出する
新しいコンパイラがリリースされると、たとえばVS2010のように直接新しい機能を追加します。Visual Studio 2010のビジュアルC ++コード生成