一、Matlab并行计算原理梗概

Matlab的并行计算实质还是从主从结构的分布式计算。当你初始化Matlab并行计算环境时,你最初的Matlab进行自动成为主节点,同时初始化多个(具体个数手动设定,详见下文)Matlab计算子节点。Parfor的作用就是让这些子节点同时运行Parfor语句段中的代码。Parfor运行之初,主节点会将Parfor循环程序之外变量传递给计算子节点。字节点运算过程时互补干扰,运算完毕,则应该有相应代码将各自子节点得到的结果组合到同一个数组变量中,并返回到Matlab主节点。当然最后计算完毕应该手动关闭计算子节点。

二、初始化Matlab并行计算环境

这里讲述的方法仅针对多核机器做并行计算的情况。设机器的CPU核心数量是:CoreNum双核机器的CoreNum=2,依次类推。CoreNum可以不等于核心数量,但是如果CoreNum小于核心数量则核心利用率没有最大化,如果CoreNum大于核心数量则效率反而可能下降。因此单核机器就不要折腾并行计算了,否则速度还更慢。下面一段代码初始化Matlab并行计算环境:

%Initialize Matlab Parallel Computing Enviornment by Xaero | Macro2.cn

CoreNum=; %设定机器CPU核心数量,我的机器是双核,所以CoreNum=

if matlabpool('size')<= %判断并行计算环境是否已然启动

matlabpool('open','local',CoreNum); %若尚未启动,则启动并行环境

else

disp('Already initialized'); %说明并行环境已经启动。

end

运行成功后会出现如下语句:

Starting matlabpool using the 'local' configuration ... connected to  labs.

如果运行出错,按照下面的办法检测:

首先运行:

matlabpool size

如果出错,说明你没有安装Matlab并行工具箱。确认安装了此工具箱后,运行:

matlabpool open local ;

如果出错,证明你的机器在开启并行计算时设置有问题。请联系MathWorks的售后服务。

三、终止Matlab 并行计算环境

用上述语句启动Matlab并行计算环境的话,在你的内存里面有CoreNum个Matlab进程存在,每个占用内存都在百兆以上。(可以用Windows任务管理器查看),故完成运行计算后可以将其关闭。关闭的命令很简单:

matlabpool close

四、Matlab做Monte Carlo并行的算法

Matlab并行计算比较特别。下图节选自Matlab并行计算工具箱用户手册。这个列表告诉你Matlab如何处理Parfor并行计算程序段中的各种变量。所以写代码时要注意不少问题,否则写出的并行代码可能还不如非并行的代码快。

这里我推荐大家用Matlab写Monte Carlo并行代码时按照以下注意事项来写:

1.将Monte Carlo模拟过程中不会改变的参数都写在Parfor循环块外面

2.生成随机数、计算f(x)等过程都写在Parfor里面

3.不要将V0结果传递出Parfor,而是直接计算出V0的均值、方差传递出parfor。

4.最后用数学公式将传递出Parfor的V0的均值方差组合计算成最终结果

这些事项如何体现到程序中请参照示例代码文件并结合视频教程学习。这样的并行办法简单易行,对原始程序没有太大的改动,同时传递变量耗费时间也较少,效率比较高。

另外一个问题就是并行代码做模拟的次数问题。我们要达到用非并行的代码做N此模拟所能得到结果的精确程度,在核心为CoreNum并行代码中,Parfor语句段中只要做N/CoreNum次即可达到

五、将例子改写为并行代码

刚才试了一下,我使用的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效果好,但是用起来要注意程序的细节。很多地方都会报错。比如下标必须为连续的整数!否则会报下面这个错误“The variable xxx in a parfor cannot be
classified.”具体可以看parfor帮助文件里面的sliced variables这一节,帮助建议仔细全部看过最好。
2、用了parfor之后,输出参数用nargout确定,会出错。不知道为什么。
3、变量在parfor内外的传进传出要非常小心,因为并行的关系,依赖循环下标的变量都要仔细考虑。
 
在我的程序里面,用profile监测,
不用并行计算的时候,CPU时间为 84.742 S,
用了并行计算的时候,CPU时间为 15.231 S
加速比达到了5.6!

