【问题标题】:ClEnqueueCopyBuffer with offset 1偏移量为 1 的 ClEnqueueCopyBuffer
【发布时间】:2015-06-14 21:09:05
【问题描述】:

为了优化内核,我需要复制一个带有偏移量的 cl_mem 对象。

count_buffer3[n] = count_buffer[n+1] 

是想要的结果

看一下 ClEnqueueCopyBuffer 的规范,它似乎可以通过一个简单的参数来实现。

cl_int clEnqueueCopyBuffer (    cl_command_queue command_queue,
    cl_mem src_buffer,
    cl_mem dst_buffer,
    size_t src_offset,
    size_t dst_offset,
    size_t cb,
    cl_uint num_events_in_wait_list,
    const cl_event *event_wait_list,
    cl_event *event)

我的想法是将 dst_offset 设置为 1。所以 copy_buffer[0] 转到 copy_buffer[1] 在我的情况下,命令如下所示:

    clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, (inCount1 + 1) * sizeof(int), NULL, NULL, NULL);

所以我想将 count_buffer 复制到 count_buffer3,偏移量为 1。 结果应该是这样的:

count_buffer[1] = 2
count_buffer[2] = 12
count_buffer[3] = 26

count_buffer3[1] = 12
count_buffer3[2] = 26

不幸的是,如果我的 dst_offset 为 1,如示例中所示,我的完整 count_buffer3 对象仅包含“0”作为 int 值。

如果我的偏移量为 0,则复制工作正常,并且两个 count_buffers 相同。

附加信息: 以下是 clmem 对象的初始化:

cl_mem count_buffer3 = clCreateBuffer(context, CL_MEM_READ_WRITE, (inCount1 + 1) * sizeof(int), NULL, &err); errWrapper("create Buffer", err);

cl_mem count_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE, (inCount1+1) * sizeof(int), NULL, &err); errWrapper("create Buffer", err);

我在 Visual Studio 2013 中使用 INtel INDE 更新 2

我在这里做错了什么,还是应该像这样使用偏移量的副本?

编辑: 我将缓冲区大小减少了 1,结果发生了变化。 我得到了一些非常大的数字,而不是所有的“0”。

调试示例:

count_buffer[0] = 0
count_buffer[1] = 31
count_buffer[2] = 31

count_buffer3[0] = 520093696
count_buffer3[1] = 520093696
count_buffer3[2] = 520093696

这是对“0”值的改进,但仍然是错误的。 有什么想法吗?

到目前为止,感谢您的回答!

【问题讨论】:

  • 为了好奇,520093696 = 31 << 24; Witch 完全等价于从 32 位 int 数组的偏移量中读取 8 位。

标签: c opencl offset


【解决方案1】:

clEnqueueCopyBuffer 很可能会返回一个您不检查的错误。根据manual

如果 src_offset、dst_offset、cb、src_offset + cb 或 dst_offset + cb 需要访问缓冲内存对象之外的元素,则返回 CL_INVALID_VALUE。

这似乎是你的情况。 您可能希望传递 size 以复制比缓冲区大小小一的内容:

clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, inCount1 * sizeof(int), NULL, NULL, NULL);
                                                                      ^^^^^^^^

【讨论】:

  • 您对缓冲区大小的看法是正确的。我把它减少了一个。我会在问题中添加详细信息
【解决方案2】:

偏移量以字节为单位。您可能想要sizeof count_buffer[0] 的偏移量和(n - 1) * sizeof count_buffer[0] 的大小:

clEnqueueCopyBuffer(
    command_queue, count_buffer, count_buffer3, 
    sizeof(cl_int), 0, 
    inCount1 * sizeof(cl_int), 
    NULL, NULL, NULL);

【讨论】:

  • 现在可以使用了!非常感谢!我没有考虑偏移量的大小。我应该更准确地阅读文档。
  • @KäptnFreiversuch 只是 FWIW,没有地方可以指定单个元素的大小,因此无论文档如何,该函数都无法像您预期的那样运行 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2011-07-22
  • 1970-01-01
  • 2016-06-26
  • 2017-10-18
  • 2021-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多