为什么clCreateBuffer与CL_MEM_ALLOC_HOST_PTR使用分立设备内存?

时间:2017-02-02 20:14:42

标签: opencl nvidia

我有一段代码,其中clCreateBuffer使用CL_MEM_ALLOC_HOST_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 

2 个答案:

答案 0 :(得分:0)

被描述为

  

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

https://www.khronos.org/registry/OpenCL/sdk/1.0/docs/man/xhtml/clCreateBuffer.html

描述适用于CL_MEM_USE_HOST_PTR,但它与CL_MEM_ALLOC_HOST_PTR的分配器不同。 USE使用主机指定的指针,ALLOC使用opencl实现自己的分配器返回值。

对于某些集成gpu类型,缓存是不可行的,因此并非总是如此。

答案 1 :(得分:0)

规范中的关键词是主机可访问

  

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

它并没有说它会被分配到主机内存中:它说它可以被主机访问。

这包括可以映射到CPU可见内存地址的任何内存。通常,如果并非所有VRAM都位于独立图形设备中,则可以通过PCI memory range中的一个BARs中的Github获得 - 这些通过固件或者固定到CPU的物理内存地址空间中。操作系统。它们可以类似于页表中的系统内存使用,因此可以通过将它们映射到虚拟内存地址来提供给用户进程。

规范甚至提到了这种可能性,至少与另一面旗帜相结合:

  

CL_MEM_COPY_HOST_PTR可与CL_MEM_ALLOC_HOST_PTR一起使用,以初始化使用主机可访问(例如PCIe)内存分配的cl_mem对象的内容。

如果你肯定想要将系统内存用于缓冲区(如果GPU访问它的速度稀疏或频率低于CPU访问权限,则可能是一个不错的选择),请自行分配并将其包装在CL_MEM_USE_HOST_PTR的缓冲区中。 (这可能最终会在VRAM中缓存,具体取决于实现。)