EzDoum

찾기
처음으로 | 찾기 | 아카이브 | 글 올리기 | 링크 | 자료실 | 통계 | 연락처 | 자유게시판
이지도움 특집
전체보기
네트워크
TI OMAP35x
TI DaVinci
Analog Blackfin
RobotWar2005
임베디드!
캐쉬의 모든것
메모리 할당 알고리즘
CPU 파이프라이닝
자료구조(Tree)
금융

Login
이름

암호

기억하기


사용자 등록

현재 접속중인 등록 사용자는 0명, 익명 사용자는 4명 입니다.
전체 등록 사용자: 751명

마지막 답장
·libcurl + fuse 조합으로 되는게 많네. (1)
·Linux Ftrace에 관해 (3)
·Android MTP ( Media Transfer Protocol ) (1)
·Lighttpd에 인증을 digest 사용시 IE 오동작 문제? (1)
·Dtrace에 관해 (1)

최근글
·OpenSSL and multi-threads (0)
·ARM 환경에서 OpenCL 사용 (0)
·IoT용 WIFI 모듈 비교 ( MCU ) 클래스 (0)
·Glances - 리눅스 여러 가지 항목을 한 화면에서 모니터링 (0)
·plugin 방식의 로그 분석기 (0)

뜨거운 감자
·나는 인터렉티브한 환경에서 역어셈블 한다. (12)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)
·ASP.NET의 데이터 그리드와 사용자 컨트롤 (7)
·DHTML Editing Control (7)

가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
·멀티쓰레드(Pthread) 프로그래밍
·Sorting Algorithm Animation (2)
·GNU REGEX (정규표현식) 프로그래밍 강좌 (7)
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

SoCRobotWar 2005 - EOS 컴파일러 최적화 옵션
글쓴이: EzDoum 글쓴날: 2005년 08월 07일 오후 02:41
하드웨어



영상처리, 영역인식, 전투AI가 어느정도 자리를 잡아서 코드 최적화에 들어갔다.

일전에 테스트해본 타이머를 이용한 성능 측정 결과를 바탕으로, 어느 단계가 병목인지는 알았으나 어떤 코드가 문제인지 파악하기 위해 디어셈블을 해봤다. 디어셈블 결과가 너무나 놀라웠다. eos 컴파일러의 컴파일 결과가 단순 배열에 값을 넣는 것임에도 불구하고 엄청나게 많은 Instruction을 소비하는 것이었다.

eos 컴파일러는 gcc를 포팅한 것으로 최적화 옵션을 키면 어떨까 하는 생각이 들었다. -O1부터 테스트했다. 그랬더니 생성된 코드는 눈에 띄게 줄어드는 것을 확인할 수 있었다. 그러나, 생성된 바이너리를 보드에 다운로드해서 동작 시켜봤더니 정상 동작을 안했다. 예선전 까지 그리 시간이 많은게 아니라서 시간을 많이 들일수 있는 상황이 아니라 일딴은 우회해서 작업을 하기로 했다.

디어셈블 된거를 보고 명령어 소비가 많은 루틴을 c코드를 변경해가면서 바꿨다. 예를 들면 배열[y][x]같은 경우엔 포인터 연산 증가로 변경을 했더니 85ms 걸리던 오치화 루틴이 60ms로 줄어 들었다. 그리고 다른 참가자들도 이런 증상이 있는지 궁금하기도 하고 에디칩스의 답을 듣고 싶어서 socrobotwar q/a게시판에 글도 남겼다.

위까지가 토요일날 상황인데, 오늘 점심먹고 홈피에 들렀더니 답이 달려있었다.



--------------------------------------------------------------------------------

[로봇워] 컴파일러 옵티마이즈 옵션을 주니까 동작 안하네요. 2005-08-07 10:12:01
(210.***.3.***) 조회 : 10


안녕하세요.
에이디칩스의 양영배입니다.

사용하신 옵티마이즈 옵션 -O1 인 경우는 현재 적용되지 않는 옵션입니다.
옵티마이즈를 하기 위해서는 -O2 를 선택하시면 됩니다.

그리고, 옵티마이즈 옵션에 대한 주의 사항에 대해 설명해 드리겠습니다.

컴파일러의 옵티마이즈하면 안되고 안하면 되는 것이라면 딱 한가지 문제 때문입니다.

즉 hardware적으로는 꼭 필요하나 software 관점에선 불필요한 코드가 제거 되는 경우입니다.

그래서 O2 옵션 사용시 주의점을 알려드리겠습니다.

딱 한가지만 주의하시면 됩니다.
volatile 선언입니다.
왜 이게 필요한지 간락하게 설명 드리자면.

예를 들어서

0x12345678 번지의 메모리 번지 (register,또는 변수가 다 메모리번지 입니다.) 가 있을 경우

*(unsigned int*)0x12345678 = 1; // 1
*(unsigned int*)0x12345678 = 2; // 2
*(unsigned int*)0x12345678 = 3; // 3
*(unsigned int*)0x12345678 = 4; // 4

