Matlab的parfor并行编程

Matlab的parfor并行编程

大家好,又见面了,我是全栈君。

Matlab的parfor并行编程

  • 通常消耗最多计算资源的程序往往是循环。

    把循环并行化。或者优化循环体中的代码是最经常使用的加快程序执行速度的思路。

  • Matlab提供了parforkeyword,能够非常方便的在多核机器或集群上实现并行计算。

parforkeyword的使用

  • 由forkeyword引导的循环通常为串行运行。假设改为parfor则能够由多个worker以并行方式运行。
  • parfor能够将n次循环分解为独立不相关的m部分,然后将各部分分别交给一个worker运行。
  • 循环运行的结果应该与n次循环运行的顺序无关。

parfor中的变量类型

简约变量

  • 一般parfor中各次循环相应的运算应该相互独立,但简约操作能够在多次循环内同一时候对一个变量操作。这样的变量称为简约变量。

    比例如以下方代码中a就是简约变量。

    a = 0;
    for i = 1:1000
      a = a+i;
    end
  • 简约操作包含+ - * .* & | [,] [;] {,} {;} min max union intersect
  • 同一个parfor循环对简约变量的操作必须一致。即必须是同一种简约操作符。并且与操作符的相对位置也必须一致。

  • 简约变量赋值表达式应该满足结合律和交换律。

    * [] {}底层有特殊处理保证结果的正确性。

切片变量

  • parfor中可能须要读取或写入parfor之外的矩阵,读取写入位置与循环变量相关。这样就须要向worker传输大量的数据。

  • 矩阵假设被Matlab识别为切片变量,则数据能够分段传输到各worker,提高传输效率。

  • 切片变量矩阵的大小是不可在parfor中改变的。且为了保证Matlab识别正确。每次循环中仅仅能读取由同一个索引值索引的切片。如a[i] a[i+1]同一时候出现则a不被识别为切片变量。

循环变量

  • 如上例中的i,表示当前循环的id。

广播变量

  • 在parfor之前赋值,在parfor内仅仅进行读取操作。

暂时变量

  • 作用域局限于parfor内。parfor结束后不存在。

    不影响parfor之前声明的同名变量。

各种变量区分的样例

  • 下例中,parfor中的tmp是暂时变量,parfor结束后tmp的值依旧是5,不受暂时变量的影响。
  • broadcast是广播变量。每次循环中的值不变。
  • redued是简约变量。Matlab对其的值将分段由各worker计算后送回主进程处理。
  • sliced为切片变量。传输数据有优化提升。
  • i为循环变量。

    tmp = 5;
    broadcast = 1;
    reduced = 0;
    sliced = ones(1, 10);
    parfor i = 1:10
      tmp = i;
      reduced = reduced + i + broadcast;
      sliced(i) = sliced(i) * i;
    end

worker配置

  • 在执行程序之前。须要配置worker。否则如前文所说,parfor循环将以普通for循环的形式执行,无法并行。

单机配置

  • 使用matlabpool命令能够开启关闭本机的并行计算池。
  • matlabpool n命令能够打开n个worker。
  • matlabpool open configname依照指定配置打开,默认配置为local

  • 程序执行结束后,应该使用matlabpool close关闭worker。
  • 配置项的改动能够通过Parallel -> Manage Cluster Profile完毕。

  • n的选择:假设有c个cpu核心,通常能够设置为c。假设是远程server,为防止server响应卡顿,能够设置为c-1

    对于计算密集型程序,超线程带来的性能提升差点儿为0,能够设置为核心数,而不是线程数。

注意事项

  • 循环次数n最好能整除以worker个数m,否则部分worker会分配较多的循环,造成一部分worker闲置一段时间,减少了并行性。
  • 并行执行时各个worker之间会进行通信。要注意大量传输数据带来的性能下降。

    尤其对于广播变量。假设较大可尝试变为切片变量。

  
  


转载请注明作者:Focustc,博客地址为
http://blog.csdn.net/caozhk。原文链接为
点我
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116244.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • mac mysql管理工具_hadoop平台管理工具

    mac mysql管理工具_hadoop平台管理工具Mac平台的MySQL管理工具

  • 【其他】资源整合「建议收藏」

    【其他】资源整合「建议收藏」偶然整理云盘,发现曾经收藏过一些比较不错的资源,正好分享一下;1.C语言教程,郝斌老师作为读书时候的启蒙老师,推荐一波链接:https://pan.baidu.com/s/1rn_cHgNs5qIZV9ON-pcWVw提取码:wa7j2.UI框架链接:https://pan.baidu.com/s/1Q2Bj-i79C1gDWZSvfDVEeQ提取码:a47l3.UI万能框架链接:https://pan.baidu.com/s/1Ikvqo9mtabD104bWVLte2w…

  • snmpwalk命令常用方法

    snmpwalk命令常用方法SNMPWALK是一个通过SNMPGET-NEXT类型PDU,实现对目标AGENT的某指定MIB分支信息进行完整提取输出的命令工作。命令行:[html] viewplain copysnmpwalk [选项] agent [oid]  选项参数:由于SNMP协议中,不同的协议版本存在不同的参数选项,以下参数按协议分开说明。

  • druid简单教程

    druid简单教程java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,有不得不使用数据库连接池。数据库连接池有很多选择,c3p、dhcp、proxool等,druid作为一名后起之秀,凭借其出色的性能,也逐渐印入了大家的眼帘。接下来本教程就说一下druid的简单使用。首先从http://repo1.maven.org/maven2/com/alibaba/druid/下载最新的jar包。如果想…

  • 浙江八年级 python_如何看待浙江八年级将新增python编程以及数据结构等课程?…

    浙江八年级 python_如何看待浙江八年级将新增python编程以及数据结构等课程?…不是吧阿sir,这后浪来的有点快吧放观点:可以在教育中普及编程语言引导学生学习,但不能把它变成所有初中生的必修课你把VB这种过时东西扔掉,我举双手赞成;你让学有余力、对这方面感兴趣的同学在课余时间研习一下代码和算法,我对此是鼓励的;但是你把python拿过来强制所有人学,那这门课1)如果加入记分考试,那这在应试教育体系下纯粹是给学生增加负担(我们学校大一下刚学VB这种比python还要简单的语言,…

  • pycharm怎么打包成exe文件_pycharm怎么保存py文件

    pycharm怎么打包成exe文件_pycharm怎么保存py文件使用Pycharm将多个py文件打包成一个可运行并且可安装文件第一步:安装pyinstaller第二步:打包生成exe文件第三步:造成一个类似安装程序的东西第一步:安装pyinstaller先打开命令行,打开pycharm在左下角:打包程序前提要安装pyinstaller:(如果本文档下面要使用那些命令使用不了的话建议卸载pyinstaller再返回这一步使用命令行再装一次)第二步:…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号