2011-11-16 61 views
2

我正在重新实现一些使用pthreads的多线程C++图像处理库。我希望能够在每个线程中调用CUDA内核,并且信任设备本身来处理内核调度,但是我知道比指望这种行为更好。有没有人有这种类型的问题的经验?从多线程C++应用程序调用GPU内核?

+0

只有一个链接到GPU,所以我相信在同一时间发送多个东西可能更多的问题与操作系统可能比与CPU。唯一简单的方法就是使用不同的流程。 – Dani

回答

2

CUDA 4.0使得从多个线程驱动单个CUDA上下文简单得多 - 只需调用cudaSetDevice()来指定希望线程提交命令的CUDA设备。

请注意,这可能比从单个线程驱动CUDA上下文效率更低 - 除非CPU线程有其他工作来保证它们在内核启动之间被占用,否则它们可能会被CUDA使用的互斥量序列化在内部保持其数据结构的一致性。

2

也许Cuda流是解决您的问题。尝试从每个线程中的不同流中调用内核。但是,我不明白这将如何帮助,因为我认为即使它们是并行调用的,你的内核执行也会被序列化。事实上,即使在同一个流上的Cuda内核调用本质上也是异步的,所以您可以从同一个线程进行任意数量的调用。我真的不明白你想达到什么目的。

+1

在单个流上,就主机而言,调用是异步的,但与GPU同步(一切按顺序执行,一个操作必须在下一个开始之前完成)。这适用于内存操作以及内核启动。在单个流中,您不能将计算中的内存操作重叠/交错。多个流可以重叠,这是潜在优势的来源。有关更多信息,请参阅此处(有关Streams和Async API的部分):http://mc.stanford.edu/cgi-bin/images/0/0a/M02_4.pdf –