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