Matlab中的並行運算經常使用的有 parfor-loop代替for-loop加速計算,這裏parfor就是parallel的意思。
client把任務分配給多個workers,在一個循環中同時運行,等全部workers運行完返回結果,而後對結果進行整合。
一個迭代就是指執行一次循環體。每個worker獨立地按照必定的次序迭代。html
官方原圖:
canvas
每個迭代是獨立的,就是說上一個循環的結果對下一個循環的結果沒有影響。下面給出的例子就不行,在計算 時要用到上一次迭代的結果 .函數
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
這裏介紹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
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
查看給每個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
參考:
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