转自:

http://www.xiongfuli.com/%E5%B9%B6%E8%A1%8C%E8%AE%A1%E7%AE%97/2016-05/Matlab-Parfor.html

在Matlab下使用parfor实现多核并行计算 2016.05.18

导师这几天要回国进行工作检查了,可是博主的实验还没有做完,而且每一个实验都特别地耗时(一个张量分解需要是5个小时),可是CPU和内存的利用率没有达到100%,听师兄说matlab里面内置了parfor可以做一些并行的运算,可能速度会快一些于是就用了一下。

parfor的简介

parfor就是paralle+for,也就是并行的for循环,它的大致意思是会给你自动构造几个matlab的执行进程,并行地处理你的数据。这里的数目最大的数值是你的CPU的核数,比如说楼主的电脑是四核的,在任务管理器里面就看到了4个matlab的进程。

当你需要简单计算的多次循环迭代时,例如针对不同的参数对实验结果的影响等,parfor循环就很有用。parfor将循环迭代分组,那么每个worker执行迭代的一部分。当迭代耗时很长的时候parfor循环也是有用的,因为workers可以同时执行迭代,但是当你的CPU的利用率如果已经达到了100%,此时你这种并行是没有意义的,速度不会加快的。另外这个博客上指出了Matlabparfor的使用条件即:

  1. 大量的简单计算的循环。
  2. 大量或少量的复杂计算的循环
  3. 各个任务之间不会出现数据的依赖,比如说循环内部的变量之间不要存在数据传递等等。

parfor的使用

假如说函数ff是一个非常耗时的函数,然后你想把矩阵AA中的每一个元素传递到函数ff中进行运算,运算结果保存在矩阵BB里面,那么你可以这样操作。

 parfor i = 1:length(A)B(i) = f(A(i));end

这样矩阵A各个元素的计算就可以并行操作而且可以节省很多时间。

在parfor里面保存数据文件

Matlab默认是不允许在parfor里面使用save函数的,这个是因为:

Transparency is violated by the SAVE command because in general MATLAB cannot determine which variables from

the workspace will be saved to a file.

也就是说Matlab不知道要把工作区里面的那个数据变量保存到内存中,但是在有些时候我们想保存一些中间的结果,那这个就很难办了。一种解决方案是我们把保存文件的操作放在另外一个函数里面进行操作,然后在当前的parfor循环体里面调用这个函数即parsave,另外一种方法是我们不适用save命令自己实现保存操作。

使用parsave保存数据

前面我们讲到了我们把把保存文件的操作放在另外一个函数里面进行操作,然后在当前的parfor循环体里面调用这个函数,我们把这个函数起名为即parsave,它的具体代码如下:

 function parfor_save(varargin)fname=varargin{1};    for i=2:nargineval([inputname(i),'=varargin{i};']);  if i==2save('-mat',fname,inputname(i));elsesave('-mat',fname,inputname(i),'-append');end        end

我们在parfor里面采用下面的方式进行调用:

 parfor ii = 1:4x = rand(10,10);y = ones(1,3);parsave(sprintf('output%d.mat', ii), x, y);end

但是在新版的matlab比如说matlab 2015b里面如果直接使用会抛出这个错误

Error using parsave (line 27)

Transparency violation error.

See Parallel Computing Toolbox documentation about Transparency

同样是Workspace Transparency的的错误,这个是因为在新版的matlab里面对Workspace Transparency的检查更加严格了,如果我们想保存数据可以自己实现save函数操作。

自己实现save函数进行数据保存

这个意思就是指我们自己调用matfile 函数实现save的操作,在matlab里面敲help matfile我们可以得到下面的doc

matfile Save and load parts of variables in MAT-files.

MATOBJ = matfile(FILENAME) constructs an object that can load or save

parts of variables in MAT-file FILENAME. MATLAB does not load any data

from the file into memory when creating the object. FILENAME can

include a full or partial path, otherwise matfile searches along the

MATLAB path. If the file does not exist, matfile creates the file on

the first assignment to a variable.

MATOBJ = matfile(FILENAME,’Writable’,ISWRITABLE) enables or disables

write access to the file. ISWRITABLE is logical TRUE (1) or FALSE (0).

By default, matfile opens existing files with read-only access, but

creates new MAT-files with write access.

Access variables in MAT-file FILENAME as properties of MATOBJ, with dot

notation similar to accessing fields of structs. The syntax for loading

part of variable VARNAME into variable SMALLERVAR is

SMALLERVAR = MATOBJ.VARNAME(INDICES)

Similarly, the syntax for saving NEWDATA into variable VARNAME is

MATOBJ.VARNAME(INDICES) = NEWDATA

Specify part of a variable by defining indices for every dimension.

Indices can be a single value, an equally spaced range of increasing

values, or a colon (:), such as:

MATOBJ.VARNAME(100:500, 200:600)

MATOBJ.VARNAME(:, 501:1000)

MATOBJ.VARNAME(1:2:1000, 80)

