为什么在openmp中动态调度比静态调度快

Why dynamic scheduling is faster than static scheduling in openmp

我正在学习并行编程,我正在尝试弄清楚动态调度和静态调度之间的区别。

据我所知,到目前为止,静态应该比动态更快,因为静态中的块是在编译期间计算并调度到线程的,而不是在 运行 时间内。但是我执行下面的程序,静态时间结果比动态时间大......为什么会这样?请帮助我。

提前致谢。

#pragma omp parallel shared(a,b,c,nthreads,chunk) private(i,tid)
{
 tid = omp_get_thread_num();
 if (tid == 0){
 nthreads = omp_get_num_threads();
 printf("Number of threads = %d\n", nthreads);
 }
 printf("Thread %d starting...\n",tid);
 #pragma omp for schedule(static,chunk)
 for (i=0; i<N; i++){
 c[i] = a[i] + b[i];
 printf("Thread %d: c[%d]= %f\n",tid,i,c[i]);
 }
 }

评估任何一段代码的性能真的很难,尤其是这么短的一段代码。从您的特定机器开始,影响因素有很多。您 运行 编码了多少次?每个 运行 多长时间?您需要良好的统计数据才能明确地说出某些东西 faster/slower 而不是其他东西。即使那样,其他人也可能并非如此。您使用的是什么处理器,它有多少个内核,您调度了多少个线程?

很多还可以取决于你选择的chunk尺码。也许您所做的选择不是最优的。如果您想了解更多信息,请扫描 chunk 的各种值并对性能进行基准测试。话虽这么说,您观察的可能原因是您的系统在两次测试中的使用方式不同。动态调度更适应 运行 时间条件。