我没有找到关于内核启动操作机制的太多信息。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);
第 3 行是同步的。第 4 & 5 行是异步的,机器支持并发执行。所以在某些时候,这两个内核都在 GPU 上运行。(kernelB 有可能在 kernelA 完成之前启动并完成。)此时,主机正在执行第 6 行。第 6 行相对于复制操作是同步的,但没有什么阻止它在 kernelA 或之前执行kernelB 已完成。
1)GPU中有内核队列吗?(GPU 是否阻塞/停止主机?)
2)主机如何知道内核已经完成,并且将结果从设备传输到主机是“安全的”?