运用LabVIEW开发环境 应对多核程序设计的挑战

服务器在线11月26日报道:多年来,处理器生产厂商都在通过提升时钟频率来改进中央处理器的性能。目前处理器技术的最新趋势就是多核的应用。这也就意味着生产商要将几个中央处理器集成在一块芯片上。现在让我们把那些目前已经推出的商用双核和四核处理器抛在脑后吧—因为英特尔公司承诺在未来五年内会生产出80个内核的处理器来。

 

图示一:英特尔公司总裁保罗.欧德宁展示80个内核的模型

这听起来真是个让人难以置信的佳讯—从表面上看会用无穷无尽的性能可供日益复杂的应用程序来运用。面对这个伟大的进步,让我们想象一下目前的应用程序运行速度会快到何种程度!看到这里你会疑问这绝不是件轻而易举之事。确实如此。

设计一款在多核处理器上运行的应用程序相比单核处理器要困难的多。要想多重应用软件能轻易的在不同的内核上运行,你就必须精心设计出利用多核技术的编码应用程序来。这也意味着现有的应用软件在多核处理器上运行时多数都未能从性能的提升中获益。

设计并行代码

并行应用软件的设计面临的首个关键性挑战就是鉴别程序中那些部分能够真正彼此平行运行,然后用代码来执行这些部分。每一个代码都能和线程的其他部分并行运行。因此,一款完整的并行应用程序也就是多线程的运用。

过去,以文本为基础的程序设计者们总是习惯使用应用程序接口诸如OpenMP指令或者可移植操作系统接口(POSIX)来对应用软件中的线程加以定义。因为长期以来以文本为基础的程序设计者们总是根深蒂固的认为在多线程代码实现虚拟化并行是非常困难的。而另一方面,通过NI LabVIEW的图形化开发环境,代码编译者们就能轻易的实现并行应用程序的虚拟和设计。另外,LabVIEW工具还能自动为代码的并行部分产生线程。所以对这项设计的背景知之甚少的工程师和科学家们,就要把更多的时间和精力放在如何解决这个问题上,而不是成天为应用软件的低效运行而大费脑筋。

 

图示二:文本语言和LabVIEW图形环境下的多线程对比

实现线程同步

多核程序设计面临的第二个挑战就是线程同步。面对应用软件中无数的线程,你必须确保所有的线程都能互相配合。举例来说,如果两个或者更多内核尝试同时访问存储单元,就会导致数据紊乱。因此,对一款应用软件中的代码产生冲突的可能性加以细致的鉴别是一项艰巨的任务。

利用LabVIEW的图形化开发环境创建一个结构图,你就能够很快完成这个任务而无需考虑线程同步的问题。图示三显示了一款应用软件中图形代码的两个并行部分在读取文件时要访问同一个硬盘空间的情形。LabVIEW就能自动运行线程同步。

 

图示三:LabVIEW图形环境下线程自动同步的简单演示

调试

多数的应用程序在首次执行任务时都无法完美的履行职能。无论是单核还是多核应用软件都存在这样的问题。从逻辑上说,代码的任何部分都可能产生功能误差,这时你就必须依靠不断升级的调试工具来纠正这些误差。

调试过程也是多核应用软件面临的一个挑战。你不仅要对同时运行的两部分代码进行跟踪,还要确定这每个代码使用的是那个处理器。除此之外,如果你经常设计多线程应用软件,你还必须解决线程交叉和枯竭方面的问题,这些在调试过程中都需要进行认真的甄别。

LabVIEW包含的几个特性能大大简化多核应用软件的调试过程。特别是你可以运用高亮显示执行的特点来方便快捷的对程序的并行执行虚拟化(LabVIEW本身就是以数据流为基础的)。举例来说,仔细观察图示四中的演示,当高亮显示打开时,你就能轻易的对代码执行的并行部分进行虚拟化了。

 

图示四:LabVIEW开发环境下制图高亮显示

除此之外,LabVIEW的实时模块还能提供多核处理器准确的执行情况和广泛的调试信息。目前的最新版本LabVIEW8.5实时执行跟踪工具包能对线程运行的处理器虚拟化,还能快速识别线程枯竭和交叉的问题。

 

图示五:LabVIEW8.5跟踪工具包

总结

由此我们可以得出结论,多核应用程序的设计者们必须充分重视多线程的挑战。这些挑战不仅限于我们上文谈及的并行应用程序体系架构,线程同步和调试这几个方面。随着处理器内核数量的不断增加,在多线程应用软件中的正确运用并行设计技术也越来越重要了。