这几天因为实验需求,所以就了解并尝试用了matlab的多核并行计算方法,主要是通过parfor的形式来实现。现在将笔记mark down并share给大家。希望有所帮助。如有错误,欢迎批评指正。
什么是parfor?
parfor是parallel for的缩写,是matlab实现多核并行计算的一种方式。它根据你自身电脑的配置,使得你能够在多个进程(workers)上同时运行matlab程序,(进程的数量 = CPU核心的数量。也就是,如果你的电脑是4核的,那么你的matlab可以同时在4个worker上运行),最终实现减少耗时的目的。
但是,要用它,可不是随便就可以乱用的。人家是有条件的。
parfor适用条件?
下面简单说说parfor在什么情况下用,才是最有效的[3]。
各个worker之间的数据不会互相依赖。也就是说,你第一次迭代输出的数据 与 你第二次迭代输入的数据 没有关系,每一次迭代的运行,都是互相独立的,互不依赖的。或者说,循环内部的变量之间不存在数据传递。
适用于 大量简单的计算 or 小量/大量复杂的计算。(实质上是指 那些迭代耗时很长的循环,用parfor效果才明显。)这是因为,parfor循环内部有通信消耗,所以对于小数量的简单计算时,用parfor并行可能耗时会更长。例如:
tic;
parfor i = 1:1024000
A = sin(i*2*pi/1024);
end
toc;
tic;
for i = 1:1024000
A = sin(i*2*pi/1024);
end
toc;
更多的例子可以看看[4]。
parfor注意事项?
matlab默认是不能在parfor里面使用save函数的。因为matlab不知道要把工作区的哪个变量保存到内存中。但是有时候,你的实验里确实需要保存中间的结果,那么matlab还是有解决方案的:1)你可以将需要保存文件的操作放进另一个函数里进行操作,然后再当前的parfor循环体内调用这个函数parsave[1, 2](链接中有具体的代码参考)。2)你也可以不用save的操作,在需要保存的数据后断点,然后自己实现保存操作。
用parfor循环的下标必须为连续的递增整数。
parfor使用方法?
简单步骤如下:
1.点击matlab最底下左边的正三角标号,选择“start parallel pool”(当然用其他方式开启也可以);
2.将符合条件的循环for改成parfor即可开始并行运算。
References
[1] http://www.xiongfuli.com/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97/2016-05/Matlab-Parfor.html
[2] https://ww2.mathworks.cn/matlabcentral/answers/135285-how-do-i-use-save-with-a-parfor-loop-using-parallel-computing-toolbox
[3] http://zhiqiang.org/coding/matlab-parfor-condition.html
[4] https://www.mathworks.com/help/parallel-computing/examples.html?category=getting-started-with-parallel-computing-toolbox&s_tid=CRUX_lftnav_example_index