CUDA存储器模型

存储器模型有:

•Register
•Local
•shared
•Global
•Constant
•Texture
•Host memory

寄存器与Local memory
•对每个线程来说,寄存器都是线程私有的--这与CPU中一样。如果寄存器被消耗完,数据将被存储在本地存储器(localmemory)。
•Localmemory对每个线程也是私有的,但是localmemory中的数据是被保存在显存中,而不是片内的寄存器或者缓存中,因此速度很慢。
•线程的输入和中间输出变量将被保存在寄存器或者本地存储器中。

Shared memory
•用于线程间通信的共享存储器。共享存储器是可以被同一block中的所有thread访问的可读写存储器。
•访问共享存储器几乎和访问寄存器一样快速,是实现线程间通信的延迟最小的方法。
•共享存储器可以实现许多不同的功能,如用于保存共用的计数器(例如计算循环次数)或者block的公用结果。

共享存储器(Shared Memory)
•设置于SM内部
•由一个线程块内部全部线程共享
–完全由软件控制
–访问一个地址只需要1个时钟周期

constant memory和texture memory
•基于GPU图形计算的专用单元发展而来的高速只读缓存
•速度与命中率有关,不命中时将进行对显存的访问
•常量存储器空间较小(只有64k),支持随机访问。从host端只写,从device端只读
•纹理存储器尺寸则大得多,并且支持二维寻址(一个数据的“上下左右”的数据都能被读入缓存),适合实现图像处理算法。

全局存储器
•使用的是普通的显存,无缓存,可读写,速度慢
•整个网格中的任意线程都能读写全局存储器的任意位置,并且既可以从CPU访问,也可以从GPU访问。

各种存储器的延迟
•register: 1 周期
•shared memory: 1 周期(无bank conflict)——16 周期(发生16路bank conflict)
•texture memory: 1 周期(命中)——数百周期(不命中)
•constant memory: 1周期(命中)——数百周期(不命中)
•Global/ local memory: 数百周期

各存储器大小
•每个SM中有64K或者32K的寄存器,寄存器的最小单位是32bit的register file
•每个SM中有16K~64K shared memory
•一共可以声明64K的constant memory,但每个SM的cache序列只有8K
•可以声明很大的texture memory,但是实际上的texture cache序列为每SM 6-8K

使用存储器时可能出现的问题:
•致命问题:无法产生正确结果
•多个block访问global同一块,以及block内thread间线程通信时的数据一致性问题
•Texture的工作模式设置错误
•效率问题:大大增加访存延迟
•Shared bank conflict问题
•Global 合并访问问题

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AplusX

踩坑不易,打个赏呗~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值