【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)

news2024/12/24 8:57:26

实验5:Tomasulo 算法模拟和分析

一、实验目的

1:加深对指令级并行性及开发的理解。

2:加深对 Tomasulo 算法的理解。

3:掌握 Tomasulo 算法在指令流出、执行、写结果各阶段对浮点操作指令以及 load 和 store 指令进行了什么处理。

4:掌握采用了 Tomasulo 算法的浮点处理部件的结构。

5:掌握保留站的结构。

6:给定被执行的程序片段,对于具体某个时钟周期,能够写出保留站、指令状态表以及浮点寄存器状态表内容的变化情况。

7:理解 Tomasulo 算法消除 WAR 冲突和 WAW 冲突的方法,理解并掌握了寄存器重命名的原理及过程。

二、实验平台

采用 Tomasulo 算法模拟器。

三、实验内容和步骤

3.1:掌握 Tomasulo 算法模拟器的使用方法

运行网络教学平台上的【Tomasulo算法模拟器】,设置浮点功能部件的延迟时间为:加减法 2 个时钟周期,乘法 10 个时钟周期,除法 40 个时钟周期,Load 部件 2 个时钟周期。

1:运行下列代码,给出当指令 MUL.D 写结果时,保留站、Load 缓冲器以及寄存器状态表中的内容。

当MULT.D指令写结果时,保留站、Load缓冲器和寄存器状态表中的内容如下所示:

由上图可知,MULT.D写结果时,保留站Mult1释放,并将其Busy置为No状态;寄存器F0的结果为M5,并在CDB中进行广播,其中M5=M2*R[F4],即在计算F2*F4时,F4调用R[F4]的结果,而F2调用CDB中M2的结果。

2:按单步方式执行上述代码,利用模拟器的对比显示功能,观察每一个时钟周期前后各信息表中内容的变化情况。

    Cycle 1:L.D F6, 24(R2)进入IS阶段,Load1保留站占用且Busy设置为Yes,地址读入偏移量24,结果寄存器状态表中F6处填入占用的保留站Load1。

Cycle 2:L.D F6, 24(R2)进入EX阶段,地址修改为偏移量24加源寄存器R2指向的地址。L.D F2, 12(R3)进入IS阶段,Load2保留站占用且Busy设置为Yes,地址读入偏移量12,结果寄存器状态表中F2处填入占用的保留站Load2。

Cycle 3:L.D F6, 24(R2)继续停留在EX阶段,计算出偏移地址所存储值的结果,并写入到Load1保留站的值中。L.D F2, 12(R3)进入EX阶段,地址修改为偏移量12加源寄存器R3指向的地址。MULT.D F0, F2, F4进入IS阶段,Mult1保留站占用且Busy设置为Yes,操作码设置为浮点乘法,源寄存器F2未就绪,且应该来源于Load2保留站,源寄存器R4就绪,来源于R[F4],结果寄存器状态表中F0处填入占用的保留站Mult1。

Cycle 4:L.D F6, 24(R2)进入WB阶段,保留站Load1释放且Busy置为No,结果寄存器状态表中F6填入其计算的结果值为M1并在CDB上广播。L.D F2, 12(R3)继续停留在EX阶段,计算出偏移地址所存储值的结果,并写入到Load2保留站的值中。MULT.D F0, F2, F4由于和L.D F2, 12(R3)存在RAW的数据冲突,且F2暂未计算出结果,因此等待。SUB.D F8, F6, F2进入IS阶段,Add1保留站占用且Busy设置为Yes,操作码设置为浮点减法,源寄存器R6就绪,来源于R[F6](即M1),源寄存器F2未就绪,且应该来源于Load2保留站,结果寄存器状态表中F8处填入占用的保留站Add1。

