偏移量为 1 的 ClEnqueueCopyBuffer
ClEnqueueCopyBuffer with offset 1
为了优化内核,我需要制作一个带有偏移量的 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_buffer 完全相同。
附加信息:
以下是 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
的英特尔 INDE 更新 2
我是不是做错了什么,或者带偏移的副本应该这样工作吗?
编辑:
我将缓冲区大小减少了一个,结果发生了变化。
我得到的不是所有的“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
returns 一个您没有检查的错误。根据manual:
CL_INVALID_VALUE is returned if src_offset, dst_offset, cb, src_offset + cb, or dst_offset + cb require accessing elements outside the buffer memory objects.
这似乎是你的情况。
您可能希望传递大小以复制比缓冲区大小小一的内容:
clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, inCount1 * sizeof(int), NULL, NULL, NULL);
^^^^^^^^
偏移量以字节为单位。您可能需要 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);
为了优化内核,我需要制作一个带有偏移量的 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_buffer 完全相同。
附加信息: 以下是 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
的英特尔 INDE 更新 2我是不是做错了什么,或者带偏移的副本应该这样工作吗?
编辑: 我将缓冲区大小减少了一个,结果发生了变化。 我得到的不是所有的“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
returns 一个您没有检查的错误。根据manual:
CL_INVALID_VALUE is returned if src_offset, dst_offset, cb, src_offset + cb, or dst_offset + cb require accessing elements outside the buffer memory objects.
这似乎是你的情况。 您可能希望传递大小以复制比缓冲区大小小一的内容:
clEnqueueCopyBuffer(command_queue, count_buffer, count_buffer3, 1, 0, inCount1 * sizeof(int), NULL, NULL, NULL);
^^^^^^^^
偏移量以字节为单位。您可能需要 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);