2013年11月4日 星期一

[原創] Convert LabVIEW code to x86 assembly code Introduction

從NI Community看了一篇有趣的文章
 LabVIEW code generation - behind the scenes...

這篇文章解釋了LabVIEW運行時會先把圖形化程式轉成x86 asm , 中間不會生成c code,不管是debug/release run都是直接由compiler編譯labview code轉成 x86 machine code , 因此不會受到c code compiler影響, NI只要專注在 Labview compiler的優化即可.

參考該文章範例進行實作,實作環境為 LabVIEW 2013 (32-bit) , Windows 8 (x 64) , i3-2100CPU@3.10GHz

考慮以下兩個程式碼,簡單的for loop 迴圈,shift register,加法運算, 僅改變部分初始值然後看看labview compiler 轉 machine code程式碼的差異




PS.為了簡化asm code長度 , vi的設定為取消debugging (如下圖所示)

轉為binary後 ,由hex檔直接比對,很容易就可以看出初始值差異的位置,
如左邊的F4 01即是0x1F4 , 迴圈跑500次的常數,shift register的初始值255,回圈內累加常數0x5F等





人眼看machine code絕對痛苦萬分,透過免費版IDA pro , deassembly machine code成asm code,可以幫助了解 labview compiler 執行效能 ,


 因為我也不熟 x86 asm , 上圖是我猜測的迴圈執行流程 , 中間穿插其他程式我猜可能數值型態的檢查

跑過以上流程後隱約可以感覺labview程式實際執行的流程,大概就可以解釋開發labview時遇到的以下幾個現象(不保證正確)

Q1. 不同版本 vi或相同版本vi轉到其他電腦上時,vi畫面右上角會出現 * 號要求存檔
A1. LabVIEW compiler 會檢查編譯環境,若發現需要重新編譯則會建議使用者執行前先存檔進行編譯.

Q2.新版LabVIEW跑舊版程式時,理論上新版經過優化執行速度會增加,執行時間會減少,但若沒有重新存檔則執行時間差異不大,存檔完才會有較大差異.
A2. 新版開舊版檔案時, .vi內的machine code若沒經過重新編譯,在machine code不變的情況下執行效能當然一樣.

未來幾篇文章會用這個方式將LabVIEW code轉 asm , 看看那些coding style可以獲得較佳的執行效率.


沒有留言:

張貼留言