如何創建及諧調支持多核的LabVIEW x86客戶DLL
|
|
The Challenge: 對NI LabVIEW軟件自動生成的外部代碼進行最優化,在x86構架下獲得最大性能,進而測量目標係統中DLL性能。 The Solution: 在不修改源代碼的條件下,通過Intel C++ 編譯器在單核PC上實現2.5 倍提速,通過編譯器中的各類最優化選項在雙核PC 上實現超過4.5 倍提速。 "VTune能夠監測許多不同種類的構架事件。VTune調諧助手能夠給出如何更好使用這些事件的建議。" 本應用包括了兩個組件――用於計算Pi 值的DLL、調用DLL 庫函數的LabVIEW 應用,可將結果顯示在圖形用戶界麵中。 為計算Pi 值,我們采用了近似綜合技術,需要在單個循環中完成數百萬次浮點計算。選擇該範例是因為它是CPU 密集型的,並且是可優化的應用。如下所示為外部代碼的主循環結構,CPU的主要計算量是處理CalcSum 函數。 for(i=0; i{ sum = CalcSum(i, sum, step); } 我們的目標是通過編譯器中的優化選項以最快速度完成上述計算。 應用中有4 個函數,均包含於獨立源文件中。我們采用不同優化開關來編譯每個源文件。如圖1 所示。
 表1.應用中的函數 “即插即用”的Intel C++ 編譯器 我們采用即插即用的Intel C++ 來代替Microsoft 編譯器,它可以輕鬆地集成到現有Microsoft Visual Studio DLL 工程中。更多關於Intel 編譯器,請訪問intel.com/software。 默認設置 測量首先以/O2選項創建應用,許多優化都是在這個層麵上進行的。本文在此不討論其細節問題。表2顯示了/O2選項集成的各個優化設置。
 表2./O2 選項中集成的最優化列表 自動向量化 自動向量化得益於新一代CPU 中集成的複雜指令集。多數現代CPU構架可擴展支持數據操作及多數據計算。擴展包括支持以單一指令實現多重計算(單指令多數據流,或稱SIMD)。Intel 編譯器能夠分析代碼,並通過SIMD 指令顯著提高代碼的效率。 本範例中,編譯器通過\QT 選項生成適合Core 2 構架的代碼,編譯器報告以下創建時間信息: 注釋:循環未作向量化處理 反彙編生成代碼後可看到編譯器插入了SIMD擴展指令集(SSE)。該指令集的使用直接提升了應用的運行性能,代碼運行速度提高了2倍。 這類優化可應用於目前大多數CPU 上,這裏我們在Core 2 處理器上運行,當然您也可以在單核或早期CPU 上應用。 自動並行化 因為采用多核PC,我們會更感興趣如何通過\QParallel 選xuan項xiang,讓rang代dai碼ma在zai兩liang核he上shang同tong時shi運yun行xing,以yi獲huo得de進jin一yi步bu提ti速su。該gai選xuan項xiang在zai編bian譯yi目mu標biao中zhong插cha入ru了le庫ku調tiao用yong。庫ku調tiao用yong提ti供gong了le運yun行xing時shi所suo需xu的de控kong製zhi,使shi應ying用yong中zhong的de組zu件jian得de以yi並bing行xing。 在首次運行中,編譯器並未顯著提高運行性能。通過開啟編譯器的報告功能,可以看到它並未進行優化。 注釋:循環未作並行化處理,循環無需並行化 Intelbianyiqiyaoduiyiduandaimajinxingzidongbingxinghuashi,shouxianjuedingshifouyouzhidejinxingbingxinghuadedaimabufen。zaiwomendedaimazhongyouyigezhuxunhuanwanchengsuoyougongzuo。bianyiqibunengquedingxunhuandezhongfucishu,xunhuanjishuzhizhiyouzaiyunxingshidedao。yushibianyiqicaiqujinshenxuanze,buduixunhuanjinxingbingxinghuachuli。 我們可以通過在命令行輸入/Qpar-threshold:n 來進行試探優化,這裏n 是介於0(總是並行處理)到100(不進行並行處理)的數,這個值決定了試探優化的程度。 輸入/Qpar-threshold:0 後,編譯器對代碼並行化,並輸出報告: 注釋:循環已作自動並行化處理 使用該優化後,程序的運行速度比默認設置下提高了近2 倍。 其它優化選項 本範例中,我們關注自動向量化及自動並行化。Intel C++ 編譯器利用一係列其它優化技術,包括高層優化、交叉過程優化、配置向導優化、速度優化、代碼大小優化、快速浮點處理等。 Intel 編譯器同時支持OpenMP 這個基於pragma 的標準,用於實現應用代碼的並行化。 測量性能 本範例中我們采用Win32 API 的定時函數,並將定時計算嵌入外部代碼。計算時間在LabVIEW 應用GUI 中顯示。 作為備選,我們還可采用LabVIEW的定時工具,或采用外部工具,如Intel VTune 性能分析器。 VTune能夠監測許多不同種類的構架事件。VTune調諧助手能夠給出如何更好使用這些事件的建議。 結論 不同開關的優化結果在表3 中列出。我們在雙核PC 上運行,並通過默認優化(/O2)作為基準來計算提速。
 表3.不同優化方式下的速度提高 在應用自動向量化時可達到2.5倍速,該優化專用於非多核處理器,可用於目前多數CPU。 在應用自動並行化後可實現接近2 倍的提速。結合兩種優化更可達到4.6 倍。 以上結果是在不修改源代碼的前提下實現的。盡管我們選擇了模擬應用(計算Pi值),但這類優化技術能夠用於各類實際應用。從Intel編譯器用戶反饋中了解到,使用這些優化方式可顯著提高代碼執行速度。
如果您有任何問題,請留言給NI工程師,我們會盡快給您回電!
|
|
|