【问题标题】:Pinned memory with offset in OpenCLOpenCL 中带有偏移的固定内存
【发布时间】:2015-08-18 20:46:19
【问题描述】:

所以我正在使用mmap() 读取文件中的数据,如下所示:

unsigned char* mapped;
mapped = mmap(0,size,PROT_READ,MAP_PRIVATE,input,0);

然后我为固定内存创建了主机缓冲区和设备缓冲区:

cl_mem pinned_buffer_input = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_ALLOC_HOST_PTR, size, mapped, NULL);
cl_mem buffer_input = clCreateBuffer(context, CL_MEM_READ_ONLY, input_size, NULL, NULL);

for 循环中我是:

  • 映射缓冲区:

    void *pinnedMemory = clEnqueueMapBuffer(cmd_queue, pinned_buffer_input, CL_TRUE, CL_MAP_WRITE, header[3]+b*input_size, input_size_cur, 0, NULL, &ev, NULL);
    
  • 将缓冲区排队:

    clEnqueueWriteBuffer(cmd_queue, buffer_input, CL_FALSE, 0, input_size_cur, pinnedMemory, 0, NULL, &ev);
    
  • 取消映射对象:

    clEnqueueUnmapMemObject(cmd_queue, pinned_buffer_input, pinnedMemory, 0, NULL, &ev);
    

这里mapped 包含整个文件,大小为size。 我想要的是有大小为input_size(或input_size_cur,同样是为了简化)的缓冲区来按块发送数据。所以偏移量是header[3]+b*input_size,其中b在循环中递增,但它复制了错误的数据。

编辑:如果我不使用mapped 初始化pinned_buffer_input,那么我可以使用clEnqueueMapBuffer() 获取指向主机缓冲区的指针并将mapped 的数据复制到那个地方:

memcpy(pinnedMemory, mapped+header[3]+b*input_size, input_size_cur);

这样做是可行的,但我想避免memcpy,因为它在for 循环中,它会在我的程序中造成巨大的延迟。为了解决这个问题,我想使用clEnqueueMapBuffer()offset 参数,但它搞砸了。

编辑 2:使用 CL_MEM_COPY_HOST_PTR 而不是 CL_MEM_ALLOC_HOST_PTR 结果是正确的,但创建 pinned_buffer_input 需要很长时间。

【问题讨论】:

  • “但它不能那样工作”。它会崩溃吗?它不会复制吗?
  • 已编辑:它复制了我无法解释的错误数据。

标签: c buffer opencl


【解决方案1】:

我没有清晰的图片来说明为什么不起作用,但有些猜测是:

  • 您在等待取消映射/写入完成吗?
  • 如何检查数据是否正确写入?如果你正在读它,你是如何读它的?也许问题也在那里。

【讨论】:

  • 数据用于我知道结果的过程。我编辑了这篇文章,试图更好地理解我想要做的事情。
【解决方案2】:

我认为您可能打算使用 CL_MEM_USE_HOST_PTR 而不是 CL_MEM_ALLOC_HOST_PTR。前者表示应用程序希望 OpenCL 实现使用 host_ptr 引用的内存作为内存对象的存储位,后者指定应用程序希望 OpenCL 实现从主机可访问内存中分配内存。由于您已经有一个指向内存的指针,因此前者似乎是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 2014-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多