matlab parfor不工作

时间:2014-09-12 19:10:15

标签: matlab parfor

此代码无法使用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

1 个答案:

答案 0 :(得分:4)

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

如果要使用parfor(a.k.a。多个线程),则必须能够以异步方式访问accuracy。我建议你做的是在k循环之外的唯一配对中创建pparfor的值。然后,您可以使用单个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语句删除了条件,因为永远不会有p的值等于0. if语句中的代码将始终运行所以我决定将其删除为更清洁。此代码现在应该运行,并且应该独立于for循环中的任何先前迭代。这也应该异步运行。 final_mat包含我之前谈过的最终矩阵。


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