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

调用推力后启动的CUDA内核是同步的还是异步的?,cuda,thrust,Cuda,Thrust,我的计算结果有一些问题,由于某些原因它们不正确,我检查了代码,它似乎是正确的(尽管我会再次检查) 我的问题是定制cuda内核在调用推力后启动后是同步的还是异步的,例如 thrust::sort_by_key(args); arrangeData<<<blocks,threads>>>(args); 推力::按键排序(args); 排列数据(args); 内核arrangeData是否会在推力::sort完成后运行?假设您的代码看起来是这样的,并且没有流的使

我的计算结果有一些问题,由于某些原因它们不正确,我检查了代码,它似乎是正确的(尽管我会再次检查)

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

thrust::sort_by_key(args);
arrangeData<<<blocks,threads>>>(args);
推力::按键排序(args);
排列数据(args);

内核
arrangeData
是否会在
推力::sort
完成后运行?

假设您的代码看起来是这样的,并且没有流的使用(内核调用或推力调用在发布时指示任何流的使用),那么这两个活动都会发布到默认流。我还假设(虽然在本例中不会改变我的答案)传递给推力调用的
args
是设备参数,而不是主机参数。(例如,
设备向量
,而不是
主机向量

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

arrangeData
内核将在通过
推力::按键排序
调用启动的任何内核完成之前不会启动

您可以使用探查器(例如,
nvvp

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

向同一流发出的CUDA API调用和内核调用始终是同步的。一个给定的内核将不会开始执行,直到所有之前发给该流的cuda活动(甚至像
cudaMemcpyAsync
)完成