MATLAB parfor 广播变量值错误
MATLAB parfor broadcast variable has wrong value
在这段最小的可执行代码中:
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' 并且执行无效行导致以下错误:
Error using bugscript (line 4)
Index exceeds matrix dimensions.
行号指的是最后一条非平行线,如果删除 b = a(i)
赋值,错误就会消失。
我无法在互联网上找到其他遇到同样问题的人。谁能解释这是怎么回事?我正在使用 MATLAB R2015a。
问题是因为 MATLAB 执行静态代码分析以确定每个工作人员通过循环的每次迭代需要哪些变量。由于它发现您正在循环内部访问 a(i)
,因此它会尝试获取该值并使其可供本地工作人员使用 以防 它需要它。 sliced variables 的这种行为对于通过仅发送该迭代访问的数据来减少发送给每个工作人员的数据量是必要的。如果 a
有数千个值,而您每次迭代只访问其中一个,这一点尤其重要。您只想发送 a
中的单个条目,而不是整个数组。
在您的情况下,它尝试访问 a(i)
以发送给工作人员,并且是 this 进程(而不是循环内容本身)导致错误你看到了。
不用担心,广播变量的值,someboolean
,实际上是 false
正如你所期望的,你可以确认使用以下循环。
parfor i = 1:4
disp(someboolean)
end
作为解决方案,我会简单地为 a
预分配值,以便 a
的切片成功并且能够将有效数据发送给工作人员(即使它不是使用过)。
a = NaN(1,4);
我发现你的代码有 2 个问题:
所有工作人员 进程 正在尝试同时更新 b
变量。这不会导致错误,但会产生未定义的行为。您不会知道哪个进程必须进行最后更新。
您的 a
数组未初始化为至少有 4 个值,工作人员尝试访问数组边界之外的内容。这会导致错误,您应该从初始化 a
.
开始
在这段最小的可执行代码中:
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' 并且执行无效行导致以下错误:
Error using bugscript (line 4)
Index exceeds matrix dimensions.
行号指的是最后一条非平行线,如果删除 b = a(i)
赋值,错误就会消失。
我无法在互联网上找到其他遇到同样问题的人。谁能解释这是怎么回事?我正在使用 MATLAB R2015a。
问题是因为 MATLAB 执行静态代码分析以确定每个工作人员通过循环的每次迭代需要哪些变量。由于它发现您正在循环内部访问 a(i)
,因此它会尝试获取该值并使其可供本地工作人员使用 以防 它需要它。 sliced variables 的这种行为对于通过仅发送该迭代访问的数据来减少发送给每个工作人员的数据量是必要的。如果 a
有数千个值,而您每次迭代只访问其中一个,这一点尤其重要。您只想发送 a
中的单个条目,而不是整个数组。
在您的情况下,它尝试访问 a(i)
以发送给工作人员,并且是 this 进程(而不是循环内容本身)导致错误你看到了。
不用担心,广播变量的值,someboolean
,实际上是 false
正如你所期望的,你可以确认使用以下循环。
parfor i = 1:4
disp(someboolean)
end
作为解决方案,我会简单地为 a
预分配值,以便 a
的切片成功并且能够将有效数据发送给工作人员(即使它不是使用过)。
a = NaN(1,4);
我发现你的代码有 2 个问题:
所有工作人员 进程 正在尝试同时更新
b
变量。这不会导致错误,但会产生未定义的行为。您不会知道哪个进程必须进行最后更新。您的
a
数组未初始化为至少有 4 个值,工作人员尝试访问数组边界之外的内容。这会导致错误,您应该从初始化a
. 开始