相关疑难解决方法(0)

当发生中断时,管道中的指令会发生什么?

假设一个5级流水线架构(IF =指令获取,ID =指令解码,EX =执行,MEM =存储器访问,WB =寄存器写回).有4条指令必须执行.

(这些样本说明不准确,但我相信这一点会被理解)

在第五个时钟周期,这些指令将在管道中,如下所示.

添加a,b,c [IF ID EX MEM WB]

添加a,b,d [IF ID EX MEM]

添加a,b,e [IF ID EX]

添加a,b,f [IF ID]

现在,如果发生硬件中断,这些指令会发生什么.只有在执行流水线中的所有指令后才能处理中断吗?是否会以不同的方式处理软件中断和异常?

computer-architecture

22
推荐指数
1
解决办法
1万
查看次数

在CPU仿真中使用switch case时如何处理分支预测

我最近在这里阅读了这个问题为什么处理排序数组比未排序数组更快?并且发现答案绝对令人着迷,在处理基于Data的分支时,它完全改变了我对编程的看法.

我目前有一个用C编写的相当基本但功能完备的解释型Intel 8080仿真器,操作的核心是一个256长的交换机案例表,用于处理每个操作码.我最初的想法是,这显然是最快的工作方法,因为操作码编码在整个8080指令集中并不一致,并且解码会增加很多复杂性,不一致性和一次性情况.一个装有预处理器宏的开关盒表非常整洁,易于维护.

不幸的是,在阅读上述帖子之后,我发现我的电脑中的分支预测器绝对没有办法预测开关盒的跳跃.因此,每次切换案例时,必须完全擦除管道,导致几个周期延迟,否则应该是一个非常快速的程序(在我的代码中甚至没有多次乘法).

我相信大多数人都在想"哦,这里的解决方案很简单,转向动态重新编译".是的,这看起来似乎会削减大部分开关盒并大大提高速度.不幸的是,我的主要兴趣是模拟旧的8位和16位时代控制台(这里的英特尔8080只是一个例子,因为它是我最简单的模拟代码),其中保持精确指令的周期和时序对于视频和声音很重要必须根据这些确切的时间进行处理.

当处理这种级别的准确性时,性能成为一个问题,即使对于旧的控制台(例如,查看bSnes).在处理具有长管道的处理器时,是否有任何追索权或者这仅仅是事实?

c performance emulation compiler-optimization branch-prediction

18
推荐指数
3
解决办法
4493
查看次数

乱序执行与投机执行

我已阅读维基百科页面关于无序执行推测性的exectution.

我不能理解的是相似之处和不同之处.在我看来,当推测执行没有确定条件的值时,它会使用无序执行.

当我阅读Meltdown和Spectre的论文并做了进一步的研究时,出现了混乱.它在陈述消融纸即熔毁是基于乱序执行,而其他一些资源,包括对维基页面sepeculative执行状态消融是基于推测执行.

我想对此有所澄清.

cpu-architecture speculative-execution

8
推荐指数
2
解决办法
2628
查看次数

通过计算条件早期避免拖延管道

在谈论ifs的表现时,我们通常会谈论错误预测如何阻止管道.我看到的推荐解决方案是:

  1. 相信通常有一个结果的条件的分支预测器; 要么
  2. 如果合理可能的话,避免使用一点点魔法分支; 要么
  3. 有条件的移动尽可能.

我找不到的是我们是否能尽早计算出病情,以便在可能的情况下提供帮助.所以,而不是:

... work
if (a > b) {
    ... more work
}
Run Code Online (Sandbox Code Playgroud)

做这样的事情:

bool aGreaterThanB = a > b;
... work
if (aGreaterThanB) {
    ... more work
}
Run Code Online (Sandbox Code Playgroud)

这样的事情可能会完全避免这个条件的停顿(取决于管道的长度和我们可以放在bool和if之间的工作量)?这并不一定是因为我写的,但有什么办法,以评估条件语句早,所以CPU不必尝试和预测的分支

