matlab 多核并行编程

在使用matlab处理大数据,编程需要注意两个问题:并行运算和释放内存。matlab也提供了并行计算的功能,甚至能用GPU加速。并行计算工具箱,叫做parallel computing toolbox.它的使用方法,可以从matlab的帮助获得。
Parallel Computing Toolbox(并行计算工具箱)中加入了并行循环parfor-loops,对于每一步可以独立于其他步的循环,计算效率可以有较大幅度的提高。以前简单的for循环for-loop是顺序的(sequentially)执行每一步循环体(statement),parfor-loop是通过将各个循环体分配到不同的节点上进行并行计算。所以parfor的要求是循环体之间相互独立,结果各不影响,Matlab的编辑器会自动帮你检查循环体的结果是否影响
当你初始化一个matlab进程时,这个进程被称为Matlab Client,它起着和用户交互和调度的作用。在并行计算工具箱中,通过matlabpool可以打开多个matlab进程,这些进程被称为Matlab Worker。并行循环parfor-loop的各个循环就是随机的分配到这些Matlab Worker上进行同时的计算。最后再返回给Matlab Client. 在一个多核桌面上可以本地同时运行四个 worker ,如果与 MATLAB Distributed Computing Server 集成,就可以使用集群中任意数量的机器作为worker了。
parfor就是paralle+for,也就是并行的for循环,怎么个并行法?简单理解就是,matlab会弄出几个虚拟的小pc,比如一个算i=1:50部分循环,一个算i=51:90部分循环,再来一个算i=91:100部分循环,当然数字是瞎编的,这主要想说matlab将一个大循环分成小块,然后这些小块并行计算,最后再合在一起。这样有一个问题,因为普通的循环是从i=1算到i=100,一个接一个算,如果下一次循环要依赖上一次循环怎么办?如果出现这种情况,那就不能用matlab的parfor了。用parfor的前提条件就是,循环的每次迭代独立,不相互依赖。

parfor关键字的使用

(1). 由于for关键字引导的循环通常为串行运行,如果改为parfor则可以由多个worker以并行方式执行。
(2). parfor可以将n次循环分解为独立不相关的m部分,然后将各部分分别交给一个worker执行。
(3). 循环执行的结果应该与n次循环执行的顺序无关。

parfor中的变量类型

(1). 简约变量
一般parfor中各次循环对应的运算应该相互独立,但简约操作可以在多次循环内同时对一个变量操作。这种变量称为简约变量。例如下方代码中a就是简约变量。

a = 0;
for i = 1:1000a = a+i;
end

简约操作包括+ - * .* & | [,] [;] {,} {;} min max union intersect。
同一个parfor循环对简约变量的操作必须一致,即必须是同一种简约操作符。而且与操作符的相对位置也必须一致。
简约变量赋值表达式应该满足结合律和交换律。* [] {}底层有特殊处理保证结果的正确性。

(2). 切片变量
parfor中可能需要读取或写入parfor之外的矩阵,读取写入位置与循环变量相关。这样就需要向worker传输大量的数据。
矩阵如果被Matlab识别为切片变量,则数据可以分段传输到各worker,提高传输效率。
切片变量矩阵的大小是不可在parfor中改变的,且为了保证Matlab识别正确,每次循环中只能读取由同一个索引值索引的切片,如a[i] a[i+1]同时出现则a不被识别为切片变量。

(3). 临时变量
作用域局限于parfor内,parfor结束后不存在。不影响parfor之前声明的同名变量。

(4). 循环变量
如上例中的i,表示当前循环的id。

(5). 广播变量
在parfor之前赋值,在parfor内只进行读取操作。

(6). 各种变量区分的例子
下例中,parfor中的tmp是临时变量,parfor结束后tmp的值依然是5,不受临时变量的影响。
broadcast是广播变量,每次循环中的值不变。
redued是简约变量,Matlab对其的值将分段由各worker计算后送回主进程处理。
sliced为切片变量,数据传输有优化提升。
i为循环变量

tmp = 5;
broadcast = 1;
reduced = 0;
sliced = rand(1, 10);
parfor i = 1:10tmp = i;reduced = reduced + i + broadcast;sliced(i) = sliced(i) * i;
end

worker配置
在运行程序之前,需要配置worker。否则如前文所说,parfor循环将以普通for循环的形式运行,无法并行。

启动和关闭并行计算功能

启动:

CoreNum=7; %调用的处理器个数
if matlabpool('size')<=0  %之前没有打开matlabpool('open','local',CoreNum);
else  %之前已经打开disp('matlab pool already started');
end

关闭:

matlabpool close