Cycle 5:L.D F2, 12(R3)进入WB阶段,保留站Load2释放且Busy置为No,结果寄存器状态表中F2填入其计算的结果值为M2并在CDB上广播。MULT.D F0, F2, F4由于和L.D F2, 12(R3)存在RAW的数据冲突,且F2刚存入结果M2,因此等待。SUB.D F8, F6, F2由于和L.D F2, 12(R3)存在RAW的数据冲突,且F2刚存入结果M2,因此等待。DIV.D F10, F0, F6进入IS阶段,Mult2保留站占用且Busy设置为Yes,操作码设置为浮点除法,源寄存器R0就绪,来源于R[F0],源寄存器F6就绪,来源于R[F6],结果寄存器状态表中F10处填入占用的保留站Mult2。

Cycle 6:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为9,源寄存器R2就绪,来源于M2。SUB.D F8, F6, F2进入EX阶段,余下周期Time设置为1,源寄存器R2就绪,来源于M2。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。ADD.D F6, F8, F2进入IS阶段,Add2保留站占用且Busy设置为Yes,操作码设置为浮点加法,源寄存器F8未就绪,且应该来源于Add1保留站,源寄存器R2就绪,来源于M2,结果寄存器状态表中F6处填入占用的保留站Add2。

 Cycle 7:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为8。SUB.D F8, F6, F2继续停留在EX阶段,计算出浮点减法的结果,并写入到Add1保留站的值中。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。ADD.D F6, F8, F2由于和SUB.D F8, F6, F2存在RAW的数据冲突,且F8暂未计算出结果,因此等待。

 Cycle 8:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为7。SUB.D F8, F6, F2进入WB阶段,保留站Add1释放且Busy置为No,结果寄存器状态表中F8填入其计算的结果值为M3并在CDB上广播。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。ADD.D F6, F8, F2由于和SUB.D F8, F6, F2存在RAW的数据冲突,且F8刚存入结果M3,因此等待。

 Cycle 9:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为6。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。ADD.D F6, F8, F2进入EX阶段,余下周期Time设置为1,源寄存器R8就绪,来源于M2。

 Cycle 10:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为5。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。ADD.D F6, F8, F2继续停留在EX阶段,计算出浮点加法的结果,并写入到Add2保留站的值中。

Cycle 11:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为4。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。ADD.D F6, F8, F2进入WB阶段,保留站Add2释放且Busy置为No,结果寄存器状态表中F6填入其计算的结果值为M4并在CDB上广播。

Cycle 12:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为3。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。

Cycle 13:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为2。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。

Cycle 14:MULT.D F0, F2, F4进入EX阶段,余下周期Time设置为1。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算出结果,因此等待。

    Cycle 15:MULT.D F0, F2, F4继续停留在EX阶段,计算出浮点乘法的结果,并写入到Mult1保留站的值中。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0暂未计算​​​​​​​
出结果,因此等待。

 Cycle 16:MULT.D F0, F2, F4进入WB阶段,保留站Mult1释放且Busy置为No,结果寄存器状态表中F0填入其计算的结果值为M5并在CDB上广播。DIV.D F10, F0, F6由于和MULT.D F0, F2, F4存在RAW的数据冲突,且F0刚存入结果M5,因此等待。

Cycle 17:DIV.D F10, F0, F6进入EX阶段,余下周期Time设置为39,源寄存器R0就绪,来源于M5。

 Cycle 18:DIV.D F10, F0, F6进入EX阶段,余下周期Time设置为38。

……

Cycle 55:DIV.D F10, F0, F6进入EX阶段,余下周期Time设置为1。


Cycle 56:DIV.D F10, F0, F6继续停留在EX阶段,计算出浮点除法的结果,并写入到Mult2保留站的值中。

Cycle 57:DIV.D F10, F0, F6进入WB阶段,保留站Mult2释放且Busy置为No,结果寄存器状态表中F10填入其计算的结果值为M6并在CDB上广播。

至此,整段代码的运行结束。

3:对于上面相同的延迟时间和代码段:

(1)给出在第3个时钟周期时,保留站、Load缓冲器以及寄存器状态表中的内容。

(2)步进5个时钟周期,给出此时保留站、Load缓冲器以及寄存器状态表中的内容。

(3)再步进10个时钟周期,给出此时保留站、Load缓冲器以及寄存器状态表中的内容。


(1)步进3个周期到Cycle 3时,保留站、Load缓冲器以及寄存器状态表中的内容


