7

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

在 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 读取

有人可以解释一下哪些是可能的,哪些是不可能的?

4

4 回答 4

7

在早期版本的 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 也可以启动事务)。

于 2012-07-02T20:06:11.350 回答
2

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

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

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

于 2012-07-04T22:30:16.827 回答
1

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

于 2012-07-03T21:25:30.200 回答
1

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

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

于 2012-07-06T18:14:56.840 回答