KR100382126B1 - 오예측 이후에 재실행될 수 있는 명령어를 홀드하기 위한 파이프라인 외부의 트레이스 버퍼 - Google Patents

오예측 이후에 재실행될 수 있는 명령어를 홀드하기 위한 파이프라인 외부의 트레이스 버퍼 Download PDF

Info

Publication number
KR100382126B1
KR100382126B1 KR10-2000-7006657A KR20007006657A KR100382126B1 KR 100382126 B1 KR100382126 B1 KR 100382126B1 KR 20007006657 A KR20007006657 A KR 20007006657A KR 100382126 B1 KR100382126 B1 KR 100382126B1
Authority
KR
South Korea
Prior art keywords
instructions
instruction
processor
thread
trace buffer
Prior art date
Application number
KR10-2000-7006657A
Other languages
English (en)
Other versions
KR20010024750A (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 인텔 코오퍼레이션
Publication of KR20010024750A publication Critical patent/KR20010024750A/ko
Application granted granted Critical
Publication of KR100382126B1 publication Critical patent/KR100382126B1/ko

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/30Monitoring
    • G06F11/34Recording or statistical evaluation of computer activity, e.g. of down time, of input/output operation ; Recording or statistical evaluation of user activity, e.g. usability assessment
    • 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, look ahead
    • G06F9/3861Recovery, e.g. branch miss-prediction, exception handling
    • G06F9/3863Recovery, e.g. branch miss-prediction, exception handling using multiple copies of the architectural state, e.g. shadow registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/07Responding to the occurrence of a fault, e.g. fault tolerance
    • G06F11/14Error detection or correction of the data by redundancy in operation
    • G06F11/1402Saving, restoring, recovering or retrying
    • G06F11/1405Saving, restoring, recovering or retrying at machine instruction level
    • G06F11/1407Checkpointing the instruction stream
    • 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, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution

Abstract

본 발명의 일실시예에서, 프로세서(10)는 명령어를 실행하기 위한 실행 파이프라인을 포함하고, 상기 명령어의 적어도 일부는 추론적으로 실행된다. 또한, 프로세서는 상기 명령어를 홀드하기 위해 상기 실행 파이프라인 외부에 있는 트레이스 버퍼(114)를 포함하며, 추론 에러와 관련된 명령어는 명령어를 실행하기 위한 상기 실행 파이프라인에서 리플레이되고, 상기 명령어의 적어도 일부는 추론적으로 실행된다. 또한, 상기 프로세서는 상기 명령어 및 상기 명령어의 실행 결과를 홀드하기 위해 상기 실행 파이프라인 외부에 있는 트레이스 버퍼를 포함하고, 상기 명령어의 적어도 일부는 상기 파이프라인에서의 실행 다음에 초기 회수를 당하지만, 최종 회수가 이루어질 때까지 상기 트레이스 버퍼에서 유지된다.

Description

오예측 이후에 재실행될 수 있는 명령어를 홀드하기 위한 파이프라인 외부의 트레이스 버퍼{OUT-OF-PIPELINE TRACE BUFFER FOR HOLDING INSTRUCTIONS THAT MAY BE RE-EXECUTED FOLLOWING MISSPECULATION}
마이크로프로세서와 같은 현재의 수퍼스칼라 프로세서는 성능을 향상시키기 위해 분기 예측(branch prediction) 및 비순서적 실행(out-of-order execution)과 같은 기술을 수행한다. 비순서적 실행 파이프라인을 구비한 프로세서는 명령어들이 페치되거나(fetched) 디코드된 순서와 다른 순서로 명령어들을 실행한다. 명령어들은 의존도(dependency)가 없는 명령어들에 대해서는 비순서적으로(순서를 벗어나) 실행될 수 있다. 비순서적 실행은 실행 유닛들이 단지 프로그램 명령어 순서로 인해 유휴상태(idle) 되는 것을 방지함으로써 프로세서 성능을 증가시킨다.
데이터 의존도를 처리하는 태스크는 명령어 디코드가 순서적으로 이루어지는 것을 제한함으로써 간략화될 수 있다. 그러면, 프로세서는 하나의 명령어로부터 그후속 명령어까지 레지스터를 통한 데이터 흐름이 어떻게 이루어지는지 식별할 수 있게 된다. 프로그램의 정확성을 보장하기 위해, 레지스터는 리네임되고(renamed), 명령어들은 실행을 위해 적절한 기능 유닛으로 발생되는 그 입력 오퍼랜드(operands)가 생성될 때까지 예약(reservation) 스테이션에서 대기하게 된다. 레지스터 리네이머(renamer), 예약 스테이션 및 관련 메카니즘은 의존도를 가진 명령어들을 함께 링크시켜, 종속(dependent) 명령어가 그것이 의존하는 명령어 보다 먼저 실행되지 않도록 한다. 따라서, 이러한 프로세서는 순서적 페치 및 디코드에 의해 제한된다.
명령어 캐시로부터의 명령어가 누락(miss)되거나 또는 분기가 잘못 예측(mispredict)되면, 프로세서는 명령어 블록이 상위 레벨 캐시 또는 메모리로부터 페치될 때까지 또는 잘못 예측된 분기가 해결될 때까지 대기해야 하며, 잘못된 경로의 실행은 리셋된다. 이러한 동작의 결과는, 비록 그렇게 하는 것이 올바른 것일 수 있음에도 불구하고 명령어 캐시가 누락시킨 전후의 종속 명령어들과 잘못 예측된 분기가 병렬로 실행될 수 없다는 것이다.
다양한 추론(speculations)은 추론 에러를 유발할 수 있다. 그러므로, 프로세서가 추론 에러로부터 복구할 수 있도록 허용하는 개선된 메카니즘이 프로세서에 요구된다.
본 발명은 프로세서에 관한 것으로서, 특히 하나 또는 그 이상의 트레이스 버퍼(trace buffer)를 구비한 프로세서에 관한 것이다.
본 발명은 본 발명의 실시예에 관한 다음의 상세한 설명 및 첨부 도면으로부터 보다 완전하게 이해될 것이다. 그러나, 본 발명은 설명되는 특정 실시예에 제한되지 않으며, 이들 특정 실시예는 단지 예시 및 이해를 위한 것이다.
도1은 프로세서의 일실시예의 일부 구성요소의 고레벨 블록도.
도2는 본 발명의 일실시예에 따른 프로세서의 블록도.
도3은 본 발명의 다른 실시예에 따른 프로세서의 블록도.
도4는 2개의 스레드의 예를 도시한 흐름도.
도5는 2개의 스레드의 다른 예를 도시한 흐름도.
도6은 4개의 스레드의 예를 도시한 흐름도.
도7은 도6의 스레드의 중복 실행을 도시한 그래프.
도8은 본 발명의 일실시예에 따른 개개의 트레이스 버퍼를 예시한 블록도.
도9는 2회에 걸친 프로그램 및 회수 순서를 나타내는 어레이를 도시한 도면.
도10은 도8의 트레이스 버퍼의 일실시예의 소정의 구성요소를 도시한 블록도.
도11은 도8의 트레이스 버퍼의 다른 실시예의 소정의 구성요소를 도시한 블록도.
도12는 도10의 트레이스 버퍼의 명령어 큐 어레이의 일실시예 일부를 도시한 그래프.
도13은 도10의 트레이스 버퍼의 데이터 및 의존도 어레이의 일실시예의 일부를 도시한 그래프.
도14는 도10의 어레이의 의존도 필드를 생성하는데 사용되는 수정자 레지스터 및 수정된 레지스터의 일실시예를 도시한 도면.
도15는 도13의 어레이의 의존도 필드를 생성하는데 사용되는 논리 OR 게이트를 도시한 도면.
도16은 도13의 어레이의 의존도 필드를 생성하는데 사용되는 연산의 일실시예를 도시한 흐름도.
도17은 본 발명의 일실시예에 따라 의존도를 가진 트레이스 버퍼 내의 특정레지스터 및 위치를 도시한 그래프.
도18은 도10의 트레이스 버퍼의 출력 레지스터 파일의 일실시예의 일부를 도시한 그래프.
도19는 도10의 트레이스 버퍼의 입력 레지스터 파일의 일실시예의 일부를 도시한 그래프.
도20은 본 발명의 일실시예에 따라 도18의 출력 레지스터 파일 및 도19의 입력 레지스터 파일과 함께 사용되는 비교기 및 리플레이 트리거링 로직의 블록도.
도21은 출력 레지스터 파일의 내용이 이용될 수 있는 포인트를 도시한 흐름도.
도22는 본 발명의 일실시예에 따라 도2의 메모리 MOB(memory order buffer) 내의 개개의 MOB를 도시한 블록도.
도23은 도22의 MOB 중 하나의 저장 버퍼의 일실시예의 일부를 도시한 그래프.
도24는 도22의 MOB 중 하나의 적재 버퍼의 일실시예의 일부를 도시한 그래프.
도25는 적재 및 저장 명령어의 어드레스를 비교하는 비교기를 도시한 도면.
도26은 저장 및 적재 명령어의 어드레스를 비교하는 비교기를 도시한 도면.
도27은 본 발명의 일실시예에 따른 MOB 제어 회로 및 저장 버퍼의 블록도.
도28은 본 발명의 일실시예에 따른 MOB 제어 회로 및 적재 버퍼의 블록도.
도29는 6개의 스레드의 예를 도시한 흐름도.
도30은 시간 t1에서의 도29의 스레드의 관계를 도시한 트리구조도.
도31은 스레드 T1이 회수되기 전에 스레드 T4가 리셋되는 것을 가정한 시간 t2에서의 도29의 스레드의 관계를 도시한 트리구조도.
도32는 스레드 T4가 리셋되기 전에 스레드 T1이 회수되는 것을 가정한 시간 t2에서의 도29의 스레드의 관계를 도시한 트리구조도.
도33은 시간 t3에서의 도29의 스레드의 관계를 도시한 트리구조도.
도34는 5개의 스레드의 예를 도시한 흐름도.
도35는 시간 t1에서의 도34의 스레드의 관계를 도시한 트리구조도.
도36은 시간 t2에서의 도34의 스레드의 관계를 도시한 트리구조도.
도37은 도2의 일실시예의 대안의 실시예에 따른 프로세서의 블록도.
도38은 도2의 프로세서를 포함하는 컴퓨터 시스템을 도시한 도면.
발명의 요약
본 발명의 일실시예에서, 프로세서는 명령어들을 실행하기 위한 실행 파이프라인을 포함하고 있으며, 여기서는 적어도 일부의 명령어들이 추론적으로 실행된다. 이 프로세서는 또한 명령어들을 홀드하기 위해 실행 파이프라인 외부에 트레이스 버퍼를 포함하고 있으며, 여기서 추론 에러와 관련된 명령어들은 트레이스 버퍼로부터 실행 파이프라인에서 리플레이(replayed)된다.
다른 실시예에서, 프로세서는 명령어들을 실행하기 위한 실행 파이프라인을 포함하고 있으며, 여기서는 적어도 일부의 명령어들이 추론적으로 실행된다. 이 프로세서는 또한 명령어들과 그 명령어들의 실행 결과를 홀드하기 위해 실행 파이프라인 외부에 트레이스 버퍼를 포함하고 있으며, 여기서 적어도 일부의 명령어들은 파이프라인에서 실행 다음에 초기 회수(initial retirement)를 당하게 되지만, 최종 회수 때까지는 트레이스 버퍼에서 유지된다.
A. 스레드의 생성 및 파이프라인(108)의 개요
B. 트레이스 버퍼(114)에 관한 세부사항
1. 트레이스 버퍼(114A)
a. 명령어 큐 어레이(202A)
b. DAD 어레이(206A) 및 의존도 생성 회로(212A)
c. 출력 레지스터 파일(210A) 및 입력 레지스터 파일(208A)
2. 트레이스 버퍼(114')
C. 리플레이 시퀀스 알고리즘
D. 최종 회수의 제2 레벨
E. 메모리 시스템
1. 저장 버퍼 및 적재 버퍼
2. 적재 및 저장 어드레스의 비교
a. 적재 명령어의 실행
b. 저장 명령어의 실행
c. 리셋
3. 저장 명령어의 리플레이
4. 복수의 적재 명령어의 리플레이
5. 적재 및 저장 명령어의 최종 회수
F. 스레드 관리 로직 및 최종 회수 로직에 관한 추가 정보
G. 멀티스레딩이 없는 일시예
H. 추가 정보 및 실시예
도1은 프로세서의 소정의 구성요소(10)를 도시하고 있다. 프로세서(10)는 실행 파이프라인(execution pipeline)(12)과 트레이스 버퍼(trace buffer)(14)를 포함하고 있으며, 이 트레이스 버퍼는 실행 파이프라인 외부에 존재한다. 실행 파이프라인(12)은 메모리 순서 버퍼(memory order buffer)를 포함할 수 있다. 도선(18) 상의 명령어는 실행을 위해 실행 파이프라인(12)으로 제공된다. 이들 명령어는 또한 도선(22)을 통해 트레이스 버퍼(14)에도 제공된다. 명령어들은 실행 파이프라인(12)에서 추론적으로(speculatively) 실행될 수 있다. 추론(speculation)의 예로는 데이터 추론과 의존도 추론이 있다. 매우 다양한 추론이 포함될 수 있다. 프로세서(10)는 추론 에러(잘못된 추론)를 검출하고 그것으로부터 복구하기 위해 트레이스 버퍼(14)에 포함된 메카니즘을 포함한다.
잘못된 추론이 검출되면, 그 잘못 추론된 명령어는 트레이스 버퍼(14)로부터 도선(24)을 통해 실행 파이프라인(12)으로 제공되어, 실행 파이프라인(12)에서 리플레이(replayed)된다. 만일 명령어가 리플레이되면, 그 명령어 및 그 명령어에 의존하는 모든 명령어들은 재실행되는데, 이들 명령어가 반드시 동시에 실행될 필요는 없다. 만일 명령어가 전부 리플레이되면, 그 명령어 및 프로그램 순서로 그 명령어 다음에 오는 모든 명령어들이 재실행된다. 프로그램 순서는 명령어들이 프로세서에서 순서적으로 실행되게 되는 순서를 말한다. 명령어들은 프로그램 순서로 또는 프로그램 순서와 다른 순서로 도선(18)을 통해 전부 통과될 수 있다. 프로세서(10)는 순서적(in order) 프로세서 또는 비순서적(out of order) 프로세서가 될 수 있다. 종속 명령어의 재실행은 리플레이되는 종속 명령어에 의존하는 명령어를 초래할 수 있다. 명령어들의 재실행의 횟수는 리플레이를 트리거시키는 이벤트를 제어함으로써 제어될 수 있다. 일반적으로, "실행"이란 용어는 최초의 실행 및 재실행을 포함할 수 있다. 명령어의 적어도 일부의 결과는 도선(26)을 통해 트레이스 버퍼로 제공된다. 최종 회수(retirement) 로직(34)은 명령어들이 최초 실행 또는 재실행에서 올바르게 실행되었다는 것이 보장된 이후에 트레이스 버퍼(14)에서 그 명령어들을 최종적으로 회수한다.
실행 파이프라인(12)은 매우 다양한 실행 파이프라인 중 어느 것이 될 수 있으며, 대형 파이프라인의 한 섹션이 될 수도 있다. 실행 파이프라인(12)은 매우 다양한 프로세서와 함께 사용될 수 있다. 도2에는 실행 파이프라인(108)을 구비한 프로세서(50)의 구성요소가 도시되어 있고, 도3에는 실행 파이프라인(308)을 구비한 프로세서(100)가 도시되어 있다. 도2의 본 발명의 실시예에서, 실행 파이프라인(108)은 레지스터 리네이밍(renaming)을 포함한다. 다른 실시예에서는 실행 파이프라인이 레지스터 리네이밍을 포함하지 않는다. 프로세서는 (도2의 프로세서(50)의 경우와 같이) 복수의 스레드를 동시에 처리하거나 또는 (도3의 프로세서(100)의 경우와 같이) 복수의 스레드를 동시에 처리하지 않을 수도 있다. 프로세서(50)에 대해 먼저 설명한다.
명세서에서 일실시예에 대한 참조는 그 실시예와 관련하여 설명되는 특정 기능, 구조 또는 특성이 본 발명의 적어도 하나의 실시예에 포함된다는 것을 의미한다. 명세서의 다양한 위치에서 용어 "일실시예"의 출현이 모두 반드시 그 동일한 실시예를 참조하는 것은 아니다.
A. 스레드의 생성 및 파이프라인(108)의 개요
명령어들은 도선(102)을 통해 명령어 캐시(I-캐시)(104)로 제공된다. 디코더(106)는 I-캐시(104)로부터 명령어를 수신하는 것으로 도시되어 있지만, 이와 달리 이들 명령어를 I-캐시(104)에 도달하기 전에 디코드할 수도 있다. 문맥 및선택되는 구현예에 따라, 용어 "명령어"는 매크로 연산(macro-op), 마이크로 연산(uops), 또는 다른 형태의 명령어를 포함할 수 있다. 축소 명령어 집합 컴퓨팅(RISC) 또는 복합 명령어 집합 컴퓨팅(CISC) 명령어를 포함하는 다양한 명령어 집합이 사용될 수 있으며, 이들에 제한되는 것은 아니다. 또한, 디코더(106)는 CISC 명령어를 RISC 명령어로 디코드할 수 있다. I-캐시(104)로부터의 명령어는 MUX(110)를 통해 파이프라인(108)으로 제공되고 도선(118)을 통해 트레이스 버퍼(114)로 제공된다.
트레이스는 명령어들의 집합이다. 스레드(thread)는 레지스터 값 및 프로그램 카운터 값과 같은 트레이스 및 관련 신호를 포함한다.
스레드 관리 로직(124)은 도선(130)을 통해 프로그램 카운터(112A, 112B,...,112X)(여기서, X는 프로그램 카운터의 수를 나타냄)로 시작 카운트를 제공함으로써 I-캐시(104) 내의 프로그램 또는 프로세스로부터 상이한 스레드를 생성한다. 예를 들어, X는 4가 될 수 있으며, 또는 그 보다 작거나 클 수 있다. 스레드 관리 로직(124)은 관련 프로그램 카운터를 정지시킴으로써 스레드를 종료시킨다. 스레드 관리 로직(124)은 프로그램 카운터로 하여금 다른 스레드를 시작하도록 할 수 있다. 상이한 스레드의 일부는 I-캐시(104)로부터 동시에 판독된다.
프로그램 또는 프로세스에서 스레드를 생성하기 위한 위치를 판단하기 위해, 스레드 관리 로직(124)은 도선(128)을 통해 디코더(106)로부터 명령어를 판독할 수 있다. 이들 스레드는 스레드의 시작과 종료를 명확하게 구별하는, 프로그래머 또는 컴파일러에 의해 삽입된 명령어를 포함할 수 있다. 대안으로, 스레드 관리로직(124)은 I-캐시(104)로 제공되는 프로그램 또는 프로세스를 상이한 스레드로 분해하기(break up) 위해 프로그램 또는 프로세스의 명령어들을 분석할 수 있다. 예를 들어, 분기, 루프, 역방향 분기, 리턴, 점프, 절차 호출(procedure calls) 및 함수 호출(function calls) 등이 스레드를 분리하기 위한 양호한 포인트가 될 수 있다. 스레드 관리 로직(124)은 가능성 있는 스레드의 길이, 얼마나 많은 변수가 포함되는지, 연속하는 스레드 사이의 공통적인 변수의 수, 및 스레드를 시작하기 위한 위치를 고려하는데 있어서의 다른 요소를 고려할 수 있다. 스레드 관리 로직(124)은 스레드의 경계를 판단하는데 있어서 프로그램 순서를 고려할 수 있다. 프로그램 순서는 스레드 및 그 스레드 내의 명령어들이 순서적 프로세서에서 실행되게 되는 순서이다. 스레드 내의 명령어들은 (프로그램 순서와 달리) 비순서적으로 실행될 수 있다. 스레드는 파이프라인(108)에 의해 근본적으로 독립적으로 처리될 수 있다. 스레드 관리 로직(124)은 최적의 선택보다 못한 선택을 피하기 위해 히스토리 테이블(history table)을 포함하는 예측 메카니즘(prediction mechanism)을 포함할 수 있다. 예를 들어, 스레드 관리 로직(124)은 스레드를 생성하고, 다음에 그 스레드가 실제로 프로그램 순서의 일부분이 아니었다는 것을 판단할 수 있다. 이 경우에, 다시 동일한 코드를 만나게 되면, 그 동일한 스레드를 다시 생성할 것인지 여부를 판단하기 위해 예측 메카니즘이 사용될 수 있다. 스레드 관리 로직(124)은 명령어에서 스레드를 생성하기 위한 위치를 판단하기 위해 컴파일러 또는 프로그래머로부터의 명확한 명령어 힌트를 이용하고 스레드의 동적 생성의 조합을 이용할 수 있다.
스레드의 동적 생성은 특히 멀티스레딩(multithreading)을 위해 기록되거나 컴파일되지 않은 프로그램으로부터 스레드를 생성하며, 여기서 스레드 중 적어도 하나는 다른 스레드에 의존한다. 프로그램은 실행 파이프라인(108) 및 스레드 관리 로직(124)을 포함하는 칩으로부터 기원할 수 있다. 스레드의 동적 생성, 스레드의 실행, 및 실행에서의 추론 에러의 정정은 동적 멀티스레딩으로 불린다.
도4는 조건부 역방향 분기 명령어(conditional backward branch instruction)를 포함하는 스레드 T1을 도시하고 있다. 프로그램 순서로, 스레드 T2는 조건부 분기 명령어 다음에 실행된다. 시간 순서로, 스레드 T2는 스레드 T1이 최초에 조건부 분기 명령어에 도달할 때 시작하여 추론적으로 실행된다. 그러므로, 스레드 T1과 T2의 일부분은 동시에 실행된다. 만일 스레드 T2가 잘못된 추론을 수반하면, 스레드 T2의 실행된 명령어들이 리플레이된다.
스레드 관리 로직(124)은 도선(130)을 통해 프로그램 카운터의 카운트를 모니터할 수 있다. 이러한 카운트를 모니터하는 목적은 스레드가 종료되어야 하는 때를 판단하기 위한 것이다. 예를 들어, 조건부 분기의 조건이 정합되지 않을 때, 만일 스레드 T1의 프로그램 카운터가 계속되도록 허용되면, 이것은 스레드 T2의 제1 명령어에 앞서게 된다. 그러므로, 스레드 관리 로직(124)은 조건이 정합되지 않을 때 스레드 T1의 프로그램 카운터를 정지시킨다.
도5는 함수 호출 명령어를 포함하는 스레드 T1을 도시하고 있다. 프로그램 순서로, 호출 명령어에 도달하면, 프로그램 카운터는 리턴 명령어까지 그 함수 및 실행 위치로 점프하게 되며, 이 리턴 명령어에서 프로그램 카운터는 호출 이후에그 명령어로 되돌아오게 된다. 프로그램 순서로, 스레드 T2는 리턴 명령어 다음에 오는 명령어에서 시작된다. 시간 순서로, 스레드 T2는 스레드 T1이 최초로 호출에 도달할 때 시작하여 추론적으로 실행된다. 만일 스레드 T2가 잘못된 추론을 포함하면, 스레드 T1의 실행된 명령어들이 리플레이된다. 스레드 T1은 그 프로그램 카운터가 스레드 T2의 제1 명령어에 도달할 때 종료된다. 도5의 적재(Load) MX 명령어 및 저장(Store) MX 명령어에 대해서는 후술하게 된다.
도6은 프로그램의 한 섹션의 일부인 스레드 T1,T2,T3,T4를 도시하고 있다. 상이한 프로그램 카운터들이 이들 스레드 T1,T2,T3,T4를 생성한다. 스레드 T1은 포인트 A로 가는 명령어(함수 호출 명령어)를 포함하는데, 다음에 이 명령어는 포인트 B로부터, 포인트 C(조건부 역방향 분기 명령어)로, 포인트 D로, 그리고 다시 포인트 C로 가게 된다(루프가 여러 번 반복될 수 있다). 스레드 T2는 프로그램 순서로 포인트 A에서 호출된 함수의 리턴 명령어 바로 다음에 오는 명령어에서 시작된다. 스레드 T3는 프로그램 순서로 포인트 C의 조건부 역방향 분기 바로 다음에 오는 명령어에서 시작되어, 포인트 E, 포인트 F, 포인트 G, 포인트 I로 계속되며, 이 포인트 I는 스레드 T2가 시작되는 포인트 A 바로 다음에 오는 명령어에 대한 리턴 명령어이다. 스레드 T4는 프로그램 순서로 포인트 E에서 조건부 역방향 분기 바로 다음에 오는 명령어에서 시작된다.
도7에 도시된 바와 같이, 스레드 T1,T2,T3,T4의 일부분들은 동시에 페치, 디코드 및 실행된다. 프로그램 순서를 따라가지 않기 때문에, 이들 스레드는 비순서적으로 페치, 디코드 및 실행된다. 시간 순서로, 스레드 T2,T3,T4의 실행은 각각포인트 A,C,E에서 바로 다음에 오는 명령어에서 시작된다. 수직 점선은 패런트 차일드 관계(parent child relationship)를 나타내고 있다. 스레드 T2,T3,T4는 데이터가 정확하다고 확신하기 전에 레지스터 및/또는 메모리 위치에 있는 데이터에 의존함으로써 추론적으로 실행된다. 프로세서(100)는 잘못된 추론을 검출하고 그 잘못 추론된 명령어가 리플레이되도록 하기 위한 메카니즘을 포함하고 있다. 결국 스레드 T4는 프로그램 순서의 일부가 아닌 것으로 드러나게 된다. 이 스레드 T4는 스레드 관리 로직(124)이 스레드 T4가 프로그램 순서의 일부가 아닌 것으로 판단할 때까지 실행될 수 있다. 이때, 스레드 T4는 리셋되고, 프로세서(100)에서 스레드 T4를 홀드하거나 처리한 자원은 할당해제되고, 다른 스레드에 대해 할당된다. 프로그램 순서로, 스레드 T1,T2,T3는 다음과 같이 실행될 수 있다. 즉, 스레드 T1이 먼저 실행되고, 다음에 스레드 T3, 그 다음에 스레드 T2가 실행된다.
도2를 참조하면, MUX(110)로부터의 명령어는 레지스터 파일(152) 내의 리네임된 물리적 레지스터의 물리적 레지스터 식별자(PRID)를 제공하는 리네임/할당 유닛(150)에 의해 수신된다. PRID는 바이패스 도선(126)을 통해 트레이스 버퍼(114)로 제공된다. 할당하는 단계는 명령어에 레지스터를 할당하는 단계와 스케줄/발생(schedule/issue) 유닛(156)의 예약 스테이션의 엔트리를 할당하는 단계를 포함한다. 일단 예약 스테이션에서 특정 명령어에 대한 오퍼랜드가 준비되면, 그 명령어는 실행 유닛(158)의 실행 유닛(예, 정수, 부동소수점) 중 하나로 발생되거나, 또는 어드레스 생성 유닛(AGU)(172), 메모리 순서 버퍼(MOB)(178) 및 데이터 캐시(176)를 포함하는 메모리 실행 파이프라인으로 발생된다. 명령어에 따라, 오퍼랜드는 레지스터 파일(152)로부터 도선(168)을 통해 제공된다. 본 발명의 일실시예에서, 스레드 내의 종속 명령어는 그들이 비순서적으로 실행되지 않도록 링크될 수 있다. 그러나, 상이한 스레드로부터의 종속 명령어들은 비순서적으로 동시에 페치, 디코드 및 실행될 수 있다. 일부 스레드의 실행은 추론적으로 이루어질 수 있다.
고성능을 위해, 예약 스테이션 및 관련 메카니즘은 명령어의 낮은 대기시간 및 높은 대역폭 발생을 모두 이루도록 설계된다. 대기시간 및 대역폭 요건은 예약 스테이션에서 대기할 수 있는 명령어의 수에 제한을 부여한다. 트레이스 버퍼(114)를 파이프라인(108) 외부에 배치함으로써, 파이프라인(108)의 처리량을 뚜렷하게 증가시키지 않고도 매우 많은 수의 명령어가 실행/리플레이를 위해 이용가능하게 될 수 있다. 실행 파리프라인(108)과 트레이스 버퍼(114) 사이의 대기시간의 영향은 파이프라이닝을 통해 감소될 수 있다.
실행 결과 및 관련 정보는 라이트백(writeback) 유닛(162)으로부터 도선(122)(레지스터의 경우)을 통해 그리고 MUX(192) 및 도선(196)을 통해 트레이스 버퍼(114)로 기록된다. 또한, 실행 결과 및 관련 정보는 레지스터 파일(152) 및 관련 재배열 버퍼(re-order buffer)(ROB)(164)로도 기록될 수 있다. 일단 명령어의 결과 및 정보가 레지스터 파일(152) 및 ROB(164)로 기록되면, 그 명령어는 파이프라인(108)이 관련되어 있는 한 순서적으로 회수된다. 이러한 회수는 제1 레벨 또는 초기 회수로 불린다. 제1 레벨 회수가 이루어질 때 또는 그 전에, 예약 스테이션을 포함하는 스케줄/발생 유닛(156), 레지스터 파일(152) 및 ROB(164)에서 그 회수된 명령어를 위한 자원들은 할당해제된다. 그러나, 후술되는 바와 같이, 그 명령어에관한 모든 필요한 세부사항은 최종 회수가 이루어질 때까지 트레이스 버퍼(114) 및 MOB(178)에서 유지된다.
프로그램 순서로, 보다 늦은 스레드에서 사용되는 데이터가 보다 빠른 스레드에서 발생될 때, 보다 늦은(later) 스레드와 보다 빠른(earlier) 스레드 사이에 의존도가 존재한다. 이 데이터는 메모리 또는 비메모리 명령어를 통해 보다 빠른 스레드에서 발생되었을 수도 있다. 예를 들어, 보다 늦은 스레드의 적재 명령어가 보다 빠른 스레드의 저장 명령어와 동일한 어드레스를 가지면, 보다 늦은 스레드는 보다 빠른 스레드에 의존할 수 있다. 또한, 보다 늦은 스레드의 명령어가 보다 빠른 스레드에서 수정되었던 레지스터와 관련되어 있으면, 이러한 보다 늦은 스레드는 보다 빠른 스레드에 의존할 수 있다. 마찬가지로, 프로그램 순서로 보다 늦은 스레드가 보다 빠른 스레드에 의해 생성된 데이터를 이용하면, 이러한 보다 늦은 스레드는 보다 빠른 스레드에 의존한다. 용어 "의존도"는 또한 "의존도 추론"이라는 구절에도 사용된다. 의존도 추론의 일례로는, 적재 명령어와 그 보다 빠른 저장 명령어 사이에 의존도가 없는 것으로 추론하는 것이 있다. 어드레스 정합(matching)은 의존도 추론 에러에 대해 검사하기 위한 기술의 일례이다. 데이터 추론의 일례로는, 레지스터 내의 데이터가 정확한 데이터라고 추론하는 것이 있다. 레지스터 정합은 데이터 추론 에러에 대해 검사하기 위한 기술의 일례이다.
B. 트레이스 버퍼(114)에 관한 세부사항
도8을 참조하면, 트레이스 버퍼(114)는 트레이스 버퍼(114A,114B,114C, ...,114Y)를 포함하고 있으며, 여기서 Y는 트레이스 버퍼의 수를 나타낸다. 예를 들어, 만일 Y=4(즉, Y=D)이면, 4개의 트레이스 버퍼가 있는 것이다. 만일 Y가 3 보다 작으면, 트레이스 버퍼(114)는 도8에 도시된 모든 트레이스 버퍼를 포함하지 않는다. Y는 X(프로그램 카운터의 수)와 동일할 수도 있고 다를 수도 있다. 트레이스 버퍼(114)는 개개의 트레이스 버퍼로 분할된 단일 메모리가 될 수 있으며, 또는 물리적으로 독립된 트레이스 버퍼가 될 수 있고, 또는 이들 두 가지의 조합이 될 수도 있다.
도9를 참조하면, 스레드 관리 로직(124)은 스레드 ID의 프로그램 순서(또한, 회수 순서가 됨)를 명시하는 어레이(198)를 포함하고 있다. 일례에서, 각각의 트레이스 버퍼는 고유의 스레드 ID를 갖고 있거나 또는 스레드 ID에 1:1 매핑 관계를 갖고 있다. 예를 들어, 트레이스 버퍼(114A)에는 스레드 ID 1이 할당되고, 트레이스 버퍼(114B)에는 스레드 ID 2가 할당되는 등으로 이루어진다. 스레드 ID는 고정배선(hardwired)되거나 프로그램될 수 있다. 일실시예에서, 각각의 프로그램 카운터는 특정 스레드 ID 및 트레이스 버퍼와 결합된다(대안으로, 이러한 제한된 관계가 존재하지 않을 수도 있다).
도9는 시간 t1과 시간 t2에서 스레드의 회수 순서의 일례를 도시하고 있다. 본 예에서, 단지 4개의 트레이스 버퍼와 4개의 스레드 ID가 존재한다. 관련 스레드 번호는 괄호안에 나타나 있다. 구현예에 따라, 괄호안의 스레드 번호는 실제로는 어레이(198)에 포함되지 않는다. 시간 t1에서, 프로그램 및 회수 순서는 도6에 도시된 바와 같이 스레드 T1,T3,T2,T4가 된다. 시간 t1과 t2 사이에서는, 스레드 T4가 프로그램 순서가 아닌 것으로 판단이 이루어진다. 그러므로, 스레드 T4는 리셋되고, 트레이스 버퍼(114D)에 스레드 T5(도5에 도시되지 않음)를 위한 공간을 마련한다. 스레드 T5는 스레드 ID 4와 결합된다. 스레드 T1은 회수되어, 트레이스 버퍼(114A)에 스레드 T6를 위한 공간을 마련한다. 스레드 T6는 스레드 ID 1과 결합된다. 시간 t2에서, 프로그램 및 회수 순서는 스레드 T3,T2,T5,T6가 된다. (만일 스레드 T1이 스레드 T4가 리셋되기 전에 회수되면, 스레드 T5와 T6는 상이한 스레드 ID를 가졌을 것이지만, 프로그램 및 회수 순서는 변경되지 않게 된다.) 사용된 알고리즘에 따라, 스레드 T2가 어레이(198)에서 스레드 T3 이전의 최초의 것일 수도 있지만, 그러나 프로그램 및 회수 순서는 시간 t1에서의 어레이(198)로서 정정되게 된다.
전술한 바와 같이, 스레드의 프로그램 순서는 스레드들이 순서적 프로세서 상에서 실행되게 되는 순서이다. 명령어의 프로그램 순서는 그 명령어들이 순서적 프로세서 상에서 실행되게 되는 순서이다. 스레드 관리 로직(124)은 반드시 스레드의 진정한 프로그램 순서를 초기에 판단할 필요는 없다. 그러나, 스레드 관리 로직(124)은 결국 진정한 프로그램 순서를 판단하게 된다.
도8을 참조하면, 트레이스 버퍼(114A,114B,...,114Y)는 도선(118)에 접속된 도선(118A,118B,...,118Y)를 통해 명령어를 수신한다. 도선(118A,118B,...,118Y)과 도선(118) 사이에는 멀티플렉싱 회로가 존재할 수 있다. 이와 달리, 어떤 트레이스 버퍼가 활성화될 것인지를 인에이블 신호가 제어할 수도 있다. 또한, 대안으로 병렬 트랜잭션을 처리하기 위한 충분한 병렬 도선이 존재할 수도 있다. 트레이스 버퍼(114A,114B,...,114Y)는 리플레이를 위한 명령어 및 관련 정보를 도선(120)에 접속된 도선(120A,120B,...,120Y)을 통해 파이프라인(108)으로 제공한다. 트레이스 버퍼(114)로부터 복수의 명령어들이 실행을 위해 도선(120) 및 MUX(110)을 통해 동시에 통과될 수 있다는 것을 주목하자. 이와 동시에, 디코더(106)로부터의 복수의 명령어들이 첫 번째 시간 동안에 MUX(110)를 통해 통과될 수도 있다. 스레드 ID와 명령어 ID(instr ID)가 파이프라인을 통해 각각의 명령어와 동행한다. 리플레이 카운트도 역시 명령어와 동행할 수 있다. 적재 및 저장 명령어의 경우에, 적재 버퍼 ID(LBID)와 저장 버퍼 ID(SBID)도 역시 명령어와 동행할 수 있다. 일실시예에서, LBID와 SBID는 모든 명령어와 동행하지만, LBID와 SBID 값은 적재 및 저장 명령어가 아닌 명령어의 경우에는 의미가 없을 수도 있다. 후술되는 바와 같이, PRID 또는 값도 역시 재실행되고 있는 명령어와 동행할 수 있다.
트레이스 버퍼(114A,114B,...,114Y)는 도선(126)에 접속된 바이패스 도선(126A,126B,...,126Y)을 통해 리네임/할당 유닛(150)으로부터 PRID, LBID 및 SBID 값을 수신한다. 트레이스 버퍼(114A,114B,...,114Y)는 도선(122)에 접속된 도선(122A,122B,...,122Y)을 통해, 그리고 도선(196)에 접속된 도선(196A,196B,...,196Y)을 통해 라이트백 결과 정보 및 관련 신호를 수신한다. 리플레이 신호는 도선(194)에 접속된 도선(194A,194B,...,194Y)을 통해 제공된다. 이들 도선(120,126,122,194,196)에는 멀티플렉싱 및/또는 회로 및/또는 상당한 수의 병렬 도선이 사용될 수 있다. 트레이스 버퍼들은 동일할 수도 있고, 약간 상이할 수도 있다.
도10에서, 트레이스 버퍼(114A)는 트레이스 버퍼의 제1 실시예를 도시한 것이다. 도11에서, 트레이스 버퍼(114A')는 트레이스 버퍼의 제2 실시예를 도시한 것이다. 트레이스 버퍼의 다른 실시예는 트레이스 버퍼(114A,114A')의 변형이나 또는 아주 상이한 구조를 포함할 수 있다.
1. 트레이스 버퍼(114A)
도10을 참조하면, 트레이스 버퍼(114A)는 명령어 큐(queue) 어레이(202A), 데이터 및 의존도(DAD) 어레이(206A), 입력 레지스터 파일(208A), 출력 레지스터 파일(210A), 의존도 생성 회로(212A) 및 제어 회로(224A)를 포함한다. 용어 "어레이"는 특정 형태에 제한되지 않고 복수의 방향으로 정보를 포함하도록 넓은 의미로 의도된 것이다.
a. 명령어 큐 어레이(202A)
이제 도12를 참조하여, 본 발명의 일실시예에 따라 명령어 큐 어레이(202A)의 구조 및 다른 구성요소와의 상호작용에 대해 설명한다. 명령어 큐 어레이(202A)는 특정 스레드의 일부인 I-캐시(104)로부터 페치된 명령어를 수신한다. 스레드 내의 명령어들은 순서적으로 페치되어 명령어 큐 어레이(202A)로 기록된다. 다른 스레드의 일부인 명령어들은 상이한 시간에 상이한 트레이스 버퍼의 명령어 큐로 기록되거나 또는 명령어 큐 어레이(202A)에 의해 기록된다. 명령어 큐 어레이(202A)는 각각의 명령어 식별자(instr ID)를 위한 다양한 정보 필드를 포함한다. 다른 실시예는 약간 다른 필드와 다른 수의 로우(rows)를 포함할 수 있다. 명령어 큐 어레이(202A)의 일실시예에서, 프로그램 카운터 값은 고려되지 않지만, 다른 실시예에서는 고려될 수 있다. 명령어 큐 어레이(202A) 및 도면에 도시된 모든 다른 구성요소들은 다양한 필드, 신호 및 도시되지 않은 구조를 포함할 수 있다. 이러한 필드, 신호 및 구조는 예시되지 않았는데, 그 이유는 이들이 구현예에 따라 변화되고, 이 기술분야에 통상의 지식을 가진 자가 이해할 수 있으며, 명세서를 매우 복잡하게 만들고 본 발명을 모호하게 만들 수 있기 때문이다.
명령어들은 최종적으로 회수되거나 폐기될 때까지 트레이스 버퍼(114A)에서 대기한다(그 이유는 예를 들어, 스레드가 프로그램의 순서적 실행의 일부가 아닌 것으로 판단이 이루어질 수 있기 때문이다). 만일 트레이스 버퍼에 아직 실행되지 않은 명령어들이 존재하는 동안에 명령어 큐 어레이(202A)가 가득 채워지면, 하나의 명령어가 명령어 큐 어레이(202A)로부터 최종적으로 회수되어 하나의 로우가 할당해제될 때까지 명령어들이 트레이스 버퍼(114) 또는 리네임/할당 유닛(150)에 의해 수신되지 않는다. 시스템(100) 내의 다양한 어레이의 엔트리는 헤드 및 테일(tail) 포인터의 이동에 의해 할당되고 할당해제될 수 있다.
이제, 명령어 큐 어레이(202A)는 다음의 코드 라인과 관련하여 설명된다.
I0:mul R1, R2 →R1
I1:mul R3, R4 →R2
I2:add R1, R2 →R1
I3:add 10, R1 →R4
I4:store R2 →Mx
I5:store R1 →My
이들은 스레드 내의 첫 번째 6개의 명령어들이다. 트레이스 버퍼(114A) 이외의 트레이스 버퍼는 트레이스 버퍼(114A) 보다 프로그램 순서로 빠르다는 것을 이해할 것이다.
"오피 코드(Op Code)" 필드는 특정 명령어와 관련된 연산 코드를 포함한다. "목적지(destination)", "소스 1(Source 1)" 및 "소스 2(Source 2)" 필드는 명령어들의 목적지, 소스 1 및 소스 2를 식별한다. "소스 1에 대한 인덱스(Index for Source 1)" 필드는 그 소스를 포함하는 트레이스 버퍼(114A) 내의 명령어 엔트리를 식별한다. 예를 들어, 명령어 ID 0(instr ID 0)의 목적지는 명령어 ID 2(instr ID 2)에 대한 소스 1을 위해 사용된다. 그러므로, 0은 명령어 ID 2의 "소스 1에 대한 인덱스" 필드에 위치된다. 명령어 ID 2의 목적지는 명령어 ID 3에 대한 소스 2를 위해 사용된다. 그러므로, 2는 명령어 ID 3의 "소스 2에 대한 인덱스" 필드에 위치되고, X는 돈 캐어(don't care)를 나타낸다.
"유효 비트 1(Valid 1)" 및 "유효 비트 2(Valid 2)" 필드는 명령어 ID의 대응하는 소스 오퍼랜드가 트레이스 버퍼(114A) 내의 스레드의 외부로부터의 명령어에 의해 이전에 생성되었을 때 제1 값(예, 논리 0)으로 설정되고, 명령어 ID에 대한 소스 오퍼랜드가 스레드 내의 명령어에 의해 이전에 생성되었을 때 제2 값(예, 논리 1)으로 설정되는 비트들이다. 명령어 ID 0의 소스 1(R1)은 명령어 큐 어레이(202A)에서 트레이스 버퍼 외부에서 생성된다. 따라서, 명령어 ID 0의 유효 비트 1은 논리 0이 된다. 명령어 ID 3에 대한 소스 2는 명령어 ID 2의 목적지로부터 생성되며, 따라서 명령어 ID 3의 유효 비트 2는 논리 1이다.
명령어 I3는 상수 "10"에 R1을 가산하는 것을 수반한다. 이 상수는 특정 레지스터(도시 안됨)나 소스 1 필드 또는 소정의 다른 메카니즘을 통해 명령어와 함께 저장될 수 있다. 도12에서, X(don't care)는 명령어 ID 3에 대한 소스 1 필드에 도시되어 있다. 이와 달리, 소정의 인디케이터가 소스 1 필드에 위치될 수 있다.
저장 버퍼 ID(SBID) 필드는 후술되는 바와 같이 저장 버퍼 내의 저장 명령어와 관련된 SBID를 홀드한다. 적재 버퍼 ID(LBID) 필드는 후술되는 바와 같이 적재 버퍼 내의 적재 명령어와 관련된 LBID 엔트리를 홀드한다. SBID 및 LBID 값은 리네임/할당 유닛(150)에 의해 할당되며, 바이패스 도선(126)을 통해 명령어 큐 어레이로 기록된다. 명령어 큐 어레이(202A)에 스레드 ID 번호 필드가 포함될 수 있지만, 이것은 암시적인(implicit) 것이기 때문에 필요로 되지 않는다.
b. DAD 어레이(206A) 및 의존도 생성 회로(212A)
도13을 참조하면, DAD 어레이(206A)의 일실시예는 명령어 큐 어레이(202A)의 명령어 ID 엔트리에 1:1 방식으로 대응하는 "명령어 ID 엔트리(로우)"를 포함한다. 실제로, 명령어 큐 어레이(202A)와 DAD 어레이(206A)는 동일한 어레이의 상이한 부분이 될 수 있다. 그러나, 일부 실시예에서는 명령어 큐 어레이(202A) 및 DAD 어레이(206A)와 관련된 서로 다른 판독 포트가 존재한다.
DAD 어레이(206A)는 레지스터 파일(152)에서 명령어 또는 PRID에 의해 생성되는 값을 갖는 "값 또는 PRID" 필드를 포함한다. 이 값은 라이트백 유닛(162)과 라이트백 버스(122,196)를 통해 실행 유닛으로부터 트레이스 버퍼(114A)로 라이트백된다. 2 비트로 이루어질 수 있는 "상태(Status)" 필드는 "값 또는 PRID" 필드가"값"을 포함하는지 또는 "PRID"를 포함하는지를 나타낸다. 일실시예에서는, "값 또는 PRID" 필드가 유효 "값" 또는 유효 "PRID"를 홀드하지 않는 것도 가능하다. 명령어 디스패치(dispatch)를 고유하게 식별하는 "리플레이 카운트" 필드는 동일한 명령어 ID의 명령어가 파이프라인(108)에서 리플레이될 때마다 증가된다. 일실시예에서는, 명령어가 파이프라인(108) 내에서 1회 이상 동시에 리플레이될 수 있다. 이 경우에, 일실시예에서는 가장 높은 "리플레이 카운트"와 관련된 정보만이 DAD 어레이(206A)로 라이트백된다.
"의존도 필드"는 각각의 논리 레지스터에 대한 비트를 포함한다. 도13에서는 간략성을 위해 단지 4개의 논리 레지스터(R1,R2,R3,R4)만 도시되었다. 그러나, 이 수는 훨씬 더 클 수 있다. 일례에서, 의존도 필드 엔트리는 트레이스 버퍼로의 입력 값과 명령어 엔트리 사이에 데이터 의존도 체인이 존재한다는 것을 나타내기 위해 1로 설정되고, 의존도가 없는 경우에는 0으로 설정된다. 의존도 필드 엔트리는 (값의 잘못된 추론이 검출된 경우와 같이) 입력 값이 수신된 경우에 트레이스 내의 어떤 명령어가 실행될 필요가 있는지를 식별한다.
명령어가 페치되어, 디코드되고 트레이스 버퍼(114A)로 기록될 때, 의존도 비트가 순차적으로 계산되어 DAD 어레이(206A)로 기록된다. 이들 의존도 비트는 명령어를 리플레이할 것인지 여부를 판단하기 전에 생성될 수도 있다. 도13의 의존도 비트는 전술한 바와 같은 6개의 명령어 I0-I5를 위한 것이다.
의존도 필드는 기계적인 접근방법을 통해 생성될 수 있다. 이러한 접근방법을 설명하기 전에, 보다 직관적인 레벨로 생성 단계에 대해 설명한다.
i. 직관적 레벨(Intuitive Level)
명령어 I0의 결과는 레지스터 R1 및 R2에만 의존한다. 그러므로, 명령어 ID 0(명령어 I0에 관련된 정보를 홀드함)의 R1 및 R2 칼럼(columns)에는 1이 위치되고, R3 및 R4 칼럼에는 0이 유지된다.
명령어 I1의 결과는 레지스터 R3 및 R4에만 의존한다. 그러므로, 명령어 ID 1의 R1 및 R2 칼럼(columns)에는 0이 위치되고, R3 및 R4 칼럼에는 1이 위치된다.
명령어 I2의 결과는 각각 명령어 I0 및 I1에서 생성되는 레지스터 R1 및 R2에 직접적으로 의존한다. 명령어 I0에서, R1은 트레이스의 개시점에서 R1 및 R2 값에 의존한다. 명령어 I2에서, R2는 트레이스의 개시점에서 R3 및 R4 값에 의존한다. 그러므로, 명령어 I2는 트레이스의 개시점에서 R1-R4 값에 간접적으로 의존하게 되고, 명령어 ID 2의 R1-R4 칼럼에는 1이 위치된다.
명령어 I3의 결과는 명령어 I2에서 생성되는 레지스터 R1에 직접적으로 의존한다. 그러므로, 명령어 I3는 트레이스의 개시점에서 R1-R4 값에 간접적으로 의존하게 되는데, 그 이유는 명령어 I2가 이들 값에 의존하기 때문이며, 명령어 ID 3의 R1-R4 칼럼에는 1이 위치된다.
명령어 I4의 결과는 명령어 I1에서 생성되는 레지스터 R2에 직접적으로 의존한다. R2는 트레이스의 개시점에서 레지스터 R3 및 R4 값에 의존한다. 그러므로, 명령어 ID 4의 R1 및 R2 칼럼에는 0이 위치되고, R3 및 R4 칼럼에는 1이 위치된다.
명령어 I5의 결과는 명령어 I2에서 생성되는 레지스터 R1에 직접적으로 의존하며, 이 값은 트레이스의 개시점에서 레지스터 R1-R4 값에 의존한다. 그러므로,명령어 ID 5의 R1-R4 칼럼에는 1이 위치된다.
ii. 기계적 접근방법
다음에는 본 발명의 일실시예에 따라 의존도 필드를 생성하기 위해 사용될 수 있는 레지스터 및 알고리즘에 대해 설명한다. 도14를 참조하면, 의존도 생성 회로(212A)는 각각의 논리 레지스터에 대해 하나씩 임시(temporary) 레지스터(230,232,234,236)와 하나의 추가적인 임시 레지스터(240)를 포함한다. 이들 임시 레지스터(230,232,234,236)는 논리 레지스터(R1,R2,R3,R4)에 대한 수정자(modifier)를 포함한다. 수정된 레지스터(modified register)(240)는 트레이스 내의 명령어에 의해 어떤 논리 레지스터가 수정될 것인지를 나타내는 일련의 비트를 포함한다. 이들 레지스터(230,232,234,236,240)는 트레이스 버퍼로 새로운 명령어가 기록될 때마다 갱신된다. 레지스터 사이의 경계는 약간 임의적이다. 예를 들어, 이들 레지스터가 모두 하나의 조합된 레지스터에 존재할 수 있다.
각각의 논리 레지스터에 대해, 논리 레지스터를 수정하기 위해 트레이스 버퍼(114A) 내의 최종 명령어를 지시하는 트레이스 버퍼 어드레스 레지스터가 제공된다. 수정된 비트들과 최종 수정자 어드레스는 트레이스 버퍼(114A)로 기록될 다음 명령어에 대한 의존도 비트를 계산하기 위해 이용된다.
여기서 사용되는 바와 같이, 레지스터를 수정한다는 것은 단지 그 레지스터로 어떤 값이 기록되는 것을 의미한다는 것을 주목하자. 이것이 반드시 명령어의 결과로서 레지스터의 내용이 달라진다는 것을 의미하는 것은 아니다. 예를 들어, 만일 R1 및 R2의 내용이 (명령어 I0에서와 같이) 곱셈이 이루어지고(multiplied)그 결과가 레지스터 R1으로 기록되는 경우에, 명령어 I0의 결과로서 R1의 내용이 반드시 달라지는 것은 아니다. 예를 들어, 명령어 이전에 R1의 내용이 "0"이거나 또는 R2가 "1"이면, 명령어 이후의 R1의 내용은 달라지지 않게 된다.
도16에서, 흐름도(250)는 DAD 어레이(206A)의 의존도 필드를 생성하기 위해 명령어의 각각의 소스 오퍼랜드(예, 소스 1 및 소스 2)에 대해 수행되는 알고리즘을 나타낸 것이다. 단계(252)에서는, 레지스터(240)에 관련 비트가 셋트되었는지 여부를 판단한다. 단계(254)에 기재된 바와 같이, 만일 레지스터(240) 내의 비트가 셋트되어 있지 않으면, 그 레지스터와 관련된 의존도 필드의 비트가 논리 1로 셋트된다. 다음에 단계(258)에 기재된 바와 같이, 만일 레지스터(240) 내의 비트가 셋트되어 있으면, 관련 레지스터에 대해 수정자 레지스터(230,232,234 또는 236)로부터 생성된 인덱스를 이용하여 소스 의존도 필드가 판독된다. 다음에는 단계(262)에 기재된 바와 같이, 논리 OR 연산을 이용하여 소스 의존도 비트가 현재 명령어 의존도 비트와 병합된다. 이러한 논리 OR 연산은 도15에 OR-게이트(244)로 예시되어 있다(여기서, 입력에 복수의 비트가 도시되어 있다). 도16의 알고리즘을 수행하는데 있어, 수정된 레지스터 및 수정자는 명령어가 수행되기 바로 전에 존재하는 것들이다.
명령어 I0에 관해서, 이 명령어 I0 이전에 레지스터(240)는 R1,R2,R3 및 R4에 대해 논리 0을 갖고 있으며, 레지스터(230,232,234,236)의 값들은 X(don't care)이다. 단계(252)에서, R1 및 R2에 대해 레지스터(240) 내의 수정된 비트는 각각 0이다. 그러므로, 단계(254)에서, R1 및 R2에 대한 의존도 필드 비트들은 DAD어레이(206A)의 명령어 ID 0의 로우에서 각각 1로 셋트된다. 레지스터 R3 및 R4는 관련되지 않으며, 명령어 ID 0의 로우에서 0으로 유지된다. 명령어 I0는 레지스터 R1을 수정한다. 그러므로, 레지스터(230)에 0이 위치되고, 이것은 명령어 I0가 레지스터 R1을 수정하기 위한 가장 최근의 명령어라는 것을 나타낸다. 레지스터(232,234,236) 내의 값은 X(don't care)로 유지된다. 레지스터(240)의 R1 비트는 1로 셋트되며, 이것은 R1이 트레이스 내의 명령어에 의해 수정되었다는 것을 나타낸다.
명령어 I1에 대한 의존도 필드도 명령어 I0와 유사한 방식으로 생성된다. 수정된 레지스터(240)의 R1 논리 레지스터 칼럼은 1로 셋트되어 유지된다. 수정된 레지스터(240)의 R2 칼럼에는 논리 1이 위치된다. 레지스터(232) 내의 논리 1은 명령어 I1을 나타낸다.
명령어 I2에 관해서, 이 명령어 I2 이전에 단계(252)에서, R1 및 R2에 대한 레지스터(240) 내의 수정된 비트는 각각 논리 1이다(즉, 셋트됨). 단계(258)에서, 명령어 I2 바로 직전에 R1(230) 및 R2(232)에 대한 수정자 레지스터들이 인덱스로서 사용된다. 레지스터(230)는 명령어 I0에 대해 0을 포함한다. DAD 어레이(206A)의 명령어 ID 0에서 명령어 I0에 대한 의존도 필드는 0011이다. 레지스터(232)는 명령어 I1에 대한 1을 포함한다. 명령어 ID 1에서 명령어 I1에 대한 의존도 필드는 1100이다. 단계(262)에서, 0011과 1100의 논리적 OR 연산은 1111이 된다. 그러므로, 명령어 ID 2에 대한 DAD 어레이(206A)의 의존도 필드에는 1111이 위치된다. R1은 명령어 I2에 의해 수정된다. 그러나, 레지스터 R1에 대해 레지스터(240)에는 이미 1이 위치되어 있다. 레지스터(230)에는 2가 위치되며, 이것은 명령어 I2가 레지스터 R1을 수정하기 위한 가장 최근의 명령어라는 것을 나타낸다.
명령어 I3에 대한 의존도 필드도 역시 명령어 I2와 유사한 방식으로 생성된다. 수정된 레지스터(240)의 R4 칼럼에 논리 1이 부가되고, 명령어 I3를 나타내는 3이 레지스터(236)에 위치된다. 논리적 OR 연은 1111을 발생한다.
명령어 I4에 관해서, 이 명령어 I4 이전에 R2에 대한 레지스터(240) 내의 수정된 비트는 1로 셋트된다. 단계(258)에서, 명령어 I4 바로 직전에 R2(232)에 대한 수정자 레지스터가 인덱스로서 사용된다. 이 레지스터(232)는 명령어 I1에 대한 1을 포함하고 있다. DAD 어레이(206A)의 명령어 ID 1에서 명령어 I1에 대한 의존도 필드는 1100이다. 단계(262)에서, 1100(명령어 ID 1로부터의 소스 1)과 0000(소스 2가 존재하지 않음)의 논리적 OR 연산은 1100이 된다. 그러므로, 명령어 ID 4의 로우에 대한 DAD 어레이(206A)의 의존도 필드에는 1100이 위치된다.
명령어 I5에 대한 의존도 필드도 역시 명령어 I4와 유사한 방식으로 생성된다. 명령어 I5 및 I6는 외부 메모리 위치를 수정하며, 레지스터(230,232,234,236 또는 240)에서의 변화를 야기하지 않는다.
의존도 정보는 스케줄/발생 유닛(156)에 의해 이용될 수 있으며, 또는 스케줄/발생 유닛(156)이 단지 그 고유의 의존도 정보를 유도할 수 있다.
명령어 시퀀스 또는 스트링이 리플레이시에 트레이스 버퍼(114A)로부터 발생될 수 있는 상이한 방법이 존재한다. 한가지 방법은 트레이스 버퍼를 순차적으로 판독하고, 의존도 비트가 셋트된 명령어를 추출하고, 그것을 리플레이를 위해 전송하는 것이다. 그러나, 제로(zeros)가 파이프라인에서 버블(bubbles)을 생성하는 효과를 가질 수 있다. 다른 접근방법은 실행/리플레이를 위해 명령어를 전송하기 전에 패킹 로직(packing logic)에 의해 버블이 제거되도록 하는 것이다. 도17을 참조하면, 다른 접근방법은 각각의 논리 레지스터에 대해 어레이(268)를 포함하는 소정의 추가적인 하드웨어를 포함한다. 이 어레이(268)는 레지스터 R1에 의존하는 명령어들의 명령어 ID 값을 포함한다. 이 어레이(268) 내의 값은 명령어 큐 어레이(202A) 내의 전체 명령어 ID 엔트리에 대한 포인터로서 작용한다. 이것은 명령어 버퍼로부터 매우 빠르게 판독할 수 있도록 한다. 한 블록의 명령어들(2 또는 4)이 한번에 판독된다. 트레이스 버퍼(114A)는 멀티-포트형이 될 수 있고, 4개의 디코더를 갖고 있으며, 레지스터 어레이로부터 얻은 각각의 인덱스를 디코더로 전달하고, 명령어 I0,I2,I3 및 I5는 한 사이클에서 판독될 수 있다. 레지스터 R1 어레이는 리플레이가 시작되기 전에 의존도 필드가 생성될 때 조립(assembled)될 수 있다. 이러한 간접 레벨은 고 대역폭 리플레이를 용이하게 한다.
c. 출력 레지스터 파일(210A) 및 입력 레지스터 파일(208A)
트레이스 버퍼(114)는 소정의 추론 에러를 검출하기 위한 검출회로를 포함한다. 본 발명의 일실시예에 따르면, 각각의 트레이스 버퍼는 관련 스레드의 레지스터 문맥(context)을 홀드하는 출력 레지스터 파일과 프로그램 순서로 바로 선행하는 스레드의 레지스터 문맥을 수신하기 위한 입력 레지스터 파일을 구비한다. 레지스터 문맥은 논리 레지스터의 내용 또는 상태이다. 출력 레지스터 파일의 내용은 자주 갱신되는데, 레지스터에 변경이 있을 때마다 갱신될 수 있다. 입력 레지스터 파일의 내용은 후술되는 바와 같이 비교가 이루어진 후에만 갱신된다.
도18 및 도19는 (트레이스 버퍼 114A 내의) 출력 레지스터 파일(208A)과 (트레이스 버퍼 114B 내의) 입력 레지스터 파일(208B)의 실시예를 도시하고 있으며, 다른 실시예가 사용될 수도 있다. 출력 레지스터 파일(208A)과 입력 레지스터 파일(210B)은 값 또는 PRID 필드 및 상태 필드를 포함한다. 상태 필드는 값 또는 PRID 필드에 유효 값 또는 유효 PRID가 홀드되어 있는지 여부를 나타낸다. 다른 실시예에서는, 어느 쪽도 아닌 경우가 존재할 수 있으며, 이 경우에 입력 레지스터 파일에 의존하는 명령어가 하나를 대기할 수 있다.
전술한 예에서 명령어 I0는 레지스터 R1 및 R2를 포함하고 있으며, 이들 중 어느 것도 이전에는 명령어 I0를 포함하는 스레드 내의 명령어의 목적지가 아니었다는 것을 주목하자. 그러나, 레지스터 R1 및 R2에 대한 값 또는 PRID는 명령어 I0의 실행에 이용될 입력 레지스터 파일(208A)로부터 이용가능하다.
도20을 참조하면, 비교기(280B)는 현재 스레드에 대한 (트레이스 버퍼 114B 내의) 입력 레지스터 파일(208B)의 내용을 프로그램 순서로 바로 선행하는 스레드에 대한 (트레이스 버퍼 114A 내의) 출력 레지스터 파일(210A)의 내용과 비교한다. 이러한 비교는 바로 선행하는 스레드의 실행 종료시점에 또는 선행하는 스레드의 최초의 실행 동안에 이루어질 수 있다. 이러한 비교는 또한 선행하는 스레드의 회수의 종료시점에서도 이루어진다. 일실시예에서는, 선행하는 스레드의 회수의 종료시점에서만 이러한 비교가 이루어진다.
다양한 이벤트가 비교기(280B)에 의한 비교를 유발할 수 있다. 이러한 비교는 추론 에러를 검출하기 위해 이루어진다. 만일 입력 레지스터 파일과 출력 레지스터 파일 사이에 차(difference)가 존재하면, 바로 선행하는 스레드의 하나 또는 그 이상의 출력 레지스터의 값들이 변경된 것이다. 이에 응답하여, 입력 레지스터 파일(208B)이 갱신되고, 리플레이 트리거링 로직(284B)은 실행된 명령어들이 변경된 레지스터 값을 이용하여 리플레이되도록 한다. 이러한 리플레이 트리거링 로직(284B)에 의해 의존도 필드가 이용될 수 있다. 변경된 값이 궁극적으로 정확한 값(즉, 순수하게 프로그램 순서로 생성되는 레지스터 값)이라는 보장은 없다. 명령어들이 수회에 걸쳐 다시 리플레이될 필요가 존재할 수도 있다.
일실시예에서, 스레드에 대한 검출회로는 입력 레지스터 파일을 포함하는 트레이스 버퍼 버퍼에서 홀드되는 명령어에서 소정의 추론 에러를 검출하기 위해, 출력 레지스터 파일, 입력 레지스터 파일, 비교기 및 관련 제어 회로를 포함한다. 다른 실시예에서는, 검출회로가 약간 다른 회로를 포함할 수 있다.
일례로 도21을 참조하면, 스레드 T2는 현재 스레드이고 트레이스 버퍼(114B)와 관련되어 있다. 스레드 T1은 스레드 T2에 바로 선행하는 스레드이며, 트레이스 버퍼(114A)와 관련되어 있다. 스레드 T1은 함수 호출, 그 함수 및 그 함수 호출로부터의 리턴을 포함한다. 스레드 T2의 실행은 함수 호출 직후에 시작된다. 함수 호출시에 존재하는 출력 레지스터(210A)의 내용은 입력 레지스터 파일(208B)로 카피된다. 스레드 T2의 명령어는 입력 레지스터 파일(208B)의 레지스터 문맥에 근거하여 추론적으로 실행된다. 리턴 명령어의 시점에, 입력 레지스터 파일(208B)의 내용이 비교기(280B)에 의해 출력 레지스터 파일(210A)의 내용과 비교가 이루어진다.만일 차가 존재하면, 입력 레지스터 파일(208B)이 갱신되고, 스레드 T2 내의 실행된 명령어가 리플레이된다. 또한, 하나 또는 그 이상의 중간 시점에서도 비교가 이루어질 수 있다. 이것은 명령어의 리플레이를 보다 균일하게 분배함으로써 병목현상을 방지하는데 도움을 줄 수 있지만, 예를 들어, 출력 레지스터 파일의 내용이 함수 동안에 한번 이상 변경되는 경우에 추가적인 리플레이를 유발할 수 있다. 출력 레지스터 파일이 끊임없이 변화되기 때문에, 출력 레지스터 파일(210A)의 내용을 수신하는 중간 버퍼를 구비하는 것이 바람직할 수 있다. 그러면, 중간 버퍼와 입력 레지스터 파일(208B)의 내용 사이에서 비교가 이루어질 수 있다.
도8 및 도10에 도시된 바와 같이, 레지스터 문맥은 도선(216)을 통해 출력 레지스터 파일과 입력 레지스터 파일 사이에서 전달된다. 이 도선(216)은 각각의 입력 레지스터 파일을 바로 선행하는 스레드에 대한 트레이스를 홀드할 수 있는 각각의 트레이스 버퍼의 출력 레지스터 파일과 접속한다. 만일 프로그램 순서가 항상 특정 트레이스 버퍼 순서를 따르는 것이 보장될 수 있다면, 도선(216)의 레이아웃이 아주 간단하게 될 수 있다. 출력 및 입력 레지스터 파일은 도10 및 도11에 도시된 제어 회로(224A)에 의해 제어될 수 있다.
출력 및 입력 레지스터 파일은 값 또는 PRID를 제공하게 되기 때문에, 입력 레지스터 파일에서 내용을 수신하는 시점과 소스 오퍼랜드로서 입력 레지스터 파일로부터의 레지스터를 이용하여 명령어를 실행할 수 있게 되는 시점 사이의 대기시간이 매우 적을 수 있다. 만일 값이 이용가능하지 않으면, 레지스터 파일(152)에 대한 PRID가 파이프라인(108)에서의 실행을 위해 이용될 수 있다.
정확한 소스 오퍼랜드가 다양한 스레드의 레지스터 파일을 통해 진행됨에 따라 많은 명령어들이 수회에 걸쳐 리플레이될 것으로 예상된다. 그러나, 또한 많은 프로그램에 있어서, 상당히 많은 양의 명령어들이 전혀 리플레이될 필요가 없거나 또는 비교적 적은 횟수만 리플레이될 필요가 있게 되어, 단위 시간 당 정확하게 실행되는 명령어의 수가 상당히 증가되고, 프로그램을 실행하는데 요구되는 총시간이 감소되는 결과도 예상할 수 있다.
2. 트레이스 버퍼(114')
도11을 참조하면, 트레이스 버퍼(114')는 트레이스 버퍼(114)(도10)와 유사하다. 그러나, 트레이스 버퍼(114')에서는 명령어가 리플레이될 것으로 결정된 이후에 의존도 생성 및 디코딩 회로(218A)에서 의존도 필드가 생성된다. 비록 이것은 리플레이에서 약간의 초기 대기시간을 야기할 수 있지만, 리플레이를 위한 명령어의 발생과 의존도의 판단이 파이프라인 방식으로 수행되는 경우에, 일단 프로세스가 시작되면 추가적인 대기시간이 적어질 수 있다.
일실시예에서, 의존도 생성 및 디코딩 회로(218A)는 의존도 정보를 위해 오직 하나의 필드만을 홀드한다(도13에는 4개의 필드가 존재한다). 이 동일한 필드가 재사용될 수 있다. 예를 들어, 레지스터 R1에 의존하는 명령어의 리플레이 동안에, 이 필드는 레지스터 R1에 의존하는 명령어들을 리스트(list)하기 위해 사용될 수 있다. 레지스터 R2에 의존하는 명령어의 리플레이 동안에는, 이 동일한 필드가 레지스터 R2에 의존하는 명령어들을 리스트하기 위해 사용될 수 있다. 의존도 생성 및 디코딩 회로(218A)는 오직 하나의 수정자 필드와 하나의 수정자 레지스터를 포함할 수 있다(도14에는 4개가 도시되어 있다). 이와 달리, 의존도 생성 및 디코딩 회로(218A)가 복수의 의존도 필드 및 레지스터들을 포함할 수도 있다. 이 의존도 생성 및 디코딩 회로(218A)는 한번에 매우 적은 수의 명령어에 대한 의존도를 판단할 수 있다.
데이터 어레이(214A)는 (도10 및 도13의 DAD 어레이 206A에서와 같이) 각각의 명령어 ID 엔트리에 대해 값 또는 PRID 필드, 상태 필드 및 리플레이 카운트 필드를 포함한다. 이와 달리, 데이터 어레이(214A)의 내용을 의존도 생성 및 디코딩 회로(218A)에 위치시켜 이 데이터 어레이(214A)를 불필요하게 만들 수 있다. 데이터 어레이(214A)와 의존도 생성 및 디코딩 회로(218A)를 분리시켜 유지하는 것이 유리할 수 있는 2가지 이유가 있다. 첫째로, 이들이 상이한 판독 포트를 포함할 수 있으며, 두 번째로, 일실시예에서 의존도 생성 및 디코딩 회로(218A)가 명령어 큐 어레이(202A) 및 데이터 어레이(214A) 만큼 많은 로우(rows)를 갖고 있지 않다는 것이다. 다시 말하면, 일실시예에서 의존도 생성 및 디코딩 회로(218A)는 그것이 의존도 필드를 재사용할 수 있는 것처럼 로우들을 재사용한다. 물론 많은 가능성이 존재한다.
보다 상세하게 후술되는 바와 같이, MOB(178)는 도선(194)을 통해 적재 명령어가 리플레이될 때를 신호한다(signals). 리플레이될 적재 명령어에 의존하는 명령어들을 리스트하기 위해 (도13의 R1에 대한 것과 같이) 의존도 필드를 가진 어레이가 생성될 수 있다. 그러나, 적재 명령에 대해서, 종속 명령어의 리스트는 레지스터의 경우에서와 같이 트레이스 내의 첫 번째 명령어가 아니라 그 적재 명령어와함께 시작된다. 적재 명령어에 대한 의존도 필드는 의존도 생성 및 디코딩 회로(218A)(도11) 내에 존재할 수 있다(물론, 다른 트레이스에 대한 적재 명령어들은 다른 트레이스 버퍼로부터 리플레이되게 된다). 일실시예에서 의존도 생성 및 디코딩 회로(218A)는 적재 명령어 및 레지스터 둘 다에 대한 의존도 필드를 위해 사용된다. 동일한 필드가 둘 다를 위해 사용될 수 있다. 다른 실시예에서는, 레지스터에 대한 의존도 필드가 DAD 어레이(206A) 내에 있고, 적재 명령어에 대한 의존도 필드가 의존도 생성 및 디코딩 회로(218A) 내에 있다.
또다른 실시예에서는, 적재 명령어가 완전히 리플레이되며(즉, 적재 명령어 다음에 오는 모든 명령어들이 재실행됨), 따라서 의존도 필드가 요구되지 않는다.
C. 리플레이 시퀀스 알고리즘
리플레이 트리거링 로직(예, 리플레이 트리거링 로직 284A)이 소스 오퍼랜드(또는 다른 입력 값)가 잘못 예측된 것으로 판단하면, 그것은 파이프라인(108)에서 리플레이될 잘못 예측된 소스 오퍼랜드에 직접 또는 간접적으로 의존하는 명령어들을 디스패치하기 위해 대응하는 트레이스 버퍼(예, 트레이스 버퍼 114B)를 트리거시킨다. 직접 또는 간접적으로 의존하는 명령어들은 트레이스 버퍼 내의 DAD 어레이의 의존도 필드로부터 식별되거나 또는 도11에서와 같이 다른 어레이를 통해 식별될 수 있다.
식별된 명령어들은 그 명령어들이 트레이스 버퍼에 존재하는 순서로(프로그램 순서로) 실행을 위해 트레이스 버퍼로부터 디스패치된다. 예를 들어, 명령어 ID0 엔트리 내의 명령어는 명령어 ID 1 엔트리 내의 명령어 보다 이전에 또는 동일한 시간에 디스패치된다. 그러나, 비순서적 프로세서에서와 같이 스케줄/발생 유닛(156)의 제어하에 명령어들이 비순서적으로 실행될 수도 있다. (1) 레지스터 리네임을 할 것인지, (2) 리네임/할당 유닛(150) 내의 리네임 에일리어스 테이블 조사(rename alias table lookup)를 바이패스하고 그 대신에 대응하는 트레이스 버퍼로부터의 PRID를 사용할 것인지, 또는 (3) 리네이밍을 완전히 바이패스하고 명령어 내의 상수 오퍼랜드처럼 DAD 어레이로부터의 값을 사용할 것인지 여부를 리네임/할당 유닛(150)으로 표시해주기 위해 트레이스 버퍼로부터 디스패치된 명령어 제어 비트가 부가된다.
도12와 관련하여 전술된 바와 같이, "유효 비트 1(Valid 1)" 및 "유효 비트 2(Valid 2)" 필드는 명령어 ID의 대응하는 소스 오퍼랜드가 트레이스 버퍼(114A) 내의 스레드의 외부로부터의 명령어에 의해 생성되었을 때 제1 값(예, 논리 0)으로 설정되고, 명령어 ID에 대한 소스 오퍼랜드가 스레드 내의 명령어에 의해 생성되었을 때 제2 값(예, 논리 1)으로 설정되는 비트들이다. 트레이스 버퍼(114A)로부터 디스패치된 리플레이되는 명령어는 다음과 같이 결정되는 소스 오퍼랜드를 가질 수 있다.
(1) 유효 비트 1: 만일 명령어 큐 어레이(202A) 내의 유효 비트가 논리 1로 설정되어 있으면, 소스 오퍼랜드에 대한 인덱스가 DAD 어레이(206A) 내의 대응하는 값 또는 PRID를 판독하기 위해 이용된다. 만일 DAD 어레이 상태 필드의 값 비트나 또는 PRID 비트가 둘 다 유효하지 않으면, 그것은 소스 오퍼랜드 레지스터가 아직 리네임되지 않았다는 것을 의미한다. 이 경우에, 명령어는 도선(120) 및 MUX(110)를 통해 논리 0 값을 가진 값 및 PRID 상태 비트와 함께 디스패치되며, 따라서 리네임/할당 유닛(150)이 그것이 정상적으로 수행하는 바대로 에일리어스 테이블 조사(레지스터 리네이밍)를 수행하도록 허용한다. 만일 PRID 또는 값이 유효하면, 그것은 명령어와 함께 도선(120) 및 MUX(110)를 통해 리네임/할당 유닛(150)으로 전달되고, 이 유닛은 그에 응답하여 리네이밍 스테이지를 바이패스한다.
(2) 유효 비트 0: 만일 소스 오퍼랜드에 대한 유효 비트가 논리 0으로 설정되면, 입력 오퍼랜드는 트레이스 외부로부터 온다. 입력 레지스터 파일(208A)에 억세스하기 위해 소스 레지스터 명칭(name)이 이용된다. 입력 레지스터 파일(208A)로부터의 값 또는 PRID는 명령어와 함께 리네임/할당 유닛(150)으로 전달되며, 이 유닛은 그에 응답하여 리네이밍 스테이지를 바이패스한다.
각각의 디스패치된 명령어에 대해 유효 비트가 0이든지 또는 1이든지 간에, DAD 어레이(206) 내의 값 및 PRID 상태 필드 비트는 리셋되거나 논리 0에서 유지된다. 이것은 2가지 목적을 달성한다. 첫째로, PRID가 리네이밍 스테이지로부터 엔트리 내로 카피되기 전에 디스패치된 보다 늦은 종속 명령어가 리네임 에일리어스 테이블로부터 리네임되는 것이 허용되도록 보장되며, 따라서 트레이스 버퍼(114A)로부터 상태 PRID를 이용하는 것을 피할 수 있다. 두 번째로, 마지막 명령어가 라이트백될 때까지 명령어가 회수되지 않도록 보장되며, 따라서 모든 데이터 오예측이 정정된 경우에만 명령어가 회수될 수 있도록 허용된다.
D. 제2 레벨 또는 최종 회수
모든 이전의 스레드에 대한 모든 명령어들이 회수되고 그 명령어에 속한 모든 리플레이 이벤트들이 서비스되었을 때 명령어가 트레이스 버퍼(114)로부터 최종적으로 회수된다. 다시 말하면, 명령어가 정확한 소스 오퍼랜드에 의해 실행되었다고 보장할 수 있을 때 명령어가 최종적으로 회수된다. 스레드는 순서적으로 회수된다. 예를 들어, 스레드 X 내의 명령어는 모든 이전의 스레드가 회수될 때까지는(즉, 모든 이전의 스레드의 명령어들이 회수될 때까지는) 회수될 수 없다. 스레드 내의 명령어들은 순서적으로 회수되며, 다만 회수 준비가 모두 이루어진 명령어들은 동시에 회수될 수 있다.
최종 회수는 최종 회수 로직(134)에 의해 제어된다. 본 발명의 일실시예에서, 최종 회수는 (1) 레지스터 파일로 순서적으로 결과를 위탁하는 것과, (2) 인터럽트, 예외 및/또는 오예측에 대한 서비스, (3) 트레이스 버퍼 및 MOB(178)의 할당해제, 및 (4) 회수되는 대로 저장 명령어를 마킹하고 그것을 메모리로 발생시키도록 MOB에 신호하는 것을 포함한다. 할당해제 엔트리는 헤드 포인터를 이동시키는 것을 포함할 수 있다. 전술한 바와 같이, MOB(178) 내의 저장 명령어들은 관련 데이터가 데이터 캐시(176) 또는 다른 메모리로 카피될 때까지는 할당이 해제되지 않는다. MOB(178) 내의 적재 및 저장 명령어들의 최종 회수에 관한 세부사항에 대해서는 후술한다.
E. 메모리 시스템
도22를 참조하면, 도2의 MOB(178)의 일실시예는 MOB(178A,178B,...,178Y)를 포함하고 있으며, 여기서 Y는 MOB의 수이며, 트레이스 버퍼(114)의 수와 일치한다. MOB(178A,178B,...,178Y)는 각각 트레이스 버퍼(114A,114B,...,114Y) 내의 트레이스의 적재 및 저장 명령어들의 카피를 홀드한다. 적재 명령어들은 적재 버퍼(182A,182B,...,182Y)에서 홀드되고, 저장 명령어들은 저장 버퍼(184A,184B, ...,184Y)에서 홀드된다. 도선(292)은 MOB(178)로/로부터 신호를 전달하는 다양한 도선을 나타낸다. 리플레이 도선(194)은 MOB(178)로부터의 신호를 트레이스 버퍼(114)로 제공하여, 적재 명령어가 리플레이되어야 하는 트레이스 버퍼(114)를 변경한다. 제어 회로(302)는 다양한 제어 기능을 수행한다.
1. 저장 버퍼 및 적재 버퍼
도23은 저장 버퍼(184B,...,184Y)들을 대표하는 저장 버퍼(184A)의 일실시예를 도시하고 있다. 다양한 다른 실시예도 이용될 수 있다. 저장 버퍼(184A)는 저장 버퍼 엔트리들의 로우에 대한 다양한 필드를 포함한다. 각각의 엔트리는 저장 버퍼 ID(SBID)에 의해 식별된다. 리네임/할당 유닛(150)은 각각의 저장 명령어가 첫 번째로 페치되어 실행되지만 리플레이 상태에 있지 않을 때 그 각각의 저장 명령어에 SBID 엔트리를 할당한다. 저장 명령어는 최종 회수 때까지 동일한 SBID 값을 갖는다. 예를 들어, 도23에서 엔트리 SBID 0은 STORE 0(저장 명령어 0)에 할당된다. 엔트리 SBID 1은 STORE 2에 할당된다. 도23에는 전술한 "저장 LBID" 값을 홀드하는 LBID 필드가 도시되어 있다. 일실시예에서, 명령어 큐 어레이(202A)(도12)의 엔트리가 저장 명령어를 홀드하고 있으면, 명령어 큐 어레이(202A)의 SBID 필드는 그 저장 명령어를 홀드하는 저장 버퍼(184A) 내의 엔트리를 식별하는 SBID를 홀드하고, LBID는 그 저장 명령어에 대한 저장 LBID(존재하는 경우)를 홀드한다. SBID와 저장 LBID는 파이프라인(108)을 통해 저장 명령어와 동행한다. 일실시예에서, LBID 필드는 저장 버퍼(184A)에 포함되지 않을 수도 있다.
명령어 ID 필드는 명령어 큐 어레이(202A) 내의 저장 명령어의 명령어 ID를 홀드한다. 스레드 버퍼 ID는 저장 버퍼(184A)와 트레이스 버퍼(114A) 모두에 내재된다. OP 코드 필드는 저장 명령어의 OP 코드를 홀드한다. 저장 어드레스 필드는 저장 명령어가 향하는 어드레스를 홀드한다. 도시된 실시예에서, 어드레스는 AGU(172)에 의해 생성된다. SB 어드레스 유효 필드는 저장 어드레스가 유효 어드레스인지 여부를 나타내는 비트를 포함한다. 데이터 필드는 저장될 데이터를 홀드한다. 데이터 유효 필드는 데이터가 유효한지 여부를 나타내는 비트를 포함한다. 유효 어드레스가 유효 데이터와 다른 시간에 도달할 수 있기 때문에, 별도의 어드레스 및 데이터 비트들이 사용될 수 있다. 어드레스와 데이터는 모두 저장 명령어가 실행되기 전에 도달한다. 일실시예에서, 데이터는 명령어의 일부로서 포함된다. 회수 필드는 최종 회수 로직(134)이 저장 명령어가 회수되어야 한다는 것을 나타낼 때 셋트되고, 메모리로의 저장이 완료되었다는 확인이 메모리로부터 수신될 때에는 리셋된다. 적재 명령어 및 저장 명령어의 회수에 대해서는 후술한다. 리플레이 카운트 필드는 리플레이 카운트 번호를 포함한다(도13의 DAD 어레이(206A)의 리플레이 카운트 필드와 유사하다). 리플레이 카운트 필드는 필요로 되지 않는다. 일실시예에서, 저장 명령어는 한번에 1회만 리플레이될 수 있으며, 리플레이 카운트 필드는 없다.
도24는 적재 버퍼(182B,...,182Y)를 대표하여 적재 버퍼(182A)의 일실시예를 도시하고 있다. 물론 다양한 실시예가 이용될 수 있다. 적재 버퍼(182A)는 적재 버퍼 엔트리들의 로우에 대한 다양한 필드를 포함한다. 각각의 엔트리는 적재 버퍼 ID(LBID)에 의해 식별된다. 리네임/할당 유닛(150)은 각각의 적재 명령어가 첫 번째로 페치되어 실행되지만 리플레이 상태에 아닌 경우에 그 각각의 적재 명령어에 LBID 엔트리를 할당한다. 적재 명령어는 최종 회수가 이루어질 때까지 동일한 LBID 값을 갖는다. 예를 들어, 도24에서 엔트리 LBID 0는 적재 명령어 0(LOAD 0)에 할당된다. 엔트리 LBID 1은 LOAD 1에 할당된다(LBID 엔트리 번호와 SBID 필드는 MOB ID로 불릴 수 있다). 도24에는 전술한 "적재 SBID" 값을 홀드하는 SBID 필드가 도시되어 있다. 일실시예에서, 명령어 큐 어레이(202A)(도12)의 엔트리가 적재 명령어를 홀드하고 있으면, 명령어 큐 어레이(202A)의 LBID 필드는 적재 명령어를 홀드하는 적재 버퍼(182A) 내의 엔트리를 식별하는 LBID를 홀드하고, SBID 필드는 그 저장 명령어에 대한 적재 SBID(존재하는 경우)를 홀드한다. LBID와 적재 SBID는 파이프라인(108)을 통해 적재 명령어와 동행한다. 일실시예에서, SBID 필드는 적재 버퍼(182A)에 포함되지 않을 수도 있다.
명령어 ID 필드는 명령어 큐 어레이(202A) 내의 적재 명령어의 명령어 ID를 홀드한다. 스레드 버퍼 ID는 적재 버퍼(182A)와 트레이스 버퍼(114A) 모두에 내재된다. OP 코드 필드는 적재 명령어의 OP 코드를 홀드한다. 적재 어드레스 필드는그로부터 적재 명령어가 적재되는 어드레스를 홀드한다. 엔트리 유효 필드는 그 엔트리가 유효 적재 명령어에 의해 점유되어 있다는 것을 나타내는 비트를 포함한다. 도시된 실시예에서, 어드레스는 유효 필드는 포함되지 않는데, 그 이유는 어드레스가 이미 AGU(172)에 의해 생성되었기 때문이다. PRID 필드는 레지스터 파일(152) 내의 적재 명령어들의 목적지를 나타내는 리네임/할당 유닛(150)으로부터의 PRID를 홀드한다. SB 히트(Hit), SBID, 스레드 ID 및 리플레이 카운트 필드(존재하는 경우)는 상태 필드의 일부로서 고려될 수 있으며, 저장 명령어의 실행과 관련하여 전술된 바와 같다.
저장 및 적재 명령어가 처음으로 리네임/할당 유닛(150)에 의해 수신될 때, 저장 및 적재 명령어에 대한 엔트리는 저장 버퍼(184)와 적재 버퍼(182)에서 할당된다. 적재된 값을 수신하기 위한 레지스터에 대한 엔트리는 레지스터 파일(150) 및 ROB(164)에서 할당된다. 이들 저장 및 적재 엔트리는 제1 레벨 회수를 당하지 않으며, 트레이스 버퍼(114) 내의 엔트리처럼 최종 회수가 이루어질 때까지 할당된 상태로 유지된다. 따라서, 엔트리들이 리플레이시에 재할당되지 않는다. 만일 저장 또는 적재 버퍼가 가득 충만되어 있으면, I-캐시(104)로부터의 저장 또는 적재 명령어는 엔트리가 비어 있게 될 때까지 리네임/할당 유닛(150)을 통해 통과되지 않게 된다. 그러나, 트레이스 버퍼로부터 재실행되고 있는 적재 또는 저장 명령어는 리네임/할당 유닛(150)을 통해 통과하게 된다.
2. 적재 및 저장 어드레스의 비교
도5를 참조하면, 프로그램 순서로, 스레드 T1 내의 STORE MX는 LOAD MX가 스레드 T2에서 실행되기 전에 실행된다. 그러나, 동시 실행으로 인해, 시간적 순서로는 STORE MX가 LOAD MX 이전 또는 이후에 실행될 수도 있다. 만일 STORE MX가 시간적 순서로 LOAD MX 이전에 실행되면, LOAD MX의 추론적 실행이 STORE MX에 대해 올바른 순서로 이루어지게 된다. 만일 프로그램 순서로 STORE MX 이전의 모든 명령어들이 회수되었으면, LOAD MX가 메모리 위치 MX로부터 정확한 값을 WRJWO하게 되도록 확신할 수 있다. 정확한 값은 스레드들이 순서적 프로세서에 의해 실행되는 경우에 적재되게 되는 값이다. 만일 프로그램 순서로 STORE MX 이전의 모든 명령어들이 회수되지 않았다면, STORE MX에 대한 데이터가 부정확할 가능성이 항상 존재한다.
이와 달리, 만일 STORE MX가 시간적 순서로 LOAD MX 이후에 실행되면, LOAD MX의 추론적 실행이 STORE MX에 대해 올바른 순서로 이루어지지 않게 되며, LOAD MX가 정확한 값을 적재할 것으로 확신할 수 없다. 메모리 위치 MX에 정확한 값이 존재하게 되는 것은 우연의 일치에 의해서만 가능하다(또는, 저장 버퍼 엔트리의 데이터 필드는 STORE MX가 최종적으로 회수될 때까지 STORE MX를 홀드한다). 궁극적으로 실행의 정확성을 보장하기 위해, MOB(178)는 스레드들 사이의 메모리 데이터 코히어런시(coherency)를 보장하기 위한 다양한 메카니즘을 포함한다.
a. 적재 명령어의 실행
적재 명령어가 실행되기 전에, 어떤 저장 명령어(존재하는 경우)가 가장 가까운 보다 빠른 정합하는 저장 명령어(closest earlier matching store instruction)(CEMSI)인지 판단하기 위해 그 어드레스가 저장 명령어들의 어드레스와 비교가 이루어진다. "정합(matching)"이란 적재 명령어와 동일한 어드레스를 갖는 것을 의미한다. "보다 빠른(earlier)"이란 용어는 프로그램 순서로 적재 명령어보다 더 빠르다는 것을 의미한다. "가장 가까운(closest)"이란 용어는 CEMSI와 실행될 적재 명령어 사이에 다른 정합하는 저장 명령어가 없다는 것을 의미한다. 만일 단지 하나의 보다 빠른 정합하는 저장 명령어만 존재하면, 그것이 CEMSI이다.
만일 CEMSI가 존재하면, 적재 명령어는 CEMSI의 데이터 필드로부터 그 데이터를 판독한다. 만일 CEMSI가 WSHWO하지 않으면, 적재 명령어는 데이터 캐시(176), L2 캐시 또는 메인 메모리와 같은 메모리로부터 그 데이터를 취득한다. 저장 버퍼(184) 또는 메모리로부터의 데이터는 MUX(192)를 통해 통과되어, 스레드 ID 및 명령어 ID에 의해 지정된 트레이스 버퍼(114) 내의 엔트리로 기록된다. 데이터는 또한 PRID에 의해 지정된 레지스터 파일(152) 내의 레지스터로 기록될 수 있다. 또한, 데이터는 캐싱 규칙(caching rules)(예, 라이트백, 일괄기록 등)에 따라 데이터 캐시(176)에 저장될 수 있다. MUX(192)는 바이패스인데, 그 이유는 그것이 데이터 캐시(176), L2 캐시 또는 메인 메모리와 같은 메모리를 바이패스할 수 있기 때문이다.
일실시예에서, 실행될 적재 명령어의 어드레스와 저장 명령어의 어드레스 사이의 비교를 수행하기 위해, 각각의 저장 버퍼(184)의 각각의 엔트리에 서로 다른 비교기가 결합된다. 일례로, 도25의 비교기(320)는 저장 버퍼(184A) 내의 엔트리 SBID 1의 저장 어드레스와 적재 명령어 어드레스를 수신한다. 도선(322)과 다른 비교기로부터의 출력 도선들은 MOB 제어 회로(302)에 접속된다.
적재 SBID는 실행될 적재 명령어에 대해 가장 가까운 보다 빠른 저장 명령어(closest earlier store instruction)(CESI)의 SBID를 나타낸다. CESI는 적재 명령어와 동일한 스레드 ID를 가진 저장 버퍼 내에 있다. 만일 CEMSI가 존재하면, 그것이 CESI가 되거나 또는 프로그램 순서로 CESI 보다 더 빠르게 된다. 리네임/할당 유닛(150)은 프로그램 내의 저장 및 적재 명령어들의 순서를 계속 추적하며, SBID와 LBID 값을 제공한다. 이들 값은 도선(126)을 통해 트레이스 버퍼(14)로 기록될 수 있다. 일실시예에서, 만일 적재 명령어에 대해 CESI가 없으면, 그 명령어와 관련된 적재 SBID도 없다. 이것은 트레이스 내의 첫 번째 메모리 명령어가 적재 명령어인 경우에 일어난다. 이러한 상황을 처리하기 위해, 리네임/할당 유닛(150)이 유효 적재 SBID가 없다는 것을 나타내기 위한 소정의 신호를 전송하는 것을 포함하여 다양한 기술이 사용될 수 있다. 이러한 목적을 위해, 후술되는 어레이 순환 비트(array wrap around bit)가 사용될 수 있다.
다음의 프로그램 순서로 저장 및 적재 명령어들을 고려하자.
STORE 0
STORE 1
LOAD 0
STORE 2
LOAD 1
STORE 3
STORE 4
LOAD 2
LBID 필드 내의 저장 LBID 값은 저장 버퍼(184A)에 예시되어 있다. SBID 필드 내의 적재 SBID 값은 적재 버퍼(182A)에 예시되어 있다. 예를 들어, LBID 엔트리 1의 SBID 필드에 있는 2는 저장 버퍼(184A) 내의 엔트리 SBID 2에 있는 저장 명령어가 LBID 엔트리 1 내의 적재 명령어에 대해 CESI를 홀드하고 있다는 것을 나타낸다. 명령어 STORE 0, STORE 1, STORE 2 및 LOAD 0는 LOAD 1보다 오래된 것, 즉 빠른 것들이다. 명령어 STORE 3, STORE 4 및 LOAD 2는 LOAD 1보다 오래되지 않은 것, 즉 늦은 것들이다.
제어 회로(302)가 어떤 저장 명령어가 CEMSI인지 판단할 수 있는 여러 가지 방법이 있다. 이러한 방법에 대한 예는 도27을 참조하여 설명되며, 여기서 저장 버퍼(184A,184B,184C,184D)는 MOB(178) 내의 전용 저장 버퍼들이며, 각각 스레드 A,B,C,D와 관련되어 있다. 프로그램 순서는 스레드 A, 다음에 스레드 B, 다음에 스레드 C, 다음에 스레드 D라고 가정하자. 본 예에서, 실행될 적재 명령어는 적재 버퍼(182C)에 존재한다. CESI가 존재하고, 이것은 저장 버퍼(184C) 내에 있다.
도선(342,344,346,348)은 다양한 비교기의 출력 도선들이다. 도선(362,364,366,368)은 비교기가 비교를 수행할 수 있도록 하는 제어 신호를 제공한다. 다른 실시예에서, 제어 회로(302)는 (1) 각각의 저장 버퍼 내의 모든 엔트리에 대해 비교기들을 인에이블시키거나, (2) 프로그램 순서로 적재 명령어의 스레드 ID와 동일하거나 더 빠른 스레드 ID를 가진 저장 버퍼에 있는 비교기들만 인에이블시키거나, 또는 (3) 프로그램 순서로 적재 명령어 보다 더 빠른 엔트리와 관련된 비교기들만 인에이블시킨다.
정합 판단 로직(356)은 어떤 저장 명령어(존재하는 경우)가 CEMSI인지 판단한다. 도27에서는, 저장 버퍼(184C)의 상부에 있는 STORE MX 명령어가 CEMSI이다. 만일 이 STORE MX 명령어가 저장 버퍼(184C)에 있지 않으면, CEMSI는 저장 버퍼(184B) 내의 STORE MX 명령어가 되게 된다. 비교기 및 정합 판단 로직(356)이 CEMSI가 존재하는지 여부를 판단하고 있는 동안에, CEMSI가 없는 경우에 준비될 데이터 캐시(176)(및 다른 메모리)에서 조사(lookup)가 이루어질 수 있다. 정합 판단 로직(356)은 MUX(192)가 메모리 또는 저장 버퍼로부터 데이터를 전달할 것인지 여부를 제어하기 위한 신호를 도선(370) 상에 제공하는 데이터 경로 제어 로직(390)을 포함한다.
한 접근방법에서는, MOB 제어 회로(302)에 의해 2가지 우선순위(priority) 판단이 이루어진다. 하나는 저장 버퍼 내의 저장 명령어들의 우선순위를 판단하는 것이 될 수 있다. 다른 하나는 저장 버퍼들의 우선순위를 판단하는 것이 될 수 있다. 이러한 판단은 순서적으로 이루어질 수 있다. 저장 버퍼 내의 우선순위의 판단에는 캐리 체인 구조(carry chain structure)가 사용될 수 있다. 예를 들어, 일실시예에서는 적재 명령어와 동일한 스레드 ID를 가진 것 이외의 각각의 저장 버퍼에 대해, 어떤 정합하는 저장 명령어가 프로그램 순서로 가장 늦은 것인지 판단한다. 적재 명령어와 동일한 스레드 ID를 가진 저장 버퍼에 대해서는, 어떤 정합하는 명령어가 프로그램 순서로 CESI에 가장 가까운지(동일한 것을 포함함) 판단한다. 다음에, 정합하는 명령어를 가진 저장 버퍼 중에서 어느 것이 프로그램 순서로 적재명령어의 스레드 ID에 가장 가까운 것인지 판단이 이루어진다.
저장 버퍼(184)는 헤드 및 테일을 각각 구비한 원형 어레이(circular array)가 될 수 있다. 초기에는, 보다 큰 SBID 값을 가진 저장 명령어들이 보다 늦은 명령어들이다. 그러나, 저장 엔트리가 할당해제되고 할당됨에 따라, 결국 테일이 순환하게 되며, 따라서 헤드가 테일보다 더 높은 SBID 엔트리를 나타내게 된다. 일실시예에서, 순환 비트는 테일이 보다 높은 값으로부터 가장 낮은 SBID 값으로 진행할 때 토글링되며, 가장 가까운 정합 판단 로직(356)으로 제공된다.
b. 저장 명령어의 실행
저장 명령어가 실행될 때에는, 프로그램 순서로 더 늦은(동일하거나 더 새로운 스레드 보다) 어떤 적재 명령어(존재하는 경우)가 그 저장 명령어와 동일한 어드레스를 갖고 있는지 판단하기 위해 그 어드레스가 적재 명령어들의 어드레스와 비교가 이루어진다. 저장 SBID에 의해 지시되는 가장 가까운 보다 늦은 적재 명령어(closest later load instruction)(CLLI)가 고려될 수 있는 가장 빠른 적재 명령어를 나타낸다.
일실시예에서, 이러한 비교를 수행하기 위해 각각의 적재 버퍼(182)의 각각의 엔트리에 서로 다른 비교기가 관련된다. 이들 비교기 중에서 하나의 비교기(324)가 도26에 도시되어 있다. 단지 예로서, 이 비교기(324)는 적재 버퍼(182A)의 엔트리 LBID 1과 관련된다. 이 비교기(324)는 한 입력에서 저장 명령어의 어드레스를 수신하고, 다른 입력에서 적재 버퍼(182A) 내의 엔트리 LBID 1의 적재 어드레스 필드의 어드레스를 수신한다. 출력 도선(326) 상의 신호는 이들 어드레스가 동일한지 여부를 나타낸다. 이 도선(326)과 다른 비교기들로부터의 출력 도선은 MOB 제어 회로(302)에 접속된다. 이들 비교기(예, 비교기 324)는 또한 후술되는 바와 같이, 저장 명령어의 상태 비트를 적재 버퍼 내의 상태 비트와 비교할 수 있다.
도28은 도27과 유사하지만, 도28에서는 적재 버퍼(12A) 내의 적재 명령어 어드레스들이 실행될 저장 명령어의 어드레스와 비교가 이루어지며, 정합 판단 로직(356)은 적재 명령어를 리플레이할 것인지 여부를 판단한다. 일실시예에서, 정합 판단 로직은 어떤 적재 명령어가 리플레이될 것인지를 트레이스 버퍼로 표시해주기 위해 도선(194) 상에 신호를 제공하는 리플레이 트리거링 로직(394)을 포함한다. 일실시예에서, 정합 판단 로직(356)은 CLLI와 함께 시작되는 저장 명령어와 적재 명령어의 정합을 고찰한다. 스레드 관리 로직(124)은 실행되고 있는 저장 명령어의 스레드 ID 보다 프로그램 순서로 더 늦은 스레드 ID를 표시한다. 일실시예에서는, 모든 비교기들이 인에이블된다. 다른 실시예에서는, 프로그램 순서로 적재 명령어의 스레드 ID와 동일하거나 다 늦은 스레드 ID를 가진 적재 버퍼 내의 도선들만 인에이블된다. 또 다른 실시예에서는, CLLI 및 더 늦은 명령어들과 관련된 적재 버퍼 내의 도선들만 인에이블된다. 고려할 스레드는 적재 버퍼 내의 어떤 적재 명령어가 프로그램 순서로 저장 명령어 보다 더 늦게 오는지에 관한 판단을 하기 전후 및 그 동안에 판단이 이루어질 수 있다.
일실시예에서, 적재 명령어의 실행에서의 소정의 추론 에러를 검출하기 위한 검출회로는 적재 버퍼와 관련된 비교기, 정합 판단 로직(356)의 일부 및 관련 제어회로를 포함한다. 다른 실시예에서, 검출회로는 약간 다른 회로를 포함할 수 있다. 실행 파이프라인에서 존재하게 될 추론 에러를 검출하기 위한 검출회로는 필요로 되지 않는다. 데이터 경로 제어 로직 및 리플레이 트리거링 로직과 관련하여 다른 정합 판단 로직도 사용될 수 있다.
i. 어드레스 정합이 존재하는 경우
리플레이할 것인지 여부를 판단하는데 있어, 어드레스 정합이 존재하는 보다 늦은 명령어들에 대한 상태 필드(SB 히트, SBID, 스레드 ID, 리플레이 카운트(사용되는 경우))가 고려된다. 이 상태 필드는 적재 명령어가 메모리(예, 데이터 캐시 176) 또는 저장 버퍼의 데이터 필드로부터 그 데이터를 취득했는지 여부를 나타낸다. SB 히트 필드는 예를 들어, 데이터가 메모리로부터 온 경우에는 0을 갖고, 데이터가 저장 버퍼로부터 온 경우에는 1을 갖는다. SBID 및 스레드 ID 필드는 그로부터 데이터가 오는 저장 명령어의 SBID 및 스레드 ID를 홀드한다. 저장 명령어의 스레드 ID가 반드시 어드레스 정합이 존재하는 적재 명령어의 스레드 ID인 것은 아니다. 적재 명령어의 스레드 ID는 적재 버퍼에 내재된다. 리플레이 카운트 필드(사용되는 경우)는 어떤 리플레이가 수반되는지를 나타낸다(만일 SB 히트가 0이면, SBID, 스레드 ID 및 리플레이 카운트 필드는 의미가 없다).
만일 SB 히트가 0이면(이전의 데이터가 메모리로부터 온 것이면), 적재 버퍼로부터 도선(194)을 통해 적재 명령어 스레드 ID에 의해 식별된 트레이스 버퍼로 리플레이 이벤트가 신호되고, 그 적재 명령어 및 모든 종속 명령어들이 트레이스 버퍼로부터 리플레이된다. 명령어 ID 및 스레드 ID는 어떤 명령어가 리플레이되는지를 나타내기 위해 도선(194)을 통해 전달된다.
만일 SB 히트가 1이면(이전의 데이터가 저장 버퍼로부터 온 것이면), SBID 필드, 스레드 ID 필드 및 리플레이 카운트 필드(사용되는 경우) 내의 값들은 리플레이가 트리거될 것인지 여부를 제어한다. 첫 번째 경우에, 특정 적재 명령어에 대한 상태 필드의 스레드 ID는 저장 명령어의 스레드 ID와 동일하고, 특정 적재 명령어의 상태 필드 내의 SBID는 저장 명령어의 SBID와 정합한다. 이러한 첫 번째 경우에, 만일 저장 명령어의 리플레이 카운트가 상태 필드 내의 리플레이 카운트 보다 더 크면 그 적재 명령어는 리플레이된다. 만일 리플레이 카운트가 존재하지 않으면(저장 명령어는 한번에 1회만 리플레이될 수 있기 때문임), 적재 명령어가 리플레이된다.
두 번째 경우에, 상태 필드 내의 스레드 ID는 저장 명령어의 스레드 ID와 동일하지만, 상태 필드 내의 SBID는 저장 명령어의 SBID와 정합하지 않는다. 이 두 번째 경우에는, 만일 상태 필드 내의 SBID가 저장 명령어의 SBID 보다 더 작으면 그 적재 명령어가 리플레이되고, 만일 상태 필드 내의 SBID가 저장 명령어의 SBID 보다 더 크면 리플레이되지 않는다.
세 번째 경우에는, 상태 필드와 저장 명령어의 스레드 ID들이 정합하지 않는다. 이것은 좀처럼 드문 경우로 예상된다. 간략성을 위해, 일실시예에서는 (비록 프로그램 순서와는 정반대일 수도 있지만) 적재 명령어가 리플레이된다. 이것은 잘못된 리플레이가 될 수도 있다. 리플레이될 때 적재 명령어는 정확한 저장 데이터를 수신하게 된다. 다른 접근방법도 사용될 수 있지만, 이들은 드문 경우에 정당화되는 훨씬 더 복잡한 구조로 이루어질 수 있다.
ii. 어드레스 정합이 존재하지 않는 경우
만일 어드레스들이 정합하지 않으면, 다음의 드문 경우를 제외하고는 리플레이가 트리거되지 않는다. 만일 SB 히트가 1이면, 상태 필드의 스레드 ID는 저장 명령어의 스레드 ID와 정합하고, 상태 필드의 SBID는 저장 명령어의 SBID와 정합한다. 이 경우에, 리플레이가 존재하며, 리플레이되는 적재 명령어는 새로운 엔트리 또는 메모리로부터 그 데이터를 수신한다.
c. 리셋
스레드가 프로그램 순서로 되어 있지 않은 경우에 그 스레드는 리셋된다. 그러나, 다른 스레드로부터의 적재 명령어가 그 스레드 내의 저장 명령어와 관련된 데이터 필드로부터 데이터를 취득했을 수도 있다. 스레드 관리 로직(124)은 제어 회로(302)로 신호를 전송한다. 일실시예에서, 스레드가 리셋되면, 그 리셋된 스레드의 스레드 ID가 모든 적재 버퍼 내의 모든 적재 명령어와 비교가 이루어진다(그 리셋된 스레드에 대응하는 적재 버퍼는 제외될 수 있음). 상태 필드 내의 스레드 ID가 리셋된 스레드의 스레드 ID와 정합하는 경우에 적재 명령어에 대해 리플레이가 트리거된다. 이 적재 명령어는 적절한 트레이스 버퍼로부터 리플레이된다.
3. 저장 명령어의 리플레이
전술한 바와 같이, 적재 명령어들은 저장 명령어의 실행에 응답하여 리플레이된다. 일실시예에서, 저장 명령어들은 레지스터 값이 변경되었다는 것을 나타내는 트레이스 버퍼에서의 레지스터 비교에 응답하여 리플레이된다. 예를 들어, 도12및 도13을 참조하면, 저장 명령어인 트레이스 버퍼(114A) 내의 명령어 ID 4 및 5는 레지스터 R1-R4에 의존하는 것으로 도시되어 있다.
4. 복수의 적재 명령어의 리플레이
적재 버퍼 내의 하나 이상의 적재 명령어가 저장 명령어와 정합하는 상태 필드를 갖게 되는 것도 가능하다. 복잡한 로직을 피하기 위해, 한가지 접근방법은 제어 회로(302)가 복수의 적재 어드레스 정합이 존재하는 때를 검출하고, 트레이스 내의 가장 빠른 적재 명령어 이후의 모든 명령어들이 재실행되도록 하는 것이다.
5. 적재 및 저장 명령어의 최종 회수
적재 또는 저장 명령어가 최종적으로 회수될 예정인 경우에, 최종 회수 로직(134)은 그 명령어가 최종적으로 회수될 것이라는 것을 나타내는 신호를 트레이스 버퍼(114) 및 MOB(184)로 제공한다. 다음에, (명령어 ID 및 스레드 ID에 의해 식별된) 트레이스 버퍼 내의 엔트리가 할당해제된다. 적재 명령어의 경우에, (스레드 ID 및 LBID에 의해 식별된) 적재 버퍼 내의 엔트리가 할당해제된다. 적재 명령어의 경우에 최종 회수가 완료된다. 저장 명령어의 경우에는, 할당해제 이전에 데이터 필드 내의 데이터가 메모리로 위탁되어야 한다. 저장 버퍼 내의 엔트리의 할당 해제와 최종 회수는 저장 명령어가 완료되었다는 확인이 수신될 때까지는 이루어지지 않는다. 이와 달리, 엔트리는 확인 이전에 최종적으로 회수될 수 있지만, 그 엔트리의 재할당은 확인이 수신될 때까지 이루어질 수 없다. 도선(200) 상의 신호는 저장 명령어의 최종 회수가 완료되어 다음 스레드가 시작될 수 있다는 것을 스레드 관리 로직(124)에 표시해줄 수 있다.
SB 회수(SB retired) 필드는 명령어가 회수되었다는 것을 나타낸다. 최종 회수 로직(134)이 명령어가 회수되어야 한다는 것을 나타내면, SB 회수 필드 내의 비트가 표명된다(asserted). 일단 SB 회수 필드가 표명되면, 관련 명령어들이 순서적으로 메모리로 기록된다. 명령어가 메모리로 기록되었다는 것을 MOB(184A)가 학습하자마자, SB 회수 필드는 표명해제되고, 명령어는 할당해제된다.
적재 버퍼(182A)와 저장 버퍼(184A)는 헤드 및 테일을 가진 큐(queues)가 될 수 있다. 헤드는 명령어가 할당해제될 때 이동한다. 적재 버퍼(184A)와 트레이스 버퍼(114)에서, 회수와 할당해제는 동시에 이루어질 수 있다. 최종 회수 로직(134)은 도선(136,140)을 통해 신호를 제공한다. 디멀티플렉서(DEMUX)(188)는 적재 버퍼(182)가 회수 신호를 수신하게 되는지 또는 저장 버퍼(184)가 회수 신호를 수신하게 되는지를 선택한다. DEMUX(188)는 선택사양이며, 적재 버퍼(182) 및 저장 버퍼(184) 내의 인에이블 포트로 대체될 수 있다.
F. 스레드 관리 로직 및 최종 회수 로직에 관한 추가 정보
일실시예에서, 스레드 관리 로직(124)은 스레드 순서를 계속 추적하기 위해 트리 구조를 이용한다. 트리 구조에서, 프로그램 순서(회수 순서도 됨)는 상부로부터 하부로 흐르며, 우측 상의 노드가 프로그램 순서로 좌측 상의 노드 보다 더 빠르다. 루트(root)는 프로그램 순서로 첫 번째이다. 트리는 추상적 개념이지만, 트리 구조는 그 트리를 구현하는 회로이다.
스레드는 역방향 분기 또는 함수 호출 다음에 오는 명령어에서 시작된다.즉, 스레드는 (도4 및 도5의 스레드 T2에 의해 도시된 바와 같이) 역방향 분기가 이루어지지 않고 함수가 호출되지 않은 것으로 가정하여 다음 명령어에서 시작된다. 이렇게 하는데 있어서, 스레드(노드)의 견지에서, 스레드의 차일드 노드들의 프로그램 순서는 스레드가 시작된(생성된) 순서의 반대로 이루어진다. 예를 들어, 도6에서, 시간적 순서로는 스레드 T2의 실행이 스레드 T3의 실행 이전에 시작되지만, 프로그램 순서로는 스레드 T3가 스레드 T2 이전에 발생한다.
일실시예에서, 트리로부터 스레드가 제거되도록 하는 3개의 이벤트가 존재할 수 있다. 즉, (1) 스레드가 회수될 때 트리의 루트에 있는 스레드가 제거된다. 루트에 있는 스레드가 회수되면, 프로그램 순서로 그 다음에 있는 스레드(노드)가 루트가 되고, 그에 따라 노드들이 재할당된다. (2) 프로그램 순서로 마지막이 되는 스레드는 트리에 추가될 프로그램 순서가 더 높은 스레드를 위한 공간을 만들기 위해 트리로부터 제거된다. (3) 그 패런트 스레드의 프로그램 카운터가 시작 카운트와 종료 카운트 사이의 범위 밖에 있는 것으로 발견될 때, 스레드가 리셋되고, 그것에 의해 트리로부터 제거될 수 있다. 차일드 스레드가 역방향 분기에서 생성되는 경우에(예, 도6 및 도29의 스레드 T4), 시작 카운트는 역방향 분기의 타겟(target)이 되고, 종료 카운트는 역방향 분기 명령어에서의 프로그램 카운터 값이 된다. 함수 호출 이후에 시작된 스레드도 역시 리셋될 수 있는데, 그 이유는 그 함수로부터의 리턴이 없기 때문이며, 이러한 현상은 매우 드물게 일어난다. 함수로부터의 리턴이 없게 되는 가능성을 처리하기 위한 한가지 방법은 그 가능성을 무시하고, 시스템으로 하여금 이벤트 (2)에서와 같이 프로그램 순서로 가장 낮게 될 때 그 스레드를 트리로부터 결국 제거하도록 하는 것이다. 스레드가 트리로부터 제거되면, 그 스레드에 할당된 자원(예, 트레이스 버퍼, 저장 버퍼, 적재 버퍼)도 할당해제된다.
이벤트 (1) 및 (3)은 도29에 도시되어 있으며, 여기에는 스레드 T5 및 T6와 함께 도6에 도시된 예의 스레드들을 포함하고 있다. 스레드 T5는 포인트 J에서 역방향 분기 명령어 다음에 시작되고, 스레드 T6는 포인트 K에서 함수 호출 다음에 시작된다. 도30은 시간 t1에서의 트리 구조를 도시하고 있다. 스레드 T3가 트리에 추가되기 전에 스레드 T2가 트리에 추가된다. 스레드 T4는 스레드 T3가 트리에 추가된 이후에 트리에 추가된다. 스레드 T2와 스레드 T3는 스레드 T1의 차일드이다. 스레드 T4는 스레드 T3의 차일드이다. 상부로부터 하부 그리고 우측으로부터 좌측으로 진행되는 규칙에 따라, 프로그램 순서 및 회수 순서는 스레드 T1, T3, T4, T2이다. 도31은 스레드 T4가 스레드 T1이 회수되기 전에 리셋된 것을 가정하여 시간 T2에서의 트리 구조를 도시하고 있다. 프로그램 순서 및 회수 순서는 스레드 T1, T3, T2, T5이다. 도32는 스레드 T1이 스레드 T4가 리셋되기 전에 회수되는 것을 가정하여 시간 t2에서의 트리 구조를 도시하고 있다. 프로그램 순서 및 회수 순서는 스레드 T3, T4, T2, T5이다. 도33은 스레드 T1이 회수되고 스레드 T4가 리셋된 이후의 시간 t3에서의 트리 구조를 도시하고 있다. 프로그램 순서 및 회수 순서는 스레드 T3, T2, T5, T6이다.
이벤트 (2)는 도34에 도시되어 있으며, 여기에는 내포된 함수(nested function)가 포함되어 있다. 시간적 순서로, 스레드는 T1, T2, T3, T4, T5의 순서로 생성(시작)된다. 그러나, 프로그램 순서는 T1, T5, T4, T3, T2이다. 이 예에서는, 오직 4개의 트레이스 버퍼만 존재한다. 도35는 스레드 T5가 시작되기 전의 시간 t1에서의 트리 구조를 도시하고 있다. 프로그램 및 회수 순서는 T1, T4, T3, T2이다. 스레드 T5는 아직 트리 구조의 일부가 아니다. 도36은 스레드 T5가 시작된 이후의 시간 t2에서의 트리 구조를 도시하고 있다. 프로그램 순서로 가장 낮은 스레드 T2는 스레드 T5를 위한 공간을 만들기 위해 트리 구조로부터 제거되었다. 트리로부터 제거된 스레드는 나중에 재시작될 수 있다. 이와 달리, 다른 스레드가 트리로부터 제거된 스레드의 명령어들의 전부 또는 일부를 실행할 수도 있다. 일실시예에서, 리셋의 경우에 하나의 스레드가 그 리셋 스레드 아니라 다음에 오는 스레드와 합류(join)하려고 시도할 수 있다. 대안으로, 스레드가 종료될 때까지 계속될 수도 있다. 어레이(198)의 함수는 트리의 노드에서 수행될 수 있다.
차일드 스레드의 스레드 ID는 트리 구조에서 프로그램 순서에 따라 적절하게 배치된다. (스레드 관리 로직(124)에 의해 결정되는 바와 같은 프로그램 순서는 변경될 수도 있다.) 스레드는 그것이 프로그램 순서로 트리 내의 다음 스레드의 프로그램 카운터에 합류 또는 정합하는 경우에 종료된다. 만일 스레드의 오직 하나의 차일드만 존재하면, 그것은 프로그램 순서로 다음 스레드가 된다. 예를 들어, 도33에서 스레드 T2는 프로그램 순서로 트리에서 다음 스레드이다.
최종 회수 로직(134)은 어레이(198)를 조립(assemble)하기 위해 트리 구조로부터 정보를 얻거나 또는 트리 구조의 회로로부터 직접 정보를 얻는다. 스레드 관리 로직(124)의 트리 구조 및 다른 로직과 최종 회수 로직(134)의 로직 사이에 디코딩 회로가 존재할 수 있다. 어레이(198)는 필요로 되지 않을 수도 있다.
요약하면, 트리 구조는 적어도 다음의 목적을 위해 정보를 제공한다. (1) 트리는 회수 순서를 명시한다. (2) 트리는 예를 들어, 전술한 바와 같이 MOB(178)에 의해 이용되는 프로그램 순서를 명시한다. (3) 트리 구조는 다른 스레드의 시작되는 명령어를 나타냄으로써 스레드의 종료 포인트를 명시한다. (4) 트리 구조는 어떤 자원이 이용가능하고 어떤 자원이 할당해제되었는지를 나타냄으로써 스레드 자원 할당에 이용된다.
G. 멀티스레딩이 없는 실시예
도3은 파이프라인(308)을 포함하는 프로세서(100)를 도시하고 있다. 이 프로세서(100)는 프로세서(50)와 유사하다. 그러나, 트레이스 버퍼(300)가 전용 트레이스 버퍼이고, MOB(310)가 전용 MOB이다. 프로세서(100)는 복수의 스레드를 처리하도록 설계되지 않았다. 그러므로, 스레드 관리 로직은 프로세서(100)에는 필요로 되지 않는다. 트레이스 버퍼(300)는 예를 들어, 멀티스레드 특유의 구성요소가 필요로 되지 않는다는 것을 제외하고는 트레이스 버퍼(114A)와 유사할 수 있다. 예를 들어, 도선(216)과 출력 레지스터 파일(210)이 필요로 되지 않는다. 추론 에러를 검출하기 위해 잘 알려져 있는 회로를 포함하여 다양한 회로가 이용될 수 있다. MOB(310)는 예를 들어, 멀티스레드 특유의 기능이 필요로 되지 않는다는 것을 제외하고는 MOB(178A)와 유사할 수 있다. 예를 들어, 적재 버퍼에는 스레드 ID 필드가 필요로 되지 않게 된다. 프로세서(100)의 다른 구성요소는 멀티스레딩 관련 기능들을 제거하기 위해 프로세서(50)의 구성에 대해 약간 변경될 수 있다. 트레이스 버퍼(300) 및 MOB(310)는 다양한 추론 및 에러로부터의 복구와 관련하여 이용될 수 있다. 트레이스 버퍼는 많은 수의 명령어들이 최종 회수 이전에 가능한 리플레이를 위해 파이프라인 외부에서 홀드되도록 허용한다.
프로세서(50)도 비-멀티스레드 프로그램과 관련하여 이용될 수 있다. 이 경우에, 스레드 관리 로직(124)은 항상 프로그램 순서로 동일한 스레드 ID를 유지할 수 있다. 대안으로, 스레드 관리 로직(124)이 디스에이블될 수 있다. 비-멀티스레드 방식의 경우에, 오직 하나의 트레이스 버퍼(114)와 오직 하나의 MOB(178)만이 이용된다. 대안으로, 트레이스 버퍼들이 더욱 큰 트레이스 버퍼를 만들기 위해 조합될 수 있고, MOB들이 더욱 큰 MOB를 만들기 위해 조합될 수 있다.
H. 추가 정보 및 실시예
도37을 참조하면, 프로세서(400)는 멀티-파이프라인 유닛(402)을 포함하는 멀티-프로세서(MP) 칩이다. 멀티-파이프라인 유닛(400)은 전체 파이프라인(예, 각각의 파이프라인에 대한 별도의 리네임/할당 유닛)이 멀티-파이프라인(402)의 각각의 파이프라인 0,1,...,W와 함께 포함된다는 점에서 도2의 공유 자원 파이프라인(108)과 상이하다(W는 X와 동일하거나, 크거나 또는 작을 수 있다). 그렇지 않으면, 프로세서(400)는 근본적으로 프로세서(50)와 동일하거나 또는 매우 다를 수 있다. 다른 프로세서들도 멀티-파이프라인 유닛(402)의 일부 기능과 파이프라인(108)의 일부 기능을 포함할 수 있다.
전술한 각각의 프로세서는 다양한 컴퓨터 시스템의 일부로서 포함될 수 있다. 도38을 참조하면, 단지 예로서, 프로세서(50)는 컴퓨터 시스템(430)의 일부가 될 수 있다. 이 시스템(430)은 또한 제2 프로세서(434)를 포함할 수 있다. 온-칩 제2 레벨(L2) 캐시가 프로세서(50)에 포함될 수 있다. 이 프로세서(50)는 프로세서 버스(442)를 통해 메모리 제어기(440)와 통신할 수 있다. 메모리 제어기(440)는 버스(452,454)를 통해 메인 메모리(446) 및 주변기기(448)와 통신할 수 있다.
파이프라인(108 또는 308)(도2 및 도3)과 유사한 파이프라인이 레지스터 리네이밍을 이용하지 않는 프로세서에 이용될 수 있다. 이러한 경우에, 레지스터 리네이밍에 포함된 구성요소(예, 리네임/할당 유닛 150)들은 리네이밍 관련 기능들을 제거하도록 변경될 수 있다. 전술한 회로 및 세부사항들은 단지 예시적인 것이며, 그 위치에 다양한 다른 회로 및 세부사항이 이용될 수 있다. 또한, 크기, 대기시간 등에 있어서 다양한 설계 절충이 이루어질 수 있다. 예를 들어, 실행 경로(예, 예약 스테이션, 레지스터 파일, ROB) 내의 버퍼들이 너무 큰 경우에 최대 동작 클록 주파수가 감소되어야 할 수도 있다. 여기에 예시된 구성요소들은 다양한 기술에 대응하여 설계 및 구성될 수 있다.
2개의 예시된 구조체들 사이에 중간 구조체(예, 버퍼) 또는 신호가 존재할 수 있다. 일부의 도선들은 도시된 바와 같이 연속되지 않을 수도 있으며, 중간 구조체에 의해 나누어질 수도 있다. 도면에서 박스의 경계선들도 예시 목적을 위한 것이다. 실제적인 장치는 이렇게 정의된 경계를 가진 구성요소들을 포함하지 않을 수 있다. 예시된 구성요소들의 상대적인 크기는 실제적인 장치 크기를 의미하는 것이 아니다. 화살표는 몇몇 실시예에서 소정의 데이터 흐름을 나타내는 것이지만,예를 들어, 데이터 요구와 같이 모든 신호에 대해 그런 것은 아니다. 전술한 논리 하이(HIGH) 신호의 경우에, 논리 로우(LOW) 신호로 대체될 수 있으며, 그 역으로도 가능하다.
프로세서에 도시된 구성요소들은 모두 동일한 프로세서 칩에 위치할 수 있으며, 대안으로, 예를 들어 트레이스 버퍼는 실행 파이프라인과 다른 칩 상에 위치될 수 있다.
용어 "접속", "결합" 및 관련 용어는 직접 접속 또는 직접 결합에 한정되는 것이 아니며, 간접 접속이나 간접 결합도 포함할 수 있다. 용어 "응답" 및 관련 용어는 한 신호 또는 이벤트가 어느 정도 다른 신호에 의해 영향을 받는다는 것을 의미하며, 반드시 전적으로 또는 직접적으로 그렇다는 것은 아니다. 만일 명세서에 어떤 구성요소가 "할 수 있다", "할 수도 있다, 또는 "포함되는 것이 바람직하다" 등이 기술되어 있으면, 그 특정 구성요소가 꼭 포함될 필요가 있는 것은 아니다.
MOB는 잘못된 추론을 검출하기 위해 어드레스 정합이 아닌 데이터 정합을 이용할 수도 있다.
이 기술분야에 통상의 지식을 가진 자는 본 발명의 범위 내에서 전술한 설명 및 도면에 대해 다양한 변경이 이루어질 수도 있다는 것을 이해할 것이다. 따라서, 다음의 청구범위는 본 발명의 범위를 정의하는 어떠한 보정안도 포함하는 것이다.

Claims (26)

  1. 프로그램의 명령어들을 실행하기 위한 실행 파이프라인 - 여기서, 상기 명령어들의 적어도 일부는 추론적으로 실행됨 - ; 및
    상기 실행 파이프라인 외부에 있으며, 추론적으로 실행된 명령어들의 적어도 일부를 포함하여 상기 명령어들의 적어도 일부를 홀드하고, 상기 추론적으로 실행된 명령어들의 적어도 일부를 포함하여 상기 명령어들의 적어도 일부의 결과를 홀드하기 위한 트레이스 버퍼
    를 포함하고,
    여기서, 상기 트레이스 버퍼에서 홀드되는 상기 명령어들의 적어도 일부는 추론 에러와 관련되고, 상기 프로그램의 실행의 일부로서 상기 트레이스 버퍼로부터 상기 실행 파이프라인에서 재실행되는
    프로세서.
  2. 제 1 항에 있어서,
    상기 명령어들의 적어도 일부는 상기 실행 파이프라인에서의 그 실행의 종결시 초기 회수를 당하지만, 이들 명령어들은 최종 회수가 이루어질 때까지 트레이스 버퍼에서 유지되는
    프로세서.
  3. 제 1 항에 있어서,
    최종적으로 회수될 명령어들을 홀드하고 있는 상기 트레이스 버퍼 내의 엔트리를 할당해제하도록 상기 트레이스 버퍼에 신호하기 위한 최종 회수 로직
    을 더 포함하는 프로세서.
  4. 제 1 항에 있어서,
    상기 실행 파이프라인은 공유 자원 멀티스레딩에 이용될 수 있는
    프로세서.
  5. 제 1 항에 있어서,
    상기 트레이스 버퍼는 제1 트레이스 버퍼이고, 상기 프로세서는 추가적인 트레이스 버퍼들을 더 포함하고, 상기 제1 및 추가적인 트레이스 버퍼들은 상이한 스레드로부터의 트레이스를 홀드하는
    프로세서.
  6. 제 1 항에 있어서,
    상기 실행 유닛은 레지스터 리네임 유닛을 포함하고, 상기 트레이스 버퍼는 리플레이되는 명령어와 동행하는 제어 비트를 제공하는
    프로세서.
  7. 제 6 항에 있어서,
    리플레이 되는 명령어와 상기 제어 비트의 상태에 따라, 상기 레지스터 리네임 유닛은 상기 명령어와 관련된 레지스터의 리네이밍을 바이패스하는
    프로세서.
  8. 제 6 항에 있어서,
    리플레이되는 명령어와 상기 제어 비트의 상태에 따라, 상기 레지스터 리네임 유닛은 (1) 레지스터 리네이밍을 수행하거나, (2) 리네이밍을 바이패스하고, 대신에 상기 트레이스 버퍼로부터의 물리적 레지스터 식별 번호를 이용하거나, 또는 (3) 상기 트레이스 버퍼로부터의 값을 상수로서 이용하는
    프로세서.
  9. 제 1 항에 있어서,
    디코더를 더 포함하고,
    상기 실행 파이프라인과 상기 트레이스 버퍼는 상기 디코더로부터 명령어를 동시에 수신하는
    프로세서.
  10. 제 1 항에 있어서,
    캐시 및 디코더를 더 포함하고,
    상기 캐시는 상기 디코더로부터 명령어를 수신하고, 상기 실행 파이프라인과 상기 트레이스 버퍼는 상기 캐시로부터 명령어를 동시에 수신하는
    프로세서.
  11. 제 1 항에 있어서,
    추론 에러와 관련된 명령어들은 상기 트레이스 버퍼로부터 상기 실행 파이프라인에서 리플레이되고, 재실행은 리플레이의 일부인
    프로세서.
  12. 제 1 항에 있어서,
    상기 프로세서는 컴퓨터 시스템 내에 있는
    프로세서.
  13. 명령어들을 실행하기 위한 실행 파이프라인 - 여기서, 상기 명령어들의 적어도 일부는 추론적으로 실행됨 - ; 및
    상기 실행 파이프라인 외부에 있으며, 추론적으로 실행된 명령어들의 적어도 일부를 포함하여 상기 명령어들의 적어도 일부를 홀드하고, 상기 추론적으로 실행된 명령어들의 적어도 일부를 포함하여 상기 명령어들의 적어도 일부의 실행 결과를 홀드하기 위한 트레이스 버퍼
    를 포함하고,
    여기서, 상기 명령어들의 적어도 일부는 상기 실행 파이프라인에서의 실행 다음에 초기 회수를 당하지만, 최종 회수가 이루어질 때까지 트레이스 버퍼에서 유지되는
    프로세서.
  14. 제 13 항에 있어서,
    상기 명령어들의 실행에서의 추론 에러를 검출하기 위한 검출회로
    를 더 포함하는 프로세서.
  15. 제 13 항에 있어서,
    상기 검출회로의 적어도 일부는 상기 트레이스 버퍼 내에 포함된
    프로세서.
  16. 제 13 항에 있어서,
    상기 명령어들의 실행에서의 추론 에러를 검출하기 위한 검출회로 및 상기 추론 에러와 관련된 명령어들의 적어도 일부의 리플레이를 트리거시키기 위한 리플레이 트리거링 로직
    을 더 포함하는 프로세서.
  17. 제 13 항에 있어서,
    상기 트레이스 버퍼는 스레드들의 트레이스를 홀드하기 위해 상기 실행 파이프라인의 외부에 있는 복수의 트레이스 버퍼 중 하나이고, 상기 실행 파이프라인은 상기 스레드들의 적어도 일부를 동시에 실행하는
    프로세서.
  18. 제 13 항에 있어서,
    최종 회수 로직을 더 포함하고, 상기 트레이스 버퍼 내의 명령어들은 상기 최종 회수 로직의 제어 하에 최종적으로 회수되며, 상기 명령어의 일부는 상기 실행 파이프라인에서의 실행 다음에 초기 회수될 수 있는
    프로세서.
  19. 제 13 항에 있어서,
    상기 트레이스 버퍼는 명령어 큐 어레이를 포함하는
    프로세서.
  20. 제 13 항에 있어서,
    디코더를 더 포함하고, 상기 실행 파이프라인과 상기 트레이스 버퍼는 상기 디코더로부터 명령어를 동시에 수신하는
    프로세서.
  21. 프로그램의 명령어들을 실행하기 위한 실행 파이프라인 - 여기서, 상기 명령어들의 적어도 일부는 추론적으로 실행됨 - ; 및
    상기 실행 파이프라인 외부에 있으며 상기 명령어들을 홀드하기 위한 트레이스 버퍼
    를 포함하고,
    상기 명령어들은 검출된 추론 에러에 응답하여 상기 트레이스 버퍼로부터 재실행될 수 있으며, 상기 명령어들은 그들이 올바르게 실행되었다고 보장되거나 또는 상기 프로그램의 일부로서 실행될 것이 아니라고 보장될 때까지 상기 트레이스 버퍼에서 유지되는
    프로세서.
  22. 제 21 항에 있어서,
    추론 에러와 관련된 명령어들은 상기 트레이스 버퍼로부터 상기 실행 파이프라인에서 리플레이되고, 재실행은 리플레이의 일부인
    프로세서.
  23. 상이한 스레드들의 적어도 일부를 동시에 실행하기 위한 실행 파이프라인; 및
    상기 실행 파이프라인 외부에 있으며, 상기 스레드들중 하나의 스레드의 명령어들을 각각 홀드하기 위한 트레이스 버퍼들
    을 포함하고,
    상기 각각의 트레이스 버퍼는 상기 스레드들중 관련된 하나의 스레드의 레지스터 내용을 홀드하기 위한 출력 레지스터 파일과 프로그램 순서로 바로 앞에 선행하는 스레드의 레지스터 내용을 수신하기 위한 입력 레지스터 파일을 포함하는
    프로세서.
  24. 제 23 항에 있어서,
    상기 트레이스 버퍼들은 상기 출력 레지스터 파일중 하나의 내용을 상기 입력 레지스터 파일 중 하나의 내용과 비교하기 위한 비교 회로를 포함하는
    프로세서.
  25. 제 24 항에 있어서,
    상기 비교는 단지 상기 스레드들중 선행하는 스레드의 회수 종료시에만 이루어지는
    프로세서.
  26. 실행 파이프라인 외부에 있으며 명령어들을 홀드하기 위한 트레이스 버퍼; 및
    적어도 일부의 명령어들을 실행하기 위한 실행 파이프라인 - 상기 실행된 명령어들의 적어도 일부는 추론적으로 실행됨 -
    을 포함하고,
    상기 트레이스 버퍼는 상기 명령어의 소스로부터 상기 실행 파이프라인까지 분리되고, 상기 트레이스 버퍼내에 홀드되는 상기 명령어들의 적어도 일부는 추론 에러와 관련되고, 상기 트레이스 버퍼로부터 상기 실행 파이프라인에서 재실행되는
    프로세서.
KR10-2000-7006657A 1997-12-16 1998-12-11 오예측 이후에 재실행될 수 있는 명령어를 홀드하기 위한 파이프라인 외부의 트레이스 버퍼 KR100382126B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US08/991,269 1997-12-16
US08/991,269 US6240509B1 (en) 1997-12-16 1997-12-16 Out-of-pipeline trace buffer for holding instructions that may be re-executed following misspeculation

Publications (2)

Publication Number Publication Date
KR20010024750A KR20010024750A (ko) 2001-03-26
KR100382126B1 true KR100382126B1 (ko) 2003-05-09

Family

ID=25537042

Family Applications (1)

Application Number Title Priority Date Filing Date
KR10-2000-7006657A KR100382126B1 (ko) 1997-12-16 1998-12-11 오예측 이후에 재실행될 수 있는 명령어를 홀드하기 위한 파이프라인 외부의 트레이스 버퍼

Country Status (11)

Country Link
US (1) US6240509B1 (ko)
EP (1) EP1040421B1 (ko)
JP (1) JP3971893B2 (ko)
KR (1) KR100382126B1 (ko)
CN (1) CN100342349C (ko)
AU (1) AU1911099A (ko)
BR (1) BR9814290A (ko)
DE (1) DE69829778T2 (ko)
HK (1) HK1029194A1 (ko)
TW (1) TW388811B (ko)
WO (1) WO1999031589A1 (ko)

Families Citing this family (47)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6212626B1 (en) * 1996-11-13 2001-04-03 Intel Corporation Computer processor having a checker
US6463522B1 (en) * 1997-12-16 2002-10-08 Intel Corporation Memory system for ordering load and store instructions in a processor that performs multithread execution
US6772324B2 (en) 1997-12-17 2004-08-03 Intel Corporation Processor having multiple program counters and trace buffers outside an execution pipeline
US6412067B1 (en) 1998-08-11 2002-06-25 Intel Corporation Backing out of a processor architectural state
SE9901145D0 (sv) * 1998-11-16 1999-03-29 Ericsson Telefon Ab L M A processing system and method
WO2000029942A1 (en) * 1998-11-16 2000-05-25 Telefonaktiebolaget Lm Ericsson Concurrent processing for event-based systems
SE9902373D0 (sv) * 1998-11-16 1999-06-22 Ericsson Telefon Ab L M A processing system and method
SE9803901D0 (sv) * 1998-11-16 1998-11-16 Ericsson Telefon Ab L M a device for a service network
SE9901146D0 (sv) 1998-11-16 1999-03-29 Ericsson Telefon Ab L M A processing system and method
US6571359B1 (en) * 1999-12-13 2003-05-27 Intel Corporation Systems and methods for testing processors
US6658554B1 (en) * 1999-03-09 2003-12-02 Wisconsin Alumni Res Found Electronic processor providing direct data transfer between linked data consuming instructions
EP1050807A1 (en) * 1999-05-03 2000-11-08 Sgs Thomson Microelectronics Sa Memory access in a computer memory
US6463526B1 (en) * 1999-06-07 2002-10-08 Sun Microsystems, Inc. Supporting multi-dimensional space-time computing through object versioning
US7100027B1 (en) * 1999-12-13 2006-08-29 Intel Corporation System and method for reproducing system executions using a replay handler
US6892380B2 (en) * 1999-12-30 2005-05-10 Texas Instruments Incorporated Method for software pipelining of irregular conditional control loops
US6643767B1 (en) * 2000-01-27 2003-11-04 Kabushiki Kaisha Toshiba Instruction scheduling system of a processor
US6609247B1 (en) * 2000-02-18 2003-08-19 Hewlett-Packard Development Company Method and apparatus for re-creating the trace of an emulated instruction set when executed on hardware native to a different instruction set field
US6931641B1 (en) 2000-04-04 2005-08-16 International Business Machines Corporation Controller for multiple instruction thread processors
US6880069B1 (en) * 2000-06-30 2005-04-12 Intel Corporation Replay instruction morphing
US6877086B1 (en) * 2000-11-02 2005-04-05 Intel Corporation Method and apparatus for rescheduling multiple micro-operations in a processor using a replay queue and a counter
US6981129B1 (en) 2000-11-02 2005-12-27 Intel Corporation Breaking replay dependency loops in a processor using a rescheduled replay queue
US7207035B2 (en) * 2001-08-23 2007-04-17 International Business Machines Corporation Apparatus and method for converting an instruction and data trace to an executable program
US7047395B2 (en) * 2001-11-13 2006-05-16 Intel Corporation Reordering serial data in a system with parallel processing flows
US6950924B2 (en) * 2002-01-02 2005-09-27 Intel Corporation Passing decoded instructions to both trace cache building engine and allocation module operating in trace cache or decoder reading state
CN100449478C (zh) * 2002-05-31 2009-01-07 德拉华州大学 用于实时多线程处理的方法和装置
US7010665B1 (en) 2002-06-27 2006-03-07 Intel Corporation Method and apparatus for decompressing relative addresses
US7103751B1 (en) 2002-06-27 2006-09-05 Intel Corporation Method and apparatus for representation of an address in canonical form
US7111148B1 (en) 2002-06-27 2006-09-19 Intel Corporation Method and apparatus for compressing relative addresses
US7941651B1 (en) 2002-06-27 2011-05-10 Intel Corporation Method and apparatus for combining micro-operations to process immediate data
US7194603B2 (en) * 2003-04-23 2007-03-20 International Business Machines Corporation SMT flush arbitration
US20040225870A1 (en) * 2003-05-07 2004-11-11 Srinivasan Srikanth T. Method and apparatus for reducing wrong path execution in a speculative multi-threaded processor
US20040255104A1 (en) * 2003-06-12 2004-12-16 Intel Corporation Method and apparatus for recycling candidate branch outcomes after a wrong-path execution in a superscalar processor
WO2005109203A2 (en) * 2004-05-12 2005-11-17 Koninklijke Philips Electronics N.V. Data processing system with trace co-processor
US7496735B2 (en) * 2004-11-22 2009-02-24 Strandera Corporation Method and apparatus for incremental commitment to architectural state in a microprocessor
US7508396B2 (en) 2005-09-28 2009-03-24 Silicon Integrated Systems Corp. Register-collecting mechanism, method for performing the same and pixel processing system employing the same
WO2007132136A1 (en) * 2006-05-12 2007-11-22 Arm Limited Error detecting and correcting mechanism for a register file
US8464029B2 (en) * 2009-05-29 2013-06-11 Via Technologies, Inc. Out-of-order execution microprocessor with reduced store collision load replay reduction
CN102567137B (zh) * 2010-12-27 2013-09-25 北京国睿中数科技股份有限公司 在分支预测失败时使用rob恢复rat内容的系统和方法
US9612934B2 (en) * 2011-10-28 2017-04-04 Cavium, Inc. Network processor with distributed trace buffers
WO2013188701A1 (en) * 2012-06-15 2013-12-19 Soft Machines, Inc. A method and system for implementing recovery from speculative forwarding miss-predictions/errors resulting from load store reordering and optimization
US9830224B2 (en) * 2013-03-15 2017-11-28 Nvidia Corporation Selective fault stalling for a GPU memory pipeline in a unified virtual memory system
US10209992B2 (en) 2014-04-25 2019-02-19 Avago Technologies International Sales Pte. Limited System and method for branch prediction using two branch history tables and presetting a global branch history register
US9710272B2 (en) 2014-04-25 2017-07-18 Avago Technologies General Ip (Singapore) Pte. Ltd. Computer processor with generation renaming
US9996354B2 (en) 2015-01-09 2018-06-12 International Business Machines Corporation Instruction stream tracing of multi-threaded processors
CN104657145B (zh) * 2015-03-09 2017-12-15 上海兆芯集成电路有限公司 用于微处理器的重发停靠的系统和方法
GB2572968B (en) * 2018-04-17 2020-09-02 Advanced Risc Mach Ltd Tracking speculative data caching
CN110688160B (zh) * 2019-09-04 2021-11-19 苏州浪潮智能科技有限公司 一种指令流水线处理方法、系统、设备及计算机存储介质

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5564028A (en) * 1994-01-11 1996-10-08 Texas Instruments Incorporated Pipelined data processing including instruction trace

Family Cites Families (24)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5153848A (en) 1988-06-17 1992-10-06 Bipolar Integrated Technology, Inc. Floating point processor with internal free-running clock
US5134693A (en) 1989-01-18 1992-07-28 Intel Corporation System for handling occurrence of exceptions during execution of microinstructions while running floating point and non-floating point instructions in parallel
US5142634A (en) 1989-02-03 1992-08-25 Digital Equipment Corporation Branch prediction
US5309561A (en) 1990-09-28 1994-05-03 Tandem Computers Incorporated Synchronous processor unit with interconnected, separately clocked processor sections which are automatically synchronized for data transfer operations
US5524250A (en) 1991-08-23 1996-06-04 Silicon Graphics, Inc. Central processing unit for processing a plurality of threads using dedicated general purpose registers and masque register for providing access to the registers
US5546593A (en) 1992-05-18 1996-08-13 Matsushita Electric Industrial Co., Ltd. Multistream instruction processor able to reduce interlocks by having a wait state for an instruction stream
US5313634A (en) 1992-07-28 1994-05-17 International Business Machines Corporation Computer system branch prediction of subroutine returns
US5420990A (en) * 1993-06-17 1995-05-30 Digital Equipment Corporation Mechanism for enforcing the correct order of instruction execution
US5548776A (en) * 1993-09-30 1996-08-20 Intel Corporation N-wide bypass for data dependencies within register alias table
US5588126A (en) 1993-12-30 1996-12-24 Intel Corporation Methods and apparatus for fordwarding buffered store data on an out-of-order execution computer system
US5664137A (en) 1994-01-04 1997-09-02 Intel Corporation Method and apparatus for executing and dispatching store operations in a computer system
US5586278A (en) 1994-03-01 1996-12-17 Intel Corporation Method and apparatus for state recovery following branch misprediction in an out-of-order microprocessor
JP3547482B2 (ja) * 1994-04-15 2004-07-28 株式会社日立製作所 情報処理装置
US5613083A (en) * 1994-09-30 1997-03-18 Intel Corporation Translation lookaside buffer that is non-blocking in response to a miss for use within a microprocessor capable of processing speculative instructions
US5802272A (en) * 1994-12-19 1998-09-01 Digital Equipment Corporation Method and apparatus for tracing unpredictable execution flows in a trace buffer of a high-speed computer system
US5724565A (en) 1995-02-03 1998-03-03 International Business Machines Corporation Method and system for processing first and second sets of instructions by first and second types of processing systems
US5812811A (en) * 1995-02-03 1998-09-22 International Business Machines Corporation Executing speculative parallel instructions threads with forking and inter-thread communication
US5832260A (en) * 1995-12-29 1998-11-03 Intel Corporation Processor microarchitecture for efficient processing of instructions in a program including a conditional program flow control instruction
US5778210A (en) * 1996-01-11 1998-07-07 Intel Corporation Method and apparatus for recovering the state of a speculatively scheduled operation in a processor which cannot be executed at the speculated time
US5754818A (en) * 1996-03-22 1998-05-19 Sun Microsystems, Inc. Architecture and method for sharing TLB entries through process IDS
US5933627A (en) 1996-07-01 1999-08-03 Sun Microsystems Thread switch on blocked load or store using instruction thread field
US5887166A (en) 1996-12-16 1999-03-23 International Business Machines Corporation Method and system for constructing a program including a navigation instruction
US5961639A (en) 1996-12-16 1999-10-05 International Business Machines Corporation Processor and method for dynamically inserting auxiliary instructions within an instruction stream during execution
US5881280A (en) * 1997-07-25 1999-03-09 Hewlett-Packard Company Method and system for selecting instructions for re-execution for in-line exception recovery in a speculative execution processor

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5564028A (en) * 1994-01-11 1996-10-08 Texas Instruments Incorporated Pipelined data processing including instruction trace

Also Published As

Publication number Publication date
CN1286771A (zh) 2001-03-07
JP3971893B2 (ja) 2007-09-05
DE69829778D1 (de) 2005-05-19
EP1040421A4 (en) 2002-07-17
HK1029194A1 (en) 2001-03-23
JP2002508567A (ja) 2002-03-19
US6240509B1 (en) 2001-05-29
TW388811B (en) 2000-05-01
BR9814290A (pt) 2001-10-30
WO1999031589A1 (en) 1999-06-24
CN100342349C (zh) 2007-10-10
EP1040421B1 (en) 2005-04-13
EP1040421A1 (en) 2000-10-04
KR20010024750A (ko) 2001-03-26
DE69829778T2 (de) 2006-01-26
AU1911099A (en) 1999-07-05

Similar Documents

Publication Publication Date Title
KR100382126B1 (ko) 오예측 이후에 재실행될 수 있는 명령어를 홀드하기 위한 파이프라인 외부의 트레이스 버퍼
KR100388952B1 (ko) 비순서적 멀티스레드 실행을 수행하는 적재 및 저장명령어를 배열하기 위한 시스템
KR100388947B1 (ko) 실행 파이프라인 외부에 복수의 프로그램 카운터 및트레이스 버퍼를 구비한 프로세서
US6772324B2 (en) Processor having multiple program counters and trace buffers outside an execution pipeline
JP2898820B2 (ja) 自己並列化式のコンピュータ・システムおよび方法
KR100425805B1 (ko) 고성능투기적실행프로세서를위한구조및방법
CN109891393B (zh) 使用检查器处理器的主处理器错误检测
CN111164578B (zh) 核内锁步模式的错误恢复
US6968476B2 (en) Checkpointing a superscalar, out-of-order processor for error recovery
US6415380B1 (en) Speculative execution of a load instruction by associating the load instruction with a previously executed store instruction
RU2233470C2 (ru) Способ и устройство для блокировки сигнала синхронизации в многопоточном процессоре
US7600221B1 (en) Methods and apparatus of an architecture supporting execution of instructions in parallel
JP3014773B2 (ja) プロセサアーキテクチャ
JP2937485B2 (ja) スーパースカラプロセッサにおけるトラップを検出して実行する方法及び装置
US5412784A (en) Apparatus for parallelizing serial instruction sequences and creating entry points into parallelized instruction sequences at places other than beginning of particular parallelized instruction sequence
US7051191B2 (en) Resource management using multiply pendent registers
US20180336037A1 (en) Multi-level history buffer for transaction memory in a microprocessor
KR102170966B1 (ko) 고성능 비순차 실행 코어의 리오더 버퍼 관리 장치 및 방법

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