c++ - 使用 C++ 的分支模拟器

标签 c++ g++ branch-prediction

我正在使用 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 文件是错误的。我希望有人能帮助我。

最佳答案

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

关于c++ - 使用 C++ 的分支模拟器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59431579/

相关文章:

c++ - 删除 using namespace std 会导致程序得到错误的结果

c++ - g++ 中的显式模板特化导致麻烦

Rust 泛型参数和编译时间 if

assembly - 分支预测器如何知道它是否不正确?

c++ - 无法访问私有(private)函数

c++ - 为什么我不支持 Xcode 1.5?

c++ - 将类模板声明为类的友元

c++ - 访问父级的 protected 变量

c++ - 解决赋值构造函数 C++ 中的歧义

gcc - 您可以将 builtin_expect 与 switch 语句一起使用吗