matlab 并行运算【转】的更多相关文章

  1. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1

    1 更高级的算法牵扯到更多重的循环和复杂的计算,尤其是现在人工智能的算法尤其如此.有些历史知识的人能够了解到,人工智能的很多基本算法其实近百年之前就有了,但是当时的计算机技术达不到去实现这些算法的要求 ...

  2. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-关于parfor的问题

    1 我们知道MATLAB支持并行运行一般有四种模式: 第一种模式:本机调用多核CPU性能并行运算 第二种模式:本机调用GPU性能并行运算 第三种模式:多计算机组成集群,调用集群CPU性能并行运算 第四 ...

  3. matlab两种不同模式的并行运算

    1.distributed job      distributed job是一种比較简单的并行任务.假定用户须要完毕一组作业.各个计算作业之间是独立的.并且相互之间不须要进行数据通信.这意味着各个作 ...

  4. matlab学习日志之并行运算

    原文地址:matlab并行计算,大家共同学习吧,涉及到大规模数据量处理的时候还是效果很好的 今天搞了一下matlab的并行计算,效果好的出乎我的意料. 本来CPU就是双核,不过以前一直注重算法,没注意 ...

  5. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-利用GPU并行执行MATLAB程序

    1 MATLAB原文: 如果所有你想使用的函数支持GPU,你能够使用gpuArray把输入的数据传输到GPU,也能够唤起gather命令把传输值GPU的数据回收. 2 通过gpuDevice命令观察当 ...

  6. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-2

    1 MATLAB并行计算-从个人桌面到远程集群和云(陈伟/魏奋)视频摘录笔记 https://cn.mathworks.com/videos/parallel-computing-with-matla ...

  7. MATLAB中的FOR循环问题

    做量化操作的时候经常需要使用到matlab编写策略或者计算多因子,for循环非常慢,自己找了一些matlab中for循环的优化方法,for的部分每处理一个大矩阵都要花费大量的时间,这是不可避免需要遇到 ...

  8. 解决Matlab当中for循环运行慢的问题

    做量化操作的时候经常需要使用到matlab编写策略或者计算多因子,for循环非常慢,自己找了一些matlab中for循环的优化方法,for的部分每处理一个大矩阵都要花费大量的时间,这是不可避免需要遇到 ...

  9. <2014 08 29> MATLAB的软件结构与模块、工具箱简示

    MATLAB的系统结构:三个层次.九个部分 ----------------------------------- 一.基础层 是整个系统的基础,核心内容是MATLAB部分. 1.软件主包MATLAB ...

随机推荐

  1. Java基础之进制转换

    1.十进制与二进制之间的转换 (1)十进制转二进制的方法:使用十进制的数据不断除以2,直到商为0为止,从下往上取余就是对应的二进制. (2)二进制转十进制:使用二进制的每一位乘以2的n次方,n从0开始 ...

  2. ld: i386 架构于输入文件 bar.o 与 i386:x86-64 输出不兼容

    报错:ld: i386 架构于输入文件 foo.o 与 i386:x86-64 输出不兼容 或者:ld: i386 architecture of input file `foo.o' is inco ...

  3. Git使用列表(四)

    最近,由于自己的一个项目,导致自己的关于自己的要使用Git的很多的命令,突然发现自己的git的还有许多不知道的东西 不过,在这个工作的过程中,也发现自己的一些很大的缺陷,就是自己题目理解力有限,明明就 ...

  4. VR中为什么需要把游戏音频放在聚光灯里?

    VR中为什么需要把游戏音频放在聚光灯里? 本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/de ...

  5. Netty概述

    一,介绍 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高可靠性的网络服务器和客户端程序. 也就是说,Netty 是一 ...

  6. 一个小白的测试环境docker化之路

    本文来自网易云社区 作者:叶子 学习docker搭建测试环境断断续续也有三个多月了,希望记录一下这个过程.常言道,总结过去,展望未来嘛~文章浅显,还望各位大神路过轻拍. 按照国际惯例,先说一下背景: ...

  7. python爬取视频网站m3u8视频,下载.ts后缀文件,合并成整视频

    最近发现一些网站,可以解析各大视频网站的vip.仔细想了想,这也算是爬虫呀,爬的是视频数据. 首先选取一个视频网站,我选的是 影视大全 ,然后选择上映不久的电影 “一出好戏” . 分析页面 我用的是c ...

  8. Selenium(Python)PageObject页面对象

    使用PageObject页面对象的好处是, 当页面元素的位置发生改变时, 只需要去修改Xpath或者ID, 而不用去修改测试用例本身: 本次的思路是: 1.常用方法类 2.页面对象类 3.测试用例类 ...

  9. 各种对list,string操作函数的总结

    #encoding=utf-8#reverse,用来反转lista=['aa','bb','cc']a.reverse()print a#['cc', 'bb', 'aa']#不能直接print a. ...

  10. Siki_Unity_3-13_编程内功修炼-算法

    Unity 3-13 编程内功修炼 -- 算法 任务1&2:课程介绍 主要算法: 分治法 堆排序 二叉树 动态规划 贪心算法 图 任务3:分治算法 -- Divide and Conquer ...