KR20090092617A - 프로세서 및 컴파일 방법 - Google Patents

프로세서 및 컴파일 방법

Info

Publication number
KR20090092617A
KR20090092617A KR1020080017957A KR20080017957A KR20090092617A KR 20090092617 A KR20090092617 A KR 20090092617A KR 1020080017957 A KR1020080017957 A KR 1020080017957A KR 20080017957 A KR20080017957 A KR 20080017957A KR 20090092617 A KR20090092617 A KR 20090092617A
Authority
KR
South Korea
Prior art keywords
program code
register
operation instruction
row
result
Prior art date
Application number
KR1020080017957A
Other languages
English (en)
Other versions
KR101418969B1 (ko
Inventor
김태송
김홍석
백창우
Original Assignee
삼성전자주식회사
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 삼성전자주식회사 filed Critical 삼성전자주식회사
Priority to KR1020080017957A priority Critical patent/KR101418969B1/ko
Priority to US12/325,361 priority patent/US8752031B2/en
Priority to EP08171662A priority patent/EP2096539A3/en
Priority to CN200910005718.9A priority patent/CN101520737B/zh
Publication of KR20090092617A publication Critical patent/KR20090092617A/ko
Application granted granted Critical
Publication of KR101418969B1 publication Critical patent/KR101418969B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/28Error detection; Error correction; Monitoring by checking the correct order of processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Quality & Reliability (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Hardware Redundancy (AREA)
  • Debugging And Monitoring (AREA)

Abstract

프로세서 및 컴파일 방법이 제공된다. 본 발명의 컴파일 방법은 하나 이상의 제1 연산 명령어를 포함하는 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과를 생성하는 단계, 상기 제1 프로그램 코드를 컴파일하여 하나 이상의 제2 연산 명령어를 포함하는 제2 프로그램 코드를 생성하는 단계, 상기 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성하는 단계 및 상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하여 상기 제2 프로그램 코드의 유효성을 판정하는 단계를 포함할 수 있다. 이를 통해 컴파일 방법의 유효성을 용이하게 검증할 수 있다.

Description

프로세서 및 컴파일 방법 {PROCESSOR AND METHODS OF COMPILING}
본 발명은 프로그램 코드를 컴파일하는 컴파일러에 관한 것으로, 보다 상세하게는 컴파일러 및 컴파일러를 이용하는 프로세서에 관한 것이다.
컴파일러는 FORTRAN, C, CPP 등의 프로그래밍 언어로 기술된 프로그램 코드를 프로세서에서 실행되기 적합한 명령어로 변환한다. 컴파일러는 프론트-엔드(front-end), 머신 독립적 변환(machine-independent transformation), 머신 의존적 변환(machine-dependent transformation) 등의 단계로 구분될 수 있다.
프론트-엔드 과정은 프로그래밍 언어로 기술된 프로그램 코드를 컴파일러가 처리하기 쉬운 중간 표현(intermediate representation, IR)으로 변환한다. 머신 의존적 변환은 백-엔드(back-end) 과정이라고도 불리며, 프로그램 코드가 실행될 프로세서의 구성에 영향 받기 쉽다.
새로운 프로세서가 개발되거나 프로세서가 업그레이드될 때마다 종래의 알고리즘(algorithm)과 다른 새로운 알고리즘이 이용되거나 알고리즘이 업그레이드되므로, 백-엔드 과정에 필요한 컴파일러 또한 새롭게 개발되거나 업그레이드될 필요가 있다.
컴파일러가 새롭게 개발되거나 업그레이드된 경우, 개발자는 컴파일러의 정확성을 검증할 필요가 있다. 이러한 과정을 컴파일러를 디버그(debug)한다고 한다. 백-엔드 과정에서 변환되는 코드는 기계 친화적인 코드이므로 해당 분야의 종사자가 컴파일 과정을 추적하며 컴파일러의 정확성을 판단하기가 어려운 문제가 있다.
컴파일러를 디버그하는 방법으로 formal theory에 기초한 certification 기법이 이용되기도 한다. 이 기법은 수학적인 모델이 기초하므로 이론상 명백하게 판단할 수 있다는 장점이 있으나 복잡도가 매우 높아 현실적으로 구현되기 어렵다.
본 발명의 일 실시예에 따르면 새로운 컴파일 방법을 이용함으로써 컴파일 방법의 유효성을 용이하게 검증할 수 있다.
본 발명의 일 실시예에 따른 컴파일 방법은 재구성 프로세서에서 이용되는 컴파일러의 유효성을 용이하게 검증할 수 있다.
본 발명의 일 실시예에 따른 컴파일 방법은 하나 이상의 제1 연산 명령어를 포함하는 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과를 생성하는 단계, 상기 제1 프로그램 코드를 컴파일하여 하나 이상의 제2 연산 명령어를 포함하는 제2 프로그램 코드를 생성하는 단계, 상기 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성하는 단계 및 상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하여 상기 제2 프로그램 코드의 유효성을 판정하는 단계를 포함할 수 있다.
본 발명의 다른 실시예에 따른 재구성 프로세서는 복수의 기능 유닛들을 포함하고, 실행되는 연산 명령어에 따라 복수의 기능 유닛들을 병렬적으로 이용할 수 있다. 이 때, 재구성 프로세서는 하나 이상의 제1 연산 명령어를 포함하는 제1 프로그램 코드를 컴파일하여 하나 이상의 제2 연산 명령어를 포함하는 제2 프로그램 코드를 생성하는 코드 변환부, 상기 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과를 생성하는 제1 시뮬레이션부, 및 상기 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성하는 제2 시뮬레이션부를 포함할 수 있다. 재구성 프로세서는 상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하여 상기 제2 프로그램 코드의 유효성을 판정할 수 있다.
도 1은 본 발명의 일 실시예에 따른 컴파일 방법을 도시하는 동작 흐름도이다.
도 2는 도 1의 단계(S120)의 일 예를 상세히 도시하는 동작 흐름도이다.
도 3은 컴파일 전의 프로그램 코드의 일 예를 도시하는 도면이다.
도 4는 도 3의 프로그램 코드에서 이용되는 레지스터의 활성화도(liveness)를 도시하는 도면이다.
도 5는 도 4의 레지스터들 간의 간섭 관계를 도시하는 간섭 그래프이다.
도 6은 도 3의 프로그램 코드가 컴파일된 프로그램 코드의 일 예를 도시하는 도면이다.
도 7은 도 6의 프로그램 코드에서 이용되는 레지스터의 활성화도(liveness)를 도시하는 도면이다.
도 8은 도 7의 레지스터들 간의 간섭 관계를 도시하는 간섭 그래프이다.
도 9는 도 6의 프로그램 코드가 레지스터 얼로케이션된 프로그램 코드의 일 예를 도시하는 도면이다.
도 10은 본 발명의 다른 실시예에 따른 컴파일러 및 상기 컴파일러의 디버깅 방법을 도시하는 도면이다.
도 11은 본 발명의 일 실시예에 따른 프로세서(1100)를 도시하는 도면이다.
<도면의 주요 부분에 대한 부호의 설명>
1110: 코드 변환부
1120: 제1 시뮬레이션부
1130: 제2 시뮬레이션부
이하에서, 본 발명에 따른 바람직한 실시예를 첨부된 도면을 참조하여 상세하게 설명한다. 그러나, 본 발명이 실시예들에 의해 제한되거나 한정되는 것은 아니다. 각 도면에 제시된 동일한 참조 부호는 동일한 부재를 나타낸다.
어떤 작업을 수행하는 장치는 하드웨어 또는 소프트웨어를 이용하여 구현될 수 있다. 예를 들어, 네트워크 인터페이스를 수행하는 네트워크 콘트롤러가 컴퓨터 칩 상에 구현된 경우, 상기 네트워크 콘트롤러는 공장에서 생산될 때 정의된 네트워크 인터페이스 기능 만을 수행할 수 있다. 이 때, 공장에서 네트워크 콘트롤러가 생산된 후, 상기 네트워크 콘트롤러의 기능(function)을 바꾸는 것은 불가능하다. 이것이 하드웨어의 예이다. 또 다른 방법으로는 소프트웨어를 이용하는 방법이 있다. 예를 들어 사용자가 원하는 기능을 수행하는 프로그램을 짜고, 상기 프로그램을 범용 프로세서(general purpose processor)에서 실행시킴으로써, 사용자의 목적이 만족되었다. 소프트웨어에 의한 방법은 하드웨어가 공장에서 생산된 후에도, 소프트웨어만 변경함으로써 새로운 기능을 수행하는 것이 가능하다. 소프트웨어를 이용하는 경우에는 주어진 하드웨어를 이용하여 다양한 기능을 수행할 수 있지만, 하드웨어 구현 방법에 의한 것보다 성능이 떨어지는 단점이 있다.
위와 같은 하드웨어 및 소프트웨어에 의한 방법의 문제점을 극복하기 위하여 재구성 프로세서 아키텍쳐가 제안된다. 재구성 프로세서 아키텍쳐는 장치의 제조(device fabrication) 후에도 어떤 문제의 해결을 위하여든지 커스토마이징될 수 있고, 또한 계산의 수행을 위해 공간적으로(spatially) 커스토마이징된 계산을 이용할 수 있다.
재구성 프로세서 아키텍쳐는 복수의 인스트럭션을 병렬적으로 처리할 수 있는 프로세서 코어(processor core) 및 코어스 그레인 어레이(coarse grained array, CGA)를 이용하여 구현될 수 있다.
프로세서에서는 "1"과 "0"의 조합으로 이루어진 기계어(machine language)가 실행된다. 이들 기계어는 사용자가 취급하기에는 적절하지 않으므로, 사용자는 "1"과 "0"의 조합을 미리 정의된 단어(word)에 대응시킴으로써 생성되는 어셈블리어(assembly language) 또는 사용자가 취급하기 용이한 하이 레벨 프로그래밍 언어를 이용하여 프로그램 코드를 작성할 수 있다.
컴파일러는 사용자가 취급하기 용이한 프로그래밍 언어, 예를 들어 C 언어, FORTRAN, PASCAL, C++ 등을 프로세서에서 실행되기 적합한 명령어로 변환한다. 컴파일러의 변환 과정 중 하드웨어에 의존적인 백-엔드 과정은 하드웨어 정보에 기초하여 실행되므로 복잡도가 높다.
재구성 프로세서에서는 하드웨어 정보가 변경될 수 있고, 재구성 프로세서를 구성하는 복수의 기능 유닛들 간의 상호 관계가 정의되어야 하므로 재구성 프로세서를 위한 백-엔드 컴파일 과정은 복잡도가 더욱 높다.
컴파일러가 프로그램 코드를 오류 없이 변환하였는지를 판정하고, 오류를 검출하여 정정하는 과정을 컴파일러의 디버깅(debugging)이라 한다. 본 명세서에서는 재구성 프로세서에 적용되기 적합한 컴파일러의 다이나믹 디버깅 방법이 제안된다. 또한, 본 발명의 실시예들에 따르면, 다이나믹 디버깅 방법이 적용되기에 적합한 컴파일 방법이 제안된다.
본 발명의 실시예들에 따른 컴파일 방법 또는 컴파일러의 디버깅 방법은 컴파일 전의 프로그램 코드와 컴파일 후의 프로그램 코드가 동일한 시뮬레이션을 통하여 동일한 결과를 제공하는지 여부에 따라 컴파일러의 정확성을 판정할 수 있다.
본 발명의 실시예들은 컴파일 전의 프로그램 코드와 컴파일 후의 프로그램 코드의 시뮬레이션 결과를 포인트 바이 포인트(point by point)로 체크할 수 있는 컴파일 방법 또는 컴파일러의 디버깅 방법을 제공할 수 있다.
도 1은 본 발명의 일 실시예에 따른 컴파일 방법을 도시하는 동작 흐름도이다.
도 1을 참조하면, 컴파일 방법은 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과(operation result)를 생성한다(S110).
제1 프로그램 코드는 하나 이상의 제1 연산 명령어를 포함할 수 있다. 제1 연산 결과는 상기 하나 이상의 제1 연산 명령어 각각에 대하여 생성될 수 있다.
컴파일 방법은 제1 프로그램 코드를 컴파일하여 제2 프로그램 코드를 생성한다(S120).
제2 프로그램 코드는 하나 이상의 제2 연산 명령어를 포함할 수 있다. 제2 연산 명령어의 개수는 제1 연산 명령어의 개수와 같을 수도 있고, 다를 수도 있다. 단계(S120)는 코드 셀렉션(code selection), 레지스터 얼로케이션(register allocation), 데드 코드 제거(dead code elimination), 스케줄링(scheduling) 등의 기법을 이용하여 제1 프로그램 코드를 컴파일할 수 있다.
컴파일 방법은 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성한다(S130). 제2 연산 결과는 상기 하나 이상의 제2 연산 명령어 각각에 대하여 생성될 수 있다.
컴파일 방법은 제1 연산 결과 및 제2 연산 결과를 비교하여 제2 프로그램 코드의 유효성을 판정한다(S140).
도 2는 도 1의 단계(S120)의 일 예를 상세히 도시하는 동작 흐름도이다.
도 2를 참조하면, 컴파일 방법은 제1 프로그램 코드의 제1 연산 명령어 각각에 연산 식별자(identifier, ID)를 부여한다(S210).
컴파일 방법은 부여된 연산 ID(operation ID)를 이용하여 제1 프로그램 코드를 컴파일한다(S220).
이 때, 단계(S140)는 동일한 연산 ID에 대응하는 제1 연산 명령어 및 제2 연산 명령어의 연산 결과를 비교할 수 있다.
단계(S140)는 제1 프로그램 코드 중 연산 ID "1"이 부여된 제1 연산 명령어의 제1 연산 결과와 제2 프로그램 코드 중 연산 ID "1"을 가지는 제2 연산 명령어의 제2 연산 결과를 비교할 수 있다.
연산 명령어 중 결과 값을 후속 연산 명령어가 이용하지 않고, 최종 결과 값을 제공하지도 않는 연산 명령어를 데드 코드(dead code)라 할 수 있다. 컴파일 방법은 연산 명령어 간의 관계에 기초하여 데드 코드를 식별하고, 식별된 데드 코드를 제거할 수 있다. 이러한 컴파일 기법을 데드 코드 제거(dead code elimination)라 한다.
컴파일 방법은 데드 코드 제거(dead code elimination) 기법을 이용하여 제1 연산 명령어 중 데드 코드를 식별하고, 식별된 데드 코드를 컴파일하지 않을 수 있다. 따라서, 생성된 제2 프로그램 코드 내에는 데드 코드와 동일한 연산 ID를 가지는 제2 연산 명령어가 존재하지 않을 수 있다. 이 때, 단계(S140)는 데드 코드의 제1 연산 결과에 대해서는 비교할 대상이 없으므로 데드 코드의 제1 연산 결과를 판정하지 않을 수 있다. 단계(S120)의 컴파일 과정의 오류가 있어 데드 코드가 아닌 제1 연산 명령어가 제거된 경우, 그로 인해 나머지 제2 연산 명령어의 제2 연산 결과가 오류를 가지게 될 것이므로 단계(S140)에서 데드 코드의 제1 연산 결과를 판정하지 않더라도 컴파일 과정의 오류를 발견할 수 있다.
프로그램 코드가 실행되는 프로세서는 하나의 파이프라인(pipeline) 스트럭쳐에 의해 연산 명령어를 처리(process)할 수도 있고, 복수의 파이프라인 스트럭쳐에 의해 연산 명령어를 처리할 수도 있다. 복수의 파이프라인 스트럭쳐에 의해 연산 명령어를 처리하는 프로세서는 병렬적으로 복수의 연산 명령어를 처리할 수 있으므로, 프로그램 코드의 실행 시간을 단축할 수 있다.
병렬적으로 복수의 연산 명령어를 처리하는 병렬 프로세서에서도 모든 연산 명령어들이 병렬적으로 실행될 수 있는 것은 아니다. 하나의 연산 명령어는 다른 연산 명령어의 출력 값을 이용하여 연산을 수행한다. 이 때, 다른 연산 명령어의 출력 값을 입력 값으로 이용하는 연산 명령어는 상기 다른 연산 명령어에 대한 데이터 의존성을 가진다. 연산 명령어들 간에 데이터 의존성이 존재하기 때문에, 병렬 프로세서에 의한 프로그램 코드의 실행 시간 단축 효과가 감소할 수 있다.
병렬 프로세서에서의 프로그램 코드의 실행 시간을 최소화하려면 컴파일러는 연산 명령어 간의 순서를 조정하여 상호 간에 데이터 의존성이 없는 연산 명령어들을 선택하고, 선택된 연산 명령어들이 동시에 실행될 수 있도록 배열할 수 있다. 이러한 과정을 스케줄링 과정이라 할 수 있다.
병렬 프로세서가 동시에 처리할 수 있는 연산 명령어의 수는 병렬 프로세서의 하드웨어 구성에 따라 결정될 수 있다. 병렬 프로세서가 병렬적으로 기능하는 복수의 기능 유닛들을 포함하는 경우, 상기 복수의 기능 유닛들의 수만큼 병렬 프로세서는 연산 명령어들을 동시에 처리할 수 있다.
컴파일러의 스케줄링 과정은 병렬 프로세서가 동시에 처리할 수 있는 연산 명령어의 수를 고려하여 수행될 수 있다. 상호 간에 데이터 의존성이 없는 연산 명령어가 매우 많더라도 이들 연산 명령어들 중 병렬 프로세서에서 동시에 실행될 수 있는 연산 명령어의 수는 제한되어 있으므로, 컴파일러는 연산 명령어들 간의 순서를 조정할 수 있다.
연산 명령어의 연산 결과는 레지스터(register)에 저장될 수 있다. 레지스터는 상대적으로 빠른 메모리로서 연산 명령어의 연산 결과가 다음 연산 명령어에 이용될 때까지 일시적으로 연산 결과를 저장할 수 있다.
프로세서의 하드웨어 구성에 따라, 레지스터의 수가 제한될 수 있다. 프로세서가 반도체 상에 구현될 경우, 레지스터는 상대적으로 빠른 만큼 반도체 상의 상대적으로 넓은 면적을 차지할 수 있으므로 프로세서는 제한된 수만큼의 레지스터들을 포함한다.
일반적으로 사용자는 레지스터의 수에 제한이 없다고 가정하고 프로그램 코드를 작성한다. 컴파일러는 주어진 레지스터의 수에 따른 프로그램 코드의 실행이 가능하도록 프로그램 코드를 변환할 수 있다.
만일 컴파일 전의 프로그램 코드가 동시에 필요로 하는 레지스터의 수가 상기 주어진 레지스터(프로세서의 레지스터의 수)의 수보다 크면, 컴파일러는 초과된 레지스터 중 일부를 선택하고, 선택된 레지스터의 내용을 메모리에 저장하는 연산 명령어를 추가할 수 있다. 메모리에 저장된 내용은 레지스터 내에 유지될 필요가 없으므로, 컴파일러는 이 같은 연산 명령어를 추가함으로써 프로그램 코드에 의해 동시에 이용되는 레지스터의 수를 줄일 수 있다. 이 같은 과정을 레지스터 얼로케이션(register allocation)이라 할 수 있다. 레지스터 얼로케이션 과정은 메모리에 저장된 내용을 레지스터로 로드(load)하는 연산 명령어도 추가할 수 있다. 다른 연산 명령어들이 레지스터를 이용하지 않으면, 메모리에 저장된 내용은 상기 추가된 연산 명령어에 의하여 레지스터로 로드되어 다음 연산 명령어에 의해 이용될 수 있다.
레지스터 얼로케이션 과정에 의해 추가되는 연산 명령어를 스필 코드(spill code)라 하기도 한다. 하나의 스필 코드가 어느 레지스터의 내용을 메모리의 어느 주소로 저장하였는지에 관한 정보는 별도로 저장된다. 프로그램 코드가 실행되는 도중 상기 별도로 저장된 정보에 의해 메모리에 저장된 내용이 레지스터로 로드될 수 있다. 상기 별도로 저장되는 정보는 LIFO(Last In First Out) 또는 FILO(First In Last Out) 순서에 따라 저장될 수 있다. 이러한 순서에 의해 저장되는 데이터 구조체(data structure)를 스택 구조체(stack structure)라 하며, 상기 별도로 저장되는 정보를 본 명세서에서는 설명의 편의 상 스택 정보라 명명하기로 한다.
컴파일러는 레지스터 얼로케이션 또는 스케줄링 과정을 수행하면서 프로그램 코드의 수를 증가시킬 수 있다. 이 경우, 컴파일 과정에 의하여 생성된 제2 프로그램 코드의 제2 연산 명령어의 수는 제1 프로그램 코드의 제1 연산 명령어의 수보다 클 수 있다.
컴파일 과정에 의해 새롭게 생성된 제2 연산 명령어는 연산 ID를 가지지 않을 수도 있고, 새롭게 부여된 연산 ID를 가질 수도 있다. 새롭게 부여된 연산 ID는 제1 연산 명령어에는 존재하지 않던 연산 ID이다. 컴파일 과정에 의해 새롭게 생성된 제2 연산 명령어에 대응하는 제1 연산 명령어가 존재하지 않으므로, 단계(S140)는 상기 새롭게 생성된 제2 연산 명령어의 연산 결과를 판정하지 않을 수 있다.
단계(S110)는 제2 프로그램 코드의 스택 정보를 참조하여 스택 공간을 설정하고, 설정된 스택 공간을 이용하여 제1 프로그램 코드를 시뮬레이트할 수 있다. 이 때, 단계(S110)는 추가된 스필 코드를 고려하여 스택 공간의 크기를 설정할 수 있다.
도 3은 컴파일 전의 프로그램 코드의 일 예를 도시하는 도면이다.
도 3을 참조하면, 제1행(310)의 연산 명령어는 operation ID "op1"를 가진다. 제1행(310)의 연산 명령어는 "0"을 레지스터 r1에 저장하는 연산 명령어이다.
제2행(320)의 연산 명령어는 operation ID "op2"를 가진다. 제2행(320)의 연산 명령어는 "0"을 레지스터 r2에 저장하는 연산 명령어이다.
제3행(330)의 연산 명령어는 operation ID "op3"를 가진다. 제3행(330)의 연산 명령어는 "2"를 레지스터 r4에 저장하는 연산 명령어이다.
제4행(340)의 연산 명령어는 operation ID "op4"를 가진다. 제4행(340)의 연산 명령어는 레지스터 r2 및 "1"을 합산(sum)한 값을 레지스터 r1에 저장하는 연산 명령어이다.
제5행(350)의 연산 명령어는 operation ID "op5"를 가진다. 제5행(350)의 연산 명령어는 레지스터 r4 및 "3"을 합산한 값을 레지스터 r3에 저장하는 연산 명령어이다.
제6행(360)의 연산 명령어는 operation ID "op6"를 가진다. 제6행(360)의 연산 명령어는 "4"를 레지스터 r5에 저장하는 연산 명령어이다.
제7행(370)의 연산 명령어는 operation ID "op7"를 가진다. 제7행(370)의 연산 명령어는 레지스터 r3 및 레지스터 r5를 합산한 값을 레지스터 r5에 저장하는 연산 명령어이다.
제8행(380)의 연산 명령어는 operation ID "op8"를 가진다. 제8행(380)의 연산 명령어는 레지스터 r1 및 레지스터 r5를 합산한 값을 레지스터 r5에 저장하는 연산 명령어이다.
도 4는 도 3의 프로그램 코드에서 이용되는 레지스터의 활성화도(liveness)를 도시하는 도면이다.
도 4를 참조하면, 프레임(401)은 도 3의 제1행(310)을 나타내고, 프레임(402)은 도 3의 제2행(320)을 나타내고, 프레임(403)은 도 3의 제3행(330)을 나타낸다. 프레임(404)은 도 3의 제4행(340)을 나타내고, 프레임(405)은 도 3의 제5행(350)을 나타내고, 프레임(406)은 도 3의 제6행(360)을 나타낸다. 프레임(407)은 도 3의 제7행(370)을 나타내고, 프레임(408)은 도 3의 제8행(380)을 나타낸다.
레지스터 r1는 도 3의 제1행(310)에서 "0"을 저장하지만, 상기 저장된 값은 다른 연산 명령어에 의해 이용되지 않는다.
레지스터 r1는 도 3의 제4행(340)에서 값을 저장하고, 상기 저장된 값은 도 3의 제8행(380)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r1는 도 3의 제4행(340)부터 제8행(380)에 이르는 구간 동안 살아 있고, 레지스터 r1의 활성화도(410)는 프레임(404)으로부터 프레임(408)까지 표시된다.
레지스터 r2는 도 3의 제2행(320)에서 값을 저장하고, 상기 저장된 값은 도 3의 제4행(340)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r2는 도 3의 제2행(320)부터 제4행(340)에 이르는 구간 동안 살아 있고, 레지스터 r2의 활성화도(420)는 프레임(402)으로부터 프레임(404)까지 표시된다.
레지스터 r3는 도 3의 제5행(350)에서 값을 저장하고, 상기 저장된 값은 도 3의 제7행(370)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r3는 도 3의 제5행(350)부터 제7행(370)에 이르는 구간 동안 살아 있고, 레지스터 r3의 활성화도(430)는 프레임(405)으로부터 프레임(407)까지 표시된다.
레지스터 r4는 도 3의 제3행(330)에서 값을 저장하고, 상기 저장된 값은 도 3의 제5행(350)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r4는 도 3의 제3행(330)부터 제5행(350)에 이르는 구간 동안 살아 있고, 레지스터 r4의 활성화도(440)는 프레임(403)으로부터 프레임(405)까지 표시된다.
레지스터 r5는 도 3의 제6행(360)에서 값을 저장하고, 상기 저장된 값은 도 3의 제8행(380)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r5는 도 3의 제6행(360)부터 제8행(380)에 이르는 구간 동안 살아 있고, 레지스터 r5의 활성화도(450)는 프레임(406)으로부터 프레임(408)까지 표시된다.
도 4와 같은 활성화도 그래프를 이용하면 동시에 살아 있는 레지스터의 수를 파악할 수 있다. 예를 들어, 프레임(404)를 기준으로 레지스터 r1, r2, r4가 살아 있음을 알 수 있다. 여기서 레지스터 r2는 프레임(404) 이후에는 이용되지 않으므로 컴파일러는 레지스터 r2를 레지스터 r1으로 대체할 수 있음을 알 수 있다.
프레임(404)으로부터 프레임(405)에 이르는 구간에서는, 레지스터 r1 및 레지스터 r4가 살아 있음을 알 수 있다. 따라서 레지스터 r1 및 레지스터 r4는 서로 대체될 수 없다.
프로세서가 포함하는 물리적 레지스터의 수는 제한되어 있음은 앞에서 설명한 바와 같다. 도 3 및 도 4에서 설명된 레지스터는 컴파일 이전의 프로그램 코드의 논리적 레지스터이다. 동시에 필요한 논리적 레지스터의 수가 물리적 레지스터의 수보다 크면 컴파일러는 레지스터 얼로케이션을 수행하여 레지스터의 일부 내용을 메모리에 저장하는 연산 명령어를 추가하고, 다른 연산 명령어에 의해 사용되는 레지스터의 수가 줄어들면 메모리에 저장된 내용을 레지스터에 로드하는 연산 명령어를 추가할 수 있다. 컴파일러는 도 4와 같은 레지스터의 활성화도 그래프를 이용하여 레지스터 얼로케이션을 수행할 수 있다.
도 5는 도 4의 레지스터들 간의 간섭 관계를 도시하는 간섭 그래프이다.
도 5를 참조하면, 노드(510)는 레지스터 r1를 나타내고, 노드(520)는 레지스터 r2를 나타내고, 노드(530)는 레지스터 r3를 나타낸다. 노드(540)는 레지스터 r4를 나타내고, 노드(550)는 레지스터 r5를 나타낸다.
노드들 간의 아크는 노드에 대응하는 레지스터 간의 간섭 관계를 나타낸다.
도 4의 프레임(404)에서, 레지스터 r2는 역할을 종료하고 레지스터 r1는 역할을 시작한다. 도 4의 프레임(404) 이후 레지스터 r2의 값은 레지스터 r1에 영향을 주지 않으므로, 레지스터 r1 및 레지스터 r2는 서로 간섭하지 않는다고 할 수 있다. 이 때, 레지스터 r1를 나타내는 노드(510) 및 레지스터 r2를 나타내는 노드(520)는 서로 연결되지 않는다.
서로 간섭하지 않는 논리적 레지스터들은 하나의 물리적 레지스터에 매핑될 수 있다. 도 3의 프로그램 코드에서, 논리적 레지스터 r1 및 논리적 레지스터 r2를 하나의 물리적 레지스터(예를 들어, p1)에 매핑하더라도 연산 결과는 달라지지 않는다.
도 4의 활성화도 그래프에서, 레지스터 r1가 살아 있는 동안 레지스터 r3, 레지스터 r4 및 레지스터 r5가 살아 있으므로 레지스터 r1는 상기 레지스터 r3, 레지스터 r4 및 레지스터 r5와 서로 간섭한다. 아크(501)는 레지스터 r1 및 레지스터 r3가 서로 간섭함을 나타내고, 아크(503)는 레지스터 r1 및 레지스터 r5가 서로 간섭함을 나타내고, 아크(504)는 레지스터 r1 및 레지스터 r4가 서로 간섭함을 나타낸다.
도 4의 활성화도 그래프에서, 레지스터 r3가 살아 있는 동안 레지스터 r1 및 레지스터 r5가 살아 있으므로 레지스터 r3는 레지스터 r1 및 레지스터 r5와 서로 간섭한다. 아크(502)는 레지스터 r3 및 레지스터 r5가 서로 간섭함을 나타낸다.
도 4의 활성화도 그래프에서, 레지스터 r2가 살아 있는 동안 레지스터 r4가 살아 있으므로 레지스터 r2는 레지스터 r4와 서로 간섭한다. 아크(505)는 레지스터 r2 및 레지스터 r4가 서로 간섭함을 나타낸다.
만일 컴파일러가 레지스터 r2를 물리적 레지스터 p1에 매핑한다면, 레지스터 r2와 간섭하는 레지스터 r4는 다른 물리적 레지스터 p2에 매핑된다. 레지스터 r1는 레지스터 r4와 간섭하므로, 물리적 레지스터 p2와 다른 물리적 레지스터에 매핑된다. 레지스터 r1는 레지스터 r2와는 간섭하지 않으므로 컴파일러는 레지스터 r1를 물리적 레지스터 p1에 매핑할 수 있다.
레지스터 r3는 레지스터 r1와 간섭하므로 컴파일러는 레지스터 r3를 물리적 레지스터 p2에 매핑할 수 있다. 레지스터 r5는 레지스터 r1 및 레지스터 r3와 간섭하므로 컴파일러는 레지스터 r5를 물리적 레지스터 p1 또는 p2에 매핑할 수 없다. 레지스터 r5는 또 다른 물리적 레지스터 p3에 매핑될 수 있다.
따라서, 도 3의 프로그램 코드가 실행되기 위해서는 물리적 레지스터가 적어도 3개 필요함을 알 수 있다. 만일 프로세서의 물리적 레지스터가 2개만 사용 가능하면 도 3의 프로그램 코드가 프로세서에서 실행되기 위해서 컴파일러는 도 3의 프로그램 코드에 스필 코드(spill code)를 추가해야 한다.
도 6은 도 3의 프로그램 코드가 컴파일된 프로그램 코드의 일 예를 도시하는 도면이다.
도 6을 참조하면, 제1행(610)의 연산 명령어는 operation ID "op2"를 가진다. 제1행(610)의 연산 명령어는 "0"을 레지스터 r2에 저장하는 연산 명령어이다.
제2행(620)의 연산 명령어는 operation ID "op3"를 가진다. 제2행(620)의 연산 명령어는 "2"를 레지스터 r4에 저장하는 연산 명령어이다.
제3행(630)의 연산 명령어는 operation ID "op4"를 가진다. 제3행(630)의 연산 명령어는 레지스터 r2 및 "1"을 합산(sum)한 값을 레지스터 r1에 저장하는 연산 명령어이다.
제4행(640)의 연산 명령어는 operation ID "op11"를 가진다. 제4행(640)의 연산 명령어는 레지스터 r1의 값을 메모리[sp+4]에 저장하는 연산 명령어(스필 코드)이다.
컴파일러는 스필 코드에 operation ID를 부여하지 않을 수도 있지만, 스필 코드가 부가된 프로그램 코드를 다시 컴파일할 수도 있으므로 새로운 operation ID를 부여할 수 있다. 여기서 sp는 스택 포인터(stack pointer)를 나타내고, "sp+4"는 현재 스택 포인터의 다음 위치를 나타낸다. 본 실시예에서는 하나의 워드(word)가 4개의 byte를 포함하는 실시예가 도시되었다(스택 포인터의 증가분이 4). 실시예에 따라서는 프로세서 및 메모리의 아키텍쳐에 따라 스택 포인터의 증가분이 결정될 수 있다.
제5행(650)의 연산 명령어는 operation ID "op5"를 가진다. 제5행(650)의 연산 명령어는 레지스터 r4 및 "3"을 합산한 값을 레지스터 r3에 저장하는 연산 명령어이다.
제6행(660)의 연산 명령어는 operation ID "op6"를 가진다. 제6행(660)의 연산 명령어는 "4"를 레지스터 r5에 저장하는 연산 명령어이다.
제7행(670)의 연산 명령어는 operation ID "op7"를 가진다. 제7행(670)의 연산 명령어는 레지스터 r3 및 레지스터 r5를 합산한 값을 레지스터 r5에 저장하는 연산 명령어이다.
제8행(680)의 연산 명령어는 operation ID "op12"를 가진다. 제8행(680)의 연산 명령어는 메모리[sp+4]에 저장된 값을 레지스터 r1로 로드(load)하는 연산 명령어(스필 코드)이다.
제9행(690)의 연산 명령어는 operation ID "op8"를 가진다. 제9행(690)의 연산 명령어는 레지스터 r1 및 레지스터 r5를 합산한 값을 레지스터 r5에 저장하는 연산 명령어이다.
앞에서 설명한 바와 같이, 도 3의 제1행(310)의 연산 명령어에서 레지스터 r1에 저장된 값은 이후의 연산 명령어에서 이용되지 않는다. 도 3의 제1행(310)의 연산 명령어는 데드 코드(dead code)이고, 컴파일러는 데드 코드를 제거할 수 있다.
도 6의 컴파일된 후의 프로그램 코드에서는 데드 코드에 대응하는 operation ID "op1"이 존재하지 않는 것을 알 수 있다.
도 7은 도 6의 프로그램 코드에서 이용되는 레지스터의 활성화도(liveness)를 도시하는 도면이다.
도 7을 참조하면, 프레임(710)은 도 6의 제1행(610)을 나타내고, 프레임(720)은 도 6의 제2행(620)을 나타내고, 프레임(730)은 도 6의 제3행(630)을 나타낸다. 프레임(740)은 도 6의 제4행(640)을 나타내고, 프레임(750)은 도 6의 제5행(650)을 나타내고, 프레임(760)은 도 6의 제6행(660)을 나타낸다. 프레임(770)은 도 6의 제7행(670)을 나타내고, 프레임(780)은 도 6의 제8행(680)을 나타내고, 프레임(790)은 도 6의 제9행(690)을 나타낸다.
레지스터 r1는 도 6의 제3행(630)에서 값을 저장하고, 상기 저장된 값은 도 6의 제4행(640)의 연산 명령어에 의해 메모리에 저장된다. 레지스터 r1에 저장된 값이 메모리로 옮겨지면 레지스터 r1는 살아 있지 않은 것으로 간주된다.
레지스터 r1는 도 6의 제3행(630)부터 제4행(640)에 이르는 구간 동안 살아 있고, 레지스터 r1의 제1 활성화도(701)는 프레임(730)으로부터 프레임(740)까지 표시된다.
레지스터 r1로부터 메모리로 옮겨진 값은 도 6의 제8행(680)의 연산 명령어에 의해 메모리로부터 레지스터 r1로 로드(load)된다. 상기 로드된 값은 도 6의 제9행(690)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r1는 도 6의 제8행(680)부터 제9행(690)에 이르는 구간 동안 살아 있고, 레지스터 r1의 제2 활성화도(702)는 프레임(780)으로부터 프레임(790)까지 표시된다.
레지스터 r2는 도 6의 제1행(610)에서 값을 저장하고, 상기 저장된 값은 도 6의 제3행(630)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r2는 도 6의 제1행(610)부터 제3행(630)에 이르는 구간 동안 살아 있고, 레지스터 r2의 활성화도(703)는 프레임(710)으로부터 프레임(730)까지 표시된다.
레지스터 r3는 도 6의 제5행(650)에서 값을 저장하고, 상기 저장된 값은 도 6의 제7행(670)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r3는 도 6의 제5행(650)부터 제7행(670)에 이르는 구간 동안 살아 있고, 레지스터 r3의 활성화도(704)는 프레임(750)으로부터 프레임(770)까지 표시된다.
레지스터 r4는 도 6의 제2행(620)에서 값을 저장하고, 상기 저장된 값은 도 6의 제5행(650)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r4는 도 6의 제2행(620)부터 제5행(650)에 이르는 구간 동안 살아 있고, 레지스터 r4의 활성화도(705)는 프레임(720)으로부터 프레임(750)까지 표시된다.
레지스터 r5는 도 6의 제6행(660)에서 값을 저장하고, 상기 저장된 값은 도 6의 제9행(690)의 연산 명령어에 의해 이용된다. 따라서, 레지스터 r5는 도 6의 제6행(660)부터 제9행(690)에 이르는 구간 동안 살아 있고, 레지스터 r5의 활성화도(706)는 프레임(760)으로부터 프레임(790)까지 표시된다.
도 7의 활성화도 그래프를 도 4의 활성화도 그래프와 비교하면, 도 4에서 레지스터 r1의 활성화도(410)에 비하여 짧은 두 개의 활성화도(702, 702)로 분리되었음을 알 수 있다. 레지스터 r1는 프레임(740)으로부터 프레임(780)에 이르는 구간 동안 살아 있지 않으므로, 이 구간 동안 레지스터 r1에 물리적 레지스터가 매핑될 필요가 없다.
도 7의 활성화도 그래프로부터, 레지스터 r1, r2 및 r3을 하나의 물리적 레지스터에 매핑하고, 레지스터 r4 및 r5를 또 다른 물리적 레지스터에 매핑하는 솔루션이 가능함을 알 수 있다. 도 3의 프로그램 코드를 도 6의 프로그램 코드로 컴파일함으로써 상기 컴파일된 프로그램 코드는 2개의 물리적 레지스터만을 필요로 하게 되었다.
논리적 레지스터를 물리적 레지스터에 매핑하는 과정은 도 8의 간섭 그래프를 이용해서도 수행될 수 있다.
도 8은 도 7의 레지스터들 간의 간섭 관계를 도시하는 간섭 그래프이다.
도 8을 참조하면, 노드(810)는 레지스터 r1를 나타내고, 노드(820)는 레지스터 r2를 나타내고, 노드(830)는 레지스터 r3를 나타낸다. 노드(840)는 레지스터 r4를 나타내고, 노드(850)는 레지스터 r5를 나타낸다.
노드들 간의 아크는 노드에 대응하는 레지스터 간의 간섭 관계를 나타낸다.
도 7의 활성화도 그래프에서, 레지스터 r1가 살아 있는 프레임(730)으로부터 프레임(740)에 이르는 구간 동안 레지스터 r4가 살아 있으므로 레지스터 r1는 레지스터 r4와 서로 간섭한다. 아크(803)는 레지스터 r1 및 레지스터 r4가 서로 간섭함을 나타낸다.
레지스터 r1가 살아 있는 프레임(780)으로부터 프레임(790)에 이르는 구간 동안 레지스터 r5가 살아 있으므로 레지스터 r1는 레지스터 r5와 서로 간섭한다. 아크(801)는 레지스터 r1 및 레지스터 r5가 서로 간섭함을 나타낸다.
레지스터 r2가 살아 있는 프레임(710)으로부터 프레임(730)에 이르는 구간 동안 레지스터 r4가 살아 있으므로 레지스터 r2는 레지스터 r4와 서로 간섭한다. 아크(804)는 레지스터 r2 및 레지스터 r4가 서로 간섭함을 나타낸다.
레지스터 r3가 살아 있는 프레임(750)으로부터 프레임(770)에 이르는 구간 동안 레지스터 r5가 살아 있으므로 레지스터 r3는 레지스터 r5와 서로 간섭한다. 아크(802)는 레지스터 r3 및 레지스터 r5가 서로 간섭함을 나타낸다.
도 7 및 도 8을 참조하면, 컴파일러는 프레임(710)으로부터 논리적 레지스터를 순차적으로 물리적 레지스터에 매핑할 수 있다.
프레임(710)에서, 컴파일러는 논리적 레지스터 r2를 물리적 레지스터 p1에 매핑할 수 있다. 컴파일러는 논리적 레지스터 r2와 간섭하는 논리적 레지스터 r4를 물리적 레지스터 p2에 매핑할 수 있다.
컴파일러는 논리적 레지스터 r4와 간섭하는 논리적 레지스터 r1를 물리적 레지스터 p1에 매핑할 수 있다. 컴파일러는 논리적 레지스터 r1와 간섭하는 논리적 레지스터 r5를 물리적 레지스터 p2에 매핑할 수 있다.
컴파일러는 논리적 레지스터 r5와 간섭하는 논리적 레지스터 r3를 물리적 레지스터 p1에 매핑할 수 있다.
결과적으로 컴파일러는 도 8의 간섭 그래프를 이용하여 논리적 레지스터 r1, r2 및 r3를 물리적 레지스터 p1에 매핑하고, 논리적 레지스터 r4 및 r5를 물리적 레지스터 p2에 매핑할 수 있다.
이상에서 설명한 바와 같이, 도 6의 프로그램 코드는 2개의 물리적 레지스터를 가지는 프로세서에서 오류 없이 실행될 수 있다. 논리적 레지스터 및 물리적 레지스터 간의 매핑 과정은 레지스터 얼로케이션이라고도 불린다.
도 9는 도 6의 프로그램 코드가 레지스터 얼로케이션된 프로그램 코드의 일 예를 도시하는 도면이다.
도 9를 참조하면, 제1행(910)의 연산 명령어는 operation ID "op2"를 가진다. 제1행(910)의 연산 명령어는 "0"을 레지스터 p1에 저장하는 연산 명령어이다.
도 9의 프로그램 코드는 도 6의 프로그램 코드의 논리적 레지스터가 물리적 레지스터로 매핑된 프로그램 코드이다. 이전 컴파일 과정에서 스필 코드가 이미 부가되었으므로 도 9의 프로그램 코드의 각 연산 명령어는 도 6의 프로그램 코드의 각 연산 명령어와 동일한 operation ID를 가진다.
제2행(920)의 연산 명령어는 operation ID "op3"를 가진다. 제2행(920)의 연산 명령어는 "2"를 레지스터 p2에 저장하는 연산 명령어이다.
제3행(930)의 연산 명령어는 operation ID "op4"를 가진다. 제3행(930)의 연산 명령어는 레지스터 p1 및 "1"을 합산(sum)한 값을 레지스터 p1에 저장하는 연산 명령어이다.
제4행(940)의 연산 명령어는 operation ID "op11"를 가진다. 제4행(940)의 연산 명령어는 레지스터 p1의 값을 메모리[sp+4]에 저장하는 연산 명령어이다.
제5행(950)의 연산 명령어는 operation ID "op5"를 가진다. 제5행(950)의 연산 명령어는 레지스터 p2 및 "3"을 합산한 값을 레지스터 p1에 저장하는 연산 명령어이다.
제6행(960)의 연산 명령어는 operation ID "op6"를 가진다. 제6행(960)의 연산 명령어는 "4"를 레지스터 p2에 저장하는 연산 명령어이다.
제7행(970)의 연산 명령어는 operation ID "op7"를 가진다. 제7행(970)의 연산 명령어는 레지스터 p1 및 레지스터 p2를 합산한 값을 레지스터 p2에 저장하는 연산 명령어이다.
제8행(980)의 연산 명령어는 operation ID "op12"를 가진다. 제8행(980)의 연산 명령어는 메모리[sp+4]에 저장된 값을 레지스터 p1로 로드(load)하는 연산 명령어이다.
제9행(990)의 연산 명령어는 operation ID "op8"를 가진다. 제9행(990)의 연산 명령어는 레지스터 p1 및 레지스터 p2를 합산한 값을 레지스터 p2에 저장하는 연산 명령어이다. 제9행(990)의 연산 명령어는 레지스터 p2에 최종 결과 값을 제공한다. 논리적 레지스터 r5는 물리적 레지스터 p2에 대응하므로, 도 9의 프로그램 코드는 논리적 레지스터 r5에 최종 결과 값을 제공할 수 있다.
도 1, 도 3 및 도 9를 참조하면, 단계(S140)는 동일한 operation ID를 가지는 연산 명령어들의 연산 결과를 비교한다. 예를 들어, operation ID "op5"를 가지는 도 3의 연산 명령어는 "2"가 저장된 레지스터 r4의 값과 "3"을 합산한 값인 "5"를 레지스터 r3에 저장한다. operation ID "op5"를 가지는 도 9의 연산 명령어는 "2"가 저장된 레지스터 p2의 값과 "3"을 합산한 값인 "5"를 레지스터 p1에 저장한다.
양쪽 연산 명령어들의 연산 결과는 모두 "5"로 동일하다. 본 발명의 실시예들에 따르면 컴파일러에 의하여 변환된 프로그램 코드의 각 연산 명령어를 추적하며 변환 과정의 오류를 검출할 수 있다. 본 발명의 실시예들은 적절한 프로그램 코드를 선택함으로써 컴파일러의 변환 과정을 검증할 수 있고, 변환 과정에서의 오류가 발견되면 발견된 오류를 디버깅할 수 있다. 본 발명의 실시예들은 변환 과정에서의 오류가 발견되면 사용자에게 발견된 오류를 리포트할 수 있다. 본 발명의 실시예들은 변환 과정에서 오류가 발생한 연산 명령어를 식별할 수 있으므로 발견된 오류의 정정을 용이하게 할 수 있다. 본 발명의 실시예들에 따른 컴파일러는 동일한 operation ID를 가지는 연산 명령어들이 동일한 입력 값과 출력 값을 가지도록 하는 기준(criterion) 하에서 컴파일 과정을 수행할 수 있다. 상기 criterion 하에서 동일한 operation ID를 가지는 연산 명령어들의 operand는 다를 수 있으나 연산 결과는 동일하다.
도 10은 본 발명의 다른 실시예에 따른 컴파일러 및 상기 컴파일러의 디버깅 방법을 도시하는 도면이다.
도 10을 참조하면, 컴파일러는 컴파일러가 처리하기 쉬운 중간 표현(intermediate representation, IR)을 컴파일하여 프로세서가 처리하기 쉬운 프로그래밍 언어로 변환한다.
컴파일러는 스케줄되지 않은 IR(1001)을 코드 선택(code select) 기법을 적용하여 컴파일함으로써 코드 선택된 IR(1003)을 생성하는 코드 선택 모듈(1002)을 포함할 수 있다.
컴파일러는 코드 선택된 IR(1003)을 스케줄하여 스케줄된 IR(1005)을 생성하는 스케줄링 모듈(1004)을 포함할 수 있다.
컴파일러는 스케줄된 IR(1005)을 레지스터 얼로케이션(register allocation)하여 레지스터 할당된 IR(1007)을 생성하는 레지스터 얼로케이션 모듈(1006)을 포함할 수 있다.
컴파일러의 디버깅 방법은 시뮬레이터(1008)를 이용하여 스케줄되지 않은 IR(1001)의 연산 결과 1(1012)를 생성할 수 있다. 컴파일러의 디버깅 방법은 시뮬레이터(1009)를 이용하여 코드 선택된 IR(1003)의 연산 결과 2(1014)를 생성할 수 있다.
컴파일러의 디버깅 방법은 판정 모듈(1013)을 이용하여 결과 1(1012) 및 결과 2(1014)를 비교할 수 있다. 결과 1(1012) 및 결과 2(1014)가 동일하지 않으면, 컴파일러의 디버깅 방법은 컴파일러의 버그(bug)가 존재하는 것으로 간주하고 연산 결과가 동일하지 않은 operation ID를 사용자에게 리포트할 수 있다.
컴파일러의 디버깅 방법은 시뮬레이터(1010)를 이용하여 스케줄된 IR(1005)의 연산 결과 3(1016)를 생성할 수 있다. 컴파일러의 디버깅 방법은 판정 모듈(1015)을 이용하여 결과 2(1014) 및 결과 3(1016)를 비교할 수 있다. 결과 2(1014) 및 결과 3(1016)가 동일하지 않으면, 컴파일러의 디버깅 방법은 컴파일러의 버그가 존재하는 것으로 간주하고 연산 결과가 동일하지 않은 operation ID를 사용자에게 리포트할 수 있다.
컴파일러의 디버깅 방법은 시뮬레이터(1011)를 이용하여 레지스터 할당된 IR(1007)의 연산 결과 4(1018)를 생성할 수 있다. 컴파일러의 디버깅 방법은 판정 모듈(1017)을 이용하여 결과 3(1016) 및 결과 4(1018)를 비교할 수 있다. 결과 3(1016) 및 결과 4(1018)가 동일하지 않으면, 컴파일러의 디버깅 방법은 컴파일러의 버그가 존재하는 것으로 간주하고 연산 결과가 동일하지 않은 operation ID를 사용자에게 리포트할 수 있다.
도 11은 본 발명의 일 실시예에 따른 프로세서(1100)를 도시하는 도면이다.
도 11을 참조하면, 프로세서(1100)는 코드 변환부(1110), 제1 시뮬레이션부(1120) 및 제2 시뮬레이션부(1130)를 포함한다.
프로세서(1100)는 복수의 기능 유닛(functional unit)들을 포함하고, 실행되는 연산 명령어에 따라 복수의 기능 유닛들을 병렬적으로 이용할 수 있다.
코드 변환부(1110)는 제1 프로그램 코드를 컴파일하여 제2 프로그램 코드를 생성할 수 있다. 제1 프로그램 코드는 하나 이상의 제1 연산 명령어를 포함하고, 제2 프로그램 코드는 하나 이상의 제2 연산 명령어를 포함할 수 있다.
제1 시뮬레이션부(1120)는 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과를 생성한다. 제2 시뮬레이션부(130)는 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성한다.
프로세서(1100)는 연산 명령어를 병렬적으로 처리할 수 있는 재구성 프로세서이고, 제1 프로그램 코드는 프로세서(1100)에서 실행되기에 적합하도록 기술된 프로그램 코드일 수 있다.
제1 시뮬레이션부(1120)는 복수의 기능 유닛들을 이용하여 상기 하나 이상의 제1 연산 명령어를 병렬적으로 처리할 수 있다. 제2 시뮬레이션부(1130)는 복수의 기능 유닛들을 이용하여 상기 하나 이상의 제2 연산 명령어를 병렬적으로 처리할 수 있다.
코드 변환부(1110)는 상기 하나 이상의 제1 연산 명령어 각각에 연산 식별자(operation ID)를 부여할 수 있다.
프로세서(1100)는 제1 연산 명령어의 제1 연산 결과와 상기 제1 연산 명령어의 연산 식별자와 동일한 연산 식별자를 가지는 제2 연산 명령어의 제2 연산 결과를 비교할 수 있다. 프로세서(1100)는 제1 연산 명령어 및 제2 연산 명령어 각각의 연산 결과를 추적함으로써 제2 프로그램 코드의 유효성을 판정할 수 있다.
프로세서(1100)는 제2 프로그램 코드의 유효성을 판정함으로써 코드 변환부(1110)의 컴파일 과정의 유효성을 판정할 수 있다.
코드 변환부(1110)는 제1 프로그램 코드를 실행하는 과정에서 동시에 활성화되는 레지스터의 수가 하드웨어가 지원하는 레지스터의 수보다 크지 않도록 제1 프로그램 코드를 레지스터 얼로케이션하여 제2 프로그램 코드를 생성할 수 있다.
코드 변환부(1110)는 제1 프로그램 코드가 레지스터 얼로케이션되어 생성된 제2 프로그램 코드의 스택 정보를 제1 시뮬레이션부로 전송할 수 있다. 제1 시뮬레이션부(1120)는 스택 정보를 참조하여 제1 프로그램 코드를 시뮬레이트할 수 있다.
본 발명의 일 실시예에 따른 컴파일 방법 및 컴파일러의 디버깅 방법은 다양한 컴퓨터 수단을 통하여 수행될 수 있는 프로그램 명령 형태로 구현되어 컴퓨터 판독 가능 매체에 기록될 수 있다. 상기 컴퓨터 판독 가능 매체는 프로그램 명령, 데이터 파일, 데이터 구조 등을 단독으로 또는 조합하여 포함할 수 있다. 상기 매체에 기록되는 프로그램 명령은 본 발명을 위하여 특별히 설계되고 구성된 것들이거나 컴퓨터 소프트웨어 당업자에게 공지되어 사용 가능한 것일 수도 있다. 컴퓨터 판독 가능 기록 매체의 예에는 하드 디스크, 플로피 디스크 및 자기 테이프와 같은 자기 매체(magnetic media), CD-ROM, DVD와 같은 광기록 매체(optical media), 플롭티컬 디스크(floptical disk)와 같은 자기-광 매체(magneto-optical media), 및 롬(ROM), 램(RAM), 플래시 메모리 등과 같은 프로그램 명령을 저장하고 수행하도록 특별히 구성된 하드웨어 장치가 포함된다. 프로그램 명령의 예에는 컴파일러에 의해 만들어지는 것과 같은 기계어 코드뿐만 아니라 인터프리터 등을 사용해서 컴퓨터에 의해서 실행될 수 있는 고급 언어 코드를 포함한다. 상기된 하드웨어 장치는 본 발명의 동작을 수행하기 위해 하나 이상의 소프트웨어 모듈로서 작동하도록 구성될 수 있으며, 그 역도 마찬가지이다.
이상과 같이 본 발명은 비록 한정된 실시예와 도면에 의해 설명되었으나, 본 발명은 상기의 실시예에 한정되는 것은 아니며, 본 발명이 속하는 분야에서 통상의 지식을 가진 자라면 이러한 기재로부터 다양한 수정 및 변형이 가능하다.
그러므로, 본 발명의 범위는 설명된 실시예에 국한되어 정해져서는 아니 되며, 후술하는 특허청구범위뿐 아니라 이 특허청구범위와 균등한 것들에 의해 정해져야 한다.

Claims (12)

  1. 하나 이상의 제1 연산 명령어를 포함하는 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과를 생성하는 단계;
    상기 제1 프로그램 코드를 컴파일하여 하나 이상의 제2 연산 명령어를 포함하는 제2 프로그램 코드를 생성하는 단계;
    상기 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성하는 단계; 및
    상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하여 상기 제2 프로그램 코드의 유효성을 판정하는 단계
    를 포함하는 컴파일 방법.
  2. 제1항에 있어서,
    상기 제1 프로그램 코드를 컴파일하는 단계는
    상기 하나 이상의 제1 연산 명령어 각각에 연산 식별자를 부여하는 단계
    를 포함하고,
    상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하는 단계는
    동일한 연산 식별자에 대응하는 상기 제1 연산 명령어 및 상기 제2 연산 명령어의 연산 결과를 비교하는 컴파일 방법.
  3. 제1항에 있어서,
    상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하는 단계는
    상기 하나 이상의 제1 연산 명령어 중 대응하는 연산 식별자가 없는 제2 연산 명령어의 연산 결과를 판정하지 않는 컴파일 방법.
  4. 제1항에 있어서,
    상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하는 단계는
    연산 식별자에 대응하는 제2 연산 명령어가 존재하지 않는 제1 연산 명령어의 연산 결과를 판정하지 않는 컴파일 방법.
  5. 제1항에 있어서,
    상기 제1 프로그램 코드를 컴파일하는 단계는
    상기 제1 프로그램 코드가 실행되는 프로세서의 병렬성에 기초하여 상기 제1 프로그램 코드를 스케줄링하는 컴파일 방법.
  6. 제1항에 있어서,
    상기 제1 프로그램 코드를 컴파일하는 단계는
    상기 제1 프로그램 코드를 실행하는 과정에서 동시에 활성화되는 레지스터의 수가 하드웨어가 지원하는 레지스터의 수보다 크지 않도록 상기 제1 프로그램 코드를 레지스터 얼로케이션하는 컴파일 방법.
  7. 제6항에 있어서,
    상기 제1 프로그램 코드를 시뮬레이트하는 단계는
    상기 제1 프로그램 코드가 레지스터 얼로케이션되어 생성된 상기 제2 프로그램 코드의 스택 정보를 참조하여 상기 제1 프로그램 코드를 시뮬레이트하는 컴파일 방법.
  8. 제1항 내지 제7항 중 어느 한 항의 방법을 실행하기 위한 프로그램이 기록되어 있는 것을 특징으로 하는 컴퓨터에서 판독 가능한 기록 매체.
  9. 복수의 기능 유닛들을 포함하고, 실행되는 연산 명령어에 따라 상기 복수의 기능 유닛들을 병렬적으로 이용하는 재구성 프로세서에 있어서,
    하나 이상의 제1 연산 명령어를 포함하는 제1 프로그램 코드를 컴파일하여 하나 이상의 제2 연산 명령어를 포함하는 제2 프로그램 코드를 생성하는 코드 변환부;
    상기 제1 프로그램 코드를 시뮬레이트하여 제1 연산 결과를 생성하는 제1 시뮬레이션부; 및
    상기 제2 프로그램 코드를 시뮬레이트하여 제2 연산 결과를 생성하는 제2 시뮬레이션부
    를 포함하고,
    상기 제1 연산 결과 및 상기 제2 연산 결과를 비교하여 상기 제2 프로그램 코드의 유효성을 판정하는 재구성 프로세서.
  10. 제9항에 있어서,
    상기 코드 변환부는
    상기 하나 이상의 제1 연산 명령어 각각에 연산 식별자를 부여하고,
    상기 재구성 프로세서는
    동일한 연산 식별자에 대응하는 상기 제1 연산 명령어 및 상기 제2 연산 명령어의 연산 결과를 비교하는 재구성 프로세서.
  11. 제9항에 있어서,
    상기 코드 변환부는
    상기 제1 프로그램 코드를 실행하는 과정에서 동시에 활성화되는 레지스터의 수가 하드웨어가 지원하는 레지스터의 수보다 크지 않도록 상기 제1 프로그램 코드를 레지스터 얼로케이션하는 재구성 프로세서.
  12. 제11항에 있어서,
    상기 코드 변환부는
    상기 제1 프로그램 코드가 레지스터 얼로케이션되어 생성된 상기 제2 프로그램 코드의 스택 정보를 상기 제1 시뮬레이션부로 전송하고,
    상기 제1 시뮬레이션부는 상기 스택 정보를 참조하여 상기 제1 프로그램 코드를 시뮬레이트하는 재구성 프로세서.
KR1020080017957A 2008-02-27 2008-02-27 프로세서 및 컴파일 방법 KR101418969B1 (ko)

Priority Applications (4)

Application Number Priority Date Filing Date Title
KR1020080017957A KR101418969B1 (ko) 2008-02-27 2008-02-27 프로세서 및 컴파일 방법
US12/325,361 US8752031B2 (en) 2008-02-27 2008-12-01 Compiling method and processor using the same
EP08171662A EP2096539A3 (en) 2008-02-27 2008-12-15 Compiling method and processor using the same
CN200910005718.9A CN101520737B (zh) 2008-02-27 2009-02-03 编译方法和使用该编译方法的处理器

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020080017957A KR101418969B1 (ko) 2008-02-27 2008-02-27 프로세서 및 컴파일 방법

Publications (2)

Publication Number Publication Date
KR20090092617A true KR20090092617A (ko) 2009-09-01
KR101418969B1 KR101418969B1 (ko) 2014-08-13

Family

ID=40336623

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020080017957A KR101418969B1 (ko) 2008-02-27 2008-02-27 프로세서 및 컴파일 방법

Country Status (4)

Country Link
US (1) US8752031B2 (ko)
EP (1) EP2096539A3 (ko)
KR (1) KR101418969B1 (ko)
CN (1) CN101520737B (ko)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101219535B1 (ko) * 2011-04-28 2013-01-10 슈어소프트테크주식회사 코드 컨버팅 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
KR20130105183A (ko) * 2012-03-16 2013-09-25 삼성전자주식회사 재구성 가능 프로세서의 검증 지원 장치 및 방법

Families Citing this family (16)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9389840B2 (en) * 2009-02-11 2016-07-12 Johnathan Mun Compiled and executable method
US20110099439A1 (en) * 2009-10-23 2011-04-28 Infineon Technologies Ag Automatic diverse software generation for use in high integrity systems
US20110208948A1 (en) * 2010-02-23 2011-08-25 Infineon Technologies Ag Reading to and writing from peripherals with temporally separated redundant processor execution
US8516356B2 (en) 2010-07-20 2013-08-20 Infineon Technologies Ag Real-time error detection by inverse processing
US8756591B2 (en) 2011-10-03 2014-06-17 International Business Machines Corporation Generating compiled code that indicates register liveness
US8612959B2 (en) 2011-10-03 2013-12-17 International Business Machines Corporation Linking code for an enhanced application binary interface (ABI) with decode time instruction optimization
US8615745B2 (en) 2011-10-03 2013-12-24 International Business Machines Corporation Compiling code for an enhanced application binary interface (ABI) with decode time instruction optimization
TWI484413B (zh) * 2012-04-03 2015-05-11 Mstar Semiconductor Inc 基於功能性的程式比較方法
CN103377040B (zh) * 2012-04-16 2016-08-03 晨星软件研发(深圳)有限公司 基于功能性的程序比较方法
KR102013582B1 (ko) * 2012-09-07 2019-08-23 삼성전자 주식회사 혼합 모드 프로그램의 소스 코드 오류 위치 검출 장치 및 방법
US9740464B2 (en) * 2014-05-30 2017-08-22 Apple Inc. Unified intermediate representation
US10430169B2 (en) 2014-05-30 2019-10-01 Apple Inc. Language, function library, and compiler for graphical and non-graphical computation on a graphical processor unit
US10346941B2 (en) 2014-05-30 2019-07-09 Apple Inc. System and method for unified application programming interface and model
CN105677559B (zh) * 2015-12-31 2018-05-11 杭州华为数字技术有限公司 一种检测方法及装置
US10671363B2 (en) 2018-10-31 2020-06-02 International Business Machines Corporation Generating code for function calls that use multiple addressing modes
US10671362B2 (en) 2018-10-31 2020-06-02 International Business Machines Corporation Generating code for function calls that use multiple addressing modes

Family Cites Families (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5754860A (en) * 1996-07-23 1998-05-19 Digital Equipment Corporation Method and apparatus for software testing using a differential testing technique to test compilers
US5857093A (en) * 1996-09-20 1999-01-05 Allen-Bradley Company, Llc Cross-compiled simulation timing backannotation
US6223337B1 (en) * 1997-12-12 2001-04-24 Hewlett-Packard Company Random test generation for compiler optimization
US6173440B1 (en) * 1998-05-27 2001-01-09 Mcdonnell Douglas Corporation Method and apparatus for debugging, verifying and validating computer software
US6601024B1 (en) * 1998-11-12 2003-07-29 Synopsys, Inc. Code translation between hardware design languages
US6701501B2 (en) * 2000-10-16 2004-03-02 Simon Joshua Waters Structured algorithmic programming language approach to system design
US6691286B1 (en) * 2000-10-31 2004-02-10 Synplicity, Inc. Methods and apparatuses for checking equivalence of circuits
US7165231B2 (en) * 2000-12-18 2007-01-16 Yardstick Research, Llc Method and system for incremental behavioral validation of digital design expressed in hardware description language
SE0202019D0 (sv) * 2002-06-28 2002-06-28 Abb As Revalidation of a compiler for safety control
JP4147842B2 (ja) * 2002-07-04 2008-09-10 日本電気株式会社 論理検証システム及び方法、論理コーン抽出装置及び方法、論理検証及び論理コーン抽出プログラム
US7346903B2 (en) * 2003-02-04 2008-03-18 Sun Microsystems, Inc. Compiling and linking modules of a cycle-based logic design
US7305666B2 (en) * 2003-07-23 2007-12-04 Microsoft Corporation Description language for an extensible compiler and tools infrastructure
US7856624B2 (en) * 2003-09-15 2010-12-21 Thomas Plum Automated safe secure techniques for eliminating undefined behavior in computer software
US20050071823A1 (en) * 2003-09-29 2005-03-31 Xiaodong Lin Apparatus and method for simulating segmented addressing on a flat memory model architecture
US7606695B1 (en) * 2003-09-30 2009-10-20 Sun Microsystems, Inc. Self-checking simulations using dynamic data loading
US7415700B2 (en) * 2003-10-14 2008-08-19 Hewlett-Packard Development Company, L.P. Runtime quality verification of execution units
JP4157016B2 (ja) * 2003-11-05 2008-09-24 株式会社東芝 コンパイラ装置及びコンパイル方法
US7584405B2 (en) * 2003-12-03 2009-09-01 Hewlett-Packard Development Company, L.P. Fault-detecting computer system
JP4283131B2 (ja) * 2004-02-12 2009-06-24 パナソニック株式会社 プロセッサ及びコンパイル方法
JP4082706B2 (ja) * 2005-04-12 2008-04-30 学校法人早稲田大学 マルチプロセッサシステム及びマルチグレイン並列化コンパイラ
CN100442243C (zh) * 2005-08-12 2008-12-10 中国科学院计算技术研究所 一种对编译器中的错误进行自动定位的方法
US20070113219A1 (en) * 2005-11-17 2007-05-17 Microsoft Corporation Representing simulation values of variable in sharpley limited time and space
US8079022B2 (en) * 2007-06-04 2011-12-13 Carbon Design Systems, Inc. Simulation of software
US7904850B2 (en) * 2007-11-30 2011-03-08 Cebatech System and method for converting software to a register transfer (RTL) design

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101219535B1 (ko) * 2011-04-28 2013-01-10 슈어소프트테크주식회사 코드 컨버팅 장치, 방법 및 컴퓨터 판독 가능한 기록 매체
KR20130105183A (ko) * 2012-03-16 2013-09-25 삼성전자주식회사 재구성 가능 프로세서의 검증 지원 장치 및 방법

Also Published As

Publication number Publication date
CN101520737A (zh) 2009-09-02
CN101520737B (zh) 2014-02-26
KR101418969B1 (ko) 2014-08-13
EP2096539A2 (en) 2009-09-02
EP2096539A3 (en) 2009-10-07
US20090217249A1 (en) 2009-08-27
US8752031B2 (en) 2014-06-10

Similar Documents

Publication Publication Date Title
KR101418969B1 (ko) 프로세서 및 컴파일 방법
US9292265B2 (en) Method for convergence analysis based on thread variance analysis
EP2706459B1 (en) Apparatus and method for validating a compiler for a reconfigurable processor
US8997066B2 (en) Emulating pointers
US10133871B1 (en) Method and system for identifying functional attributes that change the intended operation of a compiled binary extracted from a target system
Sinz et al. LLBMC: A Bounded Model Checker for LLVM’s Intermediate Representation: (Competition Contribution)
Stattelmann et al. Dominator homomorphism based code matching for source-level simulation of embedded software
CN110419031A (zh) 用于微控制器程序的代码覆盖范围跟踪
US20100083238A1 (en) Binary manipulation of intermediate-language code
Zhao et al. Deepdsl: A compilation-based domain-specific language for deep learning
Ayache et al. Certifying and reasoning on cost annotations in C programs
CN109271237A (zh) 仿真控制方法和装置
US9836289B2 (en) Executable code generation program and executable code generation device
JPH06309193A (ja) 機械語プログラムの動作検証方法および装置
Kobeissi et al. Rec2poly: Converting recursions to polyhedral optimized loops using an inspector-executor strategy
Nobre et al. Nonio—modular automatic compiler phase selection and ordering specialization framework for modern compilers
JPH10320212A (ja) キャッシュ向け最適化方法
Weidendorfer et al. The case for binary rewriting at runtime for efficient implementation of high-level programming models in HPC
CN113260976A (zh) 用于在编译源代码中调度指令技术
JP2009515243A (ja) ホストコンピュータ上で実行可能なシミュレーションプログラムを生成する方法
Ittershagen et al. A workload extraction framework for software performance model generation
KR20160142050A (ko) 테스트 패턴 발생 장치 및 방법, 이를 이용한 테스트 시스템과, 컴퓨터 프로그램
KR101276308B1 (ko) 다중 출력 명령어를 지원하는 그래프 기반의 코드 생성 장치 및 그 코드 생성 방법
JP2010140344A (ja) コンパイルシステム及びコンパイル方法
Mortensen Isolating Errors for an Assembly Optimizer

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20170629

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20180628

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20190627

Year of fee payment: 6