MATLAB多核并行计算使用方法

2023-05-16

MATLAB多核并行计算使用方法

对于在使用matlab中出现计算速度慢等情况,只有干等它跑出结果吗,可以使用多核进行并行计算加速matlab仿真的速度,好的东西当然有其局限性。

常用个人版CPU都是主打高频率,甚至超频来增加其工作速度,对于核心数不会特别追求,而对于工作站式的CPU,通常频率较低,核心和线程数低,而当这样的CPU来运行matlab程序,会出现如下问题
在这里插入图片描述
可以看到CPU的核心利用率很低,且大部分的内核都没有工作,只有少数的CPU在工作,这样的工作站对于matlab的运行速度甚至还没有个人版频率较高的CPU运行速度快,那这不是有力无处使,所以对面多核CPU,一定要使用其并行运算的能力。

matlab并行计算局限性

首先来介绍并行计算的局限性,matlab多核并行计算就是创建多N个启动并行工作池,然后将程序分成N个部分并行执行。下图可以看到我开启了40个并行工作池(前提是CPU的内核数大于40)。
在这里插入图片描述

从这上面可以理解,如果程序在运算过程中是前后关联的,这将不能用于并行计算。如何算作前后关联,举个例子:
在这里插入图片描述

在这里插入图片描述
第一张图是没有前后关联的,但是第二个存在着数组的前后关联,想象以下,如果第二种情况那去并行运算,当前循环结果依赖上一循环的结果,这种肯定无法拆分去做并行计算。

所以能进行并行计算很重要的要求是,循环可拆分,即每次循环的时候初始状态相同。

parpool和parfor

进行matlab并行计算主要依靠parpool和parfor,
parpool即是开启并行工作池,

parpool('Processes',16); %开启16个并行工作池

CoreNum=16; %设定机器CPU核心数量
if isempty(gcp('nocreate')) %如果并行未开启
    parpool(CoreNum); %开启16个并行工作池
end

delete(gcp) % 关闭并行池

parfor的使用方法和普通的for循环不太相同,主要区别是,parfor循环中有5类变量:
在这里插入图片描述

  1. loop variable(循环变量)
    在上图中是parfor后面的i,在循环中禁止给i(循环变量)赋值。

  2. Sliced input variable(切片变量)
    一般是数组,被各个处理器分割成一个个slice,首先要在parfor外申明该变量,比如上面的r=rand(1,10); 每次循环只能访问切片变量一个 位置,且固定不能重复,比如r(i)=temp1; 或者 r(i+1)=temp2;
    slice变量的下标一定要连续,例a(2*i)=temp;是不行的。

  3. Broadcast variable(广播变量)
    指外部变量,且在循环内未被重新赋值。如上面在外面定义的c。

  4. Reduction variable
    该变量遍历所有循环,并且跟运行结果无关。Matlab 会自动识别该类变量,并正确输出结果。如下例所示, Matlab 会按正确顺序输出 x2

x2 = [];
n = 10;
parfor i = 1:n
    x2 = [x2, i];
    i,
end

上面这段代码里, 因为将parfor拆分成很多分给并行计算池去计算,所以i 并不一定按照 1 到 10 的顺序输出,但 x2 的结果却必然是 1 到 10。

  1. temporary variable(临时变量)
    临时变量不需要有sliced变量的限制,使用更自由。
    但是在使用parfor时,这会弄混sliced变量和临时变量。临时变量在parfor里面申明,sliced变量是在parfor外面申明的。一定要有parfor会被拆分成很多份给并行计算池计算的概念,sliced变量能用是因为每个循环都只使用该变量的一个位置,而临时变量之所以能用是因为每次循环的开始就对其进行初始化,所以其初始状态相同,当然可以使用。例如下面b,每次parfor循环的初始状态都是1行4列的全0序列,所以当然能够使用。临时变量还一个最大的特点是只在parfor中有定义,在parfor外没有定义。
parfor i=1:10
    b=zeros(1,4);
    for j=1:4
        b(i)=i+1;
    end
    a(i)=b;   %a是sliced变量
end

一个简单的parfor并行计算程序。
在这里插入图片描述

parfor中变量的提取

因为parfor中定义的变量均是临时变量,在parfor外相当于未定义,所以需要有手段能将parfor中产生的数据提取出来。
比如里面定义的临时变量,可以将最后的结果赋值给已经在外面定义的切片变量,这样在外面可以使用,如下所示,proba可以是定义成数组,元组。这样每个parfor循环的数据都存到了proba中。

proba=cell(1,N)
parfor f = 1:N
    %now use proba{f} inside the loop
    proba{f}=(1/M)*ones(1, M);
    % rest of the code
