调用推力后推出的CUDA内核是同步还是异步?

时间:2014-12-03 18:02:43

标签: cuda thrust

我的计算结果遇到了一些麻烦,由于某种原因它们不正确,我检查了代码,看起来是正确的(虽然我会再次检查)。

我的问题是,在调用推力之后启动后,自定义cuda内核是同步还是异步,例如

thrust::sort_by_key(args);
arrangeData<<<blocks,threads>>>(args);

内核arrangeData将在thrust::sort完成后运行吗?

1 个答案:

答案 0 :(得分:5)

假设您的代码看起来像这样,并且没有使用流(无论是内核调用还是推力调用都表明您发布了任何流使用),那么这两个活动都会发送到默认值流。我还假设(虽然在这种情况下它不会改变我的答案)传递给推力调用的args是设备参数,而不是主机参数。 (例如device_vector,而非host_vector)。

发布到默认流(或任何给定的单个流)的所有CUDA API和内核调用都将按顺序执行。

arrangeData调用启动的任何内核完成后,thrust::sort_by_key内核才会开始

您可以使用分析器验证这一点,例如nvvp

请注意,同步异步可能有点令人困惑。当我们谈论内核启动是异步时,我们几乎总是指主机CPU活动,即内核启动是关于主机线程的异步,这意味着它立即将控制权返回给主机线程,并且它的执行将在主机线程的某个未指定的时间发生。

发出到同一个流的CUDA API调用和内核调用始终是相互同步的。在发布到该流的所有先前cuda活动 <(即使像cudaMemcpyAsync之类的内容)已完成之前,给定内核将不会开始执行。