我正在尝试对计算进行基准测试,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)
)?