matlabpool open 4;%打开四个线程
B=zeros(1,5);
parfor i=1:5
a=i;
B(1,i)=a;
end
matlabpool close
B
Libing Wang师弟用过,比如对PCA 20次随机分割肯定能这么用,这样会提高CPU的利用效率,几个核同时用
一个使用parfor-loop的例子:
%example of parfor-loop %本地worker数通常等于cpu的核数
matlabpool open local 2;
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end
plot(A);
matlabpool close;
设机器的CPU核心数量是CoreNum双核机器的CoreNum2,依次类推。CoreNum以不等于核心数量,但是如果CoreNum小于核心数量则核心利用率没有最大化,如果CoreNum大于核心数量则效率反而可能下降(如何看计算机有几个核?Weiqiang说任务管理器->性能,看CPU使用记录有几个就是几个核)。因此单核机器就不要折腾并行计算了,否则速度还更慢。下面一段代码初始化Matlab并行计算环境:
%Initialize Matlab Parallel Computing Enviornment by Xaero | Macro2.cn
CoreNum=2; %设定机器CPU核心数量,我的机器是双核,所以CoreNum=2
if matlabpool('size')<=0 %判断并行计算环境是否已然启动
matlabpool('open','local',CoreNum); %若尚未启动,则启动并行环境
else
disp('Already initialized'); %说明并行环境已经启动。
end
运行成功后会出现如下语句:
Starting matlabpool using the 'local' configuration ... connected to 2 labs.
成运行计算后可以将其关闭。关闭的命令很简单:
matlabpool close
另外一个问题就是并行代码做模拟的次数问题。我们要达到用非并行的代码做N此模拟所能得到结果的精确程度,在核心为CoreNum并行代码中,Parfor语句段中只要做N/CoreNum次即可达到。
read twice http://blog.sciencenet.cn/blog-419879-444784.html, no need to see again
但下面例子是可以的,parfor内部可以有for(parfor本身也不支持嵌套,将for j 改为parfor,两重parfar不行):
matlabpool open local 2;
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
for j=1:10
B(i,j)=A(i)*j;
end
end
matlabpool close;
这段代码没有问题,不知我的Test_GLA_DLSR_FS_ServerVersion_outerParFor,没有r = zeros(length_d,1);就不行,提示rate can not be classified.和Weiqiang讨论,他也没遇到这种错误,只是想办法用替代方法解决
解决方案:最内层的循环用parfor(Weiqiang说未必要这样);几个内层串行for,相互没有关联,可以一起parfor。parfor内部不能有clear和save,因为parfor内部有了clear和save,对应的clear和save会显示红色。This is with Dong Cao's help.
解决方案:Weiqiang说parfor内部是可以有for循环的,他讲是可以有clear和load的,封装成一个函数my_clear(随便什么函数名字都行)调用clear即可,load类似,但save不行。
错误实现:
function my_load1(filename)
load(filename);
end
正确实现
function S = my_load(filename)
S = load(filename);
end
和Weiqiang讨论,他也没说清楚原因。
function my_clear(name1)
clear name1;
end
看clear的用法有很多种,Weiqiang讲只能写死一种。
见Test_GLA_DLSR_FS_ServerVersion_outerParFor
The client lost connection to lab 4. This might be due to network problems, or
the interactive matlabpool job might have errored.Weiqiang说这种问题没法解决,
是通讯问题
在本机程序没耗100%CPU和内存,到服务器上跑会不会快点,Weiqiang讲会快点,但快不了多少。他在du公司服务器速度也和lab服务器速度速度差不多,关键程序本身很慢,租服务器还是很慢。