1

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))。

4

2 に答える 2