KR101579589B1 - 파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법 - Google Patents

파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법 Download PDF

Info

Publication number
KR101579589B1
KR101579589B1 KR1020090011513A KR20090011513A KR101579589B1 KR 101579589 B1 KR101579589 B1 KR 101579589B1 KR 1020090011513 A KR1020090011513 A KR 1020090011513A KR 20090011513 A KR20090011513 A KR 20090011513A KR 101579589 B1 KR101579589 B1 KR 101579589B1
Authority
KR
South Korea
Prior art keywords
code
target address
prediction
information
block
Prior art date
Application number
KR1020090011513A
Other languages
English (en)
Other versions
KR20100092230A (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 KR1020090011513A priority Critical patent/KR101579589B1/ko
Priority to US12/692,735 priority patent/US8954946B2/en
Publication of KR20100092230A publication Critical patent/KR20100092230A/ko
Application granted granted Critical
Publication of KR101579589B1 publication Critical patent/KR101579589B1/ko

Links

Images

Classifications

    • 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • 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/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • G06F9/3846Speculative instruction execution using static prediction, e.g. branch taken strategy

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)

Abstract

파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법이 개시된다. 정적 분기 예측 방법에서는 조건부 분기 코드에 대하여 테이큰 또는 낫-테이큰으로 예측하여 예측 정보를 추가한 다음, 이 조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드와 테스트 코드로 변환하여 블록 내의 코드들을 스케쥴한다. 이 경우에 테스트 코드를 블록의 마지막 슬롯에 스케쥴하고 또한 점프 타깃 어드레스 설정 코드는 블록 내의 다른 모든 코드들을 스케쥴링한 후에 빈 슬롯에 스케쥴한다. 그리고 예측 단계에서 테이큰으로 예측한 경우에는 분기 시기 정보가 지시하는 사이클 시간에 타깃 어드레스 정보가 지시하는 타깃 어드레스를 페치하므로, 지연 슬롯을 사용할 필요가 없다.
파이프라인 프로세서, 정적 분기 예측, 파이프라인 제어 해저드, VLIW

Description

