追溯多核计算环境变迁的历史
今天,多核技术已经成为现实,大部分人用的PC机都变成了包含双核或更多核的 CPU 机器,再也没有人怀疑多核是昙花一现的技术。未来的很长一段时间内,程序员将不得不和多核打交道,写支持多核的并发性程序。
短短几年间,可能有许多人还没有完全回过神来,计算环境就从单核进入到了多核甚至云计算。IT业就是这样,总是在不断地快速变化,程序员只要稍微松懈一下,就会发现跟不上时代了。下面不妨回顾一下这短短几年间多核计算环境变迁的历史。
2004~2005年,Sun 首次推出基于双核的Ultra SPARC IV,在2005年底推出8核处理器“Ultra SPARCT1”,尤为令业界瞩目。
2005年4月,AMD和Intel 相继推出真正意义上的多核处理器,意味着多核时代已经真正开始了。2005年9月,英特尔全球同步首发基于双核技术桌面产品——英特尔奔腾 D 处理器,揭开了X86处理器多核心时代,标志着绝大部分程序员需要从单核环境转向多核环境进行开发。
2005年5月,一个支持多核环境开发的标准规范OpenMP进行了重大的升级,将原来支持Fortran 和C++的规范合并到一起,推出了 OpenMP2.5版本的规范,给程序员进行多线程开发提供了有力的支持。
2006年7月,Intel发布了新的酷睿2微处理,这是一款不同于前面说到的奔腾D处理器的新架构的多核处理器,它的发行使计算机彻底从单核时代进入了双核时代。
2006年9月,《程序员》杂志作了一期多核专题,发布了多篇与多核相关的文章。其中《多核,瓶颈在软件》这篇采访SUN公司工程技术总监柯亘泰博士的文章一针见血地指出了多核技术面临的主要问题在软件上,不仅底层软件要支持多核,进行上层应用软件开发的程序员,同样需要掌握多线程并发编程技术。
Sun推出的8核处理器“Uitra SPARC T1”
《多核是软件开发行业的迁移目标》,这篇专访Intel 软件产品事业部业务拓展和市场总监JamesReinders 的文章中,提到了Intel已经有一系列的工具可以帮助程序员应对复杂的多线程编程,并指出了程序员进行并行编程面临的三大挑战:扩展性、精确性和易于编程/维护。虽然文中没有详细解析这三大挑战,但是后面我们还会看到,《程序员》杂志在后来刊登的文章中,对这些问题作了详细的阐述。
当时可能还有许多人对多核的发展趋势处于观望状态,认为硬件上或许还有办法通过继续提升主频来提升性能。《计算未来——英特尔谈多核趋势》中明确指出了多核是未来一段时间内计算机处理器的发展趋势,当时在英特尔的实验室里,已经在研究100个内核的处理器芯片了。程序员必须彻底丢掉幻想,转到多核上进行软件开发是唯一的出路。
《多核时代——这里的黎明静悄悄》一文解释了多核硬件体系结构,并指出,由于多核技术的出现,摩尔定律王者归来了。这篇文章还谈到了许多网络游戏如“魔兽争霸”等,当时已经在Intel 公司的配合下,针对双核和未来的多核进行了优化。
上面说到的2006年9月的多核专刊很好地给国内的程序员进行了多核的启蒙,让程序员们明白多核是不可逆转的趋势,程序员必须转到多核上进行开发。在多核上进行软件开发和单核上有什么区别呢?是不是单核时代用多线程开发的软件就可以在多核上用得很好呢?显然这些问题是当时程序员们还没有完全想清楚的。
2006年11月,《程序员》杂志刊登了Herb Sutter 的著名文章《免费午餐已经结束——软件开发将历史性地向并发靠拢》。该文预言并发将是软件开发自面向对象技术以来的一次巨变,文中提到的一个重要问题就是,在单核时代,不修改软件的前提下,将其放到更高速的 CPU 机器上运行,软件性能可以自动提升。然而在多核环境中,当硬件升级到更多核数的 CPU 后,以往写的软件的性能将无法得到提升。对于单核时代的程序员来说,免费的大餐似乎已经结束了。
如何在不修改软件的前提下,让软件性能自动随CPU核数增加而提升,是多核软件开发的一个重要问题,也就是前面 James Reinders 所说的三大挑战中的“扩展性”问题。可见当时还没有解决这个扩展性问题。值得欣慰的是,这个问题现在基本上已经解决了。
可能许多程序员在当时还想不清楚多核对他们到底有什么影响,接着2006年12月期的《程序员》杂志又刊登了Herb Sutter 的另一篇文章《软件与并发巨变》,详细讨论了并发对软件包括编程语言及程序员的深远影响,并讨论了并行、锁、语言、工具等方面的问题及要求,尤其是详细分析了使用锁编程给程序正确性带来的影响。
2007年4月,《程序员》杂志又做了一个多核专刊,发表了多篇多核内容的文章。
《走近多核时代——Intel 公司Geoffrey Lowney院士访谈录》中谈到,一些开发人员怀着侥幸心理,认为高级语言和先进的虚拟机技术(例如 Java 和.NET)能让他们不必改变传统的单线程编程方式。Geoffrey Lowney 院士给这些侥幸者浇了一盆冷水:“一个强大的虚拟机可以实现某些串行程序的动态并行优化,由于这一技术的实现难度很大,而且对实用程序的并行效果并不理想,完全依赖于虚拟机所达到的并行优化结果应该非常有限。”
《积极准备、谨慎行动——应对多核编程革命》这篇文章用浅显易懂的方法,阐述了多核并发程序设计时遇到的一个重要问题,由执行依赖关系的各个代码块如何并行运行的问题,即著名的任务图分解与调度问题,让程序员对多核下的并发执行有了更清醒的认识。
2007年7月,英特尔公司发布了第一个大型开源软件项目——可以让用户非常轻松地实现针对多核芯片编程的工具——Threading BuildingBlocks(TBB)。该项目不仅提供并发查找、并发内存管理等支持多核的算法容器,更重要的是它提供了一个基于偷取的动态任务调度器。程序员可以用其复用以往串行算法代码,将其自动变成并发运行的,比如你懂得串行的快速排序,那么你不需要学习任何并行排序算法,就可以按照一定的方法调用动态任务调度器将其变成并行快速排序算法,实在是令人神奇的一个东西,给程序员进行并发程序开发提供了强大的支持。
2007年8月,AMD 公司公布了一项旨在简化多核心处理器平台编程的规范——LWP(Light-WeightProfiling),该规范应用于多个领域,从硬件底层进一步加强了对多核软件开发的支持。
2009年3月,CAPI 开源项目发布了0.20版,一个专门针对多核的并发数据结构与算法库,内有针对多核的并行搜索、并行排序、分布式队列、分布式查找、分布式内存管理、任务图分解与调度、动态任务分解与调度等多种数据结构与算法容器,可为程序员写高并发性程序提供良好的参考。
从上面的历史可以看出,经过短短几年的高速发展,多核技术不论是在硬件上还是软件上都成为一门比较成熟的技术。虽然几年前Herb Sutter说免费的午餐已经结束,但是现在多核开发面临的各种问题大都已被解决,新的免费午餐又重新开始了。█