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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法

5 @2 c" Z' {4 P! |) y/ x
; u/ r/ I- f9 U! ?; X       Matlab之GPU加速方法1 R1 ~" \; K- M% a
              一般代码加速方法* d8 O  \0 s7 h, ], x6 |
                     GPU设备确认! |% ?& T6 Z0 P" X2 L* z
                     GPU和CPU之间数据传递. C' j" A2 I9 j  X
              复杂代码加速方法5 I" |/ k$ ~' ~0 _  ]
' t6 K1 n" j" Q. e/ ]
# {# j0 D! b7 F8 M- |
一般代码加速方法
0 n5 |; P: X2 j6 r/ {( `
8 [' a* \* h2 U, j' wMatlab目前只支持Nvidia的显卡。' y+ \8 G, R9 \$ ~# ^
7 V; Z( {; S/ X% V/ j2 u$ ~3 Z

3 U9 _0 C- \4 k7 iGPU设备确认
7 k2 s8 Z: B- a) p2 K
6 L% B% p; v, T& O8 T; u. ?6 p' |/ l. h8 e# _5 r+ P
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 $ A0 \9 Y$ X4 A$ a5 G+ _8 `: P
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。. `  }7 S+ ^; k4 k

% L, d# w( u' O! D
! e* o. S& g& F1 p( p0 `GPU和CPU之间数据传递: T$ \! e: J0 \+ H: d6 v7 d: _# |
  • gpuArray; d$ p+ \5 [# |; h8 @
       I) 将CPU内存数据传到GPU内存中) e6 k# M, A! q! ?

1 g# ]* s  j/ v3 k+ v
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    / e% o8 M8 j( R7 I: R2 k
7 B* A4 k3 x" C$ c( B+ y$ V
- b4 `$ {: }3 I+ q' ^
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
$ {% n# B! ?/ C$ _: e' h$ P' l
9 ~* [* r$ u5 \( M3 P0 k* T
  • 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
    7 D0 g& @$ h0 K& m' F, B* L

9 ~  h1 |: ]5 B* Q2 F1 T1 g  B# d
/ E# E) B$ C3 T6 B& D# V& m其实,这些函数的用法和对应的普通函数的用法都是类似的。
0 @5 C$ O& o- n2 Z  k; q; q
4 A) K$ Y$ n+ y" ^" B7 Y, N" y
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024/ F  v  k9 h+ N( Z; z1 I

2 t9 V! `$ R! R4 E0 X2 r
+ M  b0 e' C, F" B: y+ d$ i& UII)在GPU内存中随机初始化一些内存数据。7 n1 A, m+ R4 u: [7 L5 a
$ @$ D" j/ ~; L# b% M: i
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
    * x4 T9 q- Q; Q+ r1 T( t3 @" P6 g( j
/ {& Y% E$ c% ~* W/ a: H, R

4 y0 H# w% j: i3 f5 z" {* j' ~
  • gather  l3 J/ O- Z6 s1 {
       将GPU内存中的数据拷贝回CPU内存中。; X2 C8 S2 t1 ?
  P7 q$ L6 }4 W# i: X
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2
    ) @& d, R1 n! A7 x9 A( t
  Y$ e5 F. l$ y5 f" f, N

. S& M9 D& u5 m) C# Y- w2 ^- @* KTIPS 2 Q1 a  |8 X. A
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。8 `, v+ K9 K3 x

6 ~9 e7 }" t$ W: S5 J, s, e
) }' P- m; z. }- J3 W+ p, {复杂代码加速方法
5 y$ A7 k  l' L; g2 [$ \0 h
- n# D( P+ p. z  F( @9 v: }对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。9 Z$ P6 \( F& q2 H' |" T

- g6 k' n3 D9 N$ Hmatlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。' F" _8 u) O2 N  }$ [- o

0 z2 u" k  w# ?3 e" w. N8 l
7 X* p; X' R0 J5 N/ u! y( i
  • 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-23 22:50 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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