应用程序并行化
正如天下没有免费的午餐,如果我们想让程序跑得更快,仅仅买一个更快的处理器是不够的,我们必须重构应用程序,使其并行化,从而能使用到更多的处理器核!在第5章并发与多线程深入指南讨论多线程的部分,我们将进一步探讨这些技术。
为了便于向量处理,我们需要注意,为了使SIMD指令更加高效,加载的数据通常需要对齐。除此之外,目前主流的现代编译器会尽力对代码进行向量化,因此正常情况,我们不需要太关注。然而,编译器只会针对一种特定的架构(CPU)产生代码(指令),但你可能希望在多种处理器上运行你的程序,能不能找到更高级的扩展指令集呢?是有可能的,这种技术被称为CPU指派(CPU dispatching)。
与并行化相关的第二个话题是乱序执行(out-of-order execution)。首先,如前面的图所示,我们建议打破长的指令依赖链以便指令重排,值得商榷的是,这是一种底层技术,有时仅能带来纳秒级的改变。
另一个话题是有时我们可能希望禁止指令的乱序执行。什么时候呢?对,在进行线程间同步的时候,我们必须确切地知道哪些变量以哪种顺序被读写。在处理器层面,可以通过内存边界(memory barriers)来实现,但这将阻碍可能的乱序优化。这也是多线程应用程序中的线程同步在处理器层面是高开销操作的原因。
网友评论