V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pq
V2EX  ›  硬件

CPU 为何非得要用乱序执行和预测执行呢?

  •  
  •   pq · 2018-01-06 21:22:11 +08:00 · 8857 次点击
    这是一个创建于 2504 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为了这两个”提高性能“的特性,CPU 还要集成专门的安全检查和调度单元,操作系统更是为此要设计好多复杂的安全组件,增加了大量的不安全因素,最终是否会得不偿失?如果改成传统的顺序执行,CPU 是否没必要进行代码的安全检查?操作系统的内核会不会要精简许多?

    顺序执行的情况下,有没有其它办法提高执行效率?比如单纯提高频率?

    17 条回复    2018-01-08 09:31:42 +08:00
    d4rkb1ue
        1
    d4rkb1ue  
       2018-01-06 21:35:19 +08:00   ❤️ 6
    最直观的。因为代码本来就不是顺序的,会出现分支(判断,循环)。而现代处理器的流水线很长,因此也可以同时处理多条指令,来提升效率。 但是因为不是顺序的指令,不能因为一旦出现分叉整个处理器就停止,静待这个分叉解决,这太浪费资源了(分叉是很频繁地,if/for/while 有那么多)。所以需要 预测执行,如果分叉了,就把已经处理的数据抛弃。还有那么点概率没分叉,那就赚了。
    乱序执行的一个目的也是为了解决冲突,提升利用率。想想这样的一个场景,一个 10 万次循环为一个数据加一,然后另一个 10 万个循环为另一个数据加一。因为在循环里每个数据都是在上一个数据得出之后再修改的,所以必须顺序执行,等待上一个执行完毕再执行下一个。那么这 20 万个操作全都是串行的,先循环 10 万,再循环另一个 10 万。如果可以乱序,这两个循环互不干涉,那么就可以在每个 cycle 里乱序、同时执行 2 个循环中的一步。这样就节约了一半的时间。(这只是个例子,展现乱序执行的意义)。
    纯顺序执行,要么提升频率,要么延长流水线,但是问题在于,没有纯顺序执行的场景啊。什么代码里完全没有分支?
    hadoop
        2
    hadoop  
       2018-01-06 21:43:20 +08:00 via Android   ❤️ 1
    计算机体系结构研究了这么多年的流水线,超标量,多发射,乱序执行,都是为了性能啊
    breeswish
        3
    breeswish  
       2018-01-06 21:47:32 +08:00   ❤️ 1
    楼主可以学习一下「计算机组成原理」
    pq
        4
    pq  
    OP
       2018-01-06 21:51:33 +08:00
    @d4rkb1ue 哦,我把我说的“顺序执行”定义为“以指令序列来执行”,分支与循环,也是一种序列。

    我不是专业人士,但你这么一解释,我倒是理解了乱序执行与预测执行的必要性了。但我觉得,具有这两种特性的 CPU,很难做到绝对的安全,知乎上看了些牛人的分析,觉得要完全杜绝普通应用非授权地访问敏感数据,非常困难,毕竟道高一尺,魔高一丈,黑客们总能找到办法的。
    Shura
        5
    Shura  
       2018-01-06 21:53:42 +08:00
    都是为了提高 CPU 利用率,准确的说是提供 ALU 的利用率。
    zn
        6
    zn  
       2018-01-06 22:12:50 +08:00   ❤️ 1
    楼主可能以为现代 CPU 就像是个考 60 分万岁多一份浪费的大学生,这道题不做换一道也能考达到及格线。
    但实情是:现代的 CPU,要想在激烈的商业竞争中能活下来的,你必须得考 95、96、97 分,在这种情况下,再往上提高一分都是很困难的,所以任何一中能提高性能的技巧基本都用上了。当然你可以不用,但是如果你不用那你很可能会落后于竞争对手,如果然后你就快 over 了。就算没 over 也只能靠低价捡剩饭吃。
    linboki
        7
    linboki  
       2018-01-06 22:28:13 +08:00 via Android
    想的太多,知道的太少——自寻烦恼
    wdlth
        8
    wdlth  
       2018-01-06 22:31:59 +08:00
    先不说 CPU 里面,连编译器都会预测代码里面的分支、循环等情况,在有限的资源下提高性能。
    wwqgtxx
        9
    wwqgtxx  
       2018-01-06 22:45:35 +08:00
    打个不太恰当的比喻,就好比投资是有风险的,需要你猜测风险来判断下一步的操作,那么只要是猜测就肯定还是有错误的,就肯定会存在亏损,所以为了安全大家就把钱存在自己家保险柜不就安全了么
    kindjeff
        10
    kindjeff  
       2018-01-06 23:13:49 +08:00
    @zn 如果你这个比喻是对的,是不是可以说 Intel 靠作弊赢了 AMD 这么久
    est
        11
    est  
       2018-01-06 23:15:12 +08:00
    AMD 当年主频打到了 4G,依然被 Intel 独步天下的 90% 缓存命中率按在地上摩擦。
    akira
        12
    akira  
       2018-01-06 23:23:13 +08:00
    早期的时候,单纯提高频率确实是有效的,甚至有个著名的摩尔定律。
    后面频率提不动了,就弄多核。
    多核升不上去了,就来搞乱序了。
    intel 也不想的啊,能怎么办,他们也很绝望啊。
    msg7086
        13
    msg7086  
       2018-01-07 05:42:13 +08:00
    @kindjeff 如果你说的是 meltdown 的话,那只是 Intel 自己没发现的 feature。
    yksoft1
        14
    yksoft1  
       2018-01-07 11:37:26 +08:00
    性能和安全本来就是互相拮抗的一对啊。
    你想想。去 TMD 什么内存保护,做一个 64 位长模式、单用户单任务的超级 DOS,岂不是效率最高,啥都不用管
    zn
        15
    zn  
       2018-01-07 11:57:40 +08:00
    @kindjeff 这不是作弊,毕竟作弊是没法每次都做到比第一名还高分的。这次 AMD 受影响比 Intel 小只是因为 AMD 的架构不一样,恰好就躲开了这种攻击。而 AMD 一直打不过 Intel 只能说明 AMD 技不如人,综合比分比 Intel 低。
    suspended
        16
    suspended  
       2018-01-07 14:27:36 +08:00
    Intel 预测执行策略太激进了,你看 AMD 就没受到 Meltdown 的影响,或者影响很小,没有可靠 PoC。
    xieyudi1990
        17
    xieyudi1990  
       2018-01-08 09:31:42 +08:00 via Android
    @akira 60 年代就有乱序的 CPU 了。

    PC 的话第一个乱序的应该是 95 年的 Pentium Pro,单 CPU 多核应该是 05 年的 Pentium D。所以至少 PC 是是先乱序,再多核。

    @yksoft1 一直觉得安全这东西就很扯。CPU 从 archtecture,design,verification 到 bios,os,user code 耗费这么多精力搞的东西,到头来还是被轻易破开。感觉就是一些人拍脑袋弄的一套安全系统忽悠公司,公司拿出去忽悠用户。给一堆不管软件的设计验证,然后卖给不管硬件的半懂不懂地拿过来用。哪天出来一个从 silicon 到 os 整个 flow 都懂的,就被轻易破解。

    每次看到 cpu rtl 里那些为了安全加的一堆逻辑就很烦。没办法,除非人类补完计划成真。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2792 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:49 · PVG 19:49 · LAX 03:49 · JFK 06:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.