【发布时间】:2012-10-05 20:49:38
【问题描述】:
我没有找到太多关于内核启动操作机制的信息。 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) 主机如何知道内核已经完成,并且将结果从设备 Xfer 到主机是“安全的”?
【问题讨论】:
-
提交到 GPU 的工作是提交到流。每个工作流将按顺序执行。代码示例使用默认流,因此所有操作都将在 GPU 上按顺序执行。 CPU 可能会在 kernelA 开始在 GPU 上执行之前开始执行 cudaMemcpy。但是,内存操作只有在 kernelB 完成后才会发生。有关更多信息,请参阅CUDA C/C++ Streams and Concurrency 网络研讨会。
-
@Doug,您似乎将 CPU/GPU 并发(异步)与 GPU/GPU 并发混淆了。在您的示例中,kernelB 不可能在 kernelA 完成之前启动或完成,因为它们都在 NULL 流中启动并因此被序列化。如果它们在不同的流中,它们可能会在 GPU 上并发执行;但内核调用是异步的(CPU 在运行时继续执行)。 cudaMemcpy() 调用根据定义是同步的——它会等到 memcpy 完成后再返回。见第 2.5 节:bit.ly/TbZcq4
标签: cuda