In: Electrical Engineering
this is cahce memory related c program....and not working or running properly???????
#include <iostream> |
#include <string> |
#include <vector> |
#include <iomanip> |
#include <cmath> |
#include <cstdlib> |
#include <ctime> |
using namespace std; |
int cash_type, block_size, cash_size,number_of_blocks=0;; |
int compulsry_misses=0, capcity_misses=0, conflict_misses=0; |
#define DRAM_SIZE (64*1024*1024) |
unsigned int m_w = 0xABABAB55; /* must not be zero, nor 0x464fffff */ |
unsigned int m_z = 0x05080902; /* must not be zero, nor 0x9068ffff */ |
unsigned int rand_() |
{ |
m_z = 36969 * (m_z & 65535) + (m_z >> 16); |
m_w = 18000 * (m_w & 65535) + (m_w >> 16); |
return (m_z << 16) + m_w; /* 32-bit result */ |
} |
unsigned int memGen1() |
{ |
static unsigned int addr=0; |
return (addr++)%(DRAM_SIZE); |
} |
unsigned int memGen2() |
{ |
static unsigned int addr=0; |
return rand_()%(128*1024); |
} |
unsigned int memGen3() |
{ |
return rand_()%(DRAM_SIZE); |
} |
unsigned int memGen4() |
{ |
static unsigned int addr=0; |
return (addr++)%(1024); |
} |
unsigned int memGen5() |
{ |
static unsigned int addr=0; |
return (addr++)%(1024*64); |
} |
unsigned int memGen6() |
{ |
static unsigned int addr=0; |
return (addr+=256)%(DRAM_SIZE); |
} |
// Cache Simulator |
bool cacheSim(unsigned int addr, int cash[3][100000], int type, int &block_counter, int index_addr, int tag_addr) |
{ |
int shift_offset=log2(block_size); |
bool detected=false; |
bool misses_flag=true; |
if (cash_type==0) // Direct Mapped ****************************************** |
{ |
if (cash[0][index_addr]==tag_addr) |
{ |
return true; |
} |
else |
{ |
cash[0][index_addr]= tag_addr; |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[1][i]!=1) |
{ misses_flag=false; |
i=number_of_blocks;} |
} |
//calculating misses |
if (misses_flag) |
capcity_misses++; // capcity miss because the cash is full |
else |
{ |
if(cash[1][index_addr]==1) |
conflict_misses++; |
else |
{ |
compulsry_misses++; |
} |
} |
cash[1][index_addr]= 1; |
return 0; |
} |
} // end of directed mapped |
/////////////////////////////////////////////////////////////////// |
else if (cash_type==1) // set asscoiative ************************************* |
{ |
index_addr=index_addr * type; |
for (int i=0; i < type ; i++) |
{ |
if (cash[0][index_addr+i]==tag_addr) |
{ |
// cout <<"0x hitttttttt" << setfill('0') << setw(8) << hex << tag_addr << endl; |
return 1; |
} |
} |
for (int j=0; j < type; j++) |
{ |
if (cash[1][index_addr+j] == -1) |
{ |
compulsry_misses++; |
cash[0][index_addr+j]=tag_addr; |
cash[1][index_addr+j]=1; |
return 0; |
} |
} |
srand(time(NULL)); |
int x=rand()%(type); |
cash[0][index_addr+x]=tag_addr; |
cash[1][index_addr+x]=1; |
capcity_misses++; |
return 0; |
}//end of set assciative |
else if (cash_type==2) // fully associative ************************************** |
{ |
if (type==0) // LRU ///////// |
{ |
if (block_counter < number_of_blocks) |
{ |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==addr >> shift_offset) |
{ |
detected=true; |
cash[1][i]=block_counter; |
block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
compulsry_misses++; |
cash[0][block_counter]=addr>>shift_offset; |
cash[1][block_counter]=block_counter; |
return false; //miss |
} |
} |
else // block counter is more than block size |
{ |
//check for existence |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==(addr >> shift_offset)) |
{ |
detected=true; |
cash[1][i]=block_counter; |
//block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
int compare=0; |
for (int i=1; i < number_of_blocks; i++) |
{ |
if (cash[1][compare] > cash[1][i]) |
compare=i; |
} |
cash[0][compare]=addr >> shift_offset; |
cash[1][compare]=block_counter; |
capcity_misses++; |
return false; //miss |
} |
} |
} // end of LRU |
else if (type==1) // LFU /////////////// |
{ |
if (block_counter < number_of_blocks) |
{ |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==addr >> shift_offset) |
{ |
detected=true; |
cash[1][i]=cash[1][i]+1; |
block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
cash[0][block_counter]=addr>>shift_offset; |
cash[1][block_counter]=-1; |
compulsry_misses++; |
return false; //miss |
} |
} |
else // block counter is more than block size |
{ |
//check for existence |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==(addr >> shift_offset)) |
{ |
detected=true; |
cash[1][i]++; |
block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
int compare2=0; |
for (int i=1; i < number_of_blocks; i++) |
{ |
if (cash[1][compare2] >= cash[1][i]) |
compare2=i; |
} |
cash[0][compare2]=addr >> shift_offset; |
cash[1][compare2]=-1; |
capcity_misses++; |
return false; //miss |
} |
} |
} // end if LFU |
else if (type==2) |
{ |
if (block_counter < number_of_blocks) |
{ |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==addr >> shift_offset) |
{ |
detected=true; |
block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
cash[0][block_counter]=addr>>shift_offset; |
cash[1][block_counter]=block_counter; |
compulsry_misses++; |
return false; //miss |
} |
} |
else // block counter is more than block size |
{ |
//check for existence |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==(addr >> shift_offset)) |
{ |
detected=true; |
//block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
int compare=0; |
for (int i=1; i < number_of_blocks; i++) |
{ |
if (cash[1][compare] > cash[1][i]) |
compare=i; |
} |
cash[0][compare]=addr >> shift_offset; |
cash[1][compare]=block_counter; |
capcity_misses++; |
return false; //miss |
} |
} |
}// end of FIFO |
else if (type==3) |
{ |
if (block_counter < number_of_blocks) |
{ |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==addr >> shift_offset) |
{ |
detected=true; |
block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
cash[0][block_counter]=addr>>shift_offset; |
compulsry_misses++; |
return false; //miss |
} |
} |
else // block counter is more than block size |
{ |
//check for existence |
for (int i=0; i < number_of_blocks; i++) |
{ |
if (cash[0][i]==(addr >> shift_offset)) |
{ |
detected=true; |
//block_counter--; |
return detected; //hit |
} |
} |
if (!detected) |
{ |
srand(time(NULL)); |
cash[0][rand()%number_of_blocks]=addr >> shift_offset; |
capcity_misses++; |
return 0; //miss |
} |
} |
}//end of RANDOM |
} // end of Fully associative |
return true; |
} |
char *msg[2] = {"Miss","Hit"}; |
/////////////////////////////////////////////////////////////////// |
int main(int argc, const char * argv[]) { |
int looper=1000000, addr, flag, shift; |
cout << "Please, enter 0 for Direct mapped, 1 for set associative, 2 for fully associative: " << endl; |
cin >> cash_type; |
cout << "Please, enter the size of the block as a Power of 2 between 4 and 128 byte :" << endl; |
cin >> block_size; |
cout << "Please, enter cache size: 1KB – 64KB; in steps that are power of 2: " << endl; |
cin >> cash_size; |
int cash[3][100000]; |
int block_counter=0; |
int hit_counter=0; |
int index_addr=0, tag_addr=0; |
/////////////////////////////////////////////////////////////////// |
if ( cash_type==0) //Direct_mapped ************** |
{ |
number_of_blocks= (cash_size*1024)/block_size; |
//////////////////// |
for (int i=0; i < 2; i++) // setting all the cash with -1 |
for (int j=0; j < number_of_blocks; j++) |
cash[i][j]=-1; |
////////////////// |
for(int i=0; i <looper ;i++) |
{ |
addr = memGen1(); |
shift= log2(block_size); |
index_addr= (addr >> shift)% number_of_blocks; |
shift= log2(number_of_blocks+block_size); |
tag_addr= addr >>shift; // shifted the amount the offset and the index sizes |
flag = cacheSim(addr, cash, 0,block_counter, index_addr, tag_addr); |
index_addr=0; |
tag_addr=0; |
cout <<"0x" << setfill('0') << setw(8) << hex << addr <<" ("<< msg[flag] <<")\n"; |
if (msg[flag]=="Hit") |
{ |
hit_counter++; |
} |
} |
cout << "Hits " << hit_counter<<endl << "Compulsry: " << compulsry_misses <<endl<< "Capcity: " << capcity_misses <<endl<< "Conflict: " << conflict_misses << endl; |
} |
/////////////////////////////////////////////////////////////////// |
else if (cash_type==2) // Fully associative************** |
{ |
int replacment_type; |
number_of_blocks= (cash_size*1024)/block_size; |
cout << "please, enter the type of replacment for the Fully Associative: LRU->0 , LFU->1, FIFO->2, RANDOM->3 :- " << endl; |
cin >> replacment_type; |
for (int i=0; i < 2; i++) // setting all the cash with -1 |
for (int j=0; j < number_of_blocks; j++) |
cash[i][j]=-10; |
for(int i=0; i <looper ;i++) |
{ |
addr = memGen4(); |
flag = cacheSim(addr, cash, replacment_type, block_counter, index_addr, tag_addr); |
// cout <<"0x" << setfill('0') << setw(8) << hex << addr <<" ("<< msg[flag] <<")\n"; |
if (msg[flag]=="Hit") |
{ |
hit_counter++; |
} |
block_counter++; |
} |
cout << "Hits " << hit_counter<<endl << "Compulsry: " << compulsry_misses <<endl<< "Capcity: " << capcity_misses <<endl<< "Conflict: " << conflict_misses << endl; |
} // end of fully associative main |
else if (cash_type==1) // set associative |
{ |
int number_of_ways; |
cout << "please, enter the number of ways for the set associative cash: 2,4,8,16" << endl; |
cin >> number_of_ways; |
number_of_blocks= (cash_size*1024)/(block_size*number_of_ways); |
for (int i=0; i < 3; i++) // setting all the cash with -1 |
for (int j=0; j < 100000; j++) |
cash[i][j]=-1; |
for(int i=0; i <looper ;i++) |
{ |
addr = memGen5(); |
shift= log2(block_size); |
index_addr= (addr >> shift)% (number_of_blocks); |
shift= log2(number_of_blocks+block_size); |
tag_addr= addr >>shift; |
flag = cacheSim(addr, cash, number_of_ways, block_counter, index_addr, tag_addr); |
// cout <<"0x" << setfill('0') << setw(8) << hex << addr <<" ("<< msg[flag] <<")\n"; |
index_addr=0; |
tag_addr=0; |
if (msg[flag]=="Hit") |
{ |
hit_counter++; |
} |
block_counter++; |
} |
cout << "Hits " << hit_counter<<endl << "Compulsry: " << compulsry_misses <<endl<< "Capcity: " << capcity_misses <<endl<< "Conflict: " << conflict_misses << endl; |
} |
} |
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int cash_type, block_size, cash_size,number_of_blocks=0;;
int compulsry_misses=0, capcity_misses=0, conflict_misses=0;
#define DRAM_SIZE (64*1024*1024)
unsigned int m_w = 0xABABAB55; /* must not be zero, nor 0x464fffff
*/
unsigned int m_z = 0x05080902; /* must not be zero, nor 0x9068ffff
*/
unsigned int rand_()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (m_z << 16) + m_w; /* 32-bit result */
}
unsigned int memGen1()
{
static unsigned int addr=0;
return (addr++)%(DRAM_SIZE);
}
unsigned int memGen2()
{
static unsigned int addr=0;
return rand_()%(128*1024);
}
unsigned int memGen3()
{
return rand_()%(DRAM_SIZE);
}
unsigned int memGen4()
{
static unsigned int addr=0;
return (addr++)%(1024);
}
unsigned int memGen5()
{
static unsigned int addr=0;
return (addr++)%(1024*64);
}
unsigned int memGen6()
{
static unsigned int addr=0;
return (addr+=256)%(DRAM_SIZE);
}
// Cache Simulator
bool cacheSim(unsigned int addr, int cash[3][100000], int type, int
&block_counter, int index_addr, int tag_addr)
{
int shift_offset=log2(block_size);
bool detected=false;
bool misses_flag=true;
if (cash_type==0) // Direct Mapped
******************************************
{
if (cash[0][index_addr]==tag_addr)
{
return true;
}
else
{
cash[0][index_addr]= tag_addr;
for (int i=0; i < number_of_blocks; i++)
{
if (cash[1][i]!=1)
{ misses_flag=false;
i=number_of_blocks;}
}
//calculating misses
if (misses_flag)
capcity_misses++; // capcity miss because the cash is full
else
{
if(cash[1][index_addr]==1)
conflict_misses++;
else
{
compulsry_misses++;
}
}
cash[1][index_addr]= 1;
return 0;
}
} // end of directed mapped
///////////////////////////////////////////////////////////////////
else if (cash_type==1) // set asscoiative
*************************************
{
index_addr=index_addr * type;
for (int i=0; i < type ; i++)
{
if (cash[0][index_addr+i]==tag_addr)
{
// cout <<"0x hitttttttt" << setfill('0') <<
setw(8) << hex << tag_addr << endl;
return 1;
}
}
for (int j=0; j < type; j++)
{
if (cash[1][index_addr+j] == -1)
{
compulsry_misses++;
cash[0][index_addr+j]=tag_addr;
cash[1][index_addr+j]=1;
return 0;
}
}
srand(time(NULL));
int x=rand()%(type);
cash[0][index_addr+x]=tag_addr;
cash[1][index_addr+x]=1;
capcity_misses++;
return 0;
}//end of set assciative
else if (cash_type==2) // fully associative
**************************************
{
if (type==0) // LRU /////////
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
cash[1][i]=block_counter;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
compulsry_misses++;
cash[0][block_counter]=addr>>shift_offset;
cash[1][block_counter]=block_counter;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
cash[1][i]=block_counter;
//block_counter--;
return detected; //hit
}
}
if (!detected)
{
int compare=0;
for (int i=1; i < number_of_blocks; i++)
{
if (cash[1][compare] > cash[1][i])
compare=i;
}
cash[0][compare]=addr >> shift_offset;
cash[1][compare]=block_counter;
capcity_misses++;
return false; //miss
}
}
} // end of LRU
else if (type==1) // LFU ///////////////
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
cash[1][i]=cash[1][i]+1;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
cash[0][block_counter]=addr>>shift_offset;
cash[1][block_counter]=-1;
compulsry_misses++;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
cash[1][i]++;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
int compare2=0;
for (int i=1; i < number_of_blocks; i++)
{
if (cash[1][compare2] >= cash[1][i])
compare2=i;
}
cash[0][compare2]=addr >> shift_offset;
cash[1][compare2]=-1;
capcity_misses++;
return false; //miss
}
}
} // end if LFU
else if (type==2)
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
cash[0][block_counter]=addr>>shift_offset;
cash[1][block_counter]=block_counter;
compulsry_misses++;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
//block_counter--;
return detected; //hit
}
}
if (!detected)
{
int compare=0;
for (int i=1; i < number_of_blocks; i++)
{
if (cash[1][compare] > cash[1][i])
compare=i;
}
cash[0][compare]=addr >> shift_offset;
cash[1][compare]=block_counter;
capcity_misses++;
return false; //miss
}
}
}// end of FIFO
else if (type==3)
{
if (block_counter < number_of_blocks)
{
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==addr >> shift_offset)
{
detected=true;
block_counter--;
return detected; //hit
}
}
if (!detected)
{
cash[0][block_counter]=addr>>shift_offset;
compulsry_misses++;
return false; //miss
}
}
else // block counter is more than block size
{
//check for existence
for (int i=0; i < number_of_blocks; i++)
{
if (cash[0][i]==(addr >> shift_offset))
{
detected=true;
//block_counter--;
return detected; //hit
}
}
if (!detected)
{
srand(time(NULL));
cash[0][rand()%number_of_blocks]=addr >> shift_offset;
capcity_misses++;
return 0; //miss
}
}
}//end of RANDOM
} // end of Fully associative
return true;
}
char *msg[2] = {"Miss","Hit"};
///////////////////////////////////////////////////////////////////
int main(int argc, const char * argv[]) {
int looper=1000000, addr, flag, shift;
cout << "Please, enter 0 for Direct mapped, 1 for set
associative, 2 for fully associative: " << endl;
cin >> cash_type;
cout << "Please, enter the size of the block as a Power of 2
between 4 and 128 byte :" << endl;
cin >> block_size;
cout << "Please, enter cache size: 1KB – 64KB; in steps that
are power of 2: " << endl;
cin >> cash_size;
int cash[3][100000];
int block_counter=0;
int hit_counter=0;
int index_addr=0, tag_addr=0;
///////////////////////////////////////////////////////////////////
if ( cash_type==0) //Direct_mapped **************
{
number_of_blocks= (cash_size*1024)/block_size;
////////////////////
for (int i=0; i < 2; i++) // setting all the cash with -1
for (int j=0; j < number_of_blocks; j++)
cash[i][j]=-1;
//////////////////
for(int i=0; i <looper ;i++)
{
addr = memGen1();
shift= log2(block_size);
index_addr= (addr >> shift)% number_of_blocks;
shift= log2(number_of_blocks+block_size);
tag_addr= addr >>shift; // shifted the amount the offset and
the index sizes
flag = cacheSim(addr, cash, 0,block_counter, index_addr,
tag_addr);
index_addr=0;
tag_addr=0;
cout <<"0x" << setfill('0') << setw(8) <<
hex << addr <<" ("<< msg[flag]
<<")\n";
if (msg[flag]=="Hit")
{
hit_counter++;
}
}
cout << "Hits " << hit_counter<<endl <<
"Compulsry: " << compulsry_misses <<endl<<
"Capcity: " << capcity_misses <<endl<< "Conflict:
" << conflict_misses << endl;
}
///////////////////////////////////////////////////////////////////
else if (cash_type==2) // Fully associative**************
{
int replacment_type;
number_of_blocks= (cash_size*1024)/block_size;
cout << "please, enter the type of replacment for the Fully
Associative: LRU->0 , LFU->1, FIFO->2, RANDOM->3 :- "
<< endl;
cin >> replacment_type;
for (int i=0; i < 2; i++) // setting all the cash with -1
for (int j=0; j < number_of_blocks; j++)
cash[i][j]=-10;
for(int i=0; i <looper ;i++)
{
addr = memGen4();
flag = cacheSim(addr, cash, replacment_type, block_counter,
index_addr, tag_addr);
// cout <<"0x" << setfill('0') << setw(8)
<< hex << addr <<" ("<< msg[flag]
<<")\n";
if (msg[flag]=="Hit")
{
hit_counter++;
}
block_counter++;
}
cout << "Hits " << hit_counter<<endl <<
"Compulsry: " << compulsry_misses <<endl<<
"Capcity: " << capcity_misses <<endl<< "Conflict:
" << conflict_misses << endl;
} // end of fully associative main
else if (cash_type==1) // set associative
{
int number_of_ways;
cout << "please, enter the number of ways for the set
associative cash: 2,4,8,16" << endl;
cin >> number_of_ways;
number_of_blocks=
(cash_size*1024)/(block_size*number_of_ways);
for (int i=0; i < 3; i++) // setting all the cash with -1
for (int j=0; j < 100000; j++)
cash[i][j]=-1;
for(int i=0; i <looper ;i++)
{
addr = memGen5();
shift= log2(block_size);
index_addr= (addr >> shift)% (number_of_blocks);
shift= log2(number_of_blocks+block_size);
tag_addr= addr >>shift;
flag = cacheSim(addr, cash, number_of_ways, block_counter,
index_addr, tag_addr);
// cout <<"0x" << setfill('0') << setw(8)
<< hex << addr <<" ("<< msg[flag]
<<")\n";
index_addr=0;
tag_addr=0;
if (msg[flag]=="Hit")
{
hit_counter++;
}
block_counter++;
}
cout << "Hits " << hit_counter<<endl <<
"Compulsry: " << compulsry_misses <<endl<<
"Capcity: " << capcity_misses <<endl<< "Conflict:
" << conflict_misses << endl;
}
}