如果代码还在调试阶段,可以暂时不关闭matlabpool,反复开关浪费时间得很。另外,matlab关闭后,matlabpool也会自动关闭,所以如果不是海量代码,可以不用关闭的

一个使用parfor-loop的例子:

%example of parfor-loop
%本地worker数通常等于cpu的核数
matlabpool open local 2;
parfor i=1:1024
A(i) = sin(i*2*pi/1024);
end
plot(A);
matlabpool close;

这里讲述的方法仅针对多核机器做并行计算的情况。设机器的CPU核心数量是CoreNum双核机器的CoreNum2,依次类推。CoreNum以不等于核心数量,但是如果CoreNum小于核心数量则核心利用率没有最大化,如果CoreNum大于核心数量则效率反而可能下降。因此单核机器就不要折腾并行计算了,否则速度还更慢

matlab使用并行计算常出现的问题

(1). 用parfor的运算时间反而比用for的时间更长
parfor 对于执行时间很短的循环没有时间提升甚至会更慢,因为把任务分配到每一个并行线程里面也要时间,说白了就是核心程序耗时太短,分配任务以及matlab和worker之间的通信可能占据了主要时间。好比去坐飞机到一个地方,如果机场比较远,而且要去的目的地不是很远,虽然飞机节约下来时间,但是去机场路上的时间就把省下来的时间又耗出去了。要计算足够复杂的问题才能看出提速的效果,简单的计算反而更慢。
(2). matlab并行运算错误,透明度违例错误
Error using parallel_function. Transparency violation error. See Parallel Computing Toolbox documentation about Transparency.
可能循环程序中使用了clear, 可将需要clear掉的编程,使用空集来代替。比如
clear A 换成 A= []; 注意 A在程序中的位置。

下面给出查询CPU信息。
Linux 关于如何查询CPU核心数

(1). 查看逻辑CPU个数

cat /proc/cpuinfo |grep "processor"|sort -u|wc -l

(2). 由于有超线程技术有必要查看一下物理CPU个数

grep "physical id" /proc/cpuinfo|sort -u|wc -l
grep "physical id" /proc/cpuinfo|sort -u 

(3). 查看每个物理CPU内核个数

grep "cpu cores" /proc/cpuinfo|uniq

(4). 每个物理CPU上逻辑CPU个数

grep "siblings" /proc/cpuinfo|uniq

(5). 判断是否开启了抄超线程
如果多个逻辑CPU的”physical id”和”core id”均相同,说明开启了超线程
或者换句话说
逻辑CPU个数 > 物理CPU个数 * CPU内核数 开启了超线程
逻辑CPU个数 = 物理CPU个数 * CPU内核数 没有开启超线程
(6). 一次性查询所有信息

#!/bin/bash

physicalNumber=0
coreNumber=0
logicalNumber=0
HTNumber=0logicalNumber=$(grep "processor" /proc/cpuinfo|sort -u|wc -l)
physicalNumber=$(grep "physical id" /proc/cpuinfo|sort -u|wc -l)
coreNumber=$(grep "cpu cores" /proc/cpuinfo|uniq|awk -F':' '{print $2}'|xargs)
HTNumber=$((logicalNumber / (physicalNumber * coreNumber)))echo "****** CPU Information ******"
echo "Logical CPU Number : ${logicalNumber}"
echo "Physical CPU Number : ${physicalNumber}"
echo "CPU Core Number : ${coreNumber}"
echo "HT Number : ${HTNumber}"echo "*****************************"

下面给出判断电脑的系统性能,并开启并行运算

%--------------------------------------------------------------------------
clear;clc;close all%--------------------------------------------------------------------------
% Load an example dataset provided with matlab
load house_dataset
In = houseInputs';
Out = houseTargets';%--------------------------------------------------------------------------
% Find capabilities of computer so we can best utilize them.% Find if gpu is present
ngpus=gpuDeviceCount;
disp([num2str(ngpus) ' GPUs found'])
if ngpus>0lgpu=1;disp('GPU found')useGPU='yes';
elselgpu=0;disp('No GPU found')useGPU='no';
end% Find number of cores
ncores=feature('numCores');
disp([num2str(ncores) ' cores found'])% Find number of cpus
import java.lang.*;
r=Runtime.getRuntime;
ncpus=r.availableProcessors;
disp([num2str(ncpus) ' cpus found'])if ncpus>1useParallel='yes';
elseuseParallel='no';
end[archstr,maxsize,endian]=computer;
disp([...'This is a ' archstr ...' computer that can have up to ' num2str(maxsize) ...' elements in a matlab array and uses ' endian ...' byte ordering.'...])% Set up the size of the parallel pool if necessary
npool=ncores;% Opening parallel pool
CoreNum=npool; %调用的处理器个数
if matlabpool('size')<=0  %之前没有打开matlabpool('open','local',CoreNum);
else  %之前已经打开disp('matlab pool already started');
end

