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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法
5 m0 n/ [( o0 J) w- N( }4 t

) B! V8 t& F0 v. i! n4 V       Matlab之GPU加速方法5 G% n5 U0 C) l. _0 j/ t
              一般代码加速方法
' _# G& V0 X7 [3 E                     GPU设备确认
8 I. Z4 N5 b2 |( N                     GPU和CPU之间数据传递8 i  f3 L+ @5 W
              复杂代码加速方法
) l. x/ V3 M$ K% b
  _9 i" N  E) I/ \
3 R6 v% N; x" |/ Z* h一般代码加速方法
9 K( E% D" z4 L1 y0 u2 z0 n3 h: g2 u' }& H
Matlab目前只支持Nvidia的显卡。
1 G; ^6 k( P2 {. o6 g3 x  ~# r4 g+ }" y2 L
2 o+ C0 Y) b" ^, r
GPU设备确认. u( A6 ]1 b. G  k

/ ]( S3 U) V9 h& F+ ]
( G2 \2 E; V% Y$ p8 @想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 + u9 C# y5 E, ?6 d* T
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。
8 u3 h* K6 j2 N8 z( s/ I: n, ]  w+ P$ b6 n* Z

. ~* u! Y0 p$ ^( K: pGPU和CPU之间数据传递1 o- N& M! U* q1 ^% V" u
  • gpuArray
    4 F' g% W5 u( \
       I) 将CPU内存数据传到GPU内存中2 S, j3 F0 _9 v5 {
) z9 |# h* c1 N7 I& {
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    1 |% q, x6 k6 |

+ b( U9 ]9 \# {8 }0 M# u! R- |8 H8 a! O: \# t) r0 b% {% A
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:% y, S( E  A. t' f. @
' Y6 Y+ J1 C- I
  • 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.eye2 A5 N0 z2 f6 U" X! w8 y7 M

9 C8 Q& _$ d2 j* W5 z
* q5 J4 A, u. I其实,这些函数的用法和对应的普通函数的用法都是类似的。7 V5 ?+ `" r( X; C- W
/ G3 }( P3 N) {6 }5 A8 r5 K
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024$ t$ q& a' v7 n" N& \

! L: u5 S  Y6 D. ?3 y9 z5 b: Q, q, F+ A
0 b/ K+ C' x% E; }9 o! uII)在GPU内存中随机初始化一些内存数据。
0 t: _4 S4 }4 A, T# u" d+ G; q5 Q0 p9 N
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn." {7 s3 G* V9 w) }  }# i
& ?' x  F) j4 ~
7 R! |+ {2 ^2 V# f" C+ J
  • gather/ P+ d1 Y* }- h6 g( S" E
       将GPU内存中的数据拷贝回CPU内存中。
2 H  g, r5 ]; A0 [
6 s5 Q7 O' Y* A) ]$ K3 t
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2% f. i+ S7 H9 `7 t7 t
% a7 ?& [0 x, P- {1 m

: m6 c4 r! F6 E. O8 `2 ?TIPS
- F5 h2 C) v/ V6 G- h2 ^! D有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。4 Z8 \$ J! \/ ^8 v3 N
! c+ p- Q5 _  M" V2 x/ T
8 O! ]3 z" Q6 c2 [. l1 }3 a; {# Q, b
复杂代码加速方法0 `0 X$ x5 s7 \  z$ |6 o1 _$ h& g

) C# e) E0 y2 B, k3 d对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。3 p  ?9 G- h8 p0 m( I4 T' l
, |0 R6 b6 S) t0 e' d
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
& X4 ~3 T6 T& m2 b2 u& F" d- Y+ z
; a* F. M. }/ _- X
) R* q9 L/ |) \6 S$ D
  • 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-24 06:15 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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