多核的内心独白:是桌面系统束缚了我的手脚
在英特尔、AMD等厂商的推波助澜下,我们成功地跨入了多核时代。一些激进的桌面用户,迫不及待地升级到最新的多核系统。然而,他们却很快发现,多核系统对于桌面应用的改善非常有限。付出昂贵的代价,换来不尽如人意的结果,用户不禁要问:对于桌面系统而言,多核真的有必要吗?
操作系统是关键
其实,问题首先出在操作系统上。如果操作系统对于多核的支持不够好,那么即便有更多的处理器核心也无济于事。
以微软最新的操作系统Windows Vista为例,从目前来看,Vista并没有对双核以及多核处理器进行专门的优化。这也不能怪微软,毕竟在多年前开始Vista的开发时,英特尔和AMD的多核处理器还没影呢!不过,没有进行专门的优化,并不代表Vista就不支持多核,其实甚至连Windows系列的早期产品Windows XP、Windows 98等操作系统也支持多核,只有目前仅存于人们记忆中的DOS不支持多核。换而言之,只要操作系统支持多任务操作,那么多核就能发挥作用,尽管这种作用可能会因为没有经过优化而在当前显得微不足道。
很多人会感到奇怪,他们认为,从结构上来说,多核的芯片和以前的SMP(Symmetrical Multi-Processing,对称多处理器,通常用于工作站和服务器)差不多,只不过多核是将多个CPU集成到一块芯片上而已。那么,既然以前的操作系统都能够对SMP做出完美的支持,为什么还要有经过优化的多核操作系统呢?
实际上,多核与SMP还是有很大不同的。虽然二者都具备易于使用、内置缓存、共享内存的特性,但是在SMP下,开发人员面对的是单一的抽象化硬件平台,由SMP操作系统来决定具体由哪一个内核来运行相应的任务。而多核环境显著增加了系统的复杂度,尽管很多人都认为多核就是指在同一个芯片中放入多个内核,但是在实际开发工作中所遇到的多处理问题并不仅仅局限于在单一芯片中的多个内核。另外,在操作系统层面,当一个任务到来时,会剥离成为多个并行的线程(线程数量视CPU核心数量而定),又因为线程之间需要交流以及操作系统的监管,其效率损失要比硬件层面大得多。
这里再说句题外话,对于操作系统来说,大家耳熟能详的各种补丁包不仅能改善系统的安全性能等,也可能在短期间内为多核提供强有力的支持。譬如,微软在7月23日就发布了一个支持多核心显卡的补丁,原因是在Windows Vista下,一些诸如GeForce 7950 GX2这样的双核心显卡的第2个GPU(图形处理器单元)可能无法获得正确的指令,导致其仅能发挥一半的火力。多核处理器虽然与多核显卡有极大的不同,但是二者的实现原理是基本相同的,因此我们也不能排除微软在某个时刻为多核桌面系统提供相应的Windows补丁包的可能性。
软件支持成软肋
有了完美支持多核的桌面操作系统,并不意味着桌面多核就已经水到渠成,软件的支持也必须跟上。
目前,多数桌面软件并没有充分考虑到多核的运行情况,导致线程的平均分配时间以及线程之间的沟通时间都会大大增加,尤其是当线程需要反复访问内存的时候,就会造成软件运行效率的低下。另外,一些桌面软件的测试也明白无误地告诉我们,如果没有针对多核进行软件开发,不仅多核提供的强大计算能力得不到利用,甚至还有可能出现“多核不如单核CPU好用”的现象。
在目前的可视化开发环境下,开发软件似乎很简单:只需在IDE(集成开发环境)中新建一个工具,再建几个 Form,然后拖上去一些控件,就可完成一个看似非常强大的程序。这些程序可能具有非常复杂的功能,而且可以在单核CPU上运行得非常好。然而一旦将之在多核系统上运行,其表现往往令人失望。
原因何在呢?传统的程序都是由一个Main函数开始执行程序,然后按顺序执行相应的代码,即所谓的串行,因此同一程序在同一时间只能运行在一个CPU核心上,哪怕该系统上有很多CPU核心,也只能有一个核心发挥作用。
目前几乎所有的桌面软件都是串行的,采用Visual Basic等语言编写,如何为这类开发商提供更好的并发编程模型和开发环境,以帮助他们开发有效的桌面并行应用程序,将是多核在未来几年里面临的一大挑战。当然,这些问题也存在于企业级软件开发过程中,不过由于本文谈及的是桌面系统,因此不再赘言。
为了改善这种局面,据悉英特尔已经与一些软件开发商、操作系统厂商和高校制订了合作伙伴计划,并加快了在相关工具方面的研发力度,推出了一系列的产品,包括编译器、VTun性能分析器、多线程工具等。另外,Intel在全球还有1万多名软件工程师帮助用户完成相关软件的并行化工作。