|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法 : q, G2 Z# [9 h8 z
3 f( o2 h4 d( R) U% w$ I Matlab之GPU加速方法. N8 O7 h9 J3 i9 B, i6 M% i
一般代码加速方法
+ c2 c8 w2 L) f GPU设备确认
$ l$ j7 Z8 z9 X+ v8 B3 r& M2 j GPU和CPU之间数据传递% S7 S9 ~3 B* t- f
复杂代码加速方法
1 Q, P1 h4 m4 i! R/ J
+ A! {6 E9 `# }# t6 j: _. n2 X/ c3 E% z" j
一般代码加速方法8 F1 Y' ~5 C! y0 \% G3 V/ E
* c G0 P! S0 V) }/ R [$ r1 x5 f1 UMatlab目前只支持Nvidia的显卡。
& q. w/ p7 |# o+ Z3 C# J: i U; d! ?; ^5 u
$ C9 t- o3 m- ?8 l' G. ?5 H6 dGPU设备确认/ ~& U/ W* a+ C1 A5 W
* E( _' N% P8 X, o6 X0 I* A+ {
' r' n7 [; }* x7 y
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
8 P$ r; }% v* F G1 k Z5 g# ^只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。5 _- c4 q3 W9 ^/ A& u3 i7 r4 s
$ l$ m' e) k8 X/ j1 B/ L
. H% k4 B& L* ZGPU和CPU之间数据传递9 u# c/ o- U6 y* _. K8 p; W
- gpuArray5 o4 d3 I. w8 ?0 D4 _
I) 将CPU内存数据传到GPU内存中6 X& @& N: Z' U2 V& G8 n5 u1 B
5 K( U) q5 W; L. X- n9 A% ]6 ]- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘* r3 H0 {- I1 m
2 a C1 c$ Y/ @ W/ s; J2 |6 B. K* }5 n6 R4 }2 f, p
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
( t0 k3 O# T# M- Z9 p& O* i" Q
* _, t# ]2 C, m6 O- 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
2 _4 d& w8 s& y9 c* e
: [' @* b7 F2 [6 b4 v8 B
; _" O: ~- D9 {/ ^) a其实,这些函数的用法和对应的普通函数的用法都是类似的。
' m1 O. i( f0 I& x% v; x H
4 f2 S' T6 O9 ~$ S% s- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024' K1 ^8 @# _ g! T' }! q) k
2 H' w+ n* f, t
5 q- b$ {( s6 j; u& oII)在GPU内存中随机初始化一些内存数据。1 C( a1 m) Z7 a* b/ E% B
6 D6 G4 N6 W8 x0 M, F) r1 V
- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
) H5 {/ W9 ~% A* D! W8 [ ) ]3 X# V: X& v2 K9 @9 d+ v
$ @! v! d; \ A9 E
- gather& M% w# i( x0 g5 d* ~- s
将GPU内存中的数据拷贝回CPU内存中。
9 `/ e* p: {, s! `5 X& t. C% H5 h1 }( H3 @% K
- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2
/ }* Y1 [2 @/ f1 T% D# l
Z6 Q7 D! I: a9 i! @9 V
( s% M2 J! o4 I6 C. e% n$ W9 L; YTIPS / v5 }' K0 B2 n5 S1 h8 s
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
; @/ ~6 s! Z, f0 ~. P- H% p5 l
# f9 w6 }" f5 M" k) O+ f
1 g/ A2 v2 X$ D+ ]5 @复杂代码加速方法
" m# A' ?- g& n, m; d, A
9 i' d4 m% D4 B0 f# V8 f' F2 d对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
5 Q) g# u4 C1 M, C1 d4 u/ T* F+ G; X" V! ?. Q3 D1 k/ l, r" N
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
9 O/ ^9 B4 `* T) m( L* ^7 p1 c! `8 t: f- ?
1 Z1 a1 Z$ C' p. n* ?3 @7 h7 I- u# c+ H |
|