有人有使用零拷贝(此处参考:Default Pinned Memory Vs zero copy Memory)内存模型分析CUDA应用程序性能的经验吗?
我有一个使用零拷贝功能的内核,通过NVVP,我可以看到以下内容:
以平均问题大小运行内核,我得到0.7%的指令重放开销,所以没什么大不了的。所有这0.7%都是全局内存重放开销。
当我真的增加了问题的大小时,我得到了95.7%的指令重放开销,所有这些都是由于全局内存重放开销。
然而,正常问题大小的内核运行和非常非常大问题大小的核运行的全局加载效率和全局存储效率是相同的。我真的不知道该如何看待这些指标的组合。
我不确定的主要问题是NVVP中的哪些统计数据将帮助我了解零拷贝功能的情况。有什么想法我应该看什么类型的统计数据吗?
费米和开普勒GPU需要重放内存指令,原因有多种:
- 内存操作针对的是一个大小说明符(矢量类型),该说明符需要多个事务来执行地址差异计算并将数据传送到一级缓存/从一级缓存传送数据
- 内存操作存在线程地址分歧,需要访问多个缓存行
- 内存事务错过了一级缓存。当未命中值返回到L1时,L1通知warp调度器重放指令
- LSU单元资源已满,当资源可用时,需要重播指令
的延迟
- L2为200-400个循环
- 设备存储器(dram)为400-800个周期
- PCIe上的零拷贝内存是1000个周期
由于延迟增加,LSU资源的未命中和争用增加,重播开销也在增加。
全局加载效率没有增加,因为它是为执行的存储器指令需要传输的理想数据量与实际传输的数据量的比率。理想意味着执行的线程从缓存线边界开始访问内存中的顺序元素(32位操作为1条缓存线,64位操作为2条缓存线、128位操作为4条缓存线)。访问零拷贝速度较慢,效率较低,但不会增加或更改传输的数据量。
探查器公开以下计数器:
- gld_throughput
- l_cache_global_hit_rate
- dram_{读,写}_ throughput
- l2_l1_read_hit_rate
在零拷贝的情况下,所有这些指标都应该低得多。
Nsight VSE CUDA Profiler内存实验将显示通过PCIe(零拷贝内存)访问的数据量。