f(x)
繰り返しごとにスレッド数を変えながら、コンピューティングのベンチマークを試みています。
f(x) = c * ln(x) * cos(x)
n=10000000
for (int pp = 2; pp<17; pp++)
{
p = pp;
int chunk = n/p; //acts like floor
omp_set_num_threads(p);
double start_parallel = omp_get_wtime();
//start parallel
#pragma omp parallel shared(tt,chunk) private (i)
{
//printf("thread number %d\n",omp_get_thread_num());
#pragma omp for schedule(dynamic,chunk) nowait
for(i=0; i<n; i++)
{
//tt[i] = f(tt[i]);
tt[i] = f1(tt[i]); //the speed up is much higher with f1 since log and cos
//computations are polynomial; see function.
}
} //end parallel
double end_parallel = omp_get_wtime();
double cpu_time_used_parallel = (double) (end_parallel - start_parallel);
printf("parallel: for n=%d, p=%d, time taken=%f, speedup=%f\n",
n,p,cpu_time_used_parallel,
cpu_time_used_seq/cpu_time_used_parallel);
}
結果:
さまざまなスレッドを開始しました:
並列: n=10000000、p=2、所要時間=0.153774、スピードアップ=3.503831
並列: n=10000000、p=3、所要時間=0.064447、スピードアップ=8.360370
並列: n=10000000、p=4、所要時間=0.044694、スピードアップ=12.055239
並列: n=10000000、p=5、所要時間=0.048700、スピードアップ=11.063550
並列: n=10000000、p=6、所要時間=0.039009、スピードアップ=13.811989
並列: n=10000000、p=7、所要時間=0.041735、高速化=12.910017 の場合
並列: n=10000000、p=8、所要時間=0.041268、スピードアップ=13.055919
並列: n=10000000、p=9、所要時間=0.039032、スピードアップ=13.804157
並列: n=10000000、p=10、所要時間=0.038970、スピードアップ=13.825767
並列: n=10000000、p=11、所要時間=0.039843、スピードアップ=13.522884
並列: n=10000000、p=12、所要時間=0.041356、スピードアップ=13.028237
並列: n=10000000、p=13、所要時間=0.041039、スピードアップ=13.128763
並列: n=10000000、p=14、所要時間=0.047433、スピードアップ=11.359218
並列: n=10000000、p=15、所要時間=0.048430、スピードアップ=11.125202
並列: n=10000000、p=16、所要時間=0.051950、スピードアップ=10.371477
注:ここでの高速化は、シーケンシャル アルゴリズム (スレッド = 1) に対して計算されます。
p
(スレッド数)の変動による高速化の影響はあまりないようです。
私はこれを正しく行っていますか、それともスレッド数の非効率的な増分が原因です (つまり、理論的に言えば、変更してp
も深刻な影響はありませんO(myprogram)
)。