偏移量为1的ClEnqueueCopyBuffer

偏移量为1的ClEnqueueCopyBuffer,c,opencl,offset,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

为了优化内核,我需要制作一个带有偏移量的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_偏移量设置为1。所以copy_buffer[0]转到copy_buffer[1] 在我的例子中,命令如下所示:

    clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, (inCount1 + 1) * sizeof(int), NULL, NULL, NULL);
所以我想把count\u buffer复制到count\u buffer3,偏移量为1。 结果应该是这样的:

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

count_buffer3[1] = 12
count_buffer3[2] = 26
不幸的是,如果我的dst_偏移量是1,如示例所示,那么我的完整count_buffer3对象只包含“0”作为int值

如果我的偏移量为0,则复制工作正常,并且两个计数缓冲区相同

其他信息: 以下是clmem对象的init:

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 update 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”值的改进,但仍然是错误的。 有什么想法吗


谢谢你迄今为止的回答

很可能
clEnqueueCopyBuffer
返回一个您没有检查的错误。根据报告:

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

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

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

偏移量以字节为单位。您可能希望偏移量为
sizeof count\u buffer[0]
,大小为
(n-1)*sizeof count\u buffer[0]

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

关于缓冲区大小,您是正确的。我把它减少了一倍。我会在问题中添加详细信息它现在起作用了!谢谢!我没有考虑到胶印的尺寸。我应该更准确地阅读文档。@KäptnFreiversuch Just FWIW,没有地方可以指定单个元素的大小,因此无论文档如何,函数的行为都不可能像您预期的那样:)出于好奇,
520093696=31