gpt4 book ai didi

c - OpenCL 中带有偏移量的固定内存

转载 作者:行者123 更新时间:2023-11-30 17:13:43 25 4
gpt4 key购买 nike

因此,我使用 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,同样的简化)的缓冲区来按 block 发送数据。因此,偏移量为 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 - OpenCL 中带有偏移量的固定内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30640465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com