相关疑难解决方法(0)

如何嵌套多个parfor循环

parfor是在几个"工人"之间分配密集计算的独立迭代的便捷方式.一个有意义的限制是parfor-loops不能嵌套,并且总是,这就是那里那里类似问题的答案.

为什么跨越循环边界的并行化是如此理想

考虑以下代码,其中迭代在允许4个工作者的机器上占用大量可变时间.两个循环迭代超过6个值,显然难以在4个中共享.

for row = 1:6
    parfor col = 1:6
        somefun(row, col);
    end
end
Run Code Online (Sandbox Code Playgroud)

选择内部循环似乎是一个好主意,parfor因为单个调用somefun比外部循环的迭代更可变.但是如果每个调用的运行时间somefun非常相似怎么办?如果运行时有趋势并且我们有三个嵌套循环怎么办?这些问题经常出现,人们走向极端.

组合循环所需的模式

理想情况下,somefun运行所有对rowcol,并且工人应该忙,不管哪个迭代正在变化.解决方案应该是这样的

parfor p = allpairs(1:6, 1:6)
    somefun(p(1), p(2));
end
Run Code Online (Sandbox Code Playgroud)

不幸的是,即使我知道它的内置函数创建一个矩阵的所有组合rowcol,MATLAB将与错误抱怨一个PARFOR语句的范围必须是行向量.然而,for不会抱怨和很好地迭代列.一个简单的解决方法是创建该矩阵,然后使用parfor以下内容对其进行索引:

p = allpairs(1:6, 1:6);
parfor k = 1:size(pairs, 2)
    row = p(k, 1);
    col = p(k, 2);
    somefun(row, col);
end
Run Code Online (Sandbox Code Playgroud)

什么是内置函数代替allpairs …

matlab nested-loops parfor

7
推荐指数
2
解决办法
5677
查看次数

Matlab并行计算工具箱,在parfor循环中动态分配工作

我在matlab中使用长时间运行的parfor循环.

parfor iter=1:1000
   chunk_of_work(iter);
end
Run Code Online (Sandbox Code Playgroud)

每次运行通常有大约2-3个定时异常值.也就是说,每执行1000次大量的工作,其中2-3次比其余工作长约100倍.随着循环接近完成,评估异常值的工人继续运行,而其余工人没有计算负荷.

这与静态分配工作的parfor循环一致.这与此处的并行计算工具箱的文档形成对比:

"工作分配是动态的,而不是被分配一个固定的迭代范围内,工人被分配一个新的迭代后,才处理完自己的当前迭代,这导致即使工作负荷分配."

关于发生了什么的任何想法?

parallel-processing matlab load-balancing

5
推荐指数
1
解决办法
1806
查看次数