我想在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
答案 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)。