(2)前进5个周期到Cycle 8时,保留站、Load缓冲器以及寄存器状态表中的内容


(3)前进10个周期到Cycle 18时,保留站、Load缓冲器以及寄存器状态表中的内容

4:假设浮点功能部件的延迟时间为:加减法3个时钟周期,乘法8个时钟周期,除法40个时钟周期,自己编写一段程序,重复上述步骤(2)的工作,并给出通过此项工作,得出什么结论?


(1)设置指令


(2)设置浮点功能部件延迟时间

(3)执行Tomasula算法


Cycle 1:


Cycle 2:


Cycle 3:


Cycle 4:


Cycle 5:


Cycle 6:


Cycle 7:


Cycle 8:


Cycle 9:


Cycle 10:


Cycle 11:


Cycle 12:


Cycle 13:


Cycle 14:


Cycle 15:

Cycle 15——Cycle 54:DIV.D指令停留在EX阶段


Cycle 54:

Cycle 55:

至此,整段代码的运行结束。

通过此项工作得出的结论:

(1)性能影响。修改延迟时间会影响处理器执行指令的速度。延长延迟会减慢指令执行,而缩短延迟可能加快执行,但这也取决于其他因素,如指令依赖性和资源利用率。

(2)资源冲突和调度。在Tomasulo算法中,资源共享和动态调度是关键。改变延迟时间可能会影响功能单元的利用率和指令的调度顺序,进而影响整体性能。

5:习题4第6题模拟

由于本模拟器未设置Store指令和分支指令,因此无法执行该题目的模拟。

3.2:Tomasula 模拟器的算法分析和实现

1:网络教学平台【Tomasulo-Simulator-java】为java编写的Tomasula算法模拟器,分析该模拟器源代码,要求:

   (1)写出设计思路(模块划分,设计流程)。

   (2)找出对应于发射、执行和写回的代码,对其进行说明和分析。

(1)Tomasula 模拟器的设计思路

    本Tomasula算法模拟器的设计思路如下表所示:

模块划分

设计流程

UI设计

界面面板UI设计与实现,向容器中添加下拉框、按钮等部件,实现页面跳转功能以及面板放置。

指令设置

设置指令选择框(操作码,操作数,立即数等)的default选择,并设置界面默认指令。其中ins_set_panel用于指令设置,EX_time_set_panel用于执行时间设置,ins_state_panel用于指令状态设置,RS_panel用于保留站状态设置,Load_panel用于Load部件设置,Registers_state_panel用于寄存器状态设置。

监听器

监测连接执行不同按钮对应的操作,点击按钮后监听器工作,根据指令初始化其他面板。

Tomasula算法

实现Tomasulo算法,首先对六组指令循环遍历,之后根据发射、执行、写回的流程编写相应的逻辑。包括指令发射操作、保留站的设置、指令执行判断、寄存器操作、保留站操作、Load操作、指令写回操作、计算执行时间操作等。

本Tomasula算法模拟器的UI界面如下图所示:

(2)IS、EX、WB的代码段及其说明分析

IS阶段说明:发射阶段,首先判断指令的流出和执行情况,调用instIssue()方法对空闲的保留站进行遍历并发射指令,若未流出则发射指令。

