|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法
5 @2 c" Z' {4 P! |) y/ x
; u/ r/ I- f9 U! ?; X Matlab之GPU加速方法1 R1 ~" \; K- M% a
一般代码加速方法* d8 O \0 s7 h, ], x6 |
GPU设备确认! |% ?& T6 Z0 P" X2 L* z
GPU和CPU之间数据传递. C' j" A2 I9 j X
复杂代码加速方法5 I" |/ k$ ~' ~0 _ ]
' t6 K1 n" j" Q. e/ ]
# {# j0 D! b7 F8 M- |
一般代码加速方法
0 n5 |; P: X2 j6 r/ {( `
8 [' a* \* h2 U, j' wMatlab目前只支持Nvidia的显卡。' y+ \8 G, R9 \$ ~# ^
7 V; Z( {; S/ X% V/ j2 u$ ~3 Z
3 U9 _0 C- \4 k7 iGPU设备确认
7 k2 s8 Z: B- a) p2 K
6 L% B% p; v, T& O8 T; u. ?6 p' |/ l. h8 e# _5 r+ P
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 $ A0 \9 Y$ X4 A$ a5 G+ _8 `: P
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。. ` }7 S+ ^; k4 k
% L, d# w( u' O! D
! e* o. S& g& F1 p( p0 `GPU和CPU之间数据传递: T$ \! e: J0 \+ H: d6 v7 d: _# |
- gpuArray; d$ p+ \5 [# |; h8 @
I) 将CPU内存数据传到GPU内存中) e6 k# M, A! q! ?
1 g# ]* s j/ v3 k+ v- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
/ e% o8 M8 j( R7 I: R2 k 7 B* A4 k3 x" C$ c( B+ y$ V
- b4 `$ {: }3 I+ q' ^
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
$ {% n# B! ?/ C$ _: e' h$ P' l
9 ~* [* r$ u5 \( M3 P0 k* T- gpuArray.ones gpuArray.colon
- gpuArray.zeros gpuArray.rand
- gpuArray.inf gpuArray.randi
- gpuArray.nan gpuArray.randn
- gpuArray.true gpuArray.linspace
- gpuArray.false gpuArray.logspace
- gpuArray.eye
7 D0 g& @$ h0 K& m' F, B* L
9 ~ h1 |: ]5 B* Q2 F1 T1 g B# d
/ E# E) B$ C3 T6 B& D# V& m其实,这些函数的用法和对应的普通函数的用法都是类似的。
0 @5 C$ O& o- n2 Z k; q; q
4 A) K$ Y$ n+ y" ^" B7 Y, N" y- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024/ F v k9 h+ N( Z; z1 I
2 t9 V! `$ R! R4 E0 X2 r
+ M b0 e' C, F" B: y+ d$ i& UII)在GPU内存中随机初始化一些内存数据。7 n1 A, m+ R4 u: [7 L5 a
$ @$ D" j/ ~; L# b% M: i
- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
* x4 T9 q- Q; Q+ r1 T( t3 @" P6 g( j / {& Y% E$ c% ~* W/ a: H, R
4 y0 H# w% j: i3 f5 z" {* j' ~ 将GPU内存中的数据拷贝回CPU内存中。; X2 C8 S2 t1 ?
P7 q$ L6 }4 W# i: X
- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2
) @& d, R1 n! A7 x9 A( t Y$ e5 F. l$ y5 f" f, N
. S& M9 D& u5 m) C# Y- w2 ^- @* KTIPS 2 Q1 a |8 X. A
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。8 `, v+ K9 K3 x
6 ~9 e7 }" t$ W: S5 J, s, e
) }' P- m; z. }- J3 W+ p, {复杂代码加速方法
5 y$ A7 k l' L; g2 [$ \0 h
- n# D( P+ p. z F( @9 v: }对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。9 Z$ P6 \( F& q2 H' |" T
- g6 k' n3 D9 N$ Hmatlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。' F" _8 u) O2 N }$ [- o
0 z2 u" k w# ?3 e" w. N8 l
7 X* p; X' R0 J5 N/ u! y( i |
|