1  更高级的算法牵扯到更多重的循环和复杂的计算,尤其是现在人工智能的算法尤其如此。有些历史知识的人能够了解到,人工智能的很多基本算法其实近百年之前就有了,但是当时的计算机技术达不到去实现这些算法的要求,因此当今计算机的技术和当时已经不是在一个量级上面,因此人工智能等方案才有被重新提上日程,获得飞速的发展。也就是说,当人的思想超越当今的技术的时候我们只能等待,但是当当今的技术已经能够赶上人的思想,我们将会无所不能。

2  这一部分的内容主要是充分调用计算机的性能甚至是调用n台计算机形成集群形式使得算法能够快速的运算和提升整个程序的运行效能。

3  MATLAB2009之后,退出了并行计算工具箱(Parallel Computing Toolbox,PCT)和并行计算服务(Distibuted Computing Server,DCS),通过PCT和DCS用户可以实现基于多核平台、多处理器平台和集群平台的多种并行计算任务。PCT除了支持通用的上述功能之外还增加了GPU单元的支持。在MATLAB中,可以通过PCT、MEX文件等多种方式利用GPU来完成数据处理功能。

  首先要考虑的几个问题:

  1)并行计算的平台:

  单计算机MATLAB支持8个worker(2010b)版本、如果需要多台计算机组成集群,需要利用PCT和DCS共同完成,如果需要GPU运算,利用PCT、MEX文件技术来完成。

  2)并行计算的复杂程度:

  当然MATLAB来进行并行计算省去了很多繁琐的底层工作,相对快捷和简单。

  比如利用parfor循环,可以对for循环进行并行处理,利用SPMD可以对单个程序多组数据情况进行并行处理。这里要尽量选择MATLAB并行计算工具箱内置的并行结构。

  3)并行计算的数据通信问题:

  并行计算的两个目的:第一是提高计算效率,第二是提高计算机的利用率。第一个问题比较绒里理解就是比如单个问题CPU计算需要10个小时,那么采用10个CPU进行计算可能只需要1.5小时就可以完成。

相见恨晚的功能:profiler 代码分析器

4  profiler viewer,就会弹出代码分析器的窗口,然后再窗口输入想要测试的脚步等。就能得出段脚步那些地方用时最多

  可以据此来修正代码,改进代码

5  提升代码运算效率在代码编写上注意的几个问题:

  1)尽量用向量化来替代for和while循环的运算。

  

  采用向量化,对于大型的运算,时间要快于for循环或者while循环。

  2)还有一些经过优化的向量运算函数:

  all,判断数值阵列是否全部非零

  any,判断数值阵列是否有非零元素

  reshape,变化数值阵列的各维元素数据

  find,返回非零元素在阵列中的位置和其值

  sort,将数组按照升序排列

  sum,求数组的和

  repmat,扩展阵列

  is等函数。。。。

相见恨晚的功能:利用parfor对for循环进行并行(PCT工具箱中的函数)

6  在程序设计中,往往最小化计算量的代码都是循环。循环分为两种:一种是固定次数的循环,另一种叫非固定次数的循环(while),在MATLAB程序中,提高循环计算效率往往是提高程序计算效率的关键。对于固定次数的循环,一般有两种类型:一种是循环次数较大,单词循环的计算量较小;另一种是循环次数较小,单词循环计算量较大。采用MATLAB提供的parfor关键字就可以对这两种类型的循环实现多核或多处理器并行执行。

7  parpool 命令配置并行计算池(在2010版本之前的命令是matlabpool,后面版本都用这个命令来替代原先的命令)

8  不启动并行池,直接执行parfor程序不起作用。

