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

时间:2015-01-10 23:29:57

标签: c++ openmp codeblocks

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

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

提前谢谢。

#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]);
 }
 }

1 个答案:

答案 0 :(得分:0)

很难评估任何代码的性能,特别是这么短的代码。从您的特定机器开始,有许多因素有所贡献。你运行了多少次代码?每次运行多长时间?您需要良好的统计数据才能明确地告诉某事情比其他事情更快/更慢。即便如此,对其他人来说也许不一样。你在使用什么处理器,它有多少核心,以及你安排了多少线程?

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