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),可以一起parfor。parfor內(nèi)部不能有clear和save,因?yàn)?/span>parfor內(nèi)部有了clear和save,對應(yīng)的clear和save會顯示紅色。This is with Dong Cao's help.
解決方案:Weiqiang說parfor內(nèi)部是可以有for循環(huán)的,他講是可以有clear和load的,封裝成一個函數(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ù)器還是很慢。