2010-11-10 65 views
3

CUDA C编程指南,据说CUDA:在多个设备之间共享数据?

...通过设计,主机线程只能在一个设备上,在任何给定的时间执行设备代码。因此,需要多个主机线程才能在多个设备上执行设备代码。此外,通过在一个主机线程运行时创建的任何CUDA资源不能由其他主机线程运行时使用......

我想要做的就是在主机(映射内存)两个GPU共享数据,
但手册似乎说这是不可能的。
有没有这方面的解决方案

回答

1

你可能想看看GMAC。这是一个建立在CUDA之上的库,可以让人感受到共享内存的错觉。它实际上做的是在主机和GPU设备上的相同虚拟地址处分配内存,并使用页面保护按需传输数据。请注意,这有点实验性,可能在beta测试阶段。

http://code.google.com/p/adsm/

3

当你分配主机的内存,您应该分配使用cudaHostAlloc()并通过cudaHostAllocPortable标志。这将允许多个CUDA上下文访问内存。

0

你想通过传递cudaHostAllocPortablecudaHostAlloc()分配您的固定内存为便携式。您可以在同一固定内存的设备之间在内核之外交换数据,正如我之前所做的那样。至于映射的内存,我不太确定,但我不明白为什么你不能。尝试使用cudaHostGetDevicePointer()获取用于当前设备(与同一CPU线程关联的设备)的设备指针。

CUDA编程指南(v3.2)第3.2.5.3节中有更多信息:

页面锁定主机存储器的块可被分配为两个映射和便携式(见第3.2.5.1),在这种情况下,需要每个主机线程块映射到其设备地址空间必须调用cudaHostGetDevicePointer ()来检索设备指针,因为设备指针通常会从一个主机线程到另一个主机线程不同。

0

我曾专门问关于如何两颗GPU之间的数据传输,并有receieved回应说,如果你想使用同时两个GPU和传输数据之间,必须有两个线程对NVIDIA论坛类似的问题(如手册所示)。该手册说“CUDA资源”不能共享,但是它们从中复制的主机内存可以共享(使用openmp或mpi)。因此,如果您将内存从每个设备传回主机,则可以访问设备之间的内存。

请记住,这将是非常缓慢的,因为从/向设备传输内存将非常缓慢。

所以,不,你不能从gpu2访问gpu1内存(即使是sli--我一直被大吼大叫因为与cuda没有任何关系)。然而,你可以把gpu1写入主机上的一个区域,然后把gpu2写入另一个区域,并允许管理每个设备的线程将必要的数据写回正确的gpu。