4.最后用数学公式将传递出Parfor的V0的均值方差组合计算成最终结果
这些事项如何体现到程序中请参照示例代码文件并结合视频教程学习。这样的并行办法简单易行,对原始程序没有太大的改动,同时传递变量耗费时间也较少,效率比较高。
另外一个问题就是并行代码做模拟的次数问题。我们要达到用非并行的代码做N此模拟所能得到结果的精确程度,在核心为CoreNum并行代码中,Parfor语句段中只要做N/CoreNum次即可达到。
二十九、将例子改写为并行代码
附件中的pareg1.m,……,pareg5.m五个文件分别是前一章五个例子的并行代码。这里需要提到的是,这五个代码文件都是用向量化的代码编写。原因在于,在前一章大家都看到了,向量化的代码比循环语句代码一般快几十甚至上千倍,所以要提高速度,向量化代码是最重要的优化方法,并行计算倒是其次。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
由于要搜索多核运行,找到这个帖子里来了
刚才试了一下,我使用的MATLAB2010可以多核运行的。需要多核多线程跑的算法,在之前要让matlab在本地建立4个“实验室”(我的机器是4核,所以是4个)
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
显示正在进行多核配置,一会说,连接到4个“实验室”。我理解就是在本地虚拟出4台可以运行matlab的工作站,这样用分布式计算工具箱可以进行并行计算(matlabpool这个命令好像是在并行计算工具箱里的)。观察windows任务管理器,可以发现一共有5个MATLAB.exe进程。其中一个占内存较多的,我理解是主控的,他基本不干活,只负责分配,进行计算时他的cpu占用率只有1~2%,剩下四个进程专门用来计算的,跑起来各占cpu 25%左右。看上去还是每个matlab进程单核运算,但是一下开4个进程,所以能把cpu用满。
如果后续还需要多核运算,就直接用parfor好了,不用每次都用matlabpool命令。那个配置一次就好。
算完了,不再跑了,临退出时关闭配置就行。
>> matlabpool close
Sending a stop signal to all the labs ... stopped.
下面是我一个M文件的程序,测测4核并行计算和单核计算的差距,很简单。
function testtime
runtimes = 1e9;
dummy1 = 0;
dummy2 = 0;
%matlabpool local 4
tic
%for x= 1:runtimes;
parfor x= 1:runtimes;
dummy1 = dummy1 + x;
dummy2 = 2 * x + 1;
end
toc
plot([1 2], [dummy1, dummy2]);
第一次用普通for语句,单核跑,6.09秒
>> testtime
Elapsed time is 6.094267 seconds.
第二次用parfor语句,4核跑,1.63秒
>> matlabpool local 4
Starting matlabpool using the 'local' configuration ... connected to 4 labs.
>> testtime
Elapsed time is 1.631350 seconds.
>> matlabpool close
加速比 6.09 / 1.63 = 3.736,将近4倍(还有开销吧),还比较可观。
1、parfor效果好,但是用起来要注意程序的细节。matlab内循环并行计算很多地方都会报错。比如下标必须为连续的整数!否则会报下面这个错误“The variablexxx in a parfor cannot be classified.”具体可以看parfor帮助文件里面的sliced variables这一节,帮助建议仔细全部看过最好。
2、用了parfor之后,输出参数用nargout确定,会出错。不知道为什么。
明天在xeon 5310上面去试试,双CPU,一共8核,不知道会是什么样子,估计最多1S。。。。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-40304-2.html