【问题标题】:How can I read from the pinned (lock-page) RAM, and not from the CPU cache (use DMA zero-copy with GPU)?如何从固定(锁定页面)RAM 中读取,而不是从 CPU 缓存中读取(使用 DMA 零拷贝和 GPU)?
【发布时间】:2012-08-15 04:53:58
【问题描述】:

如果我在 CUDA C++ 上将 DMA 用于 RAM GPU,我如何确定内存将从固定(锁定页)RAM 中读取,而不是从 CPU 缓存中读取?

毕竟,使用 DMA,CPU 对有人更改内存以及需要同步 CPU(缓存RAM)这一事实一无所知。据我所知,来自 C++11 的 std :: memory_barier () 对 DMA 没有帮助,也不会从 RAM 中读取,而只会导致缓存 L1/L2/L3 之间的一致性。此外,一般来说,CPU上的缓存和RAM之间没有解决冲突的协议,而只是在NUMA中同步不同级别的CPU缓存L1/L2/L3和多CPU的协议:MOESI / MESIF

【问题讨论】:

    标签: caching synchronization cuda gpgpu dma


    【解决方案1】:

    在 x86 上,CPU 会监听总线流量,所以这不是问题。在 Sandy Bridge 类 CPU 上,PCI Express 总线控制器集成到 CPU 中,因此 CPU 实际上可以从其 L3 缓存中为 GPU 读取提供服务,或根据 GPU 的写入更新其缓存。

    【讨论】:

    • 而且它一直在发生?冲突总是以有利于后一种变化的方式解决,L3 缓存线进入转发(英特尔)/拥有(AMD),然后启动内存屏障以同步 L3 与 L1/L2 缓存?
    • 您可以从“PCI System Architecture, Fourth Edition”(Addison-Wesley) 中了解有关 PCI Express 上的内存事务排序和死锁避免规则。至于内存屏障:在 CUDA 中,所有挂起的 CPU 写入都会在 GPU 请求任何工作之前发布(写入 MMIO 寄存器以启动 DMA 操作的副作用);如果您与 GPU 同步,则在解决等待之前发布所有在同步请求中未决的写入。最终结果是事情“按预期工作”。
    • 感谢您感兴趣的回答!也就是CUDA让我可以自动避免死锁和同步冲突,我能冷静吗?
    • 当然,这就是 CUDA 实现可分页 memcpy 的方式。如果同步正确,您可以让 CPU 和 GPU 尽可能地忙碌,在生产者和消费者缓冲区之间进行乒乓操作。
    • TLB 是特殊的缓存,旨在帮助地址转换,因此它们不会参与服务总线流量。 (一个值得注意的例外是,如果系统中有 IOMMU,它会执行额外的地址转换步骤以保护虚拟机管理程序和其他特权内存不被 DMA 破坏。如果存在,IOMMU 确实包含 TLB 以帮助来宾物理->主机物理地址转换。)
    猜你喜欢
    • 2015-04-03
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2021-06-29
    • 2019-02-21
    • 2019-12-02
    相关资源
    最近更新 更多