Matlab parfor-loop並行運算

Matlab中的並行運算經常使用的有 parfor-loop代替for-loop加速計算,這裏parfor就是parallel的意思。
client把任務分配給多個workers,在一個循環中同時運行,等全部workers運行完返回結果,而後對結果進行整合。
一個迭代就是指執行一次循環體。每個worker獨立地按照必定的次序迭代。html

官方原圖:
canvas


官方原圖

parfor 把for循環中的迭代分紅多個部分同時運行。這裏有兩個問題:
(1)什麼樣的任務可以拆分並行運行?
(2)怎麼拆分?
(3)怎麼把for-loop改寫成parfor-loop

關於第一個問題:什麼樣的任務可以拆分並行運行?

每個迭代是獨立的,就是說上一個循環的結果對下一個循環的結果沒有影響。下面給出的例子就不行,在計算 b ( i 1 ) 時要用到上一次迭代的結果 a ( i 1 ) .函數

tic
ntasks = 200;
A = 500;
a = zeros(ntasks);
for i = 1:ntasks 
    a(m) = max(abs(eig(rand(A))));
    if i > 2
    b(i) = a(i)+a(i-1);
    end
end
toc

改爲parfor時出錯oop

tic
ntasks = 200;
A = 500;
a = zeros(ntasks);
for i = 1:ntasks 
    a(i) = max(abs(eig(rand(A))));
    if i > 2
    b(i) = a(i)+a(i-1);
    end
end
toc


error

關於第二個問題:怎麼拆分?

這裏介紹parfor這個函數的參數ui

parfor loopVar = initVal:endVal; statements; end
parfor (loopVar = initVal:endVal,M); statements; end

這裏M指定多少個worker,通常系統默認把能夠使用的都用上。spa

loopVar,initVal,endVal與for循環同樣的。
endVal 能夠理解爲把整個任務分爲幾個部分去運行,endVal 能夠大於電腦的核數或者說worker。
因此這個函數並無說明是怎麼拆分數據的。
官方的說法:Loop iterations are executed in parallel in a nondeterministic order.
能夠理解爲隨機拆分執行嗎?code

關於第三個問題:怎麼把for-loop改寫成parfor-loop

tic
n = 200;
A = 500;
a = zeros(n);
for i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc
tic
n = 200;
A = 500;
a = zeros(n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
toc

time

查看給每個worker分配的數據:server

tic
ticBytes(gcp);
n = 200;
A = 500;
a = zeros(n);
parfor i = 1:n
    a(i) = max(abs(eig(rand(A))));
end
tocBytes(gcp)
toc

massages


參考:
https://ww2.mathworks.cn/help/distcomp/interactively-run-a-loop-in-parallel.html#responsive_offcanvas
https://ww2.mathworks.cn/help/distcomp/parfor.html
https://ww2.mathworks.cn/help/distcomp/interactively-run-a-loop-in-parallel.html#responsive_offcanvasxml

相關文章
相關標籤/搜索