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,它们都有 ...
随机推荐
- jQuery 遍历ul li 添加 移除
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper
ZooKeeper - Perl bindings for Apache ZooKeeper Perl绑定用于 Apache ZooKeeper 监控 master/slave 需要使用zk的临时节点 ...
- 常见makefile写法
原文地址:blog.csdn.net/ghostyu/article/details/7755177 1.目标名称,摆脱手动设置目标名称 TARGET = $(notdir $(CURDIR)) al ...
- hdu1730 Northcott Game,Nim-sum
题解: 转化成求Nim-sum 每行黑白棋的初始间距作为每堆石子个数 假设当前为P态,则无论当前选手如何操作,下一个选手都能使其操作后的局面又变为P态. Nim-sum = 0,即P态. #inclu ...
- Git 文件状态的转换
很好低使用git 文件的状态转换的了解是非常重要的. 文件转换状态其实可以分为四种: untracked:未跟踪,此文件在工作区中,但并没有加入git库,不参与版本控制. 通过”git add”,”g ...
- django目录下的各文件
本文部分转载. 使用Python setup.py install命令从源代码安装完Django后,这些都会被拷贝到Python安装目录下的Lib/site-packages/django子目录中.之 ...
- 【项目分析】利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码
原文:[项目分析]利用C#改写JAVA中的Base64.DecodeBase64以及Inflater解码 最近正在进行项目服务的移植工作,即将JAVA服务的程序移植到DotNet平台中. 在JAVA程 ...
- asp.net用Zxing库实现条形码输出
原文 asp.net用Zxing库实现条形码输出 这个简单的问题,困扰了我将近两个小时,主要是再官方文档上没有找到demo,那只能用搜索引擎了,看看其他程序员写的程序,但是发现处处是坑,看了四五个例子 ...
- Tinyfool的2013年总结————在困惑和挣扎中试图前行
Tinyfool的2013年总结----在困惑和挣扎中试图前行 | Tinyfool的Blog Tinyfool的2013年总结----在困惑和挣扎中试图前行
- 查询SystemFeature的方法
查询SystemFeature的方法可以在adb shell下敲如下的命令: dumpsys package 然后搜feature关键字. 例如,我的平台的SystemFeature,如下所示: Fe ...