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

时间:2011-10-29 23:53:42

标签: parallel-processing scheduling openmp

我正在开发一个程序,它必须对许多文件进行计算foobarfoobar可以在一个文件上并行或顺序完成,程序将接收许多文件( ,可以是不同大小的!)并将计算foobar并行或顺序应用于每个具有指定线程数的计算中。{/ p>

以下是程序如何在具有三个线程的8个文件上启动。

./program 3 file1 file2 file3 file4 file5 file6 file7 file8

我实现的默认调度是并行地影响每个文件上的一个线程来进行计算(这就是我的程序现在的工作方式!)。

版本:这是我正在使用的默认计划

#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)

见下图

Default scheduling

在上图中,最后一次是在最大文件 file8 上依次解决foobar的时间。

我认为更有效地处理工作平衡的更好的计划可能是并行地在大文件上应用计算foobar。如下图所示 tr i 代表一个主题。

enter image description here

这样一种方式,最终时间将花费在并行({em>上图中我们使用两个线程!)的最大文件上解决foobar file8

我的问题是:

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

感谢您的回复!

1 个答案:

答案 0 :(得分:1)

您是否尝试过dynamic日程安排而不是导游?

如果正常的调度子句对您不起作用,您可以尝试手动并行化循环并手动将文件分配给某些线程。所以你的循环看起来像这样:

#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]); 
            }
    }

}

这里线程0执行所有小文件。线程二和三做大文件。