由于上次执行并行区域

时间:2016-02-09 20:15:29

标签: multithreading parallel-processing openmp

我需要一些关于调度并行区域的帮助。我的设置如下,我有几个(少于10个说)昂贵的独立功能的并行区域:

    for (j=0; j < 1000; j++) {
        //Parallel region
        #pragma parallel for
        for (i=0; i < number_of_functions; i++) {
            fcn(j,i) //Expensive
        }
        //Serial region (must be so)
        ...
    }

评估fcn所花费的时间高度依赖于i,而不是j。

考虑具有三个昂贵函数和两个线程的示例,其中函数大概采用:

j:

的第一次迭代
fcn(j=0, i=1) ~ 10s
fcn(j=0, i=2) ~ 10s
fcn(j=0, i=3) ~ 100s

j上的第二次迭代:

fcn(j=1, i=1) ~ 10s
fcn(j=1, i=2) ~ 10s
fcn(j=1, i=3) ~ 100s

所以在这里,我想首先安排i = 3,然后安排其余的。所以我喜欢的是调度是由于在最后一次第j次迭代中花费时间最长的迭代而完成的。

我知道for循环的调度选项(静态,动态),并且最适合的最接近的是一个动态的chunksize。虽然在我的例子中它不会有帮助,因为i = 3总是最后被评估(如果我们有两个线程)。所以我的问题是,由于上次执行并行区域,是否存在自动调度方式?或者我是否必须手动计算不同的评估时间并自行安排?

考虑第二个例子

j:

的第一次迭代
fcn(j=0, i=1) ~ 10s
fcn(j=0, i=2) ~ 10s
fcn(j=0, i=3) ~ 100s
fcn(j=0, i=4) ~ 10s
fcn(j=0, i=5) ~ 50s

j上的第二次迭代:

fcn(j=1, i=1) ~ 10s
fcn(j=1, i=2) ~ 10s
fcn(j=1, i=3) ~ 100s
fcn(j=1, i=4) ~ 10s
fcn(j=1, i=5) ~ 50s

我希望先安排i = 3,然后安排i = 5秒。我知道在第一次迭代中除了第二次迭代之外没有太多工作要做,我希望在调度时考虑最后一次迭代。

我希望我事先明确表示感谢!

0 个答案:

没有答案