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不被识别为切片变量。
a[i+1]
循环变量
- 如上例中的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个worker。
nmatlabpool依照指定配置打开,默认配置为
open confignamelocal。- 程序执行结束后,应该使用
matlabpool关闭worker。
close - 配置项的改动能够通过
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并行编程的更多相关文章
- Matlab并行编程方法1
相信很多朋友在利用matlab进行计算时,会遇到循环次数过大,或者是单次计算量过大的问题,比如需要计算的数值阵列数据量过大,利用传统的编程方式,跑一次程序几个小时,都要等的急死了是不是呢?如果遇到这种 ...
- C#并行编程系列-文章导航
菜鸟初步学习,不对的地方请大神指教,参考<C#并行编程高级教程.pdf> 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 C# ...
- Parallel并行编程初步
Parallel并行编程可以让我们使用极致的使用CPU.并行编程与多线程编程不同,多线程编程无论怎样开启线程,也是在同一个CPU上切换时间片.而并行编程则是多CPU核心同时工作.耗时的CPU计算操作选 ...
- .Net中的并行编程-2.ConcurrentStack的实现与分析
在上篇文章<.net中的并行编程-1.基础知识>中列出了在.net进行多核或并行编程中需要的基础知识,今天就来分析在基础知识树中一个比较简单常用的并发数据结构--.net类库中无锁栈的实现 ...
- .Net中的并行编程-3.ConcurrentQueue实现与分析
在上文<.Net中的并行编程-2.ConcurrentQueue的实现与分析> 中解释了无锁的相关概念,无独有偶BCL提供的ConcurrentQueue也是基于原子操作实现, 由于Con ...
- C#~异步编程再续~大叔所理解的并行编程(Task&Parallel)
返回目录 并行这个概念出自.net4.5,它被封装在System.Threading.Tasks命名空间里,主要提供一些线程,异步的方法,或者说它是对之前Thread进行的二次封装,为的是让开发人员更 ...
- .NET并行编程实践(一:.NET并行计算基本介绍、并行循环使用模式)
阅读目录: 1.开篇介绍 2.NET并行计算基本介绍 3.并行循环使用模式 3.1并行For循环 3.2并行ForEach循环 3.3并行LINQ(PLINQ) 1]开篇介绍 最近这几天在捣鼓并行计算 ...
- C#并行编程之数据并行
所谓的数据并行的条件是: 1.拥有大量的数据. 2.对数据的逻辑操作都是一致的. 3.数据之间没有顺序依赖. 运行并行编程可以充分的利用现在多核计算机的优势.记录代码如下: public class ...
- OpenMP共享内存并行编程详解
实验平台:win7, VS2010 1. 介绍 平行计算机可以简单分为共享内存和分布式内存,共享内存就是多个核心共享一个内存,目前的PC就是这类(不管是只有一个多核CPU还是可以插多个CPU,它们都有 ...
随机推荐
- setitimer()函数使用
setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个 ...
- MySQL分组数据
分组 理解分组能够看例如以下一个样例,首先我们打印出products表例如以下 从上面的表中能够看出.每一个vendor都有若干个产品,那么怎么一次统计每一个vendor有多少个产品呢? 这里就能够使 ...
- CentOS下Samba文件服务器的安装与配置
CentOS下Samba文件服务器的安装与配置 http://blog.csdn.net/limingzhong198/article/details/22064801 一.安装配置 1. 安装sam ...
- BZOJ 1704: [Usaco2007 Mar]Face The Right Way 自动转身机( 贪心 )
贪心...先枚举k, 然后从左往右扫一遍, 发现位置p的牛的状态不符合就将 [p, p + k ) 的牛都转身, 假如p + k - 1 已经超过了最右边牛的位置那这个k就不符合要求. 符合要求的就可 ...
- Java 判断多级路径是否存在,不存在就创建
第一种方案: /** * 是否创建目录 * @param path * @return */ public boolean isexitsPath(String path)throws Interru ...
- MySQL中innodb引擎分析(初始化)
MySQL的存储引擎是以插件形式工作的,这应该是MySQL的一大特色了吧! 依据<深入理解MySQL>的内容,5.1版本号时存储引擎的插件化都还不是彻底,确切的说是刚加入的特性.为MySQ ...
- P65
#include<stdio.h> #define N 6 main() { char c[N]; int i=0; for(;i<N;c[i]=getchar(),i++); pr ...
- 关于SSH框架设计的一些理解
近期在学习企业开发领域非常流行的SSH框架(Struts.Hibernate.Spring).因为之前有做过原生的Servlet+JSP的项目,所以在学习过程中我会跟原生开发模式进行对照,在这里我把自 ...
- BZOJ 2588: Spoj 10628. Count on a tree( LCA + 主席树 )
Orz..跑得还挺快的#10 自从会树链剖分后LCA就没写过倍增了... 这道题用可持久化线段树..点x的线段树表示ROOT到x的这条路径上的权值线段树 ----------------------- ...
- [置顶] c#验证码识别、图片二值化、分割、分类、识别
c# 验证码的识别主要分为预处理.分割.识别三个步骤 首先我从网站上下载验证码 处理结果如下: 1.图片预处理,即二值化图片 *就是将图像上的像素点的灰度值设置为0或255. 原理如下: 代码如下: ...