파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법{Static branch prediction method for pipeline processor and compile method therefor}
본 명세서는 명령어(instruction)들을 실행하는 프로세서(processor)에 관한 것으로, 보다 구체적으로 파이프라인 프로세서(pipeline processor)에 관한 것이다.
파이프라인 프로세서에서는 하나의 명령어 처리가 여러 개의 단계들로 구분되어 이루어진다. 예를 들어, 명령어 처리 과정은 페치(fetch) 단계, 디코드(decode) 단계, 실행(execute) 단계, 메모리(memory) 단계, 및 기입(write) 단계로 구분될 수 있다. 파이프라인 프로세서에서는 복수의 명령어들이 겹쳐진 형태로 파이프라인의 각 단계들을 순차적으로 지나가면서 실행될 수 있기 때문에, 프로그램의 고속 처리가 가능하다.
파이프라인 프로세서의 성능에 영향을 미치는 요소들 중의 하나는 '분기 해저드(branch hazard)' 또는 '파이프라인 제어 해저드(pipeline control hazard)'이다. 분기 해저드는 분기 명령어(branch instruction)로 인하여 파이프라인 프로세 서의 처리 속도가 저하되는 것을 가리킨다. 파이프라인 프로세서에서는 분기 명령어의 디코드 단계가 완료되거나 또는 실행 단계가 수행될 때까지는 다음에 페치할 명령어의 어드레스를 알 수가 없기 때문에, 분기 명령어는 파이프라인 프로세서의 성능을 저하시킬 수가 있다. 파이프라인 프로세서의 분기 해저드를 없애기 위하여 많은 연구가 진행되고 있는데, 동적 분기 예측(dynamic branch prediction), 지연 분기(delayed branch), 정적 분기 예측(static branch prediction) 등의 기법들이 제안되었다.
한편, 재구성가능 프로세서(Reconfigurable Processor)는 데이터 연산이 많은 루프(loop)들은 코어스 그레인 재구성가능 어레이(Coarse Grained reconfigurable Array, CGA)에서 가속하여 연산하는 반면 제어 파트(control part)는 VLIW(Very Long Instruction Word) 머신에서 실행한다. 제어 파트는 일반적으로 기본 블록(Basic Block, BB)의 크기가 작고 데이터 흐름이 간단한 특징이 있다. VLIW 머신에 있어서, 명령어의 실행 스케쥴은 소프트웨어인 컴파일러에 의해 프로세서 외부에서 결정되고 프로세서 내에서의 실행 스케쥴은 고정되어 있기 때문에, 하드웨어를 간단하게 할 수 있다.
전술한 분기 해저드를 완화하기 위한 방법들 중에서, 동적 분기 예측 방법은 프로그램의 실행 중에 과거 행적(history)에 비추어 해당 조건부 분기 명령에 대하여 테이큰(taken) 또는 낫-테이큰(not-taken)으로 예측을 하는 기법이다. 이러한 동적 분기 예측 방법은, 분기 문제를 해결하기 위하여 많은 하드웨어를 필요로 하므로, 간단한 하드웨어 구성을 요구하는 VLIW 머신의 파이프라인 제어 해저드를 없 애기 위한 방법으로는 적합하지 않다. 그리고 조건부 분기 오퍼레이션(branch operation)과 의존성이 없는 명령어들을 지연 슬롯(delayed slots)에 채워 넣는 지연 분기 방법도, 기본 블록(BB)의 크기가 작아서 주로 적은 개수의 명령어를 처리하는 VLIW 머신에 적용하기에 적합하지 않다.
정적 분기 예측 방법은 프로그램을 실행하기 전에 이미 조건부 분기 명령어에 대한 테이큰(taken) 또는 낫-테이큰(not-taken)의 분기 예측이 결정되는 방식이다. 기존의 정적 분기 예측 방법에 의하면, 낫-테이큰으로 예측한 경우에는 지연 슬롯을 사용하지 않지만, 테이큰으로 예측한 경우에는 분기 명령어 뒤에 지연 슬롯을 포함시킨다. 따라서 기존의 정적 분기 예측 방법도 VLIW 머신에 적용하기에는 일정한 한계가 있다. 또한, 기존의 정적 분기 예측 방법에 의하면, 분기 오퍼레이션을 수행하는데 많은 정보(데이터)가 필요할 뿐만 아니라 수행해야 할 일(비교 과정 및 분기 과정 등)도 많기 때문에, 분기 명령어의 처리할 때 인코딩 공간(encoding space)의 부족을 초래할 수 있다.
파이프라인 프로세서의 제어 해저드를 감소시키거나 없애서 그 성능을 향상시킬 수 있는 정적 분기 예측 방법과 장치 및 이를 위한 컴파일 방법이 제안된다. 특히, 기본 블록(BB)에 포함되는 명령어들의 개수가 많지 않은 프로그램의 고속 처리에 적합한 파이프라인 프로세서를 위한 정적 분기 예측 방법과 장치 및 이를 위한 컴파일 방법이 제안된다.
그리고 파이프라인 프로세서에서 하드웨어 추가의 부담이 적으며 또한 테이큰으로 예측한 경우에도 지연 슬롯을 사용할 필요가 없는 정적 분기 예측 방법과 장치 및 이를 위한 컴파일 방법이 제안된다. 특히, 분기 명령어의 처리시에 인코딩 공간이 부족한 현상도 생기지 않도록 할 수 있는 정적 분기 예측 방법과 장치 및 이를 위한 컴파일 방법이 제안된다.
일 실시예에 따른 파이프라인 프로세서를 위한 정적 분기 예측 방법은, 조건부 분기 코드에 대하여 테이큰 또는 낫-테이큰으로 예측하는 단계, 상기 조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드와 테스트 코드로 변환하여 블록 내의 코드들을 스케쥴하되, 상기 테스트 코드를 블록의 마지막 슬롯에 스케쥴하고 또한 상기 점프 타깃 어드레스 설정 코드는 상기 블록 내의 다른 모든 코드들을 스케쥴링한 후에 빈 슬롯에 스케쥴하는 단계, 및 상기 예측 단계에서 테이큰으로 예측한 경우에, 상기 분기 시기 정보가 지시하는 사이클 시간에 상기 타깃 어드레스 정보가 지시하는 타깃 어드레스를 페치하는 단계를 포함한다.
다른 실시예에 따른 정적 분기 예측을 위한 코드 컴파일 방법은, 조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드와 테스트 코드로 변환하는 단계, 및 상기 테스트 코드와 상기 점프 타깃 어드레스 설정 코드를 포함하는 블록 내의 모든 코드들을 스케쥴링하는 단계를 포함하고, 상기 스케쥴링 단계에서는 상기 테스트 코드를 블록의 마지막 슬롯에 스케 쥴하고 또한 상기 점프 타깃 어드레스 설정 코드는 상기 블록 내의 다른 모든 코드들을 스케쥴링한 후에 빈 슬롯에 스케쥴한다.
또 다른 실시예에 따른 파이프라인 프로세서를 위한 코드 실행 방법은 조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드로 변환하는 단계, 상기 블록 내의 다른 모든 코드들을 스케쥴링한 후에 생기는 빈 슬롯에 상기 점프 타깃 어드레스 설정 코드를 스케쥴하는 단계, 및 상기 분기 시기 정보가 지시하는 사이클 시간에 상기 타깃 어드레스 정보가 지시하는 타깃 어드레스를 페치하는 단계를 포함한다.
일 실시예에 의하면, 하드웨어 추가의 부담을 줄일 수 있는 정적 분기 예측 방법을 사용하면서도 지연 슬롯을 사용할 필요가 없다. 따라서 기본 블록의 크기가 작은 제어 파트 등의 처리에 적합하여 VLIW 머신에 적용하기에 적합하다. 그리고 기존의 방법에 비하여 기본 블록을 처리하는데 소요되는 사이클 시간을 단축시킬 수가 있기 때문에, 프로세서의 성능과 속도를 향상시킬 수가 있을 뿐만 아니라 컴파일러(compiler)를 단순화할 수 있다. 또한, 기본 블록 내의 다른 명령어들을 모두 스케쥴한 다음에 빈 슬롯에 점프 타깃 어드레스 설정(JTS) 명령어를 스케쥴할 수 있어서 스케쥴 품질이 높으며, 조건부 분기 명령어를 처리하는데 많은 인코딩 공간이 필요하지가 않다.
이하, 첨부된 도면들을 참조하여 본 발명의 실시예들을 상세하게 설명한다. 본 발명의 양상을 설명함에 있어 관련된 공지 기능 또는 구성에 대한 구체적인 설명이 본 발명의 요지를 불필요하게 흐릴 수 있다고 판단되는 경우에는 그 상세한 설명을 생략할 것이다. 또한, 후술되는 용어들은 본 발명의 실시예에서의 기능을 고려하여 정의된 용어들로서 이는 사용자, 운용자의 의도 또는 관례 등에 따라 달라질 수 있다. 그러므로 그 정의는 본 명세서 전반에 걸친 내용을 토대로 내려져야 할 것이다.
도 1은 일 실시예에 따른 정적 분기 예측 방법을 보여 주는 흐름도이다. 도 1에 도시된 실시예는 명령어 레지스터(Instruction Register, IR)의 소스 코드에 조건부 분기 명령어 또는 코드(conditional branch instruction or code)가 포함되어 있는 경우이다.
도 1을 참조하면, 우선 조건부 분기 오퍼레이션에 대하여 테이큰(taken) 또는 낫-테이큰(not-taken)으로 예측한다(S10). 도 1에는 테이큰으로 예측하는 경우가 도시되어 있는데, 이것은 단지 예시적인 것이다. 테이큰 또는 낫-테이큰으로 예측할 경우에 사용하는 알고리즘에 대해서는 아무런 제한이 없다. 예를 들어, 모두 테이큰 또는 낫-테이큰으로 예측하거나 또는 프로파일 기반 예측(profile based prediction)을 하는 등, 기존의 정적 분기 예측 방법에서 사용된 것과 동일한 알고리즘을 사용할 수 있다. 단계 S10의 결과, 예측 정보, 즉 테이큰으로 예측했는지 또는 낫-테이큰으로 예측했는지에 관한 정보는 스케쥴링 단계 또는 컴파일 과정(S20)에서 각 조건부 분기 명령어에 추가되는데, 이에 대해서는 후술한다.
계속해서, 조건부 분기 명령어를 점프 타깃 주소 설정(Jump Target address Setting, JTSc) 코드와 테스트 코드(test code)로 변환한 다음, 명령어 레지스터(Instruction Register, IR)에서의 코드들을 스케쥴링을 수행한다(S20). 여기서, 점프 타깃 주소 설정(JTSc) 코드 및 테스트 코드라는 명칭은 임의적인 것으로, 동일한 기능을 수행하고 또한 이를 위하여 동일한 정보를 포함하는 다른 명칭이 대신 사용될 수 있다. 스케쥴링 과정은 각 명령어 레지스터(Instruction Register, IR) 또는 각 기본 블록(BB) 내의 코드들을 실행할 순서대로 재배열하는 과정으로서, 명령어들의 컴파일(compile) 과정의 일부일 수 있다. 하나의 파이프라인을 갖는 프로세서의 경우에는 하나의 명령어 레지스터(IR)는 하나의 처리 블록을 이용하여 컴파일되나, 슈퍼스칼라 구조(superscalar structures)에서는 복수의 처리 블록으로 컴파일될 수 있다.
JTSc 코드(여기서, 'c'는 'conditional'을 나타낸다)는 타깃 어드레스 정보(target address information)와 분기 시기 정보(branch time information)를 포함하며, 예측 정보(prediction information)도 포함할 수 있다. 여기서 사용된 정보들의 명칭도 예시적인 것이다. 타깃 어드레스 정보는 조건부 분기 오퍼레이션에서 테이큰이 선택될 경우(즉, 테이큰으로 예측한 경우에는 예측이 맞거나 또는 낫-테이큰으로 예측했는데 예측이 맞지 않은 경우)에 실행될 타깃 블록의 어드레스 정보일 수 있다. 분기 시기 정보는 분기가 언제 일어나는지를 지시하는 정보로서, 예컨대 몇 사이클(cycle) 후에 테스트 코드가 오는지를 나타내는 값일 수 있다. 그리고 예측 정보는 단계 S10에서 테이큰으로 예측했는지 또는 낫-테이큰으로 예측했는 지를 나타내는 정보로, 테이큰(t) 또는 낫-테이큰(n)을 지시하는 임의의 값으로 설정할 수 있다. 이러한 예측 정보는 테스트 오퍼레이션에서의 테스트 결과를 비교할 때 사용하는 힌트가 될 수 있다.
테스트 코드 또는 테스트 명령어는 단계 S10에서의 예측이 맞는지를 확인하기 위한 것으로서, 예컨대 비교 명령어(compare instruction)와 동일한 기능을 하는 명령어일 수 있다. 테스트 명령어를 실행하기 위해서는 다른 명령어에 의한 실행 결과가 필요하므로, 테스트 명령어는 다른 명령어들의 실행 결과에 의존 관계가 있다. 따라서 테스트 명령어는 일반적으로 해당 블록에서 마지막에 처리되도록 스케쥴링된다.
도 2는 도 1의 단계 S20에서의 명령어 스케쥴링 과정 또는 명령어 레지스터(IR)의 코드들을 컴파일하는 과정의 일례를 보여 주는 흐름도이다.
도 2를 참조하면, 먼저 조건부 분기 명령어에 예측 정보를 추가한다(S21). 예측 정보는 도 1의 단계 S10에서의 예측 결과를 나타내는 정보로서, 테이큰(t) 또는 낫-테이큰(n)을 지시하는 정보일 수 있다. 그리고 예측 정보를 포함하는 조건부 분기 명령어를 JTSc 코드와 테스트 코드로 분리한다(S22). 전술한 바와 같이, 조건부 분기 명령어에 포함된 정보들 중에서, 비교 오퍼레이션을 위한 정보들은 테스트 코드에 포함시키며, JTSc 코드에는 타깃 어드레스 정보 등을 포함시킨다. 그리고 JTSc 코드에는 타깃 어드레스 정보 외에 분기 시기 정보(예컨대, 테스트 코드가 몇 사이클 후에 나오는지를 지시하는 값)와 함께 단계 S21에서 삽입된 예측 정보도 포함될 수 있다.
그리고 JTSc 코드, 테스트 코드, 및 해당 블록 내에 포함되는 다른 명령어들을 실행 순서에 따라서 배열한다(S23). 이 경우에, JTSc 코드를 제외한 다른 명령어들은 기존의 방식대로 먼저 스케쥴링할 수 있다. 여기서 기존의 방식이란, 종래의 정적 분기 예측 방법에서 조건부 분기 명령어를 JTSc 코드와 테스트 코드로 나누어서 실행하지 않을 경우의 명령어 스케쥴링 방법일 수 있다. 예를 들어, 기존의 방식(지연 슬롯을 사용하는 방법)에 의할 경우에는, 비교 명령어(compare instruction) 다음에는 분기 명령어(branch instruction)를 삽입한다. 그리고 분기 명령어 뒤에는 지연 슬롯들을 삽입함으로써 비교 명령어와 의존 관계에 있지 않은 다른 명령어들이 지연 슬롯에 배열되도록 스케쥴링할 수 있다.
그러나 조건부 분기 명령어가 JTSc 코드와 테스트 코드로 나누어진 본 실시예에서는, 블록 내의 다른 명령어들에 의존 관계가 있는 테스트 코드가 해당 블록에서 마지막에 실행되도록 한다. 그리고 다른 명령어들을 모두 스케쥴링한 후에 JTSc 코드의 실행 순서는 제일 마지막에 결정한다. 전술한 바와 같이, JTSc 코드는 다른 명령어들과 의존 관계가 없기 때문에, 제일 늦게 스케쥴링을 할 수 있을 뿐만 아니라, 그 배열 위치에 제약이 거의 없다. 그리고 JTSc 코드는 조건부 분기 명령어에 의하여 분기가 될 경우에 현재 블록의 다음에 페치할 블록의 어드레스에 관한 제반 정보를 포함한다. 이러한 정보는 가능한 일찍 획득할수록 파이프라인 프로세서의 분기 헤저드를 없애거나 감소시키는데 도움이 된다. 따라서 본 실시예에서는 JTSc 코드가 가능한 앞쪽에서 실행될 수 있도록 JTSc 코드를 스케쥴링을 할 수 있다. 예를 들어, JTSc 코드는 기존의 스케쥴링 방법(즉, 단계 S22)에서 nop 슬롯으 로 할당되는 슬롯들 중에서 제일 앞쪽에 있는 nop 슬롯에 배치할 수 있다.
계속해서 도 1을 참조하면, 스케쥴된 순서에 따라서 명령어들을 순차적으로 페치하여 실행한다(S30). 단계 S10에서 테이큰으로 예측한 경우에는, 도 1에 도시된 바와 같이, 테스트 코드의 페이 이후에는 JTSc 코드에 포함된 분기 시기 정보가 지시하는 사이클(예컨대, 테스트 코드의 페치 이후)에 또한 JTSc 코드에 포함된 타깃 어드레스 정보가 지시하는 블록의 어드레스를 페치할 수 있다. 반면, 단계 S10에서 낫-테이큰으로 예측한 경우에는, 테스트 코드의 페치 이후에는 현재 블록(테스트 코드)의 다음 블록의 명령어들을 순차적으로 페치할 수 있다.
이러한 예측에 기초한 명령어들의 페치는 테스트 코드를 페치한 이후에 바로 시작하여 테스트 코드의 디코드 단계가 종료되거나 또는 실행 단계에 의하여 예측이 맞았는지를 확인할 수 있을 때까지 수행할 수 있다. 이에 의하면, 단계 S10에서 테이큰으로 예측한 경우에도 테스트 코드 이후에 지연 슬롯을 사용할 필요가 없거나 또는 지연 슬롯의 사용을 최소화할 수가 있다. 왜냐하면, 본 실시예에서는 테스트 코드를 디코드하여 실행하지 않더라도 조건부 분기 명령어에서 분리된 JTSc 코드를 먼저 실행하여 분기될 타깃 어드레스와 분기 시기를 미리 알 수 있기 때문이다.
그리고 해당 블록의 테스트 코드를 실행하여 단계 S10에서의 예측이 맞았는지에 따라서 페치된 명령어들을 그대로 처리하거나 또는 테스트 코드 뒤에 페치된 명령어들을 플러쉬(flush)한다(S40). 즉, 단계 S10에서의 예측이 맞는 경우에는 단계 S30에서 페치한 순서대로 그대로 명령어들을 실행하지만, 예측이 맞지 않는 경 우에는 테스트 코드 이후에 페치한 명령어들은 모두 플러쉬하고 다른 어드레스(예컨대, 해당 블록의 다음 블록이나 JTSc 코드에 포함된 타깃 어드레스)를 페치한다. 예측이 맞았는지를 확인하기 위하여, JTSc 코드에 포함된 예측 정보를 이용할 수 있다.
예를 들어, 도 1에 도시된 바와 같이, 단계 S10에서 테이큰으로 예측했다고 가정하자. 이 경우에, 테스트 코드의 실행 단계를 수행한 결과, 예측이 맞는 것으로 확인된 경우에는 JTSc 코드에 포함되어 있는 분기 어드레스 정보에서 지시하는 블록의 명령어들, 즉 테스트 코드의 뒤를 이어 이미 페치된 명령어들을 그대로 처리한다. 반면, 예측이 맞지 않는 경우에는, 테스트 코드의 뒤를 이어 페치한 명령어들은 모두 플러쉬하고 대신에 현재 블록의 다음 블록의 명령어들을 페치하기 시작한다.
이하에서는 도 3에 도시된 코드들을 예로 들어서, 종래의 정적 분기 예측 방법과 본 실시예의 정적 분기 예측 방법의 차이점을 비교하여 설명하기로 한다. 도 3은 VLIW 머신에서 실행될 수 있는 명령어 레지스터(IR)에서의 코드들의 일례이다.
도 4a는 종래의 정적 분기 예측 방법에 따라서 도 3의 코드들을 스케쥴링한, 즉 컴파일한 코드들을 보여 주는 도면이고, 도 4b는 예측이 맞는 경우에 도 4a로 스케쥴링된 코드들의 일부에 대한 파이프라인 스테이지를 보여 주는 도면이다. 그리고 도 5a는 전술한 실시예에 따라서 도 3의 코드들을 스케쥴링한, 즉 컴파일한 코드들을 보여 주는 도면이고, 도 5b는 예측이 맞는 경우에 도 5a로 스케쥴링된 코 드들의 일부에 대한 파이프라인 스테이지를 보여 주는 도면이다. 도 4b 및 도 5b에서 F, D, E, M, 및 W는 각각 페치(fetch) 단계, 디코드(decode) 단계, 실행(execute) 단계, 메모리(memory) 단계, 및 기입(write) 단계를 나타낸다. 도시된 예들은 두 개의 처리 블록을 포함하는 슈퍼스칼라 구조에 대한 것이나 이러한 하드웨어 구성은 단지 예시적인 것이다.
도 4a 및 도 4b를 참조하면, 기존의 방법에 의할 경우에는, 비교 명령어(compare, cmp)의 실행 단계(E)에서는 주어진 값들(r3, r2)을 비교하여 분기할 것인가를 결정하며, 분기 명령어(branch)의 디코드 단계(D)가 되어야 이후에 페치할 분기 타깃 어드레스(branch target address)를 알 수 있다. 따라서 기존의 방법에 의할 경우에는 분기 명령어 이후에 지연 슬롯이 추가되어야 하는데, 도 4a에는 지연 슬롯에 삽입할 적당한 코드가 없어서 nop가 추가된 것이 도시되어 있다. 도시된 예에서는 이러한 지연 슬롯의 추가로 인하여 제1 기본 블록(BB1)을 실행하는데 총 6사이클이 소요되며, 사이클 시간(cycle time) 6에 새로운 타깃 어드레스를 페치한다는 것을 알 수 있다.
반면, 도 5a 및 도 5b를 참조하면, JTSc 코드의 디코드 단계(D)인 사이클 시간(cycle time) 2에서 분기 타깃 주소를 알 수 있고, 또한 2사이클 후인 사이클 시간 4에 분기 어드레스인 제3 기본 블록(BB3)의 명령어를 페치한다는 것도 알 수 있다. 그리고 테스트 코드를 디코드하고 이를 실행하여 분기 예측이 맞으면 아무것도 하지 않고 파이프라인 프로세서에서 계속 명령어들의 처리 절차가 진행된다. 따라서 도시된 예에 의하면, 제1 기본 블록(BB1)을 실행하는데 총 4사이클이 소요되며, 사이클 시간 4에 타깃 어드레스를 페치한다는 것을 알 수 있다. 이것은 본 실시예에 의하면 파이프라인 프로세서의 처리 속도와 성능을 향상시킬 수가 있다는 것을 잘 보여 준다.
도 5c는 예측이 맞지 않는 경우에 도 5a로 스케쥴링된 코드들의 일부에 대한 파이프라인 스테이지를 보여 주는 도면이다. 도 5c를 참조하면, 도 5b에서와 마찬가지로, 제1 기본 블록(BB1)의 JTSc 코드를 디코드하여 사이클 시간 2에 타깃 어드레스를 계산하고 2사이클 후인 사이클 시간 4에 새로운 어드레스인 제3 기본 블록(BB3)을 페치한다. 그런데, 테스트 코드를 실행한 결과 예측이 틀린 것으로 확인되었으므로, 제3 기본 블록(BB3)으로부터 페치한 오퍼레이션들은 모두 플러쉬하고, 사이클 시간 6에 후속 블록인 제2 기본 블록(BB2)을 페치한다.
도 6은 다른 실시예에 따른 명령어 스케쥴링 방법 또는 컴파일 방법을 보여 주는 흐름도로서, 소스 코드가 무조건부 분기 명령어(unconditional branch instruction)를 포함하는 경우이다. 무조건부 분기 명령어는 예컨대, 도 3에 도시된 예에서, 제2 기본 블록(BB2)의 코드 'jump'일 수 있는데, 이것은 단지 예시적인 것이다.
도 6을 참조하면, 우선 무조건부 분기 명령어(jump)를 점프 타깃 주소 설정(Jump Target address Setting, JTSu) 코드로 변환한다(S110). 여기서도 점프 타깃 주소 설정(JTSu) 코드(여기서, 'u'는 'unconditional'을 나타낸다)라는 명칭은 임의적인 것으로, 동일한 기능을 수행하고 또한 이를 위하여 동일한 정보를 포함하 는 다른 명칭이 대신 사용될 수 있다.
JTSu 코드는 타깃 어드레스 정보(target address information)와 분기 시기 정보(branch time information)를 포함한다. 여기서 사용된 정보들의 명칭도 예시적인 것이다. 타깃 어드레스 정보는 무조건부 분기 오퍼레이션에 따라서 분기 오퍼레이션 또는 점프 오퍼레이션(jump operation)이 실행될 경우에, 페치할 타깃 블록의 어드레스 정보일 수 있다. 분기 시기 정보는 분기 또는 점프가 언제 일어나는지를 지시하는 정보일 수 있다. JTSu 코드는 분기 시기 정보를 포함한다는 점에서, 기존의 jump 코드와 차이가 있다. 무조건부 분기 명령어를 실행함에 있어서 예측 정보(prediction information)는 필요 없다.
계속해서, JTSu 코드를 포함하는 해당 블록에 대한 스케쥴을 수행한다(S120). 스케쥴링 과정은 각 명령어 레지스터(Instruction Register, IR) 또는 각 기본 블록(BB) 내의 코드들을 실행할 순서대로 재배열하는 과정으로서, 명령어들의 컴파일 과정의 일부일 수 있다. 하나의 파이프라인을 갖는 프로세서의 경우에는 하나의 명령어 레지스터(IR)는 하나의 처리 블록 내에 컴파일되나, 슈퍼스칼라 구조(superscalar structures)에서는 복수의 처리 블록으로 컴파일될 수 있다. 도 4a에는 도 3의 무조건부 분기 명령어를 포함하는 블록(도 3의 제2 기본 블록(BB2))에 대하여 본 실시예에 따라서 스케쥴링한 결과(도 4a의 제2 기본 블록(BB2))의 일례가 도시되어 있다.
보다 구체적으로, 먼저 JTSu 코드를 제외한 다른 명령어들을 먼저 스케쥴링한다(S121). 즉, JTSu 코드를 제외하고 해당 블록(예컨대, 제2 기본 블록(BB2)) 내 에 포함되는 다른 명령어들을 실행 순서에 따라서 배열한다. 이 경우에, JTSu 코드를 제외한 다른 명령어들은 스케쥴링하는 방법에는 특별한 제한이 없으며, 이 분야에서의 통상적인 기법이 적용될 수 있다.
그리고 다른 명령어들을 모두 스케쥴링한 후에 JTSu 코드의 실행 순서를 결정한다(S122). JTSu 코드는 다른 명령어들과 의존 관계가 없기 때문에 스케쥴링을 함에 있어서 제약이 거의 없다. 또한, JTSu 코드는 jump 코드와는 달리 분기 시기 정보를 포함하기 때문에, 항상 해당 블록의 마지막에 실행되어야 하는 jump 코드에 비하여 스케쥴링을 함에 있어서 유연성(flexibility)이 높다. 즉, JTSu 코드가 해당 블록에서 가능한 앞쪽에서 실행될 수 있도록 스케쥴링을 할 수 있다. 예를 들어, JTSu 코드는 기존의 스케쥴링 방법에서 nop 슬롯으로 할당되는 슬롯들 중에서 제일 앞쪽에 있는 nop 슬롯에 배치할 수 있다.
이러한 본 실시예에 의하면, JTSu 코드 후에 지연 슬롯을 추가할 필요가 없다. 도 4b에 도시된 기존의 방법에 의할 경우에는, 제2 기본 블록(BB2)에서 jump 오퍼레이션을 수행한 이후에도 지연 슬롯이 추가되었다(제2 기본 블록(BB2)의 실행에 총 5 사이클이 소요). 그러나 타깃 어드레스 정보와 함께 분기 시기 정보를 포함하는 JTSu 코드를 사용하여 스케쥴링할 경우에는, JTSu 코드를 해당 블록의 앞쪽에 배열할 수 있으며, 그 결과 지연 슬롯을 별도로 추가할 필요가 없다(제2 기본 블록(BB2)의 실행에 총 4 사이클이 소요). 따라서 본 실시예에 의하면, 파이프라인 프로세서의 성능과 속도를 향상시킬 수가 있다.
이상의 설명은 본 발명의 일 실시예에 불과할 뿐, 본 발명이 속하는 기술분야에서 통상의 지식을 가진 자는 본 발명의 본질적 특성에서 벗어나지 않는 범위에서 변형된 형태로 구현할 수 있을 것이다. 따라서, 본 발명의 범위는 전술한 실시예에 한정되지 않고 특허 청구범위에 기재된 내용과 동등한 범위 내에 있는 다양한 실시 형태가 포함되도록 해석되어야 할 것이다.
도 1은 일 실시예에 따른 정적 분기 예측 방법을 보여 주는 흐름도이다.
도 2는 도 1의 단계 S20에서의 명령어 스케쥴링 과정의 일례를 보여 주는 흐름도이다.
도 3은 VLIW 머신에서 실행될 수 있는 명령어 레지스터(IR)에서의 코드들의 일례이다.
도 4a는 종래의 정적 분기 예측 방법에 따라서 도 3의 코드들을 컴파일한 결과를 보여 주는 도면이다.
도 4b는 예측이 맞는 경우에 도 4a로 스케쥴링된 코드들의 일부에 대한 파이프라인 스테이지를 보여 주는 도면이다.
도 5a는 본 실시예에 따른 정적 분기 예측 방법에 따라서 도 3의 코드들을 컴파일한 결과를 보여 주는 도면이다.
도 5b는 예측이 맞는 경우에 도 5a로 스케쥴링된 코드들의 일부에 대한 파이프라인 스테이지를 보여 주는 도면이다.
도 5c는 예측이 맞지 않은 경우에 도 5a로 스케쥴링된 코드들의 일부에 대한 파이프라인 스테이지를 보여 주는 도면이다.
도 6은 다른 실시예에 따른 명령어 컴파일 방법을 보여 주는 흐름도이다.

