因为NI LabVIEW是数据流编程语言,开发者们可以编写并行的应用程序,这些应用程序可以直接映射到并行的硬件(如多核心处理器和FPGA等)上以获得最优异的性能。这篇白皮书讨论了什么是数据流编程以及为什么说NI LabVIEW是多核系统编程的首选。
免费午餐结束了
近几年来,处理器的速度遭遇到了瓶颈。摩尔定律表明,每隔18~24个月芯片中晶体管的数量就会增加一倍。这在过去的40年里始终是适用的,但是芯片性能却不再保持线性增加了。过去,芯片生产厂商通过增加处理器的时钟速度来提高芯片的性能,如从100~200MHz,再到最近的数GHz的范围。
但是在今天,由于功耗和散热的限制,通过提高时钟速度来增加性能的方法行不通了。芯片厂商开始转向另一种全新的芯片构架,就是在单芯片上集成多个处理器内核。相对于单核处理器,程序员们可以使用多核处理器完成更多的任务。为了充分利用多核处理器,程序员们需要重新考虑开发应用程序的方法。微软公司的软件设计师Herb Sutter曾说过,对于那些期望最终用户简单的将计算机升级到更快的处理器就可以立即看到软件程序性能提升的开发者而言,“免费午餐结束了”。简而言之,在相当长的一段时间里,软件开发是这样的,但是现在情况不同了。
图1:摩尔定律表明处理器速度不能更快了,所以Intel和AMD等芯片厂商正在转向在单个处理器上集成多个核心的方法。
顺序执行的程序在处理器的速度提升后将得到性能的改善,将电脑升级到更快的CPU意味着一个序列中每个单独的指令都将运行得更快。为了在多核系统中继续获得性能提升,你需要设计一个在内核间分配任务的应用程序,从本质上说来就是开发并行应用程序来取代顺序执行的程序。
LabVIEW——一种图形化数据流式编程语言
在LabVIEW中开发应用程序的主要优势是这种语言有着直观、图形化的特点。在LabVIEW中,用户解决工程问题就像是在纸上画框图一样。现代多核处理器技术使得LabVIEW成为一种更适合的编程工具,因为它有着并行化表达和执行任务的能力。
LabVIEW的数据流特性使得如果连线中存在着分支,或者是框图中存在并行序列,那么LabVIEW执行机构会尝试着并行的执行程序。在计算机科学术语中,这称为“潜在的并行化”,因为你不需要根据并行运行的需要明确地编写并行代码,编程语言自己会进行一定程度的并行化。
从单核到双核计算机,理论上讲,获得的性能应该是原来的两倍。但是,与这个极限接近的程度取决于用户应用程序运行的并行化程度。LabVIEW程序员们可以很方便的以并行方式来表示他们的解决方案。对于普通的LabVIEW应用程序而言,如果不考虑多核心编程技术,在不改写代码的情况下,与最初的程序相比,可以获得25%到35%的性能提升,这都是缘于普通LabVIEW程序所具有的并行特性。
图2是一个简单的应用程序的例子。其中,LabVIEW代码中的分支简化了两个分析任务——一个滤波器操作和一个快速傅立叶变换(FFT),使它们可以在双核机器上并行执行。在图表中没有显示的性能测试代码,它首先在单核模式下(关掉其中的一个核)运行“for loop”一次,然后在双核的模式下运行。因为这两项任务都是计算量很高的,利用任务并行化获得的性能改进为原来的1.8倍。
图2:典型的LabVIEW应用程序,它展示了数据流编程所具有的与生俱来的并行特性。
基于文本的编程语言如C语言等,在代码中利用特殊标记来表示并行化代码,创建并行任务(也就是创建独立的线程)。管理这些多线程的应用程序将是一个挑战。
在C语言中,用户必须使用锁操作、互斥量、原子操作和其他高级编程技术来管理同步。当多线程变得难于跟踪调试,通常的编程缺陷便出现了,如下所示:
1. 由于线程太多而导致效率低下。
2. 死锁——线程一直在等待某些而不能进行处理。
3. 竞争状况- 代码运行的时序没有被正确管理,在需要数据时,数据不是没有准备好就是已经被覆盖掉了。
4. 存储器冲突——与代码中存储器管理相关的问题。
由于使用C语言进行开发面临的这些挑战,LabVIEW程序员们可以获得比以往更高的效率。
LabVIEW是利用实时SMP支持,处于“Multicore Ready”软件层的最上层Intel公司定义了用户需要评估的四个软件层次来确定多核系统的可用程度。如果所用的应用程序库和设备驱动不是为多核而设计的,或者操作系统不能够在多个核心上进行负载均衡,那么并行程序在多核心系统上并不会运行得更快。