IS代码段:

    //Excute方法中所调用的instIssue指令发射方法

    void instIssue(String op, String rd, String rs, String rt)

    {

        int remain = -1;

        //选择空闲的保留站

        if (op.equals("ADD") || op.equals("SUB"))

        {

            for (int i = 1; i < 4; i++)     //Add1,2,3三个保留站遍历

            {

                if (my_rs[i][2].equals("no"))   //空闲

                {

                    remain = i;

                    break;

                }

            }

        }

        else

        {

            for (int i = 4; i < 6; i++)     //Mult1,2两个保留站遍历

            {

                if(my_rs[i][2].equals("no"))

                {

                    remain = i;

                    break;

                }

            }

        }

       

        if (remain > 0)     //找到空闲保留站

        {

            String r = my_rs[remain][1];    //保留站名称

            for (int i = 1; i < 17; i++)

            {

                //检查第一个操作数是否就绪

                if (my_regsters[0][i].equals(rs)){

                    if (my_regsters[1][i].equals("0"))

                    {

                        //第一个操作数就绪,把寄存器rs中的操作数取到当前保留站Vj

                        if(my_regsters[2][i].equals(""))

                            my_rs[remain][4] = "R[" + my_regsters[0][i] + "]";

                        else

                            my_rs[remain][4] = my_regsters[2][i];

                        my_rs[remain][6] = "0";     //Qj 置为0

                    }

                    else    //未就绪

                    {

                        //寄存器换名,把将产生该操作数的保留站的编号放入当前保留站的Qj

                        my_rs[remain][6] = my_regsters[1][i];

                    }

                }

                //检查第二个操作数是否就绪

                if (my_regsters[0][i].equals(rt))

                {

                    if (my_regsters[1][i].equals("0"))

                    {

                        //第二个操作数就绪,把寄存器rt中的操作数取到当前保留站Vk

                        if(my_regsters[2][i].equals(""))

                            my_rs[remain][5] = "R[" + my_regsters[0][i] + "]";

                        else

                            my_rs[remain][5] = my_regsters[2][i];

                        my_rs[remain][7] = "0";     //Qk 置为0

                    }

                    else    //未就绪

                    {

                        //寄存器换名,把将产生该操作数的保留站的编号放入当前保留站的Qk

                        my_rs[remain][7] = my_regsters[1][i];

                    }

                }

            }

           

            my_rs[remain][2] = "Yes";   //修改状态为忙碌

            my_rs[remain][3] = op;

            for (int i = 1; i < 17; i++)

            {

                if (my_regsters[0][i].equals(rd))

                    my_regsters[1][i] = r;      //目的寄存器状态置为保留站名称

            }

           

        }

//      else    //未找到空闲运算保留站

//      {

//          System.out.println("未找到空闲保留站。");

//      }

//      if (done > 0)

//          return true;

//      else

//          return false;

    }

 

EX阶段说明:执行阶段,首先判断是否符合执行的条件,如果符合执行条件则视为准备就绪,此时判断指令类型,并添加时间并计算执行时间。

EX代码段:

    //Excute方法中所调用的instExcute指令执行方法,计算执行时间

    boolean instExcute(String op, String rd, String rs, String rt)

    {

        int line = -1;

        for (int i = 1; i < 6; i++)

            if (my_rs[i][3].equals(op))

                line = i;

        //Time为空,判断运算是否符合执行条件: Qj = Qk == 0

        if(my_rs[line][6].equals("0") && my_rs[line][7].equals("0") && ready == 1)

        {

            //准备就绪,判断指令类型,添加时间

            if (op == "ADD")

                my_rs[line][0] = Integer.toString(time[1]-1);

            else if (op == "SUB")

                my_rs[line][0] = Integer.toString(time[1]-1);

            else if (op == "MULT")

                my_rs[line][0] = Integer.toString(time[2]-1);

            else if (op == "DIV")

                my_rs[line][0] = Integer.toString(time[3]-1);

            return true;

        }

        else

            return false;

    }

WB阶段说明:写回阶段,需要调用instWB指令写回方法,首先遍历等待写回该结果的寄存器,向该寄存器中写入结果,并把该寄存器的状态值置为就绪状态。

