cuda - 将整数从 GPU 复制到 CPU

标签 cuda

在每次内核调用之后,我需要将单个 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/

相关文章:

visual-studio-2010 - 哪些编译器支持 CUDA

c++ - 表示嵌套的 C++ 模板

c++ - 这种 CUDA 加速是可以预料的吗?

c++ - 将字符串引用作为参数传递时错误的 Ptr

c++ - 大数组的 cudaMemcpy2D 错误

c++ - Cuda寄存器编译器优化

c++ - 我的 VAO 不工作,我如何用 Cuda 改变它?

gcc - 在二进制文件中查找compute和sm编号

c++ - 如何在cuda上创建全局可访问的变量?

c++ - 在新线程中调用支持 CUDA 的库