matlab 并行计算 parfor

2023-05-16

转自:

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的进程。

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:nargin
	       eval([inputname(i),'=varargin{i};']);  
	       if i==2
	            save('-mat',fname,inputname(i));
	       else
	           save('-mat',fname,inputname(i),'-append');
	       end        
	end

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

	parfor ii = 1:4
	x = 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:4
	m=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即可。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab 并行计算 parfor 的相关文章

  • 百度2014校园招聘笔试题武汉站三道算法设计题

    百度2014校园招聘笔试题武汉站三道算法设计题 1 给定任意一个整整数 求比这个数大且最小的不重复数 就是相邻两位不同 xff0c 例如1231 如1101就是重复数 解 xff1a 思路 xff1a 每次将给定的值加上1 xff0c 然后
  • 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾 xff0c 我们称之为数组的旋转 输入一个递增排序的数组的一个旋转 xff0c 输出旋转数组的最小元素 例如数组 3 4 5 1 2 为 1 2 3 4 5 的一个旋转 xff0c 该数
  • 斐波那契数列

    题目描述 大家都知道斐波那契数列 xff0c 现在要求输入一个整数n xff0c 请你输出斐波那契数列的第n项 n lt 61 39 思路 xff1a 用非递归的方法 xff0c 即遍历的方法去实现斐波拉切数列 代码如下 xff1a pub
  • 跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶 xff0c 也可以跳上2级 求该青蛙跳上一个n级的台阶总共有多少种跳法 思路 xff1a 对于本题 前提只有 一次 1阶或者2阶的跳法 a 如果两种跳法 xff0c 1阶或者2阶 xff0c 那么假定
  • 变态跳台阶

    题目描述 一只青蛙一次可以跳上1级台阶 xff0c 也可以跳上2级 它也可以跳上n级 求该青蛙跳上一个n级的台阶总共有多少种跳法 思路 xff1a 关于本题 xff0c 前提是n个台阶会有一次n阶的跳法 分析如下 f 1 61 1 f 2
  • 矩形覆盖

    题目描述 我们可以用2 1的小矩形横着或者竖着去覆盖更大的矩形 请问用n个2 1的小矩形无重叠地覆盖一个2 n的大矩形 xff0c 总共有多少种方法 xff1f 思路 xff1a 依旧是斐波那契数列 2 n的大矩形 xff0c 和n个2 1
  • 数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent 求base的exponent次方 思路 xff1a 判断该整数的负数和正数情况 代码如下 xff1a public class Solution publ
  • 调整数组顺序使奇数位于偶数前面

    题目描述 输入一个整数数组 xff0c 实现一个函数来调整该数组中数字的顺序 xff0c 使得所有的奇数位于数组的前半部分 xff0c 所有的偶数位于位于数组的后半部分 xff0c 并保证奇数和奇数 xff0c 偶数和偶数之间的相对位置不变
  • 链表中倒数第k个结点

    题目描述 输入一个链表 xff0c 输出该链表中倒数第k个结点 思路 xff1a 倒数第k个结点 xff0c 则表示是第n k 43 1个结点 代码如下 xff1a public class ListNode int val ListNod
  • 反转链表

    题目描述 输入一个链表 xff0c 反转链表后 xff0c 输出链表的所有元素 思路 xff1a 用一个pre指向前一个结点 xff0c 用 next指向当前结点 next 61 head next head next 61 pre pre
  • 程序员面试题精选100题(46)-对称子字符串的最大长度

    程序员面试题精选100题 46 xff0d 对称子字符串的最大长度 题目 xff1a 输入一个字符串 xff0c 输出该字符串中对称的子字符串的最大长度 比如输入字符串 google xff0c 由于该字符串里最长的对称子字符串是 goog
  • 合并两个排序的链表

    题目描述 输入两个单调递增的链表 xff0c 输出两个链表合成后的链表 xff0c 当然我们需要合成后的链表满足单调不减规则 思路 xff1a 先创建一个头结点 head xff0c head val为 1 然后创建一个指向该头结点的指针p
  • 树的子结构

    题目描述 输入两棵二叉树A xff0c B xff0c 判断B是不是A的子结构 xff08 ps xff1a 我们约定空树不是任意一个树的子结构 xff09 思路 xff1a 可以先判断A和B的父结点是不是一样的 xff0c 如果一样进入递
  • 二叉树的镜像

    题目描述 操作给定的二叉树 xff0c 将其变换为源二叉树的镜像 输入描述 二叉树的镜像定义 xff1a 源二叉树 8 6 10 5 7 9 11 镜像二叉树 8 10 6 11 9 7 5 思路 xff1a 根节点下面的左子树和右子树分别
  • 顺时针打印矩阵

    题目描述 输入一个矩阵 xff0c 按照从外向里以顺时针的顺序依次打印出每一个数字 xff0c 例如 xff0c 如果输入如下矩阵 xff1a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1
  • 包含min函数的栈

    题目描述 定义栈的数据结构 xff0c 请在该类型中实现一个能够得到栈最小元素的min函数 思路 xff1a 用一个栈去存储所有元素 然后一个一个去比较 将小的那个值放到变量min里面 xff1b 代码如下 xff1a import jav
  • 栈的压入、弹出序列

    题目描述 输入两个整数序列 xff0c 第一个序列表示栈的压入顺序 xff0c 请判断第二个序列是否为该栈的弹出顺序 假设压入栈的所有数字均不相等 例如序列1 2 3 4 5是某栈的压入顺序 xff0c 序列4 xff0c 5 3 2 1是
  • 从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点 xff0c 同层节点从左至右打印 思路 xff1a 意思就是按层遍历然后放到一个list集合里面去 xff0c 所以创建一个队列每次把一层的结点放进去 xff0c 然后一个一个判别是否有left结点
  • 二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则输出Yes 否则输出No 假设输入的数组的任意两个数字都互不相同 思路 xff1a 因为是二叉搜索树 xff0c 所以根节点的左子树小于右子树 x
  • 二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 思路 xff1a 用先序遍历递归的思想去实现 xff0c 到最后叶节点如果不能

