[pypy-commit] pypy vecopt-merge: same operation for iter states failed if index and _indices where not the same (fixed)
plan_rich
noreply at buildbot.pypy.org
Fri Oct 2 13:14:40 CEST 2015
Author: Richard Plangger <planrichi at gmail.com>
Branch: vecopt-merge
Changeset: r79929:232d93b7d261
Date: 2015-10-02 13:10 +0200
http://bitbucket.org/pypy/pypy/changeset/232d93b7d261/
Log: same operation for iter states failed if index and _indices where
not the same (fixed) concrete type of a loaded singlefloat was f,
but singlefloat_to_float demands i as parameter
diff --git a/pypy/module/micronumpy/iterators.py b/pypy/module/micronumpy/iterators.py
--- a/pypy/module/micronumpy/iterators.py
+++ b/pypy/module/micronumpy/iterators.py
@@ -84,7 +84,9 @@
self.offset = offset
def same(self, other):
- if self.offset == other.offset:
+ if self.offset == other.offset and \
+ self.index == other.index and \
+ self._indices == other._indices:
return self.iterator.same_shape(other.iterator)
return False
@@ -119,9 +121,9 @@
self.factors = factors
def same_shape(self, other):
- """ if two iterators share the same shape,
- next() only needs to be called on one!
- """
+ """ Iterating over the same element """
+ if not self.contiguous or not other.contiguous:
+ return False
return (self.contiguous == other.contiguous and
self.array.dtype is self.array.dtype and
self.shape_m1 == other.shape_m1 and
diff --git a/pypy/module/micronumpy/test/test_zjit.py b/pypy/module/micronumpy/test/test_zjit.py
--- a/pypy/module/micronumpy/test/test_zjit.py
+++ b/pypy/module/micronumpy/test/test_zjit.py
@@ -895,7 +895,8 @@
a = [[1, 2, 3, 4], [3, 4, 5, 6], [5, 6, 7, 8], [7, 8, 9, 10], [9, 10, 11, 12], [11, 12, 13, 14], [13, 14, 15, 16], [16, 17, 18, 19]]
b = a -> ::2
c = b + b
- c -> 1 -> 1
+ d = c -> 1
+ d -> 1
"""
def test_multidim_slice(self):
@@ -904,7 +905,7 @@
self.check_trace_count(3)
# ::2 creates a view object -> needs an inner loop
# that iterates continous chunks of the matrix
- self.check_vectorized(1,1)
+ self.check_vectorized(1,0)
def define_dot_matrix():
return """
@@ -930,7 +931,6 @@
"""
def test_pow(self):
- py.test.skip("Not implemented CDefinedIntSymbolic('RPY_TLOFS_rpy_errno')")
result = self.run("pow")
assert result == 29 ** 2
self.check_trace_count(1)
@@ -944,20 +944,6 @@
"""
def test_pow_int(self):
- py.test.skip("Not implemented CDefinedIntSymbolic('RPY_TLOFS_rpy_errno')")
result = self.run("pow_int")
assert result == 15 ** 2
self.check_trace_count(4) # extra one for the astype
-
-
- def define_take():
- return """
- a = |10|
- b = take(a, [1, 1, 3, 2])
- b -> 2
- """
-
- def test_take(self):
- py.test.skip("key error get item?")
- result = self.run("take")
- assert result == 3
diff --git a/rpython/jit/metainterp/optimizeopt/schedule.py b/rpython/jit/metainterp/optimizeopt/schedule.py
--- a/rpython/jit/metainterp/optimizeopt/schedule.py
+++ b/rpython/jit/metainterp/optimizeopt/schedule.py
@@ -10,6 +10,7 @@
from rpython.jit.metainterp.jitexc import NotAProfitableLoop
from rpython.rlib.objectmodel import specialize, always_inline
from rpython.jit.metainterp.jitexc import NotAVectorizeableLoop, NotAProfitableLoop
+from rpython.rtyper.lltypesystem.lloperation import llop
class SchedulerState(object):
@@ -162,6 +163,14 @@
for node in state.graph.nodes:
assert node.emitted
+def failnbail_transformation(msg):
+ msg = '%s\n' % msg
+ if we_are_translated():
+ llop.debug_print(lltype.Void, msg)
+ else:
+ import pdb; pdb.set_trace()
+ raise NotImplementedError(msg)
+
class TypeRestrict(object):
ANY_TYPE = '\x00'
ANY_SIZE = -1
@@ -191,15 +200,27 @@
def check(self, value):
assert value.datatype != '\x00'
if self.type != TypeRestrict.ANY_TYPE:
- assert self.type == value.datatype
+ if self.type != value.datatype:
+ msg = "type mismatch %s != %s" % \
+ (self.type, value.datatype)
+ failnbail_transformation(msg)
assert value.bytesize > 0
if not self.any_size():
- assert self.bytesize == value.bytesize
+ if self.bytesize != value.bytesize:
+ msg = "bytesize mismatch %s != %s" % \
+ (self.bytesize, value.bytesize)
+ failnbail_transformation(msg)
assert value.count > 0
if self.count != TypeRestrict.ANY_COUNT:
- assert value.count >= self.count
+ if value.count < self.count:
+ msg = "count mismatch %s < %s" % \
+ (self.count, value.count)
+ failnbail_transformation(msg)
if self.sign != TypeRestrict.ANY_SIGN:
- assert bool(self.sign) == value.sign
+ if bool(self.sign) == value.sign:
+ msg = "sign mismatch %s < %s" % \
+ (self.sign, value.sign)
+ failnbail_transformation(msg)
def max_input_count(self, count):
""" How many """
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -125,8 +125,8 @@
type = self.type
if descr.is_array_of_floats():
type = 'f'
- if isinstance(descr, ArrayDescr) and descr.getconcrete_type() == 'f':
- type = 'f'
+ #if isinstance(descr, ArrayDescr) and descr.getconcrete_type() == 'f':
+ # type = 'f'
self.bytesize = descr.get_item_size_in_bytes()
self.signed = descr.is_item_signed()
self.datatype = type
diff --git a/rpython/jit/metainterp/test/test_resoperation.py b/rpython/jit/metainterp/test/test_resoperation.py
--- a/rpython/jit/metainterp/test/test_resoperation.py
+++ b/rpython/jit/metainterp/test/test_resoperation.py
@@ -5,6 +5,7 @@
from rpython.jit.metainterp.history import ConstInt
from rpython.jit.backend.llsupport.symbolic import (WORD as INT_WORD,
SIZEOF_FLOAT as FLOAT_WORD)
+from rpython.jit.backend.llsupport.descr import ArrayDescr
def test_arity_mixins():
cases = [
@@ -108,10 +109,22 @@
assert op.cast_to() == kwargs['cast_to']
def test_unpack_1():
- op = rop.ResOperation(rop.rop.VEC_UNPACK_I, [rop.InputArgVector(), ConstInt(0), ConstInt(1)])
- assert (op.type, op.datatype, op.bytesize, op.is_vector()) == ('i', 'i', 8, False)
- op = rop.ResOperation(rop.rop.VEC_UNPACK_I, [rop.InputArgVector(), ConstInt(0), ConstInt(2)])
- assert (op.type, op.datatype, op.bytesize, op.is_vector()) == ('i', 'i', 8, True)
+ op = rop.ResOperation(rop.rop.VEC_UNPACK_I,
+ [rop.InputArgVector(), ConstInt(0), ConstInt(1)])
+ assert (op.type, op.datatype, op.bytesize, op.is_vector()) == \
+ ('i', 'i', 8, False)
+ op = rop.ResOperation(rop.rop.VEC_UNPACK_I,
+ [rop.InputArgVector(), ConstInt(0), ConstInt(2)])
+ assert (op.type, op.datatype, op.bytesize, op.is_vector()) == \
+ ('i', 'i', 8, True)
+
+def test_load_singlefloat():
+ descr = ArrayDescr(8,4, None, 'S', concrete_type='f')
+ op = rop.ResOperation(rop.rop.VEC_RAW_LOAD_I,
+ [rop.InputArgInt(), ConstInt(0)],
+ descr=descr)
+ assert (op.type, op.datatype, op.bytesize, op.is_vector()) == ('i', 'i', 4, True)
+
def test_types():
op = rop.ResOperation(rop.rop.INT_ADD, [ConstInt(0),ConstInt(1)])
diff --git a/rpython/jit/metainterp/test/test_vector.py b/rpython/jit/metainterp/test/test_vector.py
--- a/rpython/jit/metainterp/test/test_vector.py
+++ b/rpython/jit/metainterp/test/test_vector.py
@@ -12,7 +12,9 @@
from rpython.rlib.rarithmetic import r_uint, intmask
from rpython.rlib.rawstorage import (alloc_raw_storage, raw_storage_setitem,
free_raw_storage, raw_storage_getitem)
+from rpython.rlib.objectmodel import specialize, is_annotation_constant
+ at specialize.argtype(0,1)
def malloc(T,n):
return lltype.malloc(T, n, flavor='raw', zero=True)
def free(mem):
@@ -409,5 +411,106 @@
res = self.meta_interp(f, [128], vec_all=True)
assert res == f(128)
+
+ def combinations(types, operators):
+ import itertools
+ size = 22
+
+ class Typ(object):
+ def __init__(self, type, storecast, loadcast):
+ self.type = type
+ self.storecast = storecast
+ self.loadcast = loadcast
+ def __repr__(self):
+ return self.type.replace(".","_")
+
+ sizes = [22]
+ for t1, t2, t3, op, size in itertools.product(types, types, types, operators, sizes):
+ yield (size, Typ(*t1), Typ(*t2), Typ(*t3), op[0], op[1])
+ types = [('rffi.DOUBLE', 'float', 'float'),
+ ('rffi.SIGNED', 'int', 'int'),
+ ('rffi.FLOAT', 'rffi.r_singlefloat', 'float'),
+ ]
+ operators = [('add', '+'),
+ ]
+ for size, typ1, typ2, typ3, opname, op in combinations(types, operators):
+ _source = """
+ def test_binary_operations_{name}(self):
+ myjitdriver = JitDriver(greens = [], reds = 'auto')
+ T1 = lltype.Array({type_a}, hints={{'nolength': True}})
+ T2 = lltype.Array({type_b}, hints={{'nolength': True}})
+ T3 = lltype.Array({type_c}, hints={{'nolength': True}})
+ def f(size):
+ vector_a = lltype.malloc(T1, size, flavor='raw')
+ vector_b = lltype.malloc(T2, size, flavor='raw')
+ vector_c = lltype.malloc(T3, size, flavor='raw')
+ for i in range(size):
+ vector_a[i] = {type_a_storecast}(i+1)
+ for i in range(size):
+ vector_b[i] = {type_b_storecast}(i+1)
+ for i in range(size):
+ vector_c[i] = {type_c_storecast}(i+1)
+ i = 0
+ while i < size:
+ myjitdriver.jit_merge_point()
+ a = {type_a_loadcast}(vector_a[i])
+ b = {type_b_loadcast}(vector_b[i])
+ c = (a {op} b)
+ vector_c[i] = {type_c_storecast}(c)
+ i += 1
+ lltype.free(vector_a, flavor='raw')
+ lltype.free(vector_b, flavor='raw')
+ c = {type_c_loadcast}(0.0)
+ for i in range(size):
+ c += {type_c_loadcast}(vector_c[i])
+ lltype.free(vector_c, flavor='raw')
+ return c
+ res = self.meta_interp(f, [{size}], vec_all=True)
+ assert res == f({size})
+ """
+ env = {
+ 'type_a': typ1.type,
+ 'type_b': typ2.type,
+ 'type_c': typ3.type,
+ 'type_a_loadcast': typ1.loadcast,
+ 'type_b_loadcast': typ2.loadcast,
+ 'type_c_loadcast': typ3.loadcast,
+ 'type_a_storecast': typ1.storecast,
+ 'type_b_storecast': typ2.storecast,
+ 'type_c_storecast': typ3.storecast,
+ 'size': size,
+ 'name': str(typ1) + '__' + str(typ2) + '__' + str(typ3) + \
+ '__' + str(size) + '__' + opname,
+ 'op': op,
+ }
+ formatted = _source.format(**env)
+ exec py.code.Source(formatted).compile()
+
+ def test_binary_operations_aa(self):
+ myjitdriver = JitDriver(greens = [], reds = 'auto')
+ T1 = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
+ T3 = lltype.Array(rffi.SIGNED, hints={'nolength': True})
+ def f(size):
+ vector_a = lltype.malloc(T1, size, flavor='raw', zero=True)
+ vector_b = lltype.malloc(T1, size, flavor='raw', zero=True)
+ vector_c = lltype.malloc(T3, size, flavor='raw', zero=True)
+ i = 0
+ while i < size:
+ myjitdriver.jit_merge_point()
+ a = (vector_a[i])
+ b = (vector_b[i])
+ c = (a + b)
+ vector_c[i] = int(c)
+ i += 1
+ free(vector_a)
+ free(vector_b)
+ #c = 0.0
+ #for i in range(size):
+ # c += vector_c[i]
+ lltype.free(vector_c, flavor='raw')
+ return 0
+ res = self.meta_interp(f, [22], vec_all=True)
+ assert res == f(22)
+
class TestLLtype(LLJitMixin, VectorizeTests):
pass
More information about the pypy-commit
mailing list