从K20开始,不同的流变为完全并发(用于边缘并发)。
但是我的程序需要旧的方式。或者我需要做很多同步来解决依赖问题。
是否可以将流管理切换为旧方式?
答案 0 :(得分:6)
Asynchronous Current Execution
上的“CUDA C编程指南”部分流是一系列命令(可能由不同的主机发出) 线程)按顺序执行。另一方面,不同的溪流, 可以相对于彼此无序地执行他们的命令 同时;这种行为无法保证,因此不应该 依赖于正确性(例如,内核间通信是 未定义)。
如果应用程序依赖Compute Capability 2. *和3.0实现流,则程序违反了流的定义,并且对CUDA驱动程序的任何更改(例如,每个流请求的排队)或新硬件都将破坏程序。 / p>
如果您需要临时解决方法,那么我建议将所有工作移至单个用户定义的流。这可能会影响性能,但它可能是唯一的临时解决方法。
答案 1 :(得分:1)
你能用cudaEvent_t
个对象来表达内核依赖吗?
Streams and Concurrency Webinar显示了一些有关如何使用事件的快速代码段。该演示文稿的一些细节仅适用于开普勒之前的硬件,但我从原始问题中假设您已经熟悉自Fermi以来事情发生了变化,现在有多个命令队列。