|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法 M: [% T ~& A& R; ~
7 N1 b9 a9 L$ D2 F! Q* G" K1 n
Matlab之GPU加速方法
8 D9 x0 j8 p% G: [ 一般代码加速方法
" O5 H& h6 @/ f$ {1 U$ D! r0 l GPU设备确认
+ N( a- q8 K. k- Y GPU和CPU之间数据传递9 p. d4 M5 J' |
复杂代码加速方法
1 l, @8 k+ _; Z B& I7 V: C2 t2 ?. d8 K+ P$ V4 A
$ ^/ e; Y, f# f# S" `一般代码加速方法 |* O9 G( q* m; ~' R- v9 L' m
% P$ e5 {. @: D5 C# l
Matlab目前只支持Nvidia的显卡。
, X5 L3 e7 X/ I' X% B' F2 R, B: T2 w9 d. M) M: d- V0 w
$ b2 n# t' k* k0 ~% V5 Y) y' M. PGPU设备确认) u# j4 K; F, C, E& U ~0 h/ ]
) X$ u* L8 P8 h( _1 G: |" }" ~4 P3 [$ {- n8 B
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
1 B2 l8 f, f. P/ E只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。" [- @3 v) L8 X0 i
' l: U3 e0 }7 w& [
' d( h: i6 { F$ ]GPU和CPU之间数据传递9 I2 R4 v0 [. _" ~' a" Q
- gpuArray6 t5 [7 K' t7 Q8 B+ U
I) 将CPU内存数据传到GPU内存中" [/ B) y9 w+ h6 V9 M) N& s8 D: ^
2 E w- d5 N/ M$ s3 C
- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
/ q7 ]$ _' {: @+ ]) b B% k; v; L5 R ' S' Q2 V7 v; `
+ }7 c9 p! \8 U
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
# |' j, [' W5 m6 C7 J; y
' ]8 f J) l, Q/ [# r% y9 n- 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
, R: J5 a6 q+ |; ^
" D1 o/ V* w$ \" [: d1 n! {4 W# ]8 ~% H
其实,这些函数的用法和对应的普通函数的用法都是类似的。+ ]2 T9 H5 p. i( h: B" S
. x2 _9 V1 n2 @- b, f
- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024
$ Z) G, O/ j3 _- a0 ?: U5 U8 {
; ^# m$ _4 B; r0 P! g( ^1 i ^ J% r4 T4 G/ V! t: o
II)在GPU内存中随机初始化一些内存数据。
1 ]' P$ n( }+ b. Z: H$ n. R
* @% j1 F9 k7 S4 _6 d1 A9 w V- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.; v" ]) f# U3 {6 \! X
: ]% a/ x& \ d W
3 }! v* V- I; _- v' q9 H6 P1 u- gather
0 f. A; v, |/ y4 Z! T* G$ ?* p 将GPU内存中的数据拷贝回CPU内存中。
- p% ]: ~& Y& J/ T& B$ ?. O0 t, @% m e! v6 t$ g9 I# Y+ ~
- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2* s0 O8 @. ?1 x" D2 I1 s7 q
; Z# B) N/ C' ~( S; h# ~
, N! F! S0 I3 }* w0 p( N, f
TIPS 3 g. P; `! e4 |$ r; h
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
" V- y# v0 b$ B, l6 ~4 I8 ]( l9 X5 y0 L' G4 m* V
3 k: I! @$ ?$ T! C: W2 u复杂代码加速方法2 {) g# p& k- v* N# E b- \. z
Q" t9 Q- z# ~$ M
对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。9 R. U; K; j; k% Q# E
+ m& y* T' N- [3 E
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。) @" ~: G( A' C, K# b
6 c9 V' N g$ z8 a$ ?7 w# {% X" S
/ g; A2 P6 ]8 I |
|