안드로이드(Android) NDK와 VFP

VFP란?

VFP(Vector Floating Point)는 ARM 에서 IEEE 부동 소수점 연산 표준(ANSI/IEEE Std 754-1985 Standard for Binary Floating-Point Arithmetic) 을 만족하는 단정도(single-precision)와 배정도(double-precision) 부동 소수점 연산을 제공하는 보조 연산장치다. Vector 라는 단어에도 불구하고 진정한 SIMD(Single Instruction Multiple Data)를 제공한다고 보기는 힘들지만, ARM 에서 제법 실수 연산의 성능 향상에 기여하고 있다.

VFP의 작동 방식은?

VFP가 지원되는 CPU는 기본 ARM명령어 외에 별도의 부동 소수점 연산 명령어들을 처리할 수 있다. 이 추가의 명령어들을 VFP 명령어 집합(VFP Instruction Set)이라고 부른다. 이 명령어들이 포함된 프로그램을 만들면 VFP가 사용되고 실수 연산의 성능이 개선된다. 만약 VFP 명령어를 포함한 프로그램을 VFP를 지원하지 않는 CPU에서 실행하려고 시도한다면 CPU는 처리하지 못하고 에러를 낼 것이다. 물론 VFP 의 명령어를 사용하지 않는 프로그램을 만들 수도 있다. VFP없이도 실수 연산을 하는 프로그램을 만드는 것은 얼마든지 가능한데, 이렇게 만들어진 프로그램은 VFP의 존재여부와 관계없이 실행된다. 다만 VFP가 있는 CPU에서도 성능 개선이 이루어지지 않는다는 문제가 있다.

VFP를 사용하는 방법은?

VFP를 지원하는 CPU가 있고, 리눅스 커널의 CONFIG_VFP 옵션을 활성화 했다면 VFP명령어를 사용하는 프로그램을 실행시킬 수 있다. VFP 명령어를 사용하는 프로그램을 만들기 위해서는 적절한 컴파일 옵션을 제공해야 한다. 다양한 선택이 있을 수 있지만, 생략하고 가장 자주 쓰는 두 가지 경우만을 제시하겠다. 지금부터 언급하는 컴파일러는 GCC다.

VFP를 사용하지 않는 경우 –msoft-float 옵션을 제공한다.

VFP를 사용하는 경우 –marm –mfpu=vfp –mfloat-abi=softfp 옵션을 제공한다.

-marm 옵션을 제공한 이유는 Thumb 코드에서는 VFP를 사용할 수 없기 때문이다. –marm 옵션을 주지 않아도 컴파일러가 알아서 –marm을 적용시킬지도 모르겠다. 그냥 확실히 해 두기 위해 지정했다.

안드로이드(Android) NDK에서 VFP를 사용하지 말아야 하는 이유.

하지만 안드로이드(Android) NDK에서 VFP를 충분히 활용하기에는 곤란한 점이 있다. 안드로이드가 표준으로 삼은 ARM Architecture 는 ARMv5TE 다. 이 Architecture 는 VFP 이전의 Architecture 이기 때문에 모든 안드로이드 기기에서 VFP가 존재한다고 볼 수 없다. 실재로 최초의 안드로이드 전화기인 HTC G1 은 VFP를 지원하지 않고 있다. 이 문제는 에뮬레이터가 현재 VFP를 지원하고 있기 때문에 약간의 혼란을 야기하고 있는 듯이 보인다. 하지만 원칙대로 하자면 안드로이드는 VFP를 지원하지 않는다. 때문에 NDK의 빌드 시스템은 항상 –msoft-float 옵션을 적용하고 있다. 만약 이를 무시하고 –mfpu=vfp –mfloat-abi=softfp 옵션을 강제 적용하여 VFP를 사용하는 프로그램을 만들어 안드로이드 마켓에 등록한다면, HTC G1 사용자들은 쓸 수 없는 프로그램을 배포하게 된다. 확인하지는 않았지만 내가 구글이라면 이런 프로그램은 마켓에 등록되지 않도록 하겠다.

android-gcc 도 -msoft-float 옵션을 적용하고 있습니다.

안드로이드(Android) PDK에서는 VFP를 사용합니다.

