質問

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

私の質問は「それはすべてシムドですか?」です。 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)とします。追加(a1、b1)を実行し、(a2、b2)を同時に追加できる追加命令がありますか。

Core2Duoで利用可能なベクトル機能ユニットはいくつあり、これらの情報はどこで入手できますか?

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

役に立ちましたか?

解決

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

  • 2つの4幅のベクトル操作 意思 すべての最新のプロセッサが高度にパイプラインされているという意味で、同意して実行されます。 2番目の命令は、パイプを最初のサイクルの後ろに1サイクルだけ下ります(2つが相互依存していないと仮定します。これは例の場合です)。

  • マルチコアプロセッサには、独自のベクトル機能ユニットがあります。これを活用するには、マルチスレッドコードを作成する必要があります。

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

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

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

他のヒント

これを行うための指示は1つもないと思います(最近のバージョンのSSEに1つ忍び込んでいない限り)。

ただし、あなたがしている操作は独立しているため、コンパイラは最初のものが終了する前に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にアプリケーションを移行する人々に向けてやや調整されていますが、そこにもいくつかの良い一般情報があります。

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

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

コメントへの回答で編集:すべての情報は上記にリンクされているリンクにありますが、No。8 16ビット整数を1つのレジスタに詰めることができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top