포럼 회원으로 등록하신분만 다운로드가 가능합니다. 최대 업로드 가능한 용량은 1GB 입니다.

네이버 카페에 솜사탕 님이 올리신 글입니다...
도움이 될실꺼 같아서 올립니다.

출처 http://cafe.naver.com/linuxkernel26/9165

///////////////////////////////
출처   블로그 > Neutrino

원문 http://blog.naver.com/neutrino1979/20014139995

출처 : http://simple21.egloos.com/



Fixed Point Coding 첫번째 시간
        
Fixed Point Coding은 프로그래밍을 하는 우리들에게는 뼈가되고 살이 되는 내용이니, 내용이 다소 길더라도 천천히 읽어보고, 궁금한 사항이 있으면 언제든지 과감히 질문을 던지셈.

요즘 모바일에서 얼굴인식 시스템을 개발하고 있다. 아니, 개발을 시작하려고 한다.

동작 시스템은 TI(Texas Instruments)의 OMAP5912 Wireless Developer Tools이다.
OMAP5912 는 OMAP1610과 같은 것으로 192MHz의 ARM9, 32MB RAM, 32MB Flash ROM, RS-232 serial port, 10Mbps Ethernet port, USB port등이 내장된 개발 툴로써 1000만원에 근접한다.
L사에서는 OMAP2420을 이용하고 있는데 이것은 ARM11이 내장되어 있다. 가격은 1600만원 훌쩍 넘는다.

OMAP(Open Multimedia Application Platform)은 내부적으로 ARM9, DSP가 함께 내장되어 있는 칩으로, 영상처리, 카메라 처리, 얼굴인식은 DSP에서 수행하고, 전체 프로그램 흐름제어, 동작은 ARM9에서 수행하도록 해서, 최대한의 성능을 보이려고 한다. 하지만, 아직까지 DSP, ARM에 대한 조금의 개발 경험도 없는 나에게는 매우 벅찬 부담만 느끼고 있다.

먼 저, 혼자만의 생각으로 현재 개발되어 있는 얼굴 검출, 인식 프로그램을 Fixed Point Coding으로 변환을 해야 한다는 생각(현재는 별 필요가 없다는 생각, 하지만 이런 지식을 알아두는 것도 도움이 된다고 생각에 흐믓)에 이에 관련되는 자료, 논문들을 몇 편 살펴보았지만, 아무리해도 궁금한 것이 있어서, 전문가 춘사마(참고)에게 자문을 구하여, 무엇이라는 것을 알게 되었고, 관심 있는 사람들에게 작으나마 공유를 할 수 있는 기회가 되고자 설명을 하고자 한다.

[아래의 내용은 혼자만의 생각일 수도 있습니다. ^.^]
1.Fixed Point Coding의 개념은 어려운가?
기본적인 것은 무지 쉽다. 기본적인 것만으로도 충분할 수 있다.
하지만, 계속 새로운 논문이 나오는 것을 보면 연구할만한 것이 많은 것 같다.

먼저, 간단히 용어를 정리를 하면
Integer Point Coding: byte, short, int, long과 같은 정수형 변수마을 이용한 코드
Floating Point Coding: float, double과 같은 부동소수점 변수를 이용한 코드
Fixed Point Coding: 일단은 Integer Point Coding과 같이 정수형 변수만을 이용한 코드

2.그럼 Integer Point Coding과 Fixed Point Coding은 동일한 것인가?
그렇지 않다.
사실 Integer Point Coding이라는 용어는 본인이 Fixed Point Coding을 쉽게 설명하기위해서 만든 용어이다.

Integer Point Coding은 사용변수의 타입에 중점(정수형 변수만을 사용했는가)
Fixed Point Coding은 사용변수의 타입/변수의 길이(이하부터 resolution으로 표현)에 중점

Fixed Point Coding의 사용변수는 시스템이 지원하는 정수형 변수만 사용
H/W(FPGA, SoC)에서는 resolution이 최소가 되는 것에 중점
S/W(ARM, DSP)에서는 시스템, 프로그램 특성(대부분의 시스템 16bits, 오디오 24bits, Windows, Linux 등 32bits, 요즘 최신 CPU 64bits)에 중점

일단은 같이 정수형 변수만을 이용한다고 생각을 하고, 그 변환방법이 다르다고 생각을 하는 것이 제일 이해하기 쉽겠다. 그 차이는 다음에 나오는 예에서 이해를 하도록 하자.
예) 0.1을 변환하면...
Integer Point Coding은 10을 곱해서 1로 변환된다고 생각을 할 수 있다. 당연하지 않은가?
Fixed Point Coding에서는 2^n을 곱해서 변환. 만일 n이 8이라면 256을 곱하는 것이므로 25로 변환된다고 생각을 하면 된다. 왜 2^n을 곱하는지는 이후에 자세히 설명.

