【问题标题】:"the variable in a parfor cannot be classified." error in Matlab [duplicate]“parfor 中的变量无法分类。” Matlab中的错误[重复]
【发布时间】:2016-05-19 23:24:33
【问题描述】:

我正在尝试使用 parfor 实现一个非常简单的程序,但我遇到了一些错误。我看到了几乎所有可能重复的 SO 问题,但没有一个与我的问题情况相似。我得到的错误是:

错误:变量 log_likelihood_II_with_entropy 在一个parfor不能 分类。

我的代码写在下面:

em_iterations=10;

users=5;
log_likelihood_II_with_entropy=zeros(users,em_iterations);

parfor u = 1:1:users
      for current_iter=1:1:em_iterations
           log_likelihood_II_with_entropy(u,current_iter)=rand();               
      end
end

【问题讨论】:

    标签: matlab parallel-processing parfor matlabpool


    【解决方案1】:

    由于 log_likelihood_II_with_entropy 依赖于 parfor 索引 (u) 和“内部索引” (current_iter),因此无法对其进行分类。每个parfor 迭代都独立于其他迭代,并且它们不是按顺序执行的(也就是说,u 不一定会按照 1、2、3、4、...、@987654330 的顺序从 1 变为 users @)。

    我的建议是让单个parfor 迭代(worker)构建一整行log_likelihood_II_with_entropy

    parfor u=1:users
        single_row=zeros(1,em_iterations);
        for current_iter=1:1:em_iterations
            single_row(current_iter)=rand();
        end
        log_likelihood_II_with_entropy(u,:)=single_row;
    end
    

    以这种方式,每个parfor 任务(parfor 主体本身)将预分配和评估单行,无论u 值是什么。然后它将替换/连接log_likelihood_II_with_entropy 矩阵中的此类值。

    【讨论】:

    • 甚至rand(1,em_iterations) :)
    • @AndrasDeak 哦不 :) rand 只是一个例子 :D
    • @CoderInNetwork 我强烈建议您将 C 保留在 MCVE (minimal reproducible example) 中,这将使回答者和您的生活更轻松。
    • @AndrasDeak 是的,当然,谢谢
    • @CoderInNetwork 当然。 Mathworks 在parforit.mathworks.com/help/distcomp/…中有一个关于变量分类的完整文档页面
    【解决方案2】:

    当您有 2 个变量时,Parfor 循环不喜欢它,因为它可能会混淆。要么使用元胞数组来存储,要么切换 for 和 parfor 循环的顺序,如下所示。

    em_iterations=10;
    
    users=5;
    log_likelihood_II_with_entropy=zeros(users,em_iterations);
    
    for u = 1:1:users
          parfor current_iter=1:1:em_iterations
               log_likelihood_II_with_entropy(u,current_iter)=rand();               
          end
    end
    

    【讨论】:

    • 但是,arr(parindex,:,:) 形式的完整数组切片是允许的。请参阅 Alessiox 的答案。如果适用,那(几乎?)总是最快的解决方案。
    • 我不喜欢这个解决方案,因为它增加了通信开销。你现在得到了users*em_iterations 很多工作,而不是users 很多工作,这增加了通信开销。
    猜你喜欢
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多