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. 基于springmvc的简单增删改查实现---中间使用到了bean validation

    package com.kite.controller; import java.util.HashMap; import java.util.Map; import javax.validation ...

  2. [置顶] Android4.x对长按电源键(挂断键)和短按电源键(挂断键)的详细处理流程

    1. 简介 Android4.x在Framework的PhoneWindowManager对Power(KeyEvent.KEYCODE_POWER)和Home(KeyEvent.KEYCODE_HO ...

  3. 求知成瘾+逻辑成瘾+博识的无知,你中枪没?我感觉中枪了 - 外野 - Stage1st - Powered by Discuz!

    求知成瘾+逻辑成瘾+博识的无知,你中枪没?我感觉中枪了 - 外野 - Stage1st - Powered by Discuz! 求知成瘾 求知欲似乎是人们的本能,尤其「好学」这个词被定义成天生的褒义 ...

  4. 凡客副总裁崔晓琦离职 曾负责旗下V+商城项目_科技_腾讯网

    凡客副总裁崔晓琦离职 曾负责旗下V+商城项目_科技_腾讯网 凡客副总裁崔晓琦离职 曾负责旗下V+商城项目 腾讯科技[微博]乐天2013年09月18日12:44 分享 微博 空间 微信 新浪微博 邮箱 ...

  5. img标签中的src为php文件

    先来看个例子: <img src="imgcode.php" alt="看不清楚,换一张" style="cursor: pointer;&qu ...

  6. 基于visual Studio2013解决C语言竞赛题之0610冒泡排序函数

      题目

  7. sharepoint 2013 根据网站模版创建网站,并赋值网站权限 create a site by custom site template

    通过程序,根据网站模版,创建新的网站 private void CreateSiteBySiteTemplate() { SPSecurity.RunWithElevatedPrivileges(de ...

  8. php 抓取天气情况 www.weather.com.cn

    <?php print_r(getweather(101120501)); /** * Server 天气情况获取函数 * @param unknown $city */ function ge ...

  9. 使用MVC模式开发一简单的销售额查询系统

    与上一篇比较,只改变了index.jsp文件中form的提交路径 <form action="ShowServlet" method="post"> ...

  10. EasyUI - According 分类列表

    效果: html代码: <div id="aa" class="easyui-accordion" style="width: 300px; h ...