Archived: 借助​LabVIEW​应对​多核​编​程​的​挑战

NI does not actively maintain this document.

This content provides support for older products and technology, so you may notice outdated links or obsolete information about operating systems or other relevant products.

概览

本文是
《多核​编​程​基础​白皮书​系列》​的​一部分。

Multicore Programming Fundamentals Whitepaper Series

多核​编​程​基础​白皮书​系列

您​可以​通过​阅读​本文​来​了解​多核​编​程​开发​人员​们​所​面临​的​挑战。​本文​主要​讨论​了​LabVIEW​是​如何​无缝​地​处理​线​程​同步,​以及​图形​化​的​调​试​工具​是​如何​进一步​深入​帮助​工程​师​们​开发​并行​代码​的。

内容

借助​LabVIEW​应对​多核​编​程​的​挑战

本文​列举​了​进行​多核​编​程​的​程序​员​们​所​面临​的​若干​挑战,​并且​着重​介绍​了​美国​国家​仪器​有限公司​LabVIEW 8.5​图形​化​编​程​环境​的​特点,​该​产品​是​NI​公司​为了​使​工程​师、​科学​家​和​图形​化​系统​设计​者​们​能够​更加​容易​地​进行​多核​编​程​而​设计​的。​具体​说​来,​本文​讨论​了​设计​并行​化​应用​程序​构​架、​处理​线​程​同步​和​调​试​多核​程序​等​内容。

多核​技术​的​未来

在​过去​几年,​处理​器​制造​商​们​一直​通过​单纯​地​提高​时钟​频率​来​提高​CPU​性能。​然而​近年​来,​处理​器​技术​的​最新​趋势​则​变为​了​更多​的​核。​也就是说​处理​器​制造​商​们​正在​把​若干​个​CPU​封​装​在​一块​芯​片上。​除了​目前​已经​相对​成熟​的​双​核​与​四​核​处理​器,​Intel​公司​甚至​已​宣称​将​在​五年​内​推出​80​核​的​处理​器!

图​1 – CEO Paul Otellini​展示​了​英特尔​公司​的​80​核​处理​器​原型​(slashgear.com​提供)

似乎​这种​运算​性能​的​无​止境​提升​让​我们​可以​运行​最​复杂​的​应用​程序​——​这​听起来​真是​令人​兴奋。​同时,​利用​这种​性能​的​巨大​提升,​您​可以​想像​一下​现有​的​程序​将​运行​得​多​快!​你​也许会​怀疑​这种​事情​并不​会​这么​简单​吧?​那么​你​猜​对​了,​事实​上​确实​如此。

在​多核​处理​器​上​开发​程序​要​比​在​单​核​处理​器​上​要​困难​得​多。​虽然​多个​应用​程序​可以​方便​地​运行​在​不同​处理​器​上,​但是​程序​员​们​必须​非常​谨慎​地​编写​程序​代码,​以​有效​利用​多核​技术。​这​意味​着,​在​现今​的​多核​处理​器​上​运行​现有​应用​程序,​性能​几乎​不会​得到​提升,​即使​有​性能​提升​也是​很小​的。

开发​并行​化​代码

编写​并行​化​应用​程序​的​首要​挑战​是,​确定​程序​中​哪些​部分​能够​并行​执行,​然后​用​再​实现​程序​的​编码。​我们​将​这些​可以​并行​执行​的​代码​称为线程。​所以,​整个​并行​化​的​应用​程序​也​被​称为多​线​程​应用

对于​传统​的​基于​文本​编​程​的​程序​员​来讲,​他们​需要​在​应用​程序​中​使用​诸如​OpenMP​或​POSIX​等​API,​来​明确​定义​这些​线​程。​这​是​因为​基于​文本​的​编​程​方式​原本是​串​行​执行​的,​所以​要​对​并行​的​多​线​程​代码​予以​形象​的​表述​是​十分​困难​的。​另一方面,​利用​NI LabVIEW​的​图形​化​特点,​程序​员​们​可以​很​容易​地​编写​和​表述​并行​程序​代码。​不仅​如此,​LabVIEW​还​可以​为​代码​中的​并行​部分​自动​生成​线​程,​这个​优点​可以​很好​地​帮助​相对​缺少​或者​没有​编​程​背景​的​工程​师​和​科学​家​们​将​更多​时间​用​在​解决​实际​问题​中,​而无​需​关注​应用​程序​的​底层​实现。

