【问题标题】:OpenCL: How would one split an existing buffer into two?OpenCL:如何将现有缓冲区一分为二?
【发布时间】:2018-01-25 13:42:38
【问题描述】:

假设我碰巧分配了一些具有 200 个浮点值的 OpenCL 内存。

cl::Buffer newBuf = cl::Buffer(op::CLManager::getInstance(gpuID)->getContext(), CL_MEM_READ_WRITE, sizeof(float) * 200);

现在我想将此 cl::Buffer 拆分为两个对象,一个包含前 100 个浮点对象,另一个包含后续对象,以便我可以将它们传递到两个内核中。我找不到任何解释如何执行此操作的资源。

我别无选择,因为我正在使用的库返回给我一个非常大的缓冲区,我希望在 CPU 端将其拆分为较小的 cl::Buffers 以传递到内核,而不会产生内存成本(在分裂)

我试过这样做,但它会出现段错误:

cl::Buffer newBuf = cl::Buffer(op::CLManager::getInstance(gpuID)->getContext(), CL_MEM_READ_WRITE, sizeof(float) * 200);
cl::Buffer part1 = cl::Buffer((cl_mem)((float*)(newBuf.get())+0),true); // OK
cl::Buffer part2 = cl::Buffer((cl_mem)((float*)(newBuf.get())+100),true); // SEGFAULT

【问题讨论】:

    标签: opencl


    【解决方案1】:

    cl_mem 对象不是指针,因此您不能像在 CUDA 中使用 cudaMalloc 返回的指针那样偏移它们。

    如果您使用 OpenCL 2.0 或更高版本,您可以尝试 SVM(共享虚拟内存),它提供了一个 clSVMAlloc[1] 函数,该函数返回一个指针(并且您可以偏移)。 请注意,此机制可能会在您的实现中产生一些开销。

    另一个在性能方面可能更好的选择是使用 OpenCL 子缓冲区[2]。存在一些限制(例如,原点必须与某些设备参数对齐),因此请检查底层设备限制。

    [1]https://www.khronos.org/registry/OpenCL/sdk/2.0/docs/man/xhtml/clSVMAlloc.html

    [2]https://www.khronos.org/registry/OpenCL/sdk/1.2/docs/man/xhtml/clCreateSubBuffer.html

    【讨论】:

      猜你喜欢
      • 2016-12-03
      • 1970-01-01
      • 2016-04-17
      • 2023-03-21
      • 2015-08-13
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多