提交 78cfa5f8 authored 作者: Frederic Bastien's avatar Frederic Bastien

Fix CudaNdarray view of view on something else then CudaNdarray.

Added test with pycuda as example.
上级 d0792e35
......@@ -71,6 +71,14 @@ def test_pycuda_memory_to_theano():
print "gpuarray ref count after creating a CudaNdarray", sys.getrefcount(y)
assert sys.getrefcount(y)==3
assert (numpy.asarray(z) == 0).all()
assert z.base is y
# Test that we can take a view from this cuda view on pycuda memory
zz = z.view()
assert sys.getrefcount(y) == 4
assert zz.base is y
del zz
assert sys.getrefcount(y) == 3
cuda_ones = cuda_ndarray.CudaNdarray(numpy.asarray([[[1]]],dtype='float32'))
z += cuda_ones
......
......@@ -2585,14 +2585,11 @@ int CudaNdarray_set_device_data(CudaNdarray * self, float * data, PyObject * bas
// Get the original base object (base.base.base...)
PyObject * orig_base = base;
// base is not always a CudaNdarray. It can be a GpuArray from pycuda, ...
if (orig_base && CudaNdarray_Check(orig_base))
{
while (((CudaNdarray*) orig_base)->base)
while (orig_base && CudaNdarray_Check(orig_base) && ((CudaNdarray*) orig_base)->base)
{
// base_base is itself a view
orig_base = ((CudaNdarray*) orig_base)->base;
}
}
//N.B. XDECREF and XINCREF are no-ops for NULL pointers
if (self->base != orig_base)
{
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论