OpenCL中零拷贝的访问路径
我对零拷贝到底是如何工作的有点困惑 1-要确认以下内容对应于opencl中的零拷贝OpenCL中零拷贝的访问路径,opencl,Opencl,我对零拷贝到底是如何工作的有点困惑 1-要确认以下内容对应于opencl中的零拷贝 ....................... . . . . . . . . CPU . . SYSTEM . . . RAM . c3 X . . <=====> . ...|...............
.......................
. . .
. . .
. . 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,您可以在执行以下操作的实现上实现性能:
我们能看看你的论文吗?听起来棒极了!为了我的论文,我和apus玩了很多too@homemade-当然可以。给你:我想知道MOVNTDQA是否修复了“从主机读取设备端缓冲区时绝对可怕的带宽”。你试过了吗?我能用它将像素直接复制到帧缓冲区,以便在下一页翻页时显示吗?