在每次内核调用之后,我需要将单个 bool 值或整数值从设备复制到主机(我在 for 循环中调用相同的内核)。也就是说,在每次内核调用之后,我需要将一个整数或 bool 值发送回主机。最好的方法是什么?
我应该将值直接写入 RAM 吗?或者我应该使用 cudaMemcpy() 吗?或者还有其他方法可以做到这一点吗?每次内核启动后仅复制 1 个整数是否会减慢我的程序速度?
最佳答案
让我先回答你的最后一个问题:
每次内核启动后仅复制 1 个整数是否会减慢我的程序速度?
有一点 - 是的。发出命令,等待 GPU 响应,等等……在这种情况下,数据量(1 个整数 vs 100 个整数)可能并不重要。但是,您仍然可以实现每秒数千次内存传输的速度。最有可能的是,您的内核将比单个内存传输慢(否则,在 CPU 上完成整个任务可能会更好)
最好的方法是什么?
嗯,我建议你自己尝试一下。正如您所说:您可以使用映射固定内存并让内核将值直接存储到 RAM,或者使用 cudaMemcpy。如果您的内核在发送回整数后仍然有一些工作要做,那么第一个可能会更好。在这种情况下,将其发送到主机的延迟可能会被内核的执行隐藏。
如果您使用第一种方法,则必须调用cudaThreadsynchronize()
以确保内核结束其执行。内核调用是异步的。
您可以使用也是异步的 cudaMemcpyAsync
,但 GPU 无法运行内核并并行执行 cudaMemcpyAsync
,除非您使用流。
我从来没有真正尝试过,但是如果循环执行太多次你的程序不会崩溃,你可能尝试忽略同步并让它迭代,直到在 RAM 中看到特殊值。在该解决方案中,内存传输可能完全隐藏,您只需在最后支付开销。然而,您需要以某种方式防止循环迭代太多次,CUDA 事件可能会有所帮助。
关于cuda - 将整数从 GPU 复制到 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5309167/