|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
Matlab之GPU加速方法 9 p4 M# d) Y, K, x" \( J# [
- {" z9 }/ Q* V2 z6 u Matlab之GPU加速方法
0 e; E, t9 o1 v+ ?/ c: g# e; T 一般代码加速方法$ t) G3 J$ @$ Z& g! I
GPU设备确认
5 P7 F6 F' y3 a! V1 {4 q GPU和CPU之间数据传递( _' ^! Z- J' }8 g% L1 m
复杂代码加速方法" q5 s' v5 P7 E2 A2 w# [1 w$ |
0 W+ g/ X3 ~ y1 J
; i1 s) B! C* s U8 \一般代码加速方法
, G7 A# W+ n# ?0 B l
. r% B5 Q: `# O1 xMatlab目前只支持Nvidia的显卡。
; x+ K" I5 c% W" i: z! z0 L. X8 [- o. U
, Y. Z, A t; _) e* `0 tGPU设备确认8 W( |0 Q+ W" }& {" W# e
! j- N0 n0 G4 H5 M% L+ v4 G
0 d l# e7 l' t/ \: z6 n想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 / Q% y' N4 B; y; Z: X
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。" ]; a0 T0 m- b# v
# O0 k$ L N: U- T% G/ a
. C( \4 n w8 J% q/ D# IGPU和CPU之间数据传递
9 B% O$ v% a( d& `5 x- gpuArray
4 c* c- _0 y) q5 z. o1 f0 K3 a I) 将CPU内存数据传到GPU内存中! d1 H }# n3 c0 }0 Z! Z2 @
4 C& M- A2 ?8 O, i0 m- C2 ]: {- X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
- GX=gpuArray(X); %在GPU开始数组GX,并且将X的值赋给GX
- GX2=GX.*GX; %GPU上执行数组对应位置的点乘
6 J% X5 ? j/ o% T' |
3 ?/ D y8 o) N4 W( r! I6 w* T8 `9 }: y6 u' Y
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:7 B! P) K M4 d; o
- C8 q2 T+ h! I) _# ?/ v5 X- 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$ _6 a9 {, P+ h- o$ l: \! v
1 E7 D5 ^4 }, A: D8 i
1 ?6 p# Z* z; b4 J. f( c其实,这些函数的用法和对应的普通函数的用法都是类似的。+ |, T/ M8 x7 Y5 g& |* J/ q
' X N( {' m2 g
- II = gpuArray.eye(1024,'int32');
- size(II)
- ans=1024 1024( [& O% r% V f& \; M3 Z
. O6 k. M5 n5 A+ d$ Q9 t+ Q/ E: l6 ?6 g4 L% s0 v2 v2 ?
II)在GPU内存中随机初始化一些内存数据。
5 d3 x3 U5 m& H* ]: U% M s
1 M6 z4 U$ h6 v$ w) _8 R$ x- GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
- %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.4 V' _5 L% r, v9 u, z3 J0 h! g
8 Z" [1 ~" i3 a2 [# z4 w- }" C7 j
7 y3 u; L4 J& P9 d) x8 b5 H' M- gather9 }; k, I8 Y, w; _ x# L5 b& P
将GPU内存中的数据拷贝回CPU内存中。
3 W6 ]7 P4 M; G
4 C3 F. ]/ z2 u- H# ^( k+ d/ a( Y6 H- X2=gather(GX2) %将GPU内存中的数组GX2赋值给CPU中的X2
, E% A8 u. W5 o- g 4 ?3 M2 Q1 d; M' f& K
' ^, A5 T& |4 C& w4 }$ m" eTIPS
+ Z; b) F( i0 V g; R) G6 d) j( j有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
" M) p& Y5 S: d; d+ g
% m- j" O4 I" V) q( [% a+ u% x! B$ p5 i+ |- ?3 J
复杂代码加速方法/ ]& b, h6 l1 P- r( Q9 F, T
r' p1 ~; P _+ ^' J对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。% ^) t W7 _: F0 n' q: c. z! v
' b1 E; y* ]" Q2 a3 R& l3 y
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
, N& S; f3 [& k3 U' N2 l7 ]* l
' c+ o2 n0 x# f3 I! V' ^+ Z% f4 D( L
|
|