본문 바로가기

Assembly

(13)
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 - 최적화 강좌 1 - 2 편견이 깨지는 어셈블리 프로그래밍 - 최적화 강좌 1 - 2 파이프 라인과 스캐일러스 파 이프 라인(pipe line)에 대해서 설명하기 전에 잠깐 인텔 80×86의 클럭 속도에 대해 이야기하겠다. 을 참고해 살펴보자. 인텔 80×86 계열의 CPU는 1978년 8086 발표 당시 8MHz의 클럭 속도로 시작한다. 15년이 지난 후 펜티엄이 발표되는 1993년, 클럭은 8086 시절보다 50MHz 정도의 증가를 보인다. 그럼 펜티엄이 발표된 지 어느덧 10년이 지난 현재 CPU의 클럭 속도는 어떠한가? 인텔 80×86의 발전 속도를 참고했을 때 현재의 펜티엄의 속도는 100MHz 정도를 겨우 넘기고 있을 것이라고 예상된다. 하지만 현재 펜티엄의 클럭은 GHz 대역을 넘은 지 오래 전이다. 언제부터 갑자기..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 3 - 3 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 3 - 3 VC++의 최적화 VC ++나 델파이와 같은 고급 언어들의 컴파일 옵션에 보면 거의 포함되어 있는 메뉴가 최적화 메뉴다. 한때에는 고급 언어들의 성능 및 코드 생성 효율이 당시 하드웨어의 성능을 원활하게 끌어내기에는 부족했기 때문에 어셈블리어로 프로그램을 제작하기도 했었다. 하지만 현재는 높아진 하드웨어 성능과 많아진 메모리와 더불어 눈부시게 발전한 고급 컴파일러의 최적화 알고리즘에 의해 어셈블리어로 손수 최적화 코딩을 할 필요는 거의 없어졌다. 여기서는 지면관계상 고급 언어들을 다 다룰 수는 없고 이들 중 VC++를 선택해 최적화 기능의 예를 보여주려 한다. 간단한 테스트 예제 int TestOpt( int A_Test ) { int Tv_T..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 3 - 2 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 3 - 2 배열대신 포인터를! 반복분기 작업이 필요하도록 만드는 것 중 하나가 배열일 것이다. 배열로 인해 고급 언어들은 프로그래머가 여러 개의 데이터를 처리하기 편하도록 만들고 있다. 하지만 조금이라도 속도를 늘리기를 원한다면 우리는 코드를 작성하는 손을 조금 더 번거롭게 해야 할 필요가 있다. 와 는 정수 3개의 요소가 들은 12바이트 크기의 구조체의 배열을 제어하는 예이다. 는 에서 구조체를 포인터를 이용해 제어하도록 변경한 것이다. 이 둘의 성능을 테스트했다(). ?? 와 의 실행 예?? * 단위: 클럭 ?? 배열 제어 성능 측정 일반적인 배열 작업 void TestDimPtr( ) { //local --------------------- int ..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 3 - 1 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 3 - 1 지금까지 2회에 걸쳐 최적화에 대한 이론과 함께 몇 가지 예를 들어 보았다. 코드를 제작하는 방법에도 여러 가지가 있듯이 최적화 방식에도 여러 가지가 있다. 다양한 코드에 알맞은 최적화 방식을 찾는다는 것은 많은 경험과 실험이 필요하다. 시작이 반이라고 했다. 이번 연재를 계기로 최적화의 시작에 한보를 더하자. 지 난 연재에서 CPU 내부와 버스와 메모리의 동작, 그리고 그에 따른 최적화의 예를 간단히 보았다. 왜 최적화가 필요한지에 대해서도 이야기했다. 이번 호에서는 자신이 직접 만든 루틴의 속도를 간단하게 측정하는 방법과 일반적인 사칙연산, GUI의 관리 배열과 클래스의 최적화, 그리고 마지막으로 VC++가 최적화하는 방식을 알아보는 것으로..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 4 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 4 < 리스트 5>는 정렬된 메모리 블럭을 Win32 API(CopyMemory), DtCopyMemory, DtCopyMemoryMacro, 일반 복사 이렇게 네 가지 방법으로 복사를 한 후 각 방법별 소요 클럭 수를 출력한다. DummyCopy.cpp 각 함수들을 테스트하기 위한 메인 코드(정렬된 주소) .... 생략 .... void CopyTest (int iMaxLength) { .... 생략 .... char *pSrc = new char [iMaxLength] ; // 정렬된 주소 char *pDest = new char [iMaxLength] ; .... 생략 .... // 일반적인 char 단위의 복사(Normal) DtGetClo..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 3 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 3 버스트 모드 버 스트 모드(burst mode)란 한 마디로 블럭 단위로 된 일정량의 데이터를 전송 완료 시점까지 중단 없이 고속으로 전송하는 방식을 말한다. CPU와 노스 브릿지 그리고 메모리 사이에서 일어나는 버스트 모드는 메모리의 시작번지와 요구하는 데이터 블럭의 크기를 명시하면 전송 완료 때까지 중단 없이 데이터를 고속으로 전송하는 방식이다. 즉, 메모리로부터 데이터를 요구할 때마다 그 데이터의 주소를 전달하지 않는다는 말이다(). 는 일반적인 데이터 읽기이다. 일반적으로 데이터를 읽기 위해서는 데이터를 읽을 위치 즉 메모리 주소를 알려주면 그 메모리에서 데이터를 받을 수 있다. 버스트 모드는 어떻게 차이가 날까. 버스트 모드를 살펴보자..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 2 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 2 데이터 흐름에 의한 최적화 언 젠가 컴퓨터를 연구하는 개발자들이 컴퓨터의 동작에서 제일 높은 빈도로 사용되는 동작(operation)이 어떤 것인 지를 확인해 본적이 있다 한다. 그로 인해 컴퓨터에서 제일 많이 하는 동작은 데이터 이동이라는 것을 알게 되었고, 이것으로 인해 RISC 프로세서와 같은 것이 생겨났다. 이 뜻은 데이터 흐름을 최적화하는 것이 컴퓨터 동작의 많은 부분을 최적화시켰다는 것과 같은 말이 된다. 여기서는 데이터 흐름을 최적화하는 방법을 구체적으로 생각해보자. 주소 정렬의 필요성 486 까지는 CPU와 메모리간 데이터 라인이 32비트였기 때문에 데이터를 4바이트씩 읽어왔다. CPU의 속도가 빨라지면서 버스의 속도가 CPU의 ..
[어셈블러] 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 1 편견이 깨지는 어셈블리 프로그래밍 : 최적화 강좌 2 - 1 멀티미디어는 나날이 고급화되는 사용자의 요구에 맞춰 고품질화되고 있다. 고급화된 멀티미디어 데이터로 인해 컴퓨터는 더욱 많은 데이터 처리량을 요구받게 되었고, 이로 인해 CPU와 버스는 많은 성능 향상이 이뤄졌다. 지난 호에서는 CPU에 대해 알아보았다. 이번 호에서는 데이터 흐름을 주관하는 버스의 운용을 이해하고 이를 이용한 최적화의 가능성을 엿보도록 하자. 버 스(bus)는 우리가 일반적으로 생각해 볼 때 무언가를 이동한다는 의미를 가지고 있음을 미리 짐작할 수 있다. 그럼 무엇을 이동하는 것인가. 키보드로 글을 입력하거나 마우스로 컴퓨터에 어떠한 명령을 내린다. 또한 CD-ROM에 미디어를 넣어 데이터를 검색하기도 하고 음악을 듣기도 한다..