找回密码
 注册
关于网站域名变更的通知
查看: 411|回复: 1
打印 上一主题 下一主题

MATLAB并行运算程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-9-24 15:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

5 r: b1 E6 q( @4 k6 ~- S2 I- }matlab在计算大数据内存以及大矩阵运算时,单核运算显然无法满足高速的运算需求。其实matlab提供多核运算的解决方案,这里先介绍最简单的两种
' ]5 l1 F2 \6 F$ x3 q( a4 h8 p2 K6 |, X0 a5 y0 c; _: K
①paRFor
( J: ~* |3 |5 I0 ?1 Q& ~4 x9 p7 {②distributed
3 a; C! i! y5 G- |/ L9 {8 K8 D4 N4 k# ]7 H/ h
parfor; M1 y  g% Y1 a, C5 Q9 n
for循环一般最为耗时,解决方法就是采用parfor代替for,parfor可以自动将循环任务分配到多个核中,现在matlab的命令行窗口运行parpool(4)查看是否可以并行计算,没有报错则并行已打开。parfor运行时就会有多个matlab进程在计算。计算效率明显提升。$ n6 k; g* H) W% U) r, P

. m7 p4 Y0 g3 P$ [# d* p4 P未使用parfor的代码:
; S' Z+ P- D* f, _# O9 N5 _" v2 l8 u. U! M- b
  • answer = 0;
  • for i=1:1000000
  •     answer = answer + i;
  • end$ a. T" a4 Q1 Y6 U

) I6 r, `" q! x7 p1 t* O+ ~! ~' _/ v) l- l* `' y
时间:% Y, M$ b- q7 w& G
& @5 [# a' ~# j& l
/ F8 ~' ^. K$ u

0 X/ t3 B5 P. m" C使用parfor的代码:
) G; ]3 f# i' z5 p) m
* G7 q3 Z% l) w! |8 O
  • answer = 0;
  • parfor i=1:1000000
  •     answer = answer + i;
  • end( l. ]1 L2 e3 y- J: I1 D

  b% U8 a! G3 x% @0 O9 Q6 B. n" G0 w" \6 N' \! s
时间:$ _/ Z9 x2 f' H4 o
3 B. i7 c4 t9 i6 a8 x- L5 X

# D$ Z- L" ~" D# B; V8 O. M' n# y2 [$ k+ T) |1 V( c4 P7 D) j
显然加了parfor语句速度更快!
  D3 }+ ?2 G; x; n! L, @0 _  t6 h' N) b- h5 @
注意:
$ j  A7 B9 z3 w$ y' l; `; s9 m* q7 k, _; y! X3 Q! J0 f* _5 Y
①parfor循环中不能使用迭代或者关联性的赋值语句,因为多个核计算时无法交换数据。& D6 i, `9 D2 x7 ^" e9 }
②parfor只支持一层循环,所以下面这种写法是非并行的,并且可能会出错。
/ `8 Z4 S0 r# ]  ~4 U9 J③在程序运行之前MATLAB会提示你哪些地方不能用parfor(红色波浪线显示)
  F+ a0 x* @7 H% x
# Y9 a( S5 ?) q4 f! zdistributed" g; u1 u, `9 ^+ p3 @; {
对于大矩阵的存储问题以及计算的问题,除了自己分块外,可以使用matlab自带的内存分配解决方法,但需要确保你的电脑内存足够多,计算效率就会大幅提高。不然会有内存溢出的问题。
' d2 W2 z# q6 F4 l+ w具体方式是
8 j+ O3 ~$ [- V  P& D3 Y4 ~3 k+ f; w, F7 a2 |8 V! E9 a
  • tic;
  • X = randn(10000);
  • x_dis = distributed(X);
  • clear(X);
  • whos
  • a = svd(x_dis);
  • a_out = gather(a);%distrituted数据类型变为double
  • toc;
    $ I9 {$ G& E+ B- b* ~5 ^' y
# J$ @( w: D! W

" o- o5 _4 @/ N4 o! m/ C之后可以采用x_dis代替X进行计算即可。gather函数的作用是把distributed数据类型变为double。
: l0 c* s) W2 k! x2 T5 X9 D. L9 S6 ~3 N4 G
此外,matlab的大多数工具箱都开始支持并行计算,所以如果该问题可以用自带工具箱解决的可以使用工具箱自带的并行计算方法。% k( _. {( t/ Q8 R. ~
matlab的Parallel Computing Toolbox工具箱就支持并行。

该用户从未签到

2#
发表于 2020-9-24 16:05 | 只看该作者
MATLAB并行运算程序
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-13 10:36 , Processed in 0.125000 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表