블로그 이미지
HISONA

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함

calendar

1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30



안녕하세요?

이번 포스트에서는 Android Emulator 소스를 수정하여 Floating Point 연산 속도를 개선해 보도록 하겠습니다. Android OpenGL ES Issue Report 에 보시면 Android Emulator 에서 OpenGL 연산속도가 문제가 되고 있는것 같습니다. Android Emulator 에 포함된 OpenGL ES 는 소프트웨어 방식의 OpenGL ES 1.5 가 사용되고 있습니다.
그러므로, OpenGL 3D 를 구현하기 위해서는 Matrix 연산이 많이 사용되는데, Floating Point 연산속도가 개선되면 3D 의 연산 속도를 높일 수 있을 것입니다.

Floating Point 연산 속도 개선을 위해서는 몇가지 작업을 해주어야 합니다. 

첫째, Android Emulator 의 fpu 소스코드에서는, softfloat.c 를 사용하도록 되어 있습니다. 속도를 개선하기 위해서는 softfloat-native.c 를 사용하여야 합니다. 그러나, Android Emulator 에 포함되어 있는 softfloat-native.c 파일에는 몇가지 버그가 있습니다. 아래 파일은 Patch 된 파일입니다. 이 파일들을 받아서 android-emulator-1.0_r2\android-emulator-20081210\qemu\fpu 에 있는 파일들을 변경하십시오.

 
그리고, 몇몇 파일들을 수정해 주어야 합니다.

1) android-emulator-1.0_r2\android-emulator-20081210\qemu\android\config\config.h 파일에서 다음과 같이 수정하십시오(CONFIG_SOFTFLOAT 을 undefine 하십시오.) 

//#define CONFIG_SOFTFLOAT 1
#undef CONFIG_SOFTFLOAT

2) android-emulator-1.0_r2\android-emulator-20081210\qemu\Makefile.android 에서 softfloat.c 파일을 softfloat-native.c 로 수정합니다.

line 170:
FPU_SOURCES := softfloat-native.c

line 250:
FPU_SOURCES := softfloat-native.c

3) android-emulator-1.0_r2\android-emulator-20081210\qemu 에서 make 하시면, objs 디렉토리에 emulator.exe 가 생성됩니다. 컴파일한 실행파일은 아래에 있습니다.



둘째, linux kernel config(.config) 파일에서, CONFIG_VFP=y 로 설정되어 있어야 합니다. 다행이 Android 에서 사용하는 linux kernel 에서는 아래와 같이 VFP 를 사용하도록 설정되어 있습니다. 



세째, linux 어플리케이션 프로그램을 컴파일 할때 컴파일 옵션에,  "-mfpu=vfp -mfloat-abi=softfp"
를 포함해서 컴파일 해야 합니다. 즉, Dalvik VM 이나 OpenGL ES 를 사용하는 라이브러리들이 이 옵션으로 컴파일 되어야 합니다. 저는 아직 Dalvik VM 을 컴파일 해보지 않았기 때문에 이 부분은 다른분들께 맡기도록 하겠습니다.

대신 샘플 어플리케이션으로 테스트 결과를 보여드리도록 하겠습니다.

테스트에 사용한 샘플코드는 간단하게 float 변수 사칙연산을 각각 1,000,000 번 수행한 시간을 측정한 것입니다.
테스트 프로그램을 컴파일 하는데는 Codesourcery G++ Lite 208q1-126 for ARM GNU/Linux 를 사용하였습니다. 그리고, Android Emulator 는 libc 를 사용하지 않기 때문에, 라이브러리를 static link 하였습니다.
아래 첨부파일에 테스트에 사용한 소스코드와 실행파일이 포함되어 있습니다.  
 



float_vfp 는  "-mfpu=vfp -mfloat-abi=softfp" 옵션을 포함해서 컴파일한 실행파일입니다. float_nofp 는 옵션없이 컴파일한 파일입니다.   

테스트에 사용한 컴퓨터 사양은, 다음과 같습니다.

CPU: Intel Core2 6400 2.13GHz
RAM: 2G
OS: Windows XP SP3

1) 수정하지 않은 Android Emulator 에서 테스트한 결과

./float_nofp
add operation => elipse time: 0s, 135414us
sub operation => elipse time: 0s, 202468us
mul operation => elipse time: 0s, 116733us
div operation => elipse time: 0s, 272469us

./float_vfp
add operation => elipse time: 0s, 100574us
sub operation => elipse time: 0s, 115769us
mul operation => elipse time: 0s, 97731us
div operation => elipse time: 0s, 110618us

2) softfloat-native 를 적용한 Android Emulator 에서 테스트한 결과

./float_nofp
add operation => elipse time: 0s, 137863us
sub operation => elipse time: 0s, 201425us
mul operation => elipse time: 0s, 118687us
div operation => elipse time: 0s, 271949us

./float_vfp
add operation => elipse time: 0s, 68719us
sub operation => elipse time: 0s, 67290us
mul operation => elipse time: 0s, 66261us
div operation => elipse time: 0s, 78777us


그러므로, vfp 옵션을 주고 컴파일한 경우에는 거의 2배 정도 성능개선 효과가 있는 것으로 보입니다. 그리고, Android Emulator 에 softfloat-native 를 적용하면 약 30% 정도의 성능이 개선되는것 같군요 ..