提交 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(): ...@@ -71,6 +71,14 @@ def test_pycuda_memory_to_theano():
print "gpuarray ref count after creating a CudaNdarray", sys.getrefcount(y) print "gpuarray ref count after creating a CudaNdarray", sys.getrefcount(y)
assert sys.getrefcount(y)==3 assert sys.getrefcount(y)==3
assert (numpy.asarray(z) == 0).all() 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')) cuda_ones = cuda_ndarray.CudaNdarray(numpy.asarray([[[1]]],dtype='float32'))
z += cuda_ones z += cuda_ones
......
...@@ -2585,13 +2585,10 @@ int CudaNdarray_set_device_data(CudaNdarray * self, float * data, PyObject * bas ...@@ -2585,13 +2585,10 @@ int CudaNdarray_set_device_data(CudaNdarray * self, float * data, PyObject * bas
// Get the original base object (base.base.base...) // Get the original base object (base.base.base...)
PyObject * orig_base = base; PyObject * orig_base = base;
// base is not always a CudaNdarray. It can be a GpuArray from pycuda, ... // base is not always a CudaNdarray. It can be a GpuArray from pycuda, ...
if (orig_base && CudaNdarray_Check(orig_base)) while (orig_base && CudaNdarray_Check(orig_base) && ((CudaNdarray*) orig_base)->base)
{ {
while (((CudaNdarray*) orig_base)->base) // base_base is itself a view
{ 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 //N.B. XDECREF and XINCREF are no-ops for NULL pointers
if (self->base != orig_base) if (self->base != orig_base)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论