我需要一些关于调度并行区域的帮助。我的设置如下,我有几个(少于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秒。我知道在第一次迭代中除了第二次迭代之外没有太多工作要做,我希望在调度时考虑最后一次迭代。
我希望我事先明确表示感谢!