2012-05-09 24 views
1

関数の例(以下に例を示します)では、forループはOpenMPを使用して並列化することも、ベクトル化を使用してベクトル化することもできます。私は、OpenMP とベクトル化 OpenMPとベクトル化の比較

  • 間のパフォーマンスの違いがあるかどうか

    1. を知っていただきたいと思い

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

      は、上の1つを使用してのいずれかの利点がありますその他。

    2. OpenMPとベクター化を併用する可能性はありますか?

    注:私は別のSSEのバージョン、プロセッサ/コア(スレッドの数は、OpenMPにスケールアップされる)の数などについてかかわらを与えていない ...私の質問は、一般的にあります。答えはより具体的でもあります。

  • 答えて

    5

    のOpenMPおよびベクトル化はない競合する技術ですが、むしろ彼らはお互いを補強。ベクトル化はベクトル機能(SSE/3DNow!/ Altivec /など)を持つCPUコアのシリアルパフォーマンスを向上させ、各スレッドの実行速度を向上させ、OpenMPは複数のスレッドを実行するために複数の利用可能なコアを使用できますより大きな問題を並行して解決するためです。要約すると

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

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

    ベクトル化やOpenMPやベクトル化+ OpenMPの性能は、ハードウェア、メモリ帯域幅、キャッシュの使用状況などによって異なるため、常に「それに依存する」引数があります。

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

    3
    1. はい。
    2. 対策してはいけません。
    3. はい。
    関連する問題