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)
上一篇 2022年1月24日 上午6:00
下一篇 2022年1月24日 上午7:00


相关推荐

  • l1正则化为什么稀疏(特征值重根与秩的关系)

    L1正则化与稀疏性L1正则化使得模型参数具有稀疏性的原理是什么?机器学习经典之作《patternrecognitionandmachinelearning》中的第三章作出的一个解释无疑是权威且直观的,我们也经常都是从这个角度出发,来解释L1正则化使得模型参数具有稀疏性的原理。再回顾一下,以二维为例,红色和黄色的部分是L1、L2正则项约束后的解空间,蓝色的等高线是凸优化问题中的目标函数(…

    2022年4月15日
    93
  • 编写js程序实现n的阶乘_javascript矩阵算法

    编写js程序实现n的阶乘_javascript矩阵算法定义一个函数,算出n的阶乘/**定义一个函数,算出n的阶乘*/letx=Number(window.prompt(‘请输入求阶乘的数:’));console.log(jCheng(x))functionjCheng(x){ returnx<2?1:x*jCheng(x-1)}

    2026年4月14日
    6
  • Vue懒加载实现

    Vue懒加载实现组件数据懒加载使用场景和解决的问题在页面很长时 位于底部的组件可能用户根本就不会到达 那这些组件的数据加载就是一种浪费核心机制 只有组件成功进入到视口区域我们才发送 ajax 请求 接管了由生命周期钩子函数发送的请求模式变成手动控制什么时候发起 具体实现 通过 vueuse core 中的 useIntersect 核心方法 useIntersect 帮助我们监听组件是否进入到视口区域 impor

    2026年3月16日
    3
  • tensorflow版本对应关系

    tensorflow版本对应关系防止安装 tensorflow 过程踩坑 首先要知道一些版本对应关系 1 Windows2 Linux3 macOS1 WindowsCPUGP LinuxCPUGPU3 macOSCPUGPU 来源 https tensorflow google cn install source windows

    2026年3月18日
    2
  • 编写第一个Java程序 HelloWorld

    编写第一个Java程序 HelloWorld1 程序开发的步骤第一步 编写源程序程序员自己写的程序 所有程序员都可以看得懂源代码文件的本质上就是一个文本文档 但扩展名不是 txt 而是 java 第二步 编译源程序 JVM Java 虚拟机 是专门用来运行 Java 程序的但是 JVM 只能识别 0 和 1 而储存 0 和 1 的文件就叫做字节码文件 class 文件 所以我们需要把源代码程序翻译乘 JVM 能够执行的字节码文件使用 javac 命令具体格

    2026年3月17日
    2
  • 《推荐系统实战(二)》音乐推荐系统(数据清洗、召回、排序)

    《推荐系统实战(二)》音乐推荐系统(数据清洗、召回、排序)前言在本篇博客中 我们将从 0 搭建一个音乐推荐系统 其中的流程也可以用来搭建其他内容的推荐系统 我们将整个过程分为三个部分 分别是数据预处理召回排序拿到原始数据集之后 我们需要对其进行处理 包括去重 重命名 去掉无用特征等等 最后形成较为简洁清晰的数据集 有了数据集之后 我们进入系统的召回阶段 在这一阶段 我们从大量歌曲中选出少部分歌曲作为候选集 采用的方法有排行榜 协同过滤和矩阵分解 通过召回阶段 我们得到歌曲的候选集 为了进一步筛选 我们采用 GBDT LR 的 ctr 预估方法 对候选集进行

    2026年3月17日
    2

发表回复

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

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