본문 바로가기

컴퓨터 과학 & 영상처리 관련/임베디드

컴파일러를 사용한 최적화

gcc 명령 옵션 

옵션  설명 
 -c

 링크과정 생략한 컴파일, 오브젝트 파일만 생성

 -o

 [-o output filename]

컴파일한 결과를 저장하는 파일을 직접 지정

 -g  디버거를 위한 변수 테이블 생성

 -O ~ -O3

 최적화 옵션.

-O부터 -O3까지 쓸 수 있으며 숫자가 클수록 최적화 레벨이 올라간다

 -I

 [-I directory]

/usr/local/include나 /usr/include에 있지 않은 header파일의 루트 디렉토리를 지정

 -L

 [-L directory]

/usr/lib나 /usr/local/lib에 있지 않은 라이브러리 디렉토리 지정

 -l

 [-l library_name]

사용할 라이브러리를 직접 지정

 -D

[-D define]

정의 

 

 

 

 

 

objdump 명령에서 사용할 수 있는 옵션은 다음과 같다.  

 옵션

설명 
 -i 타겟 포맷 정보 
 -b  타겟 포맷 지정
 -s  오브젝트 파일 전체 덤프
 -j

오브젝트 파일의 특정 섹션 덤프

 -h  섹션 헤더 덤프
 -d  오브젝트 파일의 역어셈(disassemble) 
 

--prefix-address : 심볼을 기준으로 상대 어드레스 표시

--show-raw-insn : 명령어 코드 표시

-l : 소스 파일이 있는 경우 , 소스 코드의 라인 표시

-S : 소스 파일이 있는 경우, 소스 파일 내에 표시

 

objdump 명령을 이용하면 c코드와 함께 보여줌

 

gcc -c -g -o test2.o test2.c
objdump -d -s test2.o

 

 

 

 

 

 

상수 대체 (constant folding)

 

상수는 컴파일 시에 계산되므로 프로그램 변수에서 상수를 사용한다면 최적화를 이용하여 런타임이 아닌 컴파일 시에 미리 계산하여 사용할 수 있다.

 

#include <stdio.h>

void main(void){

int a,b,c;

a=10;

b=a+20;

c=b+30;

printf("%d",c);

}

 

-O2 최적화를 사용하면 컴파일 시에 미리 계산하여 사용한다

gcc -c -g -O2 -o cont.o cont.c

objdump -d -S cont.o

 

중복 표현 제거

예를들어 (a+b)가 여러곳에 나타나면 이도 -O2 옵션을 이용하여 최적화를 하면 반복 수식의 계산이 생략된다.  

 

 

데드 코드(dead code) 제거 

이것도 마찬가지...의도적으로 테스트 용도나 딜레이 용으로 만들 경우엔 volatile을 쓰도록 

 

 

연산 강도 경감(strength reduction)

이건..걍 같은 결과면 속도가 빠른 코드로 바꿔서 컴파일 해주는거 인듯..

 

 

 

gcc -c -S hello.c (어셈블리 소스 hello.s가 만들어짐)

test2.c

#include <stdio.h>

int main(void)
{
unsigned int x, y, z, k;
x = z =10, y = k = 50;
y %=12;
k &=3;
z=x = 0xffffff;

printf("y = %d, k = %d\n",y,k);
printf("y = %d, k = %d\n",y,k);


x = !x;
printf("%x\n",x);
x = ~z;
printf("%x\n",x);

return 0;
}