【问题标题】:GPU reads from CPU or CPU writes to the GPU?GPU从CPU读取或CPU写入GPU?
【发布时间】:2012-07-03 05:28:26
【问题描述】:

我是并行编程的初学者。我有一个可能看起来很愚蠢的查询,但是当我用谷歌搜索它时,我没有得到明确的答案。

在 GPU 计算中,有一个设备(即 GPU)和主机(即 CPU)。我写了一个简单的 hello world 程序,它将在 gpu 上分配一些内存,将两个参数(比如 src[] 和 dest[])传递给内核,复制 src 字符串,即 Hello world 到 dest 字符串并从 gpu 获取 dest 字符串到主人。

字符串“src”是由GPU读取还是CPU写入GPU?另外,当我们从 GPU 取回字符串时,是 GPU 写入 CPU 还是 CPU 从 GPU 读取?

在来回传输数据时,可能有四种可能性 1.CPU到GPU - CPU 写入 GPU - GPU 从 CPU 读取 2.GPU到CPU - GPU 写入 CPU - CPU 从 GPU 读取

谁能解释一下哪些是可能的,哪些不是?

【问题讨论】:

    标签: cuda opencl gpu


    【解决方案1】:

    我刚刚在这个论坛http://devgurus.amd.com/thread/129897 发现使用 CL_MEM_ALLOC_HOST_PTR | clCreateBuffer 中的 CL_MEM_COPY_HOST_PTR 在主机上分配内存,并且不会在设备上复制。

    性能可能存在问题,但这是我正在寻找的。请你的cmets..

    【讨论】:

      【解决方案2】:

      其实这些都没有。 您的 CPU 代码启动数据的副本,但数据由内存控制器通过系统上的任何总线传输到 GPU 的内存。同时,CPU 可以处理其他数据。 类似地,当 GPU 运行完你启动的内核后,你的 CPU 代码会启动数据的拷贝,但同时 GPU 和 CPU 都可以处理其他数据或运行其他代码。

      副本称为异步或非阻塞。您可以选择执行阻塞复制,其中 CPU 等待复制完成。

      在启动异步任务时,通常会注册一个“事件”,这是一种稍后可以检查的标志,以查看任务是否完成。

      【讨论】:

        【解决方案3】:

        在 OpenCL 中,主机 (CPU) 专门控制 GPU 和 GPU 之间的所有数据传输。主机使用缓冲区将数据传输到 GPU。主机传回(读)回 从 GPU 使用缓冲区。对于某些系统和设备,传输不是物理复制字节,因为主机和 GPU 使用相同的物理内存。这称为零拷贝。

        【讨论】:

          【解决方案4】:

          在早期版本的 CUDA 和相应的硬件模型中,GPU 更严格地是 CPU 拥有的协处理器; CPU 将信息写入 GPU,并在 GPU 准备就绪时将信息读回。在较低级别,这意味着实际上所有四件事都在发生:CPU 将数据写入 PCIe,GPU 从 PCIe 读取数据,GPU 然后将数据写入 PCIe,然后 CPU 读回结果。但是事务是由 CPU 发起的。

          最近(CUDA 3?4?甚至可能从 2 开始?),其中一些细节对应用程序级别隐藏,因此,GPU 代码可以有效地导致传输以与CPU可以。考虑统一虚拟寻址,程序员可以访问统一的虚拟地址空间用于 CPU 和 GPU 内存。当 GPU 请求 CPU 空间中的内存时,这必须从 CPU 发起传输,本质上是从 CPU 读取。也保留了从 CPU 端将数据放到 GPU 上的能力。基本上,所有方式现在都是可能的,在顶层(在低层,它与往常一样基本上是同一类型的协议:读取和写入 PCIe 总线,但现在,GPU 也可以启动事务)。

          【讨论】:

          • 通过各种同步控制器归结为 DMA (en.wikipedia.org/wiki/Direct_memory_access)。
          • 非常感谢。很高兴知道 GPU 也可以发起交易。那么有没有办法知道谁使用 Opencl 中的任何库例程实际发起了交易?或者我可以强制 CPU 或 GPU 执行事务的例程..?
          • 我对 OpenCL 的了解并不像我应该的那样;话虽如此,如果 CUDA 没有为您提供某种方法来检查变量在统一虚拟地址空间中的位置,我会感到惊讶。这类信息可能很有用,即使在显式管理传输的用例之外(新版本仍应支持)。
          猜你喜欢
          • 1970-01-01
          • 2012-10-31
          • 2016-02-19
          • 2019-10-02
          • 2017-03-30
          • 2021-09-28
          • 2016-06-22
          • 2013-03-06
          • 2021-12-20
          相关资源
          最近更新 更多