我目前正在使用一个应用程序,它产生了一堆pthread (linux),每个pthread都创建了自己的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()将其使用括起来。