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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法
: q, G2 Z# [9 h8 z

3 f( o2 h4 d( R) U% w$ I       Matlab之GPU加速方法. N8 O7 h9 J3 i9 B, i6 M% i
              一般代码加速方法
+ c2 c8 w2 L) f                     GPU设备确认
$ l$ j7 Z8 z9 X+ v8 B3 r& M2 j                     GPU和CPU之间数据传递% S7 S9 ~3 B* t- f
              复杂代码加速方法
1 Q, P1 h4 m4 i! R/ J
+ A! {6 E9 `# }# t6 j: _. n2 X/ c3 E% z" j
一般代码加速方法8 F1 Y' ~5 C! y0 \% G3 V/ E

* c  G0 P! S0 V) }/ R  [$ r1 x5 f1 UMatlab目前只支持Nvidia的显卡。
& q. w/ p7 |# o+ Z3 C# J: i  U; d! ?; ^5 u

$ C9 t- o3 m- ?8 l' G. ?5 H6 dGPU设备确认/ ~& U/ W* a+ C1 A5 W
* E( _' N% P8 X, o6 X0 I* A+ {
' r' n7 [; }* x7 y
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。
8 P$ r; }% v* F  G1 k  Z5 g# ^只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。5 _- c4 q3 W9 ^/ A& u3 i7 r4 s

$ l$ m' e) k8 X/ j1 B/ L
. H% k4 B& L* ZGPU和CPU之间数据传递9 u# c/ o- U6 y* _. K8 p; W
  • gpuArray5 o4 d3 I. w8 ?0 D4 _
       I) 将CPU内存数据传到GPU内存中6 X& @& N: Z' U2 V& G8 n5 u1 B

5 K( U) q5 W; L. X- n9 A% ]6 ]
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘* r3 H0 {- I1 m

2 a  C1 c$ Y/ @  W/ s; J2 |6 B. K* }5 n6 R4 }2 f, p
还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
( t0 k3 O# T# M- Z9 p& O* i" Q
* _, t# ]2 C, m6 O
  • 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
    2 _4 d& w8 s& y9 c* e

: [' @* b7 F2 [6 b4 v8 B
; _" O: ~- D9 {/ ^) a其实,这些函数的用法和对应的普通函数的用法都是类似的。
' m1 O. i( f0 I& x% v; x  H
4 f2 S' T6 O9 ~$ S% s
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024' K1 ^8 @# _  g! T' }! q) k

2 H' w+ n* f, t
5 q- b$ {( s6 j; u& oII)在GPU内存中随机初始化一些内存数据。1 C( a1 m) Z7 a* b/ E% B
6 D6 G4 N6 W8 x0 M, F) r1 V
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.
    ) H5 {/ W9 ~% A* D! W8 [
) ]3 X# V: X& v2 K9 @9 d+ v
$ @! v! d; \  A9 E
  • gather& M% w# i( x0 g5 d* ~- s
       将GPU内存中的数据拷贝回CPU内存中。
9 `/ e* p: {, s! `5 X& t. C% H5 h1 }( H3 @% K
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2
    / }* Y1 [2 @/ f1 T% D# l

  Z6 Q7 D! I: a9 i! @9 V
( s% M2 J! o4 I6 C. e% n$ W9 L; YTIPS / v5 }' K0 B2 n5 S1 h8 s
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
; @/ ~6 s! Z, f0 ~. P- H% p5 l
# f9 w6 }" f5 M" k) O+ f
1 g/ A2 v2 X$ D+ ]5 @复杂代码加速方法
" m# A' ?- g& n, m; d, A
9 i' d4 m% D4 B0 f# V8 f' F2 d对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
5 Q) g# u4 C1 M, C1 d4 u/ T* F+ G; X" V! ?. Q3 D1 k/ l, r" N
matlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
9 O/ ^9 B4 `* T) m( L* ^7 p1 c! `8 t: f- ?

1 Z1 a1 Z$ C' p. n* ?3 @7 h7 I- u# c+ H
  • 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-8-12 05:52 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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