MATLAB并行工具箱--parfor的使用
最近在使用进行MATLAB进行一些计算的时候因为计算时间实在是太长了(五天。所以开始考虑进行算法优化,就在这时无意间看到了系统的CPU占用率,what?25%哈哈哈哈哈或或或或或或或或,matlab个ZZ。于是想起了parfor这回事,算法用的是动态规划算法,但是在每个递推过程中也要计算$2000 \times 2000$个循环,正好可以用并行计算,perfect,条件允许,直接开始! 要啥简介,直接开干 来看一个简单的不能再简单的例子,我们用for将一个数组乘以2 n = 1000; a = rand(n,1); for i=1:n a(i) = a(i) * 2; end 试着跑一下,没什么问题(这要有啥问题可以不活了),看一下运行时间 Elapsed time is 0.000034 seconds. 一个n x 1大小的随机数组,然后把其中每个数乘以二,下面就是改成parfor并行计算的 n = 1000; a = rand(n,1); parfor i=1:n a(i) = a(i) * 2; end so easy。这样就改好了,matlab果然易用,同样看一下时间 Starting parallel pool (parpool) using the 'local' profile ... connected to 4 workers. Elapsed time is 32.119578 seconds. WTF,本来想要提高效率的,怎么会变得这么慢,不过看说明似乎干了些别的,再跑一遍试试? Elapsed time is 0.183769 seconds. 看上去时间正常多了嘛不过还是比正常跑慢,怎么回事?首先如果看到上面这些,恭喜,这就是已经开始多核心并行计算了,后面我们来具体分析及使用MATLAB的并行计算。 MATLAB并行计算解释及分析 首先通俗解释一下我们做的事情,比如我们有一堆砖要搬,从A搬到B再搬到C结束。正常情况下,我们有一个小伙子来做这件事,他一次一次把所有砖从A搬到B再搬到C。这就是正常情况下的计算。 但是我们的CPU是多核心的,例如我们是有四个小伙子的,但是在搬砖过程中,这四个小伙子只有一个小伙子在搬砖,另外三个小伙子在围观。。。这怎么可能快嘛,但是我们的小伙子很能干,只要砖不是非常多,工作都能很快完成,时间差距不大,所以也就不需要所有人都上了。 并行计算就是让这几个小伙子都动起来,一起去做这件事,这样才能更加效率的解决工作量比较大的问题。在上面的例子中我们就是这样去做的。 但是 为什么第一次运行这么慢:因为matlab开始并行计算之前,需要进行一些预备工作,这些工作默认是没有开启的,所以在第一次进行并行计算的时候,需要首先进行预备工作,花费一些时间,这样时间长也是理所当然的了。 为什么第二次还是这么慢:虽然在工作中有更多的小伙子来干活,但是在干活中,还需要有一个人去给这些小伙子分配工作,这个分配工作的动作也是需要耗费时间的,这样在工作量非常小的情况下(如上例)这个分配工作的时间可能比做这项工作消耗的时间都要长,这样最终反而计算时间更长。 Parallel Pool 的设置 然后我们来看一下 MATLAB 中关于并行工具箱相关的设置: (matlab版本使用2015a,其他版本请找相关设置 matlab 中去做这项工作的部分叫做 Parallel pool。在 matlab 的设置界面中或者主界面的左下角的图标处可以进入并行计算工具箱的设置。大概长这样: 最上面的 Clusters 是关于计算的集群的设置,请选择 local (后面看我努力程度是否出个搭建集群的教程吧,非常简单) 点击蓝色文字处 Cluster Profile Manager 就可以对本地的这个 Cluster 进行配置了,中间最重要的配置是 Number of workers to start on your local machine 这个决定了有多少个小伙子给你干活,默认情况下,CPU 是几核的就填几。(这一步在实际运行中有一些疑问,核心数or线程数,等待后续进一步验证。)修改后可以顺手点击 Validate 进行验证,几项测试都通过的话就说明配置没有问题,退出设置后点击同样在主界面中左下角菜单中的另外一项 Start parallel pool 就可以打开了,或者在程序中运行到 parfor 时 MATLAB 也会自动开启。 ...