2

関数の例(例を以下に示します)を考えると、forループは、OpenMPを使用して並列化するか、ベクトル化を使用してベクトル化することができます(コンパイラーがベクトル化を行うと仮定)。

void function(float* a, float* b, float* c, int n)
{
      for(int i = 0; i < n; i++)
      {
          c[i] = a[i] * b[i];
      }
}

私が知りたいのですが

  1. OpenMPとVectorizationのパフォーマンスに違いがあるかどうか
  2. どちらか一方を使用することに利点はありますか?
  3. OpenMPとベクトル化の両方を一緒に使用する可能性はありますか?

注: SSEのバージョンの違い、プロセッサー/コアの数(OpenMPではスレッドの数が増えるため)などについては説明しませんでした...私の質問は一般的なものです。答えもより具体的にすることができます。

4

2 に答える 2

5

OpenMPとベクトル化は競合するテクノロジーではなく、相互に補強合っています。ベクトル化により、ベクトル機能(SSE / 3DNow!/ Altivec / etc。)を備えたCPUコアのシリアルパフォーマンスが向上し、各スレッドの実行速度が向上します。一方、OpenMPは、複数のスレッドを実行するために複数の利用可能なコアを使用できます。より大きな問題を並行して解決するため。

要約すれば:

  • ベクトル化されたシリアルアプリケーションは、通常、ベクトル化されていないシリアルアプリケーションよりも高速に実行されます。
  • ベクトル化されていないOpenMPアプリケーションは、通常、ベクトル化されていないシリアルアプリケーションよりも高速に実行されます(正しく記述されていて、アルゴリズムで並列化が許可されている場合)。
  • ベクトル化されたOpenMPアプリケーションは、通常、ベクトル化されていないシリアルアプリケーションよりも高速に実行される非ベクトル化されたOpenMPアプリケーションよりも高速に実行されます。

ベクトル化はデータ並列のみであり(複数のデータ項目に同じ操作を適用)、可能な限り低いハードウェアレベル(コア/ ALU)で機能しますが、OpenMPはデータおよび/またはタスク並列の両方であり、はるかに高いレベルでの抽象化です。

ベクトル化またはOpenMPまたはベクトル化+OpenMPのパフォーマンスは、ハードウェア、メモリ帯域幅、キャッシュ使用量などに依存する可能性があるため、常に「依存する」という議論があります。

ケース関数に関しては、ベクトルの大きさによって異なります。それらが小さすぎる場合、OpenMPを使用してもメリットはなく、オーバーヘッドのために実行が遅くなることさえあります。ベクトル化により、実行時間が改善される可能性があります。

于 2012-05-09T12:02:14.410 に答える
4
  1. はい。
  2. 測定し、主張しないでください。
  3. はい。
于 2012-05-09T06:05:52.463 に答える