技术开发 频道

多核并行软件开发 工具成关键?

  【IT168 评论】为何要关注多核编程技术

  没有一家厂商能够像Intel那样,如此关心你程序的运行效率,是的,答案很简单,因为他们卖的是芯片。

  软件是打开硅芯片创新性能之门的钥匙,是能够将英特尔硬件潜力发挥到极致的关键。没有了软件,硬件不过是一堆废铜烂铁。从最高精尖的超级计算机到小巧玲珑的手持设备,再到五花八门的嵌入式设备,许多开发人员通过软件为IA架构带来了种种新的应用模式,然而调查显示,因为软件的原因,大部分应用中,硬件计算资源都得不到充分的发挥和使用。

  在即将在美国旧金山的马士孔尼会展中心(Moscone Center West)举行的2009年秋季英特尔信息技术峰会(IDF)上,你也许能够找到通过软件的方式,提高IA架构下应用程序性能的钥匙。

  尽管多核技术带来了应用程序划时代的变革,然而传统企业开发者对多核条件下的并行程序设计与开发存在诸多障碍。英特尔副总裁兼亚太研发中心总经理理王文汉博士就曾经提出过:多核时代下,并行编程是开发人员需要解决的最重要的问题之一。

  如何划分并行任务?如何最大限度地发挥底层硬件的计算能力,这些都是横亘在开发者特别是系统程序开发者面前的难题。

  如果你想在在这发面有所了解,那么今年秋季的IDF大会上,英特尔公司副总裁兼软件和服务部门总经理雷内•詹姆斯(Renee James)女士带来的,题为《Developing Across the Spectrum of Computing - Software Makes it a Reality》的主题演讲你不应该错过。她将探讨英特尔众多的软件产品、工具和支持服务,从在各行各业减少并行编程的复杂性,到嵌入式应用的构建工具,再到超级计算机性能优化,从各个层面来帮助开发人员充分利用IA架构的潜力。

  多核编程,工具将成为焦点

  公欲善其事,必先利其器。工具从来都是时代进步的最大依靠。并行编程的理论其实我们学习了很多年,但大型应用中,还是鲜有并行计算的成功案例,最大的原因除了业务和交易量并不需要以外,还有一个就是工具。一直没有称心如意的并行或者多核程序的开发工具来帮助我们形成并行的思维,来消化我们并行程序的理论。

  在基于Java的开发工具Eclipse和.NET阵营的Visual studio中,尽管从语言层面上我们已经能都够支持多线程的开发,但多核开发和多线程开发存在很大的区别。在本质上,多核开发也就是利用多线程进行程序开发,让不同功能的进程在不同的核上运行,或者让同一进程中不同功能的线程在不同的核上运行。以往我们学习的算法都是面向单线程的,而多核开发时要将这些算法改造成支持多线程的算法,然后系统运行时会将多线程分配到多核处理器上,以实现运行的加速。

  不过和传统的多线程编程方式有所不同, 多核开发对于同步锁定等问题较简单,但是需要仔细分析出可并行计算的代码块来,让多线程能够在一个任务中并行。多线程开发的时候,你并不知道有几个物理CPU,而进行多核开发时,你肯定知道有多少个物理CPU。

  今年5月,英特尔公司推出的新款并行化编程工具英特尔 Parallel Studio,对开发人员来讲,可谓雪中送炭。Parallel Studio旨在为使用Visual Studio的C/C++程序员提供Intel一套并行开发工具,目的是显著提高应用程序在Intel多核心处理器上的性能。

            Parallel Studio产品构成

  作为一个产品套装,Parallel Studio主要包括以下三大部分:

  Parallel Composer:整合了编译器、库和并行调试功能,更轻松、迅速地支持串行和并行应用程序的多线程编程工作,简化和加速Microsoft Visual Studio C/C++的开发工作。

  Parallel Inspector:可以算是迄今为止最简单易用的VS C/C++多线程程序错误检查工具。与其他同类工具相比,运行速度最快,提供的选择最多,可以精确查找潜在的多线程编程问题和内存错误。

  Parallel Amplifier:可以让开发人员快速找到多核心性能瓶颈,无须了解处理器的架构和内置编码即可实现程序性能优化,充分利用处理器每一个核心的性能。

  另外还包含有一个新的插件“Parallel Advisor Lite”,可以帮助开发人员确定在现有源代码中何处能从并行机制中获益最大。

  轻松集成

  对.NET开发者,Intel Parallel Studio可以和微软的开发工具Visual studio2005/2008轻松方便的集成,安装Intel Parallel Studio后,在VS2005/2008中就会出现Composer、Amplifier和Inspector的菜单和工具栏。

  多核开发 程序员的2.0计算时代

  走进多核开发的2.0时代是需要代价的,对于个人开发者来说,学习成本确实将会再度大幅提高。传统模式的一些编程思想和模型在多核时代下将面临更替,掌握更多工具和程序库也成为了软件开发更高的门槛。但这也为不断学习、勇于创新的开发人员提供了新的机会。

  尤其是对于系统软件的开发人员来说,除了现有的技能以外,还需要对并行计算的原理有更清晰的认识。如果能将这种认识建立在更高的层次上,将会让个人得到更大的成长。多核所带来的机会就如同上世纪90年代末的Java一样,看清这个趋势,只要领先半步,就可以更好的把握多核时代的脉搏。

  当然,并非每个开发人员都需要了解底层代码的细节,理解并利用类似线程化构建块(Treading Building Blocks,简称TBB)这种能从更高抽象层次理解多核计算的方式,会让程序员更快成长。其实一切软件技术的思想并不复杂,学会使用程序库和构件模块,也许可以帮助你更顺利地迈进新时代。

  资料:

  在多核平台上,各线程根本不需要为了得到某种资源而挂起等待,因为各线程都是在相互独立的执行核上并 行运行的。例如,假设有两个线程都要执行移位操作,那么,在单核平台上,两个线程需要竞争唯一的移位单元,因而必须顺序执行,而对于双核平台而言,因为存 在两个移位单元,所以两个线程能够并行执行而无须竞争。

  多 核平台为开发人员提供了一种优化应用程序的渠道,那就是通过仔细分配加载到各线程(或者各处理器核)上的工作负载(也就是实现各线程的负载均衡)就能够得 到性能上的提升。并且,开发人员也可以对应用程序代码加以优化,使其能够更加充分地使用多个处理器资源,进而达到提升应用程序性能的目的。

  在面向多核平台设计多线程应用程序的时候,开发人员必须采取与面向单核平台时不同的设计思想。在单核平台上,为了简化多线程应用程序的编写和调试,开发人 员可能会作一些假设。但是这些假设可能不适用于多核平台。对于这两种平台,设计思想的不同之处主要体现在存储缓存(memory caching)和线程优先级(thread priority)两个方面。

  在 存储缓存方面,多核平台上的每个处理器核都拥有自己的cache。在某个时间点上,一个处理器核上的cache与另一个处理器核上的cache可能会出 现不同步的现象。下面给出一个例子来解释可能出现的这种cache不同步问题。假设有两个线程分别运行在双核处理器的两个执行核上,线程1在执行核1上运 行,线程2在执行核2上运行,而两个线程分别对邻近的存储器单元进行读写操作。由于cache存储器是基于局部性原理来工作的,故不同的数据可能存放在 cache的同一行中。因此,即使某个线程所需的位于某个cache块中的数据没有被重写过,存储系统还是可能会将该cache块标记为无效。这个现象就 是众所周知的伪共享(false sharing)问题。但是在单核平台上,因为只有唯一的cache供各线程共享,所以就不存在cache同步问题。

  在 单核与多核平台上采用相同的线程优先级策略也会导致不同的程序行为。例如,假设一个应用程序有两个进程,这两个进程的优先级不同。在进行性能优化的时候, 开发人员会假定优先级较高的线程可以一直享用执行资源,而不会受到优先级较低线程的干扰。这在单核平台上是正确的,因为操作系统的调度程序不会为优先级较 低的线程分配CPU资源,而对于多核平台而言,因为调度程序是在不同的执行核上调度这两个线程,所以两个线程是同时执行的,也就是说在这种条件下,线程的 优先级不起作用。如果开发人员仍然遵循优先级较高的线程不会受到优先级较低线程的干扰的思想对代码进行优化,这样的代码在多核和多处理器系统上运行就会非 常不稳定。

0
相关文章