|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法 $ t x0 B: ]/ J ?" ^0 v
9 Y5 A1 `" A+ n2 N6 `
Matlab之GPU加速方法" n, o- [( t9 t7 Z* B0 p! y
一般代码加速方法
8 Y& @9 j0 o. m! K! [' M) I GPU设备确认& j% w8 ]. \/ C5 w0 B4 ~9 L$ J& C( P
GPU和CPU之间数据传递) C- [) f5 a% `/ I4 j U9 L% D
复杂代码加速方法7 {8 O7 R! a( U/ L- v
* C3 L; i+ M8 T2 V J1 P$ E/ K( P- ?# J6 g! D
一般代码加速方法- ^6 ?, b( o8 n8 G2 |
, o/ J1 L6 \! |) WMatlab目前只支持Nvidia的显卡。
1 F9 m8 C( |3 d) M
% H: }1 J" u0 O6 q" z" H5 ~4 m9 n7 J% ~
GPU设备确认
' _6 X2 K8 c3 G' ~ _
+ Y! i) q$ ?3 `6 _" h5 W/ H6 G8 `. @+ V1 h5 J( Y5 j- `6 i6 Y2 d
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
# o, B4 A6 u; g只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。2 y( N& n. R' P$ I) @+ S
a8 i: V# r; H3 F' c
' ]# q. f# n* j* m( u; kGPU和CPU之间数据传递
7 M3 x! ]) C$ y- gpuArray. G' }9 v5 Q! M- X
I) 将CPU内存数据传到GPU内存中# m; {* X; B. Z/ v& j6 K& ?
G& c$ P6 D7 p) c/ z; r
- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘6 ]& t7 T; k/ k' ~1 r
1 q9 I* c r9 _ [( p: S7 \$ c" e( w
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
6 c p& q, j4 x! Q$ f1 ^. w( T8 C* V. K9 R: X, O3 ?) N: C
- 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, L8 x+ o* Q2 @- g1 Z) w) a: Y7 x
4 q y- K! P# R( P% ~
/ m3 |* z: a w3 ?* Y% L# X1 Z
其实,这些函数的用法和对应的普通函数的用法都是类似的。
3 I& p6 K" n3 L' n3 r
1 x5 H! U2 o; G7 d- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024
9 |- U. G* V, B5 p, C5 M
# ^ H( n/ C4 n l/ r [0 d5 A- \
# c1 {, k% M& x, x# }II)在GPU内存中随机初始化一些内存数据。" }* \3 W- I$ D3 U0 f( W
2 F3 }% g/ p- R7 A! k6 g: K- ^8 Z- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
" ^9 Y0 |0 ?; N" U$ `% ?! m2 C
1 ]6 X5 `( W2 L# T6 A/ q) K. Y) M1 z& P$ @
将GPU内存中的数据拷贝回CPU内存中。& W; ]+ r4 L# b# a, {7 D0 V
3 G1 T" D" t+ ~. e, I( r- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2& R) \3 ~% Q! t5 e' j
7 }) ^ j3 I5 U9 J6 D+ r8 Y8 g( U, A5 [/ P+ G1 Q" d
TIPS
) f7 F& @# ?% O6 \/ P9 G/ Z2 Z有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。1 ]0 |" C7 `2 |& `2 _7 W! N
' x6 |% E' ^: b/ e6 A" |
* ~* C4 l. O2 ^ d+ C2 I5 O, H
复杂代码加速方法
6 U3 _) a1 G; n) B$ ^$ p
2 H7 L' O7 `$ b对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
. \* s, `+ b! j i B) Q* Q8 d! {1 g4 E+ R- W
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。; ^; t3 ^' }9 D
3 ~. \5 F0 e1 V% ?, C: @2 e
. E# d8 K7 v; k g |
|