いくつかの並列プログラミングの概念を実装する方法を学ぶために、OpenMP に関するTim Mattsonの講義に従っています。
3x10^8ステップを使用してPIの値を計算する並列プログラムの実行時の動作を観察しようとしていました。
ここにコードがあります、
#include <omp.h>
#include <stadio.h>
static long num_steps = 300000000;
double step;
#define PAD 8 // tried 50 too
#define NUM_THREADS 4
int main()
{
int i, nthreads;
double pi, sum[NUM_THREADS][PAD];
double ts, te;
ts = omp_get_wtime();
step = 1.0/(double) num_steps;
omp_set_num_threads(NUM_THREADS);
#pragma omp parallel
{
int i, id,nthrds;
double x;
id = omp_get_thread_num();
nthrds = omp_get_num_threads();
if (id == 0) nthreads = nthrds;
for (i=id, sum[id]=0.0;i< num_steps; i=i+nthrds) {
x = (i+0.5)*step;
sum[id][0] += 4.0/(1.0+x*x);
}
}
for(i=0, pi=0.0;i<nthreads;i++)
pi += sum[i][0] * step;
te = omp_get_wtime();
printf("%.10f\n", pi);
printf("%.f\n", te-ts);
}
現在、デュアルコアマシンで実行されているUbuntu 14.04 LTSを使用していました。omp_get_num_procs()
返された2への呼び出し。実行時間は、1.31 秒から 4.46 秒までの範囲で、完全にランダムのようなものでした。シリアルプログラムは、ほとんど常に 2.31 秒かかっていました。
1、2、3、4、最大10スレッドを作成してみました。実行時間はすべてのケースで大きく異なりますが、スレッド数が多いほど平均は短くなります。私は他のアプリケーションを実行していませんでした。
実行時間があまりにも大きく変動した理由を誰か説明できますか?
実行時間を正確に計算する方法は? 講師は、一貫しているように見える彼のコンピューターの実行時間を与えました。また、彼はデュアル コア プロセッサも使用していました。