state.RAW=true;
else if (option.equals("-scheduling"))
state.SCHEDULING=true;
+ else if (option.equals("-useprofile"))
+ state.USEPROFILE=true;
else if (option.equals("-thread"))
state.THREAD=true;
else if (option.equals("-dsm"))
//System.out.println ("Test output via 'SimulatorResult.out'.");
//origOut.println ("Test output via 'origOut' reference.");
- // for test
- // Randomly set the newRate and probability of FEdges
- java.util.Random r=new java.util.Random();
- int tint = 0;
- for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator(); it_classes.hasNext();) {
- ClassDescriptor cd=(ClassDescriptor) it_classes.next();
- if(cd.hasFlags()) {
- Vector rootnodes=ta.getRootNodes(cd);
- if(rootnodes!=null)
- for(Iterator it_rootnodes=rootnodes.iterator(); it_rootnodes.hasNext();) {
- FlagState root=(FlagState)it_rootnodes.next();
- Vector allocatingTasks = root.getAllocatingTasks();
- if(allocatingTasks != null) {
- for(int k = 0; k < allocatingTasks.size(); k++) {
- TaskDescriptor td = (TaskDescriptor)allocatingTasks.elementAt(k);
- Vector<FEdge> fev = (Vector<FEdge>)ta.getFEdgesFromTD(td);
- int numEdges = fev.size();
- int total = 100;
- for(int j = 0; j < numEdges; j++) {
- FEdge pfe = fev.elementAt(j);
- if(numEdges - j == 1) {
- pfe.setProbability(total);
- } else {
- if((total != 0) && (total != 1)) {
- do {
- tint = r.nextInt()%total;
- } while(tint <= 0);
+ if(state.USEPROFILE) {
+ // read in profile data and set
+ FileInputStream inStream = new FileInputStream("/scratch/profile.rst");
+ byte[] b = new byte[1024 * 100];
+ int length = inStream.read(b);
+ if(length < 0) {
+ System.out.print("No content in input file: /scratch/profile.rst\n");
+ System.exit(-1);
+ }
+ String profiledata = new String(b, 0, length);
+ java.util.Hashtable<String, Integer> taskinfo = new java.util.Hashtable<String, Integer>();
+
+ int inindex = profiledata.indexOf('\n');
+ while((inindex != -1) ) {
+ String inline = profiledata.substring(0, inindex);
+ profiledata = profiledata.substring(inindex + 1);
+ //System.printString(inline + "\n");
+ int tmpinindex = inline.indexOf(',');
+ if(tmpinindex == -1) {
+ break;
+ }
+ String inname = inline.substring(0, tmpinindex);
+ String inint = inline.substring(tmpinindex + 1);
+ while(inint.startsWith(" ")) {
+ inint = inint.substring(1);
+ }
+ int duration = Integer.parseInt(inint);
+ taskinfo.put(inname, duration);
+ inindex = profiledata.indexOf('\n');
+ }
+
+ java.util.Random r=new java.util.Random();
+ int tint = 0;
+ for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator(); it_classes.hasNext();) {
+ ClassDescriptor cd=(ClassDescriptor) it_classes.next();
+ if(cd.hasFlags()) {
+ Vector rootnodes=ta.getRootNodes(cd);
+ if(rootnodes!=null) {
+ for(Iterator it_rootnodes=rootnodes.iterator(); it_rootnodes.hasNext();) {
+ FlagState root=(FlagState)it_rootnodes.next();
+ Vector allocatingTasks = root.getAllocatingTasks();
+ if(allocatingTasks != null) {
+ for(int k = 0; k < allocatingTasks.size(); k++) {
+ TaskDescriptor td = (TaskDescriptor)allocatingTasks.elementAt(k);
+ Vector<FEdge> fev = (Vector<FEdge>)ta.getFEdgesFromTD(td);
+ int numEdges = fev.size();
+ int total = 100;
+ for(int j = 0; j < numEdges; j++) {
+ FEdge pfe = fev.elementAt(j);
+ if(numEdges - j == 1) {
+ pfe.setProbability(total);
+ } else {
+ if((total != 0) && (total != 1)) {
+ do {
+ tint = r.nextInt()%total;
+ } while(tint <= 0);
+ }
+ pfe.setProbability(tint);
+ total -= tint;
+ }
+ //do {
+ // tint = r.nextInt()%10;
+ // } while(tint <= 0);
+ //int newRate = tint;
+ //int newRate = (j+1)%2+1;
+ int newRate = 1;
+ String cdname = cd.getSymbol();
+ if((cdname.equals("SeriesRunner")) ||
+ (cdname.equals("MDRunner")) ||
+ (cdname.equals("Stage")) ||
+ (cdname.equals("AppDemoRunner")) ||
+ (cdname.equals("FilterBankAtom"))) {
+ newRate = 16;
+ } else if(cdname.equals("SentenceParser")) {
+ newRate = 4;
+ }
+ //do {
+ // tint = r.nextInt()%100;
+ // } while(tint <= 0);
+ // int probability = tint;
+ int probability = 100;
+ pfe.addNewObjInfo(cd, newRate, probability);
+ }
+ }
+ }
+ }
+ }
+ Iterator it_flags = ta.getFlagStates(cd).iterator();
+ while(it_flags.hasNext()) {
+ FlagState fs = (FlagState)it_flags.next();
+ Iterator it_edges = fs.edges();
+ int total = 100;
+ while(it_edges.hasNext()) {
+ //do {
+ // tint = r.nextInt()%10;
+ // } while(tint <= 0);
+ FEdge edge = (FEdge)it_edges.next();
+ tint = taskinfo.get(edge.getTask().getSymbol()).intValue();
+ edge.setExeTime(tint);
+ if(!it_edges.hasNext()) {
+ edge.setProbability(total);
+ } else {
+ if((total != 0) && (total != 1)) {
+ do {
+ tint = r.nextInt()%total;
+ } while(tint <= 0);
+ }
+ edge.setProbability(tint);
+ total -= tint;
+ }
+ }
+ }
+ }
+ }
+ } else {
+ // for test
+ // Randomly set the newRate and probability of FEdges
+ java.util.Random r=new java.util.Random();
+ int tint = 0;
+ for(Iterator it_classes=state.getClassSymbolTable().getDescriptorsIterator(); it_classes.hasNext();) {
+ ClassDescriptor cd=(ClassDescriptor) it_classes.next();
+ if(cd.hasFlags()) {
+ Vector rootnodes=ta.getRootNodes(cd);
+ if(rootnodes!=null) {
+ for(Iterator it_rootnodes=rootnodes.iterator(); it_rootnodes.hasNext();) {
+ FlagState root=(FlagState)it_rootnodes.next();
+ Vector allocatingTasks = root.getAllocatingTasks();
+ if(allocatingTasks != null) {
+ for(int k = 0; k < allocatingTasks.size(); k++) {
+ TaskDescriptor td = (TaskDescriptor)allocatingTasks.elementAt(k);
+ Vector<FEdge> fev = (Vector<FEdge>)ta.getFEdgesFromTD(td);
+ int numEdges = fev.size();
+ int total = 100;
+ for(int j = 0; j < numEdges; j++) {
+ FEdge pfe = fev.elementAt(j);
+ if(numEdges - j == 1) {
+ pfe.setProbability(total);
+ } else {
+ if((total != 0) && (total != 1)) {
+ do {
+ tint = r.nextInt()%total;
+ } while(tint <= 0);
+ }
+ pfe.setProbability(tint);
+ total -= tint;
+ }
+ //do {
+ // tint = r.nextInt()%10;
+ // } while(tint <= 0);
+ //int newRate = tint;
+ //int newRate = (j+1)%2+1;
+ int newRate = 1;
+ String cdname = cd.getSymbol();
+ if((cdname.equals("SeriesRunner")) ||
+ (cdname.equals("MDRunner")) ||
+ (cdname.equals("Stage")) ||
+ (cdname.equals("AppDemoRunner")) ||
+ (cdname.equals("FilterBankAtom"))) {
+ newRate = 16;
+ } else if(cdname.equals("SentenceParser")) {
+ newRate = 4;
+ }
+ //do {
+ // tint = r.nextInt()%100;
+ // } while(tint <= 0);
+ // int probability = tint;
+ int probability = 100;
+ pfe.addNewObjInfo(cd, newRate, probability);
+ }
+ }
+ }
+ }
+ }
+
+ Iterator it_flags = ta.getFlagStates(cd).iterator();
+ while(it_flags.hasNext()) {
+ FlagState fs = (FlagState)it_flags.next();
+ Iterator it_edges = fs.edges();
+ int total = 100;
+ while(it_edges.hasNext()) {
+ //do {
+ // tint = r.nextInt()%10;
+ // } while(tint <= 0);
+ tint = 3;
+ FEdge edge = (FEdge)it_edges.next();
+ edge.setExeTime(tint);
+ if(!it_edges.hasNext()) {
+ edge.setProbability(total);
+ } else {
+ if((total != 0) && (total != 1)) {
+ do {
+ tint = r.nextInt()%total;
+ } while(tint <= 0);
+ }
+ edge.setProbability(tint);
+ total -= tint;
+ }
}
- pfe.setProbability(tint);
- total -= tint;
- }
- /*do {
- tint = r.nextInt()%10;
- } while(tint <= 0);*/
- //int newRate = tint;
- //int newRate = (j+1)%2+1;
- int newRate = 1;
- String cdname = cd.getSymbol();
- if((cdname.equals("SeriesRunner")) ||
- (cdname.equals("MDRunner")) ||
- (cdname.equals("Stage")) ||
- (cdname.equals("AppDemoRunner")) ||
- (cdname.equals("FilterBankAtom"))) {
- newRate = 16;
- } else if(cdname.equals("SentenceParser")) {
- newRate = 4;
- }
- /*do {
- tint = r.nextInt()%100;
- } while(tint <= 0);
- int probability = tint;*/
- int probability = 100;
- pfe.addNewObjInfo(cd, newRate, probability);
}
- }
}
- }
-
- Iterator it_flags = ta.getFlagStates(cd).iterator();
- while(it_flags.hasNext()) {
- FlagState fs = (FlagState)it_flags.next();
- Iterator it_edges = fs.edges();
- while(it_edges.hasNext()) {
- /*do {
- tint = r.nextInt()%10;
- } while(tint <= 0);*/
- tint = 3;
- ((FEdge)it_edges.next()).setExeTime(tint);
- }
}
- }
}
// generate multiple schedulings
#endif
#ifdef RAW
#ifdef RAWPROFILE
+#ifdef RAWUSEIO
#include "stdio.h"
#include "string.h"
#endif
+#endif
#include <raw.h>
#include <raw_compiler_defs.h>
#elif defined THREADSIMULATE
// profiling mode of RAW version
#ifdef RAWPROFILE
-//#include "stdio.h"
-//#include "string.h"
#define TASKINFOLENGTH 150
-#define INTERRUPTINFOLENGTH 500
+//#define INTERRUPTINFOLENGTH 500
bool stall;
-bool isInterrupt;
+//bool isInterrupt;
int totalexetime;
typedef struct task_info {
int endTime;
} TaskInfo;
-typedef struct interrupt_info {
+/*typedef struct interrupt_info {
int startTime;
int endTime;
-} InterruptInfo;
+} InterruptInfo;*/
TaskInfo * taskInfoArray[TASKINFOLENGTH];
int taskInfoIndex;
bool taskInfoOverflow;
-InterruptInfo * interruptInfoArray[INTERRUPTINFOLENGTH];
+/*InterruptInfo * interruptInfoArray[INTERRUPTINFOLENGTH];
int interruptInfoIndex;
-bool interruptInfoOverflow;
+bool interruptInfoOverflow;*/
int profilestatus[NUMCORES]; // records status of each core
// 1: running tasks
// 0: stall
#endif
#ifdef RAW
-#ifdef RAWPROFILE
+//#ifdef RAWPROFILE
+#ifdef RAWUSEIO
int main(void) {
#else
void begin() {
#ifdef RAWPROFILE
stall = false;
- isInterrupt = true;
+ //isInterrupt = true;
totalexetime = -1;
taskInfoIndex = 0;
- interruptInfoIndex = 0;
+ /*interruptInfoIndex = 0;
taskInfoOverflow = false;
- interruptInfoOverflow = false;
+ interruptInfoOverflow = false;*/
#endif
#ifdef INTERRUPT
if (corenum < NUMCORES) {
// set up interrupts
setup_ints();
- //setup_interrupts();
- //start_gdn_avail_ints(recvMsg);
raw_user_interrupts_on();
#ifdef RAWDEBUG
raw_test_pass(0xee04);
}
#endif*/
#ifdef RAWPROFILE
- isInterrupt = false;
+ //isInterrupt = false;
#endif
while(true) {
receiveObject();
raw_user_interrupts_off();
#endif
#ifdef RAWPROFILE
- isInterrupt = false;
+ //isInterrupt = false;
#endif
#ifdef RAWDEBUG
raw_test_pass(0xeee1);
removeItem(&objqueue, objitem);
addNewItem_I(&objqueue, objInfo);
#ifdef RAWPROFILE
- isInterrupt = true;
+ //isInterrupt = true;
#endif
#ifdef INTERRUPT
raw_user_interrupts_on();
#ifdef RAWDEBUG
raw_test_pass(0xee11);
#endif
-#ifdef RAWPROFILE
+//#ifdef RAWPROFILE
+#ifdef RAWUSEIO
totalexetime = raw_get_cycle();
#else
raw_test_pass(0xbbbbbbbb);
// output the profiling data
void outputProfileData() {
+#ifdef RAWUSEIO
FILE * fp;
char fn[50];
int self_y, self_x;
fprintf(fp, "\nAverage task execution time: %d\n", averagetasktime);
fclose(fp);
-
- /*
+#else
int i = 0;
int j = 0;
}
// output interrupt related info
- for(i = 0; i < interruptInfoIndex; i++) {
+ /*for(i = 0; i < interruptInfoIndex; i++) {
InterruptInfo* tmpIInfo = interruptInfoArray[i];
raw_test_pass(0xddde);
raw_test_pass_reg(tmpIInfo->startTime);
if(interruptInfoOverflow) {
raw_test_pass(0xefef);
- }
+ }*/
raw_test_pass(0xeeee);
- */
+#endif
}
#endif
return -1;
}
#ifdef RAWPROFILE
- if(isInterrupt && (!interruptInfoOverflow)) {
+ /*if(isInterrupt && (!interruptInfoOverflow)) {
// raw_test_pass(0xffff);
interruptInfoArray[interruptInfoIndex] = RUNMALLOC_I(sizeof(struct interrupt_info));
interruptInfoArray[interruptInfoIndex]->startTime = raw_get_cycle();
interruptInfoArray[interruptInfoIndex]->endTime = -1;
- }
+ }*/
#endif
msg:
#ifdef RAWDEBUG
goto msg;
}
#ifdef RAWPROFILE
- if(isInterrupt && (!interruptInfoOverflow)) {
+/* if(isInterrupt && (!interruptInfoOverflow)) {
interruptInfoArray[interruptInfoIndex]->endTime = raw_get_cycle();
interruptInfoIndex++;
if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
interruptInfoOverflow = true;
}
- }
+ }*/
#endif
return type;
} else {
raw_test_pass(0xe889);
#endif
#ifdef RAWPROFILE
- if(isInterrupt && (!interruptInfoOverflow)) {
+/* if(isInterrupt && (!interruptInfoOverflow)) {
interruptInfoArray[interruptInfoIndex]->endTime = raw_get_cycle();
interruptInfoIndex++;
if(interruptInfoIndex == INTERRUPTINFOLENGTH) {
interruptInfoOverflow = true;
}
- }
+ }*/
#endif
return -2;
}
raw_user_interrupts_off();
#endif
#ifdef RAWPROFILE
- isInterrupt = false;
+ //isInterrupt = false;
#endif
while(!lockflag) {
receiveObject();
reside = false;
#endif
#ifdef RAWPROFILE
- isInterrupt = true;
+ //isInterrupt = true;
#endif
#ifdef INTERRUPT
raw_user_interrupts_on();