1. 程式人生 > >Matlab並行程式設計方法及理解(1)

Matlab並行程式設計方法及理解(1)

轉載(有微弱改動)至:美女Rachel-Zhang的部落格:http://blog.csdn.net/abcjennifer/article/details/17610705;http://blog.csdn.net/abcjennifer/article/details/17843787。

本文講一下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;(釋放核心)

具體到程式碼:

  1. matlabpool local 2;  
  2.     %parallel program  
  3. 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迴圈。每個迭代都必須不依賴其他迭代,若依賴其他迭代,則顯示警告“發現迴圈對話interactive session”。由於parfor迴圈內有通訊消耗,當只有小數量的簡單計算時使用parfor可能得不到什麼好處。

  1. c = 1:10;  
  2. a = ones(10,1);  
  3. tic  
  4. parfor i = 1:length(c)  
  5.     a(i)= a(i)+ c(i); 
  6.     Zi=Zi+1;              %像這種就是迭代,要顯示“Found an interactive session. You cannot have                                  % multiple interactive sessions open simultaneously.” 
  7. end  
  8. toc  
  9. 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. 就是說同一段程式應用於不同的樣本(資料),所以一般針對隨機抽樣的並行,如

  1. %% SPMD  
  2. %example 1  
  3. spmd   
  4. A = rand(3,2); %generate a matrix A for each lab(worker)  
  5. end  
  6. for i = 1:length(A)  
  7.     figure; imagesc(A{i});   
  8. end  
  9. %example 2  
  10. a = 3;  
  11. b = 4;  
  12. spmd  
  13.     c = labindex();  
  14.     d = c+a;  
  15. end  
  16. c{2} = 5;  
  17. spmd  
  18.     f = c*b;  
  19. end  
  20. for i = 1:length(f)  
  21.     fprintf('%d\t',f{i});%access the value of each lab  
  22. end  

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

  1. %example3 - deal with same Data by different parameters  
  2. %add different values to same array Data  
  3. Data = 1:100;  
  4. spmd  
  5.     switch labindex  
  6.         case 1  
  7.             Data = Data+1;  
  8.         case 2  
  9.             Data = Data+2;  
  10.     end  
  11. end  
  12. % print Data{1} & Data{2} for checking  
  13. %example4   
  14. %add different values for different parts of array Data  
  15. % [1:50]+1  
  16. % [51:100]+2  
  17. spmd  
  18.     if labindex == 1  
  19.         Data(1:50) = Data(1:50)+1;  
  20.     else  
  21.         Data(51:100) = Data(51:100)+2;  
  22.     end  
  23. 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賦值。

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


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

是這樣,

  1. parfor i = 1:4
  2. ........  
  3. 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

是不行滴。。

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

Reference:

2. 詳細講解並行用法(貌似阿拉伯人寫的……o(╯□╰)o)

3. 詳細並行程式碼

5. Parallel Computing Toolbox User's Guide



相關推薦

Matlab並行程式設計方法理解1

轉載(有微弱改動)至:美女Rachel-Zhang的部落格:http://blog.csdn.net/abcjennifer/article/details/17610705;http://blog.csdn.net/abcjennifer/article/details/

MATLAB編程與應用系列-第2章 數組矩陣的創建操作1

基本 while 能力 ++ 基本概念 包括 沒有 tab 其他 本系列教程來源於出版設計《基於MATLAB編程基礎與典型應用書籍》,如涉及版權問題,請聯系:[email protected]。 出版社:人民郵電出版社, 頁數:525。 本系列教程目前基於MATLABR200

GloVe模型的理解實踐1

一、GloVe模型的理解 1) 原理 功能:基於語料庫構建詞的共現矩陣,然後基於共現矩陣和GloVe模型對詞彙進行向量化表示 輸入:語料庫  輸出:詞向量 2)與Skip-Gram、CBOW模型比較 例如:句子為"dog barked at the mailman" ,目標

【統計學習方法讀書筆記】感知機的個人理解1

寫在前面: 在友人的推薦下,開始入李航老師的坑,《統計學習方法》。 讀到第二章,感知機,李航老師由淺入深讓我有了很好的理解,現在自己總結一下思路。 正文:  感知機用於二分類問題,由淺開始:假定我們有一個平面上存在許許多多的藍色點和紅色點,並且假設存在一條直線可以將藍紅

相機標定 matlab opencv ROS三種方法標定步驟1

 一 、 理解攝像機模型,網上有很多講解的十分詳細,在這裡我只是記錄我的整合出來的資料和我的部分理解         計算機視覺領域中常見的三個座標系:影象座標系,相機座標系,世界座標系,實際上就是要用矩陣來表         示各個座標系下的轉換,首先在影象座標系下與相機座標系的關係            

6javascript的程序控制結構語句-----1條件判斷

