這麼神奇嗎 Matlab的並行計算 get!

最近幫一個胖友寫幾句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倍的時間


在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章