3.Fixed Point Coding이란 무엇인가?
왜 하필 2^n을 곱하여 변환을 하는가? 그러면 문제가 없는가?
일단 대답을 하면, 컴퓨터의 처리가 2진수라 2^n을 곱하는 것이고, 문제는 무지하게 많다.
무슨말이냐?
프 로그램에 사용하는 변수는 정수형, 부동소수형 2가지가 있다고 보면, 이들 모두를 정수형으로 변경을 하기위해서 엄청 큰 수의 10^n을 곱하면 되지, 왜 2^n을 곱하느냐고 의문을 제기하는 사람이 많을 것이다. 이 의문을 이해한다면 Fixed Point Coding 방법은 다 이해를 했다고 말할 수 있다.

생각보다 내용이 길어져서 변환방법에 대한 자세한 설명은
내일 예제코드를 가지고 다시한번 상세히 설명을 하도록 하겠다.


Fixed Point Coding 두번째 시간
        
Fixed Point Coding의 두 번째 시간이다.

먼저 첫 번째 시간에 리플을 달아주신 Y님에게 감사를 드리며,
Y님이 강조를 하신 Fixed Point Coding의 핵심 3가지를 먼저 간단히 설명을 드리면…….

1. Resolution
변 수의 bits 크기를 말하는 것이다. 예를 들면 8bits char 변수는 8 resolution이라 할 수 있다. Fixed Point Coding은 프로그램에서 사용하는 변수들의 resolution을 동일하게 맞추어나가야 한다는 것을 의미한다.

어떻게? 그것은 다음에 예제를 가지고…….

2. Max Diff.
Max Diff.는 Floating Point Coding을 Fixed Point Coding으로 변환하여 계산하는 과정에서 기존 값과의 차이가 생길 수 있는데, 이때의 최대 차이 값을 말하는 것이다.
예 를 들어, float a = 0.1;을 Fixed Point Coding으로 만일 2^6(64)을 곱해서 변경 한다고 하면 int a = Q(0.1); Q(0.1) = 0.1*64=6.4에서 int a는 6이 되고, 이때 0.4는 버려지게 되는데, 이러한 에러 값들이 계산중에 누적이 되면서 차이 값이 발생을 할 수 있다. 물론 다른 연산(shift(>>, <<))에서도 발생할 수 있다.

이러한 Max Diff.를 어떻게 최소한으로 할 것인가를 코드 레벨에서 최적화를 해야 한다.
어떻게 최적화를 하느냐? 그것은 다음에 예제를 가지고…….

3. MIPS[million instructions per second]
컴 퓨터의 성능을 나타내는 지표가 된다. 어떤 처리장치(processor)의 처리속도가 18.5MIPS라면 1초 동안에 1,850만 개의 명령을 실행할 수 있다는 의미이다. 컴퓨터의 성능을 평가하는 정량적인 평가 단위의 하나로, 단위시간에 처리할 수 있는 명령어수로 나타내는 단위에는 MIPS와 FLOPS(floating-point operations per second)가 있다. MIPS는 명령어의 종류에 관계없이 1초당 실행되는 명령어 수만 계산하기 때문에 명령어별 특성을 고려하지 않아 그 신뢰성에 의문이 있을 수 있다. 이에 반해 FLOPS(일반적으로 컴퓨터의 FPU[floating point unit, 부동소수점 처리장치] 성능을 나타낼 때 주로 이용)는 부동 소수점 명령어가 1초에 몇 번 실행될 수 있는가를 나타내는 단위이다. 슈퍼컴퓨터에서는 MIPS보다 FLOPS를 연산속도의 단위로 사용한다.

참고로 펜티엄 133 MHz 프로세서를 이용하면 3차원 그래픽 연산에서 32~36 M FLOPS의 성능을 나타내며, OpenGL을 기반으로 운영하는 그래픽 프로그램을 가속할 수 있는 프리미디어 2 칩셋에는 100 MFLOPS 연산기가 내장되어 있다.

각설하고, resolution을 얼마로 하여 Fixed Point Coding을 하느냐에 따라 MIPS가 변할 수가 있는데, 이때 프로그램을 최적으로 하기위해서는 MIPS도 고려를 해야 한다는 것만 이해하고 있다. 이번에 얼굴인식을 칩으로 구현을 하게 될 것인데, 이때는 이런 것들을 충분히 고려를 할 예정이라서 그때 하게 되면 다시 한 번 자세히 설명을 하도록 하겠다.

