所以我使用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
需要很长时间。
答案 0 :(得分:0)
我还没有清楚地了解为什么不起作用,但有些猜测是:
答案 1 :(得分:0)
我认为你可能想要使用CL_MEM_USE_HOST_PTR而不是CL_MEM_ALLOC_HOST_PTR。前者表示应用程序希望OpenCL实现使用host_ptr引用的内存作为内存对象的存储位,后者指定应用程序希望OpenCL实现从主机可访问内存分配内存。由于你已经有一个指向内存的指针,前者似乎是正确的。