【发布时间】: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