【问题标题】:Getting error in parfor but not in for-loop in matlab在 parfor 中出现错误,但在 matlab 中的 for 循环中没有
【发布时间】:2014-09-02 06:27:46
【问题描述】:

我正在尝试 matlab 并行处理,在此期间我尝试将这个东西应用到我的代码中。下面是代码。

matlabpool open 2
pop = create_population(match_matrix,PopSize);
ftns = zeros(PopSize,1);
parfor i=1:PopSize
    ftns(i) = get_fitness(pop{i});
end
matlabpool close

我得到的错误如下

Error using parallel_function (line 589)

In an assignment  A(I) = B, the number of elements in B and I must be the same.

Error stack:
SWIFTga>(parfor body) at 127

Error in SWIFTga (line 126)
    parfor i=1:PopSize

如果我将 parfor 替换为 for,我不会出错。请提出可能出了什么问题....

【问题讨论】:

  • 该错误表明 get_fitness 的输出不是标量值。如果不查看 get_fitness 和 create_population 中的代码,很难判断问题所在。
  • get_fitness 给出了标量值,我在 parfor 之前检查了手动设置断点。当我在 for 循环中实现它时,即使它没有给出任何错误。在 for 循环之后,所有元素也都填充了标量值。
  • 在 parfor 中尝试做:test = get_fitness(pop{i});显示(测试);证明你得到了你所期望的。
  • 我打印了输入参数,然后打印了输出测试。输入正常,但输出为空 []。这就是为什么它显示错误。但是当我使用相同的输入参数调用函数 get_fitness(arg) 时,它不会显示任何错误并返回我期望的值。并行处理是否受函数调用影响?

标签: matlab parallel-processing parfor


【解决方案1】:

我尝试了这么多,终于找到了问题所在。实际上,我正在访问 parfor 主体内部调用的函数中的全局变量。从 matlab 文档中发现我们无法访问 parfor 中的全局变量,因为存在同步问题。我必须将代码从全局变量更改为参数传递。感谢所有花时间回答我的问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多