CUDA流和上下文

时间:2011-07-25 18:08:48

标签: c++ cuda

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

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

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

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

由于

1 个答案:

答案 0 :(得分:6)

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

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

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