그러면 안드로이드는 VFP의 혜택을 누릴 수 없는 것일까? 그렇지는 않다. 지금까지 VFP의 사용이 적절하지 않다고 말한 것은 NDK에만 적용되는 것일 뿐이다. NDK사용자는 다양한 안드로이드 플랫폼에 호환되는 프로그램을 만들어야 할 필요를 갖고 있다. 하지만 이제 당신이 안드로이드 마켓에 올릴 앱을 만드는 개발자가 아니라 HTC의 직원이라고 가정해보자. 이제 곧 출시할 새 모델은 VFP를 지원하는 좀 더 성능 좋은 CPU를 사용한다. 안드로이드 2.1을 올리려고 하고, 여기에는 OpenGL ES 2.0 이 올라갈 것이다. 가능한 최고의 성능을 끌어내야 한다. 여러분이 시스템 라이브러리를 만들 때 VFP를 사용하지 말아야 할 아무런 이유가 없다. 이 프로그램들은 마켓에 올라갈 프로그램이 아니라, 여러분이 만드는 플랫폼 한 곳에서만 동작할 시스템 소프트웨어이기 때문에, VFP뿐만 아니라 시스템이 허락하는 무슨 짓이든 해도 무방하다. 심지어 달빅(Dalvik)도 VFP를 사용하도록 최적화해야 한다.

이렇게 된다면 VFP의 성능 개선 정도에 따라, C보다 Java로 만든 앱의 성능이 더 높아지는 것이, 이론적으로는 가능해진다. 앱은 호환성을 추구하고, 플랫폼은 성능을 추구하는 과정에서 발생할 수 있는 역설이다.

이상 안드로이드에서의 VFP의 역할에 대해 간단히 정리해보았습니다. 몇 가지 질문을 받다 보니 이 문제가 약간의 혼란을 야기하고 있는듯해서 짚고 넘어가기로 합니다.

관련 포스트:

5 comments to 안드로이드(Android) NDK와 VFP

  • tkhwang의 생각…

    안드로이드(Android) NDK와 VFP. General S/W 입장에서는 무조건 VFP 써서 성능 좋게 하면, 이를 지원 못하는 H/W 에서는 문제가 될 수 있겠군요. 그동안 embedded의 시각을 좀더 generalize 할 필요가 있겠네….

  • 반갑습니다.
    도저히 어쩔 수 없는 경우에는, 특정 하드웨어 에서만 동작한다고 미리 못을 박고, 이 조건을 만족하지 못하는 장치로는 배포되지 않도록 마켓이 보장해줄 필요가 있을겁니다. 어느 정도의 시장의 프래그멘테이션은 피할 수 없지 싶습니다. 아이폰도 이제 신모델인 3GS에서만 동작하는 앱들이 있습니다.

  • bobby.choi

    덕분에 좋은 글들을 많이 접하는것 같아 너무 기쁩니다. 현업에서 안드로이드를 개발하고 있는데요
    올리신 글에 의문이 있어 커맨트를 달아봅니다. 오래되서 보실려나 모르겠네요.
    –mfpu=vfp –mfloat-abi=softfp 의 옵션을 사용하여 특정 어플을 돌려보았습니다. opgl 1.1기반으로 해서 3D객체를 운용하는 어플인데 HTC의 G1과 G2에 각각 올려보았습니다만 별다른 문제는 없던데 혹시 야기될만한 부분이 예상 가능한지요?

  • 제 주장이 맞다면 HTC G1 에서는 해당 옵션으로 컴파일된 실수 관련 함수들이 정상동작하지 않아야 합니다. 하지만 bobby.choi 의 실험에 의하면 그렇지 않다는 것이지요? 저 역시 HTC G1 으로 직접 실험해 보고 VFP 지원 여부를 확인해 보기 전에는 다른 대답을 드릴 수가 없겠네요. 그래서 오늘 지인에게 G1 폰 대여를 부탁해 뒀습니다. 구해지는데로 실험해보고 다시 알려드리겠습니다. 혹 직접 빌려주시면 더 빨리 확인해 볼 수 있지 않을까 하는데요.
    감사합니다.

  • bobby.choi

    빠른 답변 감사드립니다.
    개인적으로 사용하는 폰이라면 빌려드려도 무방할것 같습니다만 팀원들이 사용하는 폰이라
    좀 대여는 좀 힘들듯 합니다. 이해해주시구요.
    바쁘실텐데 괜한 커맨트를 단게 아닌지 염려가되네요.
    수고하세요.

Leave a Reply

 

 

 

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>