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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法

5 V* P7 g1 J( m, x! |0 E+ P7 q% M& U& _# E  G6 |% [8 X2 h
       Matlab之GPU加速方法
: o0 x& @$ V; C* ~' l              一般代码加速方法
! ^" L: q0 r, k) E2 S7 v                     GPU设备确认( w7 F6 a' v3 a
                     GPU和CPU之间数据传递
. J1 s  Z1 q: f2 t              复杂代码加速方法& \3 O7 R7 i4 u0 X% s/ K) I

0 ^; [# _0 j$ |9 X; k- D
# d3 b/ D0 f% G/ u一般代码加速方法7 s+ D; Q* m* L
; G5 P6 C& g0 r' F- ^
Matlab目前只支持Nvidia的显卡。* y# R/ Z* @* u1 W5 o( p1 {. r

7 }2 I' \( Q( t: z0 S2 H9 P1 h6 W0 d# N, g
GPU设备确认
( k- _9 u+ C" B/ q# e0 C9 E8 R! L  d  D3 }) G# V& d. m

% z  [. o, I" n. x" \想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 : y( G* P; u6 f/ M
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。+ H7 n& y/ N# ^' y+ H! s
0 x( G9 |: \7 u6 R/ \' V1 M
' t% d( A- j  G7 J
GPU和CPU之间数据传递
& A; V. Z( N7 ]4 ?- G: t" U
  • gpuArray8 k- q5 x" j' j/ I- N) F  t
       I) 将CPU内存数据传到GPU内存中
) R* x+ I% j6 }7 d3 a5 I# w! v- X
3 P7 x6 {2 I; T$ K' }' Z" a
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    7 C7 z8 ^+ a8 A! t/ m$ V2 X& T

7 m) q/ |1 V( R) M/ k( N% H+ Q+ Z) X- h4 f) _1 |& J: z- [% W- ?
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:5 H3 j$ c; F% ~* G6 y; D$ v
& D, G3 T6 {1 J' i; B7 J
  • 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
    3 z- ?5 _1 T6 [  r

/ L3 ^: \1 u# J0 V- c  |$ L$ x) L/ |
% l/ C% I" C7 l其实,这些函数的用法和对应的普通函数的用法都是类似的。5 M9 h% G9 K- `

. y* @- K: \- S
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024
    # N3 ~' t! F& Y& ?+ [2 v

" \9 L' F/ L* K8 E8 C/ z& u& O  w4 N" n$ h0 `
II)在GPU内存中随机初始化一些内存数据。3 \1 `+ L! g  e) `; b+ x
% q8 Y6 r% `8 }3 n5 ^% ^
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
    - I6 a1 c. _% _" `- \5 F
- X; u, R- T8 A
! Q- S" ]- n8 O+ @# t* l
  • gather, V. h8 B9 {% c8 F/ O1 E
       将GPU内存中的数据拷贝回CPU内存中。
+ q1 o' i* Q/ N% _8 X( o
7 X* [0 D8 v; E; e8 Y# \( v
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X29 J7 A) N; |6 Y, o, n

# y; z* f4 U2 n3 U1 k
0 y/ ^- _% v4 g9 e* S* \TIPS ! z2 D0 `& H8 E0 G7 `# o2 a$ i
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
' g* c$ b: F0 K- H) Z6 K
7 |1 u7 J! M1 p' Y, K
5 n& k/ V5 O# K( W, g' A5 H复杂代码加速方法
4 s6 S8 T# |! [* q% \, `# M6 w
! p' B2 c+ u2 I* q' h; M1 L& B对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
7 u6 P( f7 i$ S; N" w: l& L1 L) }& w$ ?( V& M
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
* g+ g9 o' Q: Z) F) ]: U8 N, ~
0 H7 U: f  ]& V, G# N
- S& t8 v% D+ P% P# n0 ]+ E
  • 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-19 23:40 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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