GithubHelp home page GithubHelp logo

poseidon's Introduction

About poseidon

poseidon is a very generic scheduler for time division multiplexing (TDM) network on chip. poseidon uses Metaheuristics to optimize the schedule.

poseidon generates a schedule from a specification of the platform and a specification of the communication requirements.

Getting Started

poseidon is integrated with the T-CREST project and is checked out by the Patmos configuration. Because poseidon is very generic it can be used by other platforms as well. Checking out and building poseidon can be done as follows:

git clone https://github.com/t-crest/poseidon.git poseidon
cd poseidon && make

Platform Specification

poseidon needs a specification of the platform, and how it is structured at the pipeline level. Below we show how an N by M bitorus network can be specified. Other types of topologies are "mesh" and "custom". If "custom" is specified then each unidirectional link must be specified with a sink and a source node. Links must be connected north-south or east-west, no diagonal links. To verify a custom topology poseidon can draw the specified topology with the '-d' option.

<?xmlversion="1.0" encoding="UTF-8"?>
<platform width="N" height="M">
    <topology type="bitorus" routerDepth="X" linkDepth="Y" ></topology>
</platform>

Communication Specification

If the programmer needs a communication pattern different from all-to-all with one phit per packet, poseidon needs a specification of the communication pattern that is requested to be scheduled onto the platform. Below we show the structure of a custom communication pattern. The number of phits can also be specified on individual channels, as shown on the last channel.

<communication type="custom" phits="3" >
    <channel from="(0,0)" to="(1,1)" bandwidth="10" />
    <channel from="(0,1)" to="(2,2)" bandwidth="2" />
    <channel from="(0,2)" to="(2,2)" bandwidth="2" />
    <channel from="(1,1)" to="(2,2)" bandwidth="2" phits="4" />
</communication>

TODO

  • Calculation of the bisection bound for arbitrary communication patterns.
  • Check local source and destination links before other links.
  • Predecessor structure with constant lookup time for next free time slot.
  • Termination of program when solution falls in some interval of lower bound.

poseidon's People

Contributors

rbscloud avatar eisbaw avatar jaspurh avatar schoeberl avatar christophmuellerorg avatar jeunes2 avatar dlp avatar epsilon-0311 avatar stefanhepp avatar

Stargazers

David Metz avatar Carlos Eduardo Parra avatar  avatar

Watchers

Benedikt Huber avatar Marco Ziccardi avatar  avatar  avatar  avatar James Cloos avatar Phell avatar Cláudio Silva avatar Jack Whitham avatar  avatar  avatar Eleftherios Kyriakakis avatar Tórur Biskopstø Strøm avatar  avatar  avatar Michael Binz avatar André Rocha avatar Bekim avatar Chris Gkiokas avatar Jamie Garside avatar Michael Platzer avatar Amine NAJI avatar LucaPezza avatar Anthon Vincent Riber avatar David Metz avatar  avatar Zixuan Li avatar

Forkers

helloworld1983

poseidon's Issues

XML output might have errors

Hello,
I am currently evaluating your project as part of my Bachelors thesis. I think I might have found an error in the XML output of poseidon.
My parameters:
poseidon -m GRASP -p bitorus5x5.xml -t 60 -d -b 0 -s ./out.xml -a

