【问题标题】:How to allocate one half of an OpenCL buffer on host memory and the other half on device memory?如何在主机内存上分配 OpenCL 缓冲区的一半,在设备内存上分配另一半?
【发布时间】:2013-10-18 20:23:38
【问题描述】:

如果我理解正确,我可以在分配 CL 缓冲区以从设备内核执行访问主机内存时使用 CL_MEM_USE_HOST_PTR。我可以使用 CL_MEM_COPY_HOST_PTR 将数据复制到设备内存。我的问题是:我能否以某种方式分配一个数组 A,其中一半分配在主机内存中,另一半分配在设备内存中。假设前半部分分配在主机内存中。 A[0~(N/2-1)]访问主机内存,A[N/2~(N-1)]访问设备内存。

【问题讨论】:

    标签: c++ c memory opencl


    【解决方案1】:

    真正的真相是你无法知道记忆在哪里

    分配的对象内存在 OpenCL“上下文”中,它是纯虚拟的,可以在任何地方(设备或主机)。 如果您希望从指针中获取内存,或者从指针中复制,或者在主机中分配一个副本,您只能向 OpenCL 指定。但是,这些都不能保证主机端的内存一致性。也就是说,您在主机上拥有的内存可能不是该内存对象的最新版本。由于 OpenCL 允许将内存缓存在设备中。

    一些供应商指定在他们的实现和 SDK 中使用一些标志来选择不同类型的内存(即:固定)。但这取决于实现,并且不会改变您仍然需要使用 clReadBuffer() 或 clMapBuffer() 来确保主机端的值是内核的实际输出的事实。

    根据我的个人经验,如果您不使用繁重的 I/O。您可以简单地使用 CL_MEM_READ_WRITE 标志。

    【讨论】:

      猜你喜欢
      • 2018-08-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 2017-04-17
      • 2014-11-11
      相关资源
      最近更新 更多