gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:29:39 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

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

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

向同一流发出的 CUDA API 调用和内核调用始终彼此同步。给定的内核将不会开始执行,直到所有先前的 cuda 事件发布到该流(甚至诸如 cudaMemcpyAsync 之类的事情)完成为止。

关于调用推力后启动的 CUDA 内核是同步还是异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27278552/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com