Reputation: 73
I am using C++ to simulate branch predictor and output the prediction into trace.txt.out file. I use cout to check the prediction in command window and the prediction is right. However the .out file cannot be opened.
When I use cat trace.txt.out | head -n 1
to read it, it just shows tons of random character:
ELF>�F@8 @@@@��888
The code is as following:
#include <iostream>
#include <fstream>
#include <math.h>
#include <vector>
using namespace std;
int main (int argc, char** argv) {
ifstream config;
config.open(argv[1]);
int m, k;
config >> m >> k;
config.close();
// initial BHR
int BHR_num = pow(2, k);
int BHR[k] = { 0 };
for (int i = 0; i < k; i++)
{
BHR[i] = 1;
}
// initial saturating counter
int stg_num = pow(2, m);
int Stgcnt[BHR_num][stg_num] = { 0 };
for (int i = 0; i < BHR_num; i++)
{
for (int j = 0; j < stg_num; j++)
{
Stgcnt[i][j] = 3;
//cout<<Stgcnt[i][j]<<" ";
}
//cout<<endl;
}
ofstream out;
string out_file_name = string(argv[2]) + ".out";
out.open(out_file_name.c_str());
ifstream trace;
trace.open(argv[2]);
unsigned long pc; bool taken;
trace >> std::hex >> pc >> taken;
while (!trace.eof()) {
bool prediction;
//prediction = true;
//cout<<"pc:"<<pc<<" ";
// m LSB
int lsb = pc & 4095;
//cout<<"lsb:"<<lsb<<" ";
/*cout<<"BHR:";
for(int i = 0; i < k; i++)
{
cout<<BHR[i];
}
cout<<" ";*/
// BHR dec
int BHR_dec = 0;
for (int i = k; i > 0; i--)
{
BHR_dec += BHR[i - 1] * pow(2, k - i);
}
//cout<<"BHR_dec:"<<BHR_dec<<" ";
//cout<<"Stgcnt:"<<Stgcnt[BHR_dec][lsb]<<" ";
//cout<<"output:"<<taken<<" ";
// make prediction
if (Stgcnt[BHR_dec][lsb] == 3 || Stgcnt[BHR_dec][lsb] == 2)
{
prediction = true;
}
else
prediction = false;
//cout<<" prediction:"<<prediction<<" ";
// update saturating counter
if (Stgcnt[BHR_dec][lsb] == 3)
{
if (taken == false)
{
Stgcnt[BHR_dec][lsb] = 2;
}
else
Stgcnt[BHR_dec][lsb] = 3;
}
else if (Stgcnt[BHR_dec][lsb] == 2)
{
if (taken == true)
{
Stgcnt[BHR_dec][lsb] = 3;
}
else
Stgcnt[BHR_dec][lsb] = 0;
}
else if (Stgcnt[BHR_dec][lsb] == 1)
{
if (taken == true)
{
Stgcnt[BHR_dec][lsb] = 3;
}
else
Stgcnt[BHR_dec][lsb] = 0;
}
else if(Stgcnt[BHR_dec][lsb] == 0)
{
if (taken == true)
{
Stgcnt[BHR_dec][lsb] = 1;
}
else
Stgcnt[BHR_dec][lsb] = 0;
}
// Stgcnt[BHR_dec][lsb] = 1;
// cout<<"updated Stgcnt:"<<Stgcnt[BHR_dec][lsb]<<" ";
// update BHR
for (int i = k; i > 1; i--)
{
BHR[i - 1] = BHR[i - 2];
}
BHR[0] = taken;
/*cout<<"updated BHR:";
for(int i = 0; i < k; i++)
{
cout<<BHR[i];
}*/
//cout<<endl;
out << prediction << endl;
trace >> std::hex >> pc >> taken;
}
trace.close();
out.close();
return 0;
}
To run the code, run g++ -o trace.txt.out file_name.cpp
in command line, then run ./trace.txt.out config.txt trace.txt
.
config.txt is as following:
12
2
trace.txt is as following:
b77a8a3a 1
b77be7ab 1
b77b55a0 1
b77b55e2 0
b77b55ec 1
b77a8b56 1
b77ae087 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77ae087 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 0
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77ae087 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77ba936 1
b77be7ab 1
b77bd7bc 1
b77b5acd 0
b77bd747 1
b77b5ae9 0
b77b5af3 1
b77bd98e 1
b77b5b52 1
b77bd936 1
b77abdba 1
b77be7ab 1
b77b55a0 1
b77b55e2 1
b77b55b4 1
b77ae087 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77ae087 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 0
b77bdeb6 1
b77b5c5f 0
b77aa792 1
b77be7ab 1
b77b652a 0
b77b6530 1
b77b654a 0
b77b6554 1
b77be7ab 1
b77b60d4 0
b77b60fa 0
b77b610c 0
b77b6150 1
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77b5c78 1
b77b616e 1
b77b615d 0
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77b5c78 1
b77b616e 1
b77b615d 0
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdeb6 1
b77b5c5f 0
b77b5c6c 1
b77b616e 0
b77b6178 0
b77b6186 1
b77b61b4 0
b77b61dc 1
b77be7ab 1
b77b5d19 0
b77b5d2a 0
b77b5d35 0
b77b5d44 0
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 1
b77bdeb6 1
b77b5e0f 0
b77b5e1c 1
b77b6200 0
b77b620a 1
b77b62b5 1
b77b6303 1
b77bb717 1
b77b6335 0
b77b6357 0
b77b6370 1
b77b6389 0
b77b63b8 0
b77b63c2 1
b77b63d0 1
b77b6428 1
b77b6568 1
b77b654a 0
b77b6554 1
b77be7ab 1
b77b60d4 0
b77b60fa 1
b77b62b5 0
b77b62db 0
b77b62f6 1
b77b62f6 0
b77b6303 1
b77bb717 1
b77b6335 0
b77b6357 1
b77b63d0 0
b77b63e0 1
b77b63f1 1
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 0
b77b6428 1
b77b6568 1
b77b654a 0
b77b6554 1
b77be7ab 1
b77b60d4 0
b77b60fa 0
b77b610c 0
b77b6150 1
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77b5c78 1
b77b616e 1
b77b615d 0
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77b5c78 1
b77b616e 1
b77b615d 0
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77b5c78 1
b77b616e 1
b77b615d 0
b77b6167 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 0
b77bdeb6 1
b77b5c5f 0
b77b5c6c 1
b77b616e 0
b77b6178 0
b77b6186 1
b77b61b4 1
b77b61dc 1
b77be7ab 1
b77b5d19 0
b77b5d2a 0
b77b5d35 0
b77b5d44 0
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 1
b77bdeb6 1
b77b5e0f 0
b77b5e1c 1
b77b6200 1
b77b61b4 1
b77b61dc 1
b77be7ab 1
b77b5d19 0
b77b5d2a 0
b77b5d35 0
b77b5d44 0
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 1
b77bdeb6 1
b77b5e0f 0
b77b5e1c 1
b77b6200 1
b77b61b4 1
b77b61dc 1
b77be7ab 1
b77b5d19 0
b77b5d2a 0
b77b5d35 0
b77b5d44 0
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 0
b77b5d54 0
b77b5d60 1
b77b5d49 1
b77bdeb6 1
b77b5e0f 0
b77b5e1c 1
b77b6200 0
b77b620a 1
b77b62b5 0
b77b62db 0
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 0
b77b6303 1
b77bb717 1
b77b6335 0
b77b6357 0
b77b6370 1
b77b6389 0
b77b63b8 1
b77b6389 0
b77b63b8 1
b77b6389 0
b77b63b8 0
b77b63c2 1
b77b63d0 0
b77b63e0 1
b77b63f1 1
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 0
b77b6428 1
b77b6568 1
b77b654a 0
b77b6554 1
b77be7ab 1
b77b60d4 0
b77b60fa 1
b77b62b5 0
b77b62db 0
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 1
b77b62f6 0
b77b6303 1
b77bb717 1
b77b6335 0
b77b6357 1
b77b63d0 0
b77b63e0 1
b77b63f1 1
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 1
b77b63f1 0
b77b641c 0
b77b6428 1
b77b6568 0
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77a94cc 1
b77be7ab 1
b77b55a0 1
b77b55e2 1
b77b55b4 1
b77a94d8 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
b77aef9f 1
b77be7ab 1
b77bdec4 1
b77b5c36 0
b77b5c3d 1
b77bdec4 1
b77b5c5f 1
b77b5c4d 1
trace.txt contains the address of branch instructions and whether they are taken or not (1 stands for taken and 0 stands for not taken). config.txt contains 2 numbers m and k, I use m-bit LSB and k-bit branch history register to make prediction. The predictions are right. But the .out file is wrong. I hope someone can help me.
Upvotes: 0
Views: 338
Reputation: 73
Thank all of you for helping me!
I figured out. I shouldn't use trace.txt.out to compile the code.
When I run:
g++ -o compile_name.out file_name.app
and
./compile_name.out config.txt trace.txt
It finally work.
Upvotes: 2