Cuda 将整数从GPU复制到CPU

Cuda 将整数从GPU复制到CPU,cuda,Cuda,在每次内核调用之后(我在for循环中调用同一个内核),我需要将一个布尔值或整数值从设备复制到主机。也就是说,在每次内核调用之后,我需要向主机发送一个整数或布尔值。最好的方法是什么 我应该直接将值写入RAM吗?或者我应该使用cudaMemcpy()?还是有其他方法可以做到这一点?每次内核启动后只复制1个整数会降低我的程序速度吗?向GPU复制数据和从GPU复制数据会比从CPU访问数据慢得多。如果您没有为此值运行大量线程,那么这将导致非常慢的性能,请不要这样做 你所描述的听起来像是一个串行算法,你的算

在每次内核调用之后(我在for循环中调用同一个内核),我需要将一个布尔值或整数值从设备复制到主机。也就是说,在每次内核调用之后,我需要向主机发送一个整数或布尔值。最好的方法是什么


我应该直接将值写入RAM吗?或者我应该使用cudaMemcpy()?还是有其他方法可以做到这一点?每次内核启动后只复制1个整数会降低我的程序速度吗?

向GPU复制数据和从GPU复制数据会比从CPU访问数据慢得多。如果您没有为此值运行大量线程,那么这将导致非常慢的性能,请不要这样做


你所描述的听起来像是一个串行算法,你的算法需要并行化,以使它值得使用CUDA。如果你不能重写你的算法,使之成为一次将多个数据写入GPU、多个线程、单次将多个数据写入CPU;那么您的算法应该在CPU上完成。

让我先回答您的最后一个问题:

每次内核启动后只复制1个整数会降低我的程序速度吗

有点-是的。发出命令,等待GPU响应等等。。。在这种情况下,数据量(1整数vs 100整数)可能并不重要。但是,您仍然可以达到每秒数千次内存传输的速度。最有可能的是,您的内核会比这个单一内存传输慢(否则,在CPU上完成整个任务可能会更好)

最好的方法是什么

嗯,我建议你自己试试。正如您所说:您可以使用映射的固定内存并让内核将值直接存储到RAM,也可以使用cudaMemcpy。如果您的内核在返回整数后仍有一些工作要做,那么第一个可能会更好。在这种情况下,内核的执行可能会隐藏发送到主机的延迟

如果使用第一种方法,则必须调用
cudaThreadsynchronize()
,以确保内核结束其执行。内核调用是异步的

您可以使用同样异步的
cudaMemcpyAsync
,但GPU不能让内核运行并并行执行
cudaMemcpyAsync
,除非您使用流


实际上我从未尝试过,但是如果循环执行太多次,您的程序不会崩溃,您可以尝试忽略同步,让它迭代,直到在RAM中看到特殊值为止。在该解决方案中,内存传输可能完全隐藏,您只需在最后支付开销。但是,您需要以某种方式防止循环重复太多次,CUDA事件可能会有所帮助。

如果您需要在前一个内核调用中计算的值来启动下一个内核调用,则将其序列化,您的选择是cudaMemcpy(dst,src,size=1,…)


如果所有内核启动参数不依赖于上一次启动,那么您可以将每次内核调用的所有结果存储在GPU内存中,然后一次下载所有结果。

为什么不使用固定内存?如果您的系统支持,请参阅《CUDA C编程指南》中关于固定内存的章节。

我认为它可能是一种串行算法,内部包含复杂的并行块。@CygnusX1如果您阅读了我的答案,您会发现它适应了这种可能性。第一段,是的。但当你说“你所描述的听起来像是一个串行算法”——尽管我的程序是高度并行的,但我已经多次遇到与问题作者类似的问题。这就是我的评论。@CynusX1如果你读了我的第二段,你会看到“.单写,多线程,…”。我们都面临过这个问题。对于复制单个变量,我建议使用商定的,
cudaMemcpyFromSymbol
很好地将数据复制到全局设备变量(或常量)或从全局设备变量复制数据。我不认为它实际上比cudaMemcpy快很多,但我没有做任何测试。