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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法

" R% [6 O6 |4 l8 ]: d9 @6 [+ P, P( h  q- q) ~$ m; B; r. B
       Matlab之GPU加速方法5 x' b% f% ^+ r
              一般代码加速方法
0 M  c2 N- ~- S* R1 A- _* R+ a                     GPU设备确认
8 j/ m; ~3 O: b5 U& Y- B. y3 e                     GPU和CPU之间数据传递
+ d: p7 z# [" d  Z: D' u" M              复杂代码加速方法1 L! U0 c+ _& T7 y/ w) V$ y
. L* n, Z/ J9 g& B7 A& U0 @
* ], @2 T# |2 q( R7 A, W
一般代码加速方法" l' a1 k, r, w

$ i4 i, z' \! q2 B5 \, |8 e! K2 IMatlab目前只支持Nvidia的显卡。3 K$ H) {3 }- c; Y+ w- ]2 ]( x; K  ?

, D8 i/ I6 ^, P0 c2 {
) i+ F+ i( P% ?/ X0 l' \GPU设备确认; B4 z. H. G1 {
  {8 m: t1 |7 J9 Q  I

* `% \! `* p" u$ r, n: e想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
' s# n& `5 m+ ]' V7 S# ^只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。
$ a' P, x. t2 a6 \) O. o1 |+ J" Q: [

8 V' C/ X; J) L; EGPU和CPU之间数据传递
7 [( ^# }* P1 k7 S
  • gpuArray
    . t# N3 y# q" N" Q3 C7 K
       I) 将CPU内存数据传到GPU内存中# G/ T6 h; C0 e4 U

' e2 [8 e4 p' C1 w% b
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    # T7 I4 I- q2 {: V- s& s& f. O
6 ]* c8 o) ]; o& i8 }
( u: z4 o5 \: ]- e
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
* F6 S, N9 P& [. l
. s4 F2 Z" s+ A: Z/ e0 s- n( j, W* P
  • 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
    ( K# L- ?8 c/ o. H, @
  k2 ~; p  V+ t" N

, I0 ]9 z. }2 K  C; k! n1 \其实,这些函数的用法和对应的普通函数的用法都是类似的。' T0 H0 d  Q. i5 Q/ }$ r% n  ~2 D

' Q8 l8 K( H: \' ~6 O4 v
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024
    8 o8 B1 r& A( P# a
$ o; d' Y) t  t( P; [* Z

. A6 m2 _3 b& [5 ?% V% uII)在GPU内存中随机初始化一些内存数据。
- ^5 @! m6 ~& o% H
- o+ V2 ^5 I3 \* I, u2 V
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.( v2 k6 I, d1 A- g2 N) a

9 J4 ?/ y7 }7 h5 i7 c, S# S
1 t* ~* a9 c7 g  o1 b* @
  • gather
    & Q5 E2 c8 E4 c! f# {
       将GPU内存中的数据拷贝回CPU内存中。8 A3 k& i" M* K) p
, H  b- E! X4 ?( I* @  K
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2
    6 g% c6 a4 D1 S, j3 s3 ^

9 N% z: [. z: Y) M" j% O4 B9 b8 s8 _  d( ~* _$ w
TIPS
, m, a6 N- a$ t; z- d4 u有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。  k6 `+ F0 G) U/ X( ?+ r
+ r0 V3 k' Y  b! G) j

; Q6 z7 Y2 {& U% D/ P3 i. }复杂代码加速方法
# D0 [% l: x5 m% {8 _7 V' C  `% O5 b0 G3 F, H3 a, K$ C9 S& {
对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。6 Q- `% V" n" P
, D6 C1 H8 z( ]; T8 f9 T" T( J
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
( u$ g* X5 o6 W' g! @) @( `' q& s) W; y, ?) y/ W! k7 T
7 C& L  w+ Z* b5 N
  • 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-10-5 21:19 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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