提交 c956b2ba authored 作者: Frederic Bastien's avatar Frederic Bastien

correctly detect if CudaNdarray may share memory when scipy is not available.

上级 36e9cfdf
...@@ -10,46 +10,38 @@ from theano.tensor.basic import TensorType ...@@ -10,46 +10,38 @@ from theano.tensor.basic import TensorType
try: try:
import scipy.sparse import scipy.sparse
except ImportError:
#scipy not imported, their can be only ndarray
def may_share_memory(a, b, raise_other_type=True):
if not isinstance(a, numpy.ndarray) or not isinstance(b, numpy.ndarray):
if raise_other_type:
raise TypeError("may_share_memory support only ndarray when scipy is not available")
return False
return numpy.may_share_memory(a,b)
else:
#scipy imported, their can be ndarray and sparse type
from theano.sparse.basic import _is_sparse, SparseType from theano.sparse.basic import _is_sparse, SparseType
def may_share_memory(a, b, raise_other_type=True): except ImportError:
a_ndarray = isinstance(a, numpy.ndarray) #scipy not imported, their can be only ndarray and cudandarray
b_ndarray = isinstance(b, numpy.ndarray) def _is_sparse(a):
try: return False
a_sparse = _is_sparse(a)
except NotImplementedError: import theano.sandbox.cuda as cuda
a_sparse = False if cuda.cuda_available:
try: def _is_cuda(a):
b_sparse = _is_sparse(b) return isinstance(a, cuda.CudaNdarray)
except NotImplementedError: else:
b_sparse = False def _is_cuda(a):
return False
a_cuda = False def may_share_memory(a, b, raise_other_type=True):
b_cuda = False a_ndarray = isinstance(a, numpy.ndarray)
if a.__class__.__name__ == "CudaNdarray": b_ndarray = isinstance(b, numpy.ndarray)
a_cuda = True a_sparse = _is_sparse(a)
if b.__class__.__name__ == "CudaNdarray": b_sparse = _is_sparse(b)
b_cuda = True a_cuda = _is_cuda(a)
b_cuda = _is_cuda(b)
if not(a_ndarray or a_sparse or a_cuda) or not(b_ndarray or b_sparse or b_cuda): if not(a_ndarray or a_sparse or a_cuda) or not(b_ndarray or b_sparse or b_cuda):
if raise_other_type: if raise_other_type:
raise TypeError("may_share_memory support only ndarray and scipy.sparse and CudaNdarray type") raise TypeError("may_share_memory support only ndarray and scipy.sparse and CudaNdarray type")
return False return False
if a_ndarray and b_ndarray: if a_ndarray and b_ndarray:
return TensorType.may_share_memory(a,b) return TensorType.may_share_memory(a,b)
if a_cuda and b_cuda: if a_cuda and b_cuda:
from theano.sandbox.cuda.type import CudaNdarrayType from theano.sandbox.cuda.type import CudaNdarrayType
return CudaNdarrayType.may_share_memory(a,b) return CudaNdarrayType.may_share_memory(a,b)
if a_cuda or b_cuda: if a_cuda or b_cuda:
return False return False
return SparseType.may_share_memory(a,b) return SparseType.may_share_memory(a,b)
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论