WB代码段:

    //Excute方法中所调用的instWB指令写回方法

    void instWB(String op, String rd, String rs, String rt)

    {

        int line = -1;

        for (int i = 1; i < 6; i++)

            if (my_rs[i][3] == op)

                line = i;

       

        String r = my_rs[line][1];      //保留站名称

        for(int i = 1; i < 17; i++)

        {

            //遍历等待写回该结果的寄存器

            if(my_regsters[1][i].equals(r))

            {

                //向该寄存器写入结果

                if (op == "ADD")

                    my_regsters[2][i] = my_rs[line][4] + "+" + my_rs[line][5];

                else if (op == "SUB")

                    my_regsters[2][i] = my_rs[line][4] + "-" + my_rs[line][5];

                else if (op == "MULT")

                    my_regsters[2][i] = my_rs[line][4] + "*" + my_rs[line][5];

                else if (op == "DIV")

                    my_regsters[2][i] = my_rs[line][4] + "/" + my_rs[line][5];

                my_regsters[1][i] = "0";    //把该寄存器的状态值置为就绪

            }  

        }

       

        for (int i = 1; i < 6; i++)

        {

            //遍历等待该结果作为第一个操作数的保留站

            if (my_rs[i][6].equals(r))

            {

                //向该保留站的Vj写入结果

                if (op == "ADD")

                    my_rs[i][4] = my_rs[line][4] + "+" + my_rs[line][5];

                else if (op == "SUB")

                    my_rs[i][4] = my_rs[line][4] + "-" + my_rs[line][5];

                else if (op == "MULT")

                    my_rs[i][4] = my_rs[line][4] + "*" + my_rs[line][5];

                else if (op == "DIV")

                    my_rs[i][4] = my_rs[line][4] + "/" + my_rs[line][5];

                //Qj0

                my_rs[i][6] = "0";

            }

        }

       

        for (int i = 1; i < 6; i++)

        {

            //遍历等待该结果作为第二个操作数的保留站

            if (my_rs[i][7].equals(r))

            {

                //向该保留站的Vk写入结果

                if (op == "ADD")

                    my_rs[i][5] = my_rs[line][4] + "+" + my_rs[line][5];

                else if (op == "SUB")

                    my_rs[i][5] = my_rs[line][4] + "-" + my_rs[line][5];

                else if (op == "MULT")

                    my_rs[i][5] = my_rs[line][4] + "*" + my_rs[line][5];

                else if (op == "DIV")

                    my_rs[i][5] = my_rs[line][4] + "/" + my_rs[line][5];

                //Qk0

                my_rs[i][7] = "0";

            }

        }

        //释放当前保留站,设置为空闲状态

        my_rs[line][0] = "";

        my_rs[line][2] = "no";

        my_rs[line][3] = "";

        my_rs[line][4] = "";

        my_rs[line][5] = "";

        my_rs[line][6] = "";

        my_rs[line][7] = "";

    }

2:修改源代码,使其不受代码行数的限制。

首先需要修改指令设置ins_set_panel和指令状态ins_state_panel的长度,并顺带修改core()、Execute()、instIsse()、instExcute()、instWB()等方法的阈值。修改inst_typebox数组的长度为4N-1,指令范围为0至4N-1。最后修改相关for循环的次数为N。

四、实验分析和总结

1:保留站是硬件实现的吗?主要作用是什么?

Tomasulo方法是一种计算机硬件架构的算法,用于动态调度指令的执行,允许乱序执行以及更有效率的使用多个执行单元。因此,保留站是硬件实现的。

保留站的主要作用是保存等待流出和正在流出所需要的操作数,实现了寄存器换名的功能,消除了WAR和WAW冲突。

2:记分牌和Tomasula算法的主要区别一个是集中控制,一个是分布控制。请问Tomasula中是如何实现分布控制的?

在Tomasulo算法中,冲突检测和执行控制是分布的。保留站进行执行控制,每个功能部件的保留站中的信息决定了何时指令可以在该部件中执行,计算结果则通过CDB直接从产生它的保留站传送到所有需要它的功能部件,不需要通过寄存器,从而实现分布控制。

3:寄存器重命名是什么意思?如何实现的?怎样确定要换成哪个寄存器?

寄存器重命名是指用一组临时寄存器来代替原来的寄存器名字,从而让每个指令都有自己独立的目标寄存器。这样就可以避免两个指令之间因为使用同一个寄存器名字而产生的假依赖。

通过使用保留站来提供寄存器重命名,从而消除假依赖和避免WAR和WAW冒险。

如果有一个操作数没有准备好,就一直跟踪生成该操作数的功能单元,监视CDB(公共数据总线),一旦有效则放入等待的保留站,开始执行。写回也是写到CDB中,当等待此结果的功能单元跟踪到之后,即刻写入。

