5

我目前正在使用一个应用程序,它产生一堆 pthreads (linux),每个线程都创建它自己的 CUDA 上下文。(现在使用 cuda 3.2)。

我遇到的问题是,似乎每个线程都有自己的上下文会在 GPU 上消耗大量内存。每个线程大约 200MB,所以这真的限制了我。

我可以简单地在主机线程中创建流,将流引用传递给工作线程,然后它们就可以将它们的流编号传递给我的 CUDA 库,并且所有工作都在相同的上下文中工作?

工作线程是否自动知道与其父线程相同的 CUDA 上下文?

谢谢

4

1 回答 1

11

每个 CUDA 上下文确实花费了相当多的设备内存,并且它们的资源彼此严格划分。例如,在上下文 A 中分配的设备内存不能被上下文 B 访问。流也仅在创建它们的上下文中有效。

最佳实践是为每个设备创建一个 CUDA 上下文。默认情况下,该 CUDA 上下文只能从创建它的 CPU 线程访问。如果要从其他线程访问 CUDA 上下文,请调用 cuCtxPopCurrent() 从创建它的线程中弹出它。然后可以将上下文推送到任何其他 CPU 线程的当前上下文堆栈,随后的 CUDA 调用将引用该上下文。

上下文推送/弹出是轻量级操作,从 CUDA 3.2 开始,它们可以在 CUDA 运行时应用程序中完成。所以我的建议是初始化 CUDA 上下文,然后调用 cuCtxPopCurrent() 使上下文“浮动”,除非某些线程想要操作它。将“浮动”状态视为自然状态 - 每当线程想要操作上下文时,使用 cuCtxPushCurrent()/cuCtxPopCurrent() 将其使用括起来。

于 2011-07-26T13:11:44.433 回答