2012-09-27 151 views
4

您好我对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, DeviceToHost) 
     cpu_code_x1_manipulation; 
     kernel_ (x1, x2, ....); 
    } 

} 

所以当复印的,如何确保kernel_1,kernel_2 kernel_3并完成他们的任务?

+0

除非你使用流和一些其他的结构,所有的CUDA调用(内核,cudamemCpy等)将在默认流中发布,它们将被阻止(不会开始,直到前面的CUDA调用完成)。只要您不切换流,cudaMemcpy将不会将控制返回到CPU线程,直到它完成。同样,直到所有以前的cuda呼叫完成,cudaMemcpy才会开始。 –

回答

8

在同流推出的所有操作都是同步的。在上面的代码中,所有的内核都会一个接一个地运行。如果需要并行运行kernel_1和kernel_2,则必须明确指定流。

+3

应该注意的是,所有CUDA设备都不支持并行执行内核。当然,如果有多个CUDA设备存在,他们可以并行运行内核。 – datenwolf

+1

我相信,在Fermi和后来的CC 2.x及更高版本架构中,可以在单个GPU设备上实际启动多达16个并发内核。 http://developer.download.nvidia.com/CUDA/training/StreamsAndConcurrencyWebinar.pdf – Recker

+0

我想实现的kernel_1,kernel_2内核和3一前一后,即CPU逗留停止,直到执行完毕内核 – user1704397

1

使用cudaDeviceSynchronize();只是要确保所有内核完成。在这个命令之后,你可以假定所有的内核和所有待处理的设备函数调用都完成了。

+0

感谢您的回复! 因此,当执行kernel_3_reduction(x1)减少时,结果不是预期的。 显然,kernel_1和kernel_2中的计算未完成。 要确保已完成kernel_1 kernel_2我用: kernel_1(); cudaDeviceSynchronize(); kernel_2(); cudaDeviceSynchronize(); kernel_3_reduction(); cudaDeviceSynchronize(); (主机_x1,x1,DeviceToHost) cpu_code_x1_manipulation; kernel_4(x1,x2,...); cudaDeviceSynchronize(); – user1704397

+0

我想实现的kernel_1,kernel_2内核和其他3后一个,即CPU逗留停止,直到内核的执行 – user1704397

+0

叶氏的完成,这是OK! – ahmad