为什么动态调度比 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 = %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
值执行扫描并对性能进行基准测试。话虽如此,您观察的可能原因是您的系统在两次测试中的使用方式不同。动态调度可以更好地适应运行时条件。
相关文章:
- 如何静态识别动态堆分配?
- 静态和动态模板初始化可以交错吗?
- 动态调度到模板函数C++
- openMp 动态调度与按处理时间排序任务时的 LPT 调度相同吗?
- 是否会动态调度在具有 vtable 的类上调用非虚函数
- 带有模板类和动态调度的C 共享_POINTER
- C++或D:在没有动态调度的情况下解耦类的习惯用法
- C++动态调度和后期绑定有什么区别
- 动态调度是如何在程序集中发生的
- 为什么动态调度比 openmp 中的静态调度更快
- 动态调度在类外部声明的方法
- C++避免使用 using 关键字在派生类中进行动态调度
- OpenMP:循环'std::map'基准测试(动态调度)
- C++中动态调度的规则是什么?
- O'Reilly "Objective-C Pocket Reference"声称C++不支持动态调度,这是真的吗?
- 动态调度方法
- 针对不相关类型的动态调度的解决方案
- 模板函数的动态调度
- 动态调度哪些函数
- 新的运算符+OpenMP动态调度子句