GPU(CUDA)学习日记(十三)------ CUDA内存简介

GPU(CUDA)学习日记(十三)------ CUDA内存简介

标签: cuda存储线程结构
2902人阅读 评论(0) 收藏 举报
分类:
寄存器
寄存器是GPU片上高速缓存, 执行单元可以以极低的延迟访问寄存器。寄存器的基本单元式寄存器文件,每个寄存器文件大小为32bit。局部存储器对于每个线程,局部存储器也是私有的。如果寄存器被消耗完。数据将被存储在局部存储器中。如果每个线程使用了过多的寄存器,或声明了大型结构体或数据,或者编译器无法确定数据的大小,线程的私有数据就有可能被分配到local memory中,一个线程的输入和中间变量将被保存在寄存器或者是局部存储器中。局部存储器中的数据被保存在显存中,而不是片上的寄存器或者缓存中,因此对local memory的访问速度很慢。

共享存储器
共享存储器(share memeory)也是GPU片内缓存存储器。它是一块可以被同一block中的所有线程访问的可读存储器。使用关键字share添加到变量的声明中,这将使这个变量驻留在共享内存中。cuda c编译器对共享内存中的变量与普通变量将采取不同的处理方式。对于在GPU上启动的每个线程块,cuda c编译器都将创建该变量的一个副本,线程块中的每一个线程都共享这块内存,但这个线程却无法看到也不能修改其他线程块的变量的副本。这就实现了一种非常好的方式,使得一个线程块中的多个线程能够在计算上进行通信和协作,而且,共享内存缓冲区驻留在物理GPU上,而不是驻留在GPU之外的系统内存中。

常量内存
__constant__将把变量的访问限制为只读。在接受了这种限制之后,我们希望得到某种回报,与全局内存中读数据相比,从常量内存中读取相同的数据可以节约内存的带宽,主要有两个原因:
-对常量内存的单次读操作可以广播到其他的“领进”线程,这将节约15次读取操作。
-常量内存的数据缓存起来,因此对相同地址的连续读取操作将不会产生额外的内存通信量。
“邻近”是指半个warp中的线程。当处理常量内存时。nvidia硬件将把单次内存读取操作广播到每个半线程束。在半线程束中包含了16个线程,即线程束中数量的一半。如果在半线程束中的每一个线程访问相同的常量内存地址。那么GPU只会发生一次读操作事件并在随后将数据广播到每个线程。如果从常量内存中读取大量的数据,那么这种方式产生的内存流量只是全局内存时的1/16.然而,当使用常量内存时也可能产生负面影响。如果半线程束的所有16个线程需要访问常量内存中不同的数据,那么这个16次读取操作会被串行化,从而需要16倍的时间来发出请求。但如果从全局内存中读取,那么这些请求会同时发出。在这种情况下,从常量内存读取就慢于从全局内存中读取。

全局存储器
全局存储器(global memeory)位于显存(占据了大部分的显存),GPU, CPU, 都可以进行读取访问吗。整个网格中的任意线程都能读写全局存储器的任意位置。在目前的架构中,全局存储器没有缓存。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值