我在内核启动操作的机制方面没有找到太多信息。API提到要查看CudaProgGuide,但那里也没有太多内容。
由于内核执行是异步的,而且一些机器支持并发执行,我认为这意味着有一个内核队列。
Host code:
1. malloc(hostArry, ......);
2. cudaMalloc(deviceArry, .....);
3. cudaMemcpy(deviceArry, hostArry, ... hostToDevice);
4. kernelA<<<1,300>>>(int, int);
5. kernelB<<<10,2>>>(float, int));
6. cudaMemcpy(hostArry, deviceArry, ... deviceToHost);
7. cudaFree(deviceArry);
第三行是同步的。第四行和第五行是异步的,并且机器支持并发执行。因此,在某个时刻,这两个内核都在GPU上运行。(有可能kernelB在kernelA完成之前开始并完成)。在此期间,主机正在执行第6行。第6行与复制操作同步,但没有阻止它在kernelA或kernelB完成之前执行。
1)GPU中是否有内核队列?(GPU是否会阻塞/停顿主机?) 2)主机如何知道内核已经完成,并且将结果从设备传输到主机是“安全”的?