关于并行貌似正确的废话–串行已经尽力了

《关于并行貌似正确的废话》系列文章:

  1. 关于并行貌似正确的废话–串行已经尽力了
  2. 关于并行貌似正确的废话-程序语言发展的启示
  3. 《关于并行貌似正确的废话-程序员是优秀的管理者》

在没有革命性的芯片制造技术之前,咱们必须得接受要想快,只能并行!即使出来了新的CPU制造技术,只要有计算,就需要时间,只要有时间需求,人就想要程序跑的越快越好。这是必须的,除了程序员,没有人会享受程序运行的过程。用计算机的人只想要结果!所以性能,将是永恒的主题。

怎么提升性能?咱们从下往上看。

单核CPU已经差不多了,流水线,多发射,延迟槽,超线程,单指令流多数据流(SIMD),能用的技术全都用上了。 频率也不能再升了,访存速度也已经差不多了,卖出去的CPU,一半都是在卖Cache,计算单元占的面积在慢慢变小。于是,我们不得不使用多核,众核。

编译器也很为难,从几十年前开始,吭哧吭哧到现在,能用的招全都用上了,先在汇编里找,不行就在源程序分析中找,有没有公共的子表达式可以删除,有没有常数可以传播。再不行,转SSA形式,找出每个变量在哪儿定义的,在哪儿使用的,有没有多余的定义和使用,有没有可以传播下去的公共子表达式和常数。还觉得不够?过程间并行,要编译的函数,要编译的文件,通通拿过来,搅到一起,在仔细分析!接着,部分冗余删除!在IF条件里面的定义先挪到外面,再对两个分支分别做处理。循环能向量化的向量化,能合并的合并,能展开的展开。能做软流水的软流水。弄了半天,发现寄存器不够用了,于是图着色分配寄存器。几十年就这样过去了,性能有所提升,但不高。一不小心还会出错。明明觉得是个优化,增加之后,发现性能却降了不少。颠倒颠倒做优化的顺序都会给性能和正确性造成很大影响。而且编译时间也会增加不少,搞开发的人不乐意了,哥要写程序,写的过程中,编译一次,你丫要我等十几分钟?!几十年了,静态编译优化做到现在也尽力了。

静态优化不行,用反馈。程序给我,编译器用我的,编出的程序给你运行,收集你使用程序的信息,我再用这些信息决定怎么做优化。优化做了,性能提升了,可是程序输入一变,傻了。性能比不做反馈优化又降了不少。怎么办?投机!我把你的程序拆,编译器拆,不知道怎么拆就使劲做依赖分析,能拆多少拆多少,拆出来的部分,能并行的就并行,增加个运行时支持,拆出来的部分先并行执行着,程序需要的时候,就直接把结果奉上。但是问题又来了,有投机就有失败,有失败就有代价。更何况盲目的投机还会造成cache 污染,存储一致性问题。投机失败的恢复问题。每次投机带来的能耗问题。。。。。

串行皱起眉头,一脸苦涩:大哥,我尽力了,已经不行了!

相关文章:

This entry was posted in 编译前沿, 编译技术 and tagged , , , , , , , . Bookmark the permalink.

15 Responses to 关于并行貌似正确的废话–串行已经尽力了

  1. ayaya says:

    我很喜欢看这种综述性质的文章,让我有一种虚假的水平提高的感觉。

    • erlv says:

      @ayaya, 综述性的文章很难写,呵呵。而且综述需要建立在一定实践基础上的,只有真正的大家才能做到收放自如。

  2. baozii says:

    看来erlang这样的语言将会慢慢地扩大自己的地盘呀…

  3. baozii says:

    虽然我不懂编译器,不过直觉上感到函数式语言做并行可能会容易些

    • erlv says:

      @baozii, 恩,实验室的老师也很关注函数式语言。等有机会我也好好了解一下,写篇文章:) 敬请期待

  4. myesis says:

    只能等待编程语言模型上的变化了。

    • erlv says:

      @myesis,语言模型也有很多的,不过还很难用。反正说起并行来,大家都很头疼。长叹一声,又都各回各家,洗洗睡了。。。。

  5. nightfire says:

    传统的并行也不是解决问题银弹,Amdahl定律的限制下现在大规模应用已经开始显现堆积更多的处理器也作用微薄的状态了。我现在的观点就是通用硬件为计算机的发展作出了极大贡献,但是现在它和它相关的技术得退休了。我觉得为定制硬件服务的编译技术,比如从硬件设计自动生成编译器的技术才是未来。

    • baozii says:

      @nightfire指的是把语言直接编译成vhdl然后用fpga来做嘛?

    • erlv says:

      自动生成的编译技术需要很多硬件细节,通用也很难做到。定制硬件对行业用户还行,普通用户又会太专业。而且fpga的频率也很有限,仅仅是普通CPU的十分之一。如果要根据硬件设计自动生成的话,统一的接口,像posix一样的东西就会很重要了。而且这种根据硬件的性能提升除了并行外,其他的都很小。不知道你说的定制硬件是怎么定制法。又有什么样的编译优化需要自动生成呢?

      • nightfire says:

        @erlv, 我觉得通用cpu和个人电脑都已经日薄西山了,未来属于服务和个人便携设备。无论是Google这样做服务的巨头还是做用一年就换代移动设备的三星,都会有能力去做需要的芯片,来面对能耗等挑战。芯片日趋以模块化的方式搭建起来的,开发周期也在不断缩短,我觉得程序设计领域还没有为这个做好准备。我的设想是“一种语言,可硬可软。”

        • myesis says:

          @nightfire, 的确,Intel收购windriver,Apple收购PA Semi,都是说明巨头们在寻求属于自己的整体解决方案。基于云服务是个人消费者的未来吗?用户有个瘦终端和高速网络即可获得高性能的体验,根本不需要知道一切硬件信息,只是使用就好了。服务供应商那边全是不同种类的专用处理器,就好像一个庞大的异构的系统,通过软件的耦合手段发挥最大的性能。

        • erlv says:

          @nightfire, 设计语言要想硬,估计得靠新材料了。

  6. Pingback: 编译点滴 » 关于并行貌似正确的废话-程序语言发展的启示

  7. Pingback: 编译点滴 » 关于并行貌似正确的废话-程序员是优秀的管理者

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>