OpenCL缓冲区创建

詹森

我对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

暗示缓冲区的位置。

谢谢

pmdj

规范(故意?)在该主题上含糊不清,为实现者留出了很多自由。因此,除非您要定位的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打开了大门。
  • 默认值(以上2个都不选):分配给设备最方便的位置。通常是VRAM,并且如果设备不支持将内存映射到主机内存,这通常意味着,如果将其映射到主机地址空间,则会得到2个缓冲区副本,一个在VRAM中,一个在系统内存中,而OpenCL的实现内部在2之间来回复制。

请注意,执行也可以使用所提供的任何访问标志(CL_MEM_HOST_WRITE_ONLYCL_MEM_HOST_READ_ONLYCL_MEM_HOST_NO_ACCESSCL_MEM_WRITE_ONLYCL_MEM_READ_ONLY,和CL_MEM_READ_WRITE),以影响决策,其中分配内存。

最后,关于“固定”内存:许多现代系统都具有IOMMU,并且当它处于活动状态时,从设备进行的系统内存访问会导致IOMMU页面错误,因此从技术上讲,甚至不需要驻留主机内存。无论如何,OpenCL实现通常与内核级设备驱动程序深度集成,该驱动程序通常可以根据需要固定系统内存范围(从分页中排除它们)。因此,如果使用CL_MEM_USE_HOST_PTR,则只需要确保提供适当对齐的内存即可,实现将为您进行固定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章