【发布时间】: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 需要很长时间。
【问题讨论】:
-
“但它不能那样工作”。它会崩溃吗?它不会复制吗?
-
已编辑:它复制了我无法解释的错误数据。