CUDA C编程指南,据说CUDA:在多个设备之间共享数据?
...通过设计,主机线程只能在一个设备上,在任何给定的时间执行设备代码。因此,需要多个主机线程才能在多个设备上执行设备代码。此外,通过在一个主机线程运行时创建的任何CUDA资源不能由其他主机线程运行时使用......
我想要做的就是在主机(映射内存)两个GPU共享数据,
但手册似乎说这是不可能的。
有没有这方面的解决方案
CUDA C编程指南,据说CUDA:在多个设备之间共享数据?
...通过设计,主机线程只能在一个设备上,在任何给定的时间执行设备代码。因此,需要多个主机线程才能在多个设备上执行设备代码。此外,通过在一个主机线程运行时创建的任何CUDA资源不能由其他主机线程运行时使用......
我想要做的就是在主机(映射内存)两个GPU共享数据,
但手册似乎说这是不可能的。
有没有这方面的解决方案
解决方案是手动管理这些常用数据。即使使用SLI。
卡片在SLI模式下确实没有共享内存 - 共享数据必须通过总线从一个复制到另一个。
你可能想看看GMAC。这是一个建立在CUDA之上的库,可以让人感受到共享内存的错觉。它实际上做的是在主机和GPU设备上的相同虚拟地址处分配内存,并使用页面保护按需传输数据。请注意,这有点实验性,可能在beta测试阶段。
当你分配主机的内存,您应该分配使用cudaHostAlloc()
并通过cudaHostAllocPortable
标志。这将允许多个CUDA上下文访问内存。
你想通过传递cudaHostAllocPortable
到cudaHostAlloc()
分配您的固定内存为便携式。您可以在同一固定内存的设备之间在内核之外交换数据,正如我之前所做的那样。至于映射的内存,我不太确定,但我不明白为什么你不能。尝试使用cudaHostGetDevicePointer()
获取用于当前设备(与同一CPU线程关联的设备)的设备指针。
CUDA编程指南(v3.2)第3.2.5.3节中有更多信息:
页面锁定主机存储器的块可被分配为两个映射和便携式(见第3.2.5.1),在这种情况下,需要每个主机线程块映射到其设备地址空间必须调用cudaHostGetDevicePointer ()来检索设备指针,因为设备指针通常会从一个主机线程到另一个主机线程不同。
我曾专门问关于如何两颗GPU之间的数据传输,并有receieved回应说,如果你想使用同时两个GPU和传输数据之间,必须有两个线程对NVIDIA论坛类似的问题(如手册所示)。该手册说“CUDA资源”不能共享,但是它们从中复制的主机内存可以共享(使用openmp或mpi)。因此,如果您将内存从每个设备传回主机,则可以访问设备之间的内存。
请记住,这将是非常缓慢的,因为从/向设备传输内存将非常缓慢。
所以,不,你不能从gpu2访问gpu1内存(即使是sli--我一直被大吼大叫因为与cuda没有任何关系)。然而,你可以把gpu1写入主机上的一个区域,然后把gpu2写入另一个区域,并允许管理每个设备的线程将必要的数据写回正确的gpu。
为什么要使用MPI。他说,他有多个GPU的不是主机 – user567879 2013-09-06 07:18:07