找回密码
 注册
关于网站域名变更的通知
查看: 496|回复: 1
打印 上一主题 下一主题

利用Matlab对GPU如何加速的方法

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-1-17 10:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Matlab之GPU加速方法
0 a& `9 Q  ?2 r! W- y

% {4 e4 E% ~0 {/ H       Matlab之GPU加速方法3 b& G* E* P, I' X
              一般代码加速方法. L( r' Y* X. B# I" x8 r. e9 L
                     GPU设备确认" M3 ^0 h) |8 v: x% A5 I- s9 T
                     GPU和CPU之间数据传递& T, G; R$ I3 ~! L
              复杂代码加速方法. `$ P; j8 e% O: t7 b0 Y

, p, T( a! ], D# W- [! I$ O& T
" t) i$ m* R7 q. q) i7 r: b3 Z! ~一般代码加速方法0 Q7 s3 c8 [- h( ^' ?. R
4 J; T/ Y3 _9 E7 Y# \3 I, V
Matlab目前只支持Nvidia的显卡。
3 s1 C" T  H% N  P6 t
. M1 f: |8 z3 i. r; A+ l
" G/ j; g. [6 t9 U! x$ rGPU设备确认" p0 X1 q6 ~! d) P- n; y
0 G/ \! s( N. p# J0 F8 b

, u- j7 d9 P+ |想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
1 }8 J4 u+ R. m. q: ^- I只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。
/ R- s; |, k3 L$ W: p
# Y  ^4 w4 Y6 Z+ Z4 D, G7 u6 T
$ C$ M; t: N, L$ yGPU和CPU之间数据传递1 o  K& S7 @( V+ n: D9 ]7 `
  • gpuArray
    ; y. e9 k3 M$ P" q3 D
       I) 将CPU内存数据传到GPU内存中5 f9 R" d8 `7 P0 L' p

4 A1 q& |9 F: h& B. s2 n
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    6 N( k: }: ~+ u3 I1 A

' ?) c5 j& j3 O
, B: ~, \6 s% ], e' x( N$ Q: I8 Q/ v还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:. V0 x  r! B% b' B

+ p1 `% `, a, d5 D; s: z6 ~
  • 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.eye7 u* a" H1 F* T- a- G

9 F6 `# `& x% t
2 ~4 J, E2 V; ^+ t! }! q其实,这些函数的用法和对应的普通函数的用法都是类似的。
) t9 G/ [3 B, i/ o6 u% l& F! K! \* C7 z5 n. k
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 10242 f! s' n$ H2 e. y6 [
6 f, J: }" w& f

1 U* M$ K+ S5 \0 F2 e& SII)在GPU内存中随机初始化一些内存数据。7 U1 V3 j( ?9 k3 a: A2 O

8 ~/ k( N/ [6 Y$ W
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
    $ k+ _1 A1 f- v% h5 _% z

% ^7 m2 B6 T0 Z* D3 T, w8 Z% c" A
) T. d1 i( n0 r6 a
  • gather$ i. E7 `! m1 u. t- X
       将GPU内存中的数据拷贝回CPU内存中。2 l, V' c) B2 Y

5 ^7 d3 c3 I0 Z7 ]9 @
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X29 S, X  `3 o' r
1 ^  [6 m# Y. r; S
. u  M+ r( S/ o2 {/ s/ ]
TIPS
2 U% `* O8 d5 @有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
& P* Y4 }7 \# Q/ [1 N. v# F, H
9 E9 ]" G/ O! N8 C' _. O( W
复杂代码加速方法: S+ h8 W2 v& j& I% F$ |

8 O6 e" ]1 E9 T3 S- F" Z- A( `. y- q. |对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。' W: z$ R+ @9 y* u$ a; |. Z5 W$ [9 a

0 P" E4 c& O( k! V! ]! imatlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。* r9 L5 D2 N" x
* x& G  v: ^& }

3 T; R# ^) \7 a7 c
  • TA的每日心情

    2019-11-29 15:37
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2020-1-17 18:07 | 只看该作者
    利用Matlab对GPU如何加速的方法
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-11-2 12:29 , Processed in 0.171875 second(s), 24 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表