2014-09-12 114 views
1

此代码工作不PARFOR但与PARFORMATLAB 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 
+3

如果您在使用'parfor'时引用和描述错误将会很有帮助。 – Hoki 2014-09-12 19:13:36

+1

您需要打开游泳池。 – Oleg 2014-09-12 19:22:44

+0

你打开了一堆工人吗?在运行此代码之前,请尝试执行'matlabpool'或'parpool'。 – rayryeng 2014-09-12 19:37:05

回答

2

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

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

[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包含我之前谈到的最终矩阵。


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