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。原文链接为点我

Matlab的parfor并行编程的更多相关文章

  1. Matlab并行编程方法1

    相信很多朋友在利用matlab进行计算时,会遇到循环次数过大,或者是单次计算量过大的问题,比如需要计算的数值阵列数据量过大,利用传统的编程方式,跑一次程序几个小时,都要等的急死了是不是呢?如果遇到这种 ...

  2. C#并行编程系列-文章导航

    菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...

  3. Parallel并行编程初步

    Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选 ...

  4. .Net中的并行编程-2.ConcurrentStack的实现与分析

    在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...

  5. .Net中的并行编程-3.ConcurrentQueue实现与分析

    在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...

  6. C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)

    返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...

  7. .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)

    阅读目录: 1.开篇介绍 2.NET并行计算基本介绍 3.并行循环使用模式 3.1并行For循环 3.2并行ForEach循环 3.3并行LINQ(PLINQ) 1]开篇介绍 最近这几天在捣鼓并行计算 ...

  8. C#并行编程之数据并行

    所谓的数据并行的条件是: 1.拥有大量的数据. 2.对数据的逻辑操作都是一致的. 3.数据之间没有顺序依赖. 运行并行编程可以充分的利用现在多核计算机的优势.记录代码如下: public class ...

  9. OpenMP共享内存并行编程详解

    实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...

随机推荐

  1. jQuery中的index方法介绍

    从jq api手册摘过来的内容,index这个方法在写 tab silder 之类的组件还是比较有用的说. js没有传统的函数重载的概念,但是根据传入参数的不同,js的函数可以完成不同的功能,也可说是 ...

  2. Microsoft Visual Studio 发展历史

    Microsoft Visual Studio(简称VS)是美国微软公司的开发工具包系列产品.VS是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具.代码管控工具. ...

  3. 基于visual Studio2013解决C语言竞赛题之0415特殊对数

       题目 解决代码及点评 这道题也是锻炼for循环,在for循环中遍历所有可能的数,然后再判断该数是不是有这样的性质 /********************************* ...

  4. win8安装驱动提示文件哈希值不在指定的目录文件中,此文件可能已损坏或被篡改解决办法

    解决办法: 1. 按快捷键win+R 打开运行命令 2. (请先看完后面的再操作!!)运行输入 shutdown.exe /r /o /f /t 00 3. 点击确定 4. 系统将重启 5. 重启后点 ...

  5. 纠错记录(Could not open the editor: Android XML Editor cannot process this input.)

    Eclipse无法打开xml文件 preference->general->edit->file association->file types->选择.xml,然后在a ...

  6. linux+nginx+mysql+php高性能服务器搭建

    1.安装基础包 yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freet ...

  7. iOS设置textfield为密码框

    self.passWordTextField.secureTextEntry = YES;

  8. VC6.0 导入资源崩溃

    等我以后挣钱了一定买正版! 最近学习Win32编程,为了锻炼自己,在网上下载了一个VC6.0作为开发工具,应该是兼容性的问题吧,VC6 经常闹毛病. 今天导入资源的时候VC6出现崩溃的现象. 马上寻求 ...

  9. cocos2d-x游戏开发系列教程-中国象棋01-工程文件概述

    上一篇博文我们看到了象棋的效果图,这一张我们来看象棋代码的整体概述 让我们先对整个代码框架有个了解. 主目录: 主目录包含内容如上图: classes目录:业务代码 proj.win32:包括main ...

  10. Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)

    @version:Android4.3 API18 @author:liuxinming 概述               AdapterView继承了ViewGroup,它的本质是容器       ...