matlab parfor save怎么查看几核

matlab(4)
当matlab计算量很大,重复独立的循环计算很多的时候,我们可以使用matlab的并行计算,这里我先试验了parfor并行计算。以下代码仅适合新版的matlab,改编自《实战matlab之并行程序设计》。
启动代码:
function [pool] = startmatlabpool(size)
isstart = 0;
if isempty(gcp('nocreate'))==1
isstart = 1;
if isstart==1
if nargin==0
pool=parpool('local');
pool=parpool('local',size);%matlabpool('open','local',size);
pool=parpool('local');%matlabpool('open','local');
size = pool.NumW
display(ce.message);
display(strcat('restart. wrong
size=',num2str(size)));
display('matlabpool has started');
if nargin==1
startmatlabpool(size);
startmatlabpool();
关闭代码:
function [] = closematlabpool
if isempty(gcp('nocreate'))==0
delete(gcp('nocreate'));
测试代码:
pool = startmatlabpool(4);
data = cell(1,N);
for kk = 1:N
data{kk} = rand(M);
display(strcat('datasize:',num2str(N*M*M/),'M doubles'));
parfor ii = 1:N
c1(:,ii) = eig(data{ii});
display(strcat('parafor:',num2str(t1),'seconds'));
for ii = 1:N
c2(:,ii) = eig(data{ii});
display(strcat('for:',num2str(t2),'seconds'));
datasize:9.5367M doubles
parafor:1.6411seconds
for:3.908seconds
Parallel pool using the 'local' profile is shutting down.
可以看出parfor计算速度快了一半。
问答1:能否汇总各个线程的数据?
在openMP中也有这个问答:
for i = 1 : 1000
sum = sum +
如果是并行的话,每个A在线程中都有自己的一份拷贝,那么最后得到的A是不可预计的。
openMP的解决方法是增加了reduction子句:
#pragma omp parallel for reduction(+: sum)
for ( i = 1; i & 1001; i++ )
&&&&&&& sum +=
这样sum就是1-1000的和。
在matlab中,matlab自己会默认把sum的加法设置为reduction加法,称为简约/规约操作,反正不进行这个操作的话也没有其他意义。ORZ
startmatlabpool(4)
parfor i = 1:1000
sum = sum +
结果:sum=500500
事实上可以进行连续操作的操作符都支持简约操作,比如*,.*,+,-,&,|,[,expr]等等。
不过简约操作有很多陷阱,所以简化并行操作和增加一致性是非常必要的。
问答2:parfor的变量有什么讲究?
其实没什么讲究,比起openMP来parfor要简单的多,好用说不上,但是方便简单的并行操作。所有的变量直接用就行了,书上的各种变量种类都是唬人的,不过请注意非简约操作情况下答案是否正确,以及不要随便修改输入变量(修改后的结果无法预计)。
问答3:parfor语句作用域能用break吗?
答案是不能。这个不能在特定情况下直接退出,就是说一旦运行就要执行下去。另外parfor是最低端的并行语句,在作用域内部也不能使用spmd,parfor嵌套,不过可以使用含有parfor的函数。
问答4:什么时候使用parfor
其实用了一下感觉他的作用并不大,各种并行控制手段都没有……如果数据量特别大,各个循环域之间相对独立,就可以用parfor。另外matlab启动并行环境也比较慢。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15174次
排名:千里之外
原创:65篇
(2)(5)(5)(14)(12)(23)(2)(1)(3)(2)16268人阅读
编程语言(5)
【使用和关闭】
使用matlabpool 命令启动多个workers,使用parfor指令。自己的电脑上是4核4进程,开启4个workers:
& & matlabpool 4
关闭时用 matlabpool close
parfor的语法和普通的for语法没有区别:
for i = 1:N
parfor i = 1:N
for 语句是按照i的序列顺序执行的,而parfor是由多个worker同时执行i为不同值的结果
for i = 1:12 fprintf(' %d',i); end 的输出为:
&1 2 3 4 5 6 7 8 9 10 11 12
parfor i = 1:12 fprintf(' %d',i); end的输出为:
【嵌套循环】
parfor是不可以多层嵌套的,比如下面这样:
parfor i = 1:M
& & parfor j = 1:N
只有将其中一个改为for:
parfor i = 1:M for i = 1:N ; end end
for i = 1:M parfor i = 1:N ; end end
但是这样就不能发挥并行的威力,可以这样:
parfor k = 1:M*N
& & i = mod(k-1, M) + 1;
& & j = floor(k-1/M) + 1;
在parfor中执行的语句,如果是写操作,则不能相互访问或者改写不同的i执行的结果。例如&
parfor i = 1:12
& & a(i+1) = a(i) + 1;
则是不允许的。因为并行操作并不保证a[i]在a[i+1]之前计算完。
parfor i = 1:12
& & a(i*2) = i*2;
这样的操作也是不被允许的。
parfor中限制:
不可以修改循环变量:
parfor i = 1:N
& &i = i + 1;
当写操作时,&矩阵下标的访问只能是i,或者是i加减一个常数。如果使用嵌套循环的循环变量来引用矩阵,那么必须用直接的下标形式,不可以用表达式:
A = zeros(4, 11);
parfor i = 1:4
& &for j = 1:10
& & & A(i, j + 1) = i +
可以改成:
A = zeros(4, 11);
parfor i = 1:4
& &for j = 2:11
& & & A(i, j) = i + j + 1;
如果在嵌套循环中引用了矩阵,那么在parfor-loop中就不可以再其他地方再使用:
A = zeros(4, 10);
parfor i = 1:4
& & for j = 1:10
& & & & A(i, j) = i +
& & disp(A(i, 1))
是不允许的。可以改成:
A = zeros(4, 10);
parfor i = 1:4
& & v = zeros(1, 10);
& & for j = 1:10
& & & & v(j) = i +
& & disp(v(1))
& & A(i, :) =
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:78638次
排名:千里之外
原创:10篇
转载:16篇
评论:16条
(1)(4)(1)(3)(1)(1)(1)(2)(1)(2)(1)(2)(5)(1)matlab的问题一个 不知道有人知道没有tic
parfor test = 1 : round(nonzeros)
i = round ( m * rand ( ) + 0.5 );
j = round ( n * rand ( ) + 0.5 );
a(i,j) = 1;%put 1 at the position a(i,j)
toc请问个问题,为什么我设置完open 4 lab之后用parfor来并行我的循环的时候总报错“the parfor loop cannot run due to the way variable 'a' is used"然后a那个地方也有个报错说”valid indices for ‘a’ are restricted in parfor loops"感激不尽
背影wan1769
你先把数组a在循环外定义好再试一次
为您推荐:
扫描下载二维码3834人阅读
Matlab(5)
Matlab的parfor并行编程
通常消耗最多计算资源的程序往往是循环。把循环并行化,或者优化循环体中的代码是最常用的加快程序运行速度的思路。Matlab提供了parfor关键字,可以很方便的在多核机器或集群上实现并行计算。
parfor关键字的使用
由for关键字引导的循环通常为串行运行,如果改为parfor则可以由多个worker以并行方式执行。parfor可以将n次循环分解为独立不相关的m部分,然后将各部分分别交给一个worker执行。循环执行的结果应该与n次循环执行的顺序无关。
parfor中的变量类型
一般parfor中各次循环对应的运算应该相互独立,但简约操作可以在多次循环内同时对一个变量操作。这种变量称为简约变量。例如下方代码中a就是简约变量。
for i = 1:1000
a = a+i;
简约操作包括+
- * .* & | [,] [;] {,} {;} min max union intersect。同一个parfor循环对简约变量的操作必须一致,即必须是同一种简约操作符。而且与操作符的相对位置也必须一致。简约变量赋值表达式应该满足结合律和交换律。*
[] {}底层有特殊处理保证结果的正确性。
parfor中可能需要读取或写入parfor之外的矩阵,读取写入位置与循环变量相关。这样就需要向worker传输大量的数据。矩阵如果被Matlab识别为切片变量,则数据可以分段传输到各worker,提高传输效率。切片变量矩阵的大小是不可在parfor中改变的,且为了保证Matlab识别正确,每次循环中只能读取由同一个索引值索引的切片,如a[i]
a[i+1]同时出现则a不被识别为切片变量。
如上例中的i,表示当前循环的id。
在parfor之前赋值,在parfor内只进行读取操作。
作用域局限于parfor内,parfor结束后不存在。不影响parfor之前声明的同名变量。
各种变量区分的例子
下例中,parfor中的tmp是临时变量,parfor结束后tmp的值依然是5,不受临时变量的影响。broadcast是广播变量,每次循环中的值不变。redued是简约变量,Matlab对其的值将分段由各worker计算后送回主进程处理。sliced为切片变量,数据传输有优化提升。i为循环变量。
broadcast = 1;
reduced = 0;
sliced = ones(1, 10);
parfor i = 1:10
reduced = reduced + i +
sliced(i) = sliced(i) *
worker配置
在运行程序之前,需要配置worker。否则如前文所说,parfor循环将以普通for循环的形式运行,无法并行。
使用matlabpool命令可以开启关闭本机的并行计算池。matlabpool
n命令可以打开n个worker。matlabpool
open configname按照指定配置打开,默认配置为local。程序运行结束后,应该使用matlabpool
close关闭worker。配置项的修改可以通过Parallel
-& Manage Cluster Profile完成。n的选择:如果有c个cpu核心,通常可以设置为c。如果是远程服务器,为防止服务器响应卡顿,可以设置为c-1。对于计算密集型程序,超线程带来的性能提升几乎为0,可以设置为核心数,而不是线程数。
循环次数n最好能整除以worker个数m,否则部分worker会分配较多的循环,造成一部分worker闲置一段时间,降低了并行性。并行运行时各个worker之间会进行通信,要注意大量数据传输带来的性能下降。尤其对于广播变量,如果较大可尝试变为切片变量。
转载请注明作者:Focustc,博客地址为,原文链接为
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:503167次
积分:5432
积分:5432
排名:第3300名
原创:96篇
转载:10篇
评论:91条
本科就读于中国科学技术大学少年班学院理科试验班,研究生就读于中国科学技术大学信息学院。
毕业后进入网易游戏从事手游开发工作。关注Unity3D/VR/Quant/C++/Python
阅读:56679
阅读:17250
文章:12篇
阅读:123702
(3)(5)(5)(1)(1)(2)(10)(5)(3)(2)(5)(4)(1)(3)(12)(3)(8)(15)(6)(1)(1)(4)(10)33234人阅读
Computer System(31)
MATLAB(15)
Data Mining(25)
本文讲一下matlab中的并行方法与技巧,这里我们不涉及GPU加速,主要考虑for循环并行和数据并行。分为以下几个板块:1. 怎么并行?2. parfor vs. SPMD3. 注意事项及经验总结-----------------------------------------------------------1. 如何并行?1. Request2. Issue the normal command to run the program. The client program will call on the&3. R具体到代码:matlabpool local 2;
%parallel program
matlabpool close其中2是core数目,注意2是core数。你的电脑如果是双核四线程的,那么只能申两个(而非4个)matlab local pool。具体实现parallel program呢,主要是通过parfor(parallel for)和SPMD(single program, multiple data)完成的。-----------------------------------------------------------2. parfor vs. SPMD2.1 什么时候用parforparfor只用于matlab并行循环。当你需要简单计算的多次循环迭代时,例如蒙特卡洛(Monte Carlo)模拟,parfor循环就很有用。parfor将循环迭代分组,那么每个worker执行迭代的一部分。当迭代耗时很长的时候parfor循环也是有用的,因为workers可以同时执行迭代。注意当循环中有迭代依赖其他迭代的结果时不应该使用parfor循环。每个迭代都必须不依赖其他迭代。由于parfor循环内有通信消耗,当只有小数量的简单计算时使用parfor可能得不到什么好处。c = 1:10;
a = ones(10,1);
parfor i = 1:length(c)
a(i)= a(i)+ c(i);
fprintf('%d\n',a);2.2 什么时候用SPMD(Single Program/Multiple Data)单程序多任务进行任务并行Spmd中的“Single program”方面指的是同一段代码运行在不同的多个lab上。你在一个Matlab客户端上运行一个程序,被标志为spmd模块的其他部分运行在其他lab上。当这些块运行完毕后,你的程序继续在客户端运行。&“Multiple data”方面指的是虽然spmd语句在所有的lab上运行相同的代码,但每一个lab可以有不同的,独有的数据。所以多数据集可以在多个lab上同时被容纳。一下是我总结的SPMD使用的两个场景:The &single program& aspect of spmd means that the identical code runs on multiple labs. 就是说同一段程序应用于不同的样本(数据),所以一般针对随机抽样的并行,如%% SPMD
%example 1
A = rand(3,2); %generate a matrix A for each lab(worker)
for i = 1:length(A)
imagesc(A{i});
%example 2
c = labindex();
for i = 1:length(f)
fprintf('%d\t',f{i});%access the value of each lab
end另外,SPMD也可以用于可替代parfor的块并行,在不同lab(worker)上对相同或不同的数据执行不同的并行操作,说起来有些拗口,具体看一下例子就明白了,下面我写的example3,4分别针对在不同lab上对相同数据和不同数据执行不同操作。它们都可以用parfor代替,对吧,这里我就不写了,相信大家的能力。。%example3 - deal with same Data by different parameters
%add different values to same array Data
Data = 1:100;
switch labindex
Data = Data+1;
Data = Data+2;
% print Data{1} & Data{2} for checking
%add different values for different parts of array Data
% [1:50]+1
% [51:100]+2
if labindex == 1
Data(1:50) = Data(1:50)+1;
Data(51:100) = Data(51:100)+2;
end以上是我对spmd和parfor的理解,欢迎补充指正,其他关于spmd vs. parfor的可以参考这个。2.3 Composite类型spmd中每个lab返回值以composite存储,如上面[code]example 1中的f就是以composite的形式展现。f{i}为第i个lab的返回值。最开始我们也可以创建Composite对象并进行初始化赋值。&&&&f = Composite(2);-----------------------------------------------------------4. 注意事项及经验总结注意事项:1. parfor中慎用(最好勿用)eval幅值。一个程序并行时要共享内存,而eval语句可能使程序进入错误的workspace,因此不要用eval,改用不同index赋值。matlabpool local 2;
parfor i = 1:length(c)
a(i) = c(i);
end2. parfor循环不能很好利用所有处理器怎么办?是这样,parfor i = 1:4
end就只能用4个处理器,而如果不加这个parfor可能matlab自身的负载均衡能够更好地利用CPU。这里我是开起来3个matlab,比如服务器上有12个核。我就给每个matlab分配4个core(&&matlabpool local 4),每个程序里有一个parfor i = 1:4. 这样就可以用起来12个核。我知道这样好暴力……囧,有人知道正解的话指条明路吧。。3. parfor,spmd不可以相互或者自身嵌套。4. parfor使用有很多约束,比如for循环内的表达式需要显式表达(透明性),不依赖前项。如parfor i = 3:10& & & &f(i) = f(i-1)+f(i-2);end是不行滴。。欢迎留言其他并行技巧和方法,谢谢!Reference:1. MATLAB官网——2. 并行用法(貌似阿拉伯人写的……o(╯□╰)o)3. 详细并行4. 5. Parallel Computing Toolbox 欢迎关注本博客和新浪微博
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5481503次
积分:45018
积分:45018
排名:第49名
原创:482篇
转载:36篇
评论:4321条
百度深度学习实验室RD,关注计算机视觉,机器学习,算法研究,人工智能, 移动互联网等学科和产业,希望结识更多同道中人。
新浪微博:
(1)(1)(1)(4)(3)(1)(7)(7)(2)(1)(1)(9)(1)(1)(5)(2)(1)(3)(4)(6)(6)(5)(4)(1)(1)(1)(6)(1)(2)(7)(6)(7)(11)(20)(12)(23)(29)(37)(37)(6)(24)(6)(1)(1)(2)(2)(1)(7)(23)(20)(32)(17)(5)(22)(58)(8)(8)

我要回帖

更多关于 matlab中parfor 的文章

 

随机推荐