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

貌似并不存在 CPU 硬件支持的 128bit 整型算术运算

  •  1
     
  •   rtyurtyu · 2015-06-18 09:38:13 +08:00 · 1911 次点击
    这是一个创建于 3482 天前的主题,其中的信息可能已经有所发展或是发生改变。

    SSE2有128bitXMM寄存器,支持整型运算
    AVX扩展成256bit
    AVX2支持256bit整型运算

    但这并没有什么卵用,全是packed
    最大还是64bit

    而且看来并不能靠这些来加速大整数运算,因为没有进位
    就算未来的AVX-512bit都没意义

    以512bit整数加法为例
    用8个64bit模拟加法就8个ADC

    而AVX-512bit虽然一条指令PADDQ加完了8个64bit
    但是处理进位还要额外耗费n个指令,估计8调指令很难搞定
    PADDQ
    PADDSQ
    然后判断饱和的pack在对应的环绕高一pack+1
    再加上FP Load/Store/Set消耗的时间
    结论就是:
    MMX/SSE/AVX都不能用来加速大整数的算术运算
    想搞大整数,老老实实用64bit整型模拟就对了

    16 条回复    2015-06-19 02:23:03 +08:00
    xujif
        1
    xujif  
       2015-06-18 10:29:56 +08:00   ❤️ 1
    用这个就是哪天突然支持了,而你竟然不需要改代码,好神奇
    fangjinmin
        2
    fangjinmin  
       2015-06-18 10:30:24 +08:00
    机器字长决定了
    fangjinmin
        3
    fangjinmin  
       2015-06-18 10:31:22 +08:00
    @xujif 因为指令是一样。
    wy315700
        4
    wy315700  
       2015-06-18 10:32:53 +08:00
    并没有任何的128位指令,以前AMD的说过

    AVX-256bit的意义其实是可以同时执行4组64bit的运算,
    msg7086
        5
    msg7086  
       2015-06-18 10:56:42 +08:00
    AVX本来就是提升并行运算吞吐量的,本来就没打算支持大数运算啊。
    (然而你真要做的话,用ADX指令集试试吧。
    Septembers
        6
    Septembers  
       2015-06-18 10:57:20 +08:00 via Android
    忽然想到了 http://os.51cto.com/art/200910/155261.htm
    (好像歪楼了
    Imyssed
        7
    Imyssed  
       2015-06-18 11:05:13 +08:00 via Android
    @Septembers 哈哈哈微软黑科技
    Septembers
        8
    Septembers  
       2015-06-18 11:22:27 +08:00 via Android
    rtyurtyu
        9
    rtyurtyu  
    OP
       2015-06-18 12:08:03 +08:00
    @msg7086 ADX倒是可以快一倍的样子,不过还是64bit模拟
    而且支持这个的CPU才刚出没几块
    再换CPU至少要等Skylake架构了
    msg7086
        10
    msg7086  
       2015-06-18 12:20:24 +08:00
    @rtyurtyu 不管多少bit,本质上都是1bit模拟出来的……
    就算做成指令集了,内部说不定也是这样实现的,说不定并不会快。
    AVX就是个很好的例子,很多指令集矢量并行,指令少了一半,然而每个指令的速度也慢了一半,并鸟。
    AVX2普及后内部设计有提升了以后才开始显示出指令集的威力。
    rtyurtyu
        11
    rtyurtyu  
    OP
       2015-06-18 12:34:55 +08:00
    @msg7086 嗯,早前看过一篇文章说AVX优化后还没SSE2快,就是因为太新
    不过1bit模拟不对
    数字电子电路里有介绍,可以用超量的门电路实现一个时钟脉冲搞定n bit运算,只是每加1bit电路数翻倍
    现在的64位cpu内部应该是实现了其机器位宽的单时脉运算,不可能1bit 1bit的来,那太慢了
    为啥叫64位cpu啊,就是这个原因
    没有128位cpu也是因为实现一个时钟脉冲搞定128 bit运算需要晶体管太多,不够经济
    billlee
        12
    billlee  
       2015-06-18 12:56:27 +08:00
    @rtyurtyu 并不是翻倍。1 位全加器需要 5 个门,n 位全加器需要 5n 个门。
    zmj1316
        13
    zmj1316  
       2015-06-18 18:02:46 +08:00 via Android
    @billlee 应该是按并行的算是按指数增长的,你这大概是按串行的算的
    msg7086
        14
    msg7086  
       2015-06-18 21:30:20 +08:00
    @rtyurtyu 倒是不会比SSE2还慢。
    因为最不济也是内部解码成SSE2/3/4的微指令,速度最多只会持平吧。
    billlee
        15
    billlee  
       2015-06-18 21:34:30 +08:00
    @zmj1316 n 位超前进位加法器的规模应该是 O(n^2) 吧?n 个全加器是 5n 个门;然后我没记错的话,每个全加器的超前进位的规模应该是等差数列,求和是 O(n^2) 的。
    zhuang
        16
    zhuang  
       2015-06-19 02:23:03 +08:00   ❤️ 4
    几年前,我给我弟弟解释过这样一个问题,为什么没有 128 bit 的处理器。看到这个帖子,我就把之前写的东西放上来好了。当然要理解这个问题还是需要了解一些计算机相关的背景知识的。

    针对帖子本身添加几句,不用妄想原生 128bit 指令集了。现在没有,在可以遇见的未来也不会有。(如果有请一定记得回来打我脸 :D)

    没有 cpu 支持的 128bit 指令是因为:没有 128bit 的处理器。讨论仅限 x86 范围,或者一般意义上的通用处理器,事实上专业领域里,比如 GPU 大概十年前就过渡到 128bit 了。

    ================

    我先明确下 128-bit 的定义。

    很明显 128bit 不是指的 cpu 指令(instruction)宽度,opcode+[oprand] 的组合数非常有限。
    第二个是说 2^128 bits 寻址,这是没有意义的,后面我会解释即使是 64bits 还有进一步提高寻址的能力。即使是 64bits 寻址,在短期内都是够用的。

    128-bit 说的是原生寄存器宽度。32bit 处理器的原生宽度是 32,可以拆分用作 16/8;64bit 处理器寄存器原生宽度是 64,可以拆分用作 32/16/8;以此类推。


    在这个定义之下,现在的很多 cpu 都可以说是 128bit 了,比如支持 SSE/AVX 的话,就有超过 128bit 宽度的寄存器可调用。原生 64bit 寄存器,配合少量 128bit 寄存器的方案远比全部原生 128bit 有意义。


    ================


    为什么没有 128bit 的 cpu 呢?很简单,不需要,不仅仅是现在不需要,未来的很长一段时间也不需要。现有 64bit 处理器已经够用了。这种够用是从尺度和精度两方面都作了考量的判断。



    尺度方面,可以参考这个宇宙尺度 http://htwins.net/scale2/ 信息图。图中是以 10 为基数的,可以约等于 2^3,介于 10^±(20~40) 即 2^±(64~128) 的具体事物,要远远少于 2^±(0~64) 的量级。而真正用到如此大尺度的时候,人类会用合适的单位(比如科学计数法)来处理。如果真的用 128bit 处理器做现在 64bit 处理器的事情,那么 cpu 绝大多数时间会用零填充数据寄存器。

    夸张一点说,现有 64bit 处理器真正用到整个 64bit 的时候,频率最高的操作是寻址。这是由现有处理器物理设计所决定的,关于这一点后面会详细解释。


    精度方面,标准 ieee 四精度浮点,即 decimal128 标准,就是 128bit 的,能够提供 34 位有效数字,这个数字在绝大多数时间也是超过需求的。早在 8087 处理器上(1978 年第一代 x86 处理器 8086 的改进型)就通过协处理器支持了 80bit 的单精度运算硬件支持,现代 x86 在独立浮点处理器的基础上,逐渐开发出如 SSE/AVX 等基于 SIMD (单指令多数据)的指令集。

    得益于 x86 可变指令长度的特点,结合 SIMD 可以很容易做到,cpu 本身低位宽,却可以在一个指令周期内处理高位宽的数据。限制指令集位宽的其实是寄存器位宽和数量,而非 cpu 的寻址宽度。如果不限制单一指令周期的话,无论是 64bit 还是 32bit 等等,都可以处理无限宽度的数据。




    反过来说,为什么 64bit 够用了,128bit 会浪费?


    工程上,生产 cpu 是难度很大的事情。简单说,多少位宽的处理器,就至少要有多少线的物理连接,通过电路来建立 cpu 与内存间的通道。这个线,包括构建其他基本算术单元的电路宽度,就是所谓的制程。随着制程的进步,微观结构带来的负面效应,比如漏电就越明显,同时布局难度也会增加。在 cpu 这样的高频电路里,对于信号的同时性要求非常高。一个 128bit 的处理器,所有内部的连线,比 64bit 几乎都要增加一倍。这些连线的布局甚至不能弯折,由此设计和生产难度都会大幅度提高。

    这里 cpu 的设计采取了一个巧妙的办法,用少量的物理连接,实现超量的逻辑线性寻址空间。在 32bit 向 64bit 过渡时,这个技术叫做 PAE 物理内存扩展,那段时期 32bit 的支持 PAE 的处理器和操作系统配合,一样可以访问超过 4GB 的内存。第一代 8086 的线性和物理寻址位宽分别是 16/20 bits,自从 PAE 技术诞生了之后,物理地址位宽就被定格在了 36 bits,即使内存总线的宽度从 16 上升到了 64。

    换句话说,这种间接寻址的意义是,无论 128/256 甚至更高位宽的 cpu,都可以通过对内存控制器的升级而实现对超量内存的访问。对于 cpu 生产的意义是,总线(bus)的宽度不再成为制约 cpu 电路布局的关键点。自然更难生产的 128bit 处理器就不多见了。



    ================

    一点引申:相同设计的 128bit cpu 会比 64bit 慢。(就如同 32/64 过渡时期一样)

    物理延迟和逻辑延迟相互影响。

    128bit 内部布局更复杂,信号传递的时间更长。基本 ALC 由于门限增加也会变慢。这是物理延迟。

    逻辑上,128bit 寄存器比 64bit 占用多一倍的缓存空间,在多级内存访问机制下,同等容量缓存命中率会低。如果加大缓存虽然能降低逻辑延迟,但会进一步增大物理延迟。

    32/64 过渡这个问题不明显是因为处理器制造工艺进步明显,而现在这种进步幅度大大不如从前了。

    ================

    总结:纯 128bit 需求请不要考虑通用处理器,有的是 DSP 可以高效完成目标。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2662 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:18 · PVG 14:18 · LAX 22:18 · JFK 01:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.