江湖 too 分支語句 copy 表達 demo oct alt javascrip 程序控制結構及語句 編程就是將現實應用,轉換為程序能夠讀得懂的語法語句。Javascript編程中對程序流程控制主要是通過條件判斷語句、循環控制語句及continue、break來完成的

Faster rcnn代碼理解1

感覺 組織 等我 ont 包含 還要 定義 fig 訓練數據 這段時間看了不少論文,回頭看看,感覺還是有必要將Faster rcnn的源碼理解一下,畢竟後來很多方法都和它有相近之處,同時理解該框架也有助於以後自己修改和編寫自己的框架。好的開始吧~ 這裏我們跟著Faster

智能指針原理實現1- shared_ptr

red ++ 直接 初始 targe -- div urn 記錄 C++沒有內存回收機制,每次程序員new出來的對象需要手動delete,流程復雜時可能會漏掉delete,導致內存泄漏。於是C++引入智能指針,可用於動態資源管理,資源即對象的管理策略。 一、智能指針類別 智

python socket 的理解1

網絡 完成 ron bsp 接收數據 技術分享 檢測 cnblogs 無數據 前言 socket的用法簡單,但裏面的概念有點模糊,記錄自己本人的一點理解。 socket層結構圖 註意,從此圖中看出socket處於tcp和應用層之間。那麽它代表啥意思呢?簡明的說,數

assimp編譯使用1

之前的https://blog.csdn.net/wodownload2/article/details/77905708 講述過怎麼編譯assimp,但是這次又遇到了新的問題,所以再來總結下編譯assimp的過程。 1、下載assimp原始碼 https://github.com/

Spring MVC 配置應用1

一,分析 目的:通過控制器呼叫hello.jsp  /hello.do -->DispatcherServlet(配置) -->HanlderMapping(配置) -->HelloController(編寫+配置) -->ViewResolver -

空域分析變換1:濾波卷積

空域分析及變換(1):濾波卷積 引言 1、均值濾波 2、中值濾波 3、高斯濾波 4、梯度Prewitt濾波 5、梯度Sobel濾波 6、梯度Sobel濾波 7、梯度Laplacian濾波 8、其他

程式設計藝術學習筆記1

序言習題 (1).通過一系列的替代,將四個變數的值(a,b,c,d)變為(b,c,d,a),用最少的步驟 開門菜,然而還是有很多值得思考的地方。能幫助人理解計算機對於賦值的操作。通過觀察,可以認為這是一個a[i]賦值給a[i-1]的操作。最少的步驟,只需要五步即可。需要一個t來作輔助

wifi驅動的理解1——驅動架構

轉載請註明出處:http://blog.csdn.net/Righthek 謝謝!          在分析WIFI驅動前,分享一下個人對Linux驅動的一些瞭解,其實縱觀Linux眾多的裝置驅動,幾乎都是以匯流排為

c語言程式設計常見問題總結1

總結1: 將全域性變數放在會被多次呼叫的標頭檔案中,編譯會報錯:該變數被多次定義,所以是最好把全域性變數放在.c檔案中。 總結2:  Getche()函式,輸入後立即從控制檯取字元,不以回車為結束(帶回顯); Getch()是一個不回顯函式,當用戶按下某個字元時,函式自動讀

python實現人臉檢測識別1---- 採集人臉資料

    本次專案是採用keras深度學習框架,訓練人臉識別模型,採用opencv實時檢測與識別周圍的人臉,本文主要講解如何採集訓練集,本次程式碼在人臉識別的程式碼上添加了將識別的照片依次寫入指定資料夾,並命名(000-499).jpg和顯示識別的第N張照片的文字顯示。 程式

淺談對Js面向物件的理解1

    面向物件的語言有一個標誌,那就是它們都有類的概念,通過類來建立任意多個具有相同屬性和方法的物件。它是一種程式開發的方法,它將物件作為程式的基本單元,將邏輯和資料封裝其中,以提高程式碼的靈活性、重用性和擴充套件性。物件是把資料及對資料的操作方法放在一起,作為一個相互依存的整體。簡單的

[C#]非同步程式設計: async和await1

[C#]剖析非同步程式設計語法糖: async和await 一、難以被接受的async 自從C#5.0,語法糖大家庭又加入了兩位新成員: async和await。 然而從我知道這兩個傢伙之後的很長一段時間,我甚至都沒搞明白應該怎麼使用它們,這種全新的非同步程式設計模式對於習慣了傳統模式的人來

網路程式設計:聊天室1

概述:通過網路程式設計來實現聊天室功能 第一步:建立服務端與客戶端並建立連線         服務端:         import java.io.IOException;     &n

初學者對指標的理解1

[email protected][TOC](如何理解c語言中的指標 標題 初學者對指標的理解(1) 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。很多功能還不太熟練 什麼是指標 明白資料在記憶體中的儲存 當你在程式中定義一個變