方法二,直接替换 %Opening parallel pool 下面的代码即可

% Opening parallel pool
if ncpus>1ticdisp('Opening parallel pool')% first check if there is a current poolpoolobj=gcp('nocreate');% If there is no pool create oneif isempty(poolobj)command=['parpool(' num2str(npool) ');'];disp(command);eval(command);elsepoolsize= poolobj.NumWorkers;disp(['A pool of ' poolsize ' workers already exists.'])end% Set parallel optionsparoptions = statset('UseParallel',true);tocend

本文参考:
http://blog.sina.com.cn/s/blog_6295beb60101dl8o.html
http://blog.csdn.net/yuzg86/article/details/7542056
http://www.ilovematlab.cn/thread-332708-1-1.html
http://zhidao.baidu.com/question/1367310944286874379.html
http://blog.csdn.net/caozhk/article/details/38234293?utm_source=tuicool&utm_medium=referral
http://blog.sina.com.cn/s/blog_866e7fa70101cv08.html
http://blog.renren.com/share/254666329/11478405569?from=0101010202&ref=hotnewsfeed&sfet=102&fin=6&ff_id=254666329
http://blog.sina.com.cn/s/blog_45eac6860100lzlk.html
http://www.cnblogs.com/dongzhiquan/archive/2012/02/16/2354977.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/247091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iOS核心动画之CALayer(1)

本文目录 一、什么是CALayer二、CALayer的简单使用 回到顶部一、什么是CALayer * 在iOS系统中&#xff0c;你能看得见摸得着的东西基本上都是UIView&#xff0c;比如一个按钮、一个文本标签、一个文本输入框、一个图标等等&#xff0c;这些都是UIView。 * 其实UIView之所以能显…

ASP.NET Core Web 应用程序系列(四)- ASP.NET Core 异步编程之async await

PS&#xff1a;异步编程的本质就是新开任务线程来处理。 约定&#xff1a;异步的方法名均以Async结尾。 实际上呢&#xff0c;异步编程就是通过Task.Run()来实现的。 了解线程的人都知道&#xff0c;新开一个线程来处理事务这个很常见&#xff0c;但是在以往是没办法接收线程里…

iOS核心动画之CALayer-layer的创建

本文目录 一、添加一个简单的图层二、添加一个显示图片的图层三、为什么CALayer中使用CGColorRef和CGImageRef这2种数据类型&#xff0c;而不用UIColor和UIImage&#xff1f;四、UIView和CALayer的选择五、UIView和CALayer的其他关系 * 上一讲已经说过&#xff0c;UIView内部默…

iOS核心动画之CALayer-隐式动画

本文目录 一、隐式动画属性二、position和anchorPoint 回到顶部一、隐式动画属性 * 在前面几讲中已经提到&#xff0c;每一个UIView内部都默认关联着一个CALayer&#xff0c;我们可用称这个Layer为Root Layer&#xff08;根层&#xff09;。所有的非Root Layer&#xff0c;也就…

多进程补充

多进程补充 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收.为什么主进程不在子进程结束后马上对其回收呢? 主进程与子进程是异步关系.主进程无法…

iOS核心动画之CALayer-自定义层

本文目录 一、自定义层的方法1二、自定义层的方法2 三、其他 自定义层&#xff0c;其实就是在层上绘图&#xff0c;一共有2种方法&#xff0c;下面详细介绍一下。 回到顶部一、自定义层的方法1 方法描述&#xff1a;创建一个CALayer的子类&#xff0c;然后覆盖drawInContext:方…

iOS核心动画之CoreAnimation

本文目录一、Core Animation简介二、Core Animation的使用步骤三、CAAnimation四、CAPropertyAnimation 回到顶部一、Core Animation简介 * Core Animation&#xff0c;中文翻译为核心动画&#xff0c;它是一组非常强大的动画处理API&#xff0c;使用它能做出非常炫丽的动画效果…

抽象类

当编写一个类时&#xff0c;我们往往会为该类定义一些方法&#xff0c;这些方法是用来描述该类的功能具体实现方式&#xff0c;那么这些方法都有具体的方法体。 也就是编辑一个类 这个类不是绝体的东西 是一个抽象的 例如 描述JavaEE工程师&#xff1a;行为&#xff1a;工作。 …

iOS核心动画 Core Animation2-CABasicAnimation

