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,它们都有 ...
随机推荐
- Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音
原文 Windows Phone 8初学者开发—第15部分:在选中ListItem时播放声音 第15部分:在选中ListItem时播放声音 原文地址: http://channel9.msdn.co ...
- 翻转句子中单词的顺序 C语言
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开. 为简单起见,标点符号和普通字母一样处理. 比如将"I am a student"转化为&q ...
- Struts2 学习笔记17 I18N国际化
讲解一下国际化的内容,比如书有些大的网站可以一键切换语言,例如中英切换,这时候就会用到国际化.但是由于struts2大多数是用来写后台,国际化并不是十分重要,而且用国际化开发会减慢开发的速度,大家只要 ...
- 使用数组实现队列----《数据结构与算法分析---C语言描述》
一.h文件:my_que.h #ifndef _MY_QUE_H_ #define _MY_QUE_H_ struct QueRecord; typedef struct QueRecord* que ...
- Hadoop源代码导入Eclipse
须要进一步学习hadoop.须要看看内部源代码实现.因此须要将hadoop源代码导入都eclipse中,简单总结一下,详细过程例如以下: 首先确保已经安装了git.maven3.protobuf2.5 ...
- 项目优化经验分享(六)SVN冲突和处理
上一篇博客我们分享了新增需求的确定思想<站在全局看问题>.今天我们来分享项目开发中SVN冲突的解决经验:SVN冲突和处理! 引言 开发过项目的人都知道,公司开发一个项目都会使用到版本号控制 ...
- c语言:union,大小端
union: 不允许只用联合变量名作赋值或其它操作. 也不允许对联合变量作初始化赋值,赋值只能在程序中进行. 小端存储: 以字节为单位,低存低,高存高. 任何数据在内存中都是以二进制(1或着0)顺序存 ...
- c语言,结构体里面的函数
以linux-3.2内核代码为例,结构体里面的函数的用法: 例,在某驱动文件中,定义了一个平台设备驱动: static struct platform_driver s3c24xx_led_drive ...
- WinForm中嵌入WebBrowser,并且支持C#和JS方法的相互调用
纯粹WinForm界面不够友好,实现数据复杂度高的处理有些力不从心,所以看了看api以后决定用html来做. 我的wlw的代码插件不是很好用,大家凑合看吧 类前说明引用和权限 1: [Permissi ...
- eclipse中使用maven插件的时候,运行run as maven build的时候报错
-Dmaven.multiModuleProjectDirectory system propery is not set. Check $M2_HOME environment variable a ...