繁体   English   中英

GPU从CPU或CPU写入GPU读取?

[英]GPU reads from CPU or CPU writes to the GPU?

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM