|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法 0 a& `9 Q ?2 r! W- y
% {4 e4 E% ~0 {/ H Matlab之GPU加速方法3 b& G* E* P, I' X
一般代码加速方法. L( r' Y* X. B# I" x8 r. e9 L
GPU设备确认" M3 ^0 h) |8 v: x% A5 I- s9 T
GPU和CPU之间数据传递& T, G; R$ I3 ~! L
复杂代码加速方法. `$ P; j8 e% O: t7 b0 Y
, p, T( a! ], D# W- [! I$ O& T
" t) i$ m* R7 q. q) i7 r: b3 Z! ~一般代码加速方法0 Q7 s3 c8 [- h( ^' ?. R
4 J; T/ Y3 _9 E7 Y# \3 I, V
Matlab目前只支持Nvidia的显卡。
3 s1 C" T H% N P6 t
. M1 f: |8 z3 i. r; A+ l
" G/ j; g. [6 t9 U! x$ rGPU设备确认" p0 X1 q6 ~! d) P- n; y
0 G/ \! s( N. p# J0 F8 b
, u- j7 d9 P+ |想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
1 }8 J4 u+ R. m. q: ^- I只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。
/ R- s; |, k3 L$ W: p
# Y ^4 w4 Y6 Z+ Z4 D, G7 u6 T
$ C$ M; t: N, L$ yGPU和CPU之间数据传递1 o K& S7 @( V+ n: D9 ]7 `
- gpuArray
; y. e9 k3 M$ P" q3 D I) 将CPU内存数据传到GPU内存中5 f9 R" d8 `7 P0 L' p
4 A1 q& |9 F: h& B. s2 n- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
6 N( k: }: ~+ u3 I1 A
' ?) c5 j& j3 O
, B: ~, \6 s% ], e' x( N$ Q: I8 Q/ v还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:. V0 x r! B% b' B
+ p1 `% `, a, d5 D; s: z6 ~- 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.eye7 u* a" H1 F* T- a- G
9 F6 `# `& x% t
2 ~4 J, E2 V; ^+ t! }! q其实,这些函数的用法和对应的普通函数的用法都是类似的。
) t9 G/ [3 B, i/ o6 u% l& F! K! \* C7 z5 n. k
- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 10242 f! s' n$ H2 e. y6 [
6 f, J: }" w& f
1 U* M$ K+ S5 \0 F2 e& SII)在GPU内存中随机初始化一些内存数据。7 U1 V3 j( ?9 k3 a: A2 O
8 ~/ k( N/ [6 Y$ W- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
$ k+ _1 A1 f- v% h5 _% z
% ^7 m2 B6 T0 Z* D3 T, w8 Z% c" A
) T. d1 i( n0 r6 a- gather$ i. E7 `! m1 u. t- X
将GPU内存中的数据拷贝回CPU内存中。2 l, V' c) B2 Y
5 ^7 d3 c3 I0 Z7 ]9 @- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X29 S, X `3 o' r
1 ^ [6 m# Y. r; S
. u M+ r( S/ o2 {/ s/ ]
TIPS
2 U% `* O8 d5 @有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
& P* Y4 }7 \# Q/ [1 N. v# F, H
9 E9 ]" G/ O! N8 C' _. O( W
复杂代码加速方法: S+ h8 W2 v& j& I% F$ |
8 O6 e" ]1 E9 T3 S- F" Z- A( `. y- q. |对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。' W: z$ R+ @9 y* u$ a; |. Z5 W$ [9 a
0 P" E4 c& O( k! V! ]! imatlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。* r9 L5 D2 N" x
* x& G v: ^& }
3 T; R# ^) \7 a7 c |
|