• <blockquote id="fficu"><optgroup id="fficu"></optgroup></blockquote>

    <table id="fficu"></table>

    <sup id="fficu"></sup>
    <output id="fficu"></output>
    1. ABB
      關(guān)注中國自動(dòng)化產(chǎn)業(yè)發(fā)展的先行者!
      CAIAC 2025
      2025工業(yè)安全大會(huì )
      OICT公益講堂
      當前位置:首頁(yè) >> 案例 >> 案例首頁(yè)

      案例頻道

      如何創(chuàng )建及諧調支持多核的LabVIEW x86客戶(hù)DLL
      • 企業(yè):美國國家儀器(NI)有限公司     領(lǐng)域:運動(dòng)控制與伺服系統     行業(yè):礦業(yè)    
      • 點(diǎn)擊數:1231     發(fā)布時(shí)間:2009-05-20 11:39:58
      • 分享到:

        The Challenge:

        對NI LabVIEW軟件自動(dòng)生成的外部代碼進(jìn)行最優(yōu)化,在x86構架下獲得最大性能,進(jìn)而測量目標系統中DLL性能。

        The Solution:

        在不修改源代碼的條件下,通過(guò)Intel C++ 編譯器在單核PC上實(shí)現2.5 倍提速,通過(guò)編譯器中的各類(lèi)最優(yōu)化選項在雙核PC 上實(shí)現超過(guò)4.5 倍提速。

        "VTune能夠監測許多不同種類(lèi)的構架事件。VTune調諧助手能夠給出如何更好使用這些事件的建議。"

        本應用包括了兩個(gè)組件——用于計算Pi 值的DLL、調用DLL 庫函數的LabVIEW 應用,可將結果顯示在圖形用戶(hù)界面中。

        為計算Pi 值,我們采用了近似綜合技術(shù),需要在單個(gè)循環(huán)中完成數百萬(wàn)次浮點(diǎn)計算。選擇該范例是因為它是CPU 密集型的,并且是可優(yōu)化的應用。如下所示為外部代碼的主循環(huán)結構,CPU的主要計算量是處理CalcSum 函數。

        for(i=0; i<num_steps; i++)
       ?。?BR>  sum = CalcSum(i, sum, step);
       ?。?/P>

        我們的目標是通過(guò)編譯器中的優(yōu)化選項以最快速度完成上述計算。

        應用中有4 個(gè)函數,均包含于獨立源文件中。我們采用不同優(yōu)化開(kāi)關(guān)來(lái)編譯每個(gè)源文件。如圖1 所示。

      表1.應用中的函數

        “即插即用”的Intel C++ 編譯器

        我們采用即插即用的Intel C++ 來(lái)代替Microsoft 編譯器,它可以輕松地集成到現有Microsoft Visual Studio DLL 工程中。更多關(guān)于Intel 編譯器,請訪(fǎng)問(wèn)intel.com/software。

        默認設置

        測量首先以/O2選項創(chuàng )建應用,許多優(yōu)化都是在這個(gè)層面上進(jìn)行的。本文在此不討論其細節問(wèn)題。表2顯示了/O2選項集成的各個(gè)優(yōu)化設置。

      表2./O2 選項中集成的最優(yōu)化列表

        自動(dòng)向量化

        自動(dòng)向量化得益于新一代CPU 中集成的復雜指令集。多數現代CPU構架可擴展支持數據操作及多數據計算。擴展包括支持以單一指令實(shí)現多重計算(單指令多數據流,或稱(chēng)SIMD)。Intel 編譯器能夠分析代碼,并通過(guò)SIMD 指令顯著(zhù)提高代碼的效率。

        本范例中,編譯器通過(guò)\QT 選項生成適合Core 2 構架的代碼,編譯器報告以下創(chuàng )建時(shí)間信息:

        注釋?zhuān)貉h(huán)未作向量化處理

        反匯編生成代碼后可看到編譯器插入了SIMD擴展指令集(SSE)。該指令集的使用直接提升了應用的運行性能,代碼運行速度提高了2倍。

        這類(lèi)優(yōu)化可應用于目前大多數CPU 上,這里我們在Core 2 處理器上運行,當然您也可以在單核或早期CPU 上應用。

        自動(dòng)并行化

        因為采用多核PC,我們會(huì )更感興趣如何通過(guò)\QParallel 選項,讓代碼在兩核上同時(shí)運行,以獲得進(jìn)一步提速。該選項在編譯目標中插入了庫調用。庫調用提供了運行時(shí)所需的控制,使應用中的組件得以并行。

        在首次運行中,編譯器并未顯著(zhù)提高運行性能。通過(guò)開(kāi)啟編譯器的報告功能,可以看到它并未進(jìn)行優(yōu)化。

        注釋?zhuān)貉h(huán)未作并行化處理,循環(huán)無(wú)需并行化

        Intel編譯器要對一段代碼進(jìn)行自動(dòng)并行化時(shí),首先決定是否有值得進(jìn)行并行化的代碼部分。在我們的代碼中由一個(gè)主循環(huán)完成所有工作。編譯器不能確定循環(huán)的重復次數,循環(huán)計數值只有在運行時(shí)得到。于是編譯器采取謹慎選擇,不對循環(huán)進(jìn)行并行化處理。

        我們可以通過(guò)在命令行輸入/Qpar-threshold:n 來(lái)進(jìn)行試探優(yōu)化,這里n 是介于0(總是并行處理)到100(不進(jìn)行并行處理)的數,這個(gè)值決定了試探優(yōu)化的程度。

        輸入/Qpar-threshold:0 后,編譯器對代碼并行化,并輸出報告:

        注釋?zhuān)貉h(huán)已作自動(dòng)并行化處理

        使用該優(yōu)化后,程序的運行速度比默認設置下提高了近2 倍。

        其它優(yōu)化選項

        本范例中,我們關(guān)注自動(dòng)向量化及自動(dòng)并行化。Intel C++ 編譯器利用一系列其它優(yōu)化技術(shù),包括高層優(yōu)化、交叉過(guò)程優(yōu)化、配置向導優(yōu)化、速度優(yōu)化、代碼大小優(yōu)化、快速浮點(diǎn)處理等。

        Intel 編譯器同時(shí)支持OpenMP 這個(gè)基于pragma 的標準,用于實(shí)現應用代碼的并行化。

        測量性能

        本范例中我們采用Win32 API 的定時(shí)函數,并將定時(shí)計算嵌入外部代碼。計算時(shí)間在LabVIEW 應用GUI 中顯示。

        作為備選,我們還可采用LabVIEW的定時(shí)工具,或采用外部工具,如Intel VTune 性能分析器。

        VTune能夠監測許多不同種類(lèi)的構架事件。VTune調諧助手能夠給出如何更好使用這些事件的建議。

        結論

        不同開(kāi)關(guān)的優(yōu)化結果在表3 中列出。我們在雙核PC 上運行,并通過(guò)默認優(yōu)化(/O2)作為基準來(lái)計算提速。

      表3.不同優(yōu)化方式下的速度提高

        在應用自動(dòng)向量化時(shí)可達到2.5倍速,該優(yōu)化專(zhuān)用于非多核處理器,可用于目前多數CPU。

        在應用自動(dòng)并行化后可實(shí)現接近2 倍的提速。結合兩種優(yōu)化更可達到4.6 倍。

        以上結果是在不修改源代碼的前提下實(shí)現的。盡管我們選擇了模擬應用(計算Pi值),但這類(lèi)優(yōu)化技術(shù)能夠用于各類(lèi)實(shí)際應用。從Intel編譯器用戶(hù)反饋中了解到,使用這些優(yōu)化方式可顯著(zhù)提高代碼執行速度。

       

       

      熱點(diǎn)新聞

      推薦產(chǎn)品

      x
      • 在線(xiàn)反饋
      1.我有以下需求:



      2.詳細的需求:
      姓名:
      單位:
      電話(huà):
      郵件:
      欧美精品欧美人与动人物牲交_日韩乱码人妻无码中文_国产私拍大尺度在线视频_亚洲男人综合久久综合天

    2. <blockquote id="fficu"><optgroup id="fficu"></optgroup></blockquote>

      <table id="fficu"></table>

      <sup id="fficu"></sup>
      <output id="fficu"></output>