|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法
' V* ~* P; J; ~: D; p0 b& t7 [. g9 }
Matlab之GPU加速方法
& i: J1 o3 z* _ 一般代码加速方法
* t8 T2 [& n6 J5 Q GPU设备确认& a: G" e8 L* T! N- @8 P4 P' T9 u* a# R
GPU和CPU之间数据传递
7 k' C9 X" E0 B 复杂代码加速方法
$ c3 t# ~, R/ o" j2 J" x8 g, p3 J/ p0 a @7 U
, H: C! [2 S; v6 O; b% L4 D1 U5 o一般代码加速方法9 E8 S$ S4 Z& v# d" |8 p
. g; x5 O r9 c, o- d
Matlab目前只支持Nvidia的显卡。
# X! Q! ^* o4 K7 Z; ]$ `4 e# J+ {0 z8 F1 Q
; I0 K0 r7 X7 p% ~0 `; y; y. l
GPU设备确认
$ ]7 M9 r! ~; h$ N) O& ^& V, Q5 Q. d& k! ^, q" ]6 L
& U% E1 K$ F$ G% L- `- O
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 5 h( q( s0 _+ ~" z
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。" |( A) J7 }& P8 X) `" s. n( w
: C& i6 I$ }4 I- b4 I# v
6 C+ i: @9 }0 f5 `GPU和CPU之间数据传递
9 e' }$ p- ?' R2 r7 [. V- gpuArray" K+ S+ ~- D7 ~# t& n5 i: g
I) 将CPU内存数据传到GPU内存中
& k; [" n9 H2 K3 }
: J* u/ q. t0 X; z4 X- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
' T! p4 `8 _8 \6 Q# z7 q- L
- M+ j2 v1 E' E6 I7 @0 j
" F- z0 M, ~. u% Q' c, L还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
4 {0 ]6 X. S7 g: M5 X. M
$ {' T& ~1 ~5 W; m, U+ m$ D- 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, _1 n1 |, p4 p8 L2 b
2 L7 w, z; }4 q& ^, q& z5 P) q! M3 K
其实,这些函数的用法和对应的普通函数的用法都是类似的。. h. D; H; R& U# W" s/ z
" |2 E! ?9 Z' c# h- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024% r1 ~5 L8 ?' \8 c- V5 P
8 r, W5 s9 R+ E9 d
+ S8 k$ L3 {4 N8 N6 ^( SII)在GPU内存中随机初始化一些内存数据。6 q# O2 t2 Z# [/ [
. s1 K* y! @2 M+ |% J- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.: y* b/ ?4 ?) H6 Z1 {
% U' g5 A# Y7 H1 m/ K( w/ l4 L$ ~' p$ Q8 U: J M0 U
- gather
# q0 V6 j" @. s# w @ 将GPU内存中的数据拷贝回CPU内存中。
0 Y: [% t3 G. m% a i i+ l8 ^ d# ^. V+ ~9 `( Q3 J. m* Z
- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2
' P2 U7 x6 d S7 `- s. P
/ v$ M$ \- D, a! c8 B9 p" o: D9 l" ^: ^' W
TIPS & t4 \- Z* E; q7 P* d# k$ o# a
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
) J7 t Z7 n& B e- o. A* O/ D' P; e/ d- }7 w
; b# p; X& S3 A# y, t; r1 b复杂代码加速方法
9 f$ w/ l; U7 o
7 {/ ]4 R, W" U2 \对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
- T6 W% R7 ]0 D% ^$ U
( Y9 x% o2 V. F# {4 B; m; t, {! z# s4 pmatlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
8 v3 L" I# s8 [5 [2 O" G* H6 Z8 t! T+ w$ \# P3 v5 E0 G
! b( o: `4 s' e! ]. Y# B9 v |
|