Loren在Matlab的艺术上

将想法转化为matlab

准备并行运行代码

在一个 最近贴文 ,我谈了 为了 - 在MATLAB中,如何知道MATLAB如何存储在内存中的数组中,如何优化它们。今天我想谈谈准备并行计算,具体使用并行 为了 -loops,Via 议案
在创建适用于并行运行的代码的路由,有时我们将代码与一个 为了 - 使用并行循环,使用并行循环 议案 。也就是说,如果我们首先无法将代码保持一致。这种转变从 对于 - >律师 有时工作真的很好,但并不总是有效,并且出于非常好的原因。
例如,您不能简单地替换 为了 议案 如果循环迭代不是完全独立的。您可以了解更多条件 这里 。此规则有一个值得注意的例外, 减少变量 , (一种 减少变量 累积取决于所有迭代的值,但与迭代顺序无关)。这个文件是很棒的。这是一个快速的伪代码,即使我们重复使用变量,也可以并行化 S. 在右侧和左侧。只要结果对累积发生的顺序没有数字敏感,您将在此处获取“右”答案是否使用 为了 或者 议案 环形。
s = 0;
议案IND = 1:100
s = s +有趣(数据(ind));
结尾

对并行测试进行测试

我怀疑并行是词,但我想你知道我的意思!
一种简单的方法来看看你的循环是否适合并行化是尝试以另一个顺序运行循环,看看你是否得到相同的结果。如果是这样,这是一个候选人 议案 。最简单的版本可能是向后运行循环。如果您获得标准扫描的结果相同,那么您应该很好。而不是向后,您也可以尝试以随机顺序用计数器替换循环;这可以轻松实现 兰培姆
注意:显然,此计算可以轻松升级。这不是我的焦点。
k = randn(100,1);
卑鄙=平均(k);
tol = sqrt(eps);
qforward = zeros(尺寸(k));
为了IND = 1:100
Qforward(Ind)= K(Ind) - 卑鄙;
结尾
卑鄙=平均(k);
qbackward =零(尺寸(k));
为了IND = 100:-1:1
QBackward(Ind)= K(Ind) - 卑鄙;
结尾
卑鄙=平均(k);
qrandom = zeros(尺寸(k));
为了IND = RANDPERM(100)
qrandom(ind)= k(ind) - 卑鄙;
结尾
Aretheyequal = isequal(Qforward,Qforward,Qrandom)
aretheyequal =逻辑1
如果答案不完全相等,您可以以类似于此类似的方式比较它们。
近乎菲布=常态(Qforward-qbackward)
近乎菲尔特=逻辑1
近乎r = norm(qforward-qrandom)
近乎临时=逻辑1
近乎Br= Norm(Qrackward-qrandom)
近乎所=逻辑1
所以这个计算准备尝试使用 议案
qpar = zeros(大小(k));
为了IND = 1:100
QPAR(IND)= K(IND) - 卑鄙;
结尾
aretheyequal = isequal(qpar,qforward)
aretheyequal =逻辑1

如果我有迭代依赖的表达式怎么办?

您可能并不总是能够并行化代码。但是,有一些条件,您可以通过重构计算来转换您的代码以利用并行化,让我向我展示一个例子。在这种情况下,我将在循环完成后做一些累积。
%%代码分析仪给出了第一个代码两块块两种红色错误消息。
x = [17零(1,99)];
k = [0 randn(1,99)];
议案IND = 2:100
x(ind)= x(ind-1)+ k(ind)^ 2;
结尾
%%来自上面代码的错误消息:
由于使用变量'X'的方式无法运行Par循环。
一个parcom, 多变的“x”以不同的方式索引,潜在的
造成迭代之间的依赖关系。
这是这一点 为了 循环等效,没有警告。
x = [17零(1,99)];
k = [0 randn(1,99)];
为了IND = 2:100
x(ind)= x(ind-1)+ k(ind)^ 2;
结尾
xx = x;
这就是你如何平行化它
x = [17零(1,99)];
TMP =零(1,100);
议案IND = 2:100
TMP(IND)= K(IND)^ 2;
结尾
x = umsum(x + tmp);
aretheyequal = isequal(x,xx)
aretheyequal =逻辑1

想法?

您是否经常使用大型数据集或模拟,其中访问适合于并行运行代码的硬件有助于您的工作规模?您的代码是否属于这篇文章中提到的任何简单类别?我很乐意收到你对你所说的任何问题的消息,以适合并行化的形式。发布你的想法 这里
|
  • 打印
  • 发送电子邮件

注释

要发表评论,请点击这里登录您的MathWorks帐户或创建新的。