matlabpool open 4;%打開四個線程
B=zeros(1,5);
parfor i=1:5
a=i;
B(1,i)=a;
end
matlabpool close
B
Libing Wang
師弟用過,比如對PCA 20次隨機(jī)分割肯定能這么用,這樣會提高CPU的利用效率,幾個核同時用

一個使用parfor-loop的例子:
%example of parfor-loop %本地worker數(shù)通常等于cpu的核數(shù)
matlabpool
open local 2;
parfor
i=1:1024
A
(i) = sin(i*2*pi/1024);
end
plot(A);
matlabpool
close;

設(shè)機(jī)器的CPU核心數(shù)量是CoreNum雙核機(jī)器的CoreNum2,依次類推。CoreNum以不等于核心數(shù)量,但是如果CoreNum小于核心數(shù)量則核心利用率沒有最大化,如果CoreNum大于核心數(shù)量則效率反而可能下降(如何看計(jì)算機(jī)有幾個核?Weiqiang說任務(wù)管理器->性能,看CPU使用記錄有幾個就是幾個核)。因此單核機(jī)器就不要折騰并行計(jì)算了,否則速度還更慢。下面一段代碼初始化Matlab并行計(jì)算環(huán)境:

%Initialize Matlab Parallel Computing Enviornment by Xaero | Macro2.cn

CoreNum=2; %設(shè)定機(jī)器CPU核心數(shù)量,我的機(jī)器是雙核,所以CoreNum=2

if matlabpool('size')<=0 %判斷并行計(jì)算環(huán)境是否已然啟動

matlabpool('open','local',CoreNum); %若尚未啟動,則啟動并行環(huán)境

else

disp('Already initialized'); %說明并行環(huán)境已經(jīng)啟動。

end

運(yùn)行成功后會出現(xiàn)如下語句:

Starting matlabpool using the 'local' configuration ... connected to 2 labs.

成運(yùn)行計(jì)算后可以將其關(guān)閉。關(guān)閉的命令很簡單:

matlabpool close

另外一個問題就是并行代碼做模擬的次數(shù)問題。我們要達(dá)到用非并行的代碼做N此模擬所能得到結(jié)果的精確程度,在核心為CoreNum并行代碼中,Parfor語句段中只要做N/CoreNum次即可達(dá)到。

read twice http://blog.sciencenet.cn/blog-419879-444784.html, no need to see again


但下面例子是可以的,parfor內(nèi)部可以有for(parfor本身也不支持嵌套,將for j 改為parfor,兩重parfar不行)

matlabpool open local 2;

parfor i=1:1024

A(i) = sin(i*2*pi/1024);

for j=1:10

B(i,j)=A(i)*j;

end

end

matlabpool close;

這段代碼沒有問題,不知我的Test_GLA_DLSR_FS_ServerVersion_outerParFor,沒有r = zeros(length_d,1);就不行,提示rate can not be classified.Weiqiang討論,他也沒遇到這種錯誤,只是想辦法用替代方法解決
解決方案:最內(nèi)層的循環(huán)用parfor(Weiqiang說未必要這樣);幾個內(nèi)層串行for,相互沒有關(guān)聯(lián),可以一起parforparfor內(nèi)部不能有clearsave,因?yàn)?/span>parfor內(nèi)部有了clearsave,對應(yīng)的clearsave會顯示紅色。This is with Dong Cao's help.
解決方案:Weiqiangparfor內(nèi)部是可以有for循環(huán)的,他講是可以有clearload的,封裝成一個函數(shù)my_clear(隨便什么函數(shù)名字都行)調(diào)用clear即可,load類似,但save不行。

錯誤實(shí)現(xiàn)
function my_load1(filename)
load(filename);
end
正確實(shí)現(xiàn)
function S = my_load(filename)
S = load(filename);
end

Weiqiang討論,他也沒說清楚原因。

function my_clear(name1)

clear name1;

    end

clear的用法有很多種,Weiqiang講只能寫死一種。

Test_GLA_DLSR_FS_ServerVersion_outerParFor

The client lost connection to lab 4. This might be due to network problems, or

the interactive matlabpool job might have errored.Weiqiang說這種問題沒法解決,

是通訊問題
在本機(jī)程序沒耗100%CPU和內(nèi)存,到服務(wù)器上跑會不會快點(diǎn),Weiqiang講會快點(diǎn),但快不了多少。他在du公司服務(wù)器速度也和lab服務(wù)器速度速度差不多,關(guān)鍵程序本身很慢,租服務(wù)器還是很慢。