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

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

[复制链接]

该用户从未签到

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

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
  • 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:24 , Processed in 0.140625 second(s), 24 queries , Gzip On.

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

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

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