在OpenCL中使用偏移量固定内存

时间:2015-06-04 09:45:40

标签: c buffer opencl

所以我使用switch-case读取文件中的数据,如下所示:

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初始化pinned_buffer_input,那么我可以使用mapped获取指向主机缓冲区的指针并复制clEnqueueMapBuffer()到该地方的数据:

mapped

通过这样做可行但我想避免memcpy(pinnedMemory, mapped+header[3]+b*input_size, input_size_cur); 循环中的memcpy,这会在我的程序中造成巨大的延迟。要解决此问题,我想使用for的{​​{1}}参数,但它会搞砸。

编辑2 :使用offset代替clEnqueueMapBuffer(),结果是正确的,但创建CL_MEM_COPY_HOST_PTR需要很长时间。

2 个答案:

答案 0 :(得分:0)

我还没有清楚地了解为什么不起作用,但有些猜测是:

  • 您是否在等待unmap / Write完成?
  • 您如何检查数据是否正确写入?如果你正在读它,你怎么读它?也许问题也存在。

答案 1 :(得分:0)

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