【问题标题】:OpenCL Sub Buffer Host pointerOpenCL 子缓冲区主机指针
【发布时间】:2016-01-25 06:09:06
【问题描述】:

我创建了一个带有属性 CL_MEM_READ_WRITE 和 CL_MEM_ALLOC_HOST_PTR 的缓冲区。我已将此缓冲区排入 GPU 内核。 GPU 内核处理给定的输入并填充这些缓冲区。在此过程中,CPU 处于等待状态。我通过使用子缓冲区将缓冲区划分为三个统一的部分来修改此设计。现在GPU在填充一个子缓冲区后,CPU就可以开始处理了。这将 CPU 等待减少到一个子缓冲区,而不是一个完整的帧处理。

我面临的问题是,子缓冲区和缓冲区的映射指针(cpu 端指针)很奇怪。第一个子缓冲区和缓冲区的映射指针相同。这没关系。但是第二个子缓冲区的映射指针不等于缓冲区的映射指针+第二个子缓冲区的偏移量。我在集成 GPU 型号(Intel HD graphics 4000)上试过这个。它工作正常。但是当我在专用显卡设备(nvidia zotac)上运行它时,我遇到了这个问题。你以前有没有遇到过这样的场景。你能提供一些关于在哪里寻找解决这个问题的指针吗?

typedef struct opencl_buffer {
  cl_mem opencl_mem;
  void *mapped_pointer;
  int size;
}opencl_buffer;

// alloc gpu output buffers
opencl->opencl_mem = clCreateBuffer(
    opencl->context, CL_MEM_READ_WRITE | CL_MEM_ALLOC_HOST_PTR,
    3 * alloc_size, NULL, &status);
if (status != CL_SUCCESS)
  goto fail;

// create output sub buffers
for (sub_idx = 0; sub_idx < 3; ++sub_idx) {
  cl_buffer_region sf_region;
  SubFrameInfo subframe;

  sf_region.origin = alloc_size * sub_idx;
  sf_region.size = alloc_size;
  opencl->gpu_output_sub_buf[sub_idx].size = sf_region.size;
  opencl->gpu_output_sub_buf[sub_idx].opencl_mem =
      clCreateSubBuffer(opencl->opencl_mem,
                        CL_MEM_READ_WRITE,
                        CL_BUFFER_CREATE_TYPE_REGION,
                        &sf_region, &status);
  if (status != CL_SUCCESS)
    goto fail;
}

现在,当我映射 gpu_output_sub_buf[0].opencl_mem 和 gpu_output_sub_buf[1].opencl_mem 时,CPU 端指针之间的差异预计为 alloc_size(假设 char 指针)。这恰好是英特尔高清显卡的情况。但 Nvidia 平台提供了不同的结果。

【问题讨论】:

  • 第二个子缓冲区的映射指针是什么意思?您能否在您的问题中添加一些代码,显示clCreateBuffer(C API)的调用或cl::Buffer(C++ API)的构造?
  • 你添加的代码sn-p错过了mapped_pointer的赋值。

标签: opencl


【解决方案1】:

没有基于规范的原因,映射的子缓冲区应该位于与映射的主缓冲区(或与之对齐的映射子缓冲区)的已知偏移量的地址。映射仅创建您可以使用的主机内存范围,然后您取消映射以将其恢复到设备上。它甚至不必每次都在同一个地址。

当然,OpenCL 2.0 SVM 改变了这一切,但你没有说你在使用 SVM,而且 NVIDIA 现在也不支持 OpenCL 2.0。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 1970-01-01
    • 2016-12-03
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多