OpenCL中零拷贝的访问路径

OpenCL中零拷贝的访问路径,opencl,Opencl,我对零拷贝到底是如何工作的有点困惑 1-要确认以下内容对应于opencl中的零拷贝 ....................... . . . . . . . . CPU . . SYSTEM . . . RAM . c3 X . . <=====> . ...|...............

我对零拷贝到底是如何工作的有点困惑

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     .              .  
 .           .              .  
 ............................
。。。。。。。。。。。。。。。。。。。。。。。
.           .         .  
.           .         .
.           . 中央处理器。
.   系统。
.    内存c3 X。
.              .  
...|...................
PCI-E//
|       / /
c2 | X/PCI-E,CPU直接访问GPU内存
|//复制c3,避免复制c2,用X表示。
...|...././................
.   记忆。
.   对象c1。
.           .     GPU。
.   GPU内存。
.           .             .  
...........................
.......................
.           .         .  
.           .         .
.           .   中央处理器。
.系统RAM。
.           .         .
.           . c3。
.    记忆。
…|对象。。。。。。。。。。。。
|     \  \   
PCI-E\\PCI-E,GPU直接访问系统内存。避免复制c2、c1
|       \  \
C2 | X\
...|.........\..\...........
.  |        .              .
.                 . 
.   GPU c1 X GPU。
.   内存
.           .              .  
............................
GPU/CPU直接访问System/GPU-RAM,没有显式拷贝

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

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

通过创建具有以下标志的缓冲区,可以执行零复制:

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);
使用zero copy,您可以在执行以下操作的实现上实现性能:

  • 将文件复制到主机缓冲区
  • 将缓冲区复制到设备
  • 相反,你可以一步完成这一切

  • 内存映射设备端缓冲区
  • 将文件从主机复制到设备
  • 取消映射内存
  • 在某些实现中,调用映射和取消映射可以隐藏数据传输的成本。就像我们的例子一样

  • 内存映射设备端缓冲区[实际创建相同大小的主机端缓冲区]
  • 将文件从主机复制到设备[实际写入主机端缓冲区]
  • 取消映射内存[实际上通过clEnqueueWriteBuffer将数据从主机缓冲区复制到设备缓冲区]
  • 如果实现是以这种方式执行的,那么使用映射方法将没有任何好处。然而,AMDs较新的OpenCL驱动程序允许直接写入数据,使得映射和取消映射的成本几乎为0。对于离散图形卡,请求仍然通过PCIe总线进行,因此数据传输可能较慢

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

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

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


    我们能看看你的论文吗?听起来棒极了!为了我的论文,我和apus玩了很多too@homemade-当然可以。给你:我想知道MOVNTDQA是否修复了“从主机读取设备端缓冲区时绝对可怕的带宽”。你试过了吗?我能用它将像素直接复制到帧缓冲区,以便在下一页翻页时显示吗?