Parallel processing openMP如何获得更好的工作平衡?

Parallel processing openMP如何获得更好的工作平衡?,parallel-processing,scheduling,openmp,Parallel Processing,Scheduling,Openmp,我正在开发一个程序,该程序必须对多个文件执行计算,foobar,可以对一个文件并行或顺序执行,foobar,该程序将接收多个文件(大小可能不同!)并使用指定数量的线程,并行或顺序地对每个对象应用计算foobar 下面是该程序如何在8个文件上启动,其中包含三个线程 ./program 3 file1 file2 file3 file4 file5 file6 file7 file8 我实现的默认调度是在每个文件上并行影响一个线程来执行计算(这就是我的程序现在的工作方式!) Edition:这是我

我正在开发一个程序,该程序必须对多个文件执行计算,
foobar
,可以对一个文件并行或顺序执行,
foobar
,该程序将接收多个文件(大小可能不同!)并使用指定数量的线程,并行或顺序地对每个对象应用计算
foobar

下面是该程序如何在8个文件上启动,其中包含三个线程

./program 3 file1 file2 file3 file4 file5 file6 file7 file8
我实现的默认调度是在每个文件上并行影响一个线程来执行计算(这就是我的程序现在的工作方式!)

Edition:这是我使用的默认日程安排

#pragma omp parallel for private(i) schedule(guided,1)
for (i = 0; i < nbre_file; i++)
   foobar(files[i]);  // according to the size of files(i) foobar can react as a sequential or a parallel program (which could induce nested loops)
#pragma omp并行专用(i)时间表(指南,1)
对于(i=0;i
见下图

在上图中,最终时间是在最大的文件file8上按顺序求解
foobar
所花费的时间

我认为一个能有效处理工作平衡的更好的调度方法是在大文件上并行应用计算
foobar
。如下图所示,tr i表示线程

这样,最后一次将是并行求解最大文件file8上的
foobar
(在上图中,我们使用了两个线程!)所花费的时间

我的问题是:

可以使用openmp进行这样的调度吗?


谢谢你的回复

您是否尝试了
动态
调度而不是引导

如果正常的调度子句对您不起作用,您可以尝试手动执行循环的并行化,并手动将文件分配给某些线程。因此,您的循环将如下所示:

#pragma omp parallel
{
   id = omp_get_thread_num();
   if(id==0){ //thread 0
       for (i = 0; i < nbre_of_small_files; i++)
           foobar(files[i]); 
    }
    else { //thread 1 and 2 
       for (j = 0; j < nbre_of_big_files; j=j+2)
           if(id==1){//thread 1
               foobar(files[j]);
            } 
            else{ //thread 2
               foobar(files[j+1]); 
            }
    }

}
#pragma omp并行
{
id=omp_get_thread_num();
如果(id==0){//0
对于(i=0;i

这里线程0处理所有小文件。线程2和线程3处理大文件。

是否可以使tr1和tr2同时在foobar[i]上工作?谢谢你的回复看看:我通常避免嵌套平行区域。