Y님의 리플에 맞게 설명이 된 것인지는 모르겠다.
하지만, 내용이 너무 길어져서 실제 Fixed Point Coding의 예제를 가지고 하는 것은 세 번째 시간으로 연기를 해야 할 것 같다.

궁금한 점은 계속 질문을 해주면 감사하겠다.
마지막까지 잘 따라온다면 “아! Fixed Point Coding이 별 것 아니구나”를 알게 될 것이다.


Fixed Point Coding 세번째 시간
        
Fixed Point Coding의 세 번째 시간이다.

1.Fixed Point Coding은 어떻게 하는가?
1.1 보통(Floating point coding)의 프로그램 코드 예제
   int x1 = 3;
   float x2 = 2.472
   float y = x1 * x2;   //y = 7.416

1.2 Fixed point coding
   #define n 10
   //int -> fixed 변경은 shift 연산을 통해 가능하지만,
   //float -> fixed 변경은 데이터구조(부호, 가수, 지수)가 틀리기 때문에 2^n을 곱해서 처리
   #define Qf(x) (x)*pow(2, n)     //pow(2, n) == 2^n
   #define Qi(x) (x) << n            //x * 2^n

   int x1 = Qi(3);
   int x2 = Qf(2.472);
   int y = (x1>>n)*x2;          //x1의 2^n과 x2의 2^n이 곱해지므로 2^2n이 곱해진다.
          //그래서 >>를 이용하여 2^n을 나누어줌으로 해서 y는 2^n만 곱해진 결과를 가진다.

일 단, 위 예제에서와 같이 Floating point coding을 Fixed point coding으로 변경하는 방법은 매우 간단하다. 2^n을 곱해주거나, 나누어주어서(shift 연산, >>, <<) 변경을 한다. 이때 코드의 변화는 별로 크지 않다고 생각된다.(생각하기 나름이겠지만…….)

1.2의 Fixed point coding 알고리즘은
   #define n 10
   #define Qf(x) (x)*pow(2, n) //pow(2, n) == 2^n
   #define Qi(x) (x)<

   int x1 = 3072;
   int x2 = 2531;
   int y = (x1>>n)*x2;
와 같이 compile되어 ARM9, DSP와 같은 Fixed point 시스템에서 동작이 된다.

