QNAP NAS

QNAP online resources collection

Image
QNAP is the famous private cloud solution provider, the main product is NAS (Network attach Storage), this article collect QNAP online resources and help QNAPer / NAS beginner quickly know how to select NAS and find application information, if any suggestion website, welcome to comment and share with us. QNAP website  https://www.qnap.com/en/ Topic include NAS, Operation System, Application, Tutorial / FAQ , Forum and Customer Service.

基於Intel架構開發和最佳化Android應用程式

摘要
本文主要介紹如何在Intel Atom架構下開發和最佳化Android應用程式,如何開發和移植Android NDK應用程式,以及如何透過程式碼階段和編譯階段來最佳化NDK應用程式。

目錄
1. Android* 應用程式的分類
2. Android* 本機開發套件(NDK)介紹
3. 為Intel架構開發和移植NDK應用程式
4. 本機程式碼(Native Code)開發注意點
5. 通用效能最佳化
6. 總結



Android* 應用程序的分類 :
Android應用程式大致可以分為兩類:
一類是Dalvik應用程式,這類應用程式只包含 Java程式碼和必要的xml,png等檔案,呼叫Android官方SDK的API,最後透過編譯成為APK檔案。
另一類應用是NDK應用程式,這類應用不僅包含Java程式碼和必要的xml,png等檔案,還包含本機程式碼(.h, .c, .cc, )甚至還包括組合語言程式碼。所有本機程式碼通過Makefile編譯為動態函式庫(so文件),Java端通過JNI機制去呼叫動態函式庫。
其原理如下圖所示:
Android* 本機開發套件介紹
NDK的全名為本機開發套件(Native Development Kit),一般來說會在以下兩個場合中使用到:
1. 構建高效能需求的部分。如音視訊的編解碼,圖形圖像的處理,會使用C或者組合語言程式碼。因為Java程式碼的執行需要虛擬機去解譯,而本機程式碼則直接編譯成二進位碼,在需要高效能的地方,執行起來更加快速。
2. 重用已有程式碼。對於已有的C,C++函式庫,可以透過NDK的機制來呼叫已有的函式庫。
對於相應的應用程式開發,Intel 提供了硬體加速管理器,可以顯著提升應用程式開發過程中使用Android模擬器的性能。具體可以訪問網址: /en-us/articles/intel-hardware-accelerated-execution-manager獲取關於硬體加速管理器的更多內容

Intel Atom 架構開發和最佳化NDK 應用
NDK應用程式的開發可以分為以下五個步驟:
開發相容於Intel架構的NDK應用程式需要在第二步編寫MakeFile的時候添加APP_ABI := x86 選項。
對於已有的NDK應用程式向Intel Atom架構移植需要遵循以下步驟:
1. 如果是Dalvik應用程式,可以直接在Intel架構上運行。只需要為相應的設備調整分辨率即可。
2. 如果是NDK應用程式,如果僅包含C,C++程式碼,使用上面的方法重新編譯本機程式碼,產生給Intel平台的動態函式庫即可。如果本機程式碼中還使用了第三方的動態函式庫,則第三方動態函式庫也需要重編譯一個x86平台的版本。如果包含了組合語言等和硬體相依的程式碼,這部分程式碼需要重新編寫。

本機程式碼開發注意點
強制記憶體對齊
由於平台差異,如果不進行強制記憶體對齊,在其他平台設備中將資料寫入一個檔案,在x86平台下載入會出現大小不一致導致載入錯誤的情況。如下面一個資料結構testStruct:
 struct TestStruct 
{ 
    int mVar1; 
    long long mVar2; 
    int mVar3; 
};
在ARM平台和Intel平台編譯後,大小如下圖:ARM平台會自動採用double malign的方式,佔用24個位元組,而x86平台佔用16個位元組。
如果我們編譯時加入強制對齊參數:-malign-double 則佔用相同大小的位元組,不會出現載入錯誤的情況。
將NEON 指令集(ARM*) 移植至SSE 指令集(Intel)
組合語言程式碼部分需要注意平台差異,比如高位元組順序(Big-Endian)和低位組順序(Little-Endian)問題;
對於暫存器的操作,需要注意對應暫存器的大小限制,具體可以查表;
NEON指令集提供了一些本機的C函式庫,這部分程式碼雖然是C寫成的,但是在 Intel® 凌動™平台是不能運行的,需要重新編寫。

通用效能最佳化
在本機程式碼編寫階段,盡可能將短小但經常呼叫的函數寫成行內函數(Inline Function),可以減少函數呼叫的開銷。使用float型別來代替double可以充分使用Atom硬體浮點數預算的功能。使用多執行緒程式設計以充分利用 Intel® 凌動™晶片的超線程性能。關於多執行緒程式設計可以參考:: http://www.intel.com/content/www/us/en/architecture-and-technology/hyper-threading/hyper-threading-technology.html
在編譯階段可以透過添加合適的Gcc編譯參數來最佳化NDK應用程式。在Atom平台,可以添加
-march=atom
選項來指定平台。也可以添加特定的指令集,如:
-msse4

總結
1. 大多數的Android* 應用程式可以直接在 Intel 平台運行
•² NDK應用需要重編譯本機程式碼
•² 平台(ARM*, IA) 相關的組合語言程式碼需要進行移植
2. 充分使用 Intel 平台特性可以提升應用程式的效能;
3. 添加平台相關的編譯器參數可以讓GCC編譯出的二元碼效能更好。

Comments

Popular posts from this blog

How to use MongoDB on QNAP NAS ?

How to setup influxDB and Grafana on QNAP NAS ?

How to use PostgreSQL on QNAP NAS ?

QNAP QVR Pro Client user guide

How to setup GPU on QNAP NAS (QTS 4.3.5+)

How to use QNAP IoT solution - QIoT Suite

How to use Home Bridge on QNAP NAS ?

卸任倒數 宏碁突圍再出奇招 不轉型雲端 施振榮:我就是罪人