OpenMPを使用して簡単なアプリケーションを作成しようとしています。残念ながら私はスピードアップに問題があります。 このアプリケーションでは、whileループが1つあります。このループの本体は、シーケンシャルに実行されるべき命令と、ループのためのものとからなる。私は#pragma omp parallel for
を使ってこれをループ並列にします。このループはあまり働いていませんが、非常に頻繁に呼び出されます。OpenMP - スレッドを一度だけ作成する
私は2つのバージョンのforループを準備し、1,2および4コアでアプリケーションを実行します。
バージョン1(forループの4回の反復):22秒、23秒、26秒。
バージョン2(forループで100000反復):20秒、10秒、6秒。
ご覧のとおり、forループがあまり効果がない場合、2コアと4コアの時間は1コアよりも長くなります。 私はその理由は、#pragma omp parallel for
がwhileループの各繰り返しで新しいスレッドを作成するからです。ですから、私はあなたに質問したいと思います - スレッドを一度(whileループの前に)作成し、whileループの中のいくつかのジョブが順次実行されるようにする可能性はありますか?
#include <omp.h>
#include <iostream>
#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int main(int argc, char* argv[])
{
double sum = 0;
while (true)
{
// ...
// some work which should be done sequentially
// ...
#pragma omp parallel for num_threads(atoi(argv[1])) reduction(+:sum)
for(int j=0; j<4; ++j) // version 2: for(int j=0; j<100000; ++j)
{
double x = pow(j, 3.0);
x = sqrt(x);
x = sin(x);
x = cos(x);
x = tan(x);
sum += x;
double y = pow(j, 3.0);
y = sqrt(y);
y = sin(y);
y = cos(y);
y = tan(y);
sum += y;
double z = pow(j, 3.0);
z = sqrt(z);
z = sin(z);
z = cos(z);
z = tan(z);
sum += z;
}
if (sum > 100000000)
{
break;
}
}
return 0;
}