|
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工具箱就支持并行。 |
|