Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78025:eaef430ca49d
Date: 2015-06-11 10:08 +0200
http://bitbucket.org/pypy/pypy/changeset/eaef430ca49d/
Log: signext (due to its missing x86 opcodes) is weigthed as "not a
profitable operation"
diff --git a/pypy/module/micronumpy/compile.py
b/pypy/module/micronumpy/compile.py
--- a/pypy/module/micronumpy/compile.py
+++ b/pypy/module/micronumpy/compile.py
@@ -724,8 +724,13 @@
raise ArgumentMismatch
if self.name == "sum":
if len(self.args)>1:
- w_res = arr.descr_sum(interp.space,
+ var = self.args[1]
+ if isinstance(var, DtypeClass):
+ w_res = arr.descr_sum(interp.space, None,
var.execute(interp))
+ else:
+ w_res = arr.descr_sum(interp.space,
self.args[1].execute(interp))
+
else:
w_res = arr.descr_sum(interp.space)
elif self.name == "prod":
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
@@ -332,6 +332,17 @@
assert result == sum(range(30))
self.check_vectorized(1, 1)
+ def define_sum_float_to_int16():
+ return """
+ a = |30|
+ sum(a,int16)
+ """
+
+ def test_sum_float_to_int16(self):
+ result = self.run("sum_float_to_int16")
+ assert result == sum(range(30))
+ self.check_vectorized(1, 1)
+
def define_cumsum():
return """
a = |30|
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_costmodel.py
@@ -119,7 +119,7 @@
raw_store(p0, i4, i31, descr=int)
""")
savings = self.savings(loop1)
- assert savings == 1
+ assert savings >= 0
def test_sum(self):
loop1 = self.parse("""
@@ -131,5 +131,26 @@
savings = self.savings(loop1)
assert savings == 2
+ def test_sum_float_to_int16(self):
+ loop1 = self.parse("""
+ f10 = raw_load(p0, i0, descr=double)
+ f11 = raw_load(p0, i1, descr=double)
+ i10 = cast_float_to_int(f10)
+ i11 = cast_float_to_int(f11)
+ i12 = int_signext(i10, 2)
+ i13 = int_signext(i11, 2)
+ i14 = int_add(i1, i12)
+ i16 = int_signext(i14, 2)
+ i15 = int_add(i16, i13)
+ i17 = int_signext(i15, 2)
+ """)
+ savings = self.savings(loop1)
+ # it does not benefit because signext has
+ # a very inefficient implementation (x86
+ # does not provide nice instr to convert
+ # integer sizes)
+ # signext -> no benefit, + 2x unpack
+ assert savings < 0
+
class Test(CostModelBaseTest, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -12,7 +12,7 @@
from rpython.jit.metainterp.optimizeopt.dependency import DependencyGraph
from rpython.jit.metainterp.optimizeopt.unroll import Inliner
from rpython.jit.metainterp.optimizeopt.vectorize import
(VectorizingOptimizer, MemoryRef,
- isomorphic, Pair, NotAVectorizeableLoop, NotAVectorizeableLoop,
GuardStrengthenOpt)
+ isomorphic, Pair, NotAVectorizeableLoop, NotAProfitableLoop,
GuardStrengthenOpt)
from rpython.jit.metainterp.optimize import InvalidLoop
from rpython.jit.metainterp.history import ConstInt, BoxInt,
get_const_ptr_for_string
from rpython.jit.metainterp import executor, compile, resume
@@ -109,6 +109,8 @@
opt.find_adjacent_memory_refs()
opt.extend_packset()
opt.combine_packset()
+ if not opt.costmodel.profitable(opt.packset):
+ raise NotAProfitableLoop()
opt.schedule(True)
gso = GuardStrengthenOpt(opt.dependency_graph.index_vars)
gso.propagate_all_forward(opt.loop)
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
@@ -361,11 +361,16 @@
if not we_are_translated():
# some test cases check the accumulation variables
self.packset.accum_vars = {}
+ print "packs:"
for pack in self.packset.packs:
accum = pack.accum
if accum:
self.packset.accum_vars[accum.var] = accum.pos
+ print " %dx %s (accum? %d) " % (len(pack.operations),
+
pack.operations[0].op.getopname(),
+ accum is not None)
+
def schedule(self, vector=False):
self.guard_early_exit = -1
self.clear_newoperations()
@@ -394,6 +399,8 @@
def unpack_from_vector(self, op, sched_data, renamer):
renamer.rename(op)
args = op.getarglist()
+ if op.getopnum() == rop.INT_SIGNEXT:
+ py.test.set_trace()
for i, arg in enumerate(op.getarglist()):
if isinstance(arg, Box):
argument = self._unpack_from_vector(i, arg, sched_data,
renamer)
@@ -481,7 +488,7 @@
def unpack_cost(self, index, op):
raise NotImplementedError
- def savings_for_pack(self, opnum, times):
+ def savings_for_pack(self, pack, times):
raise NotImplementedError
def savings_for_unpacking(self, node, index):
@@ -495,8 +502,8 @@
def calculate_savings(self, packset):
savings = 0
for pack in packset.packs:
- savings += self.savings_for_pack(pack.opnum, pack.opcount())
op0 = pack.operations[0].getoperation()
+ savings += self.savings_for_pack(pack, pack.opcount())
if op0.result:
for i,node in enumerate(pack.operations):
savings += self.savings_for_unpacking(node, i)
@@ -507,10 +514,22 @@
class X86_CostModel(CostModel):
- def savings_for_pack(self, opnum, times):
- cost, benefit_factor = (1,1) # TODO custom values for different ops
+ def savings_for_pack(self, pack, times):
+ cost, benefit_factor = (1,1)
+ op = pack.operations[0].getoperation()
+ if op.getopnum() == rop.INT_SIGNEXT:
+ cost, benefit_factor = self.cb_signext(pack)
return benefit_factor * times - cost
+ def cb_signext(self, pack):
+ op0 = pack.operations[0].getoperation()
+ size = op0.getarg(1).getint()
+ orig_size = pack.output_type.getsize()
+ if size == orig_size:
+ return 0,0
+ # no benefit for this operation! needs many x86 instr
+ return 1,0
+
def unpack_cost(self, index, op):
if op.getdescr():
if op.getdescr().is_array_of_floats():
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit