我目前正在使用一个应用程序,它产生一堆 pthreads (linux),每个线程都创建它自己的 CUDA 上下文。(现在使用 cuda 3.2)。
我遇到的问题是,似乎每个线程都有自己的上下文会在 GPU 上消耗大量内存。每个线程大约 200MB,所以这真的限制了我。
我可以简单地在主机线程中创建流,将流引用传递给工作线程,然后它们就可以将它们的流编号传递给我的 CUDA 库,并且所有工作都在相同的上下文中工作?
工作线程是否自动知道与其父线程相同的 CUDA 上下文?
谢谢
我目前正在使用一个应用程序,它产生一堆 pthreads (linux),每个线程都创建它自己的 CUDA 上下文。(现在使用 cuda 3.2)。
我遇到的问题是,似乎每个线程都有自己的上下文会在 GPU 上消耗大量内存。每个线程大约 200MB,所以这真的限制了我。
我可以简单地在主机线程中创建流,将流引用传递给工作线程,然后它们就可以将它们的流编号传递给我的 CUDA 库,并且所有工作都在相同的上下文中工作?
工作线程是否自动知道与其父线程相同的 CUDA 上下文?
谢谢
每个 CUDA 上下文确实花费了相当多的设备内存,并且它们的资源彼此严格划分。例如,在上下文 A 中分配的设备内存不能被上下文 B 访问。流也仅在创建它们的上下文中有效。
最佳实践是为每个设备创建一个 CUDA 上下文。默认情况下,该 CUDA 上下文只能从创建它的 CPU 线程访问。如果要从其他线程访问 CUDA 上下文,请调用 cuCtxPopCurrent() 从创建它的线程中弹出它。然后可以将上下文推送到任何其他 CPU 线程的当前上下文堆栈,随后的 CUDA 调用将引用该上下文。
上下文推送/弹出是轻量级操作,从 CUDA 3.2 开始,它们可以在 CUDA 运行时应用程序中完成。所以我的建议是初始化 CUDA 上下文,然后调用 cuCtxPopCurrent() 使上下文“浮动”,除非某些线程想要操作它。将“浮动”状态视为自然状态 - 每当线程想要操作上下文时,使用 cuCtxPushCurrent()/cuCtxPopCurrent() 将其使用括起来。