cuda - cudaMemcpy 从主机到设备并行执行吗?

标签 cuda gpgpu nvidia

我很好奇,当我们从主机复制到设备时,cudaMemcpy 是在 CPU 还是 GPU 上执行的?

换句话说,它是复制一个顺序过程还是并行完成?

让我解释一下我为什么这么问:我有一个包含 500 万个元素的数组。现在,我想从数组的不同部分复制 2 组 50,000 个元素。所以,我在想,首先形成一个包含我想在 CPU 上复制的所有元素的大数组,然后只进行 1 次大型传输,或者我应该只调用 2 个 cudaMemcpy,每组一个。

如果 cudaMemcpy 是并行完成的,那么我认为第二种方法会更快,因为您不必先在 CPU 上按顺序复制 100000 个元素

最佳答案

I am curious if cudaMemcpy is executed on the CPU or the GPU when we copy from host to device?



在使用常规可分页用户分配内存的同步 API 调用的情况下,答案是它在两者上运行。驱动程序必须首先将数据从源内存复制到主机上的 DMA 映射源缓冲区,然后通知 GPU 数据正在等待传输。然后 GPU 执行传输。该过程会根据需要重复多次,以便从源内存到 GPU 的完整副本。

进程的吞吐量可以通过使用 pinned memory 来提高,驱动程序可以直接 DMA 进出,无需中间复制(尽管 pinning 有很大的初始化/分配开销,也需要分摊)。

至于问题的其余部分,我怀疑直接从源内存复制两个内存副本会比替代方案更有效,但这种问题只能通过基准测试来最终回答。

关于cuda - cudaMemcpy 从主机到设备并行执行吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8853148/

相关文章:

c++ - nVidia 推力 : device_ptr Const-Correctness

c++ - 带有 cmake 的 CUDA。找不到配置文件

cuda - 如何在运行时生成、编译和运行 CUDA 内核

c++ - "cast"GL_R8 到 GL_BGRA

c++ - OpenCL 适用于 AMD 但不适用于 Nvidia

gcc - GCC 编译器可以使用 nVidia GPU 来加速编译和/或链接吗?

c++ - 删除CUDA依赖项?

c++ - 生成 AES (AES-256) 查找表

c++ - 改进 CUDA 中的异步执行

CUDA 内核和 2D 数组 - 它是如何工作的?