【发布时间】:2014-01-28 23:06:19
【问题描述】:
我有一个处理大量数据的 CUDA 内核。 由于我无法一次传输所有数据,我必须将它们分成块并逐块处理它们并更新 GPU 上的输出。 我正在解析文件中的输入数据。 我在想是否可以通过在主机和 GPU 中都有两个缓冲区来重叠块的内存传输。在处理一个卡盘时,我可以读取另一个卡盘,将其传输到 GPU 并将内核启动到同一流。 我的问题是内核的执行时间比解析数据并将它们传输到 GPU 慢。鉴于 memcpys 没有阻塞,我如何确保 memcpys 不会覆盖内核使用的数据?
//e.g. Pseudocode
//for every chunk
//parse data
//cudaMemcpyAsync ( dev, host, size, H2D )
//launch kernel
//switch_buffer
//copy result from device to host
提前谢谢你。
【问题讨论】:
-
如果你可以选择不要每次都重用相同的内存并切换缓冲区,你可以看看这个webinar。一种可能性是为每对对应的 memcpy 和内核启动使用不同的流。此外,您必须确保使用固定内存!在您的伪代码中,
cudaMemcpyAsync中也缺少使用的 cuda 流。
标签: c++ asynchronous cuda parallel-processing overlap