GPU从CPU或CPU写入GPU读取?

时间:2012-07-02 19:14:01

标签: cuda opencl gpu gpu-programming

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

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

GPU或CPU读取字符串“src”是否写入GPU?此外,当我们从GPU返回字符串时,GPU是写入CPU还是从GPU读取CPU?

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

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

4 个答案:

答案 0 :(得分: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也可以启动事务)。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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