此外,如果这有帮助,编译器可能会做什么呢?

language-agnostic performance cpu-architecture compiler-optimization branch-prediction

7
推荐指数
2
解决办法
550
查看次数

嵌套分支和推测执行会发生什么?

好吧,所以我知道,如果特定的条件分支有一个需要时间来计算的条件(例如内存访问),CPU 会假定一个条件结果并沿着该路径推测执行。但是,如果沿着该路径弹出另一个缓慢的条件分支(当然,假设第一个条件尚未解决并且 CPU 无法提交更改),会发生什么情况?难道CPU只是在猜测里面猜测吗?如果最后一个条件预测错误但第一个条件没有预测会发生什么?难道只是一路回滚吗?

我正在谈论这样的事情:

if (value_in_memory == y){
   // computations
   if (another_val_memory == x){
      //computations
   }
}
Run Code Online (Sandbox Code Playgroud)

cpu-architecture nested-if speculative-execution branch-prediction

6
推荐指数
1
解决办法
1137
查看次数

if 分支比 else 分支快吗?

我发现了这个非常漂亮的信息图,它对某些操作所使用的 CPU 周期进行了粗略估计。在学习时,我注意到一个条目“if的右分支”,我认为如果满足条件,该分支将采用“if”(编辑:正如评论中指出的“右”实际上意味着“正确预测的分支” )。这让我想知道 if 分支与 else 分支相比是否存在任何(即使是很小的)速度差异。

例如,比较以下非常简洁的代码:

演示

#include <cstdio>

volatile int a = 2;

int main()
{
    if (a > 5) {
        printf("a > 5!");
        a = 2;
    } else {
        printf("a <= 5!");
        a = 3;
    }
}
Run Code Online (Sandbox Code Playgroud)

它在 x86 64 位中生成此程序集:

.LC0:
        .string "a > 5!"
.LC1:
        .string "a <= 5!"
main:
        push    rcx
        mov     eax, DWORD PTR a[rip]
        cmp     eax, 5
        jle     .L2
        mov     edi, OFFSET FLAT:.LC0
        xor     eax, eax …
Run Code Online (Sandbox Code Playgroud)

c++ performance x86 assembly branch-prediction

6
推荐指数
1
解决办法
896
查看次数

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

这是我第二次提出这个问题; 有人第一次回复,但我花了太长时间回复他们,因此没有得到充分的理解.

我要做的是了解更多关于现代架构的指令部分; 我假设所有指令都由分支预测器预测,用于指令获取单元按预测获取.

试图帮助提及"分支指令"的另一位绅士也与预测的指令一起发送.该"分支指令"测试分支预测器的预测条件是否正确.我还假设这些分支指令转到分支执行单元,DONT需要来自内存的任何加载.

我不明白的是:

  • 分支执行单元如何通过该指令知道猜测是否正确?
  • 一旦知道它是正确的,会发生什么?
  • 是否每次预测都会发出分支指令(基本上意味着...每次预测都会发生?)
  • 分支预测必须在预测指令之前或之后进行吗?
  • 分支指令是否需要从内存中加载任何数据?如果是这样,它是什么?

谢谢!

architecture cpu assembly caching

5
推荐指数
1
解决办法
1106
查看次数

为什么这种谱线在Kaby湖上不起作用?

我正在尝试在我的Kabe湖7600U上创建一个光谱线(cfr。Henry Wong),正在运行CentOS 7。

完整的测试库可在GitHub找到

我的specpoline版本如下(cfr。spec.asm):

specpoline:
        ;Long dependancy chain
        fld1
        TIMES 4 f2xm1
        fcos
        TIMES 4 f2xm1
        fcos
        TIMES 4 f2xm1

        %ifdef ARCH_STORE
            mov DWORD [buffer], 241     ;Store in the first line
        %endif

        add rsp, 8
        ret
Run Code Online (Sandbox Code Playgroud)

