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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法

- X4 q7 u' w/ m2 k; L) {$ L( d2 `; i+ C% O6 u* v
       Matlab之GPU加速方法
: ?. A* N9 m6 P              一般代码加速方法0 H) E# a0 G9 ]  C# r( Y! H
                     GPU设备确认# q/ ^' U8 i7 A  s+ z; ?
                     GPU和CPU之间数据传递
) @: X6 T- |1 C$ S              复杂代码加速方法3 u2 n8 r3 G+ f+ [) ~/ T
" \- t9 G1 y; K' x; F) h! {
5 R7 L6 I/ `, v4 i
一般代码加速方法" O1 r/ q- b& k5 F" w

- a1 h! K" A0 }) I5 l  N3 ZMatlab目前只支持Nvidia的显卡。5 p! O+ M4 N* l$ ]) O
1 V7 b1 _( u7 w$ J7 b/ I
0 n4 z* F# a6 v0 M5 h
GPU设备确认% m* _) C# x+ V
" [$ J* K* P9 i& p" j0 Q1 u) h* {) @  t
( g; ]9 G' h/ O  h" t, _9 T
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
! |$ w! k  H6 r; a- F+ [3 _) J" V只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。* }6 p' ?1 ?9 x) m# v* d" T
0 I# J+ u! g7 e- O

$ ~- ^- P; v- b6 Y4 }) E& |7 lGPU和CPU之间数据传递
! G+ ^- X+ l0 f- u* [
  • gpuArray
    9 O& ~- Z: k8 t9 D8 R( g0 r# F
       I) 将CPU内存数据传到GPU内存中
3 ?+ [, V+ w0 H/ k( h( n
% E2 Y0 Y- b/ P, R$ k: C
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘) V, [. e4 i* M# q6 U3 z! Z
& V" ~9 q  d: t1 ]

; w+ _2 L, j  }/ V还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
! N" o' v" x) @; ]' g* d) H0 r2 t7 y
+ b; K" C  r  U# ~2 t' Y
  • 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  Y9 ~/ S- J4 W. n8 \5 l
; t9 }* Z; v5 s+ U/ _6 w; Z( }( f
. |! F1 r( A: k% v  e8 g. y
其实,这些函数的用法和对应的普通函数的用法都是类似的。) T2 c3 b6 [$ O) E
# D0 `7 Z' `5 W8 ]# m
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024' t0 S- p6 q; C6 Q- T+ T! P

; C1 w; E4 K- o0 o* A; d5 H1 s9 H9 S
II)在GPU内存中随机初始化一些内存数据。+ ^5 ^% J" E: F  u
4 T3 ^: k" T5 I  ]' F9 d/ o: z6 P
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
    / [2 R5 Y! O  R6 z
8 u9 t+ ]/ }6 C' @7 X5 [6 B. Y7 c; I
' k" l9 m/ z2 D- V& t+ c: }
  • gather
    " w  y4 t" n" _$ Z
       将GPU内存中的数据拷贝回CPU内存中。! ]$ }; \! X/ Y6 y) D

& l# y) I* R) x% h( j7 q: j
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2
    . D0 p  B: ^/ \9 ~
0 L* y: r5 G) T  Z7 K& s7 U
5 ?9 n2 T9 x* w& U
TIPS 2 `8 y0 W  i& S" [( h* ]0 X
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
  a: Z( p$ Y, X) V$ A
1 l+ z% D( }. M1 G6 H) i" N+ H& i# o
复杂代码加速方法
: D, T5 i8 G4 b8 ~$ f: V- C+ Z- D/ g0 n5 m
对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。/ w5 r1 P/ {, l) D0 S' {4 [- b0 J# ^* W

4 g9 a/ {, w6 K2 Z& Y  K* ematlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。# b/ }% h; g: e. E
# ]0 t2 b/ {" z, O. K+ G2 n
1 ~  X8 x2 I4 C# }5 b6 k
  • 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-7-20 20:27 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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