|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法
- X4 q7 u' w/ m2 k; L) {$ L( d2 `; i+ C% O6 u* v
Matlab之GPU加速方法
: ?. A* N9 m6 P 一般代码加速方法0 H) E# a0 G9 ] C# r( Y! H
GPU设备确认# q/ ^' U8 i7 A s+ z; ?
GPU和CPU之间数据传递
) @: X6 T- |1 C$ S 复杂代码加速方法3 u2 n8 r3 G+ f+ [) ~/ T
" \- t9 G1 y; K' x; F) h! {
5 R7 L6 I/ `, v4 i
一般代码加速方法" O1 r/ q- b& k5 F" w
- a1 h! K" A0 }) I5 l N3 ZMatlab目前只支持Nvidia的显卡。5 p! O+ M4 N* l$ ]) O
1 V7 b1 _( u7 w$ J7 b/ I
0 n4 z* F# a6 v0 M5 h
GPU设备确认% m* _) C# x+ V
" [$ J* K* P9 i& p" j0 Q1 u) h* {) @ t
( g; ]9 G' h/ O h" t, _9 T
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
! |$ w! k H6 r; a- F+ [3 _) J" V只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。* }6 p' ?1 ?9 x) m# v* d" T
0 I# J+ u! g7 e- O
$ ~- ^- P; v- b6 Y4 }) E& |7 lGPU和CPU之间数据传递
! G+ ^- X+ l0 f- u* [- gpuArray
9 O& ~- Z: k8 t9 D8 R( g0 r# F I) 将CPU内存数据传到GPU内存中
3 ?+ [, V+ w0 H/ k( h( n
% E2 Y0 Y- b/ P, R$ k: C- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘) V, [. e4 i* M# q6 U3 z! Z
& V" ~9 q d: t1 ]
; w+ _2 L, j }/ V还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
! N" o' v" x) @; ]' g* d) H0 r2 t7 y
+ b; K" C r U# ~2 t' Y- 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 Y9 ~/ S- J4 W. n8 \5 l
; t9 }* Z; v5 s+ U/ _6 w; Z( }( f
. |! F1 r( A: k% v e8 g. y
其实,这些函数的用法和对应的普通函数的用法都是类似的。) T2 c3 b6 [$ O) E
# D0 `7 Z' `5 W8 ]# m
- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024' t0 S- p6 q; C6 Q- T+ T! P
; C1 w; E4 K- o0 o* A; d5 H1 s9 H9 S
II)在GPU内存中随机初始化一些内存数据。+ ^5 ^% J" E: F u
4 T3 ^: k" T5 I ]' F9 d/ o: z6 P
- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
/ [2 R5 Y! O R6 z 8 u9 t+ ]/ }6 C' @7 X5 [6 B. Y7 c; I
' k" l9 m/ z2 D- V& t+ c: }
将GPU内存中的数据拷贝回CPU内存中。! ]$ }; \! X/ Y6 y) D
& l# y) I* R) x% h( j7 q: j- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2
. D0 p B: ^/ \9 ~ 0 L* y: r5 G) T Z7 K& s7 U
5 ?9 n2 T9 x* w& U
TIPS 2 `8 y0 W i& S" [( h* ]0 X
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
a: Z( p$ Y, X) V$ A
1 l+ z% D( }. M1 G6 H) i" N+ H& i# o
复杂代码加速方法
: D, T5 i8 G4 b8 ~$ f: V- C+ Z- D/ g0 n5 m
对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。/ w5 r1 P/ {, l) D0 S' {4 [- b0 J# ^* W
4 g9 a/ {, w6 K2 Z& Y K* ematlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。# b/ }% h; g: e. E
# ]0 t2 b/ {" z, O. K+ G2 n
1 ~ X8 x2 I4 C# }5 b6 k
|
|