解决pyopencl数组偏移限制

时间:2013-09-03 09:54:33

标签: opencl pyopencl

有没有办法解决PyOpenCL中的限制:

array.data

失败
  

pyopencl.array.ArrayHasOffsetError:您正在尝试的操作尚不支持从缓冲区开头偏移量开始的数组。

我试过了:

a.base_data[a.offset: a.offset + a.nbytes]

这似乎有时会起作用,但有时我会得到:

  

pyopencl.LogicError:clCreateSubBuffer失败:值无效

2 个答案:

答案 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