内存事物颗粒

内存事物颗粒

  • 内存事物数×颗粒大小×效率 = 处理数据量
  • 每个请求数量的事物数量×颗粒大小×效率 = 一个请求处理的事物量
  • 事物量/每个请求事物量 = 请求数

GTX1050Ti

经实验得:
以此求GTX1050Ti的内存事物颗粒大小:
加载颗粒
在请求内存量<32字节时,加载颗粒是32字节。
在请求内存量>32字节时,加载颗粒是16字节。
存储颗粒
无论什么情况都是32字节。

小的内存颗粒适合做乱序的内存请求问题,因为内存事物效率相对较高。但在处理对齐合并内存请求时,由于颗粒小内存事物会增多,带宽会下降。
所以各有所长。另外GTX1050Ti的理论全局内存带宽是112G/s,实际带宽是程序处理数据量/所耗时间的结果,是实际值。另外1M数据的赋值操作实验一,耗时84us左右


实验一:

核函数处理了1M的4字节的inti的赋值运算:
b[i] = a[i];
套用公式一:262144×n×100% = 1<<20*4得:
加载颗粒16字节
同理
存储颗粒32字节
内存事物颗粒_第1张图片


实验二:

核函数处理了1M的4字节的float的加法赋值运算:
c[i] = a[i]+b[i];
套用公式一:524288×n×100%=1<<20×4×2 //最后的成2是因为处理了两倍的加载数据量。得:
加载颗粒16字节
同理
存储颗粒32字节
内存事物颗粒_第2张图片


实验三:启用一级缓存

重复实验一并开启一级缓存:
实验发现:以上实验结果都是在默认条件下:禁用一级缓存(书上的默认情况是启用一级缓存)
下面启用一级缓存发现:
猜想:启用一级缓存,颗粒肯定会变大,且对这种对齐合并问题,内存效率应该是100%,(只要内存颗粒不大于32*4),速度应该加快。
但实验结果是:
1.耗时(速度)与不启用一样。
2.加载内存效率是50%
如果按实际计算,
存储和加载的颗粒都是32,带宽提高一倍是应该的,但为什么加载的效率是50%?
内存事物颗粒_第3张图片


本篇的实验和书上的启用128,不启用32字节不相同,可能是现代的GPU全局内存存取的模式发生了变化,与之前版本的GPU不同而造成的。
最近的实验发现,对全局内存的访问与书上有些不同,有很多疑问,可能是现代GPU的革新造成的,所以本篇所计算的16字节的加载颗粒大小也可能是错误的,因为在nvidia官方文档里说说明了3.0以上的计算能力的GPU默认的加载存储颗粒都是32。还有在看自己的device属性的时候,发现,我的GPU跟本没有L1一级缓存。所以内存访问这里就当成一个黑箱,先不去管它,但后面解释的共享内存等都是没有问题的。

你可能感兴趣的:(CUDA,笔记)