【问题标题】:Why does clCreateBuffer with CL_MEM_ALLOC_HOST_PTR use discrete device memory?为什么带有 CL_MEM_ALLOC_HOST_PTR 的 clCreateBuffer 使用离散设备内存?
【发布时间】:2017-02-02 20:14:42
【问题描述】:

我有一段代码在其中使用clCreateBufferCL_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 

【问题讨论】:

  • 应该是提示,而不是请求。您的设备选择它认为使用内存的最佳方式。
  • “从主机可访问内存分配内存”的意思是:“在可访问的内存区域(在主机或设备端)分配缓冲区 - 就像使用 clEnqueueMapBuffer - 来自主机”?

标签: opencl nvidia


【解决方案1】:

它被描述为

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 类型不可行,因此并不总是如此。

【讨论】:

  • 但正如你所说,只有CL_MEM_USE_HOST_PTR是这样描述的。如果CL_MEM_ALLOC_HOST_PTR 标志也是如此,它不应该写在某处吗? (我只是尽量准确,以免理解错误)
  • 由 opencl 在主机上分配或使用用户在主机上分配的内容。在主机上分配。设备内存用于映射+缓存,但仅使用硬件缓存(L1,L2)应该可以实现纯映射。所以它并不总是被使用。主机内存只是作为设备内存的影子,因此主机与设备交互。由于映射或统一的优点,不需要分配设备内存
  • 例如,多个设备在同一个缓冲区工作但在缓冲区的不同部分,可以在设备内存上缓存自己的区域,但在映射时,它们可以并行工作以提高速度。
【解决方案2】:

规范中的关键词是host accessible

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

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

这包括任何可以映射到 CPU 可见内存地址的内存。通常,独立显卡设备中的一些(如果不是全部)VRAM 将通过PCI memory range 暴露在BARs 之一中可用 - 这些通过固件或操作系统映射到 CPU 的物理内存地址空间。它们可以与页表中的系统内存类似地使用,因此可以通过将它们映射到虚拟内存地址来供用户进程使用。

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

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

如果您确实想将系统内存用作缓冲区(如果 GPU 对其的访问很少或比 CPU 访问频率低,这可能是一个不错的选择),请自行分配它并将其包装在带有 CL_MEM_USE_HOST_PTR 的缓冲区中。 (最终可能仍会缓存在 VRAM 中,具体取决于实现。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多