即我们可以用matfile命令去加载或者写一个mat文件,具体的变量使用方法和matlab的struct一样,我们使用matfileparfor里面保存文件的具体代码如下:

 parfor ii = 1:4m=matfile(sprintf('output%d.mat', ii),'writable',true)x = rand(10,10);y = ones(1,3);m.x=x;m.y=y;end

这样就可以实现在并行环境下的save操作了。但是这样就不会violate workspace Transparency了吗?个人感觉这个可能在以后的版本中同样会被封,先这样使用再说吧。

Matlab 2014版本下使用Parfor保存的变量为空

朋友最近反应说在Ubuntu平台下的Matlab 2014版本上运行parfor 保存的变量居然为空。其实这个是一个matlab的bug。在StackOverflow(https://stackoverflow.com/questions/19981111/matlab-variables-empty-after-parfor-loop)上有相关 的解决方案即:采用matlab -nodisplay -nodesktop -r "scriptname" 命令来运行matlab即可。

matlab 并行计算 parfor相关推荐

  1. matlab并行计算 parfor

    CoreNum=6; %设定机器CPU核心数量 parpool(CoreNum); Starting parallel pool (parpool) using the 'local' profile ...

  2. 23. matlab并行计算原理以及parpool函数

     声明: 因电脑问题, 只做记录,以后尝试. 出处: Matlab并行运算 - wenyusuran的专栏 - CSDN博客 https://blog.csdn.net/wenyusuran/arti ...

  3. matlab parfor不能用,matlab中parfor函数

    google中输入matlab parfor,你将得到足够多的资料来了解这是个什么东西,如果你耐心,建议去研究研究matlab 帮助中对parfor的说明.这里我只大概讲一下parfor.parfor ...

  4. Matlab的parfor并行编程

    Matlab的parfor并行编程 通常消耗最多计算资源的程序往往是循环.把循环并行化,或者优化循环体中的代码是最常用的加快程序运行速度的思路. Matlab提供了parfor关键字,可以很方便的在多 ...

  5. Matlab的parfor的使用条件

    Matlab的parfor的使用条件 « 阅微堂 var duoshuoQuery = {"short_name":"zhiqiang","sso&q ...

  6. Matlab并行计算parpool使用方法+代码

    parfor 是并行循环计算多重循环的嵌套,只能在其中一层循环使用parfor并行计算,因为parfor就是让几个worker同时干活,比如一个循环中,i=1:30,那么一个worker做i=1:5, ...

  7. Matlab并行计算(新手)

    Matlab并行计算 1 Matlab不会自动开启多核并行 2 Matlab并行过程--parpool 3 电脑核数与parpool的关系 4 说明--matlabpool与partool 5 并行实 ...

  8. matlab并行计算实例,Matlab并行计算示例(一)

    使用Matlab实现算法较为简单,但是涉及for循环时,效率比不上C++.对于一个多核处理器,不开多核并行计算,实在是对不住Matlab自带的并行计算功能.parfor循环较为简单,但是它对for循环 ...

  9. matlab spmd,matlab并行计算命令

    1. matlab仿真模型怎么并行计算 以单台双核计算机为例. 首先打开MATLAB命令窗口,输入matlabpool open就OK了.这样,就相当于将一台计算机的两个核心,当做两台机器用啦. 接下 ...

最新文章

  1. 北大数学天才许晨阳,回国效力6年后,为什么又去了美国任教?
  2. CVPR2019 日程安排
  3. 亚马逊aws 服务器删除_AWS推出Apache Airflow全托管工作流MWAA
  4. IEnumerableT 接口主要成员
  5. 【Python】python基础语法 编码
  6. 安装,激活(不更新升级)Navicat premium12.0.24(12.0.18)
  7. 苹果手机Windows平台投屏神器airplayer,方便的使用苹果手机投屏演示
  8. Kali系统2022VM版本的安装
  9. Pandas基础:列方向分组变形
  10. 平面设计中的抠图技法与修图思路
  11. 安卓网页自动填充_敏感插件限时显示提供!自动填写网盘提取码,且用且珍惜...
  12. 并发问题中的乐观锁和悲观锁
  13. android 手电筒开关,Android实现手电筒电源键关闭功能
  14. VoIP通话之SIP协议
  15. android屏幕适配sw规则
  16. Linux输入法平台
  17. 小米小贷业务生变,消费贷业务并入小米消金
  18. 【高并发】多线程之无锁队列
  19. 重要 APT攻击事件的特征枚举
  20. MySQL手动注入步骤

热门文章

  1. 广州仙村中学2021高考成绩查询,广州市增城区中新中学、仙村中学、永和中学2019年中考录取分数线...
  2. 完美解决:找不到msvcr120.dll,需要重新安装服务
  3. Android 使用高德地图定位(Google play)国外定位
  4. Python 中的位运算-基础知识
  5. Ubuntu16.04下qq安装历程
  6. 两位一体数码管引脚图_一种智能LED数码管的制作方法
  7. 大数据应用实践1:基于开源架构的股票行情分析与预测
  8. docker 安装后无权限问题
  9. 区块链共识机制及优缺点
  10. 坐头等舱会比坐经济舱先到达目的地吗