2012-06-17 6 views
4

기본 코드를 사용하여 Android에서 이미지 압축을 수행하고 있습니다. 여러 가지 이유로 사전 빌드 된 라이브러리를 사용할 수 없습니다.부동 소수점 연산 속도 향상 (Android ARMv6)

android-ndk-profiler를 사용하여 코드를 프로파일 링하여 병목 현상이 놀랍게도 부동 소수점 연산임을 알았습니다! 여기에 프로필 출력입니다 :

Flat profile: 

Each sample counts as 0.01 seconds. 
    % cumulative self    self  total   
time seconds seconds calls ms/call ms/call name  
40.37  0.44  0.44        __addsf3 
11.93  0.57  0.13  7200  0.02  0.03 EncodeBlock 
    6.42  0.64  0.07 535001  0.00  0.00 BitsOut 
    6.42  0.71  0.07        __aeabi_fdiv 
    6.42  0.78  0.07        __gnu_mcount_nc 
    5.50  0.84  0.06        __aeabi_fmul 
    5.50  0.90  0.06        __floatdisf 
    ... 

내가 __addsf3을 봤 분명히 그것은 소프트웨어 부동 소수점 연산입니다. 왝. ARMv6 아키텍처 코어에 대해 더 많은 연구를했는데 뭔가 놓치지 않으면 하드웨어 부동 소수점 지원 기능이 없습니다. 이렇게 속도를 높이려면 어떻게해야합니까? 고정 소수점? 나는 그것이 일반적으로 정수로 끝난다는 것을 알고 있지만, 그렇게하기 위해 코드를 변환하는 방법을 잘 모르겠습니다. 컴파일러 플래그를 설정할 수 있도록 컴파일러 플래그가 있습니까? 다른 제안을 환영합니다.

답변

8

정수 연산만을 사용하여 (물론 지금은 정확히 무엇을하고 있는지) 아무것도 할 수 없지만 더 빨리 수행 할 수 있거나 실제로 무엇을하려고하는지에 따라 달라질 수 있습니다.

플로팅 포인트는 일종의 일반적인 솔루션으로 대부분의 경우 적용 할 수 있지만 잊어 버릴 수 있지만 문제는 실제로 매우 작은 것에서부터 엄청나게 크고 52 비트까지 다양합니다. 가수 정확도. 계산 결과가 배정 밀도 부동 소수점 수를 가진 그래픽에 관한 것이라면 우주의 크기보다 훨씬 작은 원자 크기보다 훨씬 작을 수 있습니다 ... 정말 그 범위가 필요한 것입니까? 물론 제공되는 정확도는 FP와의 척도에 따라 다르지만 실제로 필요한 정확도는 무엇입니까?

"내부 루프"에 사용되는 번호는 무엇입니까? 계산이 훨씬 더 빨라질 수 있는지 없는지를 모른 채 말하기는 어렵습니다. 거의 확실하게 더 빠르게 만들 수 있습니다 (FP는 일반적인 장님 솔루션입니다). 그러나 희망하는 이득의 정도는 많이 다릅니다. 특정 구현을 모르지만 합리적으로 효율적이라고 기대할 수 있습니다 (일반적인 경우).

보다 높은 수준의 최적화를 목표로해야합니다.

DCT 또는 웨이블릿 변환을 기반으로 한 이미지 (de) 압축의 경우 실제로 부동 소수점 연산이 필요하지 않습니다. 숫자의 정확한 비율을 고려하고 정수 연산을 사용할 수 있습니다. 또한 근사한 결과를 산출 할 수있는 능력 때문에 여분의 자유도를 가질 수도 있습니다.

2

먼저 6502의 훌륭한 대답은 ...

대부분의 프로세서들이 필요하지 않기 때문에 FPU를 해달라고을 참조하십시오. 그리고 그들이 어떤 이유로 든 IEEE754를 준수하려고 시도 할 때도 마찬가지로 불필요한 경우가 있습니다. fpu는 부동 소수점을 추적하기위한 몇 가지 요소가있는 정수형 alu입니다.이 모든 것은 사용자가 직접 할 수 있습니다.

어떻게? 우리가 $ 110.50에 대해 생각할 수있는 소수와 달러를 생각해 볼 때 $ 0.07을 추가하고 $ 110.57을 얻거나 1105 + 7 = 11057의 모든 것을 페니로 만들 ​​수 있습니다. 그러면 사용자가 원하는 위치에 점을 찍을 수 있습니다. 그것이 모든 fpu가하고있는 일이며, 그것이 모두 당신이해야 할 일입니다. 이 링크는 이에 대한 통찰력을 제공 할 수도 있고하지 않을 수도 있습니다. http://www.divms.uiowa.edu/~jones/bcd/divide.html

ARM을 분류하는 방식이 아닌 모든 ARMv6 프로세서를 그런 식으로 다루지 마십시오. 일부 코어에는 FPU 옵션이 있거나 ARM 등에서 구입 한 후 직접 추가 할 수 있습니다. ARM11은 예를 들어 fpu 용 옵션이있는 ARMv6입니다.

또한 하드 팩터가있는 경우 소수점을 추적 할 수 있기 때문에 고정 소수점으로 직접 수행하는 것보다 빠를 수 있습니다. 마찬가지로 fpu를 사용하고 나쁜 결과를 얻는 방법을 알지 못해 쉽고 빠르게 가져올 수 있습니다. 아주 쉬운 부동 소수점 코드를 작성합니다. 고정 또는 부동을 사용하든간에 정수의 범위를 추적하고 포인트를 움직이는 위치에서 가수 내의 핵심 부분에 정수 계산을 유지해야합니다. 즉, 부동 소수점을 효과적으로 사용한다는 것은 정수 수학이 무엇을하는지에 관해 생각해야한다는 것을 의미합니다. 가장 일반적인 실수 중 하나는 실수로 더 해칠 수있는 덧셈과 뺄셈 일 때 정확도를 배가시키는 것이라고 생각하는 것입니다.