1. 程式人生 > >matlab平行計算之parfor

matlab平行計算之parfor

原文:http://blog.sina.com.cn/s/blog_866e7fa70101cv08.html

提高matlab程式碼的執行效率,是很多碼農們的迫切願望和需求。最重要的當然是好的程式碼結構,向量化的語言的高效性是for迴圈拍馬也趕不上的。但是,現實中很多時候我們是需要使用到for迴圈的,為此可以使用matlab的平行計算來提高程式碼執行效率。
平行計算的原理就是將程式碼分配到多個處理器中進行運算。例如8核的機器,就可以同時調動8個處理器來運算。不過為了在運算時你不至於太無聊,還是留下一個給自己做其他事情用吧。
1、啟動和關閉平行計算功能 啟動: CoreNum=7; %呼叫的處理器個數 if matlabpool('size')<=0   %之前沒有開啟     matlabpool('open','local',CoreNum); else   %之前已經開啟     disp('matlab pool already started'); end 關閉: matlabpool close 如果程式碼還在除錯階段,可以暫時不關閉matlabpool,反覆開關浪費時間得很。另外,matlab關閉後,matlabpool也會自動關閉,所以如果不是海量程式碼,可以不用關閉的(個人意見,沒有實測影響)。
2、parfor的使用 將傳統的for迴圈改為parfor迴圈,就會將迴圈體作為整體分到到一個個處理器中,從而一次性進行多組運算。在使用parfor時,程式碼的編寫有一些注意事項,最主要的是其中變數的處理。matlab的幫助文件中有詳細的描述。
matlab平行計算之parfor


在此,我將摘取一部分重要的加以說明並舉例。 在parfor中,變數不再是隨心所欲的使用,有著其自己的分類。在parfor執行時,我們經常會遇到這樣的錯誤“  Error: The variable xxx in a parfor cannot be classified.”說的就是變數xxx不能被正常劃分到正確的類別中。 matlab平行計算之parfor
parfor變數一共分為5類,每一類的定義和用途就不說了,看一眼就明白。需要注意的是以下幾點 (1)迴圈變數 迴圈變數在迴圈體中的使用一定要具有獨立性,迴圈體之間不相關。例 a(i)=a(i-1)*temp;是不行的。 (2)sliced 變數(一般是陣列,被各個處理器分割成一個個slice) slice變數在一個迴圈體內只能出現一個slice,簡單說就是一個迴圈體內只能出現slice陣列的一個元素。例 a(i)=temp1; a(i+1)=temp2; 是不行的。 另外,slice變數的下標一定要連續,例 a(2*i)=temp; 是不行的。 (3)臨時變數 matlab使用變數的一個好處是不需要預定義。但是在使用parfor時,這會弄混sliced變數和臨時變數。由於臨時變數不需要有sliced變數的限制,使用更自由,因此一定要區分開。方法是在parfor中對臨時變數進行預定義。例 parfor i=1:10     b=zeros(1,4);     for j=1:4         b(i)=i+1;     end     a(i)=b;   %a是sliced變數 end 基本上注意到這幾個問題就能正常執行parfor了。