是否有办法绕过PyOpenCL中的限制:
array.data失败与
pyopencl.array.ArrayHasOffsetError:您尝试的操作还不支持从缓冲区开始以偏移开始的数组。
我试过:
a.base_data[a.offset: a.offset + a.nbytes]这似乎有时有效,但其他时候我得到:
pyopencl.LogicError: clCreateSubBuffer失败:无效值
发布于 2013-09-03 13:13:21
clcreateSubBuffer需要有对齐的偏移量(在本例中称为origin),而size + origin则属于缓冲区的范围。
如果(原点、大小)指定的区域在缓冲区中超出界限,则CL_INVALID_VALUE将在errcode_ret中返回。 如果在上下文中没有与缓冲区关联的设备,则CL_MISALIGNED_SUB_BUFFER_OFFSET将在errcode_ret中返回,该缓冲区的原始值与CL_DEVICE_MEM_BASE_ADDR_ALIGN值对齐。
对于特定的错误,您可以看到,您的程序或pyopencl在偏移后错误地计算了数组的大小。即使您修复了这个问题,如果原始偏移量与CL_DEVICE_MEM_BASE_ADDR_ALIGN不对齐,您可能仍然会遇到问题。
话虽如此,NVIDIA似乎脱离了规范,允许任意的抵消。所以你的里程可能会因硬件的不同而有所不同。
发布于 2015-09-18 20:26:08
如果您只是想获得一个标记数组数据开始的缓冲区,然后传递给内核,您就不必担心大小了。下面是一个函数,它获取指向偏移数据开始的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来获取指向clV数据开始的指针。
import numpy as np
import pyopencl as cl
import pyopencl.array
ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)
m, n = 5, 5
A = np.random.uniform(size=(m, n)).astype(np.float32)
clA = cl.array.Array(queue, A.shape, A.dtype)
clA.set(A)
clV = clA[1::2, 1::2]
def data(array):
if array.offset:
return array.base_data.get_sub_region(array.offset, 1)
else:
return array.data
source = """
__kernel void fn(long si, long sj, __global float *Y)
{
const int i = get_global_id(0);
const int j = get_global_id(1);
Y[i*si + j*sj] = 3;
}
"""
kernel = cl.Program(ctx, source).build().fn
gsize = clV.shape
lsize = None
estrides = np.array(clV.strides) / clV.dtype.itemsize
kernel(queue, gsize, lsize, estrides[0], estrides[1], data_ptr(clV))
print(clA.get())https://stackoverflow.com/questions/18589241
复制相似问题