와 같은 코드가 있다고 할때
software 적인 관점으로 볼때
1,2,3,4 전부 실행 할 필요가 없습니다.
즉 4번만 하면 되는것이지요.
따라서 옵티마이즈를 하면 1,2,3 번은 제거 될수 잇습니다.
그러나 hardware적인 관점에선 다 필요할 수도 있습니다.

그래서 C 문법에서는 volatile 이라는 키워드가 존재 합니다.

*(volatile unsigned int*)0x12345678 = 1; // 1
*(volatile unsigned int*)0x12345678 = 2; // 2
*(volatile unsigned int*)0x12345678 = 3; // 3
*(volatile unsigned int*)0x12345678 = 4; // 4

이렇게 사용하시면 옵티마이즈를 해도 코드가 제거 되지 않습니다.

또하나의 예를 들면

int a=0;
while(1)
{
if(a == 1)
break;
}

위 같은 구문이 있다고 할때

옵티마이즈를 할 경우 보시면 아시겠지만 while 문 안에서 a 를 변경 시키는 코드가 없습니다.
a의 값을 1과 비교하는 코드는 한번만 실행되도록 컴파일 되어서
절대 while 문을 빠져 나오지 못할 수도 있습니다.
하지만 문제는 software가 아닌 외부 변경 요인이 있을 경우입니다.
즉 인터럽트가 걸려서 a의 값을 변경하는 경우나 Hardware가 변경시키는 경우와 같은 외부요인이 있을 경우 사용자의 의도와 다르게 컴파일 되겠죠.
그럴 경우도 바로
volatile 키워드가 필요합니다.

volaitle int a=0;
while(1)
{
if(a == 1)
break;
}

즉 옵티마이즈를 할 경우,
프로그램의 순차적인 실행 이외의 영향을 받는
특정영역(register, 메모리번지, 변수)의 반복적인 Read, 또는 Write 의 경우
해당 변수 앞에 반드시 volatile 이라는 키워드를 사용하셔야 합니다.

참고로, volatile 를 쓴다고 해서 코드가 불필요하게 더 커지진 않습니다.

이상입니다.
그럼 좋은 결과 있기를 바랍니다.

> ###### 질문한 내용
>
>
> 안녕하세요..
>
> 혹시 작성하신 코드 디어셈블 해보셨나요?
> 간단하게 배열에서 값을 꺼내는 것도 꽤나 인스트럭션을 많이
> 잡는것을 보고 컴파일러 최적화 옵션을 켜봤습니다
> 그랬더니 코드 생성된것은 줄었으나 실제로 보드에 올려서 동작을
> 시켜보면, 동작을 안합니다.
>
> 그래서 지금은 c코딩을 다르게해서 옵티마이즈를 하고 있는데,
> 다른 분들도 옵티마이즈 옵션을 키고 컴파일 하면 정상 동작하는지 궁금합니다.
>
>
>
> # 옵티마이즈 하지 않을때
>
> c0 = IMAGE5COLOR[y][x];
> c0100464: fb 7f leri 0x3FFB (0xFFFFFFFB)
> c0100466: 36 04 ld ( %R6 + 0xFFFFFFBC ) %R4
> c0100468: f5 7f leri 0x3FF5 (0xFFFFFFF5)
> c010046a: 16 14 st %R4 , ( %R6 + 0xFFFFFF54 )
> c010046c: f5 7f leri 0x3FF5 (0xFFFFFFF5)
> c010046e: 16 00 ld ( %R6 + 0xFFFFFF54 ) %R0
> c0100470: 00 40 leri 0x0 (0x0)
> c0100472: 04 e6 mul 0x4 %R0
> c0100474: 71 e1 mfmh %R1
> c0100476: 80 e4 lea ( %R0 0x0 ) %R8
> c0100478: 91 e4 lea ( %R1 0x0 ) %R9
> c010047a: fb 7f leri 0x3FFB (0xFFFFFFFB)
> c010047c: 26 02 ld ( %R6 + 0xFFFFFFB8 ) %R2
> c010047e: 02 e4 lea ( %R2 0x0 ) %R0
> c0100480: 2d 40 leri 0x2D (0x2D)
> c0100482: 00 e6 mul 0x2D0 %R0
> c0100484: 71 e1 mfmh %R1
> c0100486: f4 7f leri 0x3FF4 (0xFFFFFFF4)
> c0100488: 36 10 st %R0 , ( %R6 + 0xFFFFFF4C )
> c010048a: f5 7f leri 0x3FF5 (0xFFFFFFF5)
> c010048c: 06 11 st %R1 , ( %R6 + 0xFFFFFF50 )
> c010048e: f4 7f leri 0x3FF4 (0xFFFFFFF4)
> c0100490: 36 01 ld ( %R6 + 0xFFFFFF4C ) %R1
> c0100492: 81 b8 add %R1 %R8
> c0100494: 0a 70 leri 0x300A (0xFFFFF00A)
> c0100496: b9 40 leri 0xB9 (0xFC0280B9)
> c0100498: 00 a9 ldi 0xC0280B90 %R9
> c010049a: 89 b8 add %R9 %R8
> c010049c: 08 09 ld ( %R8 + 0x0 ) %R9
> c010049e: f9 7f leri 0x3FF9 (0xFFFFFFF9)
> c01004a0: 16 19 st %R9 , ( %R6 + 0xFFFFFF94 )
>
> # -O1 옵션
> c0 = IMAGE5COLOR[y][x];
> c01002fe: 04 e4 lea ( %R4 0x0 ) %R0
> c0100300: 00 40 leri 0x0 (0x0)
> c0100302: 04 e6 mul 0x4 %R0
> c0100304: 71 e1 mfmh %R1
> c0100306: 80 e4 lea ( %R0 0x0 ) %R8
> c0100308: 91 e4 lea ( %R1 0x0 ) %R9
> c010030a: 0f e4 lea ( %R15 0x0 ) %R0
> c010030c: 2d 40 leri 0x2D (0x2D)
> c010030e: 00 e6 mul 0x2D0 %R0
> c0100310: 71 e1 mfmh %R1
> c0100312: a0 e4 lea ( %R0 0x0 ) %R10
> c0100314: b1 e4 lea ( %R1 0x0 ) %R11
> c0100316: 28 e4 lea ( %R8 0x0 ) %R2
> c0100318: 2a b8 add %R10 %R2
> c010031a: 0c 98 ld ( %SP + 0x30 ) %R8
> c010031c: 82 b8 add %R2 %R8
> c010031e: 08 08 ld ( %R8 + 0x0 ) %R8
> c0100320: 8f 98 st %R8 , ( %SP + 0x3C )
>


