- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第三章 CUDA内存处理1
第3章 CUDA 内存处理1
1、全局存储器
2、寄存器
3、共享存储器
3.1. 全局存储器
全局存储器不是安装在多处理器内,而是一种片外存储器,因
此直接访问需要消耗很长的时间,访问全局存储器需要400到800
个时钟周期,是寄存器访问延迟的几百倍。其优点是整个grid 中
的所有线程都可与全局存储器进行直接通信,可对其任意位置进
行读写操作。由于访问全局存储器没有缓存,因此显存性能对
kernel 函数效率至关重要。对齐读取和存储可以提高访问显存的
效率,GPU硬件可将half-warp 中线程的访问操作合并成1次或2次
进行,这种高效的内存存取机制称为合并访问模式。
Fermi GPU在这方面做了更进一步改进,在条件允许的情
况下,甚至可以合并一个warp 中的所有线程的数据访问为1次
数据存取访问操作。相反,如果数据存储没有按照上述规则
对齐,不满足合并访问的条件,则读写将被编译器拆分为多
次而按顺序串行进行操作,导致kernel函数的效率大大降低。
此外,Fermi架构下新增加了L1和L2缓存,其对全局存储器访
问延迟长问题有着一定的改善作用。
左边访问模式会产生16次访问,是因为thread 3和thread 4
访问出现了交叉。
右边模式也会产生16次访问请求,因为开始地址没有对齐。
3.2. 寄存器
寄存器是GPU片上的高速缓存,与SP的距离最近,它是一种
非常稀有的资源,因为它是唯一能够获得足够的GPU带宽和非
常低的访问延迟从而得到最佳性能的资源。较低硬件中一个SM
内仅有8K 的寄存器资源,GTX480 中每个SM有32K 的存储空间,
而这些寄存器空间是平均分配给该SM 内的所有线程,所以每个
线程拥有的寄存器空间是动态的,其决定于SM 中线程的个数,
SM中线程越少,每个线程就拥有越多的寄存器资源。
Kernel函数中定义的自动变量会被分配至寄存器中,但是若
寄存器中存放的数据量过大就会产生溢出现象,Fermi之前的
GPU ,数据将溢出至全局存储器,这会导致程序性能大幅下降。
但对于计算能力2.0 的GPU或Fermi GPU,被溢出数据将被存储
至L1 cache,其大大的减小了溢出带来的负面影响。由于寄存器
空间有限,不能存储太多数据。
3.3. 共享存储器
共享存储器位于每一个多处理器内,是一种片上存储器,其访
问速度非常快,几乎可以达到寄存器访问的速度。与寄存器不同
的是,同一个多处理器上的线程可以共同访问一片共享存储器,
并在整个线程块的生存期中都有效,故共享存储器对于高速的数
据交换和进程间的通信具有重要的意义。为了在访问时获得较高
带宽,共享存储器被分成大小相等且能被同时访问的存储器组
(memory bank ),不同的存储器组可彼此互不影响地工作。
当一个warp 中每个线程需要访问的数据分别位于不同的bank
时,则无地址冲突 (bank conflict ),就可完全并行的返回数据,
从而实现很高的带宽。但如果一个warp 中多个线程请求访问的
数据位于同一个bank时,就发生了地址冲突现象。由于存储器
组在一个时刻无法响应多个请求,因而该访问请求就被串行化。
还有一种无冲突的访问模式,即当一个warp 中的所有线程都
请求访问同一个地址时,计算能力为2.0 的设备会产生一次广播,
即访问被处理成一次读取,只消耗一次访问的时间。
无冲突的访问模式 有冲突的访问模式
如何使用共享存储器?
举例1:计算矢量点积。
此处可先使用一般的求和方法:将每个block 中所有
线程的结果相加起来。
For(i= 1; ithreadperblock; i++)
{
cache[0]+=cache[i];
}
此处可先使用一般的求和方法:将每个block 中所有
线程的结果相加起来。
For(i= 1; ithreadperblock; i++)
{
cache[0]+=cache[i];
}
举例2 :计
文档评论(0)