Cuda零拷贝性能

use*_*914 1 c++ cuda zero-copy nvvp

有没有人有使用零拷贝(这里是参考:默认固定内存和零拷贝内存)内存模型分析CUDA应用程序性能的经验?

我有一个使用零拷贝功能的内核和NVVP我看到以下内容:

以平均问题大小运行内核我得到0.7%的指令重放开销,所以没什么大不了的.所有这0.7%都是全局内存重放开销.

当我真正提升问题大小时,我得到95.7%的指令重放开销,所有这都是由于全局内存重放开销.

但是,正常问题大小内核运行和非常大的问题大小内核运行的全局负载效率和全局存储效率是相同的.我不确定如何将这些指标组合起来.

我不确定的主要问题是NVVP中的哪些统计信息可以帮助我了解零拷贝功能的情况.我应该关注什么类型的统计数据?

Gre*_*ith 5

由于多种原因,Fermi和Kepler GPU需要重放内存指令:

  1. 存储器操作用于大小说明符(向量类型),其需要多个事务以执行地址分歧计算并将数据传送到L1高速缓存或从L1高速缓存传送数据.
  2. 存储器操作具有需要访问多个高速缓存行的线程地址分歧.
  3. 内存事务错过了L1缓存.当未命中值返回到L1时,L1通知warp调度器重放该指令.
  4. LSU单元资源已满,当资源可用时需要重放指令.

延迟到

  • L2是200-400个循环
  • 设备内存(dram)为400-800个周期
  • PCIe上的零拷贝内存是1000个周期

由于延迟增加导致LSU资源的未命中和争用增加,重放开销增加.

全局负载效率不会增加,因为它是需要为执行的存储器指令传输的理想数据量与实际传输的数据量之比.理想意味着执行的线程从高速缓存行边界开始访问存储器中的顺序元素(32位操作是1个高速缓存行,64位操作是2个高速缓存行,128位操作是4个高速缓存行).访问零拷贝速度较慢且效率较低,但不会增加或更改传输的数据量.

分析器公开以下计数器:

  • gld_throughput
  • l1_cache_global_hit_rate
  • dram_ {read,write} _throughput
  • l2_l1_read_hit_rate

在零拷贝情况下,所有这些指标都应该低得多.

Nsight VSE CUDA Profiler内存实验将显示通过PCIe(零拷贝内存)访问的数据量.