Opencl 为什么带有CL_MEM_ALLOC_HOST_PTR的clCreateBuffer使用离散设备内存?

Opencl 为什么带有CL_MEM_ALLOC_HOST_PTR的clCreateBuffer使用离散设备内存?,opencl,nvidia,Opencl,Nvidia,我有一段代码,其中使用了clCreateBuffer和CL\u MEM\u ALLOC\u HOST\u PTR标志,我意识到这会从设备分配内存。这是正确的吗?我在标准中遗漏了一些东西 CL_MEM_ALLOC_HOST_PTR:此标志指定应用程序希望OpenCL实现从主机可访问内存分配内存 就我个人而言,我理解该缓冲区应该是主机端缓冲区,稍后可以使用clEnqueueMapBuffer映射该缓冲区 以下是我正在使用的设备的一些信息: Device: Tesla K40c Hardware ve

我有一段代码,其中使用了
clCreateBuffer
CL\u MEM\u ALLOC\u HOST\u PTR
标志,我意识到这会从设备分配内存。这是正确的吗?我在标准中遗漏了一些东西

CL_MEM_ALLOC_HOST_PTR:此标志指定应用程序希望OpenCL实现从主机可访问内存分配内存

就我个人而言,我理解该缓冲区应该是主机端缓冲区,稍后可以使用
clEnqueueMapBuffer
映射该缓冲区

以下是我正在使用的设备的一些信息:

Device: Tesla K40c
Hardware version: OpenCL 1.2 CUDA
Software version: 352.63
OpenCL C version: OpenCL C 1.2 
它被描述为

OpenCL实现允许缓存缓冲区内容 由设备内存中的主机ptr指向。可以使用此缓存副本 当内核在设备上执行时

该说明适用于
CL\u MEM\u USE\u HOST\u PTR
,但其分配器不同于
CL\u MEM\u ALLOC\u HOST\u PTR
USE
使用主机给定的指针,
ALLOC
使用opencl实现自己的分配器返回值


缓存不适用于某些集成gpu类型,因此它并不总是正确的。

规范中的关键短语是主机可访问性

此标志指定应用程序希望OpenCL实现从主机可访问的内存分配内存

它并没有说它将被分配到主机内存中:它说它将被主机访问

这包括任何可以映射到CPU可见内存地址的内存。通常,离散图形设备中的一些(如果不是全部的话)VRAM将通过其中一个中的公开VRAM可用,这些VRAM通过固件或操作系统映射到CPU的物理内存地址空间。它们可以类似于页表中的系统内存使用,因此通过将它们映射到虚拟内存地址,用户进程可以使用它们

规范甚至提到了这种可能性,至少结合了另一个标志:

CL\u MEM\u COPY\u HOST\u PTR
可与
CL\u MEM\u ALLOC\u HOST\u PTR
一起使用,以初始化使用主机可访问(例如PCIe)内存分配的
CL\u MEM
对象的内容


如果您确实想使用系统内存作为缓冲区(如果GPU对它的访问是稀疏的或少于CPU访问的频率,那么这可能是一个不错的选择),请自己分配它,并使用
CL\u MEM\u use\u HOST\u PTR
将其包装在缓冲区中。(根据实现情况,可能最终仍会缓存在VRAM中。)

它应该是一个提示,而不是一个请求。您的设备选择它认为使用哪种内存的最佳方式。“从主机可访问内存分配内存”是否意味着:“在可以从主机访问的内存区域(在主机中或在设备端)分配缓冲区,就像使用ClenqueueEmapBuffer一样”?还有另一个讨论,但正如您所说,只有
CL\u MEM\u USE\u HOST\u PTR
是这样描述的。如果
CL\u MEM\u ALLOC\u HOST\u PTR
标志也是如此,那么它不应该写在某个地方吗?(我只是想说得准确些,以免弄错)是opencl在主机上分配的,还是使用了用户在主机上分配的。在主机上分配。设备内存用于映射+缓存,但纯映射应该可以只使用硬件缓存(L1、L2)。所以它并不总是被使用。主机内存只是设备内存的影子,所以主机和设备交互。由于映射或统一的优点,不需要分配设备内存。例如,在同一缓冲区上但在其不同部分上工作的多个设备可以在设备内存上缓存它们自己的区域,但映射时,它们可以并行工作以提高速度。