【发布时间】:2018-04-08 22:02:08
【问题描述】:
我有一个可以轻松并行化的并行循环。我需要为循环实现自定义调度选项。为此,我将明确地将迭代分配给线程,而不是使用标准的并行区域,如下所示:
#pragma omp parallel for
我只是使用:
#pragama omp parallel [declarations]
到目前为止我的代码如下:
#define N 500
#pragma omp parallel
{
int num_threads = omp_get_num_threads();
int thread = omp_get_thread_num();
int start = N*thread/num_threads;
int end = N*(thread+1)/num_threads;
for (i=start; i<end; i++){
/* LOOP */
}
}
我需要应用一种调度算法,以便为每个线程分配一组本地迭代,我相信我已经完成了。每个本地集被分成每个线程执行的块。当线程完成它的块时,它会找到具有最多剩余块的线程并开始执行这些块。重复此过程,直到没有块剩余。 我正在努力弄清楚如何开始这个,因为我不完全确定如何找出负载最多的线程是什么,以及如何将本地迭代集拆分成块,同时仍然保留在平行区域。
【问题讨论】:
-
我不完全确定我得到了这个问题,您必须自己实现负载平衡调度,还是必须使用 OpenMP 来实现?
-
使用工作项(块)队列和一些(可能是可变的)工作线程数可能会更容易和更有效。如果
i是数组的索引,那么您的队列必须有startIdx和count。 -
我必须使用 OpenMP 来实现亲和性调度选项。 @jwdonahue i 是正确数组的索引。我想这种方法会很好用。我现在有一组起始索引。但我坚持如果完成,如何允许线程跳转到其他起点。或者如何监控进度。
-
我详细介绍了手动实现 OpenMP 调度程序 here。您可能可以使用它来定义 OpenMP 未实现的自定义调度程序。
-
你想要的是
schedule(dynamic,chunk)吗?
标签: c multithreading parallel-processing openmp schedule