Joining until state converges. Added Eval Again.

This commit is contained in:
Nils Hölscher 2022-05-03 14:04:21 +02:00
parent 5e6e0e6c90
commit 693ee07008
6 changed files with 126 additions and 106 deletions

1
.gitignore vendored
View File

@ -7,5 +7,6 @@ build/
.gnupg
.bash_history
.cache/
*.solution
compile_commands.json
llvm/

View File

@ -232,6 +232,7 @@ struct CacheAnalysisPass : PassInfoMixin<CacheAnalysisPass> {
if(LoopUnrolling)
AC.unrollLoops();
AC.fillAbstractCache(EntryAddress);
//AC.fillPath(EntryAddress);
if (DumpNodes)
AC.dumpNodes();
if (PrintEdgesPost)
@ -239,7 +240,7 @@ struct CacheAnalysisPass : PassInfoMixin<CacheAnalysisPass> {
if (DumpToDot)
AC.dumpDotFile();
outs() << "MustHits: " << AC.collectHits() << "\n";
outs() << "MayMisses: " << AC.collectMisses() << "\n";
//outs() << "MayMisses: " << AC.collectMisses() << "\n";
return PreservedAnalyses::all();
}
};

View File

@ -111,38 +111,29 @@ case $1 in
docker run -i -d -v "$(pwd)"/.:/root:rw --name RTSAlab01 rtsalab01cacheanalysis
;;
evaluation | eval)
echo "Currently not available!"
echo "But please continue to implement the must join,"
echo "to the best of your abilities and check for updates!"
run "fft1"
echo "==== Correct fft1 ===="
echo "MustHits: 16"
echo "MayMisses: 280"
echo "MustHits: 21"
echo
run "cnt"
echo "==== Correct cnt ===="
echo "MustHits: x"
echo "MayMisses: xx"
echo
run "crc"
echo "==== Correct crc ===="
echo "MustHits: x"
echo "MayMisses: xx"
echo "MustHits: 4"
echo
run "duff"
echo "==== Correct duff ===="
echo "MustHits: x"
echo "MayMisses: xx"
echo "MustHits: 3"
echo
run "insertsort"
echo "==== Correct insertsort ===="
echo "MustHits: x"
echo "MayMisses: xx"
echo "MustHits: 2"
echo
run "matmult"
echo "==== Correct matmult ===="
echo "MustHits: x"
echo "MayMisses: x"
echo "MustHits: 9"
echo
run "crc"
echo "==== Correct crc ===="
echo "MustHits: 6"
echo
;;
a | all)

View File

