1

Core2Duoプロセッサー(コンパイラーgcc 4.4.1)で利用可能なSSE拡張命令を使用しています。それぞれ128ビット長の16個のレジスタが使用可能であることがわかります。これで、4つの整数値を1つのレジスタに、4つを別のレジスタに収容でき、組み込み関数を使用してそれらを1つの命令に追加できます。明らかな利点は、この方法では4つではなく1つの命令しか必要としないことです。

私の質問は「SIMDはこれで全部ですか?」です。a1、a2、a3、a4、a5、a6、a7、a8とb1、b2、b3、b4、b5、b6、b7、b8があるとします。A1、A2をベクトルレジスタとします。ここで、A1 <<<(a1、a2、a3、a4)およびB1 <<<(b1、b2、b3、b4)、およびadd(A1、B1)がベクトル加算を実行します。

A2 <<<(a5、a6、a7、a8)、B2 <<<(b5、b6、b7、b8)とします。add(A1、B1)とadd(A2、B2)を同時に実行できるadd命令はありますか。

core2duoで使用できるベクトル関数単位の数と、これらの情報はどこで入手できますか?

これらに関連するその他の情報源は高く評価されています。

4

3 に答える 3

3
  • いいえ、それを行うための単一のSSE命令はありません。2つの指示を出す必要があります。x86文字列命令やREPプレフィックスのようなものを考えていますか?SSEに相当するものはありません。

  • 最新のすべてのプロセッサが高度にパイプライン化されているという意味で、2つの4幅のベクトル演算は慎重に実行されます。2番目の命令は最初の命令からわずか1サイクル遅れてパイプを下ります(2つが相互依存していないと仮定します。これはあなたの例の場合です)。そのため、その1サイクルを除いて、実行は時間的にオーバーラップします。

  • マルチコアプロセッサの各コアには、独自のベクトル関数単位があります。これを利用するには、マルチスレッドコードを作成する必要があります。

  • 一部のCPUには、コアごとに1つのベクトルユニットがあり、一部には1/2しかありません。後者の場合、ベクトルユニットの幅は64ビットのみで、一度にSSE命令の半分しか実行されません。あなたはあなたが支払うものを手に入れます。

  • より広いベクトル単位をサポートするためにSSEを進化させる新しい命令セット拡張であるAVXを調べる必要があります。

  • または、OpenCLまたはCudaを使用したGPUでの実際のベクトルプログラミングを調べることもできます。

于 2010-09-11T14:56:15.880 に答える
0

Intelサイトには、必要なすべての情報が含まれています。

http://www.intel.com/products/processor/manuals/

コメントに答えて編集:すべての情報は上記にリンクされているリンクにありますが、いいえ。8つの16ビット整数を1つのレジスタにパックして、8つの同時追加を実行できますが、SSEでは2つのレジスタを同時に追加できません。

于 2010-09-11T11:32:51.760 に答える
0

これを行うための単一の指示はないと思います(最近のバージョンのSSEにそれを忍び込ませない限り)。

ただし、実行している操作は独立しているため、コンパイラーは最初の追加命令が終了する前に2番目の追加命令を発行できます。したがって、タイムラインは次のようになります

begin C1 = A1 + B1
begin C2 = A2 + B2
wait
end C1 = A1 + B1
end C2 = A2 + B2

したがって、2つの命令を使用している場合でも、必ずしも2倍の時間がかかるとは限りません。実際の待機時間は、プロセッサと、使用している特定の命令のレイテンシによって異なります。

パイプラインのより詳細な説明は次のとおりです:http://en.wikipedia.org/wiki/Instruction_pipeline

一般的なSIMDプログラミングのヘルプについては、AppleのSSEページがかなり良いです。これは、アプリケーションをPowerPCからSSEに移行する人々を対象としていますが、そこにもいくつかの優れた一般的な情報があります。

于 2010-09-11T13:29:29.363 に答える