我对OpenCL还是很陌生,尽管到目前为止我已经了解了所有内容,但是在了解缓冲区对象的工作方式时遇到了麻烦。
我不知道缓冲区对象存储在哪里。在这个StackOverflow问题中指出:
如果只有一台设备,则可能(99.99%)将位于设备中。(在极少数情况下,如果设备暂时没有足够的内存,则可能在主机中)
对我来说,这意味着缓冲区对象存储在设备内存中。但是,如该StackOverflow问题中所述,如果在CL_MEM_ALLOC_HOST_PTR
中使用了该标志,则使用clCreateBuffer
的内存很可能是固定内存。我的理解是,固定内存时不会将其换出。这意味着固定的内存必须位于RAM中,而不是在设备内存中。
那么实际发生了什么?
我想知道这些标志的作用:
CL_MEM_USE_HOST_PTR
CL_MEM_COPY_HOST_PTR
CL_MEM_ALLOC_HOST_PTR
暗示缓冲区的位置。
谢谢
该规范(故意?)在该主题上含糊不清,为实现者留出了很多自由。因此,除非您要定位的OpenCL实施对标志做出明确保证,否则应将其视为建议。
首先,CL_MEM_COPY_HOST_PTR
实际上与分配无关,它只是意味着您希望clCreateBuffer
使用host_ptr
传递给调用的内存中的内容来预填充分配的内存。这就好比您在clCreateBuffer
使用host_ptr = NULL
和不使用此标志的情况下进行了clEnqueueWriteBuffer
调用,然后进行了阻塞调用以写入整个缓冲区。
关于分配方式:
CL_MEM_USE_HOST_PTR
-这意味着您已经预先分配了一些内存,并已正确对齐,并且希望将其用作缓冲区的后备内存。如果设备不支持直接访问主机内存,或者驱动程序确定到VRAM的卷影副本比直接访问系统更有效,则实现仍可以分配设备内存并在缓冲区和分配的内存之间来回复制。记忆。但是,在可以直接从系统内存读取的实现中,这是零复制缓冲区的一种选择。CL_MEM_ALLOC_HOST_PTR
-这是告诉OpenCL实现的一个提示,您打算通过将其映射到主机地址空间来从主机端访问缓冲区,但是与不同CL_MEM_USE_HOST_PTR
,您将分配本身留给了OpenCL实现。对于支持它的实现,这是零拷贝缓冲区的另一种选择:创建缓冲区,将其映射到主机,获取主机算法或I / O以写入映射的内存,然后取消映射并在GPU内核中使用。不同于CL_MEM_USE_HOST_PTR
,这为使用可以直接映射到CPU地址空间(例如PCIe BAR)的VRAM打开了大门。请注意,执行也可以使用所提供的任何访问标志(CL_MEM_HOST_WRITE_ONLY
,CL_MEM_HOST_READ_ONLY
,CL_MEM_HOST_NO_ACCESS
,CL_MEM_WRITE_ONLY
,CL_MEM_READ_ONLY
,和CL_MEM_READ_WRITE
),以影响决策,其中分配内存。
最后,关于“固定”内存:许多现代系统都具有IOMMU,并且当它处于活动状态时,从设备进行的系统内存访问会导致IOMMU页面错误,因此从技术上讲,甚至不需要驻留主机内存。无论如何,OpenCL实现通常与内核级设备驱动程序深度集成,该驱动程序通常可以根据需要固定系统内存范围(从分页中排除它们)。因此,如果使用CL_MEM_USE_HOST_PTR
,则只需要确保提供适当对齐的内存即可,实现将为您进行固定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句