1

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

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

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

当我真正增加问题大小时,我得到了 95.7% 的指令重播开销,所有这些都是由于全局内存重播开销造成的。

但是,正常问题大小内核运行和非常非常大问题大小内核运行的全局加载效率和全局存储效率是相同的。我不太确定如何利用这些指标组合。

我不确定的主要事情是 NVVP 中的哪些统计数据将帮助我了解零拷贝功能的情况。关于我应该查看哪种类型的统计数据的任何想法?

4

1 回答 1

5

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

  1. 内存操作针对需要多个事务的大小说明符(向量类型),以便执行地址发散计算并与 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_吞吐量
  • l1_cache_global_hit_rate
  • DRAM_{读,写}_吞吐量
  • l2_l1_read_hit_rate

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

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

于 2012-12-14T03:08:16.227 回答