OpenMP:调度性能

时间:2014-03-31 19:14:34

标签: openmp

我正在研究OpenMP fortran。 我有关于日程安排的问题。

所以从这两个选项中哪个会有更好的表现?

!$OMP PARALLEL DO PRIVATE(j) SCHEDULE(STATIC) 
do j=1,l
  call dgemm("N","N",..)
 end do
!$OMP END PARALLEL DO 


!$OMP PARALLEL DO PRIVATE(j) 
do j=1,l
   call dgemm("N","N",..)
end do
!$OMP END PARALLEL DO 

1 个答案:

答案 0 :(得分:0)

OpenMP定义了三个调度子句:静态,动态和引导。

  1. 静态:预先在线程之间(编译时)均匀分割循环变量;
  2. 动态:在线程在运行时完成时分发块;
  3. 指导:作为动态,但块大小随着每次连续分配而减少;
  4. 默认调度是独立于实现的(未在标准中指定)。因此,对于您的问题,根据编译器,它可能不会改变任何内容(如果默认实现是静态)。如果它发生了变化,会发生以下情况:

    • 静态调度对于常规任务是最佳的,这意味着循环的每次迭代都需要相同的时间。它降低了同步任务分配的开销。
    • 动态调度最适合不规则任务,这意味着您的迭代可能具有不同的执行时间。这很有用,因为一个线程可以处理多个小任务,而另一个可以处理更少的任务。
    • 引导式调度通过减少块的粒度来改善全局负载平衡。在并行结束时分配小任务以减少线程之间的结束时间差异会更有效。