提交 116ad0f3 authored 作者: lamblin's avatar lamblin

Merge pull request #1230 from nouiz/fix_align

Fix align
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
# # This file is up-to-date if the command git log --format="%aN <%aE>" | sort -u # # This file is up-to-date if the command git log --format="%aN <%aE>" | sort -u
# # gives no duplicates. # # gives no duplicates.
Rami Al-Rfou' <rmyeid@gmail.com> Rami Al-Rfou <rmyeid@gmail.com>
<abergeron@gmail.com> <anakha@kami.(none)> <abergeron@gmail.com> <anakha@kami.(none)>
David Warde-Farley <wardefar@iro.umontreal.ca> David Warde-Farley <dwf@cs.toronto.edu> David Warde-Farley <wardefar@iro.umontreal.ca> David Warde-Farley <dwf@cs.toronto.edu>
David Warde-Farley <wardefar@iro.umontreal.ca> David Warde Farley <dwf@cs.toronto.edu> David Warde-Farley <wardefar@iro.umontreal.ca> David Warde Farley <dwf@cs.toronto.edu>
......
...@@ -23,6 +23,8 @@ env: ...@@ -23,6 +23,8 @@ env:
script: script:
- export THEANO_FLAGS=warn.ignore_bug_before=all,on_opt_error=raise,on_shape_error=raise - export THEANO_FLAGS=warn.ignore_bug_before=all,on_opt_error=raise,on_shape_error=raise
- python --version - python --version
- uname -a
- free
- echo $PART - echo $PART
- theano-nose $PART - theano-nose $PART
......
...@@ -478,14 +478,15 @@ default_colorCodes = {'GpuFromHost': 'red', ...@@ -478,14 +478,15 @@ default_colorCodes = {'GpuFromHost': 'red',
'Scan': 'yellow', 'Scan': 'yellow',
'Shape': 'cyan', 'Shape': 'cyan',
'IfElse': 'magenta', 'IfElse': 'magenta',
'Elemwise': '#FFAABB', 'Elemwise': '#FFAABB', # dark pink
'Subtensor': '#FFAAFF'} 'Subtensor': '#FFAAFF', # purple
'Alloc': '#FFAA22'} # orange
def pydotprint(fct, outfile=None, def pydotprint(fct, outfile=None,
compact=True, format='png', with_ids=False, compact=True, format='png', with_ids=False,
high_contrast=True, cond_highlight=None, colorCodes=None, high_contrast=True, cond_highlight=None, colorCodes=None,
max_label_size=50, scan_graphs=False, max_label_size=70, scan_graphs=False,
var_with_name_simple=False, var_with_name_simple=False,
print_output_file=True, print_output_file=True,
assert_nb_all_strings=-1 assert_nb_all_strings=-1
......
...@@ -1062,23 +1062,24 @@ class TensorType(Type): ...@@ -1062,23 +1062,24 @@ class TensorType(Type):
type_num_%(name)s = ((PyArrayObject*)py_%(name)s)->descr->type_num; type_num_%(name)s = ((PyArrayObject*)py_%(name)s)->descr->type_num;
if (!PyArray_ISALIGNED(py_%(name)s)) { if (!PyArray_ISALIGNED(py_%(name)s)) {
PyErr_Format(PyExc_NotImplementedError, PyErr_Format(PyExc_NotImplementedError,
"expected an aligned array of type %%d " "expected an aligned array of type %%ld "
"(%(type_num)s), got non-aligned array of type %%d" "(%(type_num)s), got non-aligned array of type %%ld"
" with %%d dimensions, with 3 last dims %%d, %%d, %%d" " with %%ld dimensions, with 3 last dims %%ld, %%ld, %%ld"
" and 3 last strides %%d %%d, %%d.", " and 3 last strides %%ld %%ld, %%ld.",
%(type_num)s, type_num_%(name)s, (long int) %(type_num)s,
PyArray_NDIM(py_%(name)s), (long int) type_num_%(name)s,
PyArray_NDIM(py_%(name)s) >= 3 ? (long int) PyArray_NDIM(py_%(name)s),
(long int) PyArray_NDIM(py_%(name)s) >= 3 ?
PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-3] : -1, PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-3] : -1,
PyArray_NDIM(py_%(name)s) >= 2 ? (long int) PyArray_NDIM(py_%(name)s) >= 2 ?
PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-2] : -1, PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-2] : -1,
PyArray_NDIM(py_%(name)s) >= 1 ? (long int) PyArray_NDIM(py_%(name)s) >= 1 ?
PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-1] : -1, PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-1] : -1,
PyArray_NDIM(py_%(name)s) >= 2 ? (long int) PyArray_NDIM(py_%(name)s) >= 3 ?
PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-3] : -1, PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-3] : -1,
PyArray_NDIM(py_%(name)s) >= 3 ? (long int) PyArray_NDIM(py_%(name)s) >= 2 ?
PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-2] : -1, PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-2] : -1,
PyArray_NDIM(py_%(name)s) >= 1 ? (long int) PyArray_NDIM(py_%(name)s) >= 1 ?
PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-1] : -1 PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-1] : -1
); );
%(fail)s %(fail)s
...@@ -1105,6 +1106,8 @@ class TensorType(Type): ...@@ -1105,6 +1106,8 @@ class TensorType(Type):
def c_sync(self, name, sub): def c_sync(self, name, sub):
"""Override `CLinkerOp.c_sync` """ """Override `CLinkerOp.c_sync` """
fail = sub['fail']
type_num = self.dtype_specs()[2]
return """ return """
{Py_XDECREF(py_%(name)s);} {Py_XDECREF(py_%(name)s);}
if (!%(name)s) { if (!%(name)s) {
...@@ -1114,7 +1117,33 @@ class TensorType(Type): ...@@ -1114,7 +1117,33 @@ class TensorType(Type):
else if ((void*)py_%(name)s != (void*)%(name)s) { else if ((void*)py_%(name)s != (void*)%(name)s) {
py_%(name)s = (PyObject*)%(name)s; py_%(name)s = (PyObject*)%(name)s;
} }
{Py_XINCREF(py_%(name)s);} {Py_XINCREF(py_%(name)s);}
if (!PyArray_ISALIGNED(py_%(name)s)) {
PyErr_Format(PyExc_NotImplementedError,
"c_sync: expected an aligned array of type %%ld "
"(%(type_num)s), got non-aligned array of type %%ld"
" with %%ld dimensions, with 3 last dims %%ld, %%ld, %%ld"
" and 3 last strides %%ld %%ld, %%ld.",
(long int) %(type_num)s,
(long int) type_num_%(name)s,
(long int) PyArray_NDIM(py_%(name)s),
(long int) PyArray_NDIM(py_%(name)s) >= 3 ?
PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-3] : -1,
(long int) PyArray_NDIM(py_%(name)s) >= 2 ?
PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-2] : -1,
(long int) PyArray_NDIM(py_%(name)s) >= 1 ?
PyArray_DIMS(py_%(name)s)[PyArray_NDIM(py_%(name)s)-1] : -1,
(long int) PyArray_NDIM(py_%(name)s) >= 3 ?
PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-3] : -1,
(long int) PyArray_NDIM(py_%(name)s) >= 2 ?
PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-2] : -1,
(long int) PyArray_NDIM(py_%(name)s) >= 1 ?
PyArray_STRIDES(py_%(name)s)[PyArray_NDIM(py_%(name)s)-1] : -1
);
%(fail)s
}
""" % locals() """ % locals()
def c_headers(self): def c_headers(self):
...@@ -1134,7 +1163,7 @@ class TensorType(Type): ...@@ -1134,7 +1163,7 @@ class TensorType(Type):
def c_code_cache_version(self): def c_code_cache_version(self):
scalar_version = scal.Scalar(self.dtype).c_code_cache_version() scalar_version = scal.Scalar(self.dtype).c_code_cache_version()
if scalar_version: if scalar_version:
return (7,) + scalar_version return (9,) + scalar_version
else: else:
return () return ()
...@@ -6148,6 +6177,8 @@ class Reshape(Op): ...@@ -6148,6 +6177,8 @@ class Reshape(Op):
except Exception: except Exception:
raise ValueError('Cannot reshape input of shape %s to shape %s' % raise ValueError('Cannot reshape input of shape %s to shape %s' %
(x.shape, shp)) (x.shape, shp))
if not out[0].flags.aligned:
raise RuntimeError("numpy.reshape returned a not aligned tensor.")
def connection_pattern(self, node): def connection_pattern(self, node):
return [[True], [False]] return [[True], [False]]
...@@ -6214,7 +6245,7 @@ class Reshape(Op): ...@@ -6214,7 +6245,7 @@ class Reshape(Op):
return [tuple(oshape)] return [tuple(oshape)]
def c_code_cache_version(self): def c_code_cache_version(self):
return (2,) return (4,)
def c_code(self, node, name, inputs, outputs, sub): def c_code(self, node, name, inputs, outputs, sub):
if isinstance(node.inputs[0], TensorVariable): if isinstance(node.inputs[0], TensorVariable):
...@@ -6247,6 +6278,10 @@ class Reshape(Op): ...@@ -6247,6 +6278,10 @@ class Reshape(Op):
"Could not reshape array."); "Could not reshape array.");
%(fail)s; %(fail)s;
} }
if (!PyArray_ISALIGNED(%(z)s)) {
PyErr_Format(PyExc_RuntimeError, "PyArray_Newshape returned an object that isn't aligned!");
%(fail)s;
}
""" % locals() """ % locals()
else: else:
return Op.c_code(self, node, name, inputs, outputs, sub) return Op.c_code(self, node, name, inputs, outputs, sub)
...@@ -6795,6 +6830,9 @@ class AdvancedSubtensor1(Op): ...@@ -6795,6 +6830,9 @@ class AdvancedSubtensor1(Op):
def __eq__(self, other): def __eq__(self, other):
return type(self) == type(other) return type(self) == type(other)
def __str__(self):
return self.__class__.__name__
def make_node(self, x, ilist): def make_node(self, x, ilist):
x_ = as_tensor_variable(x) x_ = as_tensor_variable(x)
ilist_ = as_tensor_variable(ilist) ilist_ = as_tensor_variable(ilist)
......
...@@ -308,7 +308,8 @@ class DimShuffle(Op): ...@@ -308,7 +308,8 @@ class DimShuffle(Op):
for i, o in enumerate(self.new_order): for i, o in enumerate(self.new_order):
if o != 'x': if o != 'x':
strides_statements += [('strides[' + str(i) strides_statements += [('strides[' + str(i)
+ '] = PyArray_STRIDES(%(basename)s)[' + str(o) + ']')] + '] = PyArray_DIMS(%(basename)s)[' + str(o)
+ '] == 1? 0 : PyArray_STRIDES(%(basename)s)[' + str(o) + ']')]
else: else:
strides_statements += [('strides[' + str(i) + '] = 0')] strides_statements += [('strides[' + str(i) + '] = 0')]
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论