2016-01-21 132 views
0

我想在matlab中建立一個遞歸樹結構。由於它是一個非常大的樹,我正在嘗試構建,所以我想盡可能加快計算速度,這就是爲什麼我想嘗試並行計算。遞歸樹結構的並行計算

的什麼我試圖做可能看起來像這樣的一個例子:

function result = minimalExample(x) 
    n = numel(x); 
    if n == 0 
     result = 0; 
     return; 
    end 
    if n==1 
     result = x; 
     return 
    end 
    average = mean(x); 
    result = minimalExample(x(x<average))+minimalExample(x(x>average)); 
    if any(x==average) 
     result = result*average; 
    end 
end 

我試圖用parfeval做這樣的計算:

function result = minimalExampleParallel(x,pool) 
    n = numel(x); 
    if n == 0 
     result = 0; 
     return; 
    end 
    if n==1 
     result = x; 
     return 
    end 
    average = mean(x); 
    f(1) = parfeval(pool,@minimalExampleParallel,1,x(x<average),pool); 
    f(2) = parfeval(pool,@minimalExampleParallel,1,x(x>average),pool); 
    result = 0; 
    for i = 1:2 
     [~,value] = fetchNext(f); 
     result = result + value; 
    end 
    if any(x==average) 
     result = result*average; 
    end 
end 

但我得到一個Workers cannot execute parfeval or parfevalOnAll. -error 。

我當時希望能有辦法將工作添加到工作人員可能接觸到的全球工作隊列中,但我一直無法做到。

這是以任何方式可能嗎?如果是的話如何?如果不是這樣,爲什麼?

回答

0

我知道你很早以前就問過這個問題,但我有一個答案。我也在尋找這樣的解決方案,但找不到任何東西。雖然沒有真正在網上發佈,所以我希望這是在這裏,以防其他人想知道如何。

您可以執行一種全局作業調度程序。聲明一個parcluster,然後使用createCommunicatingJob在所述集羣上創建單獨的作業。然後,這很重要,請將每個作業的NumWorkersRange屬性設置爲小於工作人員總數,最好將其平均分配,儘管您可以根據需要進行分配。 (例如:如果您有12名工人和4份工作,請將每個工人範圍設置爲[1 3])。如果你不這樣做,那麼它將排隊其他任務,只執行第一個任務,因爲它會將所有工人分配給第一個任務。

這適用於包含parfeval語句的函數,其語法類似於parfeval。我使用MATLAB的paralleldemo_blackjack_parfeval函數進行了驗證。我希望這是你正在尋找的。我知道這就是我正在尋找的!

鏈接:http://www.mathworks.com/help/distcomp/createcommunicatingjob.html