歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Matlab並行編程方法

本文講一下matlab中的並行方法與技巧,這裡我們不涉及GPU加速,主要考慮for循環並行和數據並行。分為以下幾個板塊:

1. 怎麼並行?

2. parfor vs. SPMD

3. 注意事項及經驗總結

-----------------------------------------------------------

1. 如何並行?

1. Request a number of workers;
2. Issue the normal command to run the program. The client program will call on the workers as needed;
3. Release the workers;

具體到代碼:

matlabpool local 2;
    %parallel program
matlabpool close
其中2是core數目,注意2是core數。你的電腦如果是雙核四線程的,那麼只能申兩個(而非4個)matlab local pool。
具體實現parallel program呢,主要是通過parfor(parallel for)和SPMD(single program, multiple data)完成的。

-----------------------------------------------------------

2. parfor vs. SPMD

2.1 什麼時候用parfor

parfor只用於matlab並行循環。當你需要簡單計算的多次循環迭代時,例如蒙特卡洛(Monte Carlo)模擬,parfor循環就很有用。parfor將循環迭代分組,那麼每個worker執行迭代的一部分。當迭代耗時很長的時候parfor循環也是有用的,因為workers可以同時執行迭代。

注意當循環中有迭代依賴其他迭代的結果時不應該使用parfor循環。每個迭代都必須不依賴其他迭代。由於parfor循環內有通信消耗,當只有小數量的簡單計算時使用parfor可能得不到什麼好處。

c = 1:10;
a = ones(10,1);
tic
parfor i = 1:length(c)
    a(i)= a(i)+ c(i);
end
toc
fprintf('%d\n',a);

2.2 什麼時候用SPMD(Single Program/Multiple Data)單程序多任務進行任務並行

Spmd中的“Single program”方面指的是同一段代碼運行在不同的多個lab上。你在一個Matlab客戶端上運行一個程序,被標志為spmd模塊的其他部分運行在其他lab上。當這些塊運行完畢後,你的程序繼續在客戶端運行。 “Multiple data”方面指的是雖然spmd語句在所有的lab上運行相同的代碼,但每一個lab可以有不同的,獨有的數據。所以多數據集可以在多個lab上同時被容納。一下是我總結的SPMD使用的兩個場景:

The "single program" aspect of spmd means that the identical code runs on multiple labs. 就是說同一段程序應用於不同的樣本(數據),所以一般針對隨機抽樣的並行,如

%% SPMD
%example 1
spmd
A = rand(3,2); %generate a matrix A for each lab(worker)
end
for i = 1:length(A)
    figure; imagesc(A{i});
end

%example 2
a = 3;
b = 4;
spmd
    c = labindex();
    d = c+a;
end
c{2} = 5;
spmd
    f = c*b;
end
for i = 1:length(f)
    fprintf('%d\t',f{i});%access the value of each lab
end

另外,SPMD也可以用於可替代parfor的塊並行,在不同lab(worker)上對相同或不同的數據執行不同的並行操作,說起來有些拗口,具體看一下例子就明白了,下面我寫的example3,4分別針對在不同lab上對相同數據和不同數據執行不同操作。它們都可以用parfor代替,對吧,這裡我就不寫了,相信大家的能力。。

%example3 - deal with same Data by different parameters
%add different values to same array Data
Data = 1:100;
spmd
    switch labindex
        case 1
            Data = Data+1;
        case 2
            Data = Data+2;
    end
end
% print Data{1} & Data{2} for checking
           
%example4
%add different values for different parts of array Data
% [1:50]+1
% [51:100]+2
spmd
    if labindex == 1
        Data(1:50) = Data(1:50)+1;
    else
        Data(51:100) = Data(51:100)+2;
    end
end
以上是我對spmd和parfor的理解,歡迎補充指正,其他關於spmd vs. parfor的可以參考這個帖子。

2.3 Composite類型

spmd中每個lab返回值以composite存儲,如上面[code]example 1中的f就是以composite的形式展現。f{i}為第i個lab的返回值。最開始我們也可以創建Composite對象並進行初始化賦值。

>>  f = Composite(2);

-----------------------------------------------------------

4. 注意事項及經驗總結

注意事項:

1. parfor中慎用(最好勿用)eval幅值。

一個程序並行時要共享內存,而eval語句可能使程序進入錯誤的workspace,因此不要用eval,改用不同index賦值。

matlabpool local 2;
c = 1:5;
parfor i = 1:length(c)
    a(i) = c(i);
end

2. parfor循環不能很好利用所有處理器怎麼辦?

是這樣,

parfor i = 1:4
........
end
就只能用4個處理器,而如果不加這個parfor可能matlab自身的負載均衡能夠更好地利用CPU。這裡我是開起來3個matlab,比如服務器上有12個核。我就給每個matlab分配4個core(>>matlabpool local 4),每個程序裡有一個parfor i = 1:4. 這樣就可以用起來12個核。我知道這樣好暴力……囧,有人知道正解的話指條明路吧。。

3. parfor,spmd不可以相互或者自身嵌套。

4. parfor使用有很多約束,比如for循環內的表達式需要顯式表達(透明性),不依賴前項。如

parfor i = 3:10

      f(i) = f(i-1)+f(i-2);

end

是不行滴。。

歡迎留言其他並行技巧和方法,謝謝!

Ubuntu Server上安裝Matlab http://www.linuxidc.com/Linux/2014-09/106242.htm

Matlab與C/C++聯合編程之從Matlab調用C/C++代碼 http://www.linuxidc.com/Linux/2012-08/68148.htm

二分類SVM方法Matlab實現 http://www.linuxidc.com/Linux/2013-05/84050.htm

Matlab中的取整函數fix, floor, ceil與round http://www.linuxidc.com/Linux/2013-10/91161.htm

Matlab編譯cuda的.cu文件 http://www.linuxidc.com/Linux/2014-04/100675.htm

Linux Matlab服務器進一步改造成Application Server(應用程序服務器) http://www.linuxidc.com/Linux/2014-09/106340.htm

Matlab 坐標圖動畫,動態顯示數據 http://www.linuxidc.com/Linux/2016-03/129056.htm

Ubuntu 14.04安裝Matlab2012a過程 http://www.linuxidc.com/Linux/2015-12/126297.htm

Copyright © Linux教程網 All Rights Reserved