【问题标题】:Cuda zero-copy performanceCuda 零拷贝性能
【发布时间】:2012-12-14 11:08:16
【问题描述】:

有没有人有使用零拷贝(参考这里:Default Pinned Memory Vs Zero-Copy Memory)内存模型分析 CUDA 应用程序性能的经验?

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

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

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

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

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

【问题讨论】:

    标签: c++ cuda zero-copy nvvp


    【解决方案1】:

    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(零拷贝内存)访问的数据量。

    【讨论】:

    • 就 Nsight 而言,这不只适用于 windows 吗?如果是,是否可以在远程机器上进行分析并查看该机器上的 PCIe 活动?
    • Nsight Visual Studio Edition (Windows) 具有与 Visual Profiler 不同的 CUDA 分析器和 CUDA 跟踪工具。 Nsight VSE 支持远程分析和跟踪。 Nsight Eclipse 版(Mac 和 Linux)集成了 Visual Profiler。 Nsight EE 不支持远程分析和跟踪。 Nsight VSE 3.0 或 CUDA 5.0 中的 Visual Profiler 都不支持监控进出 GPU 的 PCIe 流量。
    猜你喜欢
    • 2011-06-27
    • 2016-08-14
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 1970-01-01
    • 2012-06-05
    • 2017-07-06
    • 1970-01-01
    相关资源
    最近更新 更多