7

新しいコンパイラは、MMX SSE、3DNow! などの新しい CPU に組み込まれた追加機能を使用しますか? など?

つまり、元の 8086 には FPU さえなかったので、古いコンパイラはそれを使用することさえできませんが、FPU はすべての新しい CPU の一部であるため、新しいコンパイラは使用できます。では、新しいコンパイラは CPU の新しい機能を使用しますか?

または、新しい C/C++ 標準ライブラリ関数は新しい機能を使用していますか?

ご回答ありがとうございます。

編集:

わかりましたので、すべてが正しければ、特に浮動小数点数を使用する標準的な操作でさえ、SSE を使用してより高速に実行できます。

これを使用するには、コンパイラでこの機能を有効にする必要があります (サポートされている場合)。もしそうなら、対象のプラットフォームがその機能をサポートしていることを確認する必要があります。

OpenGL、DirectX など、最高のパフォーマンスを必要とする一部のシステム ライブラリの場合、このサポートはシステムでサポートされる場合があります。

デフォルトでは、互換性の理由から、コンパイラはそれをサポートしていませんが、Intel などによって提供される特別な C 関数を使用して、このサポートを追加できます。これは、任意のプラットフォームを直接制御でき、目的のプラットフォームの特別な機能を使用してマルチ CPU をサポートするアプリケーションを作成できるため、最適な方法です。

4

9 に答える 9

4

gcc は、コマンド ライン引数を介して新しい命令をサポートします。詳細については、こちらを参照してください。引用するには:

GCC は、最近の Intel および AMD プロセッサの MMX、SSE、SSE2、SSE3、および 3dnow 拡張機能の追加命令を利用できます。オプション -mmmx、-msse、-msse2、-msse3、および -m3dnow を使用すると、これらの追加命令を使用できるようになり、複数ワードのデータを並行して処理できるようになります。結果の実行可能ファイルは、適切な拡張機能をサポートするプロセッサでのみ実行されます。他のシステムでは、不正な命令エラー (または同様のエラー) でクラッシュします。

于 2010-05-17T21:43:17.797 に答える
2

これらの命令は、ISO C/C++ 標準の一部ではありません。これらは、使用するコンパイラに応じて、コンパイラ組み込み関数を介して利用できます。

MSVC については、http://msdn.microsoft.com/en-us/library/26td21ds(VS.80).aspx を参照してください。

GCC については、http://developer.apple.com/hardwaredrivers/ve/sse.htmlを参照してください。

私の知る限り、SSE組み込み関数はGCCとMSVCで同じです。

于 2010-05-17T21:46:33.303 に答える
1

コンパイラは、プロセッサ内の最小限の機能セットのコードを生成することを目的としています。また、特定のプロセッサをターゲットにするためのコンパイル スイッチも提供します。このようにして、彼らはより多くのコンパイラを販売することができます (古いプロセッサを持っている人だけでなく、新しいプロセッサを持っているトレンディな人にも)。

コンパイラに付属のドキュメントを調べる必要があります。

于 2010-05-17T21:43:54.213 に答える
1

ランタイム ライブラリには機能の複数の実装が含まれている場合があり、ライブラリはプログラムの実行時に実装を動的に選択します。オーバーヘッドは、直接の関数呼び出しではなく関数ポインター呼び出しのコストかもしれませんが、CPU 固有の最適化された関数を使用すると、メリットがはるかに大きくなる可能性があります。

JIT コンパイラ (Java や C# などの VM 言語用) は、これをさらに一歩進めて、実行中の特定の CPU 用にバイトコードをコンパイルします。これにより、独自のコードに特定の CPU 最適化の利点がもたらされます。Java JIT コンパイラーは、プログラムが実際のターゲット・マシンで実行されるまで最適化の決定を遅らせることができるため、Java コードが実際にコンパイル済みの C コードよりも高速である理由の 1 つがこれです。AC コンパイラは、ターゲット CPU が何であるかを常に知らなくても、これらの決定を行う必要があります。さらに、JIT コンパイラーは進化しており、ユーザーが何もしなくても時間の経過とともにプログラムを高速化できます。

于 2010-05-17T21:46:50.203 に答える
1

インテル® C コンパイラーを使用し、十分に高い最適化オプションを設定すると、一部のループが「ベクトル化」されることがわかります。これは、コンパイラーがループを SSE スタイルの命令を使用するように書き換えたことを意味します。

SSE 操作を直接使用する場合は、'xmmintrin.h' ヘッダー ファイルで定義されている組み込み関数を使用します。いう

#include <xmmintrin.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);

于 2010-05-17T21:55:07.167 に答える
0

さまざまなコンパイラは、さまざまな新機能を使用します。Visual Studio は SSE/2 を使用し、Intel コンパイラは最新の CPU 機能をサポートすると考えています。もちろん、お気に入りの機能が市場に浸透することには注意が必要です。
お気に入りの標準ライブラリが何を使用するかについては、それがコンパイルされたものによって異なります。ただし、C++ 標準ライブラリは通常、非常に頻繁にテンプレート化されているため、オンサイトでコンパイルされます。そのため、SSE2 を有効にする場合、C++ std ライブラリはそれを使用する必要があります。CRTに関しては、それらがコンパイルされたものに依存します。

于 2010-05-17T21:44:14.057 に答える
0

一般に、コンパイラが次のような特別な機能を使用するコードを生成する方法は 2 つあります。

  1. コンパイラ自体がコンパイルされると、特定のアーキテクチャ用のコードを生成するように構成され、アーキテクチャが持つことがわかっている機能を利用できます。たとえばgcc、統合 FPU を搭載するのに十分なほど新しい (または「十分に古くない」) Intel プロセッサ用に構成されている場合、浮動小数点命令が生成されます。
  2. コンパイラーが呼び出されると、フラグまたはパラメーターは、プログラムを実行するプロセッサーが使用できる機能のタイプを指定でき、コンパイラーはこれらの機能を安全に使用できることを認識します。フラグが存在しない場合、それらの機能によって提供される特別な命令を使用せずに、同等のコードが生成されます。
于 2010-05-17T21:46:15.380 に答える
0

C/C++ で記述されたコードについて話している場合、コンパイラにそうするように指示すると、新しい機能が活用されます。デフォルトでは、コンパイラはおそらく「プレーンx86」(当然FPUを使用します:))をターゲットにしており、通常は現時点で最も普及しているプロセッサ世代向けに最適化されていますが、古いプロセッサでも実行できます。

コンパイラに新しい命令セットも考慮してコードを生成させたい場合は、適切なコマンド ライン スイッチ/プロジェクト設定を使用してコンパイラに指示する必要があります。たとえば、Visual C++ の場合、SSE/SSE2 命令生成を有効にするオプションは/archです。

新しい命令セットの多くの機能は、「通常の」コードでは直接利用できないことに注意してください。そのため、通常、新しい命令セット固有の特定のデータ型を操作するコンパイラ組み込み関数が提供されます。

于 2010-05-17T21:48:48.670 に答える
0

Intel は、新しい CPU をリリースするたびに更新された CPUID のサンプル コードを提供しているため、新しい機能を確認することができます。少なくとも、これは私がこの同じ質問について自分自身で最初に考えたときに見つけたものです.

CPUID を使用して SSE 4.1 および SSE 4.2 命令セットの存在を検出する

新しいコンパイラがリリースされると、たとえば VS2010 のように新しい機能が直接追加されます。 Visual Studio 2010 での Visual C++ コードの生成

于 2010-05-17T22:31:14.633 に答える