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

BRa*_*t27 2 cuda thrust

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

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

thrust::sort_by_key(args);
arrangeData<<<blocks,threads>>>(args);
Run Code Online (Sandbox Code Playgroud)

完成arrangeData之后内核会运行thrust::sort吗?

Rob*_*lla 5

假设您的代码看起来像这样,并且没有使用流(不管内核调用和推力调用是否表示您发布了任何流使用),则两个活动都将发布到默认流.我还假设(尽管在这种情况下它不会改变我的答案)args传递给推力调用的是设备参数,而不是主机参数.(例如device_vector,不host_vector).

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

在调用启动的任何内核完成之前,arrangeData内核不会启动thrust::sort_by_key.

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

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

发给同一个流的CUDA API调用和内核调用始终是相互同步的.在发布到该流(甚至类似的东西cudaMemcpyAsync)的所有先前cuda活动完成之前,给定内核将不会开始执行.