Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78099:2e80beb1f2b4
Date: 2015-06-15 09:20 +0200
http://bitbucket.org/pypy/pypy/changeset/2e80beb1f2b4/
Log: added test case to sum on llgraph
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
@@ -354,6 +354,20 @@
assert result == sum(range(30))
self.check_vectorized(1, 1)
+ def define_sum_multi():
+ return """
+ a = |30|
+ b = sum(a)
+ c = |60|
+ d = sum(c)
+ b + c
+ """
+
+ def test_sum_multi(self):
+ result = self.run("sum_multi")
+ assert result == sum(range(30)) + sum(range(0,60))
+ self.check_vectorized(1, 1)
+
def define_sum_float_to_int16():
return """
a = |30|
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -31,7 +31,11 @@
try:
newbox = _cache[box]
except KeyError:
- newbox = _cache[box] = box.__class__()
+ if isinstance(box, BoxVectorAccum):
+ newbox = _cache[box] = \
+ box.__class__(box, box.scalar_var, box.operator)
+ else:
+ newbox = _cache[box] = box.__class__()
return newbox
#
self.inputargs = map(mapping, inputargs)
@@ -696,6 +700,17 @@
assert len(vx) == len(vy)
return [_vx == _vy for _vx,_vy in zip(vx,vy)]
+ def bh_vec_int_xor(self, vx, vy):
+ return [int(x) ^ int(y) for x,y in zip(vx,vy)]
+
+ def bh_vec_float_pack(self, vector, value, index, count):
+ if isinstance(value, list):
+ for i in range(count):
+ vector[index + i] = value[i]
+ else:
+ vector[index] = value
+ return vector
+
def bh_vec_cast_float_to_singlefloat(self, vx):
return vx
@@ -872,7 +887,7 @@
def prod(acc, x): return acc * x
value = reduce(prod, value, 1)
else:
- raise NotImplementedError
+ raise NotImplementedError("accum operator in fail guard")
values.append(value)
if hasattr(descr, '_llgraph_bridge'):
target = (descr._llgraph_bridge, -1)
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py
b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -484,10 +484,10 @@
self.threshold = threshold
def unpack_cost(self, index, op):
- raise NotImplementedError
+ raise NotImplementedError("unpack cost")
def savings_for_pack(self, pack, times):
- raise NotImplementedError
+ raise NotImplementedError("savings for pack")
def savings_for_unpacking(self, node, index):
savings = 0
@@ -691,13 +691,15 @@
return None, -1
def accumulate_prepare(self, sched_data, renamer):
+ vec_reg_size = sched_data.vec_reg_size
for pack in self.packs:
if not pack.is_accumulating():
continue
accum = pack.accum
# create a new vector box for the parameters
box = pack.input_type.new_vector_box()
- op = ResOperation(rop.VEC_BOX, [ConstInt(0)], box)
+ size = vec_reg_size // pack.input_type.getsize()
+ op = ResOperation(rop.VEC_BOX, [ConstInt(size)], box)
sched_data.invariant_oplist.append(op)
result = box.clonebox()
# clear the box to zero TODO might not be zero for every reduction?
diff --git a/rpython/jit/metainterp/test/test_vectorize.py
b/rpython/jit/metainterp/test/test_vectorize.py
--- a/rpython/jit/metainterp/test/test_vectorize.py
+++ b/rpython/jit/metainterp/test/test_vectorize.py
@@ -153,6 +153,24 @@
res = self.meta_interp(f, [30])
assert res == f(30) == 128
+ def test_sum(self):
+ myjitdriver = JitDriver(greens = [], reds = 'auto', vectorize=True)
+ myjitdriver2 = JitDriver(greens = [], reds = 'auto', vectorize=True)
+ T = lltype.Array(rffi.DOUBLE, hints={'nolength': True})
+ def f(d):
+ va = lltype.malloc(T, d, flavor='raw', zero=True)
+ for j in range(d):
+ va[j] = float(j)
+ i = 0
+ accum = 0
+ while i < d:
+ myjitdriver.jit_merge_point()
+ accum += va[i]
+ i += 1
+ lltype.free(va, flavor='raw')
+ return accum
+ res = self.meta_interp(f, [60])
+ assert res == f(60) == sum(range(60))
class VectorizeLLtypeTests(VectorizeTests):
pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit