• 沒有找到結果。

MATLAB 软件中 parfor 循环(parfor-loop)的基本概念和标准 MATLAB for 循环(for-loop) 是一样的: MATLAB 在一些值的范围内执行一系列语句(循环)。parfor 循环体一部分运行在 MATLAB client(parfor 分发的地方),部分并行地运行在 MATLAB workers——大部分的计算 工作在这里完成,得到的结果被发回 client,然后整合(发回的计算结果是零散的,在 client 整合为最终的结果)。

由于若干 MATLAB workers 可以在同一循环上同时计算,parfor 循环能够提供比与其类 似的 for 循环好得多的性能。

parfor 循环体的每次执行都是一次迭代。MATLAB workers 以非特定顺序并相互独立地 计算(evaluate)迭代。因为每次迭代都是独立的,无论如何也不能保证这些迭代的同步,也没 有必要。如果 workers 的数量与迭代次数相等,那么每个 worker 执行一次迭代。如果迭代 次数多于 workers 数量,那有些 workers 执行多次迭代;在这种情况下,为减少通信时间,

一个 workers 可能一次接到多次迭代。

2.1.1 parfor 的使用场景

当你需要简单计算的多次循环迭代时,例如蒙特卡洛(Monte Carlo)模拟,parfor 循环就 很有用。parfor 将循环迭代分组,那么每个 worker 执行迭代的一部分。当迭代耗时很长的时 候 parfor 循环也是有用的,因为 workers 可以同时执行迭代。

当循环中有迭代依赖其他迭代的结果时不应该使用 parfor 循环。每个迭代都必须不依赖 其他迭代。由于 parfor 循环内有通信消耗,当只有小数量的简单计算时使用 parfor 可能得不 到什么好处。这部分的例子只是用来说明 parfor 循环的表现(行为),不一定证明这些应用最 适合它们(parfor 循环)。

2.1.2 使用 matlabpool 设置 MATLAB 资源

为执行随后的 parfor 循环,使用 matlabpool 函数预设 MATLAB workers 的数量。Workers 可 以远程运行于集群上,或者就运行在本地 MATLAB client,这取决于你的安排。You identify a scheduler and cluster by selecting a parallel configuration.关于怎样管理和使用配置,参见 Programming with User Configurations.

开始这部分的例子,为评估循环迭代分配本地 MATLAB workers:

matlabpool

这个命令启动了由默认并行配置定义数量的 MATLAB workers。如果默认的本地配置,并且

没有指定 workers 的数量,则每个核心启动一个 worker。

NOTE 如果 matlabpool 没有运行,parfor 循环在 client 上串行运行,不考虑迭代顺序。

2.1.3 创建 parfor-Loop

关于 parfor 循环,最安全的假设就是循环的每次迭代都由不同的 MATLAB worker 计算。

如果你有一个所有迭代都完全独立于其他迭代的 for 循环,那它很适合改为 parfor。基本上,

注:此处所获得结果运行环境:intel 单核处理器,matlab r2009b

尽管两个例子中 A 的元素最后都是一样的,d 的值却不一定。在左边的 for 循环里,迭 代时顺序执行,因此后面 d 保持着最后一次迭代后自己的值。在右边的 parfor 循环里,迭代 时并行执行,不是顺序执行,因此不可能在循环结束时给 d 一个确定的值。这对循环变量 i 也适用。所以,parfor 循环的行为被定义为它不在循环外影响 d 和 i 的值,它们的值在循环 之前和循环结束以后是一样的。因此,parfor 循环要求每次迭代都独立于其他迭代,而且 parfor 循环之后的代码不依赖迭代顺序。

2.1.5 规约赋值

下面的两个例子展示了 parfor 循环使用归约赋值(reduction assignments)。归约(reduction) 就是跨过了循环迭代的累积过程。左边的例子用 x 通过循环的 10 次迭代积累一个和。右边 的例子产生了一个连接数组,1:10。在两个例子中,迭代执行的顺序并不重要:当 workers 计 算单独的结果时,client 适当地组合了最终的循环结果。

x = 0;

parfor i = 1:10 x = x + i;

end x 55

x2 = [];

n = 10;

parfor i = 1:n x2 = [x2, i];

end x2

[1,2,3,4,5,6,7,8,9,10]

如果循环迭代以随机顺序操作,你可能觉得右边例子的连接顺序会是不连续的。但是,

MATLAB 识别了连接操作并产生了确定的结果。

下面的例子试图计算 Fibonacci 数,它不是有效的 parfor 循环,因为 f 的迭代中一个元 素的值依赖于 f 在其他迭代中计算的元素的值。

f = zeros(1,50);

f(1) = 1;

f(2) = 2;

parfor n = 3:50

f(n) = f(n-1) + f(n-2);

end

当你结束了你的循环例子,清空你的工作区并关闭或者释放你的 pool of workers:

Clear

matlabpool close

接下来的部分提供更多的有关程序设计考量和 parfor 循环的局限的信息。

相關文件