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

时间:2019-01-22 11:51:17

标签: cuda

由于无法同时访问计算能力低于6.x的设备上的托管内存(CUDA Toolkit Documentation),因此,有一种方法可以通过具有计算能力5.0的CPU和GPU来模拟访问托管内存,或者可以使用任何方法在GPU内核运行时使CPU访问托管内存。

1 个答案:

答案 0 :(得分:1)

  

有没有一种方法可以通过具有计算能力5.0的CPU和GPU同时访问托管内存

否。

  

或在GPU内核运行时可以使CPU访问托管内存的任何方法。

不在计算能力5.0设备上。

您可以使用CUDA zero-copy techniques对数据进行“同时”的CPU和GPU访问。

关于统一内存以及固定/映射/零复制内存的完整教程远远超出了我在此处可以写的答案的范围。统一内存在编程指南中有its own section。这两个主题都在SO上的cuda标签以及网络上的许多其他地方进行了广泛讨论。 使用Google搜索可能会回答任何问题。

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

相比之下,普通统一内存(UM)是将迁移到使用它的处理器的数据。在Pascal之前的版本中,此迁移是由内核调用和同步操作触发的。在这种情况下,主机和设备无法同时访问。对于采用适当的UM后Pascal方式(基本上,仅64位linux,CUDA 8+)的pascal和其他设备,即使在内核执行期间,数据也按需迁移,因此允许有限形式的“同时”访问。统一内存具有多种行为模式,其中某些行为模式会导致统一内存分配在某些情况下“衰减”为固定/零拷贝主机分配。