我在使用 NVIDIA GTX 590 卡的双 GPU 系统上使用 CUDA,并且我有一个根据下图进行分区的数组。
如果我要使用CudaSetDevice()
跨 GPU 拆分子阵列,它们会共享相同的全局内存吗?第一台设备能否访问第二台设备上的更新数据,如果可以,如何访问?
谢谢你。
每个设备内存都是独立的,因此如果您调用cudaSetDevice(A)
然后cudaMalloc()
您在设备 A 上分配内存。如果您随后从设备 B 访问该内存,那么您将有更高的访问延迟,因为访问必须通过外部 PCIe 链接。
另一种策略是在 GPU 之间划分结果,并在每个 GPU 上存储所需的所有输入数据。这意味着您有一些重复的数据,但这是 GPU(实际上是任何并行方法,如 MPI)编程中的常见做法 - 您经常会听到术语“光环”应用于需要在更新之间传输的数据区域。
请注意,您可以使用 来检查一个设备是否可以访问另一个设备的内存cudaDeviceCanAccessPeer()
,如果您有双 GPU 卡,这始终是正确的。