我的计算结果遇到了一些麻烦,由于某种原因它们不正确,我检查了代码,看起来是正确的(虽然我会再次检查)。
我的问题是,在调用推力之后启动后,自定义cuda内核是同步还是异步,例如
thrust::sort_by_key(args);
arrangeData<<<blocks,threads>>>(args);
内核arrangeData
将在thrust::sort
完成后运行吗?
答案 0 :(得分:5)
假设您的代码看起来像这样,并且没有使用流(无论是内核调用还是推力调用都表明您发布了任何流使用),那么这两个活动都会发送到默认值流。我还假设(虽然在这种情况下它不会改变我的答案)传递给推力调用的args
是设备参数,而不是主机参数。 (例如device_vector
,而非host_vector
)。
发布到默认流(或任何给定的单个流)的所有CUDA API和内核调用都将按顺序执行。
在arrangeData
调用启动的任何内核完成后,thrust::sort_by_key
内核才会开始。
您可以使用分析器验证这一点,例如nvvp
请注意,同步与异步可能有点令人困惑。当我们谈论内核启动是异步时,我们几乎总是指主机CPU活动,即内核启动是关于主机线程的异步,这意味着它立即将控制权返回给主机线程,并且它的执行将在主机线程的某个未指定的时间发生。
发出到同一个流的CUDA API调用和内核调用始终是相互同步的。在发布到该流的所有先前cuda活动 <(即使像cudaMemcpyAsync
之类的内容)已完成之前,给定内核将不会开始执行。