最近幫一個胖友寫幾句matlab代碼,裏面涉及到比較大的數組乘法,基本上一輪下來,耗時60min; 由於他需要不斷地改變某一個值,然後跑多次,我當然不允許這個時間白白浪費掉鴨。瞭解到matlab也有並行計算,因爲實驗室是做GPU的並行計算,而MATLAB是採用CPU做計算,本着一個學習的態度,寫一篇博客詳細記錄一下,以防萬一,某一天老闆突然Q我做這個事情。
迴歸正題
首先查看一下你的電腦CPU的核心數量,單核就算了;
任務管理器->性能->CPU
可以看到,我的內核數量是:4,就是說,最多可以開4個core ;
MAC看這裏
MATLAB端的操作:
clc;clear;close;
%開啓並行環境
poolobj = gcp('nocreate');% If no pool, create new one.
if isempty(poolobj)
poolsize = 0;
CoreNum=2; %設定機器CPU核心數量
parpool(CoreNum);
else
poolsize = poolobj.NumWorkers;
disp('Parallel Already initialized'); %說明並行環境已經啓動。
end
%關閉並行環境
% delete (gcp('nocreate'));
進行一個簡單的test
分別用並行和串行計算1000*10000次乘法
clc;clear;close;
%開啓並行環境
poolobj = gcp('nocreate');% If no pool, create new one.
if isempty(poolobj)
poolsize = 0;
CoreNum=2; %設定機器CPU核心數量
parpool(CoreNum);
else
poolsize = poolobj.NumWorkers;
disp('Parallel Already initialized'); %說明並行環境已經啓動。
end
%關閉並行環境
% delete (gcp('nocreate'));
%Test
%並行算1000*10000次乘法
a=[];
tic
parfor i=1:1000
for j=1:10000
a(i,j)=i*j;
end
% disp(i)
end
toc
%串行算1000*10000次乘法
b=[];
tic
for k=1:1000
for m=1:10000
b(k,m)=k*m;
end
end
toc
可以看出,並行使用0.5ms,而串行使用4.7ms,差不多節省9倍的時間