9  当新欢次数设为100 000时,parfor执行的时间反而远远高于for循环的执行时间。这说明当循环次数较小的时候,通过parfor关键字对for循环体进行并行的效率很低。原因比较复杂,这里试着增加循环次数,观察parfor关键字对for循环体进行的效率变化,随着循环次数的增加,parfor关键字对for循环并行金酸的效率开始提高。在实际应用中,如果根据循环次数选择parfor关键字或者选择for关键字完成简单循环计算?由于MATLAB是解释型语言,而且已经封装了对选好进行并行计算的细节。很难通过分析和推导得到比较准确的结果。另外,不同的计算机对应的计算单元有很大差异,例如CPU个数和类型等,因此在parfor循环并行计算分析中,采用测试程序进行测试是十分必要的,这一点在前面已经得到充分的说明。这里,仍然沿用绘制并执行时间曲线的方法进行分析,通过测试程序绘制parfor的执行时间和for的执行时间随时间次数变化的曲线,人后对比两个时间曲线分析确定parfor关键字执行效率高于for关键字的临界点,即临街循环次数。

10  parfor的正确用法

  1)简约变量只能出现在简约赋值操作的表达式中

  2) 在同一个parfor循环内,对简约变量的操作一致

  3)如果简约变量的操作是相乘或者链接【】,变量X或出在操作符前面,或处在操作符后面,但是X的位置必须恒定不变。

  4)简约变量赋值应当满足结合律和交换律

11  parfor程序设计需要考虑的其他问题

  1)变量名称(函数优先)

  在MATLAB parfor循环代码块中,如果变量在循环之外没有定义或初始化,则MATLAB采用函数优先的原则,即MATLAB假定次变量为一函数名。

比如执行:

clear
N = 100
a = 1
parfor kk = 1:N
a = a+f(kk)
end

会报错。

  2)显式使用变量

  3)parfor中使用函数句柄

  在parfor中调用函数句柄时,需要注意只能采用feval函数调用。如果在parfor循环中使用函数句柄,则代码MATLAB提示报错。

比如只能执行

N = 10

B = @sin;

parfor ii = 1:100

  A2(ii) = feval(B,ii);

end

  4)在parfor中调用递归函数

相见恨晚的功能:parpool常用的命令

1)parpool('local',2); % 在已知worker数列的情况下,打开几个worker

2)parpool;  % 在默认条件下启动并行池,有几个worker打开几个workder

3)c = parcluster % 用句柄的形式条用并行池

>> c = parcluster
c =
Local Cluster Properties: Profile: local
Modified: false
Host: PC-201709010031
NumWorkers: 2
NumThreads: 1 JobStorageLocation: C:\Users\Administrator\AppData\Roaming\MathWorks\MATLAB\local_cluster_jobs\R2016b
RequiresMathWorksHostedLicensing: false Associated Jobs: Number Pending: 0
Number Queued: 0
Number Running: 0
Number Finished: 0
>> parpool(c)
Starting parallel pool (parpool) using the 'local' profile ...

4)poolobj = parpool;

    delete(poolobj) %删除并行池

5)启动和关闭并行池的一组组合方式

>> poolobj = parpool('local',2);
Starting parallel pool (parpool) using the 'local' profile ... connected to 2 workers.
>> delete(poolobj)
Parallel pool using the 'local' profile is shutting down. >> poolobj = parpool; % 默认打开全部worker
Starting parallel pool (parpool) using the 'local' profile ... connected to 2 workers.
>> delete(poolobj)
Parallel pool using the 'local' profile is shutting down.

  其中注意到,句柄poolobj有很多参数,当然这个也可以在MATLAB预设里面找到相关设置。但是这里对这些设置都是写啥东西,进行一下解释。当然可以用poolobj.内容,进行修改。

NumWorkers  组成并行池的workder个数

AttachedFiles 被发送到workers的文件和文件夹

Idle Timeout  闲置的并行池关闭前分钟表示的时间范围

Cluster 群集启动池,指定为群集对象 因为我们可以用集群化并行运算,如果没有集群,内容会显示本地

Connected 并行池中运行的族群

FevalQueue 要在并行池中运行FevalFutures队列

