有没有办法解决PyOpenCL中的限制:
array.data
失败
pyopencl.array.ArrayHasOffsetError:您正在尝试的操作尚不支持从缓冲区开头偏移量开始的数组。
我试过了:
a.base_data[a.offset: a.offset + a.nbytes]
这似乎有时会起作用,但有时我会得到:
pyopencl.LogicError:clCreateSubBuffer失败:值无效
答案 0 :(得分:1)
clcreateSubBuffer
需要具有对齐的偏移(或者在此情况下称为origin
),并且size
+ origin
必须在限制范围内缓冲区。
如果指定的区域,则在errcode_ret中返回CL_INVALID_VALUE (原点,大小)超出缓冲区范围。
如果有的话,在errcode_ret中返回CL_MISALIGNED_SUB_BUFFER_OFFSET 上下文中没有设备与原始缓冲区相关联 value与CL_DEVICE_MEM_BASE_ADDR_ALIGN值对齐。
对于您看到的特定错误,您的程序或pyopencl看起来像是错误计算了偏移后数组的大小。即使您修复此问题,如果原始偏移量未与CL_DEVICE_MEM_BASE_ADDR_ALIGN
对齐,您仍可能会遇到问题。
据说NVIDIA似乎打破了规范并允许任意抵消。因此,您的里程可能因硬件而异。
答案 1 :(得分:0)
如果您只想获得一个标记数组数据开头的缓冲区,要传递给内核,您不必担心大小。这是一个函数,它获取指向偏移数据开头的size-1缓冲区:
def data_ptr(array):
if array.offset:
return array.base_data.get_sub_region(array.offset, 1)
else:
return array.data
如果需要指向偏移数据起点的指针,可以使用它传递给内核。这是一个示例,我想将数组clV
的子区域clA
设置为值3.我使用data_ptr
来获取指向{的开头的指针{1}}的数据。
clV