Core Animation2-CABasicAnimation 本文目录 一、平移动画二、缩放动画三、旋转动画四、其他 CABasicAnimation是CAPropertyAnimation的子类&#xff0c;使用它可以实现一些基本的动画效果&#xff0c;它可以让CALayer的某个属性从某个值渐变到另一个值。下面就用CABasicAnimat…

OpenStack Telemetry系统架构及实践

1. 概述 早期OpenStack的计量功能由Ceilometer项目负责&#xff0c;后来Ceilometer一分为四&#xff0c;每个项目负责一个方面的工作。不得不说这是OpenStack开发中的一个特色&#xff0c;比如Cinder和Neutron也是从早期的Nova中拆分出来的。 OpenStack Telemetry体系的架构如下…

产品经理十二时辰:内容过于真实,扎心了!

各大平台也纷纷借势&#xff1a; 《阿里十二时辰》 《优酷十二时辰》 《垃圾十二时辰》 《深圳十二时辰》 《北京十二时辰》 《考研人十二时辰》 …… 各种十二时辰刷爆朋友圈。 后台很多留言&#xff1a; 起点学院怎么没有出《产品经理十二时辰》呢&#xff1f;你这产品经理教…

iOS持久化存储-CoreData简介

本文目录 一、简介二、模型文件三、了解NSManagedObject对象四、CoreData中的核心对象五、代码实现六、打开CoreData的SQL语句输出开关七、创建NSManagedObject的子类 回到顶部一、简介 Core Data是iOS5之后才出现的一个框架&#xff0c;它提供了对象-关系映射(ORM)的功能&…

CSS3的滤镜filter属性

css3的滤镜filter属性&#xff0c;可以对网页中的图片进行类似Photoshop图片处理的效果&#xff0c;例如背景的毛玻璃效果、老照片&#xff08;黑白照片&#xff09;、火焰效果等。一、blur(px)高斯模糊 二、brightness(%)亮度 三、contrast(%)对比度 四、drop-shadow()阴影 注…

Core Foundation 与 cocoa Foundation框架区别

Core Foundation框架 (CoreFoundation.framework) 是一组C语言接口&#xff0c;它们为iOS应用程序提供基本数据管理和服务功能。下面列举该框架支持进行管理的数据以及可提供的服务&#xff1a; 群体数据类型 (数组、集合等) 程序包 字符串管理 日期和时间管理 原始数据块管…

JavaScript字符串、数组、对象方法总结

字符串方法 示例字符串&#xff1a; const str "hello,kitty,hello,vue "; 一、基本方法 charAt() 返回指定索引的字符 startsWith() 判断字符串是否以xxx开头&#xff0c;返回布尔值 endsWith() 判断字符串是否以xxx结尾&#xff0c;返回布尔值 padStar…

云盘同步本地文件和QQ聊天记录

腾讯微云同步本地QQ聊天记录和QQ接受的文件&#xff1b;手机版本可同步通讯录和手机相册和视频。 360云盘同步本地文件和定时自动备份本地文件&#xff1b; 金山快盘可以同步通讯录、短信、通话记录和手机本地文件&#xff1b;&#xff08;快盘仅适合同步手机信息&#xff0c…

Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战

Java生鲜电商平台-SpringCloud微服务架构高并发参数优化实战 一、写在前面 在Java生鲜电商平台平台中相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构&#xff0c;毕竟现在这是非常火的一门技术。 如果只是用户量很少的传统IT系统&#xff0c;使用Spring Cloud可…

Objective-C Runtime的数据类型

转自&#xff1a;http://www.cnblogs.com/whyandinside/archive/2013/02/26/2933552.html Class Objective-C是支持反射的&#xff0c;先来了解一下其如何表达一个类。在Objective-C的Runtime中有个类型是Class&#xff08;只在Runtime环境中使用&#xff09;&#xff0c;用来表…

CSS3制作文字背景图

文字带上渐变色&#xff0c;或者说让文字透出图片。这些效果 CSS 属性也可以完成。 方法一、利用CSS3属性mix-blend-mode:lighten;实现 使用 mix-blend-mode 能够轻易实现&#xff0c;我们只需要构造出黑色文字&#xff0c;白色底色的文字 div &#xff0c;叠加上图片&#xff…

HTTP基本认证

HTTP质询/响应认证框架 HTTP提供了一个原生的质询/响应框架&#xff0c;简化了对用户的认证过程。HTTP的认证模型如图所示. Web服务器接收到一条HTTP请求报文时&#xff0c;服务器没有直接响应请求的资源&#xff0c;而是以一个“认证质询”进行响应&#xff0c;要求用户提供一…