SpmdEnabled  是否可以运行SPMD代码

 相见恨晚的功能:SPMD并行结构

12  SPMD(Single Program,Multiple Data)是MATLAB支持的另外一种并行结构。其对应的使用方式即相同程序、不同数据。SPMD并行结构比parfor并行解耦股更加灵活,但也引入更加复杂的数据类型和操作方法。

13  假定用户有一批数据文件需要处理,而且每个文件的处理程序相同,在这种情况下可应用SPMD并行结构。在SPMD并行结构中,用户可以获得每个worker的编号labindex和总的worker数据numlabs。这两项信息在parfor并行结构中是无法获取的。通过labindex和numlabs用户可以控制每个worker执行的计算任务。因此SPMD并行结构给用户提供了更大的自由度,用户可以控制更多的并行计算的细节。

14  SPMD并行结构需要依赖MATLAB并行计算池执行,因此SPMD并行结构执行之前,用户必须配置和启动MATLAB并行计算池。和parfor一样,用户既可以启动本地并行计算池,也可以启动集群并行计算池。本地并行计算池管理的workder与MATLAB client在同一计算节点中执行,集群并行计算池管理的worker与MATLAB client一般不再同一计算节点中执行。

15  SPMD并行结构通过spmd关键字启动,如下:

spmd
a = rand(labindex);
end >> a
a =
Lab 1: class = double, size = [1 1]
Lab 2: class = double, size = [2 2]
>> class(a)
ans =
Composite

  可以看出a的形式比较奇怪,并不属于数值阵列,而是一种称之为composite的变量,关于composite变量,在后面会有详细结构。读者暂时可以认为a是一个元组阵列。

  在MATLAB并行程序设计中,worker有时也被成为lab。二者区别在于,lab是一个中特殊的worker,各个lab之间可以相互通信和同步。而各个worker之间一般是独立的。执行SPMD的工作单元成为lab,这也是labindex和numlabs命名的由来。

16  SPMD的使用方法

  spmd

    需要并行的主体

  end

Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-1的更多相关文章

  1. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-2

    1 MATLAB并行计算-从个人桌面到远程集群和云(陈伟/魏奋)视频摘录笔记 https://cn.mathworks.com/videos/parallel-computing-with-matla ...

  2. Matlab高级教程_第二篇:MATLAB和C#对应数据类型的讲解(多讲一点儿C#的矩阵运算)

    1. MATLAB对应C#的数据类型主要在引入的父类库MWArray当中.有如下对应规则 .NET TYPE MWArrayTYPE MATLAB Type System.Double MWNumer ...

  3. Matlab高级教程_第二篇:Matlab相见恨晚的模块_01_定时器

    MATLAB的定时器功能(timer函数): 1 从MATLAB6.5版本开始,MATLAB开始支持定时器.相对于传统的pause函数来说,定时器要强大的多,不仅可以等效实现pause的功能,还可以显 ...

  4. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-关于parfor的问题

    1 我们知道MATLAB支持并行运行一般有四种模式: 第一种模式:本机调用多核CPU性能并行运算 第二种模式:本机调用GPU性能并行运算 第三种模式:多计算机组成集群,调用集群CPU性能并行运算 第四 ...

  5. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_并行运算-利用GPU并行执行MATLAB程序

    1 MATLAB原文: 如果所有你想使用的函数支持GPU,你能够使用gpuArray把输入的数据传输到GPU,也能够唤起gather命令把传输值GPU的数据回收. 2 通过gpuDevice命令观察当 ...

  6. Matlab高级教程_第二篇:Matlab相见恨晚的模块_02_全局变量的妙用_遍历穿透

    1 比如我这边写了一个函数,这个函数中有一个变量作为参数,给定这个参数一个值,然后这个函数返回给我一个值.但是,我写这函数的时候,这个传参我不写到函数里面.可以通过全局变量的方式进行在外部穿透遍历. ...

  7. Matlab高级教程_第二篇:关于MATLAB转C#过程中遇到输出两组参数的问题

    1. 在matlab的m函数很可能遇到原函数[a,b] = func(a); 这样的两个输出参数. 2. 在观察C#生成后定义中我们发现: public MWArray HP(); public MW ...

  8. Matlab高级教程_第二篇:MATLAB和C#一些常用的矩阵运算方法的转换

    1.相关方法已经生产引用,直接调用的结果如下: 2. 相关调用代码如下: using System; using System.Collections.Generic; using System.Li ...

  9. Matlab高级教程_第二篇:关于MATLAB转C#过程中MWArray到C#数组,C#数组到MWArray相互转换

    Matlab传递数据时使用的方法,那么Matlab计算完成后在C#中应该怎么获取它的计算数据呢? 需要遵循两个基本步骤: 弄清楚Matlab函数传回的数据到底是什么格式?struct?cell?cha ...

