桌面用户界面¶
EduMIPS64 以基于 Swing 的 Java 桌面应用程序形式发布。本章介绍桌面图形用户界面, 该界面借鉴了 WinMIPS64 的用户界面。事实上,除了一些菜单外,主窗口是完全相同的。
本章还介绍了桌面 JAR 支持的命令行选项。同一个 JAR 可以作为图形应用程序运行, 也可以在 headless / CLI 模式下运行(请参见 命令行选项)。
EduMIPS64 主窗口由一个菜单栏和六个框架组成,显示仿真的不同方面。此外,还有一个状态栏,它有双重作用,一是在点击内存单元和寄存器时显示它们的内容,二是在模拟已启动但未选择verbose(详细)模式时通知用户模拟器正在运行。
状态栏还显示 CPU 状态。它可以显示以下四种状态之一:
READY(准备就绪) CPU 未执行任何指令(未加载程序)。
RUNNING(运行中) CPU 正在执行一系列指令。
STOPPING(停止中) CPU 已找到终止指令,正在执行流水线中已有的指令,然后终止执行。
HALTED(关闭) CPU 已停止:程序刚刚运行完毕。
请注意,CPU 状态与模拟器状态不同。模拟器可能会执行若干次 CPU 循环,然后停止执行,允许用户检查内存和寄存器:在这种状态下,在 CPU 循环之间,CPU 保持 RUNNING 或 STOPPING 状态。一旦 CPU 进入 HALTED 状态,如果不重新加载程序(同一程序或不同程序),用户就无法运行任何 CPU 循环。
更多详情请参见以下章节。
菜单栏¶
菜单栏包含六个菜单:
文件¶
文件菜单包含有关打开文件、重置或关闭模拟器、写入跟踪文件的菜单项。
打开... 打开一个对话框,允许用户选择要打开的源文件。 打开一个对话框,允许用户选择要打开的源文件。
打开最近的文件 显示模拟器最近打开的文件列表,用户可以从中选择要打开的文件。
重置 重置模拟器,保留已加载的文件,但重置执行。 重置模拟器,保留已加载的文件,但重置执行。
写入 Dinero 跟踪文件 以 xdin 格式将内存访问数据写入文件。
退出 关闭模拟器。
Write Dinero Tracefile...*(写入 Dinero Tracefile...*)菜单项只有在执行了整个源文件并已结束时才可用。
执行¶
执行(Execute)菜单包含有关仿真执行流程的菜单项。
单周期 执行一个仿真步骤
运行 开始执行,当模拟器执行到SYSCALL 0(或类似指令),或BREAK指令,或用户点击停止菜单项(或按 F9 键)时停止。
多周期 执行一些仿真步骤。执行的步数可通过设置对话框进行配置。
停止 当模拟器处于运行或多循环模式时停止执行,如前所述。
该菜单仅在加载源文件且模拟尚未结束时可用。*停止*菜单项仅在运行或多循环模式下可用。
请注意,在更新用户界面时模拟器的运行速度会减慢。如果想快速执行较长(数千周期)的程序,请禁用在多步执行中图形与 CPU 同步选项。
配置¶
配置菜单为自定义 EduMIPS64 的外观和行为提供了便利。
设置... 打开设置" 对话框,本章后续章节将对其进行介绍;
更改语言 允许用户更改用户界面使用的语言。这一更改会影响图形用户界面的各个方面,从框架标题到在线手册和警告/错误信息。
当模拟器处于运行" 或多循环" 状态时,"设置..."菜单项不可用。"运行" 或多循环"模式时,"设置..." 菜单项不可用,因为可能会出现竞争冒险 (Race Condition)。
工具¶
该菜单只包含一个项目,用于调用 Dinero Frontend 对话框。
Dinero Frontend... 打开 Dinero Frontend 对话框。
在未执行程序且执行结束之前,此菜单不可用。
窗口¶
该菜单包含与窗口操作有关的项目。
Tile 对可见窗口进行平铺,使一排中的窗口不超过三个。它会尽量扩大每个窗口所占的空间。
其他菜单项只是切换每个窗口的状态,使其可见或最小化。
帮助¶
该菜单包含与帮助相关的菜单项。
手册... 显示帮助对话框。
关于我们... 显示一个可爱的对话框,其中包含项目贡献者的姓名及其角色。
窗口¶
图形用户界面由七个窗口组成,其中六个默认可见,一个(输入/输出窗口)隐藏。
循环¶
周期窗口显示执行流程在一段时间内的演变情况,显示每个时间段内哪些指令处于流水线中,以及这些指令处于流水线的哪个阶段。
寄存器¶
寄存器窗口显示每个寄存器的内容。左键单击寄存器可在状态栏中看到其十进制(带符号)值,双击寄存器可弹出对话框,允许用户更改寄存器的值。
统计数据¶
统计窗口显示程序执行的一些统计数据。
请注意,在最后一个执行周期内,循环计数器不会递增,因为最后一个执行周期不是一个完整的 CPU 周期,而是一个伪周期,其唯一的任务是从流水线中移除最后一条指令,并递增已执行指令的计数器。
当启用缓存模拟器时,统计窗口还会显示 L1 缓存统计数据:
L1I Reads - L1 指令缓存的读取访问次数
L1I Read Misses - L1 指令缓存的读取未命中次数
L1D Reads - L1 数据缓存的读取访问次数
L1D Read Misses - L1 数据缓存的读取未命中次数
L1D Writes - L1 数据缓存的写入访问次数
L1D Write Misses - L1 数据缓存的写入未命中次数
这些统计数据有助于分析缓存性能并了解程序中的内存访问模式。缓存未命中表示处理器需要访问较慢的主内存而不是较快的缓存。
流水线¶
流水线窗口显示流水线的实际状态,显示哪条指令处于哪个流水线阶段。不同的颜色突出显示不同的流水线阶段。
内存¶
内存窗口显示内存单元的内容,以及来自源代码的标签和注释。与寄存器一样,内存单元的内容也可以双击修改,点击内存单元会在状态栏中显示其十进制值。 第一列显示内存单元的十六进制地址,第二列显示单元值。其他列显示源代码中的其他信息。
代码¶
代码窗口显示内存中加载的指令。第一列显示指令的地址,第二列显示指令的十六进制表示。其他列显示源代码中的其他信息。
输入/输出¶
输入/输出窗口为用户提供了一个界面,以查看程序通过 SYSCALL 4 和 5 创建的输出。实际上,它并不用于输入,因为 SYSCALL 3 试图从标准输入读取时会弹出一个对话框,但未来的版本将包括一个输入文本框。
对话框¶
EduMIPS64 使用对话框以多种方式与用户交互。以下是最重要对话框的摘要:
设置¶
在设置对话框中可以对模拟器的各个方面进行配置。 单击OK(确定)"按钮将保存选项,而单击Cancel(取消)(或直接关闭窗口)将忽略更改。如果要保存更改,请不要忘记点击确定"。单击"重置为默认值"按钮会在确认后将所有设置恢复为默认值;当模拟器配置错误时,可以用它快速恢复,无需逐项修改。
主设置选项卡允许配置转发和多循环模式下的步数。
行为选项卡允许启用或禁用解析阶段的警告。"多步执行中图形与 CPU 同步选项选中后,将使窗口的图形状态与模拟器的内部状态同步。这意味着模拟速度会变慢,但在模拟过程中会有明确的图形反馈。如果选中该选项,"循环间隔选项将影响模拟器在开始一个新循环之前需要等待多少毫秒。 这些选项只有在使用 运行或执行菜单中的多循环选项运行模拟时,这些选项才会生效。
最后两个选项设置了同步异常发生时模拟器的行为。如果选中屏蔽同步异常选项,模拟器将忽略任何除以零或整数溢出异常。 如果选中同步异常时终止选项,模拟器将在同步异常发生时停止模拟。请注意,如果同步异常被屏蔽,即使选中了终止选项,也不会发生任何情况。如果未屏蔽异常,也未选中终止选项,则会弹出对话框,但对话框关闭后模拟将继续进行。如果未屏蔽异常且选中终止选项,则会弹出对话框,关闭对话框后模拟将立即停止。
最后一个选项卡可以更改用户界面的外观。其中包括更改不同流水线阶段相关颜色的选项、选择内存单元显示为长数值还是双数值的选项以及设置用户界面字体大小的选项。
缓存选项卡允许您配置 L1 缓存模拟器设置:
L1 Data Cache Size - L1 数据缓存的大小(字节)(默认:1024)
L1 Instruction Cache Size - L1 指令缓存的大小(字节)(默认:1024)
L1 Data Cache Block Size - 每个缓存块的大小(字节)(默认:16)
L1 Instruction Cache Block Size - 每个缓存块的大小(字节)(默认:16)
L1 Data Cache Associativity - 缓存路数,决定缓存组织(默认:1)
L1 Instruction Cache Associativity - 缓存路数,决定缓存组织(默认:1)
这些设置允许您尝试不同的缓存配置,以了解它们对程序性能的影响。缓存模拟器模拟分离的 L1 数据和指令缓存,这在现代处理器中很常见。
需要注意的是,用户界面与字体大小之间的比例关系远非完美,但足以让模拟器在高分辨率显示器(如 4K)上使用。
L1 缓存模拟器¶
EduMIPS64 包含一个集成的 L1 缓存模拟器,模拟分离指令和数据缓存的行为。缓存模拟器在程序执行期间自动运行,并提供关于缓存性能的详细统计数据。
缓存模拟器模拟:
L1 指令缓存 - 缓存从内存中获取的指令
L1 数据缓存 - 缓存内存操作的数据读取和写入
每个缓存可以用不同的参数独立配置:
Size - 缓存的总容量(字节)
Block Size - 每个缓存行的大小(字节)(也称为缓存块)
Associativity - 缓存组中的路数(1 = 直接映射,>1 = 组关联)
缓存模拟器对组关联缓存使用最近最少使用(LRU)替换策略。缓存统计数据在执行期间实时更新,并显示在统计窗口中。
缓存性能会显著影响程序执行时间,特别是对于内存局部性差的程序。使用缓存模拟器可以:
分析程序中的内存访问模式
尝试不同的缓存配置
了解缓存未命中对性能的影响
学习真实处理器中的缓存行为
缓存配置可以通过设置对话框(缓存选项卡)更改,并在模拟重置时生效。
数据前推(Forwarding)¶
EduMIPS64 模拟一个 5 级 MIPS64 流水线(IF、ID、EX、MEM、WB),并可选地 支持数据前推(forwarding),以减少由 Read After Write(RAW)冒险引起的 停顿数量。可以在设置对话框的"主设置"选项卡中启用或禁用前推。
当前推**被禁用**时,源寄存器在 ID 阶段从寄存器堆读取。读取由前两条 指令之一写入的寄存器的指令,必须等待生产者到达 WB 阶段,因此会产生 两次 RAW 停顿。
当前推**被启用**时,模拟器实现了与 Hennessy & Patterson 描述的经典 MIPS 流水线相一致的两条前推路径:
EX → EX:在 EX 阶段末尾产生的 ALU 结果,可以前推到紧接的下一条 指令的 EX 输入(无停顿)。
MEM → EX:在 MEM 阶段末尾产生的值(通常是 load 的结果,或 延迟一个周期的 ALU 结果)可以前推到处于 EX 阶段的指令的 EX 输入 (无停顿)。
但**不存在 EX → ID 前推路径**,相应地也不存在 MEM → ID 前推路径。
这对在 ID 阶段计算条件或目标地址的分支与基于寄存器的跳转指令
(BEQ、BNE、BEQZ、BNEZ、BGEZ、JR、JALR)
有两点可见的影响:
ALU → 分支:如果分支的源寄存器正由紧邻其前的 ALU 指令产生, 则在 ID 开始时该值尚不可用,模拟器会插入一次 RAW 停顿。
Load → 分支:如果分支的源寄存器正由紧邻其前的 load 指令产生, 则该值要到 MEM 阶段末尾才可用,而分支在 ID 开始时就需要它。模拟器 会插入两次 RAW 停顿:这是 load-use 冒险(1 次停顿)与 branch-in-ID 冒险(额外 1 次停顿)的叠加。
以上两种行为均与 Hennessy & Patterson 中的描述一致。
下表总结了最常见的生产者/消费者组合下典型的 RAW 停顿次数:
生产者 → 消费者 |
无前推 |
启用前推 |
|---|---|---|
ALU → ALU |
2 |
0 |
ALU → store(数据操作数) |
2 |
0 |
Load → ALU(load-use) |
2 |
1 |
ALU → 分支 / 寄存器跳转 |
2 |
1 |
Load → 分支 / 寄存器跳转 |
2 |
2 |
备注
This section was added together with the English and Italian versions of the user manual; the Chinese wording above is a best-effort translation and may benefit from review by a native speaker.
Dinero 前端¶
通过 Dinero Frontend 对话框,可以向 DineroIV 进程提供程序执行时内部生成的跟踪文件。第一个文本框中是 DineroIV 可执行文件的路径,第二个文本框中必须是 DineroIV 的参数。
下部包含 DineroIV 进程的输出,你可以从中获取所需的数据。
帮助¶
通过帮助(Help)对话框可以查看在线手册,该手册是本文档的 HTML 副本。
命令行选项¶
有多个命令行选项可用。下面的列表对它们进行了说明,长名称用圆括号括起来。长名称和短名称的使用方法相同。
-v (--version) 打印模拟器版本并退出。
-h (--help) 打印命令行选项的帮助信息,然后退出。
-f (--file) filename 在模拟器中打开`filename`。
-r (--reset) 将存储的配置重置为默认值
-d (--debug) 进入调试模式
-hl (--headless) 在无头模式下运行 EduMIPS64(无 gui)
--verbose 在无头/CLI 模式下启用详细模式,显示模拟器的详细输出, 如开始/结束消息和进度指示器。默认情况下,CLI 在静默模式下运行, 以最小化模拟器输出,避免与程序输出(例如 SYSCALL 5)混淆。
-debug 的作用是激活调试模式。在该模式下,会出现一个新的窗口,即调试窗口,显示 EduMIPS64 的内部活动日志。它对最终用户没有用处,仅供 EduMIPS64 开发人员使用。