偏移量为1的ClEnqueueCopyBuffer
为了优化内核,我需要制作一个带有偏移量的cl_mem对象的副本偏移量为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
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