macro 연산(#define)은 compile 단계에서 대체되기 때문에 function call과 같은 overhead가 없다. 또한, shift 연산은 매우 빠르게 처리가 가능하다. 그래서 잘 작성된 Fixed point coding은 약간의 macro, shift연산(만일 10^n과 같은 값을 곱해서 변경을 한다고 하면, bit 연산자를 사용할 수 없으니, 느리겠지. 그래서 2^n을 이용하여 변경하는 것이다.)에 대한 overhead 대신에, float 연산이 없으므로 더 빠르게 동작할 수도 있다.

n을 어떻게 설정하느냐에 따라 에러 값(최대 에러 값이 Max Diff.)이 변할 수 있다.
매우 큰 값으로 n을 설정하면 계산과정에서 overflow가 발생할 수 있다.
작은 값으로 설정을 한다면 소수점이하의 값의 버림으로 인해 오차가 커질 수 있다.
   n=2: Qf(0.1) => 0
   n=6: Qf(0.1) => 6
   n=10: Qf(0.1) => 102
그 래서 overflow가 발생하지 않는 범위에서 가장 큰 n을 설정하는 것이 Max Difference를 줄이는 방법이 될 수 있다. 이때 n은 해당 시스템의 resolution 허용범위에서 결정을 해야 한다. (만일 16bits resolution 시스템에서 n을 15보다 큰 값으로 설정하는 우를 범하지는 않겠지요.)

또한, int y = (x1>>n)*x2; 계산에서
   int y = (x1>>n)*x2;
   int y = x1>>n*(x2>>n);
   int y = (x1*x2)>>n;
등과 같은 방법으로 사용함으로써 발생하는 오차는 다르다.
이러한 부분에서 잘 적용하는 것도 Max Difference를 줄이는 한 방법이다.

2.Fixed Point Coding에 대한 기타 생각
기본적으로 ARM9, DSP에서는 부동소수점을 제공하지 않는다. ARM10 이상에서는 VFP(Vector Floating-Point) 장치를 지원하여 부동소수점을 지원하지만, 상당히 느리다.

일 반 본인의 컴퓨터에서 Visual C++를 이용하여 정수형 데이터로만 이루어진 코드와 부동소수점으로 이루어진 데이터로 이루어진 코드를 실행을 해보았을 때 정수형 데이터로만 이루어진 코드가 거의 2배에서 10배 가까이 빨라서 매우 놀랐다.

그래서 시스템의 지원사양이 어쩔 수가 없어서 Fixed Point Coding을 해야 하지만, 부가적으로 처리속도 면에서도 얻는 이점이 매우 크기 때문에 Fixed Point Coding을 하는 것이 좋다고 생각을 한다.

단, 절대 Visual C++를 이용하여서는 기존의 코드를 Fixed Point Coding을 하지마라.
왜냐하면
   #define COEFF Q(0.1)
에 서 Fixed Point만을 지원하는 시스템에서는 COEFF의 타입이 정수형이지만, 그렇지 않는 시스템에서는 COEFF는 0.1*2^n만큼을 계산한 부동소수점 타입이기 때문에, 시간이 더 걸리는 것을 확인 할 수 있었다. 주의 바람.

Fixed Point Coding 방법은 별 것 아니다.
하지만, 이쪽 분야에서 계속 새로운 논문이 나오는 것을 보면, 뭔가가 있겠지.
앞으로 이와 관련한 프로젝트로 모바일 시스템에서의 얼굴인식, 얼굴인식 칩(SoC) 개발이 있다. 이를 수행하면서 새롭게 알게 되는 지식을 계속 알려주는 시간을 가지도록 하겠다.

질문이 있으면 언제든지…….
솜사탕(sayhi0)        

도찬구

2008.02.15 05:10:41
*.124.34.95

프로그래머라는 것이 부끄러워 지는 코딩이군요.
윈도우 진영과 wince진영 쪽에서 단순히 결과물만 만드는 코딩을 하다가 보니 원론적인 것을 등안시 하는 경우가 많습니다.

최적화 코드가 도스에서는 활발했는데 윈도우 넘어오며 빠른 하드웨어의 진보 덕에 많이 중요하지 않은 현 시점에선 등안시 한 것이 사실입니다.

임베디드 쪽을 같이하다가 보니 좀더 빠르게는 할 수 없느냐라는 클라이언트의 요구를 하드웨어를 바꾸면 됩니다라고 답변하고 있는 작태가 부끄럽습니다.

얼마전에 구입한 임베디드 메모리 최적화 기법이란 책을 왜 샀나 하는 생각이 드는 순간이군요. 한 20페이지 읽었나.. ㅠㅠ
List of Articles
번호 제목 글쓴이 날짜 조회 수
38 [자료] AESOP MP2530F 보드용 uC/OS-II BSP for RVDS 2.2 file [11] 김재훈 2008-03-06 7111
37 [자료] AESOP MP2530F 보드용 uC/OS-II BSP for RVDS 3.0 file [7] 김재훈 2008-02-22 3735
36 [자료] 2008-02-21 u-boot elf 파일지원 file [3] 고현철 2008-02-22 3444
35 [문서] MP2530F - wince관련 Documentation입니다. file [3] 고현철 2008-02-17 3166
34 [참고자료] MP2530F v1.5 OrCAD회로도입니다. file [5] 이대성 2008-02-17 3908
» [자료] Fixed Point Coding [펌] [1] 윤동열 2008-02-14 4073
32 [자료]4.8' LCD-Datasheet file 방창혁 2008-02-05 3360
31 [자료] nandboot와 u-boot.bin 파일입니다. file 고현철 2008-02-02 3418
30 [자료] MP230F v1.5회로도입니다. file [7] 방창혁 2008-01-26 3470
29 [참고] aesop-mp2530과 notebook cross로 연결잘됩니다. [4] 고현철 2008-01-19 2725
28 example network setting file 고현철 2007-12-16 3366
27 mp2530 dnw howto file 고도리 2007-12-09 3359
26 이어폰 리셋 문제 해결.... [2] 김창엽 2007-12-04 3155
25 [TIP] u-boot에서 wince 부팅시키기.... 고현철 2007-12-01 3896
24 aesop-mp2530f용 small root filesystem file 고현철 2007-11-30 3400
23 Aesop-mp2530f 보드에서 Qtopia core 4 사용하기 문서입니다.. file [4] 문용석 2007-11-29 3530
22 AESOP MP2530F 보드용 Windows CE 5.0 BSP 배포 안내 [17] 김재훈 2007-11-29 4470
21 mp2530f X-windows/GTK 관련.... 고도리 2007-11-28 3485
20 tslib-1.3 file 서종범 2007-11-24 3452
19 [자료] UART Boot Application Note file [2] 한영민 2007-11-21 3355

사용자 로그인