此版本与黄宏Henry的版本不同,流程被转移到建筑路径中。当原始版本使用固定地址时,我将目标传递到堆栈中。
这样,add rsp, 8将删除原始的寄信人地址并使用人工地址。

在函数的第一部分中,我使用一些旧的FPU指令创建了一个长延迟依赖关系链,然后创建了一个独立的链,试图欺骗CPU返回堆栈预测变量。


代码说明

使用FLUSH + RELOAD 1将specpoline插入到配置文件上下文中,同一程序集文件还包含:

buffer

一个连续的缓冲区,它跨越256个不同的高速缓存行,每个高速缓存行之间用GAP-1行分隔开来,总共为256*64*GAP字节。

GAP用于防止硬件预取。

随后是图形描述(每个索引紧接另一个)。

F + R缓冲区

timings

256个DWORD数组,每个条目保存访问F + R缓冲区中相应行所需的时间(以核心周期为单位)。

flush

一个小功能,可以触摸F + R缓冲区的每一页(带有存储,请确保COW在我们这一边)并逐出指定的行。

“个人资料”

标准配置文件功能 …

assembly x86-64 cpu-architecture speculative-execution branch-prediction

5
推荐指数
1
解决办法
84
查看次数

在硬件中断之前如何处理分支错误预测

特定向量(未屏蔽)发生硬件中断,CPU 检查 IF 标志并将 RFLAGS、CS 和 RIP 压入堆栈,同时后端仍有指令完成,其中一条指令的分支预测结果是错误的。通常管道会被刷新,前端开始从正确的地址获取,但在这种情况下,中断正在进行中。

当中断发生时,流水线中的指令会发生什么情况?

我已经读过这篇文章,显然解决方案是立即刷新管道中的所有内容,这样就不会发生这种情况,然后生成指令将 RFLAGS、CS、RIP 推送到 TSS 中内核堆栈的位置;然而,问题出现了,它如何知道与最新架构状态关联的 (CS:)RIP,以便能够将其推送到堆栈上(假设前端 RIP 现在将领先)。这类似于 port0 上的采取分支执行单元如何知道当采取预测结果错误时应该获取的 (CS:)RIP 的问题——是编码到指令中的地址以及预言?当你想到陷阱/异常时,也会出现同样的问题,CPU需要将当前指令(故障)或下一条指令(陷阱)的地址推送到内核堆栈,但是它是如何计算出这条指令的地址的当它处于管道的中途时——这让我相信地址必须被编码到指令中并使用长度信息计算出来,这可能全部在预解码阶段完成。

pipeline intel cpu-architecture interrupt-handling branch-prediction

4
推荐指数
1
解决办法
1067
查看次数

推测执行的 CPU 分支是否可以包含访问 RAM 的操作码?

据我了解,当 CPU 推测性地执行一段代码时,它会在切换到推测性分支之前“备份”寄存器状态,以便如果预测结果错误(使分支无用)——寄存器状态将是安全恢复,而不会破坏“状态”。

所以,我的问题是:推测执行的 CPU 分支是否可以包含访问 RAM 的操作码?

我的意思是,访问 RAM 不是“原子”操作——如果数据当前不在 CPU 缓存中,那么从内存中读取一个简单的操作码可能会导致实际的 RAM 访问,这可能会变成一个非常耗时的操作,从 CPU 的角度来看。

如果在推测分支中确实允许这种访问,它是否仅用于读取操作?因为,我只能假设,如果一个分支被丢弃并执行“回滚”,根据它的大小恢复写操作可能会变得非常缓慢和棘手。而且,可以肯定的是,至少在某种程度上支持读/写操作,因为寄存器本身,在某些 CPU 上,据我所知,物理上位于 CPU 缓存上。

所以,也许更精确的表述是:推测执行的一段代码有什么限制?

cpu cpu-architecture speculative-execution

4
推荐指数
1
解决办法
518
查看次数