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。原文链接为
点我
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QTP10激活成功教程时,运行mgn-mqt82.exe 就提示已停止工作[通俗易懂]

    QTP10激活成功教程时,运行mgn-mqt82.exe 就提示已停止工作[通俗易懂]将mgn-mqt82.exe软件下载到这个目录,没有目录自己创建C:\Program Files (x86)\Common Files\Mercury Interactive\License Manager

    2022年9月1日
    2
  • 利用计算机程序快速得到9*9大小数独的解法

    利用计算机程序快速得到9*9大小数独的解法对于9∗99*99∗9大小的数独游戏,我们可以使用回溯法求得其正确的解,但是,一般的回溯法实现这个过程保证不了时间复杂度,所以我们可以利用二进制压缩的方法来优化其过程。具体思路如下:明确数独的约束:相同一行不能出现重复的数相同一列不能出现重复的数同一宫内不能出现重复的数定义row[i]row[i]row[i]数组代表,第i,ji,ji,j位置,在iii行哪些数被占用,用二进制111表示没有被占用,000表示被占用那么最开始row[i]row[i]row[i]=111111

    2025年8月20日
    1
  • 短信定位 android,短信定位

    短信定位 android,短信定位开发者名称:xunl这是一款利用发送短信来得到对方位置的应用.应用场景:1.寻找家人:家里有小孩子或老人,只要给对方发送一条包含设置好关键字的短信内容,即可以地图的方式在当前手机上显示对方的位置.2.找回手机:自己的手机找不到了,只要给自己的手机发送一条短信,即可得到手机所在地理位置.使用方法(寻找家人):1.首先说一下概念:你想知道谁的位置,那么谁就是软件中的TA,而你在软件中的角色是主人.2….

    2022年10月13日
    2
  • 阿里技术专家详解 Dubbo 实践,演进及未来规划

    阿里技术专家详解 Dubbo 实践,演进及未来规划

    2021年6月28日
    98
  • JavaSE: Java10的新特性

    JavaSE: Java10的新特性1.Java10的概述<1>Java10于2018年3月发布,改进的关键点包括一个本地类型推断、一个垃圾回收的增强<2>Java10计划只是一个短期版本,因此公开更新将在

    2022年7月4日
    17
  • python微信机器人库_Python微信机器人「建议收藏」

    python微信机器人库_Python微信机器人「建议收藏」1.需要用到的模块:requests:Requests是用Itchat:itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。当然,该api的使用远不止一个机器人,更多的功能等着你来发现,比如这些。该接口与公众号接口itchatmp共享类似的操作方式,学习一次掌握两个工具。如今微信已经成为了个人社交的很大…

    2022年6月18日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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