|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法 5 m0 n/ [( o0 J) w- N( }4 t
) B! V8 t& F0 v. i! n4 V Matlab之GPU加速方法5 G% n5 U0 C) l. _0 j/ t
一般代码加速方法
' _# G& V0 X7 [3 E GPU设备确认
8 I. Z4 N5 b2 |( N GPU和CPU之间数据传递8 i f3 L+ @5 W
复杂代码加速方法
) l. x/ V3 M$ K% b
_9 i" N E) I/ \
3 R6 v% N; x" |/ Z* h一般代码加速方法
9 K( E% D" z4 L1 y0 u2 z0 n3 h: g2 u' }& H
Matlab目前只支持Nvidia的显卡。
1 G; ^6 k( P2 {. o6 g3 x ~# r4 g+ }" y2 L
2 o+ C0 Y) b" ^, r
GPU设备确认. u( A6 ]1 b. G k
/ ]( S3 U) V9 h& F+ ]
( G2 \2 E; V% Y$ p8 @想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 + u9 C# y5 E, ?6 d* T
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。
8 u3 h* K6 j2 N8 z( s/ I: n, ] w+ P$ b6 n* Z
. ~* u! Y0 p$ ^( K: pGPU和CPU之间数据传递1 o- N& M! U* q1 ^% V" u
I) 将CPU内存数据传到GPU内存中2 S, j3 F0 _9 v5 {
) z9 |# h* c1 N7 I& {
- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
1 |% q, x6 k6 |
+ b( U9 ]9 \# {8 }0 M# u! R- |8 H8 a! O: \# t) r0 b% {% A
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:% y, S( E A. t' f. @
' Y6 Y+ J1 C- I
- 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.eye2 A5 N0 z2 f6 U" X! w8 y7 M
9 C8 Q& _$ d2 j* W5 z
* q5 J4 A, u. I其实,这些函数的用法和对应的普通函数的用法都是类似的。7 V5 ?+ `" r( X; C- W
/ G3 }( P3 N) {6 }5 A8 r5 K
- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024$ t$ q& a' v7 n" N& \
! L: u5 S Y6 D. ?3 y9 z5 b: Q, q, F+ A
0 b/ K+ C' x% E; }9 o! uII)在GPU内存中随机初始化一些内存数据。
0 t: _4 S4 }4 A, T# u" d+ G; q5 Q0 p9 N
- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn." {7 s3 G* V9 w) } }# i
& ?' x F) j4 ~
7 R! |+ {2 ^2 V# f" C+ J
- gather/ P+ d1 Y* }- h6 g( S" E
将GPU内存中的数据拷贝回CPU内存中。
2 H g, r5 ]; A0 [
6 s5 Q7 O' Y* A) ]$ K3 t- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2% f. i+ S7 H9 `7 t7 t
% a7 ?& [0 x, P- {1 m
: m6 c4 r! F6 E. O8 `2 ?TIPS
- F5 h2 C) v/ V6 G- h2 ^! D有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。4 Z8 \$ J! \/ ^8 v3 N
! c+ p- Q5 _ M" V2 x/ T
8 O! ]3 z" Q6 c2 [. l1 }3 a; {# Q, b
复杂代码加速方法0 `0 X$ x5 s7 \ z$ |6 o1 _$ h& g
) C# e) E0 y2 B, k3 d对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。3 p ?9 G- h8 p0 m( I4 T' l
, |0 R6 b6 S) t0 e' d
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
& X4 ~3 T6 T& m2 b2 u& F" d- Y+ z
; a* F. M. }/ _- X
) R* q9 L/ |) \6 S$ D |
|