如何在计算能力 5.0 中通过 CPU 和 GPU 同时访问托管内存?

How to access Managed memory simultaneously by CPU and GPU in compute capability 5.0?

由于在计算能力低于 6.x 的设备上同时访问托管内存是不可能的 (CUDA Toolkit Documentation),有没有办法通过 CPU 和 GPU 同时访问托管内存计算能力 5.0 或任何可以使 CPU 在 GPU 内核为 运行.

时访问托管内存的方法

is there a way to simulatneously access managed memory by CPU and GPU with compute capability 5.0

没有

or any method that can make CPU access managed memory while GPU kernel is running.

不在计算能力 5.0 设备上。

您可以 "simultaneous" CPU 和 GPU 使用 CUDA zero-copy techniques 访问数据。

关于统一内存和 Pinned/Mapped/Zero-copy 内存的完整教程远远超出了我可以在此处回答的范围。 Unified Memory 在编程指南中有 its own section。这两个主题都在 SO 的 cuda 标签以及网络上的许多其他地方进行了广泛介绍。 任何问题都可以通过 google 搜索来回答。

简而言之,64 位 OS 上的零拷贝内存是通过主机固定 API 访问的,例如 cudaHostAlloc()。如此分配的内存是主机内存,并且始终保留在那里,但 GPU 可以访问它。从 GPU 到主机内存对该内存的访问是通过 PCIE 总线进行的,因此它比正常的全局内存访问要慢得多。分配返回的指针(在 64 位 OS 上)可用于主机和设备代码。您可以研究使用零拷贝技术的 CUDA 示例代码,例如 simpleZeroCopy.

相比之下,普通统一内存 (UM) 是将迁移到使用它的处理器的数据。在 pre-pascal UM 体系中,此迁移由内核调用和同步操作触发。在这种情况下主机和设备同时访问是不可能的。对于适当的 UM post-pascal 机制(基本上,仅 64 位 linux,CUDA 8+)中的 pascal 和更高版本的设备,即使在内核执行期间,数据也会按需迁移,因此允许"simultaneous" 访问的有限形式。统一内存有多种行为模式,在某些情况下,其中一些会导致统一内存分配 "decay" 进入 pinned/zero-copy 主机分配。