使用动态计划按顺序执行openmp中的循环迭代

时间:2017-01-19 15:45:41

标签: c multithreading parallel-processing openmp

我想在openmp中使用动态计划运行for循环。

#pragma omp for schedule(dynamic,chunk) private(i) nowait
for(i=0;i<n;i++){
//loop code here
}

我想让每个线程执行有序的块,以便

e.g。线程1 - &gt;迭代0到k

thread2 - &gt;迭代k + 1-> k +块

等。

静态计划部分完成了我想要的工作,但我想动态地平衡迭代。

如果我正确地理解了它的作用,那么它们都没有。

我的问题是如何确保分配的块是有序块?

我正在使用openmp 3.1和gcc

1 个答案:

答案 0 :(得分:0)

您可以自己实现这一点,而无需诉诸omp for,这被专业的OpenMP程序员视为一种便利功能。

以下粗略说明了您可能会做的事情。请仔细检查算术。

#pragma omp parallel
{
  int me = omp_get_thread_num();
  int nt = omp_get_num_threads();
  int chunk = /* divide n by nt appropriately */
  int start = me * chunk;
  int end   = (me+1) * chunk;
  if (end > n) end = n;
  for (int i = start; i < end; i++) {
      /* do work */
  }
} /* end parallel */

这不会进行任何动态负载平衡。如果您事先知道成本函数,则可以通过将线程迭代不均匀地分配给线程来自己完成。您可以阅读检查器 - 执行者模型(例如1)。