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

Why dynamic scheduling is faster than static scheduling in openmp

本文关键字:静态调度 动态调度 openmp 为什么      更新时间:2023-10-16

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

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

提前谢谢你。

#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 = %dn", 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]= %fn",tid,i,c[i]);
 }
 }
很难

评估任何一段代码的性能,尤其是这么短的代码段。有许多因素会产生影响,从您的特定计算机开始。你运行了多少次代码?每次运行多长时间?你需要良好的统计数据才能明确地判断某物比其他某物更快/更慢。即便如此,其他人可能并非如此。您使用的是什么处理器,它有多少个内核,以及您正在调度多少线程?

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