end
%get proba from whatever iteration you want
pi_proba = proba{N};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB多核并行计算使用方法 的相关文章

  • [Qt] Linux环境下从源码编译Qt

    官网参考 xff1a Qt for Linux X11 Building from Source Qt 5 15 源码下载 xff1a Index of archive qt 5 15 5 15 0 submodules 这里使用的是各个模
  • Collections.max()方法不返回String类型的实际大小

    对于String类型的迭代器是按照字典序列排序的 xff0c 要让Collections max 方法返回实际的大小 xff0c 需要添加比较器 jdk8中对于Collections max xff09 方法有如下的说明 xff1a 样例
  • 简单三步,Github Pages自定义域名开启HTTPS

    登陆域名服务商后台增加 xff0c 域名解析记录 记录值格式为 xff1a username github io 登陆github xff0c 进行仓库设置 添加 自己的域名 xff0c 开启HTTPS
  • FtpClient.storeFile返回false解决方法

    原文地址为 xff1a FtpClient storeFile返回false解决方法 今天在利用FTP将客户端文件存储到服务器端时 xff0c 在调用ftpClient storeFile方法后 xff0c 总是返回false xff0c
  • 上班一个月,我的几点体会

    这篇博文其实在去年就已经在CSDN发过的 后来 xff0c 某次误操作不小心删除了 xff0c 今天找出来重新发一下 我是从3月1号开始上班的 xff0c 今天3月31号 xff0c 刚好一个月结束 xff0c 在这一个月里 xff0c 我
  • 我这一年写的博文

    总结2013 xff0c 展望2014 xff0c gt gt 我的2013年终总结 在苦与乐中成长 下面是我这一年所写的博客 xff0c 主要涉及C xff0c Net Framework xff0c SQL Server xff0c S
  • 我的2013年终总结——在苦与乐中成长

    写在前面 最近正好在三亚旅游 xff0c 空闲下来时 xff0c 便开始进行年终总结 由于去年年末较忙 xff0c 便错过了2012 年的年终总结 xff0c 所以本文将会对 2012 与 2013 两年一起进行总结 说说工作 学生 到 码
  • 走过2014,2015我将继续前行

    写在前面 一转眼 xff0c 一年时光就这么溜走了 在这辞旧迎新之际 xff08 这说法是不是很官方啊 xff0c 呵呵 xff01 xff09 xff0c 我将对即将过去的2014 年进行一番总结 xff0c 并对即将来临的 2015 年
  • C#使用随机数模拟器来模拟世界杯排名(二)

    接上一篇 xff1a C 使用随机数模拟器来模拟世界杯排名 一 C 使用随机数模拟器来模拟世界杯排名 一 斯内科的博客 CSDN博客 我们使用洗牌随机数算法来匹配世界杯对战国家 xff1a 新建洗牌随机数相关类RandomUtil 用于随机
  • Windows Server 2012 R2 服务器密码忘记问题

    解决方法 xff1a 1 准备好一张和当前Windows server 2012R2系统版本和位数相近 xff08 最好相同 xff09 的系统镜像光盘或者ISO文件 2 通过BIOS设置系统从光盘启动 出现安装系统的画面 xff0c 点击
  • Butterknife的替代者ViewBinding的简单使用

    Android自家的 xff0c 又可以省去findviewbyid xff0c 而且Butterknife上大神都已经推荐使用的 xff0c 还有什么理由不去改写呢 build gradle 开启viewBinding功能 android
  • matlab中删除矩阵中的某些行

    方法1 遍历所有行 xff0c 找到满足要求的行tag xff0c 然后调用A a 61 A span class token operator 61 span neighborhood s span class token punctua
  • MySQL 创建新用户并给授权指定的数据库权限

    首先创建用户 span class token comment 低版本数据库 span create user span class token string 39 用户民 39 span 64 span class token strin
  • 如何远程连接Linux服务器

    远程登陆linux xff0c 使用的是ssh协议 windows平台下有putty xff0c Xshell xff0c SecureCRT等工具来远程连接linux服务器 1 putty是一款非常轻量级的SSH连接工具 xff0c 可以
  • 抖音超火3D相册——魔方版(肖战壁纸图片)

    抖音超火3D相册 魔方版 xff08 肖战壁纸图片 xff09 闲来无事 xff0c 写了一个HTML5和CSS的肖战3D相册 xff0c 以下奉上效果图和源代码 xff08 PS xff1a 鼠标触碰可以显示内层六面体照片 xff0c 拖
  • 使用Kotlin开发Android

    Android Studio 中安装 Kotlin Plugin 打开Settings选择Plugins模块 xff0c 搜索Kotlin xff0c 然后选择安装 xff0c 这个需要一个下载的过程 xff0c 下载完安装成功后重启一下A
  • Scrum实践系列之三--敏捷教练的修炼之路

    敏捷教练与项目经理 在被奉为 项目管理圣经 的PMBOK中 xff0c 对项目经理在各阶段的职责有着清晰的界定 xff0c 比如项目经理制定规则 安排进度 监控执行中的各项风险并实时汇报状态 xff0c 等等 然而在敏捷的世界里 xff0c
  • 什么样的人当不好程序员?

    什么样的人当不好程序员 xff1f 2016 01 21 程序员之家 来源 xff1a 36Kr 译文 xff1a http 36kr com p 5042433 html 原文 xff1a https goo gl jLfUFq 软件蚕食
  • apt-get install E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing

    在进行apt get install时一直报错E Unable to fetch some archives maybe run apt get update or try with fix missing 尝试apt get update
  • 解决spring4连接redis集群报错:CLUSTERDOWN The cluster is down

    原因是redis出错了 解决方法如下 xff1a 1 使用命令检查REDIS状态 xff1a java redis redis7000 src redis trib rb check 192 168 249 230 7000 ERR Nod

随机推荐