带有C ++的分支模拟器

问题描述 投票:0回答:1

我正在使用C ++模拟分支预测器,并将预测输出到trace.txt.out文件中。我使用cout在命令窗口中检查预测,并且预测正确。但是.out文件无法打开。当我使用cat trace.txt.out | head -n 1读取它时,它仅显示大量随机字符:

ELF>�F@8  @@@@��888

代码如下:

#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;
}

要运行代码,请在命令行中运行g++ -o trace.txt.out file_name.cpp,然后运行./trace.txt.out config.txt trace.txt。config.txt如下:

12
2

trace.txt如下:

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包含分支指令的地址以及它们是否被采用(1代表已采用,0代表未采用)。 config.txt包含2个数字m和k,我使用m位LSB和k位分支历史寄存器进行预测。这些预测是正确的。但是.out文件是错误的。我希望有人可以帮助我。

c++ g++ branch-prediction
1个回答
0
投票

感谢大家对我的帮助!我想通了。我不应该使用trace.txt.out来编译代码。当我跑步时:g++ -o compile_name.out file_name.app./compile_name.out config.txt trace.txt终于可以了。

© www.soinside.com 2019 - 2024. All rights reserved.