在CUDA C编程指南中,据说
...按照设计,主机线程可以在任何给定时间仅在一个设备上执行设备代码。因此,需要多个主机线程来在多个设备上执行设备代码。此外,运行时在另一个主机线程中不能使用通过运行时在一个主机线程中创建的任何CUDA资源...
我想要做的是让两个GPU在主机(映射内存)上共享数据,
但手册似乎说这是不可能的。
有什么解决方案吗
答案 0 :(得分:3)
在分配主机内存时,应使用cudaHostAlloc()
进行分配并传递cudaHostAllocPortable
标志。这将允许多个CUDA上下文访问内存。
答案 1 :(得分:1)
解决方案是手动管理这些常见数据。即使使用SLI。
卡在SLI模式下实际上没有共享内存 - 必须通过总线将共享数据从一个复制到另一个。
答案 2 :(得分:1)
您可能想看看GMAC。它是一个建立在CUDA之上的库,它提供了共享内存的幻觉。它实际上做的是在主机和GPU设备上的同一虚拟地址分配内存,并使用页面保护按需传输数据。请注意,它有点实验性,可能处于beta测试阶段。
答案 3 :(得分:0)
也许考虑使用像MPI这样的东西和CUDA?
http://forums.nvidia.com/index.php?showtopic=30741
http://www.ncsa.illinois.edu/UserInfo/Training/Workshops/CUDA/presentations/tutorial-CUDA.html
答案 4 :(得分:0)
您希望将cudaHostAllocPortable
传递给cudaHostAlloc()
,将固定内存分配为便携式。你可以在同一个固定内存的设备之间交换内核之外的数据,我之前已经这样做了。至于映射内存,我不太确定,但我不明白为什么你不能。尝试使用cudaHostGetDevicePointer()
获取用于当前设备的设备指针(您已使用相同的CPU线程。)
“CUDA编程指南”(v3.2)第3.2.5.3节中有更多信息:
页面锁定主机内存块可以分配为映射和可移植(参见第3.2.5.1节),在这种情况下,需要将块映射到其设备地址空间的每个主机线程必须调用cudaHostGetDevicePointer()检索设备指针,因为设备指针通常会因一个主机线程而异。
答案 5 :(得分:0)
我在NVIDIA论坛上特别提出了一个类似的问题,关于如何在两个gpus之间传输数据并收到回复说明如果你想同时使用两个gpus并在它们之间传输数据,你必须有两个线程(作为手册建议)。手册说“CUDA资源”不能共享,但是可以共享它们复制的主机内存(使用openmp或mpi)。因此,如果您将内存从每个设备传输回主机,则可以访问设备之间的内存。
请记住,这将非常缓慢,因为内存与设备之间的传输速度非常慢。
所以没有你不能从gpu2访问gpu1内存(即使是sli - 我因为没有与cuda完全相关而被大喊)。但是你可以使用gpu1,写入主机上的某个区域,然后使用gpu2并写入另一个区域,并允许管理每个设备的线程将必要的数据写回正确的gpu。