安卓系統應用程式純命令列編譯環境_第三個C程式neonTest.c
專案中的安卓APP不僅需要C語言來提高速度,還需要 NEON 指令進一步提高RemoteFX的解碼速度,本筆記記錄了安卓系統下C程式如何使用 NEON 指令。
-
新建neonTest.c,內容如下:
注意要包含標頭檔案 "arm_neon.h" 。
關於 NEON 的用法,不在本筆記範圍,後續抽時間系統滴整理一下。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <arm_neon.h> //neon指令運算 void simd(unsigned short *output, unsigned short *input, int num){ while(num >= 8){ vst1q_u16(output, vshrq_n_u16(vmulq_n_u16(vshrq_n_u16(vmulq_n_u16(vld1q_u16(input), 17), 1), 19), 1)); output += 8; input += 8; num -= 8; } while(num > 0){ *output = ((((*input * 17) >> 1) * 19) >> 1); output += 1; input += 1; num -= 1; } } //非neon指令運算 void sisd(unsigned short *output, unsigned short *input, int num){ while(num > 0){ *output = ((((*input * 17) >> 1) * 19) >> 1); output += 1; input += 1; num -= 1; } } void init(unsigned short *data){ unsigned short i, j; for(i=0; i<100; i++){ for(j=0; j<30; j++){ *data = i+j; data += 1; } } } void dump(unsigned short *data){ unsigned short i, j; for(i=0; i<100; i++){ for(j=0; j<30; j++){ printf("%5d", *data); data += 1; } putchar('\n'); } } int main(int argc, char* argv[]){ if(argc < 3) return 0; unsigned short buffer1[3000]; unsigned short buffer2[3000]; init(buffer1); if(strcmp(argv[1], "simd") == 0){ int n = atoi(argv[2]); while(n-- > 0) simd(buffer2, buffer1, 3000); } else if(strcmp(argv[1], "sisd") == 0){ int n = atoi(argv[2]); while(n-- > 0) sisd(buffer2, buffer1, 3000); } if(argc >= 4){ dump(buffer1); putchar('\n'); dump(buffer2); } return 0; }
這個neon測試程式,根據第一個引數選擇是用 NEON 指令還是非NEON指令來對3000個數做簡單的乘法運算和移位運算,並根據第二個引數來決定這樣的運算做多少遍。使用time命令來執行這個測試程式,根據執行時間粗略比較 NEON 指令的效率。
- 新建Makefile檔案,內容如下:
ARG1=-ID:\Android\ndk64\sysroot\usr\include -ID:\Android\ndk64\sysroot\usr\include\arm-linux-androideabi -Wall -Wno-attributes ARG2=--sysroot=D:\Android\ndk64\platforms\android-19\arch-arm -Wall neonTest.out : neonTest.o arm-linux-androideabi-gcc.exe -o neonTest.out neonTest.o $(ARG2) neonTest.o : neonTest.c arm-linux-androideabi-gcc.exe -c -o neonTest.o neonTest.c $(ARG1) cls: del neonTest.o del neonTest.out
-
開啟批處理命令列,敲 make 命令編譯:
關於批處理命令列環境變數的配置方法,見 安卓系統應用程式純命令列編譯環境_第一個C程式hello.c 這篇筆記。
-
編輯Makefile,新增編譯選項
-mfloat-abi=softfp -mfpu=neon
並儲存,再次敲 make 命令: -
編譯成功,生成了可執行檔案 neonTest.out :
-
將可執行檔案拷貝到開發板上執行試試:
指令大約用時3.38秒,採用非NEON指令大約用時5.36秒。
記於2019-03-12