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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法
  M: [% T  ~& A& R; ~
7 N1 b9 a9 L$ D2 F! Q* G" K1 n
       Matlab之GPU加速方法
8 D9 x0 j8 p% G: [              一般代码加速方法
" O5 H& h6 @/ f$ {1 U$ D! r0 l                     GPU设备确认
+ N( a- q8 K. k- Y                     GPU和CPU之间数据传递9 p. d4 M5 J' |
              复杂代码加速方法
1 l, @8 k+ _; Z  B& I7 V: C2 t2 ?. d8 K+ P$ V4 A

$ ^/ e; Y, f# f# S" `一般代码加速方法  |* O9 G( q* m; ~' R- v9 L' m
% P$ e5 {. @: D5 C# l
Matlab目前只支持Nvidia的显卡。
, X5 L3 e7 X/ I' X% B' F2 R, B: T2 w9 d. M) M: d- V0 w

$ b2 n# t' k* k0 ~% V5 Y) y' M. PGPU设备确认) u# j4 K; F, C, E& U  ~0 h/ ]

) X$ u* L8 P8 h( _1 G: |" }" ~4 P3 [$ {- n8 B
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
1 B2 l8 f, f. P/ E只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。" [- @3 v) L8 X0 i
' l: U3 e0 }7 w& [

' d( h: i6 {  F$ ]GPU和CPU之间数据传递9 I2 R4 v0 [. _" ~' a" Q
  • gpuArray6 t5 [7 K' t7 Q8 B+ U
       I) 将CPU内存数据传到GPU内存中" [/ B) y9 w+ h6 V9 M) N& s8 D: ^
2 E  w- d5 N/ M$ s3 C
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    / q7 ]$ _' {: @+ ]) b  B% k; v; L5 R
' S' Q2 V7 v; `
+ }7 c9 p! \8 U
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
# |' j, [' W5 m6 C7 J; y
' ]8 f  J) l, Q/ [# r% y9 n
  • 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
    , R: J5 a6 q+ |; ^

" D1 o/ V* w$ \" [: d1 n! {4 W# ]8 ~% H
其实,这些函数的用法和对应的普通函数的用法都是类似的。+ ]2 T9 H5 p. i( h: B" S
. x2 _9 V1 n2 @- b, f
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024
    $ Z) G, O/ j3 _- a0 ?: U5 U8 {

; ^# m$ _4 B; r0 P! g( ^1 i  ^  J% r4 T4 G/ V! t: o
II)在GPU内存中随机初始化一些内存数据。
1 ]' P$ n( }+ b. Z: H$ n. R
* @% j1 F9 k7 S4 _6 d1 A9 w  V
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.; v" ]) f# U3 {6 \! X
: ]% a/ x& \  d  W

3 }! v* V- I; _- v' q9 H6 P1 u
  • gather
    0 f. A; v, |/ y4 Z! T* G$ ?* p
       将GPU内存中的数据拷贝回CPU内存中。
- p% ]: ~& Y& J/ T& B$ ?. O0 t, @% m  e! v6 t$ g9 I# Y+ ~
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2* s0 O8 @. ?1 x" D2 I1 s7 q
; Z# B) N/ C' ~( S; h# ~
, N! F! S0 I3 }* w0 p( N, f
TIPS 3 g. P; `! e4 |$ r; h
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
" V- y# v0 b$ B, l6 ~4 I8 ]( l9 X5 y0 L' G4 m* V

3 k: I! @$ ?$ T! C: W2 u复杂代码加速方法2 {) g# p& k- v* N# E  b- \. z
  Q" t9 Q- z# ~$ M
对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。9 R. U; K; j; k% Q# E
+ m& y* T' N- [3 E
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。) @" ~: G( A' C, K# b

6 c9 V' N  g$ z8 a$ ?7 w# {% X" S
/ g; A2 P6 ]8 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-24 00:37 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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