图​2 — LabVIEW​和​基于​文本​语言​的​多​线​程​编​程​对比

线​程​同步

其次,​多核​编​程​的​第二个​挑战​就是​线​程​同步。​当​某​个​应用​程序​中有​成百上千​个​线​程​在​运行​时,​我们​必须​确保​所有​线​程​都​能够​协调​地​工作。​例如 ,​如果​两​个​或​两​个​以上​的​线​程​在​同一​时间​企图​访问​同​一个​内存​地址,​那么​将会​发生​数据​冲突。​显然,​在​应用​程序​中​识别​可能​产生​冲突​的​代码​是​一项​艰巨​的​任务。

但是,​通过​在​LabVIEW​中​以​图形​化​的​方式​创建​程序​框​图,​用户​可以​迅速​展开​具体​工作,​并​实现​自己​的​构想,​而无​需​考虑​线​程​同步。​图​2​给​出​的​LabVIEW​程序​中,​两​个​并行​化​的​图形​代码​段​在​写​入​文件​时​都​需要​访问​硬盘,​而​LabVIEW​可以​自动​地​处理​这​两​个​线​程​的​同步。

图​3 — LabVIEW​中的​自动​线​程​同步​功能​的​简单​展示

调试

大​多数​的​程序​在​第一次​运行​时​都​无法​按照​开发​者​所​想​地​来​运行​的。​这种​情况​无论​对于​基于​单​核​还是​多核​编写​的​应用​程序​来说​都是​一样。​为了​在​逻辑​上​确定​代码​段​中的​功能​性​错误,​用户​必须​在​开发​环境​中​利用​有效​的​调​试​工具​来​确保​应用​程序​执行​正确。

对于​多核​程序​来说,​调​试​必然​带来​了​更大​的​挑战:​您​不仅​需要​同时​跟踪​多段​代码​的​运行,​同时​还​需要​确定​每段​代码​在​哪个​核​上​运行。​除此以外,​如果​您​经常​编写​多​线​程​应用​程序,​你​还​需要​处理​线​程​交换​和​线​程​饥饿​等​问题,​这些​都是​需要​在​调​试​阶段​确定​的。

LabVIEW​中​则​包含​了​若干​可以​极大​简化​多核​程序​调​试​复杂​性的​特性。​具体​而言,​您​可以​利用​高亮​化​执行​工具,​将​程序​并行​化​执行​的​过程​快速​而​简单​地​以​图形​化​的​方式​进行​显示​(这​是​由于​LabVIEW​本质​上​是​基于​数据​流​的)。​例如​图​3​中的​简单​应用​程序,​在​打开​高亮​化​执行​功能​后,​您​可以​容易​地​将​并行​代码​的​执行​过程​以​图形​化​的​方式​显示​出来。

图​4 — 在​LabVIEW​开发​环境​中​对​代码​运行​进行​图形​化​高亮​执行

此外,​LabVIEW 实​时​模​块​同时​还​提供​了​在​多核​处理​器​上​进行​确定​性​执行​的​能力​以及​更​细致​的​调​试​功能。​作为​LabVIEW​的​新​成员,​Real-​Time Execution Trace Toolkit​允许​程序​员​们​以​图形​化​的​方式​显示​指定​线​程​是在​哪个​核​上​运行​的,​从而​迅速​确定​线​程​饥饿​和​交换​等​问题。

图​5  LabVIEW 8.5​执行​跟踪​工具包

总结

总而言之,​熟悉​多核​处理​器​编​程​的​程序​员​们​需要​考虑​多​线​程​所​特有的​挑战,​包括​(并行​化​应用​程序​的​构​架、​线​程​同步​与​调​试​等等。​相信​随着​芯​片上​处理​器​核​数​的​不断​增加,​在​多​线​程​应用​程序​中​使用​正确​的​并行​编​程​技术​将​变得​越来越​重要。