7

我对零拷贝的工作原理有点困惑。

1-想确认以下对应opencl中的零拷贝。

 .......................
 .           .         .  
 .           .         .
 .           . CPU     . 
 .   SYSTEM  .         .
 .    RAM    . c3 X    .  
 .         <=====>     .  
 ...|...................
   PCI-E     / /
    |       / /
 c2 |X     /PCI-E, CPU directly accessing GPU memory
    |     / /                          copy c3, c2 is avoided, indicated by X. 
 ...|...././................
 .   MEMORY<====>          .
 .   OBJECT  .c1           . 
 .           .     GPU     .
 .   GPU RAM .             .  
 .           .             .  
 ...........................




 .......................
 .           .         .  
 .           .         .
 .           .   CPU   . 
 .SYSTEM RAM .         .
 .           .         .
 .           . c3      .  
 .    MEMORY<====>     .           
 ...| OBJECT............
    |     \  \   
   PCI-E   \  \PCI-E, GPU directly accessing System memory.  copy c2, c1 is avoided
    |       \  \
 C2 |X       \  \
 ...|.........\..\...........
 .  |        .              .
 .       <=======>          . 
 .   GPU    c1 X   GPU      .
 .   RAM     .              .  
 .           .              .  
 ............................

GPU/CPU 直接访问系统/GPU-RAM,无需显式复制。

2-拥有这个有什么好处?PCI-e 仍在限制整体带宽。或者唯一的好处是我们可以避免在上述情况下复制 c2 和 c1/c3?

4

1 回答 1

15

您对零拷贝工作原理的理解是正确的。基本前提是您可以从设备访问主机内存,也可以从主机访问设备内存,而无需在两者之间进行中间缓冲步骤。

您可以通过使用以下标志创建缓冲区来执行零复制:

CL_MEM_AMD_PERSISTENT_MEM //Device-Resident Memory
CL_MEM_ALLOC_HOST_PTR // Host-Resident Memory

然后,可以使用内存映射语义访问缓冲区:

void* p = clEnqueueMapBuffer(queue, buffer, CL_TRUE, CL_MAP_WRITE, 0, size, 0, NULL, NULL, &err);
//Perform writes to the buffer p
err = clEnqueueUnmapMemObject(queue, buffer, p, 0, NULL, NULL);

使用零拷贝,您可以通过执行以下操作来实现性能:

  1. 将文件复制到主机缓冲区
  2. 将缓冲区复制到设备

相反,您可以一步完成

  1. 内存映射设备端缓冲区
  2. 将文件从主机复制到设备
  3. 取消映射内存

在某些实现中,映射和取消映射的调用可以隐藏数据传输的成本。就像我们的例子一样,

  1. Memory Map 设备端缓冲区【实际上创建了一个相同大小的主机端缓冲区】
  2. 将文件从主机复制到设备[实际上写入主机端缓冲区]
  3. Unmap memory [实际上是通过 clEnqueueWriteBuffer 将数据从 host-buffer 复制到 device-buffer]

如果实现是以这种方式执行的,那么使用映射方法将没有任何好处。然而,AMD 较新的 OpenCL 驱动程序允许直接写入数据,使得映射和取消映射的成本几乎为 0。对于独立显卡,请求仍然通过 PCIe 总线进行,因此数据传输可能会很慢。

然而,在 APU 架构的情况下,由于 APU 独特的架构(如下图所示),使用零拷贝语义的数据传输成本可以大大提高传输速度。在此架构中,PCIe 总线被统一北桥 (UNB) 取代,从而实现更快的传输。

请注意,当使用内存映射的零复制语义时,从主机读取设备端缓冲区时,您将看到绝对可怕的带宽。这些带宽约为 0.01 Gb/s,很容易成为代码的新瓶颈。

对不起,如果这是太多的信息。这是我的论文题目。

APU 架构

于 2012-10-08T17:24:15.543 回答