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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
Matlab之GPU加速方法

' V* ~* P; J; ~: D; p0 b& t7 [. g9 }
       Matlab之GPU加速方法
& i: J1 o3 z* _              一般代码加速方法
* t8 T2 [& n6 J5 Q                     GPU设备确认& a: G" e8 L* T! N- @8 P4 P' T9 u* a# R
                     GPU和CPU之间数据传递
7 k' C9 X" E0 B              复杂代码加速方法
$ c3 t# ~, R/ o" j2 J" x8 g, p3 J/ p0 a  @7 U

, H: C! [2 S; v6 O; b% L4 D1 U5 o一般代码加速方法9 E8 S$ S4 Z& v# d" |8 p
. g; x5 O  r9 c, o- d
Matlab目前只支持Nvidia的显卡。
# X! Q! ^* o4 K7 Z; ]$ `4 e# J+ {0 z8 F1 Q
; I0 K0 r7 X7 p% ~0 `; y; y. l
GPU设备确认
$ ]7 M9 r! ~; h$ N) O& ^& V, Q5 Q. d& k! ^, q" ]6 L
& U% E1 K$ F$ G% L- `- O
想知道自己的电脑有没有这个能力,在Matlab中运行 gpuDevice。 5 h( q( s0 _+ ~" z
只要数据格式是gpuArray格式的,那么计算过程会自动的调用GPU进行计算。" |( A) J7 }& P8 X) `" s. n( w
: C& i6 I$ }4 I- b4 I# v

6 C+ i: @9 }0 f5 `GPU和CPU之间数据传递
9 e' }$ p- ?' R2 r7 [. V
  • gpuArray" K+ S+ ~- D7 ~# t& n5 i: g
       I) 将CPU内存数据传到GPU内存中
& k; [" n9 H2 K3 }
: J* u/ q. t0 X; z4 X
  • X=rand(10,'single'); %定义在CPU上的一个10x10的随机初始化数组
  •    GX=gpuArray(X);      %在GPU开始数组GX,并且将X的值赋给GX
  •    GX2=GX.*GX;         %GPU上执行数组对应位置的点乘
    ' T! p4 `8 _8 \6 Q# z7 q- L

- M+ j2 v1 E' E6 I7 @0 j
" F- z0 M, ~. u% Q' c, L还有很多支持 gpuArray 数据类型的函数,具体可以用 methods(‘gpuArray’) 查看。下列某函数的说明可以用 help gpuArray/functionname 查看:
4 {0 ]6 X. S7 g: M5 X. M
$ {' T& ~1 ~5 W; m, U+ m$ D
  • 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, _1 n1 |, p4 p8 L2 b

2 L7 w, z; }4 q& ^, q& z5 P) q! M3 K
其实,这些函数的用法和对应的普通函数的用法都是类似的。. h. D; H; R& U# W" s/ z

" |2 E! ?9 Z' c# h
  • II = gpuArray.eye(1024,'int32');
  • size(II)
  • ans=1024 1024% r1 ~5 L8 ?' \8 c- V5 P
8 r, W5 s9 R+ E9 d

+ S8 k$ L3 {4 N8 N6 ^( SII)在GPU内存中随机初始化一些内存数据。6 q# O2 t2 Z# [/ [

. s1 K* y! @2 M+ |% J
  • GX=rand(10,'gpuArray'); %直接在GPU设备上随机初始化一个10x10的数组
  • %%常用的随机初始化函数有:eye, ones, zeros, rand, randi, randn.: y* b/ ?4 ?) H6 Z1 {

% U' g5 A# Y7 H1 m/ K( w/ l4 L$ ~' p$ Q8 U: J  M0 U
  • gather
    # q0 V6 j" @. s# w  @
       将GPU内存中的数据拷贝回CPU内存中。
0 Y: [% t3 G. m% a  i  i+ l8 ^  d# ^. V+ ~9 `( Q3 J. m* Z
  • X2=gather(GX2)       %将GPU内存中的数组GX2赋值给CPU中的X2
    ' P2 U7 x6 d  S7 `- s. P

/ v$ M$ \- D, a! c8 B9 p" o: D9 l" ^: ^' W
TIPS & t4 \- Z* E; q7 P* d# k$ o# a
有时候GPU受限于硬件架构,单精度的计算远快于双精度。这时候可以考虑在拷贝的时候顺便转换一下精度 A = gpuArray(single(B)) 。
) J7 t  Z7 n& B  e- o. A* O/ D' P; e/ d- }7 w

; b# p; X& S3 A# y, t; r1 b复杂代码加速方法
9 f$ w/ l; U7 o
7 {/ ]4 R, W" U2 \对于一些复杂的,无法用matlab内部函数进行GPU加速的代码,matlab还提供了一个更强大的工具,就是调用.cu文件。
- T6 W% R7 ]0 D% ^$ U
( Y9 x% o2 V. F# {4 B; m; t, {! z# s4 pmatlab+c混合编程把.c,.cc,.cpp等文件编译为能够使用的mex文件。对于CUDA程序.cu,matlab也提供了一套方法来调用,最终编译成.ptx文件。
8 v3 L" I# s8 [5 [2 O" G* H6 Z8 t! T+ w$ \# P3 v5 E0 G

! b( o: `4 s' e! ]. Y# B9 v
  • 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-1 08:48 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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