I am using the provided bitorus architecture.
The output caused my parsing program to crash repeatedly so I decided to inspect the output manually.
The bug seems to be caused by unfinished overlap optimization.
In the shortened output below there should be a connection between (0,0) and (0,4).
It begins in timeslot 28 but it isn't continued.
There is no (0,4) timeslot 29 (due to overlap optimisation) but the incoming connection is not included in (0,4) timeslot 0.
Is:
<schedule length="29" width="5" height="5">
...
<tile id="(0,0)">
...
<timeslot value="28">
<na rx="(0,0)" tx="(0,4)" route="NL" chan-id="26" config-ch="false" pkt-id="0"/>
<router>
<output id="N" input="L"/>
<output id="S" input="D"/>
<output id="E" input="D"/>
<output id="W" input="D"/>
<output id="L" input="N"/>
</router>
</timeslot>
<latency>
...
<destination id="(0,4)" slotwaittime="29" channellatency="2" chan-id="26" chan-bw="1" config-ch="false" pkt-len="1" rate="0.034482758620689655"/>
...
</latency>
</tile>
...
<tile id="(0,4)">
<timeslot value="0">
<na rx="(0,4)" tx="(3,3)" route="WWNL" chan-id="94" config-ch="false" pkt-id="0"/>
<router>
<output id="N" input="D"/>
<output id="S" input="D"/>
<output id="E" input="D"/>
<output id="W" input="L"/>
<output id="L" input="D"/>
</router>
</timeslot>
...
<timeslot value="28">
<na rx="(0,3)" tx="(0,4)"/>
<router>
<output id="N" input="D"/>
<output id="S" input="D"/>
<output id="E" input="D"/>
<output id="W" input="D"/>
<output id="L" input="E"/>
</router>
</timeslot>
<latency>
...
</latency>
< / tile >
...
</schedule>
Should probably be:
<schedule length="29" width="5" height="5">
...
<tile id="(0,0)">
...
<timeslot value="28">
<na rx="(0,0)" tx="(0,4)" route="NL" chan-id="26" config-ch="false" pkt-id="0"/>
<router>
<output id="N" input="L"/>
<output id="S" input="D"/>
<output id="E" input="D"/>
<output id="W" input="D"/>
<output id="L" input="N"/>
</router>
</timeslot>
<latency>
...
<destination id="(0,4)" slotwaittime="29" channellatency="2" chan-id="26" chan-bw="1" config-ch="false" pkt-len="1" rate="0.034482758620689655"/>
...
</latency>
</tile>
...
<tile id="(0,4)">
<timeslot value="0">
<na rx="(0,4)" tx="(3,3)" route="WWNL" chan-id="94" config-ch="false" pkt-id="0"/>
<router>
<output id="N" input="D"/>
<output id="S" input="D"/>
<output id="E" input="D"/>
<output id="W" input="L"/>
<output id="L" input="S"/><- changed here
</router>
</timeslot>
...
<timeslot value="28">
<na rx="(0,3)" tx="(0,4)"/>
<router>
<output id="N" input="D"/>
<output id="S" input="D"/>
<output id="E" input="D"/>
<output id="W" input="D"/>
<output id="L" input="E"/>
</router>
</timeslot>
<latency>
...
</latency>
< / tile >
...
</schedule>
I had a quick look into the output code and there seems to be no adjustment of the schedule, so I assume that this is caused by a unfinished optimization.
out_broken.xml.zip

Greetings,
David

Build failure with clang: flexible array captured in lambda expression

poseidon fails to build using clang (3.3):

t-crest/poseidon/src/xmlOutput.cpp:204:21: error: variable 'co' with
  variably modified type cannot be captured in a lambda expression
                print_coord(c.to, co, max(n.rows(),n.cols()));

The reason is that co is defined as a flexible-size array that is also used in a lambda expression. I honestly do not know whether this is a limitation of clang, or whether the C++11 standard does not allow this.
Please fix the problem anyway, as clang is the standard compiler on some systems (including OS X) and poseidon is now part of the patmos toolchain (https://github.com/t-crest/patmos-misc/blob/master/build.sh).

Quick Fix:

diff --git a/src/xmlOutput.cpp b/src/xmlOutput.cpp
index a358c17..d57a13c 100644
--- a/src/xmlOutput.cpp
+++ b/src/xmlOutput.cpp
@@ -160,6 +160,7 @@ void xmlOutput::print_coord(const pair<int, int> r,char* co, const int max_dimen
 void xmlOutput::add_latency(const network_t& n, xml_node* tile, const vector<router_id>* destinations, router_t* r){
        xml_node latency = (*tile).append_child("latency");
        char co[2*max(n.rows(),n.cols())+3];
+       char *buf = co; // clang does not allow references to flexible arrays in lambda expressions
        // The following for loop is slow and unnecessary, can be changed to improve runtime.
        // What is needed is all the channels with the current router as the source.
        for_each(n.channels(), [&](const channel & c) {
@@ -200,8 +201,8 @@ void xmlOutput::add_latency(const network_t& n, xml_node* tile, const vector<rou
                rate = ((double)num_phits)/n.p_best();
                // Analyze the latency
                xml_node destination = latency.append_child("destination");
-               print_coord(c.to,co,max(n.rows(),n.cols()));
-               destination.append_attribute("id") = co;
+               print_coord(c.to, buf, max(n.rows(),n.cols()));
+               destination.append_attribute("id") = buf;
                destination.append_attribute("slotwaittime") = slotswaittime;
                destination.append_attribute("channellatency") = channellatency;
                destination.append_attribute("rate") = rate;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.