在cuda内核运行时访问cuda设备内存

在cuda内核运行时访问cuda设备内存,cuda,gpgpu,Cuda,Gpgpu,我已经使用cudamaloc在设备上分配了内存,并将其传递给了内核函数。是否可以在内核完成执行之前从主机访问该内存?无论内核是否正在运行,都不能直接从主机访问GPU内存 如果您正在谈论在内核完成写入之前将内存复制回主机,那么答案取决于设备的计算能力。但是,除了最古老的芯片外,所有芯片都可以在内核运行时执行数据传输 不过,您似乎不太可能希望复制仍由内核更新的内存。您将获得部分完成数据的随机快照。相反,您可能希望在设备上设置两个缓冲区。您可以在GPU处理另一个缓冲区时复制其中一个缓冲区 更新: 根据

我已经使用cudamaloc在设备上分配了内存,并将其传递给了内核函数。是否可以在内核完成执行之前从主机访问该内存?

无论内核是否正在运行,都不能直接从主机访问GPU内存

如果您正在谈论在内核完成写入之前将内存复制回主机,那么答案取决于设备的计算能力。但是,除了最古老的芯片外,所有芯片都可以在内核运行时执行数据传输

不过,您似乎不太可能希望复制仍由内核更新的内存。您将获得部分完成数据的随机快照。相反,您可能希望在设备上设置两个缓冲区。您可以在GPU处理另一个缓冲区时复制其中一个缓冲区

更新:

根据您的说明,我认为最接近的方法是使用映射的页面锁定主机内存,也称为零拷贝内存。使用这种方法,在内核写入值时将值复制到主机。无法查询内核以查看它执行了多少工作,因此我认为您必须重复扫描内存以查找新写入的值。有关更多信息,请参阅CUDA编程指南v4.2中的第3.2.4.3节“映射内存”


不过我不推荐这个。除非您有一些非常特殊的要求,否则可能有更好的方法来完成任务。

无论内核是否正在运行,您都无法直接从主机访问GPU内存

如果您正在谈论在内核完成写入之前将内存复制回主机,那么答案取决于设备的计算能力。但是,除了最古老的芯片外,所有芯片都可以在内核运行时执行数据传输

不过,您似乎不太可能希望复制仍由内核更新的内存。您将获得部分完成数据的随机快照。相反,您可能希望在设备上设置两个缓冲区。您可以在GPU处理另一个缓冲区时复制其中一个缓冲区

更新:

根据您的说明,我认为最接近的方法是使用映射的页面锁定主机内存,也称为零拷贝内存。使用这种方法,在内核写入值时将值复制到主机。无法查询内核以查看它执行了多少工作,因此我认为您必须重复扫描内存以查找新写入的值。有关更多信息,请参阅CUDA编程指南v4.2中的第3.2.4.3节“映射内存”


不过我不推荐这个。除非您有一些非常不寻常的需求,否则可能有更好的方法来完成任务。

启动内核时,它是一个异步(非阻塞)调用。下一步调用cudaMemcpy将阻塞,直到内核完成

如果你想得到调试结果,也许你可以使用cudaDebugging,在那里你可以逐步检查内核并检查内存

对于小的结果检查,您还可以在内核代码中使用printf()


如果您对特定结果感兴趣,也可以只运行大小为(1,1)的threadblock。

启动内核时,它是一个异步(非阻塞)调用。下一步调用cudaMemcpy将阻塞,直到内核完成

如果你想得到调试结果,也许你可以使用cudaDebugging,在那里你可以逐步检查内核并检查内存

对于小的结果检查,您还可以在内核代码中使用printf()


如果您对特定结果感兴趣,也可以只运行大小为(1,1)的线程块。

这是可能的,但无法保证以这种方式检索的内存内容,因为您不知道内核的进度

您试图实现的是重叠数据传输和执行。通过使用流,这是可能的。创建多个CUDA流,并将内核执行和设备排队,以便在每个流中托管cudaMemcpy。例如,将填充位置“0”的内核和从该位置返回主机的cudaMemcpy放入流0,将填充位置“1”的内核和从“1”返回的cudaMemcpy放入流1,等等。然后将发生的情况是GPU将重叠从“0”复制并执行“1”。
查看CUDA文档,它被记录在某个地方(我认为在最佳实践指南中)。

这是可能的,但无法保证以这种方式检索的内存内容,因为您不知道内核的进度

您试图实现的是重叠数据传输和执行。通过使用流,这是可能的。您创建多个CUDA流,并将内核执行和设备排队,以在每个流中托管CUDAEMCPY。例如,将填充位置“0”的内核和从该位置返回主机的cudaMemcpy放入流0,将填充位置“1”的内核和从“1”返回的cudaMemcpy放入流1,等等。然后将发生的情况是GPU将重叠从“0”复制并执行“1”。
查看CUDA文档,它被记录在某个地方(我想在最佳实践指南中)。

我能想到的在内核仍在执行时启动memcpy的唯一方法是在不同于内核的流中提交异步memcpy。(如果对内核启动或异步memcpy使用默认API,空流将强制序列化这两个操作。)

但由于无法将内核的执行与流同步,因此该代码将受到竞争条件的约束。i、 e.复制引擎可能会从k尚未写入的内存中提取