CUDA同步内核

CUDA同步内核,cuda,Cuda,嗨,我对CUDA的编程有疑问。 我有以下代码: int main () { for (;;) { kernel_1 (x1, x2, ....); kernel_2 (x1, x2 ...); kernel_3_Reduction (x1); // code manipulation host_x1 // Copy the pointer device to host cpy (host_x1, x1,

嗨,我对CUDA的编程有疑问。 我有以下代码:

int main () {

    for (;;) {
        kernel_1 (x1, x2, ....);
        kernel_2 (x1, x2 ...);
        kernel_3_Reduction (x1);

    // code manipulation host_x1
    // Copy the pointer device to host
        cpy (host_x1, x1, DeviceToHost)
        cpu_code_x1_manipulation;
        kernel_ (x1, x2, ....);
    }

}

那么复印件什么时候制作的​​如何确保kernel_1、kernel_2、kernel_3和完成它们的任务?

在同一个流上启动的所有操作都是同步的。在上面的代码中,所有内核将一个接一个地运行。如果需要内核1和内核2并行运行,则必须显式指定流。

使用
cudaDeviceSynchronize()正是您希望确保完成所有内核的地方。执行此命令后,可以假定所有内核和所有挂起的设备函数调用都已完成。

除非使用流和其他构造,否则所有cuda调用(内核、cudamemCpy等)都将在默认流中发出,并且它们将被阻塞(直到前一个cuda调用完成后才会开始)。只要不切换流,cudaMemcpy就不会将控制返回到CPU线程,直到它完成。同样,在所有之前的cuda调用完成之前,cudaMemcpy不会启动。应该注意的是,并非所有cuda设备都支持内核的并发执行。当然,如果存在多个CUDA设备,它们可以并行运行内核。我相信,在Fermi和具有CC 2.x及更高版本的更高体系结构上,在单个GPU设备上实际启动多达16个并发内核是可能的。我想一个接一个地实现kernel_1、kernel_2 kernel和kernel 3,即CPU保持停止状态,直到kernels@user1704397上面的代码就是这样做的,只是CPU不会等待工作完成。在第三次内核调用之后使用cudaDeviceSynchronize()等待工作完成,正如ahmad在另一个回答中所建议的那样。感谢您的回复!因此,当执行核_3_约简(x1)时,结果不是预期的。显然,在内核_1和内核_2中进行的计算尚未完成。为了确保kernel_1 kernel_2已经完成,我使用:kernel_1();cudaDeviceSynchronize();内核_2();cudaDeviceSynchronize();核_3_约化();cudaDeviceSynchronize();cpy(主机x1,x1,设备主机)cpu代码x1操作;核_4(x1,x2,…);cudaDeviceSynchronize();我想一个接一个地实现kernel_1、kernel_2和kernel 3,即CPU保持停止状态,直到内核执行完成