I found a good material/manual
[www] http://mirlab.org/jang/books/matlabProgramming4guru/02-2_Optimization4codeNmem.asp?title=2-2%20%A5%AD%A6%E6%B3B%B2z
Here is the content:
2-2 平行處理
此外,我們也可以借用多核電腦的平行處理,來加速程式碼的執行。欲達到此功能,你的電腦必須具備多核心,而且你的系統也必須先安裝平行處理工具箱(Parallel Processing Toolbox,簡稱 PCT)。若兩者兼備,加速計算的方法如下:
在使用平行處理指令之前,下達「matlabpool local n」指令,其中 n 代表核心數目,例如 4(四核心電腦)或 8(八核心電腦)。
使用 parfor 指令來取代原來的 for 迴圈,其指令格式如下:
parfor loopvar = initval:endval, statements, end
最後下達「matlabpool close」來關閉平行處理的功能。
我們就可以來嘗試一個簡單的範例:
Example 1: 02-程式碼與記憶體之最佳化/parfor01.m ver distcomp % 顯示 PCT 的版本
matlabpool local 4
n = 100;
rowMedian1=zeros(1000, 1);
rowMedian2=zeros(1000, 1);
% === 第一種方法:common for-loop
tic
for i = 1:1000
rowMedian1(i) = max(eig(rand(n)));
end
time1 = toc;
% === 第二種方法:parallep for-loop
tic
parfor i = 1:1000
rowMedian2(i) = max(eig(rand(n)));
end
time2 = toc;
fprintf('time1 = %g, time2 = %g, speedup factor = %g\n', time1, time2, time1/time2);
matlabpool close-------------------------------------------------------------------------------------------------------
MATLAB Version: 8.1.0.604 (R2013a)
MATLAB License Number: DEMO
Operating System: Microsoft Windows 7 Version 6.1 (Build 7601: Service Pack 1)
Java Version: Java 1.6.0_17-b04 with Sun Microsystems Inc. Java HotSpot(TM) 64-Bit Server VM mixed mode
-------------------------------------------------------------------------------------------------------
Parallel Computing Toolbox Version 6.2 (R2013a)
Starting matlabpool using the 'local' profile ... connected to 4 workers.
time1 = 4.94823, time2 = 1.62187, speedup factor = 3.05094
Sending a stop signal to all the workers ... stopped.
在這個範例中,我們產生了 1000 個 100x100 的亂數矩陣,然後計算每一個矩陣的特徵值(共有 100個)的最大值,若使用平行處理專用的 parfor 迴圈,計算速度是一般 for 迴圈的 3 倍左右。(我的電腦是四核心。)
如果你在執行 MATLAB 時,一邊還要還要修改論文,此時若 MATLAB 佔用了所有的多核 CPU,可能會導致電腦整個慢下來,讓你無法進行文書編輯。因此 parfor 提供另一個參數,可以指定所用到的工作者個數,指令格式如下:
parfor (loopvar = initval:endval, M), statements, end
其中 M 即是所用到的核心個數。例如在下例中,雖然我的電腦是四核心,但我只使用兩核來進行 parfor 的運算:
Example 2: 02-程式碼與記憶體之最佳化/parfor02.m fprintf('MATLAB version = %s\n', version);
matlabpool local 4
n = 100;
rowMedian1=zeros(1000, 1);
rowMedian2=zeros(1000, 1);
% === 第一種方法:common for-loop
tic
for i = 1:1000
rowMedian1(i) = max(eig(rand(n)));
end
time1 = toc;
% === 第二種方法:parallel for-loop using 2 workers
tic
parfor (i = 1:1000, 2) % 只用兩個核心
rowMedian2(i) = max(eig(rand(n)));
end
time2 = toc;
fprintf('time1 = %g, time2 = %g, speedup factor = %g\n', time1, time2, time1/time2);
matlabpool closeMATLAB version = 8.1.0.604 (R2013a)
Starting matlabpool using the 'local' profile ... connected to 4 workers.
time1 = 4.91713, time2 = 2.58577, speedup factor = 1.90162
Sending a stop signal to all the workers ... stopped.
由於只用到兩核,所以加速倍數接近兩倍。
在使用 parfor 迴圈時,有幾點要特別注意:
因為每個迴圈可能有不同的核心同時計算,因此迴圈之間不能有相依性,否則會造成錯誤的結果,這是特別需要注意之處。
在 parfor 迴圈的迴圈變數必須是整數,而且每次變大幅度都是1,以下是幾個不符合規定的範例:
不合格的 parfor 用法 說明
parfor i = 1:2:25 1, 3, 5,... 非連續整數。
parfor i = -7.5:7.5 -7.5, -6.5,... 非整數。
A = [3 7 -2 6 4 -4 9 3 7]; parfor i = find(A>0) 結果是 1, 2, 4,...,非連續整數。
parfor i = [5;6;7;8] [5;6;7;8]是一個行向量,而非 parfor 所須要的列向量。
PCT 是一個功能強大的工具箱,目前也可以支援多台電腦的平行運算,並可以使用 GPU(Graphic Processing Unit,圖形處理器)來進行大量的平行運算,詳細功能請參考下一小節的介紹。
MATLAB程式設計:進階篇
沒有留言:
張貼留言