【问题标题】:matlab parfor not workingmatlab parfor 不工作
【发布时间】:2014-09-12 19:10:14
【问题描述】:

此代码在没有 parfor 的情况下可以工作,但不能在 parfor 下工作

load ('../segment.mat');
accuracy = zeros(30,1);
l=1;
parfor k = 1 : 2 : 9
    for p = 0.5 : 0.5 : 3
         if p ~= 0
            pred = run_1_KNN(k , p , X);
            accuracy(l,1)  = mean(strcmp(pred', y.train));
            l= l + 1;           
         end
    end
end

【问题讨论】:

  • 如果您能在使用parfor 时引用并描述错误,将会很有帮助。
  • 您需要打开池。
  • 你开辟工人池了吗?在运行此代码之前尝试执行matlabpoolparpool
  • @rayryeng 是的,我使用了命令 matlabpool
  • @OlegKomarov 我确实打开了 matlabpool

标签: matlab parfor


【解决方案1】:

parfor 不起作用的原因是accuracy 变量正在以同步方式访问。假设您将使用单个线程遍历 run_1_KNN 的调用,此行为将起作用,这就是为什么只使用 for 而不是 parfor 的原因。由于您在parfor 中有一个嵌套 for 循环调用,这依赖于之前迭代中完成的工作。 parfor 不能有这种行为,它以异步方式工作。每个线程执行应该独立于其他线程的工作。

如果您想使用parfor(也称为多线程),您必须能够以异步方式访问accuracy。我建议你做的是在 parfor 循环之外的唯一配对中创建 kp 的值。然后,您将使用单个 parfor 访问每对唯一的 kp,然后访问您的 accuracy 数组。我将为您做的是创建一个最终矩阵,其第一列为k,第二列为p,第三列为准确度值。因此,对于该矩阵的每一行,它会为您提供 kp 以及该特定三元组的准确度。因此:

[karray, parray] = meshgrid(1 : 2 : 9, 0.5 : 0.5 : 3);
karray = karray(:);
parray = parray(:);
accuracy = zeros(numel(karray), 1);
parfor idx = 1 : numel(karray)
    k = karray(idx);
    p = parray(idx);
    pred = run_1_KNN(k , p , X);
    accuracy(idx)  = mean(strcmp(pred', y.train));        
end

final_mat = [karray parray accuracy];

请注意,我使用 if 语句删除了条件,因为永远不会有等于 0 的 p 值。if 语句中的代码将始终运行,所以我决定删除更清洁。此代码现在应该运行,并且应该独立于 for 循环中的任何先前迭代。这也应该异步运行。 final_mat 包含我之前谈到的最终矩阵。


希望这会有所帮助。祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2011-10-29
    • 2020-05-22
    相关资源
    最近更新 更多