随机推荐

  1. CentOS下的安装命令 安装Nginx 更新yum源 kali系统当中的软件管理命令(第五天)

    Linux下软件的安装:方式:yum/rpm/源码安装YUM安装(帮助管理员解决依赖关系):yum search mysqld 在源中搜索软件包yum install mysql-connector- ...

  2. Pycharm2020最新激活码|永久激活(附最新激活码和插件)

    最近很多人的Pycharm激活时间又过期了,后台很多人索要激活码,我就再把激活的方法汇和工具再梳理一次给大家. 最主要有两种激活方式(两种方式需要的激活码不同): 一.激活码激活: 一般一年多需要激活 ...

  3. CF_448D 二分

    给定n m k n和m为一个矩阵的行和列,都从1开始,矩阵的每个元素的值即为 i*j(行*列),求里面第k个数 还想找什么规律,发现虽然矩阵里面很有规律,但是n 和m在不断变化 根本不好找 其实元素从 ...

  4. LVM中逻辑卷的最大大小限制

    前言: 本文是对这篇博客Maximum Size Of A Logical Volume In LVM的翻译,敬请尊重原创和翻译劳动成果,那些随意转载的大爷们,好歹也自觉注明出处.谢谢! 英文原文地址 ...

  5. dateutil 2.5.0 is the minimum required version python

    问题重现 在运行以下代码时出现了该错误: import pandas as pd import numpy as np 原因与解决 原因是dateutil库版本低于2.5.0,卸载重装即可: pip ...

  6. promise 核心 几个小问题

    1.如何改变pending的壮体 抛出异常.pending变为rejected  // throw new Error('fail')  内部抛出异常也这样 reason为抛出的error resol ...

  7. promise核心技术 2.两种回调函数 js中error的处理

    抽空详细学习一下什么是回调函数(一个回调函数,也被称为高阶函数) 1.什么样的函数是回调函数 自己定义的(sittimeout不是自己定义的) 没有调用 自己执行 1.同步回调与异步回调函数 同步回调 ...

  8. UVA - 10118 Free Candies(免费糖果)(dp---记忆化搜索)

    题意:桌上有4堆糖果,每堆有N(N<=40)颗.佳佳有一个最多可以装5颗糖的小篮子.他每次选择一堆糖果,把最顶上的一颗拿到篮子里.如果篮子里有两颗颜色相同的糖果,佳佳就把它们从篮子里拿出来放到自 ...

  9. VC++ DLL 1 一点概念

    1.在写代码的时候,我们可能会经常要用到一些封装好的函数或者类,这些可能是C/C++的标准库提供的,也可能是由别人开发的非标准库,这个时候就会涉及到动态链接库或者静态链接库的使用了. 举个例子,做图像 ...

  10. windows和ubuntu双系统设置开机默认系统

    1.记住grub界面中windows的位置 我的界面如下:windows在第3行 2.选择进入ubuntu系统 3.打开终端,输入如下命令 sudo vim /etc/default/grub 4.看 ...