|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法
5 V* P7 g1 J( m, x! |0 E+ P7 q% M& U& _# E G6 |% [8 X2 h
Matlab之GPU加速方法
: o0 x& @$ V; C* ~' l 一般代码加速方法
! ^" L: q0 r, k) E2 S7 v GPU设备确认( w7 F6 a' v3 a
GPU和CPU之间数据传递
. J1 s Z1 q: f2 t 复杂代码加速方法& \3 O7 R7 i4 u0 X% s/ K) I
0 ^; [# _0 j$ |9 X; k- D
# d3 b/ D0 f% G/ u一般代码加速方法7 s+ D; Q* m* L
; G5 P6 C& g0 r' F- ^
Matlab目前只支持Nvidia的显卡。* y# R/ Z* @* u1 W5 o( p1 {. r
7 }2 I' \( Q( t: z0 S2 H9 P1 h6 W0 d# N, g
GPU设备确认
( k- _9 u+ C" B/ q# e0 C9 E8 R! L d D3 }) G# V& d. m
% z [. o, I" n. x" \想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 : y( G* P; u6 f/ M
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。+ H7 n& y/ N# ^' y+ H! s
0 x( G9 |: \7 u6 R/ \' V1 M
' t% d( A- j G7 J
GPU和CPU之间数据传递
& A; V. Z( N7 ]4 ?- G: t" U- gpuArray8 k- q5 x" j' j/ I- N) F t
I) 将CPU内存数据传到GPU内存中
) R* x+ I% j6 }7 d3 a5 I# w! v- X
3 P7 x6 {2 I; T$ K' }' Z" a- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
7 C7 z8 ^+ a8 A! t/ m$ V2 X& T
7 m) q/ |1 V( R) M/ k( N% H+ Q+ Z) X- h4 f) _1 |& J: z- [% W- ?
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:5 H3 j$ c; F% ~* G6 y; D$ v
& D, G3 T6 {1 J' i; B7 J
- 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
3 z- ?5 _1 T6 [ r
/ L3 ^: \1 u# J0 V- c |$ L$ x) L/ |
% l/ C% I" C7 l其实,这些函数的用法和对应的普通函数的用法都是类似的。5 M9 h% G9 K- `
. y* @- K: \- S- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024
# N3 ~' t! F& Y& ?+ [2 v
" \9 L' F/ L* K8 E8 C/ z& u& O w4 N" n$ h0 `
II)在GPU内存中随机初始化一些内存数据。3 \1 `+ L! g e) `; b+ x
% q8 Y6 r% `8 }3 n5 ^% ^
- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
- I6 a1 c. _% _" `- \5 F - X; u, R- T8 A
! Q- S" ]- n8 O+ @# t* l
- gather, V. h8 B9 {% c8 F/ O1 E
将GPU内存中的数据拷贝回CPU内存中。
+ q1 o' i* Q/ N% _8 X( o
7 X* [0 D8 v; E; e8 Y# \( v- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X29 J7 A) N; |6 Y, o, n
# y; z* f4 U2 n3 U1 k
0 y/ ^- _% v4 g9 e* S* \TIPS ! z2 D0 `& H8 E0 G7 `# o2 a$ i
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
' g* c$ b: F0 K- H) Z6 K
7 |1 u7 J! M1 p' Y, K
5 n& k/ V5 O# K( W, g' A5 H复杂代码加速方法
4 s6 S8 T# |! [* q% \, `# M6 w
! p' B2 c+ u2 I* q' h; M1 L& B对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
7 u6 P( f7 i$ S; N" w: l& L1 L) }& w$ ?( V& M
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
* g+ g9 o' Q: Z) F) ]: U8 N, ~
0 H7 U: f ]& V, G# N
- S& t8 v% D+ P% P# n0 ]+ E |
|