1

私は先月、コンピューター行列の乗算に取り組んでおり、openMP と eigen3 を使用していくつかのテストを行いました。

テストは次のマシンで行われました。

コンピューター 1:

Intel Core i7-3610QM CPU @ 2,30GHz / 6 GB ddr3

コンピューター 2:

6 コア AMD Opteron(tm) プロセッサ 2435 2.60 GHz (2 プロセッサ) / 16 GB

openMP では、次の行列 - 行列乗算アルゴリズムが使用されました。

void matrix4openmp(void)
{
    int j;

#pragma omp parallel for 
for (j=0;j<N; j+=2){
  double v1[N],v2[N];
    int i,k;
  for (i=0;i<N; i++){
     v1[i]=b[i][j];
     v2[i]=b[i][j+1];
  }

  for (i=0; i<N;i+=2){
     register double s00,s01,s10,s11;
     s00=s01=s10=s11=0.0;
     for (k=0;k<N;k++){
        s00 += a[i]  [k] * v1[k];
        s01 += a[i]  [k] * v2[k];
        s10 += a[i+1][k] * v1[k];
        s11 += a[i+1][k] * v2[k];
     }
     c[i]  [j]   =s00;
     c[i]  [j+1] =s01;
     c[i+1][j]   =s10;
     c[i+1][j+1]   =s11;
  }
}

結果は次のとおりです。

___________コンピュータ 1__________コンピュータ 2

順次________232,75600____________536,21400

OpenMP____________2,75764____________7,62024

Eigen3______________3,35090____________1,92970

※時間は秒単位です。

*マトリックスのサイズは 2700 x 2500 と 2500 x 2700 でした。

*逐次アルゴリズムは OMP と同じではありません。これは mm 乗算の最も単純なバージョンであり、ここで見ることができます: http://pastebin.com/Pc9AKAE8 .

* SSE2 命令は、eigen3 テスト用にアクティブ化されました。

*OpenMP はデフォルトのコアを使用します。これは、仮想コアを含め、Windows が検出するすべてのコアです。

ご覧のとおり、OpenMP バージョンは、最初のコンピューター (i7) で eigen3 バージョンよりも高速です。ただし、コンピューター 2 (2x Opteron) の場合、eigen3 の完全なパフォーマンスは、OpenMP バージョンとコンピューター 1 で行われたすべてのテストを上回っています。

この結果が得られる理由と、コンピュータ 1 でコンピュータ 2 ほど高速でない eigen3 の理由がわかりませんか?

4

1 に答える 1

1

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

順次バージョンと並列バージョンの大きな違いは、使用されているアルゴリズムが異なるためです。逐次バージョンは最適化なしで通常の単純な O(N^3) を使用しますが、並列バージョンは最適化されたバージョン (ブロックを使用) です。同じアルゴリズムを使用すると、順次バージョン時間は約 10 (コンピューター 1) と 50 (コンピューター 2) になります。申し訳ありませんが、これらの値を最初の投稿に記載する必要がありました。

1 台目と 2 台目のコンピューターでの Eigen3 のパフォーマンスと OpenMP のパフォーマンスの違いは、起動されたスレッドの数と利用可能な物理プロセッサの数によるものと思われます。起動されたスレッドの数が利用可能な物理プロセッサの数よりも多い場合、Eigen3 のパフォーマンスが低下することがわかりましたが、これは OpenMP には当てはまりません。

テストでは、両方のケースで起動されたスレッドの数は、合計プロセッサ数 (仮想 + 物理) と同じでした。

コンピューター 1 では、プロセッサの合計数 (仮想 + 物理 - – ハイパースレッディングによる) が物理プロセッサの数より多いため、Eigen3 のパフォーマンスが低下しています。

コンピューター 2 では、プロセッサの総数が物理プロセッサの数と同じであるため、Eigen3 のパフォーマンスが向上しています。スレッド数に物理プロセッサ数の 2 倍を使用すると、Eigen3 のパフォーマンスも低下し、openMP は実際には少し改善されます。

于 2013-01-24T18:00:13.123 に答える