在这段最小的可执行代码中:
a = [];
workers = parpool('local',4);
someboolean = false;
parfor i = 1:4
if someboolean % broadcast variable
b = a(i); % ERROR
else
b = 0;
end
end
... someboolean的值为'true'且执行了无效行,导致以下错误:
使用bugscript时出错(第4行)
指数超过矩阵维度。
行号是指最后一条非平行线,如果删除了b = a(i)
分配,则错误消失。
我无法在互联网上找到遭受同样问题的其他人。谁能解释一下发生了什么?我正在使用MATLAB R2015a。
答案 0 :(得分:7)
问题在于,MATLAB执行静态代码分析,以确定每个工作者在循环中每次迭代都需要哪些变量。由于它看到您正在循环内部访问a(i)
,因此它会尝试获取该值并使其可供本地工作者使用,以防需要它。 sliced variables的此行为对于通过仅发送由该迭代访问的数据来减少发送给每个工作程序的数据量是必要的。如果a
有数千个值,并且每次迭代只访问其中一个值,这一点尤为重要。您只想在a
而不是整个数组中发送单个条目。
在您的情况下,它会尝试访问a(i)
以发送给工作人员,而此进程(而不是循环内容本身)会导致您看到的错误。< / p>
毫无疑问,广播变量someboolean
,的价值实际上是 false
正如您所期望的那样,您可以通过以下循环进行确认。
parfor i = 1:4
disp(someboolean)
end
作为一个解决方案,我只需要预先分配a
值,以便a
的切片成功,并且有效数据可以发送给工作者(即使它没有被使用)
a = NaN(1,4);
答案 1 :(得分:0)
我在你的代码中看到了2个问题:
所有工作人员进程都在尝试同时更新b
变量。这不会导致错误,但会有未定义的行为。您不知道哪个进程有最后一次更新。
您的a
数组未初始化为至少有4个值,并且工作程序尝试访问数组边界之外。这会导致错误,您应该从初始化a
开始。