4:乱序完成后会带来什么后果?

    乱序完成会造成WAW冲突,当连续写同一个寄存器时,只有最后一次才能写入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1394232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网工每日一练(1月15日)

1.某计算机系统由下图所示的部件构成&#xff0c;假定每个部件的千小时可靠度为R&#xff0c;则该系统的千小时的可靠度为 ( D ) 。 2.以下IP地址中&#xff0c;属于网络 201.110.12.224/28 的主机IP是&#xff08; B &#xff09;。 A.201.110.12.224 B.201.110.12.238 C.20…

1. SpringBoot3 基础

文章目录 1. SpringBoot 概述2. SpringBoot 入门3. SpringBoot 配置文件3.1 SpringBoot 配置文件基本使用3.2 yml 配置文件 4. SpringBoot 整合 Mybatis5. Bean 管理5.1 Bean 扫描5.2 Bean 注册5.3 注册条件 6. 组合注解7. 自动配置原理8. 自定义 Starter 1. SpringBoot 概述 …

蓝桥杯(C++ 矩形总面积 错误票据 分糖果1 三国游戏 分糖果2)

目录 一、矩形总面积 思路&#xff1a; 代码&#xff1a; 二、错误票据 思路&#xff1a; 代码&#xff1a; 三、分糖果1 思路&#xff1a; 代码&#xff1a; 四、三国游戏 思路&#xff1a; 代码&#xff1a; 五、分糖果2 思路&#xff1a; 代码&#xff1a;…

LLM:Sinusoidal位置编码

1&#xff1a;什么是大模型的外推性&#xff1f; 外推性是指大模型在训练时和预测时的输入长度不一致&#xff0c;导致模型的泛化能力下降的问题。例如&#xff0c;如果一个模型在训练时只使用了512个 token 的文本&#xff0c;那么在预测时如果输入超过512个 token&#xff0…

「云渲染科普」效果图渲染吃显卡还是cpu

准确来说看渲染器属于CPU渲染、还是显卡渲染。通常情况下&#xff0c;不少的渲染工作为了追求渲染效果的和速度&#xff0c;同时利用 CPU 和 GPU 的计算资源&#xff0c;达到最佳的效果图呈现方式。 一、效果图显卡渲染与cpu渲染对比 1、CPU(中央处理器)&#xff1a; - 传统的…

【数学建模美赛M奖速成系列】数据可视化方法(一)

数据可视化方法 写在前面山脊图优点缺点实现matlabpython 气泡矩阵图实现matlabpython 后续 写在前面 最近开始更新一个新的系列科研绘图&#xff0c;在同一个竞赛下&#xff0c;大家都近乎相同的解题思路下。之所以能出现一等二等三等奖的区别很大部分都在于结果的可视化&…

【总结】Linux命令中文帮助手册

1. 为什么要总结Linux命令中文帮助手册 Linux 官方并不提供中文的 help、man 帮助手册。网络上已有的前人翻译过的中文手册版本比较老&#xff0c;且翻译存在误差。从记忆角度来看&#xff0c;Linux 很多命令都不一定记得住详细的用法&#xff0c;易遗忘&#xff0c;缺少经验总…

计算机系统基础知识揭秘:硬件、处理器和校验码

计算机系统基础知识揭秘&#xff1a;硬件、处理器和校验码 一、计算机系统基础知识的重要性二、计算机系统硬件2.1、内存和存储设备2.2、输入输出设备 三、中央处理器&#xff08;CPU&#xff09;3.1、运算器3.2、控制器3.3、寄存器组3.4、多核CPU 四、数据表示4.1、原码、反码…

一文极速了解【自注意力机制】

当下如火如荼的大模型&#xff0c;其中的关键技术就是注意力机制&#xff08;Attention&#xff09;&#xff0c;于2015年提出。2017年的“Attention is all you need”一文提出了Transformer模型&#xff0c;去掉RNN&#xff0c;只保留注意力&#xff0c;性能吊打所有机器翻译…

Android Studi安卓读写NDEF智能海报源码

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?id615391857885&spma1z10.5-c.w4002-21818769070.11.1f60789ey1EsPH <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmln…

