ARM Neon coding(Android)

ARM Neon Coding하기(Android / ios)

Image Processing 에서 native 코딩 종류

1. C / C++ 로 작성 : 가장 확실하고 안전함. 하지만 속도 면에서 약간 아쉬움이 남음

2. 병렬 처리 coding
2.1 : Neon intrinsic
- C 와 비슷한 스타일로 개발 가능
- 디버깅의 어려움이 있음.
- C 코드와 실제 데이터 비교하는 과정이 필수임.

2.2 : Assembly
- Assembly 언어로 작성
- 배우기 어려움. 배워도 잘 까먹음 (사람이 이해할 수 있는 언어가 아님ㅡㅡ;)
- 코딩과 디버깅이 상당히 어려움
- 컴파일러 최적화 도움을 받을 수 없어서 Intrinsic 보다 성능이 안 나올 수 있음.

ARM neon coding 참고 사이트
(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0491c/BABDEAGJ.html)

병렬처리- SIMD(Single instruction multi data) 란?

그림1

SISD 와 SIMD 성능 차이
연산 속도는 병렬처리되는 Packing 사이즈에 영향을 받음

그림2

Neon 명령어 간단 이해
명령어에 q 가 붙어 있으면 대부분 128 bit 명령어로 생각하면 된다.

EX )

q : 128 bit register
d : 64 bit register

Build script (Make file) 작성법

// Neon 을 지원하는 모델인지 확인하는 코드. Android 만 필요. 아이폰은 필요 없음.

Neon feature 구분한 코딩 (Android 예제)

RGB2Gray 컬러 변환 C++

RGB2Gray 컬러 변환 (Neon intrinsic)

RGB2Gray 컬러 변환 (Assembly )

Header fiile : Rgb2Gray.neon.h

RGB2Gray 컬러 변환 (Assembly )

Soruce File : Rgb2Gray.neon.S

RGB2Gray 컬러 변환 추적 결과 (C++)

그림3

RGB2Gray 컬러 변환 추적 결과 (Neon intrinsic)

그림4

한 프레임 Tracking 에 소모되는 전체 시간은 C++ 이 평균 20.5ms, neon intrinsic 이 13.3ms 임. rgb2gray 부분에서 6ms 차이라면 상당히 큰 시간이 절약되는 것임.

RGB2Gray 컬러 변환 추적 결과 (Neon assembly)

그림5

평균 : 16ms -> intrinsic 보다 느림. 웬만한 assembly 보다 컴파일러의 최적화 도움을 받는 intrinsic 이 낫다!!

테스트 폰의 배터리, 발열 상태에 따라 결과가 달라질 수도 있음 ㅡㅡ;;

Neon intrinsic code compile code

안드로이드에서 내가 짠 코드를 빌드할 때 assembly 형태로 보고 싶다면

Android.mk 에 LOCAL_CFLAGS +=-save-temps 로 선언하고 빌드.

일단 전체 빌드 후 원하는 파일만 touch 후 다시 컴파일 하면 해당 파일에 대한 중간 파일만 생성 된다.

https://drive.google.com/a/maxst.com/file/d/0B7nPFYmX0CA7ZEVuVWZWNm5LVTg/edit?usp=sharing