【问题标题】:Replacing two instructions with one instruction in assembly language用一条汇编语言指令代替两条指令
【发布时间】:2018-01-31 08:51:21
【问题描述】:

这是一个程序中给出的许多指令的表格。第一列表示指令本身,第二列表示程序中任何指令的权重百分比,第三列表示任何给定指令的 CPI(每条指令的周期数)。

现在,我想用一条指令 ma​​dd 替换 addmult

ma​​dd 接受三个输入,将前两个输入相乘并将结果添加到第三个输入。这种方式 ma​​dd 指令同时执行乘法和加法。

addmult 目前的权重均为 40%。所以问题是当我用 ma​​dd 替换 multadd 时,新的 ma​​dd 指令的权重是多少?

【问题讨论】:

  • 你觉得会是什么?到目前为止你做了什么来解决它?
  • 这是作业吗?
  • @user28434 这是一个问题的子部分。我被困在这里了。
  • @Colin__s 我将 10% 的 add 和 10% 的 mult 结合在一起。这将剩下 20% 的 add 留给我们。因此,在 result 中,我们将有 10% 的 madd 指令,剩下 20% 的 add 指令。所以总的来说,我们之前有 40% 的 addmult 指令组合在一起。现在,我们有 10% 的 madd 加上 20% 的 add 指令。
  • 这里需要做一个假设:即10%的ADD指令会使用MULT的输出作为一个来源。鉴于该假设,您前进的方向是正确的。还要记得在新形成的 MADD 指令中修改 CPI。

标签: assembly cpu-architecture instructions


【解决方案1】:

add 和 mult 的当前权重均为 40%。所以问题是当我 替换 mult 并用 madd 添加新 madd 的重量是多少 指令?

如果程序在一个地方包含加法(消耗 30% 的 CPU 时间),而在完全不同的地方包含与加法无关的乘法(消耗 10% 的 CPU 时间);那么用“乘加”指令替换任何东西可能是完全不可能的。

如果程序由一次加法(本身消耗 30% 的 CPU 时间)和 1000 次乘法(每次消耗 0.01% 的 CPU 时间)组成,那么对于“最佳情况”,您只能替换一次加法和一次乘法,并且你仍然有 999 个“未配对”乘法。

如果程序由 1000 个加法(每个消耗 0.03% 的 CPU 时间)和一个乘法(本身消耗 10% 的 CPU 时间)组成,那么对于“最佳情况”,您只能替换一个加法和一个乘法,并且您仍然有 999 个“未配对”添加。

如果您知道加法和乘法的数量相等,并且它们都可以通过“乘法和加法”指令进行配对和替换而不改变加载、存储或分支的数量;那么你不知道“乘加”指令有多快/多慢(或者至少你没有提供该信息),因此仍然无法弄清楚它会如何影响性能。

换句话说,您几乎没有找到答案所需的任何信息。

【讨论】:

  • 如果架构有一个零寄存器,那么所有的乘法都可以用madd代替。如果它有一个寄存器,那么加法也可以编码为 madd(为此目的,Itanium 确实有一个 1.0 寄存器和一个 0.0 寄存器)。如果这些操作是完全独立的,那么 40% 的指令将是疯狂的。如果程序中的每个乘法后面都有一个从属加法(最佳情况),那么三分之一的指令将是 madd(每 90 条指令有 20 个独立加法和 10 个真正的 madds [100 - 10 个包含的加法])。性能不是问题的一部分。
  • @PaulA.Clayton:性能(执行哪种类型指令所花费的 CPU 时间的百分比)是个问题,只是 OP 称之为“重量”。
  • 我认为“权重”的 OP 表示 指令计数 的百分比,这符合“当前 add 和 mult 的权重为 40%”(mult 的性能分数加为 2.2/5.9, 37%)。
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 2012-12-29
相关资源
最近更新 更多