ClEnqueueCopyBuffer,偏移量为1

时间:2015-06-14 21:09:06

标签: c opencl offset

要优化内核,我需要复制带有偏移量的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

我在这里做错了,或者带偏移的副本是否应该像这样工作?

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

来自debug的

示例:

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"价值观,但仍然是错误的。 任何想法?

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

2 个答案:

答案 0 :(得分:2)

clEnqueueCopyBuffer很可能会返回您未检查的错误。根据{{​​3}}:

  

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

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

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

答案 1 :(得分:1)

偏移量以字节为单位。您可能希望偏移量为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);