CUDA如何知道何时进行同步?

CUDA如何知道何时进行同步?,cuda,Cuda,假设我有一组浮点gpu指针->数据集:[a,B,C,D] 我迭代它,所以要计算B,我需要A,对于C,我需要B,等等 如果我这样做 A = computeA() for prevData, data in dataset: data = computeData(prevData) CUDA是否自动将它们排队,以便一个接一个地完成?我是否需要执行deviceSynchronize()?简言之:如果在同一个流中调用它们(除非您显式定义流,否则它们是),它们将一个接一个地执行 对内核的调用是

假设我有一组浮点gpu指针->数据集:[a,B,C,D]

我迭代它,所以要计算B,我需要A,对于C,我需要B,等等

如果我这样做

A = computeA()

for prevData, data in dataset:
    data = computeData(prevData)

CUDA是否自动将它们排队,以便一个接一个地完成?我是否需要执行deviceSynchronize()?

简言之:如果在同一个流中调用它们(除非您显式定义流,否则它们是),它们将一个接一个地执行


对内核的调用是异步的,但这并不意味着它们将同时发生,它只意味着CPU不会等待内核完成后再对下一个操作进行排队。如果需要,您可以添加一个
deviceSynchronize()
,因为除非调用之间有一些繁重的CPU计算,否则它不会对执行产生影响,它只会暂停CPU,直到内核完成

好的,如果我必须完全分离不相关的操作。假设A和B,我运行两个内核,它们实际上是背靠背运行的?在这种情况下,为了更好地并行化,我应该有两个流?@raaj如果你真的在gpu上获得了加速,99.9%可以肯定你的内核在运行时使用了100%的处理器。否则,您运行的计算量太小,可能无法在GPU中提高速度。因此,我认为你不需要把它们分开。您可能希望使用它是因为代码的逻辑,但不是因为速度。流通常非常有用,主要用于重叠的memcpy和compute