如题所述
中国台湾大学资讯工程学系教授兼副系主任 徐慰中
计算机科学不管哪个领域都需要做优化,优化处理器设计、优化网路频宽的使用、优化应用程式的效率等等。以往是静态优化居多,现在动态优化也慢慢崛起。
静态优化 vs. 动态优化
台大资讯工程学系教授兼副主任徐慰中,首先为我们介绍静态与动态优化的区别。静态是先优化再散布,譬如程式码在编译时期就把优化做好了,然后再将程式码散布给使用者, 而动态优化则是在机器执行时仍可以进行程式码的优化。
徐慰中巧妙地以新闻为例,传统报纸都是内容已经印好了再散布,这就像是静态优化;而网路新闻是先拿到内容,再根据使用者习性决定要呈现哪些内容,或是根据装置决定如何呈现,网路新闻内容可以临时修改,甚至可以删除,这就像是动态优化。
有时软体优化耗时甚久,因此静态优化的好处是,程式执行时就不必再加上优化时间, 所以可说是优化一时, 享用万次。相反的,动态优化的优化时间包含在执行时间内。但动态优化可以做到一些静态优化做不到的事,它可以针对不同的底层机器、工作环境、执行路径做不同的优化,或是针对效能真正出问题的地方做优化,还可以根据个人使用变得客制化。
其实,静态与动态各有所长,动态优化不是用来取代静态优化,而是用来辅助静态优化。
动态优化崛起
以往很少人做动态优化,直到2000年后才慢慢受到注重。最主要的原因是微架构的进展使得处理器效能大幅增加,也提供很多机会让编译器发挥优化的能力。
举例来说,假设微处理器一个指令周期能执行六个指令,但编译器在这周期内却只排入了一个指令,因为程式区块内指令都是相关的,不能独立执行,如此就浪费其他五个指令位置。这时编译器就会想去用投机性优化(speculative optimization),把下面有可能执行到区块内的指令预先移过来执行,如果猜对了, 执行的确是所预测的路径, 优化就成功了,如果猜错, 这优化恐怕反成了劣化。
所以该如何确保「预测」做得准确而提升投机性优化的效率?徐慰中介绍了三个方法。
第一个方法是,编译器可以收集程式过去的行为(profile)来协助预测。你可以用以前执行完成的结果来静态产生profile,或是在程式执行时候,透过观察来动态产生profile,动态收集的profile通常比静态准。收集profile有两种方式,一种是侵入式的做法,在程式里插入探针,就可以在程式执行时收集各种资讯;另一种是用处理器的硬体观测(hardware monitoring)在程式执行时观察各种发生的事件,把事件收集起来当作预测的参考。
第二个方法是用机器学习来做预测,前提是要有足够的大数据,目前尚在积极研究阶段。但大家仍对机器学习寄予厚望,因为它常能够发现一些人类没注意到的事,预测也比较准确。
以上两者是用过去发生的事情来预测末来,而第三个方法是往前看,程式执行时抽取一个执行绪专门做预测,就像大军出发会先派出斥候侦查一样,称为侦测执行绪(scout thread)。举例而言,侦测执行绪可跑在主程式之前, 提前算出阵列运算所需要的记忆 *** 址, 就可以预先暖化快取记忆(Warm-up Cache), 减少快取迷失(Cache Miss) 造成的效能损失。
徐慰中笑着说:「我有一个梦,希望有一天所有的系统都能自我优化,发挥系统最佳的效能。希望未来的动态优化可以带我们到这个境界。」