Intel杀回车载计算领域,极氪首发其第一代AI SoC

作者 |德新 编辑 |王博 Intel低调地重新杀回车载计算领域。 在两个月前&#xff0c;在上海举办的进博会上&#xff0c;Intel对外展示了基于新一代酷睿核心打造的智能座舱平台。 在此之前&#xff0c;这家芯片巨头任命了服役公司20多年的老将Jack Weast作为汽车业务的全球负责…

Zookeeper启动报错常见问题以及常用zk命令

Zk常规启动的命令如下 sh bin/zkServer.sh start 启动过程如果存在失败&#xff0c;是没办法直接看出什么问题&#xff0c;只会报出来 Starting zookeeper … FAILED TO START 可以用如下命令启动&#xff0c;便于查看zk启动过程中的详细错误 sh bin/zkServer.sh start-for…

深度学习中Numpy的一些注意点(多维数组;数据类型转换、数组扁平化、np.where()、np.argmax()、图像拼接、生成同shape的图片)

文章目录 1多维数组压缩维度扩充维度 2numpy类型转换深度学习常见的float32类型。 3数组扁平化4np.where()的用法5np.argmax()6图像拼接7生成同shape的图片&#xff0c;指定数据类型 1多维数组 a.shape(3,2);既数组h3&#xff0c;w2 a.shape(2,3,2);这里第一个2表示axis0维度上…

《30天自制操作系统》学习笔记(七)

先体验一下编译仿真方法&#xff1a; 30天自制操作系统光盘代码在下面链接&#xff0c;但是没有编译仿真工具&#xff1a; https://gitee.com/zhanfei3000/30dayMakeOS 仿真工具在下面链接&#xff1a; https://gitee.com/909854136/nask-code-ide 这是一个集成的编译仿真工…

综述:自动驾驶中的 4D 毫米波雷达

论文链接&#xff1a;《4D Millimeter-Wave Radar in Autonomous Driving: A Survey》 摘要 4D 毫米波 (mmWave) 雷达能够测量目标的距离、方位角、仰角和速度&#xff0c;引起了自动驾驶领域的极大兴趣。这归因于其在极端环境下的稳健性以及出色的速度和高度测量能力。 然而…

Xshell无法ssh连接虚拟机问题或主机无法ping通虚拟机。

常见报错如下&#xff1a; 1&#xff0c;Could not connect to ‘&#xff1f;&#xff1f;&#xff1f;’ (port 22): Connection failed. 2&#xff0c;卡在To escape to local shell, press ‘CtrlAlt]’. 3&#xff0c;Connection closing…Socket close. Connection clos…

Apache安全及优化

配置第一台虚拟机 VM1网卡 yum仓库 挂载磁盘 上传3个软件包到/目录 到/目录下进行解压缩 tar xf apr-1.6.2.tar.gz tar xf apr-util-1.6.0.tar.gz tar -xjf httpd-2.4.29.tar.bz2 mv apr-1.6.2 httpd-2.4.29/srclib/apr mv apr-util-1.6…

jetson-inference入门

jetson-inference 文章目录 jetson-inference前言一、jetson-inference二、 下载传输三、 docker的安装使用总结 前言 jetson 部署相关内容 一、jetson-inference 官方推出的体验套餐&#xff0c;提供了三种最常见的AI应用与计算机视觉的类型 图像辨识&#xff08;Image Rec…

纯CSS3的单选框、复选框、开关按钮UI库-自由分享jQuery、html5、css3的插件库

纯CSS3的单选框、复选框、开关按钮UI库-自由分享jQuery、html5、css3的插件库-遇见你与你分享

陪玩系统:最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码

首发价值29800元的最新商业版游戏陪玩语音聊天系统3.0商业升级独立版本源码 &#xff08;价值29800&#xff09;最新陪玩3.0独立版本 &#xff0c;文件截图 结尾将会附上此系统源码以及详细搭建教程包含素材图仅用于学习使用 陪玩系统3.0独立升级版正式发布&#xff0c;此版本…