# HG changeset patch # User Nina Engelhardt # Date 1346430243 -7200 # Node ID f83fff8bd4b2c0331e775c3df4ac8b44fac0a87c # Parent 1ffd5df22df98b75a8903e76f93871f5f2f3ca5a finished instrumentation diff -r 1ffd5df22df9 -r f83fff8bd4b2 Measurement/dependency.c --- a/Measurement/dependency.c Tue Aug 28 15:33:16 2012 +0200 +++ b/Measurement/dependency.c Fri Aug 31 18:24:03 2012 +0200 @@ -42,6 +42,12 @@ fprintf(dependency_file,"dataDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); } +void print_war_dependency_to_file(void* _dep){ + Dependency* dep = (Dependency*) _dep; + if(!dep) return; + fprintf(dependency_file,"warDep,%d,%d,%d,%d\n",dep->from_vp,dep->from_task,dep->to_vp,dep->to_task); +} + void print_singleton_dependency_to_file(void* _dep){ Dependency* dep = (Dependency*) _dep; if(!dep) return; diff -r 1ffd5df22df9 -r f83fff8bd4b2 Measurement/dependency.h --- a/Measurement/dependency.h Tue Aug 28 15:33:16 2012 +0200 +++ b/Measurement/dependency.h Fri Aug 31 18:24:03 2012 +0200 @@ -44,6 +44,8 @@ void print_data_dependency_to_file(void* _dep); +void print_war_dependency_to_file(void* _dep); + void print_singleton_dependency_to_file(void* _dep); void print_dyn_dependency_to_file(void* _dep); diff -r 1ffd5df22df9 -r f83fff8bd4b2 VSs.c --- a/VSs.c Tue Aug 28 15:33:16 2012 +0200 +++ b/VSs.c Fri Aug 31 18:24:03 2012 +0200 @@ -263,6 +263,7 @@ semanticEnv->dynDependenciesList = makeListOfArrays(sizeof(Dependency),128); semanticEnv->dataDependenciesList = makeListOfArrays(sizeof(Dependency),128); semanticEnv->singletonDependenciesList = makeListOfArrays(sizeof(Dependency),128); + semanticEnv->warDependenciesList = makeListOfArrays(sizeof(Dependency),128); semanticEnv->ntonGroupsInfo = makePrivDynArrayOfSize((void***)&(semanticEnv->ntonGroups),8); semanticEnv->hwArcs = makeListOfArrays(sizeof(Dependency),128); @@ -309,6 +310,7 @@ forAllInListOfArraysDo( semanticEnv->ctlDependenciesList, &print_ctl_dependency_to_file ); forAllInListOfArraysDo( semanticEnv->dataDependenciesList, &print_data_dependency_to_file ); forAllInListOfArraysDo( semanticEnv->singletonDependenciesList, &print_singleton_dependency_to_file ); + forAllInListOfArraysDo( semanticEnv->warDependenciesList, &print_war_dependency_to_file ); forAllInDynArrayDo(semanticEnv->ntonGroupsInfo,&print_nton_to_file); //fprintf(output,"}\n"); fflush(output); @@ -345,6 +347,7 @@ forAllInListOfArraysDo( semanticEnv->dataDependenciesList, &print_data_dependency_to_file ); forAllInListOfArraysDo( semanticEnv->singletonDependenciesList, &print_singleton_dependency_to_file ); forAllInListOfArraysDo( semanticEnv->dynDependenciesList, &print_dyn_dependency_to_file ); + forAllInListOfArraysDo( semanticEnv->warDependenciesList, &print_war_dependency_to_file ); forAllInListOfArraysDo( semanticEnv->hwArcs, &print_hw_dependency_to_file ); //fprintf(output,"}\n"); fflush(output); @@ -361,6 +364,9 @@ freeListOfArrays(semanticEnv->ctlDependenciesList); freeListOfArrays(semanticEnv->dynDependenciesList); freeListOfArrays(semanticEnv->dataDependenciesList); + freeListOfArrays(semanticEnv->warDependenciesList); + freeListOfArrays(semanticEnv->singletonDependenciesList); + freeListOfArrays(semanticEnv->hwArcs); #endif #ifdef HOLISTIC__TURN_ON_PERF_COUNTERS diff -r 1ffd5df22df9 -r f83fff8bd4b2 VSs.h --- a/VSs.h Tue Aug 28 15:33:16 2012 +0200 +++ b/VSs.h Fri Aug 31 18:24:03 2012 +0200 @@ -63,8 +63,8 @@ int32 numEnabledNonDoneReaders; PrivQueueStruc *waitersQ; #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC - int lastWriterVP; - int lastWriterTask; + Unit lastWriter; + ListOfArrays* readersSinceLastWriter; #endif } VSsPointerEntry; @@ -83,6 +83,9 @@ bool32 isWaitingForChildTasksToEnd; bool32 isWaitingForChildThreadsToEnd; bool32 isEnded; + #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC + Unit parentUnit; + #endif } VSsTaskStub; @@ -115,8 +118,9 @@ int32 hasBeenStarted; int32 hasFinished; PrivQueueStruc *waitQ; - int executingVp; - int executingTask; +#ifdef HOLISTIC__TURN_ON_OBSERVE_UCC + Unit executingUnit; +#endif } VSsSingleton; @@ -204,6 +208,7 @@ ListOfArrays* ctlDependenciesList; ListOfArrays* commDependenciesList; ListOfArrays* dataDependenciesList; + ListOfArrays* warDependenciesList; NtoN** ntonGroups; PrivDynArrayInfo* ntonGroupsInfo; ListOfArrays* dynDependenciesList; diff -r 1ffd5df22df9 -r f83fff8bd4b2 VSs_PluginFns.c --- a/VSs_PluginFns.c Tue Aug 28 15:33:16 2012 +0200 +++ b/VSs_PluginFns.c Fri Aug 31 18:24:03 2012 +0200 @@ -89,7 +89,14 @@ semData->taskStub = newTaskStub; newTaskStub->slaveAssignedTo = returnSlv; semData->needsTaskAssigned = FALSE; - +#ifdef HOLISTIC__TURN_ON_OBSERVE_UCC + Dependency newd; + newd.from_vp = newTaskStub->parentUnit.vp; + newd.from_task = newTaskStub->parentUnit.task; + newd.to_vp = returnSlv->slaveID; + newd.to_task = returnSlv->assignCount+1; + addToListOfArrays(Dependency, newd, semEnv->commDependenciesList); +#endif //have work, so reset Done flag, if was set if (semEnv->coreIsDone[coreNum] == TRUE) //reads are higher perf semEnv->coreIsDone[coreNum] = FALSE; //don't just write always diff -r 1ffd5df22df9 -r f83fff8bd4b2 VSs_Request_Handlers.c --- a/VSs_Request_Handlers.c Tue Aug 28 15:33:16 2012 +0200 +++ b/VSs_Request_Handlers.c Fri Aug 31 18:24:03 2012 +0200 @@ -72,8 +72,9 @@ newEntry->numEnabledNonDoneReaders = 0; newEntry->waitersQ = makePrivQ(); #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC - newEntry->lastWriterVP = 0; - newEntry->lastWriterTask = 0; + newEntry->lastWriter.vp = 0; + newEntry->lastWriter.task = 0; + newEntry->readersSinceLastWriter = makeListOfArrays(sizeof(Unit),128); #endif return newEntry; } @@ -253,6 +254,10 @@ parentSemData = (VSsSemData*) semReq->callingSlv->semanticData; taskStub->parentTaskStub = (void*) parentSemData->taskStub; parentSemData->taskStub->numLiveChildTasks += 1; +#ifdef HOLISTIC__TURN_ON_OBSERVE_UCC + taskStub->parentUnit.vp = semReq->callingSlv->slaveID; + taskStub->parentUnit.task = semReq->callingSlv->assignCount; +#endif //DEBUG__printf3(dbgRqstHdlr,"Submit req from slaveID: %d, from task: %d, for task: %d", semReq->callingSlv->slaveID, parentSemData->taskStub->taskID[1], taskStub->taskID[1]) if(semReq->taskID) { DEBUG__printf2(dbgRqstHdlr,"Submit req from slaveID: %d, for task: %d", semReq->callingSlv->slaveID, taskStub->taskID[1]) } @@ -380,7 +385,7 @@ endingTaskType = endingTaskStub->taskType; ptrEntries = endingTaskStub->ptrEntries; //saved in stub when create - if(semReq->taskID) { DEBUG__printf2(dbgRqstHdlr,"EndTask req from slaveID: %d, task: %d",semReq->callingSlv->slaveID, endingTaskStub->taskID[1]) } + if(endingTaskStub->taskID) { DEBUG__printf2(dbgRqstHdlr,"EndTask req from slaveID: %d, task: %d",semReq->callingSlv->slaveID, endingTaskStub->taskID[1]) } else {DEBUG__printf1(dbgRqstHdlr,"EndTask req from slaveID: %d",semReq->callingSlv->slaveID)} //Check if parent was waiting on this task @@ -437,10 +442,14 @@ * the hash-entry. */ ptrEntry->numEnabledNonDoneReaders -= 1; #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC - if (ptrEntry->lastWriterVP) { + Unit u; + u.vp = semReq->callingSlv->slaveID; + u.task=semReq->callingSlv->assignCount; + addToListOfArrays(Unit,u,ptrEntry->readersSinceLastWriter); + if (ptrEntry->lastWriter.vp) { Dependency newd; - newd.from_vp = ptrEntry->lastWriterVP; - newd.from_task = ptrEntry->lastWriterTask; + newd.from_vp = ptrEntry->lastWriter.vp; + newd.from_task = ptrEntry->lastWriter.task; newd.to_vp = semReq->callingSlv->slaveID; newd.to_task = semReq->callingSlv->assignCount; addToListOfArrays(Dependency, newd, semEnv->dataDependenciesList); @@ -471,9 +480,37 @@ } } else /*the ending task is a writer of this arg*/ { /*clear the enabled non-finished writer flag of the hash-entry.*/ ptrEntry->hasEnabledNonFinishedWriter = FALSE; - #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC - ptrEntry->lastWriterVP = semReq->callingSlv->slaveID; - ptrEntry->lastWriterTask = semReq->callingSlv->assignCount; +#ifdef HOLISTIC__TURN_ON_OBSERVE_UCC + { + int n,i; + int num_full = ptrEntry->readersSinceLastWriter->next_free_index / ptrEntry->readersSinceLastWriter->num_entries_per_fragment; //!\\ != list->dim1info->numInArray-1 + for (n = 0; n < num_full; n++) { + Unit* fragment = (ptrEntry->readersSinceLastWriter->dim1)[n]; + for (i=0; ireadersSinceLastWriter->num_entries_per_fragment;++i) { + Dependency newd; + newd.from_vp = fragment[i].vp; + newd.from_task = fragment[i].task; + newd.to_vp = semReq->callingSlv->slaveID; + newd.to_task = semReq->callingSlv->assignCount; + addToListOfArrays(Dependency, newd, semEnv->warDependenciesList); + } + } + int offset_in_last = ptrEntry->readersSinceLastWriter->next_free_index % ptrEntry->readersSinceLastWriter->num_entries_per_fragment; + if (n < ptrEntry->readersSinceLastWriter->dim1info->numInArray) { + Unit* fragment = (ptrEntry->readersSinceLastWriter->dim1)[n]; + for (i=0; i < offset_in_last;++i) { + Dependency newd; + newd.from_vp = fragment[i].vp; + newd.from_task = fragment[i].task; + newd.to_vp = semReq->callingSlv->slaveID; + newd.to_task = semReq->callingSlv->assignCount; + addToListOfArrays(Dependency, newd, semEnv->warDependenciesList); + } + } + } + clearListOfArrays(ptrEntry->readersSinceLastWriter); + ptrEntry->lastWriter.vp = semReq->callingSlv->slaveID; + ptrEntry->lastWriter.task = semReq->callingSlv->assignCount; #endif /*Take the next waiter from the hash-entry's Q.*/ @@ -1003,8 +1040,8 @@ reqstingSlv->dataRetFromReq = singleton->endInstrAddr; #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC Dependency newd; - newd.from_vp = singleton->executingVp; - newd.from_task = singleton->executingTask; + newd.from_vp = singleton->executingUnit.vp; + newd.from_task = singleton->executingUnit.task; newd.to_vp = reqstingSlv->slaveID; newd.to_task = reqstingSlv->assignCount + 1; addToListOfArrays(Dependency, newd, semEnv->singletonDependenciesList); @@ -1063,8 +1100,10 @@ } singleton->hasFinished = TRUE; - singleton->executingVp = requestingSlv->slaveID; - singleton->executingTask = requestingSlv->assignCount; +#ifdef HOLISTIC__TURN_ON_OBSERVE_UCC + singleton->executingUnit.vp = requestingSlv->slaveID; + singleton->executingUnit.task = requestingSlv->assignCount; +#endif waitQ = singleton->waitQ; numWaiting = numInPrivQ(waitQ); for (i = 0; i < numWaiting; i++) { //they will resume inside start singleton, then jmp to end singleton @@ -1072,8 +1111,8 @@ resumingSlv->dataRetFromReq = singleton->endInstrAddr; #ifdef HOLISTIC__TURN_ON_OBSERVE_UCC Dependency newd; - newd.from_vp = singleton->executingVp; - newd.from_task = singleton->executingTask; + newd.from_vp = singleton->executingUnit.vp; + newd.from_task = singleton->executingUnit.task; newd.to_vp = resumingSlv->slaveID; newd.to_task = resumingSlv->assignCount + 1; addToListOfArrays(Dependency, newd, semEnv->singletonDependenciesList);