3

私は、2つのベクトルを生成し、経過時間を測定する並列スカラーを経験していました。順次スカラー積と並列スカラー積を比較していました。

seq:double scalar(int n, double x[], double y[])

for (int i=0; i<n; i++)
{
   sum += x[i]*y[i];
}

平行:double scalar_shm(int n, double x[], double y[])

#pragma omp parallel for private(i) shared(x,y) reduction(+:sum)
for (i=0; i<n; i++)
{
   sum += x[i]*y[i];
}

私はこれらを次々と呼んだ:

//sequential loop
for (int n=0; n<loops; n++)
{ scalar(vlength,x,y); }

//measure sequential time
t1 = omp_get_wtime() - tstart;

//parallel loop
for (int n=0; n<loops; n++)
{ scalar_shm(vlength,x,y); }

//measure parallel time
t2 = omp_get_wtime() - t1 - tstart;

//print the times elapsed
cout<< "total time (sequential): " <<t1 <<" sec" <<endl;
cout<< "total time (parallel  ): " <<t2 <<" sec" <<endl;

サイクルごとにランダムなdoubleでベクトルを埋め、無関係だと思うので、その部分を削除しました。

このための出力は次のとおりです。

total time (sequential): 15.3439 sec
total time (parallel  ): 24.5755 sec

私の質問は、なぜ並列のものが遅いのですか?それが遅い場合、それは何のために良いですか?このような計算がポイントだと思っていたので、もっと速くなると思っていました。

注:これはIntelCorei7-740QMで実行しました

4

1 に答える 1

1

反復ごとに新しい並列セクションコードを作成および破棄します。この操作は非常に遅いです。内部ループの外側に並列セクションを作成してみることができます。

//parallel loop
int sum;
#pragma omp parallel private(n) reduction(+:sum)
{
    for (int n=0; n<loops; n++)
    { 
       scalar_shm(vlength,x,y, sum); 
    }
}

scalar_shm関数内では、OpenMPプラグマは次のようになります。

#pragma omp for private(i)
for (i=0; i<n; i++)
{
   sum += x[i]*y[i];
}
于 2013-01-05T14:55:39.310 に答える