阅读 《大规模并行处理器程序设计》影印版心得 第五章 CUDA Memories

 

主要意图是:global memory太慢(几百个时钟周期),带宽太小。我们编程时,应该努力少用global memory,而更多使用shared memory和constant memory等快速memory

 

 

5.1 Importance of Memory Access Efficiency

 

CGMA 刻画做一次浮点运算需要做几次global memory访问,此值越大越好,越大说明平均一次浮点运算所涉及的global memory越少。

 

换句话说,global memory访问是有带宽的,此带宽限制了浮点运算所能达到的峰值。如果每做一次浮点运算,就访问一次global memory,则限制了系统的运算效率,即global memory的带宽就是系统的峰值运算速率的极限。

 

5.2 CUDA Device Memory Types

 

constant memory: 低延迟,高带宽,只读存储器 (对device而言),读写存储器(对host而言)。但是有条件:所有threads同时访问同一块区域时,才能达到低延迟高带宽的效果。必须在所有函数之外声明,作用域是整个应用。所有的grid和所有的thread看到的都是同一个变量。通常用来存储thread的输入数据。当前,一般最大大小为64kB

 

Register: 局部于一个thread,只能线程自己访问。一般是频繁使用的局部变量用这个方式存储

 

shared memory: 一个block中的所有threads共享的内存,低延迟,高带宽。合理使用的话,可以提升性能。

 

在kernel中声明的自动标量,一般都存放在register中;向量对象一般都存放在global memory中。

 

注意:通常情况下,指针只能指向global momory中的变量;或者指针的值只能是global memory中的变量的地址。

 

 

5.3 A Strategy for Reducing Global Memory Traffic

 

这部分比较难理解,尤其是细节。 不过基本的思路还是比较清楚的。回顾一下矩阵乘法的几个例子来看一下优化的过程:第一个例子就是简单地使用多个GPU线程来实现矩阵乘法的并行化,每个线程从M矩阵取一行,N矩阵取一列,完成点积运算,求出目标矩阵的一个元素;第二个例子,通过引入更多的block,实现了更多的线程参与运算,每个block完成目标矩阵中一个tile的元素的乘法计算, 以满足更大的矩阵的乘法;第三个就是这个,目标是减少对global memory内存的访问次数,对系统进行优化。主要思路是根据shared memory的大小,每次把矩阵乘法的一部分输入数据装入shared memory,完成部分点积运算,结果存储到Pvalue中。经过若干个phases,把所有部分点积运算的结果都累加到Pvalue中,就求出了目标矩阵中某元素的值。具体可以参看图5.5

 

 

5.4 Memory As a Limiting Factor to Parallelism

 

本小节说明寄存器和shared memory等内存容量有限,使用时需要注意不能超出容量。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值