@ -47,9 +47,9 @@ public: // everything is public, because IDGAF
/**
* @brief Add an Edge to the AbstractStateGraph
*
* @param Pre
* @param Suc
*
* @param Pre
* @param Suc
*/
void removeEdge(unsigned int Pre, unsigned int Suc) {
Edges[Pre].remove(Suc);
@ -59,9 +59,9 @@ public: // everything is public, because IDGAF
/**
* @brief Add an Empty node @NodeAddr
*
* @param NodeAddr
* @return unsigned int
*
* @param NodeAddr
* @return unsigned int
*/
unsigned int addEmptyNode(unsigned int NodeAddr) {
int I = Nodes.size();
@ -71,11 +71,11 @@ public: // everything is public, because IDGAF
/**
* @brief Returns True if a path From -> To exists.
*
* @param From
* @param To
* @return true
* @return false
*
* @param From
* @param To
* @return true
* @return false
*/
bool findPath(unsigned int From, unsigned int To) {
std::map<unsigned int, bool> Visited;
@ -97,9 +97,9 @@ public: // everything is public, because IDGAF
/**
* @brief Removes all Nested loops from the handed LoopBody
*
* @param LoopBodyIn
* @param OrigNodeToUnrolledNode
*
* @param LoopBodyIn
* @param OrigNodeToUnrolledNode
*/
void removeNestedLoops(
std::list<unsigned int> LoopBodyIn,
@ -338,11 +338,16 @@ public: // everything is public, because IDGAF
Nodes[NodeNr].Computed = true;
for (unsigned int SuccNr : Nodes[NodeNr].Successors) {
Nodes[SuccNr];
// first Run
if (Nodes[SuccNr].Computed) {
// Join don't call
// TODO fix Join
Nodes[SuccNr].mustJoin(Nodes[NodeNr]); // maybe fill
Nodes[SuccNr].mustJoin(AbstractState(NodeNr));
AbstractState Before(Nodes[SuccNr]);
Nodes[SuccNr].mustJoin(AbstractState(NodeNr, Address(NodeNr)));
// Continue Joining until State converges
if (!(Before == Nodes[SuccNr])) {
fillAbstractCache(NodeNr);
}
} else {
// Update and fill Succ
Nodes[SuccNr].fill(Nodes[NodeNr], NodeNr);
@ -354,8 +359,8 @@ public: // everything is public, because IDGAF
/**
* @brief Return number of measured Hits
*
* @return unsigned int
*
* @return unsigned int
*/
unsigned int collectHits() {
unsigned int Hits = 0;
@ -371,8 +376,8 @@ public: // everything is public, because IDGAF
/**
* @brief Return number of measured Misses
*
* @return unsigned int
*
* @return unsigned int
*/
unsigned int collectMisses() {
unsigned int Misses = 0;
@ -388,7 +393,7 @@ public: // everything is public, because IDGAF
/**
* @brief Prints all Edges to Console
*
*
*/
void dumpEdges() {
llvm::outs() << "Dumping Edges:\n";
@ -409,7 +414,7 @@ public: // everything is public, because IDGAF
/**
* @brief Dumps the Graph to a out.dot file
*
*
*/
void dumpDotFile() {
bool PrintOld = true;
@ -437,7 +442,7 @@ public: // everything is public, because IDGAF
/**
* @brief Prints all nodes to Console
*
*
*/
void dumpNodes() {
for (auto const &E : Edges) {

View File

@ -1,6 +1,7 @@
#ifndef ABSSTATE_H
#define ABSSTATE_H
#include <algorithm>
#include <cassert>
#include <cstddef>
#include <cstdlib>
@ -71,6 +72,21 @@ public: // everything is public, because IDGAF
}
}
AbstractState(AbstractState const &Copy, Address Update) {
Addr = Copy.Addr;
Unrolled = Copy.Unrolled;
for (auto S : Copy.Sets) {
unsigned int SetNr = S.first;
for (auto E : S.second.Associativity) {
unsigned int Age = E.first;
for (auto B : E.second.Blocks) {
Sets[SetNr].Associativity[Age].Blocks.push_back(B);
}
}
}
this->update(Update);
}
AbstractState() {}
AbstractState(unsigned int AddressIn) {
@ -89,6 +105,30 @@ public: // everything is public, because IDGAF
void setUnrolled(unsigned int In) { Unrolled = In; }
bool operator==(AbstractState In) {
for (int Index; Index < 16; Index++) {
for (int Age; Age < 4; Age++) {
for (auto E1 : Sets[Index].Associativity[Age].Blocks) {
// find E1 in In States Set and Age.
if (std::find(In.Sets[Index].Associativity[Age].Blocks.begin(),
In.Sets[Index].Associativity[Age].Blocks.end(),
E1) == In.Sets[Index].Associativity[Age].Blocks.end()) {
return false;
}
}
for (auto E2 : In.Sets[Index].Associativity[Age].Blocks) {
// find E2 in This Set and Age.
if (std::find(Sets[Index].Associativity[Age].Blocks.begin(),
Sets[Index].Associativity[Age].Blocks.end(),
E2) == Sets[Index].Associativity[Age].Blocks.end()) {
return false;
}
}
}
}
return true;
}
/**
* @brief Executes an Must LRU Join on the AbstractCacheState
*
@ -127,31 +167,32 @@ public: // everything is public, because IDGAF
// This loopages all entries by one. 3 <-2, 2<-1, 1<-0
for (int I = 3; I > 0; I--) {
Sets[Addr.Index].Associativity[I] = Sets[Addr.Index].Associativity[I - 1];
Sets[Addr.Index].Associativity[I].Blocks.remove(Addr.Tag);
}
// entry at age 0 is updated with current address.
Sets[Addr.Index].Associativity[0].Blocks = {Addr.Tag};
}
/**
* @brief Updates the AbstractState with given AbstractState
*
* @param UpdateState, State that gets merged into State with Age+1.
*/
void update(AbstractState UpdateState) {
for (auto S : UpdateState.Sets) {
unsigned int Index = S.first;
for (auto E : S.second.Associativity) {
unsigned int Age = E.first;
// If updated age is greater 4 The Tag is no longer in Cache.
// Due to associativity of 4 per set.
if (Age >= 4)
break;
for (auto B : E.second.Blocks) {
Sets[Index].Associativity[Age].Blocks.push_back(B);
}
}
}
}
// /**
// * @brief Updates the AbstractState with given AbstractState
// *
// * @param UpdateState, State that gets merged into State with Age+1.
// */
// void update(AbstractState UpdateState) {
// for (auto S : UpdateState.Sets) {
// unsigned int Index = S.first;
// for (auto E : S.second.Associativity) {
// unsigned int Age = E.first;
// // If updated age is greater 4 The Tag is no longer in Cache.
// // Due to associativity of 4 per set.
// if (Age >= 4)
// break;
// for (auto B : E.second.Blocks) {
// Sets[Index].Associativity[Age].Blocks.push_back(B);
// }
// }
// }
// }
/**
* @brief Fills the AbstractState PreState and updates with PreAddress.

View File

@ -145,49 +145,30 @@ case $1 in
docker run -i -d -v "$(pwd)"/.:/root:rw --name RTSAlab01 rtsalab01cacheanalysis
;;
evaluation | eval)
echo "Currently not available!"
echo "But please continue to implement the must join,"
echo "to the best of your abilities and check for updates!"
# run "fft1"
# echo "==== Correct fft1 ===="
# echo "MustHits: 16"
# echo "MayMisses: 280"
# echo
# run "bsort100"
# echo "==== Correct bsort100 ===="
# echo "MustHits: 1"
# echo "MayMisses: 41"
# echo
# run "lms"
# echo "==== Correct lms ===="
# echo "MustHits: 5"
# echo "MayMisses: 288"
# echo
# run "minver"
# echo "==== Correct minver ===="
# echo "MustHits: 6"
# echo "MayMisses: 224"
# echo
# run "qsort-exam"
# echo "==== Correct qsort-exam ===="
# echo "MustHits: 2"
# echo "MayMisses: 152"
# echo
# run "recursion"
# echo "==== Correct recursion ===="
# echo "MustHits: 8"
# echo "MayMisses: 8"
# echo
# run "select"
# echo "==== Correct select ===="
# echo "MustHits: 4"
# echo "MayMisses: 108"
# echo
# run "whet"
# echo "==== Correct whet ===="
# echo "MustHits: 5"
# echo "MayMisses: 265"
# echo
run "fft1"
echo "==== Correct fft1 ===="
echo "MustHits: 21"
echo
run "cnt"
echo "==== Correct cnt ===="
echo "MustHits: 4"
echo
run "duff"
echo "==== Correct duff ===="
echo "MustHits: 3"
echo
run "insertsort"
echo "==== Correct insertsort ===="
echo "MustHits: 2"
echo
run "matmult"
echo "==== Correct matmult ===="
echo "MustHits: 9"
echo
run "crc"
echo "==== Correct crc ===="
echo "MustHits: 6"
echo
;;
a | all)
clean