随机推荐

  • 复杂链表的复制

    题目描述 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针指向任意一个节点 xff09 xff0c 返回结果为复制后复杂链表的head xff08 注意
  • ubantu20下python安装和卸载

    查看系统版本 python3 version 卸载ubantu上的python版本 sudo apt get remove python3 卸载python3及其依赖 sudo apt get remove auto remove pyth
  • [转]DBSCAN聚类算法——机器学习(理论+图解+python代码)

    原文链接 xff1a https blog csdn net huacha article details 81094891 一 前言 二 DBSCAN聚类算法 三 参数选择 四 DBSCAN算法迭代可视化展示 五 常用的评估方法 xff1
  • 求1+2+3+...+n

    题目描述 求1 43 2 43 3 43 43 n xff0c 要求不能使用乘除法 for while if else switch case等关键字及条件判断语句 xff08 A B C xff09 思路 xff1a 用递归 xff08
  • 把字符串转换成整数

    题目描述 将一个字符串转换成一个整数 xff0c 要求不能使用字符串转换整数的库函数 思路 xff1a 设置两个标志位 一个tag 为1表示是正数 xff0c 为0表示是负数 xff0c 一个index xff0c 为 43 则index是
  • 数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n 1的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字是重复的 也不知道每个数字重复几次 请找出数组中任意一个重复的数字 例如 xff0c 如果输入长度为7的数组 2 3 1
  • 表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值 xff08 包括整数和小数 xff09 例如 xff0c 字符串 34 43 100 34 34 5e2 34 34 123 34 34 3 1416 34 和 34 1E 16 34 都
  • 字符流中第一个不重复

    题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符 例如 xff0c 当从字符流中只读出前两个字符 34 go 34 时 xff0c 第一个只出现一次的字符是 34 g 34 当从该字符流中读出前六个字符 google 34 时
  • 链表中环的入口结点

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 一个链表中包含环 xff0c 请找出该链表的环的入口结点 思路 xff1a 设置两个引用 A和B 指向头 xff0c 然
  • 删除链表中重复的结点

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 在一个排序的链表中 xff0c 存在重复的结点 xff0c 请删除该链表中重复的结点 xff0c 重复的结点不保留 xf
  • 二叉树的下一个结点

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 给定一个二叉树和其中的一个结点 xff0c 请找出中序遍历顺序的下一个结点并且返回 注意 xff0c 树中的结点不仅包含
  • 按之字形顺序打印二叉树

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 import java util ArrayList import java util Queue import java uti
  • 对称的二叉树

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 请实现一个函数 xff0c 用来判断一颗二叉树是不是对称的 注意 xff0c 如果一个二叉树同此二叉树的镜像是同样的 xff0c
  • 【unix】unix环境高级编程

    文章目录 1 UNIX基础知识1 基本知识2 文件和目录3 输入和输出4 程序和进程5 出错处理6 用户标识7 信号8 时间9 系统调用和库函数 标准化和实现1 标准化 ISO C POSIX Single UNIX Specificati
  • 序列化反序列二叉树

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 请实现两个函数 xff0c 分别用来序列化和反序列化二叉树 思路 xff1a 序列化的时候遇到null的结点就补充 xf
  • java 判断字符串是否为null的四种方法:

    以下是java 判断字符串是否为空的四种方法 xff1a 方法一 最多人使用的一个方法 直观 方便 但效率很低 if s 61 61 null s equals 34 34 方法二 比较字符串长度 效率高 是我知道的最好一个方法 if s
  • spring-boot推送实时日志到前端页面显示

    个人技术网站 欢迎关注 网上有很多后台推送日志到前端页面的例子 xff0c 这里我也借鉴了别人的做法 稍加改进一下 以前做前端页面显示日志一般都会想到ajax轮询去做 xff0c 这样太耗费服务器资源了 xff0c 性能也很差 使用长连接来
  • [Ubuntu][Android]快速配置Android USB设备的权限

    1 复制如下内容到新建文本文件中 xff0c 并保存为51 android rules SUBSYSTEM 61 61 34 usb 34 ENV DEVTYPE 61 61 34 usb device 34 MODE 61 34 0666
  • shell脚本一次性将tab制表符改为4空格的方法

    问题描述 今天需要修改一些bash脚本 xff0c 因为考虑到pycharm里面能够直接写 xff0c 而我用pycharm比较多 xff0c 所以直接用pycharm写了 xff0c 由于改的那个bash脚本是别的同事写的 xff0c 里
  • matlab 并行计算 parfor

    转自 xff1a http www xiongfuli com E5 B9 B6 E8 A1 8C E8 AE A1 E7 AE 97 2016 05 Matlab Parfor html 在Matlab下使用parfor实现多核并行计算