Claims (10)

  1. 프로세서에서 수행되는 정적 분기 예측 방법으로서,
    조건부 분기 코드에 대하여 테이큰 또는 낫-테이큰으로 예측하는 단계;
    상기 조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드와 테스트 코드로 변환하여 블록 내의 코드들을 스케쥴하는 단계; 및
    상기 예측 단계에서 테이큰으로 예측한 경우에, 상기 분기 시기 정보가 지시하는 사이클 시간에 상기 타깃 어드레스 정보가 지시하는 타깃 어드레스를 페치하는 단계를 포함하고,
    상기 스케쥴 단계에서는 상기 테스트 코드를 블록의 마지막 슬롯에 스케쥴하고 또한 상기 점프 타깃 어드레스 설정 코드는 상기 블록 내의 다른 모든 코드들을 스케쥴링한 후에 빈 슬롯에 스케쥴하는 파이프라인 프로세서를 위한 정적 분기 예측 방법.
  2. 제1항에 있어서,
    상기 테스트 코드의 실행 결과 상기 예측 단계의 예측이 맞는 경우에는 상기 페치 단계에서 페치된 코드들을 그대로 처리하고, 상기 예측이 맞지 않은 경우에는 상기 페치 단계에서 페치된 코드들은 모두 플러쉬하는 단계를 더 포함하는 파이프라인 프로세서를 위한 정적 분기 예측 방법.
  3. 제2항에 있어서,
    상기 분기 시기 정보가 지시하는 사이클 시간은 상기 테스트 코드를 페치한 바로 다음 사이클 시간인 파이프라인 프로세서를 위한 정적 분기 예측 방법.
  4. 제2항에 있어서,
    점프 타깃 어드레스 설정 코드는 상기 예측 단계의 예측 정보를 더 포함하고, 또한 상기 예측이 맞는지를 판단하는 것은 상기 예측 정보를 이용하는 파이프라인 프로세서를 위한 정정 분기 예측 방법.
  5. 제1항에 있어서,
    상기 예측 단계에서 낫-테이큰으로 예측한 경우에는, 상기 테스트 코드를 페치한 이후에는 현재 블록의 다음 블록 어드레스를 페치하는 단계; 및
    상기 테스트 코드의 실행 결과 상기 예측 단계의 예측이 맞는 경우에는 상기 페치 단계에서 페치된 코드들을 그대로 처리하고, 상기 예측이 맞지 않은 경우에는 상기 페치 단계에서 페치된 코드들은 모두 플러쉬하고 상기 타깃 어드레스 정보가 지시하는 타깃 어드레스를 페치하는 단계를 포함하는 파이프라인 프로세서를 위한 정적 분기 예측 방법.
  6. 컴파일러에서 수행되는 코드 컴파일 방법으로서,
    조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드와 테스트 코드로 변환하는 단계; 및
    상기 테스트 코드와 상기 점프 타깃 어드레스 설정 코드를 포함하는 블록 내의 모든 코드들을 스케쥴링하는 단계를 포함하고,
    상기 스케쥴링 단계에서는 상기 테스트 코드를 블록의 마지막 슬롯에 스케쥴하고 또한 상기 점프 타깃 어드레스 설정 코드는 상기 블록 내의 다른 모든 코드들을 스케쥴링한 후에 빈 슬롯에 스케쥴하는 정적 분기 예측을 위한 코드 컴파일 방법.
  7. 제6항에 있어서,
    점프 타깃 어드레스 설정 코드는 테이큰 또는 낫-테이큰을 지시하는 예측 정보를 더 포함하고, 또한 상기 테스트 코드는 상기 예측 정보를 이용하는 정적 분기 예측을 위한 코드 컴파일 방법.
  8. 제7항에 있어서,
    상기 분기 시기 정보는 상기 예측 정보가 테이큰을 지시하는 경우에 상기 타깃 어드레스 정보가 지시하는 타깃 블록을 페치하는 사이클 시간을 지시하는 정적 분기 예측을 위한 코드 컴파일 방법.
  9. 제8항에 있어서,
    상기 타깃 블록을 페치하는 사이클 시간은 상기 테스트 코드를 페치하는 다음 사이클 시간인 정적 분기 예측을 위한 코드 컴파일 방법.
  10. 프로세서에서 수행되는 코드 실행 방법으로서,
    조건부 분기 코드를 타깃 어드레스 정보 및 분기 시기 정보를 포함하는 점프 타깃 어드레스 설정 코드로 변환하는 단계;
    블록 내의 다른 모든 코드들을 스케쥴링한 후에 생기는 빈 슬롯에 상기 점프 타깃 어드레스 설정 코드를 스케쥴하는 단계; 및
    상기 분기 시기 정보가 지시하는 사이클 시간에 상기 타깃 어드레스 정보가 지시하는 타깃 어드레스를 페치하는 단계를 포함하는 파이프라인 프로세서를 위한 코드 실행 방법.
