私は先月、コンピューター行列の乗算に取り組んでおり、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 の理由がわかりませんか?