最近帮一个胖友写几句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倍的时间