KR1020090011513A 2009-02-12 2009-02-12 파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법 KR101579589B1 (ko)

Priority Applications (2)

Application Number Priority Date Filing Date Title
KR1020090011513A KR101579589B1 (ko) 2009-02-12 2009-02-12 파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법
US12/692,735 US8954946B2 (en) 2009-02-12 2010-01-25 Static branch prediction method and code execution method for pipeline processor, and code compiling method for static branch prediction

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020090011513A KR101579589B1 (ko) 2009-02-12 2009-02-12 파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법

Publications (2)

Publication Number Publication Date
KR20100092230A KR20100092230A (ko) 2010-08-20
KR101579589B1 true KR101579589B1 (ko) 2015-12-22

Family

ID=42541349

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020090011513A KR101579589B1 (ko) 2009-02-12 2009-02-12 파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법

Country Status (2)

Country Link
US (1) US8954946B2 (ko)
KR (1) KR101579589B1 (ko)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20120036210A (ko) * 2010-10-07 2012-04-17 삼성전자주식회사 파이프라인 제어 위험 감소를 위한 처리장치 및 컴파일 장치와, 파이프라인 제어 위험 감소를 위한 동적 조건 분기 처리 방법
KR101754203B1 (ko) 2011-01-19 2017-07-07 삼성전자주식회사 파워 게이팅 기반의 재구성가능 프로세서, 이를 위한 컴파일 장치 및 방법
US20150220343A1 (en) * 2014-02-05 2015-08-06 Mill Computing, Inc. Computer Processor Employing Phases of Operations Contained in Wide Instructions
US9639370B1 (en) 2015-12-15 2017-05-02 International Business Machines Corporation Software instructed dynamic branch history pattern adjustment
US10607137B2 (en) 2017-04-05 2020-03-31 International Business Machines Corporation Branch predictor selection management
US11163577B2 (en) 2018-11-26 2021-11-02 International Business Machines Corporation Selectively supporting static branch prediction settings only in association with processor-designated types of instructions
WO2020199058A1 (zh) * 2019-03-30 2020-10-08 华为技术有限公司 分支指令的处理方法、分支预测器及处理器
CN110347432B (zh) * 2019-06-17 2021-09-14 海光信息技术股份有限公司 处理器、分支预测器及其数据处理方法、分支预测方法
IT202100002642A1 (it) 2021-02-05 2022-08-05 Sk Hynix Inc Metodo implementato da un microcontrollore per gestire una istruzione nop e microcontrollore corrispondente
CN112905242B (zh) 2021-03-23 2022-12-06 浙江大华技术股份有限公司 分支路径跳转方法、装置、存储介质及电子装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6421774B1 (en) 1999-11-05 2002-07-16 Ip First L.L.C. Static branch predictor using opcode of instruction preceding conditional branch
KR100395763B1 (ko) 2000-02-01 2003-08-25 삼성전자주식회사 멀티프로세싱 마이크로프로세서에 적합한 분기 예측기

