Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Adding ABC and example implementations #3

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions tests/test_rr_graph_huge.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/usr/bin/env python3

import sys

sys.path.insert(0, ".")

assert sys.argv[1]
exec("from vprgen.rr_graph import %s as rr_graph" % (sys.argv[1],))

d = rr_graph.ArchitectureDelegate()

for i in range(0, int(10000000)):
d.add_edge(i, i+1, 0, {})


38 changes: 38 additions & 0 deletions vprgen/rr_graph/abc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/usr/bin/env python3

import abc
from typing import Any, Dict, Iterable, Union


class Edge(abc.ABC):
@property
@abc.abstractmethod
def src_node(self) -> int:
raise NotImplemented

@property
@abc.abstractmethod
def sink_node(self) -> int:
raise NotImplemented

@property
@abc.abstractmethod
def switch_id(self) -> int:
raise NotImplemented

@property
@abc.abstractmethod
def metadata(self) -> Union[Dict[str, Any], None]:
"""Metadata for edge."""
raise NotImplemented


class Node(abc.ABC):
pass


class ArchitectureDelegate(abc.ABC):
@abc.abstractmethod
def edges(self) -> Iterable[Edge]:
raise NotImplemented

24 changes: 24 additions & 0 deletions vprgen/rr_graph/basic.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
#!/usr/bin/env python3

from collections import namedtuple

from .abc import Edge as EdgeABC
from .abc import ArchitectureDelegate as ArchitectureDelegateABC

# Implementation using namedtuple
Edge = namedtuple('Edge', ['src_node', 'sink_node', 'switch_id', 'metadata'])
EdgeABC.register(Edge)


class ArchitectureDelegate:
def __init__(self):
self.edges = []

def add_edge(self, src_node, sink_node, switch_id, metadata={}):
self.edges.append(Edge(src_node, sink_node, switch_id, metadata))

def edges(self):
return self.edges


ArchitectureDelegateABC.register(ArchitectureDelegate)
51 changes: 51 additions & 0 deletions vprgen/rr_graph/ctypes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env python3

from ctypes import *

from .abc import Edge as EdgeABC
from .abc import ArchitectureDelegate as ArchitectureDelegateABC


"""Implementation using ctypes."""

class Edge(Structure):
_fields_ = [
("src_node", c_ulonglong),
("sink_node", c_ulonglong),
("switch_id", c_int),
("metadata", py_object),
]


def array_resize(a, new_size):
assert new_size > a._length_, (new_size, a._length_)
resize(a, sizeof(a._type_)*new_size)
return (a._type_*new_size).from_address(addressof(a))


class ArchitectureDelegate:
def __init__(self):
self.i = 0
self.s = sizeof(Edge)

self.edges_l = 10
self.edges_mem_owner = (Edge * 10)()
self.edges = self.edges_mem_owner

def add_edge(self, src_node, sink_node, switch_id, metadata={}):
if self.i == self.edges_l:
print("Doubling edges size", self.edges_l, "->", self.edges_l*2)
self.edges_l *= 2
self.edges = array_resize(self.edges_mem_owner, self.edges_l)
e = self.edges[self.i]
e.src_node = src_node
e.sink_node = sink_node
e.switch_id = switch_id
e.metadata = metadata
self.i += 1

def edges(self):
return self.edges[:self.i]


ArchitectureDelegateABC.register(ArchitectureDelegate)
45 changes: 45 additions & 0 deletions vprgen/rr_graph/numpy.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env python3

import numpy as np

from .abc import Edge as EdgeABC
from .abc import ArchitectureDelegate as ArchitectureDelegateABC

"""Implementation using numpy."""

Edge = np.dtype([
('src_node', '=i8'), # 64bit int
('sink_node', '=i8'), # 64bit int
('switch_id', '=i2'), # 16bit int
('metadata', 'O'), # dict {}
])

#EdgeABC.register(Edge)


class ArchitectureDelegate:
def __init__(self, hint=10485760):
self.i = 0
self.edges_mem_owner = np.zeros(hint, dtype=Edge)
self.edges = self.edges_mem_owner.view(np.recarray)

def add_edge(self, src_node, sink_node, switch_id, metadata={}):
l = len(self.edges)
if self.i == l:
print("Doubling edges size", l, "->", l*2)
del self.edges
self.edges_mem_owner.resize(l*2)
self.edges = self.edges_mem_owner.view(np.recarray)

e = self.edges[self.i]
e.src_node = src_node
e.sink_node = sink_node
e.switch_id = switch_id
e.metadata = metadata
self.i += 1

def edges(self):
return self.edges[:self.i]


ArchitectureDelegateABC.register(ArchitectureDelegate)