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次隨機分割肯定能這么用,這樣會提高CPU的利用效率,幾個核同時用
一個使用parfor-loop的例子:
%example of parfor-loop %本地worker數通常等于cpu的核數
matlabpool open local 2;
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end
plot(A);
matlabpool close;
設機器的CPU核心數量是CoreNum雙核機器的CoreNum2,依次類推。CoreNum以不等于核心數量,但是如果CoreNum小于核心數量則核心利用率沒有最大化,如果CoreNum大于核心數量則效率反而可能下降(如何看計算機有幾個核?Weiqiang說任務管理器->性能,看CPU使用記錄有幾個就是幾個核)。因此單核機器就不要折騰并行計算了,否則速度還更慢。下面一段代碼初始化Matlab并行計算環境:
%Initialize Matlab Parallel Computing Enviornment by Xaero | Macro2.cn
CoreNum=2; %設定機器CPU核心數量,我的機器是雙核,所以CoreNum=2
if matlabpool('size')<=0 %判斷并行計算環境是否已然啟動
matlabpool('open','local',CoreNum); %若尚未啟動,則啟動并行環境
else
disp('Already initialized'); %說明并行環境已經啟動。
end
運行成功后會出現如下語句:
Starting matlabpool using the 'local' configuration ... connected to 2 labs.
成運行計算后可以將其關閉。關閉的命令很簡單:
matlabpool close
另外一個問題就是并行代碼做模擬的次數問題。我們要達到用非并行的代碼做N此模擬所能得到結果的精確程度,在核心為CoreNum并行代碼中,Parfor語句段中只要做N/CoreNum次即可達到。
read twice http://blog.sciencenet.cn/blog-419879-444784.html, no need to see again
但下面例子是可以的,parfor內部可以有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討論,他也沒遇到這種錯誤,只是想辦法用替代方法解決
解決方案:最內層的循環用parfor(Weiqiang說未必要這樣);幾個內層串行for,相互沒有關聯,可以一起parfor。parfor內部不能有clear和save,因為parfor內部有了clear和save,對應的clear和save會顯示紅色。This is with Dong Cao's help.
解決方案:Weiqiang說parfor內部是可以有for循環的,他講是可以有clear和load的,封裝成一個函數my_clear(隨便什么函數名字都行)調用clear即可,load類似,但save不行。
錯誤實現:
function my_load1(filename)
load(filename);
end
正確實現
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說這種問題沒法解決,
是通訊問題
在本機程序沒耗100%CPU和內存,到服務器上跑會不會快點,Weiqiang講會快點,但快不了多少。他在du公司服務器速度也和lab服務器速度速度差不多,關鍵程序本身很慢,租服務器還是很慢。