两个进程可以共享同一块GPU内存吗?(CUDA)

17
在 CPU 的世界里,可以通过内存映射来实现。GPU 是否也能做类似的事情呢?
如果两个进程可以共享相同的 CUDA 上下文,那么我认为这将是微不足道的 - 只需传递 GPU 内存指针即可。是否可能在两个进程之间共享相同的 CUDA 上下文?
我能想到的另一个可能性是将设备内存映射到内存映射的主机内存中。由于它是内存映射的,因此可以在两个进程之间共享。这有意义/可行吗?是否存在任何开销?

@RobertCrovella:这可能是任何人能够提供的最好答案。如果你想添加它,我会很高兴给它点赞。 - talonmies
1个回答

18
CUDA MPS有效地允许来自2个或多个进程的CUDA活动表现为它们在GPU上共享相同的上下文。(为了清晰起见: CUDA MPS不会导致两个或多个进程共享相同的上下文。但是,工作调度行为看起来类似于如果工作来自同一进程和因此相同的上下文,你将观察到什么。) 然而,这并不能满足您的要求:
“两个进程可以共享相同的GPU内存吗?”
一种实现这一点的方法是通过CUDA IPC (进程间通信) API。
这将允许您在多个进程之间共享已分配的设备内存区域(即通过cudaMalloc分配的内存区域)。 这个答案 包含了更多学习CUDA IPC的资源。
然而,根据我的测试,这并不允许在多个进程之间共享主机固定内存区域(例如通过cudaHostAlloc分配的区域)。内存区域本身可以使用特定OS可用的普通IPC机制进行共享,但无法使其在2个或多个进程中显示为“固定”内存(根据我的测试)。

请问您能详细说明为什么共享cuda上下文并不意味着可以共享设备内存吗?是因为即使cuda上下文相同,进程A的设备内存指针值在进程B中仍然没有意义吗? - Helin Wang
3
我没有说“共享CUDA上下文不能实现共享设备内存”。我说的是CUDA MPS无法实现共享设备内存。如果你想了解是否共享CUDA上下文允许共享设备内存,你需要更具体一些。对于同一进程中的两个线程,它们可以共享相同的上下文。据我所知,CUDA没有提供任何方法让两个独立的进程共享相同的上下文。如果你认为有这样的方法,请具体说明并指出如何在两个独立的进程之间共享相同的CUDA上下文。 - Robert Crovella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接