我有一段代码,其中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
答案 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中缓存,具体取决于实现。)