편견이 깨지는 어셈블리 프로그래밍 - 최적화 강좌 1 - 1  
 
 
아무리 하드웨어가 발전한다 해도 높아진 사용자의 눈을 따라 올 수는 없었다. 개발자들은 사용자를 더 만족시키기 위해 하드웨어의 모든 자원을 짜내지 않으면 안 되었고, 그로 인해 부각되는 분야 중 하나가 바로 최적화이다. 멀고도 어렵게 느껴진 최적화, 관련 툴의 발전으로 더 이상 일부 프로그래머들의 전유물이 아니다. 어떤 것을 공략하기 전에 먼저 대상을 잘 파악해야 한다. 따라서 이번 호부터는 달라진 어셈블리와 PC의 심장인 CPU를 공략해보자.  
 





이 강좌는 어렵게만 생각해왔던 최적화에 고급스럽게 변모한 어셈블러를 이용해 더 쉽게 접근해 보자는 취지로 시작한 강좌이다. 일반적으로 ‘최적화’라는 단어가 나오면 ‘어렵다!’, ‘자료가 부족하다’, ‘컴파일러에서 지원해주는 것이 아니냐?’ 등의 이야기를 많이 한다. 하지만 조금만 관심을 가지고 시스템을 이해한다면 아주 쉬운 방법으로 최적화된 코드를 작성할 수 있다. 현재 우리가 쓰는 고급 언어들의 컴파일러는 많은 사람들의 노력과 기술의 발전으로 상당히 최적화되어 있다. 하지만 CPU에 특성화되지 않은 범용 언어인 만큼 상황 설정에 맞춘 알고리즘에 의하여 생성된 실행 코드로는 최적화에 한계가 있을 수 있다. 이런 부족한 점을 보완하기 위해 어셈블러 역시 공부할 필요가 있다.
이번 연재는 CPU에 대한 설명인 만큼 CPU 명령과 거의 일대일로 매칭되는 어셈블러를 비중 있게 다룰 것이다. 어셈블리하면 매우 어렵고 쓰기 불편한 언어로 인식되어 왔지만 MASM이 버전 6.0대에 들어서면서 매우 편리하고 고급적인 기능이 추가되었으며 고급 언어와의 연결 또한 용이해지게 되었다. 따라서 여기서는 MASM 7.0 버전을 위주로 설명해 나갈 것이고, 이 컴파일러는 http://www.asmlove.co. kr에서 다운받을 수 있다.

펜티엄 내부 블럭도
코드의 최적화란 해당 CPU의 특성을 가장 잘 이해하고 코드를 작성하는 것이다. 그렇다면 컴퓨터에서 가장 핵심적인 부분인 CPU에 대해 알아 볼 필요가 있다. <그림 1>은 펜티엄의 블럭 다이어그램을 나타낸 것이다. 이 구조를 크게 기능별로 크게 4가지 유닛(Unit)으로 나눌 수 있다.

◆ 메모리 서브시스템
메 모리 서브시스템(memory subsystem)은 노스 브릿지(north bridge)라는 메인 버스 컨트롤러(main bus controller)와 연결해주는 시스템 버스(system bus), 버스 인터페이스 유닛(bus interface unit)과 데이터의 원활한 흐름을 위해 L2 캐시, 인스트럭션 캐시(instruction cache, L1), 데이터 캐시(date cache, L1), 메모리 인터페이스 유닛(memory interface unit) 그리고 메모리 레코더 버퍼(memory reorder buffer)로 구성되어 있다.

◆ 페치/디코더 유닛
인스트럭션 페치 유닛(instruction fetch unit), 브랜치 타겟 버퍼(branch target buffer), 인스트럭션 디코더(instruction decoder), 마이크로코드 시퀀서(microcode sequencer), 레지스터 알리아스 테이블(register alias table)로 구성되어 있다. 이 부분은 실행 유닛이 효율적으로 수행할 수 있게 하기 위해 알맞은 규격의 명령을 가공하는 부분이다. CPU에 대한 최적화는 이 부분을 얼마나 잘 이해하고 활용하느냐 하는 것인데, 이에 관하여 이번 강좌에서 자세하게 다루겠다.

◆ 인스트럭션 풀(instruction pool) 또는 레코더 버퍼(reorder buffer)

◆ 디스패치/실행 유닛(dispatch/execute unit)
이 부분이야 말로 실질적인 명령의 수행이 이뤄지는 곳이다. 이 부분은 실행 가능한 파이프에 명령을 분배하기 위한 예약 스테이션(reservation station)과 두 개의 정수 처리 유닛과 하나의 부동 소수점 유닛 두 개의 주소 번역기 유닛과 두 개의 병렬 데이터 처리 유닛을 포함하고 있다

◆ 리타이어먼트 유닛(retirement unit)
명령어 수행이 최종적으로 끝나는 곳이다.


출처: http://www.imaso.co.kr/?doc=bbs/gnuboard.php&bo_table=article&wr_id=70


+ Recent posts