[분류: 하드웨어 인쇄용 페이지 본문 email로 보내기 ]

<  미국 최고의 교수들은 어떻게 가르치는가? | SoCRobotWar 2005 - HSV 칼라스페이스로 오치화  >
SoCRobotWar 2005 - EOS 컴파일러 최적화 옵션 | 답장: 2개 | 본문에 답장
정렬 :  
답장 EzDoum 2005년 08월 09일 오전 07:01 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
아 본문에 올린 코드가 최적화 했을때 디어셈블 결과. 두줄!!
이 코드가 180*120번 호출 되니까 그 성능 차이가 확실하다.

c8: 0e 00 ld ( %R14 + 0x0 ) %R0
ca: 90 90 st %R0 , ( %SP + 0x40 )


[수정]

답장 EzDoum 2005년 08월 09일 오전 08:07 [ 이글에 답장 | 본문에 답장 | 책갈피 ]
성능 분석 때 예선전까지 10장의 프레임 레이트가 목표였다.
c언어 튜닝만으로 100ms 정도 줄어들어서 목표 달성!

fpga와 dma 스케쥴링 조절만 해주면 풀 프레임인 30장 처리도 어려운 일만은 아닌듯 하다.
예선전 패스 후~ 성능 향상 쪽 도전 과제로 삼아야겠다.

http://www.ezdoum.com/stories.php?story=05/07/31/3879121

성능 분석 때 나온 데이터
--ssss-- setp1 (9665)(3)
--ssss-- setp2 (9693)(28)
--ssss-------------47 9693/47 206.23 ms
--ssss-- setp3 (9777)(84)
0,57,89,4,4,16,2,55,87,59,91,3,3,16
--ssss-- setp4 (9825)(48)

최적화 후 데이터
--ssss-- setp1 (302872)(7)
--ssss-- setp2 (302905)(33)
--ssss-------------3166 302905/3166 95.67 ms
--ssss-- setp3 (302936)(31)
--ssss-- setp4 (302958)(22)
--ssss 51
--ssss-- setp5 (302963)(5)
[수정]

SoCRobotWar 2005 - EOS 컴파일러 최적화 옵션 | 답장: 2개 | 본문에 답장
정렬 :  

답장 쓰기
글을 올리시려면 로그인 (사용자 등록) 하셔야 합니다.

검색
Google

분류
·공지 (6)
·인터넷 (87)
·하드웨어 (260)
·C/C++ (65)
·어셈블리 (7)
·리눅스 (136)
·리눅스 커널 (67)
·윈도우즈 (25)
·데이터베이스 (20)
·보안 (16)
·.NET (25)
·그래픽 (13)
·책소개 (42)
·호기심 천국 (80)
·잡담 (111)
·사랑 (3)

전체 본문수: 963
전체 답장수: 525


분류 : 하드웨어
최근글
최근글
가장 많이 읽은 글
·[Cache] 2-way Set-Associative 방식이란 무엇일까? (2)
뜨거운 감자
·SoCRobotWar 2005 - 신입생 기초 교육자료 (7)

EzDoum투표
이지도움 어때요?
이게 뭐야. 다시 안올란다. --;
아이 좋아라~ +_+;
관심없다.
먼가는 있는거 같은데 뭐하는 곳이지?
기타 (자유게시판에 글로 남겨 주세요)
[ 결과 | 투표 ]

랜덤 링크
http://kldp.net


 Home ^ BACK TO TOP ^ EzDoum - 도움이 필요하세요~??
 Powered by KorWeblog 1.5.8 Copyleft © 2001 EzDoum, 관리자: EzDoum