2014-09-12 108 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包含我之前談到的最終矩陣。


希望這會有所幫助。祝你好運!