CUDA流和上下文

Der*_*rek 5 c++ cuda

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

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

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

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

谢谢

Arc*_*are 7

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

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

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

  • 当第一次实现 push/pop 时,一次只有一个 CPU 线程可以拥有当前的上下文。`cuCtxSetCurrent()` 是后来添加的,在 NVIDIA 修复了 CUDA 之后,因此一个上下文可以同时对多个线程进行当前处理。所以,我希望你的代码能正常工作。 (2认同)