Family Cites Families (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5287467A (en) * 1991-04-18 1994-02-15 International Business Machines Corporation Pipeline for removing and concurrently executing two or more branch instructions in synchronization with other instructions executing in the execution unit
US6021272A (en) * 1995-10-04 2000-02-01 Platinum Technology, Inc. Transforming and manipulating program object code
WO2000038054A1 (fr) * 1998-12-22 2000-06-29 Fujitsu Limited Appareil et procede de generation d'objet d'optimisation
US6772325B1 (en) * 1999-10-01 2004-08-03 Hitachi, Ltd. Processor architecture and operation for exploiting improved branch control instruction
US6446197B1 (en) * 1999-10-01 2002-09-03 Hitachi, Ltd. Two modes for executing branch instructions of different lengths and use of branch control instruction and register set loaded with target instructions
KR100317240B1 (ko) 1999-10-21 2001-12-22 윤종용 분기 예측 정확도 히스토리를 이용한 분기 예측기
JP2001273138A (ja) * 2000-03-24 2001-10-05 Fujitsu Ltd プログラム変換装置および方法
US20030023959A1 (en) * 2001-02-07 2003-01-30 Park Joseph C.H. General and efficient method for transforming predicated execution to static speculation
US6964043B2 (en) * 2001-10-30 2005-11-08 Intel Corporation Method, apparatus, and system to optimize frequently executed code and to use compiler transformation and hardware support to handle infrequently executed code
US20040154010A1 (en) * 2003-01-31 2004-08-05 Pedro Marcuello Control-quasi-independent-points guided speculative multithreading
US8281297B2 (en) * 2003-02-05 2012-10-02 Arizona Board Of Regents Reconfigurable processing
US8423976B2 (en) * 2003-03-13 2013-04-16 Northrop Grumman Corporation Extreme pipeline and optimized reordering technology
US7765534B2 (en) * 2004-04-30 2010-07-27 International Business Machines Corporation Compiler with cache utilization optimizations
US7698697B2 (en) * 2005-03-03 2010-04-13 International Business Machines Corporation Transforming code to expose glacial constants to a compiler
US7278012B2 (en) * 2005-06-02 2007-10-02 Qualcomm Incorporated Method and apparatus for efficiently accessing first and second branch history tables to predict branch instructions
US7577826B2 (en) * 2006-01-30 2009-08-18 Sony Computer Entertainment Inc. Stall prediction thread management
US8201159B2 (en) * 2006-08-04 2012-06-12 International Business Machines Corporation Method and apparatus for generating data parallel select operations in a pervasively data parallel system

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6421774B1 (en) 1999-11-05 2002-07-16 Ip First L.L.C. Static branch predictor using opcode of instruction preceding conditional branch
KR100395763B1 (ko) 2000-02-01 2003-08-25 삼성전자주식회사 멀티프로세싱 마이크로프로세서에 적합한 분기 예측기

Also Published As

Publication number Publication date
US8954946B2 (en) 2015-02-10
US20100205405A1 (en) 2010-08-12
KR20100092230A (ko) 2010-08-20

Similar Documents

Publication Publication Date Title
KR101579589B1 (ko) 파이프라인 프로세서를 위한 정적 분기 예측 방법과 이를 위한 컴파일 방법
US8145888B2 (en) Data processing circuit with a plurality of instruction modes, method of operating such a data circuit and scheduling method for such a data circuit
US9697000B2 (en) Energy-focused compiler-assisted branch prediction
US7577826B2 (en) Stall prediction thread management
US7478228B2 (en) Apparatus for generating return address predictions for implicit and explicit subroutine calls
US6192515B1 (en) Method for software pipelining nested loops
US6842895B2 (en) Single instruction for multiple loops
WO2002008893A1 (en) A microprocessor having an instruction format containing explicit timing information
US20190079771A1 (en) Lookahead out-of-order instruction fetch apparatus for microprocessors
JP4134179B2 (ja) ソフトウエアによる動的予測方法および装置
JP2009059246A (ja) マイクロプロセッサ
CN101164042A (zh) 在条件指令将不执行时停止等待源操作数
KR20120036210A (ko) 파이프라인 제어 위험 감소를 위한 처리장치 및 컴파일 장치와, 파이프라인 제어 위험 감소를 위한 동적 조건 분기 처리 방법
US8595473B2 (en) Method and apparatus for performing control of flow in a graphics processor architecture
US20030131345A1 (en) Employing value prediction with the compiler
JP2006053830A (ja) 分岐予測装置および分岐予測方法
US9535701B2 (en) Efficient use of branch delay slots and branch prediction in pipelined computer architectures
US20050108698A1 (en) Assembler capable of reducing size of object code, and processor for executing the object code
US20060259752A1 (en) Stateless Branch Prediction Scheme for VLIW Processor
WO2007048988A1 (en) A data processing apparatus and method for handling procedure call instructions
US20180088954A1 (en) Electronic apparatus, processor and control method thereof
JPH07248923A (ja) コンパイラ

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
LAPS Lapse due to unpaid annual fee