Skip to content

Commit

Permalink
Merge pull request #59 from coneoproject/log-flops
Browse files Browse the repository at this point in the history
* log-flops:
  A few more tests of flop counting
  Use new rvalue property in For start and size
  Add lvalue and rvalue properties to Stmts
  base: cast to int in For properties
  • Loading branch information
wence- committed Sep 10, 2015
2 parents 994baf3 + 5c0f08a commit 23f3d84
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 6 deletions.
53 changes: 47 additions & 6 deletions coffee/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -534,6 +534,14 @@ class Statement(Node):
def __init__(self, children=None, pragma=None):
super(Statement, self).__init__(children, pragma)

@property
def lvalue(self):
return None

@property
def rvalue(self):
return None


class EmptyStatement(Statement):

Expand Down Expand Up @@ -561,6 +569,18 @@ class Assign(Statement, Writer):
def __init__(self, sym, exp, pragma=None):
super(Assign, self).__init__([sym, exp], pragma)

@property
def lvalue(self):
return self.children[0]

@property
def rvalue(self):
return self.children[1]

@rvalue.setter
def rvalue(self, val):
self.children[1] = val

def gencode(self, not_scope=False):
return assign(self.children[0].gencode(),
self.children[1].gencode()) + semicolon(not_scope)
Expand All @@ -571,6 +591,18 @@ class AugmentedAssign(Statement, Writer):
def __init__(self, sym, exp, pragma=None):
super(AugmentedAssign, self).__init__([sym, exp], pragma)

@property
def lvalue(self):
return self.children[0]

@property
def rvalue(self):
return self.children[1]

@rvalue.setter
def rvalue(self, val):
self.children[1] = val

def gencode(self, not_scope=False):
sym, exp = self.children
return "%s %s %s%s" % (sym.gencode(), type(self).op, exp.gencode(), semicolon(not_scope))
Expand Down Expand Up @@ -619,6 +651,18 @@ def __init__(self, typ, sym, init=None, qualifiers=None, attributes=None, pragma
def operands(self):
return [self.typ, self.sym, self.init, self.qual, self.attr], {}

@property
def lvalue(self):
return self.sym

@property
def rvalue(self):
return self.init

@rvalue.setter
def rvalue(self, val):
self.init = val

@property
def size(self):
"""Return the size of the declared variable. In particular, return
Expand Down Expand Up @@ -730,10 +774,7 @@ def dim(self):

@property
def start(self):
if isinstance(self.init, Decl):
return self.init.init.symbol
elif isinstance(self.init, Assign):
return self.init.children[1]
return self.init.rvalue.symbol

@property
def end(self):
Expand All @@ -745,11 +786,11 @@ def end(self, value):

@property
def size(self):
return self.cond.children[1].symbol - self.init.init.symbol
return int(self.end) - int(self.start)

@property
def increment(self):
return self.incr.children[1].symbol
return int(self.incr.children[1].symbol)

@increment.setter
def increment(self, value):
Expand Down
28 changes: 28 additions & 0 deletions tests/test_count_flops.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@ def binop(request):
return request.param(a, b)


@pytest.fixture(scope="module",
params=[Incr, IMul, Decr, IDiv])
def increment(request, binop):
d = Symbol("d")
return request.param(d, binop)


@pytest.fixture(scope="module",
params=[Prod, Div, Sum, Sub])
def nested_binop(request, binop):
Expand Down Expand Up @@ -65,6 +72,27 @@ def test_nested_for(v, binop):
assert v.visit(tree) == 10*11


def test_for_assign_init(v, increment):
idx = Symbol("i")
decl = Decl("int", idx)
loop = For(Assign(idx, 3), Less(idx, 10), Incr(idx, 3),
Block([increment]))
tree = Block([decl, loop])

assert v.visit(tree) == 2 * 2


def test_for_assign_init_avx(v, avxbinop):
idx = Symbol("i")
c = Symbol("c")
decl = Decl("int", idx)
loop = For(Assign(idx, 3), Less(idx, 10), Incr(idx, 3),
Block([AVXStore(c, avxbinop)]))
tree = Block([decl, loop])

assert v.visit(tree) == 2 * 4


if __name__ == "__main__":
import os
pytest.main(os.path.abspath(__file__))

0 comments on commit 23f3d84

Please sign in to comment.