KR20180021812A - 연속하는 블록을 병렬 실행하는 블록 기반의 아키텍쳐 - Google Patents

연속하는 블록을 병렬 실행하는 블록 기반의 아키텍쳐 Download PDF

Info

Publication number
KR20180021812A
KR20180021812A KR1020187001900A KR20187001900A KR20180021812A KR 20180021812 A KR20180021812 A KR 20180021812A KR 1020187001900 A KR1020187001900 A KR 1020187001900A KR 20187001900 A KR20187001900 A KR 20187001900A KR 20180021812 A KR20180021812 A KR 20180021812A
Authority
KR
South Korea
Prior art keywords
instruction
block
instructions
instruction block
processor
Prior art date
Application number
KR1020187001900A
Other languages
English (en)
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 KR20180021812A publication Critical patent/KR20180021812A/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/30054Unconditional 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/32Address formation of the next instruction, e.g. by incrementing the instruction counter
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • 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
    • 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/3802Instruction prefetching
    • G06F9/3804Instruction prefetching for branches, e.g. hedging, branch folding
    • 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/3802Instruction prefetching
    • G06F9/3808Instruction prefetching for instruction reuse, e.g. trace cache, branch target cache
    • 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/3818Decoding for concurrent execution
    • G06F9/382Pipelined decoding, e.g. using predecoding
    • 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/3818Decoding for concurrent execution
    • G06F9/3822Parallel decoding, e.g. parallel decode units
    • 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/3824Operand accessing
    • 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
    • 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/3838Dependency mechanisms, e.g. register scoreboarding
    • 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
    • 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
    • G06F9/3846Speculative instruction execution using static prediction, e.g. branch taken strategy
    • 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/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory
    • 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/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory
    • G06F9/38585Result writeback, i.e. updating the architectural state or memory with result invalidation, e.g. nullification
    • G06F9/3859
    • 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/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3889Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by multiple instructions, e.g. MIMD, decoupled access or execute
    • G06F9/3891Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by multiple instructions, e.g. MIMD, decoupled access or execute organised in groups of units sharing resources, e.g. clusters

Abstract

블록 기반의 프로세서 아키텍쳐에서 타겟 어드레스에 대한 조기 액세스를 제공하기 위한 시스템, 방법, 및 컴퓨터 판독 가능한 스토리지가 개시된다. 개시된 기술의 하나의 예에서, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법은, 블록 기반의 아키텍쳐의 제1 코어를 사용하여 제1 명령어 블록의 하나 이상의 명령어를 실행하는 것을 포함할 수 있다. 그 방법은, 제1 명령어 블록이 커밋되기 이전에, 제2 명령어 블록의 명령어의 비추측성 실행을 개시하는 것을 포함할 수 있다.

Description

연속하는 블록을 병렬 실행하는 블록 기반의 아키텍쳐
마이크로프로세서는, 관련된 프로세서 명령어 세트 아키텍쳐(Instruction Set Architecture; ISA)에서의 변화가 거의 없이, 무어의 법칙에 의해 예측되는 계속된 트랜지스터 스케일링으로 인한 트랜지스터 수, 집적 회로 비용, 제조 자본, 클록 주파수 및 에너지 효율에서의 지속적인 이득으로부터 이익을 얻어 왔다. 그러나, 지난 40년 넘게 반도체 산업을 이끌었던 포토리소그래피 스케일링으로 실현되는 이점은 느려지고 있거나 또는 심지어 반전되고 있다. 축약형 명령어 세트 컴퓨팅(reduced instruction set computing; RISC) 아키텍쳐는 수 년 동안 프로세서 설계에서 지배적인 패러다임이었다. 비순차 수퍼스칼라 구현은 면적 또는 성능에서 지속적인 향상을 나타내지 못하였다. 따라서, 프로세서 ISA에서의 향상이 성능 향상을 확장할 충분한 기회가 있다.
블록 기반의 프로세서 명령어 세트 아키텍쳐(block-based processor instruction set architecture; BB-ISA)에서 타겟 어드레스에 조기 액세스를 제공하기 위한 방법, 장치 및 컴퓨터 판독 가능한 저장 디바이스가 개시된다. 솔루션을 위한 설명되는 기술 및 툴은 잠재적으로 프로세서 성능을 향상시킬 수 있고, 개별적으로, 또는 서로 다양한 조합으로 구현될 수 있다. 하기에서 더욱 완전히 설명되는 바와 같이, 설명되는 기술 및 툴은, 디지털 신호 프로세서, 마이크로프로세서, 주문형 집적 회로(application-specific integrated circuit; ASIC), 소프트 프로세서(예를 들면, 재구성 가능한 로직을 사용하여 필드 프로그래머블 게이트 어레이(field programmable gate array; FPGA)에서 구현되는 마이크로프로세서 코어), 프로그래머블 로직, 또는 다른 적절한 로직 회로부(circuitry)에서 구현될 수 있다. 기술 분야에서 통상의 지식을 가진 자라면 쉽게 알 수 있듯이, 개시되는 기술은, 서버, 메인프레임, 핸드폰, 스마트폰, PDA, 핸드헬드 디바이스, 핸드헬드 컴퓨터, 터치 스크린 태블릿 디바이스, 태블릿 컴퓨터, 웨어러블 컴퓨터, 및 랩탑 컴퓨터를 포함하는 그러나 이들로 제한되지는 않는 다양한 컴퓨팅 플랫폼에서 구현될 수 있다.
개시되는 기술의 몇몇 예에서, 블록 기반의 컴퓨팅 시스템은 복수의 프로세서 코어 및 제어 로직을 포함할 수 있다. 프로세서 코어는, 제1 명령어 블록의 명령어를 실행하도록 그리고 제1 명령어 블록이 커밋(commit)되기 이전에 제2 명령어 블록의 타겟 어드레스를 생성하도록 구성되는 제1 프로세서 코어를 포함할 수 있다. 제어 로직은, 제1 명령어 블록이 커밋되기 이전에, 제2 명령어 블록의 타겟 어드레스를 수신하도록 그리고 제2 명령어 블록의 실행을 개시하도록 구성될 수 있다. 제2 명령어 블록의 개시된 실행은, 제1 명령어 블록의 헤더에 인코딩되는 종료 타입 정보(exit type information)에 적어도 부분적으로 기초할 수 있다.
이 개요는 하기의 상세한 설명에서 더 설명되는 엄선된 개념을 간단한 형태로 소개하기 위해 제공된다. 이 개요는 청구된 주제의 주요 피쳐 또는 본질적인 피쳐를 식별하도록 의도된 것이 아니며, 청구된 주제의 범위를 제한하는 데 사용되도록 의도된 것도 아니다. 개시되는 주제의 상기 및 다른 목적 및 피쳐, 및 이점은 첨부의 도면을 참조하여 진행하는 이하의 상세한 설명으로부터 더욱 명백해질 것이다.
도 1은 개시되는 기술의 몇몇 예에서 사용될 수 있는 바와 같은, 다수의 프로세서 코어를 포함하는 블록 기반의 프로세서를 예시한다.
도 2는 개시되는 기술의 몇몇 예에서 사용될 수 있는 바와 같은 블록 기반의 프로세서 코어를 예시한다.
도 3은 개시되는 기술의 소정 예에 따른 다수의 명령어 블록을 예시한다.
도 4는 소스 코드의 부분 및 각각의 명령어 블록을 예시한다.
도 5는 개시되는 기술의 몇몇 예에서 사용될 수 있는 바와 같은 블록 기반의 프로세서 헤더 및 명령어를 예시한다.
도 6은 블록 기반의 컴퓨터 아키텍쳐를 타겟으로 삼는 컴파일러에 대한 예시적인 방법을 예시하는 플로우차트이다.
도 7은 개시되는 기술의 몇몇 예에서 사용될 수 있는 바와 같은 예시적인 명령어 블록의 다양한 양태를 예시한다.
도 8은 블록 기반의 컴퓨터 아키텍쳐 상에서 명령어의 실행을 제어하기 위한 방법의 한 예를 예시하는 플로우차트이다.
도 9 및 도 10은 개시되는 기술의 몇몇 예에서 사용될 수 있는 바와 같은 블록 기반의 아키텍쳐의 상이한 구성 및 동작의 예를 예시한다.
도 11은 개시되는 기술의 몇몇 실시형태를 구현하기 위한 적절한 컴퓨팅 환경을 예시하는 블록도이다.
I. 일반적인 고려 사항
본 개시는, 어떤 식으로든 제한하도록 의도되지는 않는 대표적인 실시형태의 맥락에서 기술된다.
본 출원에서 사용되는 바와 같이, 단수 형태 "a(한)", "an(한)" 및 "the(그)"는, 문맥이 명확히 달리 지시하지 않는 한, 복수의 형태를 포함한다. 추가적으로, 용어 "포함한다(include)"는 "포함한다(comprise)"를 의미한다. 또한, 용어 "커플링되는"은, 아이템을 함께 커플링 또는 연결하는 기계적 방식, 전기적 방식, 자기적 방식, 광학적 방식뿐만 아니라 다른 실용적인 방식을 포함하며, 커플링된 아이템 사이의 중간 엘리먼트의 존재를 배제하지는 않는다. 추가적으로, 본원에서 사용되는 바와 같이, 용어 "및/또는"은 문구(phrase)에서의 임의의 하나의 아이템 또는 아이템의 조합을 의미한다.
본원에서 설명되는 시스템, 방법, 및 장치는 어떤 식으로든 제한하는 것으로 해석되어서는 안된다. 대신, 본 개시는, 다양하게 개시되는 실시형태의, 단독으로의 그리고 서로 간의 다양한 조합 및 부조합에서의, 모든 신규의 그리고 자명하지 않은 피쳐 및 양태를 대상으로 한다. 개시되는 시스템, 방법, 및 장치는, 임의의 특정한 양태 또는 피쳐 또는 그 조합으로 제한되는 것도 아니며, 또한, 임의의 하나 이상의 특정한 이점이 존재해야 한다는 것이나 또는 문제점이 해결되어야 한다는 것을 개시되는 실시형태가 요구하는 것도 아니다. 또한, 개시되는 실시형태의 임의의 피쳐 또는 양태는 서로 다양한 조합 및 부조합에서 사용될 수 있다.
비록 개시되는 방법 중 몇몇의 동작이, 편리한 표현을 위해 특별한 순차적인 순서로 설명되지만, 이 방식의 설명은, 특정 순서화가 하기에 기술되는 특정한 언어에 의해 요구되지 않는 한, 재배치를 포괄한다는 것이 이해되어야 한다. 예를 들면, 순차적으로 설명되는 동작은 몇몇 경우에서 재정렬되거나 동시에 수행될 수도 있다. 또한, 간략화를 위해, 첨부된 도면은, 개시되는 것들 및 방법이 다른 것들 및 방법과 연계하여 사용될 수 있는 다양한 방식을 나타내지 못할 수도 있다. 추가적으로, 설명은, 가끔, 개시되는 방법을 설명하기 위해 "생산", "생성", "디스플레이", "수신", "방출", "검증", "실행" 및 "개시"와 같은 용어를 사용한다. 이들 용어는 수행되는 실제 동작의 하이 레벨의 설명이다. 이들 용어에 대응하는 실제 동작은, 특정한 구현예에 따라 변할 것이고 기술 분야에서 통상의 지식을 가진 자에 의해 쉽게 식별 가능할 것이다.
본 개시의 장치 또는 방법을 참조하여 본원에서 제시되는 동작의 이론, 과학적 원리, 또는 다른 이론적 설명은, 더 나은 이해의 목적을 위해 제공되었으며 범위적으로 제한하도록 의도되지는 않는다. 첨부된 청구범위에서의 장치 및 방법은, 동작의 이러한 이론에 의해 설명되는 방식으로 기능하는 장치 및 방법으로 제한되지는 않는다.
개시되는 방법 중 임의의 것은, 하나 이상의 컴퓨터 판독 가능한 저장 매체(예를 들면, 하나 이상의 광학 미디어 디스크, 휘발성 메모리 컴포넌트(예컨대 DRAM 또는 SRAM), 또는 불휘발성 메모리 컴포넌트(예컨대 하드 드라이브)와 같은 컴퓨터 판독 가능한 매체) 상에 저장되며 컴퓨터(예를 들면, 스마트폰 또는 컴퓨팅 하드웨어를 포함하는 다른 모바일 디바이스를 포함하는, 임의의 상업적으로 이용 가능한 컴퓨터) 상에서 실행되는 컴퓨터 실행가능 명령어로서 구현될 수 있다. 개시되는 기술을 구현하기 위한 컴퓨터 실행가능 명령어뿐만 아니라, 개시되는 실시형태의 구현 동안 생성되고 사용되는 임의의 데이터 중 임의의 것은, 하나 이상의 컴퓨터 판독 가능한 매체(예를 들면, 컴퓨터 판독 가능한 저장 매체) 상에 저장될 수 있다. 컴퓨터 실행가능 명령어는, 예를 들면, 전용 소프트웨어 애플리케이션 또는 웹 브라우저 또는 다른 소프트웨어 애플리케이션(예컨대 원격 컴퓨팅 애플리케이션)을 통해 액세스되거나 다운로드되는 소프트웨어 애플리케이션의 일부일 수 있다. 이러한 소프트웨어는, 예를 들면, (예를 들면, 임의의 적절한 상업적으로 이용 가능한 컴퓨터 상에서 실행하는 에이전트로서) 단일의 로컬 컴퓨터 상에서 또는 하나 이상의 네트워크 컴퓨터를 사용하여 (예를 들면, 인터넷, 광역 통신망, 근거리 통신망, 클라이언트 서버 네트워크(예컨대 클라우드 컴퓨팅 네트워크), 또는 다른 이러한 네트워크를 통해) 네트워크 환경에서 실행될 수 있다.
명확화를 위해, 소프트웨어 기반의 구현예의 소정의 선택된 양태만이 설명된다. 기술 분야에서 널리 공지되어 있는 다른 상세는 생략된다. 예를 들면, 개시되는 기술은 임의의 특정한 컴퓨터 언어 또는 프로그램으로 제한되지 않는다는 것이 이해되어야 한다. 예를 들면, 개시되는 기술은 C, C ++, Java 또는 임의의 다른 적절한 프로그래밍 언어로 작성된 소프트웨어에 의해 구현될 수 있다. 마찬가지로, 개시되는 기술은 임의의 특정한 컴퓨터 또는 임의의 특정한 타입의 하드웨어로 제한되지 않는다. 적절한 컴퓨터 및 하드웨어의 소정의 세부 사항은 널리 공지되어 있으며 본 개시에서 상세히 기술될 필요가 없다.
또한, 소프트웨어 기반의 실시형태(예를 들면, 컴퓨터로 하여금 개시되는 방법 중 임의의 것을 수행하게 하기 위한 컴퓨터 실행가능 명령어를 포함함) 중 임의의 것은, 적절한 통신 수단을 통해 업로드될 수 있거나, 다운로드될 수 있거나, 또는 원격으로 액세스될 수 있다. 이러한 적절한 통신 수단은, 예를 들면, 인터넷, 월드 와이드 웹, 인트라넷, 소프트웨어 애플리케이션, 케이블(광섬유 케이블을 포함함), 자기 통신, 전자기 통신(RF, 마이크로파, 및 적외선 통신을 포함함), 전자 통신, 또는 다른 이러한 통신 수단을 포함한다.
II. 개시되는 기술의 소개
수퍼스칼라 비순차 마이크로아키텍쳐는, 레지스터의 이름을 바꾸고, 데이터플로우 순서에서 명령어를 스케줄링하고, 오추측(miss-speculation) 후 말끔히 정리하고, 정확한 예외의 경우 결과를 순서대로 회수하기(retire) 위해 상당한 회로 리소스를 사용한다. 이것은 고가의 에너지 소모적인 회로, 예컨대 깊은, 다중 포트 레지스터 파일, 데이터플로우 명령어 스케줄링 웨이크업을 위한 다중 포트 콘텐츠 액세스 가능 메모리(content-accessible memory; CAM), 및 다수의 광역 버스 멀티플렉서 및 바이패스 네트워크를 포함하는데, 이들 모두는 리소스 집약적이다. 예를 들면, 다중 읽기, 다중 쓰기 RAM의 FPGA 기반의 구현예는 통상적으로 복제, 다중 사이클 작동, 클록 이중화(clock doubling), 뱅크 인터리빙, 라이브 값 테이블, 및 다른 고가의 기술을 필요로 한다.
개시되는 기술은, 프로세서 하드웨어 및 관련된 소프트웨어 둘 다에서 상당한 복잡성 및 오버헤드를 방지하면서, 높은 명령어 레벨 병렬 처리(instruction-level parallelism; ILP), 비순차(out-of-order; OoO), 수퍼스칼라 실행을 포함하는 기술의 적용을 통해 에너지 효율성 및/또는 성능 향상을 실현할 수 있다. 개시되는 기술의 몇몇 예에서, 다수의 프로세서 코어를 포함하는 블록 기반의 프로세서는 면적 및 에너지 효율적인, 높은 ILP 실행을 위해 설계되는 명시적인 데이터 그래프 실행(Explicit Data Graph Execution; EDGE) ISA를 사용한다. 몇몇 예에서, EDGE 아키텍쳐 및 관련 컴파일러의 사용은, 레지스터 이름 바꾸기, CAM 및 복잡성 중 많은 것을 불식시킨다. 몇몇 예에서, 블록 기반의 프로세서의 각각의 코어는, 반복적으로 실행될 수도 있는 페치 및 디코딩된 명령어를 저장 또는 캐싱할 수 있고, 페치 및 디코딩된 명령어는 잠재적으로 감소된 전력 및/또는 성능 향상을 달성하기 위해 재사용될 수 있다.
개시되는 기술의 소정의 예에서, EDGE ISA는, C 및 C++과 같은 주류 프로그래밍 언어를 지원하면서, 레지스터 이름 변경, 데이터플로우 분석, 오추측 복구, 및 순차적 회수를 비롯한 하나 이상의 복잡한 아키텍쳐 피쳐에 대한 필요성을 잠재적으로 제거할 수 있다. 개시되는 기술의 소정의 예에서, 블록 기반의 프로세서는 복수의 둘 이상의 명령어를 원자 블록(atomic block)으로서 실행한다. 프로그램 데이터플로우 및/또는 명령어 플로우의 의미를 보다 명확한 방식으로 표현하기 위해 블록 기반의 명령어가 사용될 수 있고, 향상된 컴파일러 및 프로세서 성능을 허용하게 된다. 개시되는 기술의 소정의 예에서, EDGE ISA는, 부적절한 제어 플로우 명령어의 검출을 향상시키고, 그에 의해 성능을 증가시키고 메모리 리소스를 절약하며, 및/또는 에너지를 절약하기 위해 사용될 수 있는 프로그램 제어 플로우에 대한 정보를 포함한다.
개시되는 기술의 몇몇 예에서, 명령어 블록 내에 편제되는 명령어는, 페치되고, 실행되고, 원자적으로 커밋된다. 블록 내부의 명령어는 데이터플로우 순서대로 실행되는데, 이것은 레지스터 이름 변경의 사용을 줄이거나 없애고 전력 효율적인 OoO 실행을 제공한다. 컴파일러는 ISA를 통해 데이터 의존성을 명시적으로 인코딩하기 위해 사용될 수 있어서, 런타임시 의존성을 재발견하는 것으로부터 프로세서 코어 제어 로직에 부담을 주는 것을 경감하거나 또는 제거한다. 술어화된 실행(predicated execution)을 사용하면, 블록 내 분기가 데이터플로우 명령어로 변환될 수 있고, 메모리 의존성 이외의 의존성은 직접적인 데이터 의존성으로 제한될 수 있다. 개시되는 타겟 형태 인코딩 기술은, 블록 내의 명령어가, 피연산자 버퍼를 통해 그들의 피연산자를 직접적으로 전달하는 것을 허용하여, 전력이 부족한 다중 포트 물리 레지스터 파일에 대한 액세스를 감소시킨다. 몇몇 예에서, 나중의 명령어 블록의 명령어는, 이전의 명령어 블록의 명령어가 커밋되기 전에, 비추측적으로(non-speculatively) 실행될 수 있다.
명령어 블록 사이에서, 명령어는 메모리 및 레지스터를 사용하여 통신할 수 있다. 따라서, 하이브리드 데이터플로우 실행 모델을 활용하는 것에 의해, EDGE 아키텍쳐는 명령적(imperative) 프로그래밍 언어 및 순차적 메모리 의미론을 여전히 지원할 수 있지만, 그러나 거의 순차적인 전력 효율성 및 복잡성을 가지고 비순차 실행의 이점을 또한 누리는 것이 바람직하다.
관련 기술에서 숙련된 자에게 쉽게 이해되는 바와 같이, 개시되는 기술의 구현의 스펙트럼은 다양한 면적, 성능 및 전력 절충을 가지고 가능하다.
III. 예시적인 블록 기반의 프로세서
도 1은 개시되는 기술의 몇몇 예에서 구현될 수 있는 바와 같은 블록 기반의 프로세서(100)의 블록도(10)이다. 프로세서(100)는, 레지스터 모델, 블록 기반의 명령어에 의해 수행되는 다수의 정의된 동작, 메모리 모델, 인터럽트, 및 다른 아키텍쳐 피쳐를 포함하는, 프로세서 동작의 다수의 양태를 설명하는 명령어 세트 아키텍쳐(ISA)에 따른 명령어의 원자 블록을 실행하도록 구성된다. 블록 기반의 프로세서는 프로세서 코어(111)를 포함하는 복수의 프로세싱 코어(110)를 포함한다.
도 1에서 도시되는 바와 같이, 프로세서 코어는 코어 인터커넥트(120)를 통해 서로 연결된다. 코어 인터커넥트(120)는, 코어(110)의 개개의 코어, 메모리 인터페이스(140), 및 입/출력(input/output; I/O) 인터페이스(145) 사이에서 데이터 및 제어 신호를 전달한다. 코어 인터커넥트(120)는, 전기적, 광학적, 자기적, 또는 다른 적절한 통신 기술을 사용하여 신호를 송신 및 수신할 수 있고, 특정한 소망되는 구성에 의존하여, 다수의 상이한 토폴로지에 따라 배열되는 통신 연결을 제공할 수 있다. 예를 들면, 코어 인터커넥트(120)는, 크로스바, 버스, 점대점(point-to-point) 버스, 또는 다른 적절한 토폴로지를 가질 수 있다. 몇몇 예에서, 코어(110) 중 임의의 하나는 다른 코어 중 임의의 코어에 연결될 수 있는 반면, 다른 예에서는, 몇몇 코어는 다른 코어의 서브세트에만 연결된다. 예를 들면, 각각의 코어는 가장 가까운 4, 8 또는 20 개의 이웃 코어에만 연결될 수도 있다. 코어 인터커넥트(120)는, 코어로 그리고 코어로부터 데이터를 입력/출력하기 위해, 뿐만 아니라 코어로 그리고 코어로부터 제어 신호 및 다른 정보 신호를 송신하기 위해 사용될 수 있다. 예를 들면, 코어(110)의 각각은, 각각의 코어의 각각에 의해 현재 실행되고 있는 명령어의 실행의 상태를 나타내는 세마포어를 수신 및 송신할 수 있다. 몇몇 예에서, 코어 인터커넥트(120)는 코어(110), 및 메모리 시스템을 연결하는 배선으로서 구현되는 반면, 다른 예에서는, 코어 인터커넥트는, 액티브 신호 드라이버 및 리피터, 또는 다른 적절한 회로부를 비롯한, 인터커넥트 배선(들), 스위치 및/또는 라우팅 컴포넌트 상에서 데이터 신호를 멀티플렉싱하기 위한 회로부를 포함할 수 있다. 개시되는 기술의 몇몇 예에서, 프로세서(100) 내에서 그리고 프로세서(100)로/로부터 송신되는 신호는 풀 스윙 전기 디지털 신호로 제한되지는 않지만, 그러나 프로세서는, 차동 신호, 펄스 신호, 또는 데이터 및 제어 신호를 송신하기 위한 다른 적절한 신호를 포함하도록 구성될 수 있다.
도 1의 예에서, 프로세서의 메모리 인터페이스(140)는, 추가적인 메모리, 예를 들면, 프로세서(100) 이외의 다른 집적 회로 상에 위치되는 메모리에 연결하기 위해 사용되는 인터페이스 로직을 포함한다. 도 1에서 도시되는 바와 같이, 외부 메모리 시스템(150)은 L2 캐시(152) 및 메인 메모리(155)를 포함한다. 몇몇 예에서, L2 캐시는 정적 RAM(static RAM; SRAM)을 사용하여 구현될 수 있고, 메인 메모리(155)는 동적 RAM(dynamic RAM; DRAM)을 사용하여 구현될 수 있다. 몇몇 예에서, 메모리 시스템(150)은 프로세서(100)의 다른 컴포넌트와 동일한 집적 회로 상에 포함된다. 몇몇 예에서, 메모리 인터페이스(140)는, 레지스터 파일(들) 및/또는 프로세서(100)를 사용하지 않고도 메모리 내의 데이터의 블록의 전송을 허용하는 직접 메모리 액세스(direct memory access; DMA) 컨트롤러를 포함한다. 몇몇 예에서, 메모리 인터페이스는 가상 메모리의 할당을 관리하여, 이용 가능한 메인 메모리(155)를 확장한다.
I/O 인터페이스(145)는, 하드웨어 인터럽트, 시스템 제어 신호, 주변장치 인터페이스, 코프로세서 제어 및/또는 데이터 신호(예를 들면, 그래픽 프로세싱 유닛, 부동 소수점 코프로세서, 물리 프로세싱 유닛, 디지털 신호 프로세서, 또는 다른 코프로세싱 컴포넌트에 대한 신호), 클록 신호, 세마포어, 또는 다른 적절한 I/O 신호와 같은 입력 및 출력 신호를 다른 컴포넌트로 수신 및 전송하기 위한 회로부를 포함한다. I/O 신호는 동기적일 수도 있거나 또는 비동기적일 수도 있다. 몇몇 예에서, I/O 인터페이스의 전부 또는 일부는 메모리 인터페이스(140)와 연계하여 메모리 매핑 I/O 기술(memory-mapped I/O technique)을 사용하여 구현된다.
블록 기반의 프로세서(100)는 또한 제어 유닛(160)을 포함할 수 있다. 제어 유닛(160)은 프로세서(100)의 동작을 감독한다. 제어 유닛(160)에 의해 수행될 수 있는 동작은, 명령어 프로세싱을 수행하기 위한 코어의 할당 및 할당 해제, 코어, 레지스터 파일, 메모리 인터페이스(140) 및/또는 I/O 인터페이스(145) 중 임의의 것 사이의 입력 데이터 및 출력 데이터의 제어, 실행 플로우의 변경, 및 분기 명령어, 명령어 헤더, 및 제어 플로우의 다른 변경의 타겟 위치(들)를 검증하는 것을 포함할 수 있다. 제어 유닛(160)은 또한, 하드웨어 인터럽트를 프로세싱할 수 있고, 특수한 시스템 레지스터, 예를 들면, 하나 이상의 레지스터 파일(들)에 저장되는 프로그램 카운터의 판독 및 기록을 제어할 수 있다. 개시되는 기술의 몇몇 예에서, 제어 유닛(160)은 프로세싱 코어(110) 중 하나 이상을 사용하여 적어도 부분적으로 구현되고, 한편, 다른 예에서는, 제어 유닛(160)은 블록 기반이 아닌 프로세싱 코어(예를 들면, 메모리에 커플링되는 범용 RISC 프로세싱 코어)를 사용하여 구현된다. 몇몇 예에서, 제어 유닛(160)은 적어도 부분적으로 다음 중 하나 이상을 사용하여 구현된다: 하드웨어에 내장된 유한 상태 머신(hardwired finite state machine), 프로그래밍 가능한 마이크로코드, 프로그래밍 가능한 게이트 어레이, 또는 다른 적절한 제어 회로. 대안적인 예에서, 제어 유닛 기능성은 코어(110) 중 하나 이상에 의해 수행될 수 있다.
제어 유닛(160)은, 프로세서 코어(110)에 명령어 블록을 할당하기 위해 사용되는 스케줄러를 포함한다. 본원에서 사용되는 바와 같이, 스케줄러 할당은, 명령어 블록의 매핑, 페칭, 디코딩, 실행, 커밋, 중단, 아이들링을 개시하는 것, 및 명령어 블록을 리프레시하는 것을 포함하는 명령어 블록의 동작을 지시하는 것을 지칭한다. 프로세서 코어(110)는 명령어 블록 매핑 동안 명령어 블록에 할당된다. 명령어 동작의 언급된 단계는 설명의 목적을 위한 것이며, 개시되는 기술의 몇몇 예에서, 소정의 동작은 결합될 수 있거나, 생략될 수 있거나, 다수의 동작으로 분할될 수 있거나, 또는 추가적인 동작이 추가될 수 있다.
블록 기반의 프로세서(100)는 또한, 프로세서 내의 다양한 컴포넌트(예를 들면, 코어(110), 인터커넥트(120), 메모리 인터페이스(140), 및 I/O 인터페이스(145))에 하나 이상의 클록 신호를 분배하는 클록 생성기(170)를 포함한다. 개시되는 기술의 몇몇 예에서, 모든 컴포넌트는 공통 클록을 공유하지만, 한편, 다른 실시형태에서는, 상이한 컴포넌트가 상이한 클록, 예를 들면, 상이한 클록 주파수를 갖는 클록 신호를 사용한다. 몇몇 예에서, 클록의 일부는 프로세서 컴포넌트 중 일부가 사용되지 않을 때 절전을 허용하도록 게이트 제어된다. 몇몇 예에서, 클록 신호는, 고정된 일정 주파수 및 듀티 사이클의 신호를 생성하기 위해 위상 동기 루프(phase-locked loop; PLL)를 사용하여 생성된다. 클록 신호를 수신하는 회로부는 단일의 에지(예를 들면, 상승 에지)에서 트리거될 수 있지만, 한편, 다른 예에서는, 수신 회로부 중 적어도 일부는 상승 및 하강 클록 에지에 의해 트리거된다. 몇몇 예에서, 클록 신호는 광학적으로 또는 무선으로 송신될 수 있다.
IV. 예시적인 블록 기반의 프로세서 코어
도 2는, 개시되는 기술의 소정의 예에서 사용될 수 있는 바와 같은, 블록 기반의 프로세서(100), 특히, 블록 기반의 프로세서 코어 중 하나의 인스턴스에 대한 예시적인 마이크로아키텍쳐를 더 상세히 나타내는 블록도(200)이다. 설명의 용이성을 위해, 예시적인 블록 기반의 프로세서 코어는 다섯 개의 스테이지: 명령어 페치(instruction fetch; IF), 디코드(decode; DC), 피연산자 페치, 실행(execute; EX), 및 메모리/데이터 액세스(LS)를 가지고 예시된다. 그러나, 관련 기술 분야에서 통상의 지식을 가진 자는, 스테이지 추가/제거, 동작을 수행하는 유닛의 추가/제거, 및 다른 구현 세부 사항과 같은 예시된 마이크로아키텍쳐에 대한 변경이, 블록 기반의 프로세서에 대한 특정한 애플리케이션에 적합하도록 수정될 수 있다는 것을 쉽게 이해할 것이다.
도 2에서 도시되는 바와 같이, 프로세서 코어(111)는, 코어 동작을 조정하기 위한 제어 신호를 생성하는 그리고 명령어 스케줄러(206)를 사용하여 코어 내에서의 명령어의 플로우를 스케줄링하는 제어 유닛(205)을 포함한다. 제어 유닛(205) 및/또는 명령어 스케줄러(206)에 의해 수행될 수 있는 동작은, 명령어 프로세싱을 수행하기 위한 코어의 할당 및 할당 해제, 코어, 레지스터 파일, 메모리 인터페이스(140), 및/또는 I/O 인터페이스(145) 중 임의의 것 사이의 입력 데이터 및 출력 데이터의 제어를 포함할 수 있다. 제어 유닛(205)은 또한, 하드웨어 인터럽트를 프로세싱할 수 있고, 특수한 시스템 레지스터, 예를 들면, 하나 이상의 레지스터 파일(들)에 저장되는 프로그램 카운터의 판독 및 기록을 제어할 수 있다. 개시되는 기술의 다른 예에서, 제어 유닛(205) 및/또는 명령어 스케줄러(206)는 블록 기반이 아닌 프로세싱 코어(예를 들면, 메모리에 커플링되는 범용 RISC 프로세싱 코어)를 사용하여 구현된다. 몇몇 예에서, 제어 유닛(205) 및/또는 명령어 스케줄러(206)는 적어도 부분적으로 다음 중 하나 이상을 사용하여 구현된다: 하드웨어에 내장된 유한 상태 머신, 프로그래밍 가능한 마이크로코드, 프로그래밍 가능한 게이트 어레이, 또는 다른 적절한 제어 회로.
예시적인 프로세서 코어(111)는 두 개의 명령어 윈도우(210, 211)를 포함하는데, 그 각각은 명령어 블록을 실행하도록 구성될 수 있다. 개시되는 기술의 몇몇 예에서, 명령어 블록은, 명령어 블록 헤더 및 복수의 하나 이상의 명령어를 포함하는 블록 기반의 프로세서 명령어의 원자 집합(atomic collection)이다. 하기에서 더 논의되는 바와 같이, 명령어 블록 헤더는, 명령어 블록 내의 복수의 명령어 중 하나 이상의 것의 의미를 추가로 정의하기 위해 사용될 수 있는 정보를 포함한다. 사용되는 특정한 ISA 및 프로세서 하드웨어에 의존하여, 명령어 블록 헤더는, 명령어의 실행 동안, 그리고, 예를 들면, 명령어 및/또는 데이터의 조기 페치, 향상된 분기 예측, 추측성 실행(speculative execution), 향상된 에너지 효율성, 및 향상된 코드 압축성을 허용하는 것에 의해 명령어 블록을 실행하는 성능을 향상시키기 위해, 또한 사용될 수 있다. 다른 예에서, 1, 4, 8 또는 다른 수의 명령어 윈도우와 같은 상이한 수의 명령어 윈도우가 가능하다.
명령어 윈도우(210 및 211)의 각각은, 인터커넥트 버스 및 명령어 캐시(227)에 연결되는 하나 이상의 입력 포트(220, 221 및 222)로부터 명령어 및 데이터를 수신할 수 있는데, 명령어 캐시는 결국에는 명령어 디코더(228 및 229)에 연결된다. 추가적인 제어 신호가 추가 입력 포트(225) 상에서 또한 수신될 수 있다. 명령어 디코더(228 및 229)의 각각은, 명령어 블록에 대한 명령어 헤더 및/또는 명령어를 디코딩하고 각기 각각의 명령어 윈도우(210 및 211)에 위치되는 메모리 저장소(215 및 216) 내에 디코딩된 명령어를 저장한다.
프로세서 코어(111)는 L1(레벨 1) 캐시(235)에 커플링되는 레지스터 파일(230)을 더 포함한다. 레지스터 파일(230)은 블록 기반의 프로세서 아키텍쳐에서 정의되는 레지스터에 대한 데이터를 저장하고, 하나 이상의 판독 포트 및 하나 이상의 기록 포트(write port)를 가질 수 있다. 예를 들면, 레지스터 파일은 데이터를 레지스터 파일에 저장하기 위한 두 개 이상의 기록 포트를 포함할 수도 있을 뿐만 아니라, 레지스터 파일 내의 개개의 레지스터로부터 데이터를 판독하기 위한 복수의 판독 포트를 구비할 수도 있다. 몇몇 예에서, 단일 명령어 윈도우(예를 들면, 명령어 윈도우(210))는 한 번에 레지스터 파일의 단지 하나의 포트에만 액세스할 수 있는 반면, 다른 예에서, 명령어 윈도우(210)는 하나의 판독 포트 및 하나의 기록 포트에 액세스할 수 있거나, 또는 두 개 이상의 판독 포트 및/또는 기록 포트에 동시에 액세스할 수 있다. 몇몇 예에서, 레지스터 파일(230)은 64 개의 레지스터를 포함할 수 있는데, 레지스터 각각은 32 비트의 워드의 데이터를 유지한다. (이 애플리케이션은, 달리 명시하지 않는 한, 32 비트의 데이터를 워드로 칭할 것이다.) 몇몇 예에서, 레지스터 파일(230) 내의 레지스터 중 몇몇은, 특수 목적에 할당될 수도 있다. 예를 들면, 레지스터 중 몇몇은 시스템 레지스터로서 전용될 수 있는데, 그 예는, 일정한 값(예를 들면, 모두 제로의 워드)을 저장하는 레지스터, 실행되고 있는 프로그램 스레드의 현재 어드레스를 나타내는 프로그램 카운터(들)(program counter; PC), 물리적 코어 번호, 논리적 코어 번호, 코어 할당 토폴로지, 코어 제어 플래그, 프로세서 토폴로지, 또는 다른 적절한 전용 목적을 포함한다. 몇몇 예에서, 하나 이상의 프로세서 코어 및/또는 프로세서에 걸친 다수의 실행 스레드의 동시적 실행을 허용하기 위해, 다수의 프로그램 카운터 레지스터, 하나 또는 각각의 프로그램 카운터가 있다. 몇몇 예에서, 프로그램 카운터는 레지스터 파일의 레지스터가 아닌 지정된 메모리 위치로서 구현된다. 몇몇 예에서, 시스템 레지스터의 사용은 오퍼레이팅 시스템 또는 다른 감독 컴퓨터 명령어에 의해 제한될 수도 있다. 몇몇 예에서, 레지스터 파일(230)은 플립플롭의 어레이로서 구현되는 반면, 다른 예에서, 레지스터 파일은 래치, SRAM, 또는 다른 형태의 메모리 스토리지를 사용하여 구현될 수 있다. 주어진 프로세서, 예를 들면, 프로세서(100)에 대한 ISA 명세는, 레지스터 파일(230) 내의 레지스터가 어떻게 정의되고 사용되는지를 명시한다.
몇몇 예에서, 프로세서(100)는 복수의 프로세서 코어에 의해 공유되는 글로벌 레지스터 파일을 포함한다. 몇몇 예에서는 프로세서 ISA 및 구성에 따라, 프로세서 코어와 관련되는 개개의 레지스터 파일은 결합되어 더 큰 파일을 정적으로 또는 동적으로 형성할 수 있다.
도 2에서 도시되는 바와 같이, 명령어 윈도우(210)의 메모리 저장소(215)는 다수의 디코딩된 명령어(241), 좌측 피연산자(left operand; LOP) 버퍼(242), 우측 피연산자(right operand; ROP) 버퍼(243), 및 명령어 스코어보드(245)를 포함한다. 개시되는 기술의 몇몇 예에서, 명령어 블록의 각각의 명령어는, 도 2에서 도시되는 바와 같이, 디코딩된 명령어, 좌/우 피연산자, 및 스코어보드 데이터의 열로 분해된다. 디코딩된 명령어(241)는, 비트 레벨 제어 신호로서 저장되는 명령어의 부분적으로 또는 완전히 디코딩된 버전을 포함할 수 있다. 피연산자 버퍼(242 및 243)는, 그들 각각의 디코딩된 명령어가 실행될 준비가 될 때까지, 피연산자(예를 들면, 레지스터 파일(230)로부터 수신되는 레지스터 값, 메모리로부터 수신되는 데이터, 명령어 내에서 코딩되는 즉시 피연산자(immediate operand), 이전에 발행된 명령어에 의해 계산되는 피연산자, 또는 다른 피연산자 값)를 저장한다. 명령어 피연산자는, 레지스터 파일이 아닌, 피연산자 버퍼(242 및 243)로부터 판독된다.
제2 명령어 윈도우(211)의 메모리 저장소(216)는 메모리 저장소(215)와 유사한 명령어 정보(디코딩된 명령어, 피연산자, 및 스코어보드)를 저장하지만, 단순화를 위해 도 2에서는 도시되지 않는다. 명령어 블록은, ISA 제약에 따라 그리고 제어 유닛(205)에 의해 지시되는 대로, 제1 명령어 윈도우와 관련하여 제2 명령어 윈도우(211)에 의해 동시에 또는 순차적으로 실행될 수 있다.
개시되는 기술의 몇몇 예에서, 프론트 엔드 파이프라인 스테이지 IF 및 DC는 백 엔드 파이프라인 스테이지(IS, EX, LS)로부터 디커플링되어 실행될 수 있다. 하나의 실시형태에서, 제어 유닛은, 클록 싸이클 당 두 개의 명령어를 페치하여 명령어 윈도우(210 및 211)의 각각으로 디코딩할 수 있다. 대안적인 실시형태에서, 제어 유닛은 클록 사이클 당 하나, 네 개 또는 다른 수의 명령어를 페치하여 대응하는 수의 명령어 윈도우로 디코딩할 수 있다. 제어 유닛(205)은, 스코어보드(245)를 사용하여 각각의 디코딩된 명령어의 입력(예를 들면, 각기 각각의 명령어의 술어(predicate)(들) 및 피연산자(들))의 준비 상태(ready state)를 모니터링하기 위한 명령어 윈도우 데이터플로우 스케줄링 로직을 제공한다. 특정한 디코딩된 명령어에 대한 모든 입력이 준비되면, 명령어를 발행할 준비가 된다. 그 다음, 제어 로직(205)은 사이클마다 하나 이상의 다음 명령어(들)(예를 들면, 가장 낮은 번호의 준비 완료 명령어(ready instruction))의 실행을 개시하고, 그것의 디코딩된 명령어 및 입력 피연산자는 실행을 위해 기능 유닛(260) 중 하나 이상으로 전송된다. 디코딩된 명령어는 또한, 다수의 준비 이벤트를 인코딩할 수 있다. 제어 로직(205)의 스케줄러는 다른 소스로부터 이들 및/또는 이벤트를 받아들이고 윈도우 내의 다른 명령어의 준비 상태를 업데이트한다. 따라서, 프로세서 코어(111)의 준비 상태 제로 입력 명령어(ready zero input instruction), 제로 입력 명령어에 의해 타겟으로 되는 명령어, 및 등등으로 시작하여 실행이 진행한다.
디코딩된 명령어(241)는, 명령어 윈도우(210)의 메모리 저장소(215) 내에서 배열되는 순서와 동일한 순서로 실행될 필요는 없다. 오히려, 명령어 스코어보드(245)는 디코딩된 명령어의 의존성을 추적하기 위해 사용되며, 의존성이 충족될 때, 관련된 개개의 디코딩된 명령어는 실행을 위해 스케줄링된다. 예를 들면, 각각의 명령어에 대한 의존성이 충족될 때, 각각의 명령어에 대한 참조는 준비 상태 큐(ready queue) 상으로 푸시될 수 있고, 명령어는 준비 상태 큐로부터 선입선출(first-in first-out; FIFO) 순서로 스케줄링될 수 있다. 스코어보드(245)에 저장되는 정보는, 관련된 명령어의 실행 술어(예컨대, 명령어가 술어 비트가 계산되기를 기다리고 있는지의 여부 및 술어 비트가 참 또는 거짓이면 명령어가 실행하는지의 여부), 명령어에 대한 피연산자의 이용 가능성, 또는 관련된 개개의 명령어를 실행하기 전에 필요로 되는 다른 선행 조건을 포함할 수 있지만, 그러나 이들로 제한되는 것은 아니다.
하나의 실시형태에서, 스코어보드(245)는, 명령어 디코더(231)에 의해 초기화되는 디코딩된 준비 상태(decoded ready state), 및 명령어의 실행 동안 제어 유닛(205)에 의해 초기화되는 활성 준비 상태(active ready state)를 포함할 수 있다. 예를 들면, 디코딩된 준비 상태는, 각각의 명령어가 디코딩되었는지, 아마도 브로드캐스트 채널을 통해, 술어 및/또는 몇몇 피연산자를 대기하고 있는지, 또는 즉시 발행 준비가 되어 있는지의 여부를 인코딩할 수 있다. 디코딩된 활성 상태는, 각각의 명령어가 술어 및/또는 몇몇 피연산자(들)를 대기하고 있는지, 발행할 준비가 되었는지, 또는 이미 발행하였는지의 여부를 인코딩할 수 있다. 디코딩된 준비 상태는 블록 재설정시 또는 블록 리프레시시 클리어될 수 있다. 새로운 명령어 블록으로 분기시, 디코딩된 준비 상태 및 디코딩된 활성 상태는 클리어된다(블록 또는 코어 리셋). 그러나 명령어 블록이, 예컨대 그것이 자기 자신으로 다시 분기할 때(블록 리프레시)와 같이 코어 상에서 재실행될 때, 활성 준비 상태만이 클리어된다. 블록 리프레시는, 다수의 다른 개재 명령어 블록을 실행한 직후(명령어 블록이 자기 자신으로 분기하는 경우) 또는 이후에 발생할 수 있다. 따라서, 블록의 명령어를 다시 페치하고 디코딩할 필요가 없도록 명령어 블록에 대한 디코딩된 준비 상태는 유지될 수 있다. 그러므로, 블록 리프레시는 루프 및 다른 반복하는 프로그램 구조에서 시간 및 에너지를 절약하기 위해 사용될 수 있다.
각각의 명령어 윈도우에 저장되는 명령어의 수는, 일반적으로, 명령어 블록 내의 명령어의 수에 대응한다. 몇몇 예에서, 명령어 블록 내의 명령어의 수는 32, 64, 128, 1024, 또는 다른 수의 명령어일 수 있다. 개시되는 기술의 몇몇 예에서, 명령어 블록은 프로세서 코어 내의 다수의 명령어 윈도우에 걸쳐 할당된다. 몇몇 예에서, 명령어 윈도우(210, 211)는, 단일 프로세서 코어 상에서 다수의 명령어 블록이 실행될 수 있도록, 논리적으로 분할될 수 있다. 예를 들면, 1, 2, 4 또는 다른 수의 명령어 블록이 하나의 코어 상에서 실행될 수 있다. 각각의 명령어 블록은 서로 동시에 또는 순차적으로 실행될 수 있다.
명령어는 프로세서 코어(111) 내에 위치되는 제어 유닛(205)을 사용하여 할당 및 스케줄링될 수 있다. 제어 유닛(205)은 메모리로부터 명령어의 페치, 명령어의 디코딩, 명령어가 각각의 명령어 윈도우로 로딩되자마자의 명령어의 실행, 프로세서 코어(111) 안으로의/밖으로의 데이터플로우, 및 프로세서 코어에 의한 제어 신호 입력 및 출력을 조정한다. 예를 들면, 제어 유닛(250)은, 상기에서 설명되는 바와 같이, 명령어를 스케줄링함에 있어서 사용하기 위한 준비 상태 큐를 포함할 수 있다. 각기 각각의 명령어 윈도우(210 및 211)에 위치되는 메모리 저장소(215 및 216)에 저장되는 명령어는, 원자적으로 실행될 수 있다. 따라서, 실행된 명령어에 의해 영향을 받는 가시적인 아키텍쳐 상태(예컨대 레지스터 파일(230) 및 메모리)에 대한 업데이트는, 명령어가 커밋될 때까지, 코어(200) 내에서 국소적으로 버퍼링될 수 있다.
제어 유닛(205)은, 명령어가 커밋될 준비가 되는 때를 결정할 수 있고, 커밋 로직을 시퀀스화할 수 있고, 커밋 신호를 발행할 수 있다. 예를 들면, 명령어 블록에 대한 커밋 단계는, 모든 레지스터 기록이 버퍼링될 때, 메모리에 대한 모든 기록이 버퍼링될 때, 그리고, 분기 타겟이 계산될 때 시작할 수 있다. 명령어 블록은 가시적인 아키텍쳐 상태에 대한 업데이트가 완료되면 커밋될 수 있다. 예를 들면, 명령어 블록은, 레지스터 기록이 레지스터 파일에 기록될 때, 저장소가 로드/저장 유닛 또는 메모리 컨트롤러로 전송될 때, 다음 명령어 블록의 타겟 어드레스가 생성될 때, 그리고 커밋 신호가 생성될 때, 커밋될 수 있다. 또한, 제어 유닛(205)은, 각각의 명령어 윈도우의 각각에 대한 기능 유닛(260)의 할당을 적어도 부분적으로 제어한다.
제어 유닛(205)은, 실행될 다음 명령어 블록을 가리키는 타겟 어드레스를 출력할 수 있다. 타겟 어드레스는 커밋 신호 발행과 동기적으로 또는 커밋 신호 발행에 앞서 출력될 수 있다. 예를 들면, 타겟 어드레스는, 동시적으로 실행하는 명령어 블록이 커밋되기 이전에 다음 명령어 블록의 명령어의 비추측성 실행(non-speculative execution)이 개시될 수 있도록, 커밋 신호를 발행하기 이전에 코어(200)의 외부로(예컨대 도 1의 제어 유닛(160)으로) 전달될 수 있다. 타겟 어드레스가 유효한 때를 나타내기 위해, 유효 신호가 타겟 어드레스와 관련될 수 있다.
도 2에서 도시되는 바와 같이, 다수의 실행 파이프라인 레지스터(255)를 구비하는 제1 라우터(250)는, 명령어 윈도우(210 및 211) 중 어느 하나로부터의 데이터를, 기능 유닛(260) 중 하나 이상으로 전송하기 위해 사용되는데, 기능 유닛(260)은, 정수 ALU(arithmetic logic unit; 산술 로직 유닛)(예를 들면, 정수 ALU(264 및 265)), 부동 소수점 유닛(예를 들면, 부동 소수점 ALU(267)), 시프트/회전 로직(예를 들면, 배럴 시프터(268)), 또는 그래픽 함수, 물리 함수, 및 다른 수학적 연산을 포함할 수 있는 다른 적절한 실행 유닛을 포함할 수 있지만, 그러나 이들로 제한되는 것은 아니다. 기능 유닛(260)으로부터의 데이터는, 그 다음, 실행되고 있는 특정한 명령어의 요건에 의존하여, 제2 라우터(270)를 통해 출력(290, 291 및 292)으로 라우팅될 수 있거나, 피연산자 버퍼(예를 들면, LOP 버퍼(242) 및/또는 ROP 버퍼(243))로 되라우팅될(routed back) 수 있거나, 또는 다른 기능 유닛으로 피드백될 수 있다. 제2 라우터(270)는, 메모리 명령어를 발행하기 위해 사용될 수 있는 로드/저장 큐(275), 코어로부터 메모리로 입력되고 있는 또는 출력되고 있는 데이터를 저장하는 데이터 캐시(277), 및 로드/저장 파이프라인 레지스터(278)를 포함할 수 있다.
코어는 또한, 예를 들면, 명령어 윈도우(215 또는 216) 중 하나 이상에 대한 모든 명령어의 실행이 완료되었을 때를 나타내기 위해 사용되는 제어 출력(295)을 포함한다. 명령어 블록의 실행이 완료되면, 명령어 블록은 "커밋된" 것으로 지정되고, 제어 출력(295)으로부터의 신호는, 그 다음, 블록 기반의 프로세서(100) 내의 다른 코어에 의해 및/또는 제어 유닛(160)에 의해 사용되어, 다른 명령어 블록의 스케줄링, 페칭, 및 실행을 개시할 수 있다. 제1 라우터(250) 및 제2 라우터(270) 둘 다는, (예를 들면, 명령어 블록 내의 다른 명령어에 대한 피연산자로서) 데이터를 명령어로 되전송할(send back) 수 있다.
관련 기술 분야에서 통상의 지식을 가진 자에게 쉽게 이해되는 바와 같이, 개개의 코어(200) 내의 컴포넌트는 도 2에서 도시되는 컴포넌트로 제한되지 않지만, 그러나 특정한 애플리케이션의 요건에 따라 변경될 수 있다. 예를 들면, 코어는 더 적은 또는 더 많은 명령어 윈도우를 가질 수도 있고, 단일의 명령어 디코더는 둘 이상의 명령어 윈도우에 의해 공유될 수 있고, 사용되는 기능 유닛의 수 및 타입은, 블록 기반의 프로세서에 대한 특정한 타겟으로 삼은 애플리케이션에 따라, 변동될 수 있다. 명령어 코어로 리소스를 선택하고 할당함에 있어서 적용하는 다른 고려 사항은, 성능 요건, 에너지 사용량 요건, 집적 회로 다이, 프로세스 기술, 및/또는 비용을 포함한다.
관련 기술 분야에서 통상의 지식을 가진 자라면, 프로세서 코어(110)의 제어 로직(205) 및 명령어 윈도우(예를 들면, 명령어 윈도우(210)) 내에서의 리소스의 할당 및 설계에 의한 프로세서 성능에서 절충이 이루어질 수 있다는 것이 쉽게 이해할 것이다. 면적, 클록 주기, 성능 및 제한은, 개개의 코어(110)의 실현된 성능 및 블록 기반의 프로세서(110)의 스루풋을 실질적으로 결정한다.
명령어 스케줄러(206)는 다양한 기능성을 가질 수 있다. 소정의 더욱 높은 성능 예에서, 명령어 스케줄러는 고도로 동시적이다. 예를 들면, 사이클마다, 디코더(들)는 명령어의 디코딩된 준비 상태 및 디코딩된 명령어를 하나 이상의 명령어 윈도우에 기록하고, 발행할 다음 명령어를 선택하고, 백 엔드에 응답하여 준비 상태 이벤트(ready event) - 특정한 명령어의 입력 슬롯(술어, 좌측 피연산자, 우측 피연산자, 등등)을 타겟으로 삼는 타겟 준비 상태 이벤트(target-ready event), 또는 모든 명령어를 타겟으로 삼는 브로드캐스트 준비 상태 이벤트(broadcast-ready event) 중 어느 하나 - 를 전송한다. 디코딩된 준비 상태와 함께, 명령어 별 준비 상태 비트를 사용하여, 명령어를 발행할 준비가 되었다는 것을 결정할 수 있다.
몇몇 예에서, 명령어 스케줄러(206)는, 개시되는 기술에 따라 명령어 블록의 실행을 스케줄링하기 위해 사용되는 정보를 나타내는 데이터를 저장하는 스토리지(예를 들면, 선입선출(FIFO) 큐, 콘텐츠 주소 지정 가능 메모리(content addressable memory; CAM))를 사용하여 구현된다. 예를 들면, 명령어 블록을 프로세서 코어에 매핑함에 있어서 결정을 용이하게 하기 위해, 명령어 의존성, 제어의 전송, 추측, 분기 예측, 및/또는 데이터 로드 및 저장에 관한 데이터가 스토리지에 배열된다. 예를 들면, 명령어 블록 의존성은 FIFO 또는 CAM에 저장되는 그리고 명령어 블록을 하나 이상의 프로세서 코어에 매핑하기 위해 사용되는 선택 로직에 의해 나중에 액세스되는 태그와 관련될 수 있다. 몇몇 예에서, 명령어 스케줄러(206)는 메모리에 커플링되는 범용 프로세서를 사용하여 구현되는데, 메모리는 명령어 블록을 스케줄링하기 위한 데이터를 저장하도록 구성된다. 몇몇 예에서, 명령어 스케줄러(206)는 특수 목적 프로세서를 사용하여 또는 메모리에 커플링되는 블록 기반의 프로세서 코어를 사용하여 구현된다. 몇몇 예에서, 명령어 스케줄러(206)는 메모리에 커플링되는 유한 상태 머신으로서 구현된다. 몇몇 예에서, 프로세서(예를 들면, 범용 프로세서 또는 블록 기반의 프로세서 코어) 상에서 실행하는 오퍼레이팅 시스템은, 우선 순위, 예측, 및 명령어 스케줄러(206)로 명령어 블록을 스케줄링하기 위해 적어도 부분적으로 사용될 수 있는 다른 데이터를 생성한다. 관련 기술 분야에서 통상의 지식을 가진 자에게 쉽게 명백한 바와 같이, 집적 회로, 프로그래밍 가능한 로직, 또는 다른 적절한 로직으로 구현되는 다른 회로 구조가 명령어 스케줄러(206)에 대한 하드웨어를 구현하기 위해 사용될 수 있다.
몇몇 경우에, 스케줄러(206)는 아직 디코딩되지 않은 타겟 명령어에 대한 이벤트를 받아들이고 또한 발행된 준비 완료 명령어의 재발행을 금지해야만 한다. 스케줄러(206)는 스코어보드(245)를 통해 각각의 명령어의 준비 상태를 업데이트 및 추적할 수 있다. 몇몇 예에서, 명령어는 (참 또는 거짓 조건에 기초하여) 술어화될 수 없거나(non-predicated) 또는 술어화될 수 있다. 술어화된 명령어(predicated instruction)는, 그것이 다른 명령어의 술어 결과에 의해 타겟으로 되고, 그 결과가 술어 조건(predicate condition)과 매치할 때까지, 준비 상태가 되지 않는다. 관련된 술어가 매치하지 않으면, 명령어는 절대로 발행되지 않는다. 몇몇 예에서, 술어화된 명령어가 발행되고 추측적으로 실행될 수도 있다. 몇몇 예에서, 프로세서는, 추측적으로 발행되고 실행된 명령어가 정확하게 추측되었는지를 후속하여 체크할 수도 있다. 몇몇 예에서, 잘못 추측되어 발행된 명령어 및 자신의 출력을 소비하는 블록에서의 명령어의 특정한 전이적 닫힘(transitive closure)이 재실행될 수도 있거나, 또는 잘못 추측된 부작용이 무효화될 수도 있다. 몇몇 예에서 잘못 추측된 명령어의 발견은, 명령어의 전체 블록의 완전히 롤백 및 재실행으로 이어진다.
V. 명령어 블록의 예시적인 스트림
이제 도 3의 도면(300)을 참조하면, 다수의 가변 길이 명령어 블록(311-315)(A-E)을 포함하는 블록 기반의 명령어의 스트림의 일부(310)가 예시된다. 명령어의 스트림은, 유저 애플리케이션, 시스템 서비스, 또는 다른 적절한 사용을 구현하기 위해 사용될 수 있다. 도 3에서 도시되는 예에서, 각각의 명령어 블록은 명령어 헤더로 시작하는데, 명령어 헤더 뒤에는 다양한 수의 명령어가 후속된다. 예를 들면, 명령어 블록(311)은 헤더(320) 및 20 개의 명령어(321)을 포함한다. 예시되는 특정한 명령어 헤더(320)는, 명령어 블록 내의 명령어의 실행을 부분적으로 제어하는, 그리고 또한, 예를 들면, 분기 예측, 추측성 실행, 지연 평가 및/또는 다른 기술을 포함하는 향상된 성능 개선을 허용하는 다수의 데이터 필드를 포함한다. 명령어 헤더(320)는 또한, 헤더가 명령어가 아니라 명령어 헤더이다는 것을 나타내는 ID 비트를 포함한다. 명령어 헤더(320)는 또한 명령어 블록 사이즈의 표시를 포함한다. 명령어 블록 사이즈는, 하나보다 더 큰 명령어의 청크, 예를 들면, 명령어 블록 내에 포함되는 4 명령어 청크의 수에 있을 수 있다. 다시 말하면, 블록의 사이즈는, 명령어 블록 사이즈를 명시하는 데 할당되는 헤더 공간을 압축하기 위해 4 비트 시프트된다. 따라서, 0의 사이즈 값은, 4 개의 명령어가 후속하는 블록 헤더인 최소 사이즈의 명령어 블록을 나타낸다. 몇몇 예에서, 명령어 블록 사이즈는, 바이트의 수로서, 워드의 수로서, n 워드 청크의 수로서, 어드레스로서, 어드레스 오프셋으로서, 또는 명령어 블록의 사이즈를 설명하기 위한 다른 적절한 표현을 사용하여 표현된다. 몇몇 예에서, 명령어 블록 사이즈는 명령어 블록 헤더 및/또는 푸터(footer)의 종결 비트 패턴에 의해 나타내어진다.
명령어 블록 헤더(320)는 또한, 특수 명령어 실행 요건을 나타내는 실행 플래그를 포함할 수 있다. 예를 들면, 분기 예측 또는 메모리 의존성 예측은, 특정한 애플리케이션에 따라, 소정의 명령어 블록에 대해 금지될 수 있다.
개시되는 기술의 몇몇 예에서, 명령어 헤더(320)는, 인코딩된 데이터가 명령어 헤더이다는 것을 나타내는 하나 이상의 식별 비트를 포함한다. 예를 들면, 몇몇 블록 기반의 프로세서 ISA에서, 최하위 비트 공간의 단일의 ID 비트는, 유효한 명령어 블록의 시작을 나타내기 위해 이진 값 1로 항상 설정된다. 다른 예에서, 식별 비트(들)에 대해 상이한 비트 인코딩이 사용될 수 있다. 몇몇 예에서, 명령어 헤더(320)는, 관련된 명령어 블록이 인코딩되는 ISA의 특정한 버전을 나타내는 정보를 포함한다.
블록 명령어 헤더는 또한, 예를 들면, 분기 예측, 제어 플로우 결정, 및/또는 불량 점프 검출에서 사용하기 위한 다수의 블록 종료 타입을 포함할 수 있다. 종료 타입은 어떤 타입의 분기 명령어가, 예를 들면: 메모리의 다음 인접한 명령어 블록을 가리키는 순차적인 분기 명령어인지; 오프셋에 대해 계산되는 메모리 어드레스에서 다른 명령어 블록으로의 분기인 오프셋 명령어인지; 서브루틴 호출인지, 또는 서브루틴 리턴인지를 나타낼 수 있다. 명령어 헤더에서 분기 종료 타입을 인코딩하는 것에 의해, 분기 예측기는, 동일한 명령어 블록 내의 분기 명령어가 페치 및/또는 디코딩되기 전에 적어도 부분적으로 동작을 시작할 수 있다.
명령어 블록 헤더(320)는 또한, 동작을 저장하기 위해 할당되는 로드 저장 큐 식별자를 식별하는 저장 마스크를 포함한다. 명령어 블록 헤더는 또한, 관련된 명령어 블록이 어떤 글로벌 레지스터(들)를 기록할 것인지를 식별하는 기록 마스크를 포함할 수 있다. 관련된 레지스터 파일은, 명령어 블록이 완료할 수 있기 이전에 각 엔트리에 대한 기록을 수신해야만 한다. 몇몇 예에서 블록 기반의 프로세서 아키텍쳐는 스칼라 명령어뿐만 아니라, 단일 명령어 내에서 더 많은 수의 데이터 피연산자를 갖는 연산을 허용하는 단일 명령어 다중 데이터(single-instruction multiple-data; SEVID) 명령어를 포함할 수 있다.
VI. 예시적인 블록 명령어 타겟 인코딩
도 4는, 블록 기반의 명령어가 그들의 타겟을 어떻게 명시적으로 인코딩할 수 있는지를 예시하는, C 언어 소스 코드의 두 부분(410 및 415) 및 (어셈블리 언어의) 그들의 각각의 명령어 블록(420 및 425)의 예를 묘사하는 도면(400)이다. 하이 레벨의 C 언어 소스 코드는, 자신의 타겟이 블록 기반의 프로세서인 컴파일러에 의해 로우 레벨의 어셈블리 언어 및 머신 코드로 변환될 수 있다. 하이 레벨의 언어는, 프로그래머가 프로그램의 기능성에 집중할 수 있도록, 기저의 컴퓨터 아키텍쳐의 세부 사항 중 많은 것을 추상화할 수 있다. 반대로, 머신 코드는, 컴퓨터의 하드웨어 리소스를 사용하여, 타겟 컴퓨터 상에서 실행될 수 있도록 타겟 컴퓨터의 ISA에 따라 프로그램을 인코딩한다. 어셈블리 언어는 머신 코드의 사람이 읽을 수 있는 형태이다.
이 예에서, 처음 두 개의 READ 명령어(430 및 431)는, 각각, ADD 명령어(432)의 우측(T[2R]) 및 좌측(T[2L]) 피연산자를 타겟으로 한다. 예시된 ISA에서, 판독 명령어는, 글로벌 레지스터 파일(예를 들면, 레지스터 파일(160))로부터 판독하는 유일한 명령어이지만; 그러나 임의의 명령어는 글로벌 레지스터 파일을 타겟으로 삼을 수 있다. ADD 명령어(432)가 양 레지스터 판독의 결과를 수신하면, 그것은 준비 완료되어 실행될 것이다.
TLEI(test-less-than-equal-immediate) 명령어(433)가 ADD로부터 자신의 단일 입력 피연산자를 수신하면, 그것은 준비가 완료되어 실행될 것이다. 그 다음, 테스트는, 이 예에서는 두 개의 술어화된 분기 명령어(BRO_T(참인 경우의 분기)(434) 및 BRO_F(거짓인 경우의 분기)(435))인, 브로드캐스트 채널 상에서 청취하고 있는 모든 명령어로 채널 1(B[1P]) 상에서 브로드캐스트되는 술어 피연산자를 생성한다. 매치하는 술어 값을 수신하는 분기는 기동할 것이다.
명령어 블록(420)에 대한 의존성 그래프(440)는 또한, 명령어 노드의 어레이(450) 및 대응하는 피연산자 타겟(455 및 456)으로서 예시된다. 이것은, 블록 명령어(420), 대응하는 명령어 윈도우 엔트리, 및 명령어에 의해 표현되는 기저의 데이터플로우 그래프 사이의 대응성을 예시한다. 여기서, 디코딩된 명령어 READ(430) 및 READ(431)는, 그들이 입력 의존성을 갖지 않으므로, 발행할 준비가 된다. 그들이 발행되고 실행됨에 따라, 레지스터 R6 및 R7로부터 판독되는 값은 ADD(432)의 우측 및 좌측 피연산자 버퍼에 기록되어, ADD(432)의 좌측 및 우측 피연산자를 "준비 완료"로 표시한다. 결과적으로, ADD(432) 명령어는 준비 완료가 되고, ALU에 발행하고, 실행되고, 합계는 TLEI(433)의 좌측 피연산자에 기록된다.
비교로서, 종래의 비순차 RISC 또는 CISC 프로세서는, 추가적인 하드웨어 복잡성, 전력, 면적을 사용하여 그리고 클록 주파수 및 성능을 감소시키면서, 런타임에서 의존성 그래프를 동적으로 구축할 것이다. 그러나, 의존성 그래프는 컴파일 시간에 정적으로 알려지며 EDGE 컴파일러는 ISA를 통해 명령어 사이의 생성자-소비자 관계를 직접적으로 인코딩할 수 있으므로, 그 관계를 동적으로 재발견하는 것으로부터 마이크로아키텍쳐를 자유롭게 한다. 이것은 더 간단한 마이크로아키텍쳐를 잠재적으로 가능하게 하여, 면적, 전력을 감소시키고 주파수 및 성능을 향상시킬 수 있다.
VII. 예시적인 블록 기반의 명령어 포맷
도 5는, 명령어 헤더(510), 일반 명령어(520), 및 분기 명령어(530)에 대한 명령어 포맷의 일반화된 예를 예시하는 도면이다. 명령어 헤더 또는 명령어의 각각은, 비트의 수에 따라 라벨링된다. 예를 들면, 명령어 헤더(510)는 네 개의 32 비트 워드를 포함하고 그것의 최하위 비트(least significant bit; lsb)(비트 0)로부터 최상위 비트(most significant bit; msb)(비트 127)까지 라벨링된다. 도시되는 바와 같이, 명령어 헤더는 기록 마스크 필드, 저장 마스크 필드, 다수의 종료 타입 필드, 다수의 실행 플래그 필드, 명령어 블록 사이즈 필드, 및 명령어 헤더 ID 비트(명령어 헤더의 최하위 비트)를 포함한다.
컴파일러는, 명령어 헤더(510)의 종료 타입 필드를 사용하여 하나 이상의 분기 종료 타입을 인코딩할 수 있다. 분기 종료 타입은, 다음 명령어 블록의 어드레스를 계산하기 위해, 명령어 블록을 실행하는 프로세서 코어에 의해 생성되는 신호와 함께 사용될 수 있다. 예를 들면, 프로세서 코어는 분기가 취해질 것이다는 것이 알려지자마자 분기 식별자 및 타겟 어드레스를 생성할 수 있다. 타겟 어드레스는, 이전 명령어 블록이 커밋되기 전에 다음 명령어 블록이 개시될 수 있도록, 명령어 블록이 커밋되기 전에 생성될 수 있다. 하나의 실시형태에서, 종료 타입 필드에 대해 18 비트가 예약될 수 있고, 그 결과, 1 내지 6 개의 상이한 3 비트 종료 타입이 헤더에서 인코딩될 수 있다. 런타임시, 명령어 블록을 실행하는 프로세서 코어는, 여섯 개의 종료 타입 필드 중 어떤 것을 사용할지를 분기 식별자 신호를 통해 나타낼 수 있다. 코어로부터의 분기 식별자 및 타겟 어드레스에 대응하는 종료 타입 필드는, 다음 명령어 블록의 어드레스를 계산하기 위해 사용될 수 있다.
이 실시형태에서, 3 비트 필드에 인코딩될 수 있는 여섯 개의 분기 종료 타입이 존재하는데, 이 경우 분기 종료 타입은: 널(null), 순차, 오프셋, 간접, 호출 및 리턴이다. 널의 분기 종료 타입은, 이 필드와 관련되는 분기가 없다는 것을 나타낼 수 있다. 여섯 개의 가능한 분기는 주어진 명령어 블록에 대해 인코딩될 수 있지만, 그러나 몇몇 명령어 블록은 여섯 개 미만의 분기를 가질 수도 있다. 예를 들면, 특정한 명령어 블록은 하나의 분기 타겟만을 가질 수도 있고, 그러므로 단지 제1 분기 종료 타입 필드만 널이 아닐 것이고 나머지 다섯 개의 필드는 널일 것이다. 다른 예로서, 특정한 명령어 블록은 두 개의 분기 타겟을 가질 수도 있고, 제1 분기 종료 타입 필드는 제1 술어 결과에 대응할 수 있고, 제2 분기 종료 타입 필드는 제2 술어 결과에 대응할 수 있고, 그리고 나머지 네 개의 필드는 널일 것이다.
순차의 분기 종료 타입은, 이 분기와 관련되는 다음 명령어 블록의 타겟 어드레스가, 현재 명령어 블록을 뒤따르는 명령어 블록의 어드레스이다는 것을 나타낼 수 있다. 예를 들면, 명령어의 순차적인 스트림이 명령어 윈도우 내의 명령어의 최대 수를 초과하는 경우, 명령어의 순차적인 스트림은, 메모리에서 인접하여(contiguously) 저장될 수 있는 다수의 명령어 블록으로 분할될 것이다. (종료하는 명령어 블록 이외의) 명령어 블록의 각각에 대한 분기 종료 타입은, 실행 동안, 상이한 명령어 블록의 명령어가 순차적으로 실행될 수 있도록 하는 순차적 종료 타입일 것이다. 다른 예로서, 명령어 블록은, 상이한 각각의 타겟 어드레스를 갖는 다수의 분기 중 하나를 잠재적으로 취할 수도 있다. 분기 중 하나가 다음 번 순차적 명령어 블록에 대한 것이면, 그 분기와 관련되는 분기 종료 타입은 순차적 타입으로서 인코딩될 수 있다.
오프셋의 분기 종료 타입은, 분기와 관련되는 다음 명령어 블록의 타겟 어드레스가 현재 실행하고 있는 명령어 블록으로부터 오프셋되어 있다는 것을 나타낼 수 있다. 오프셋은 컴파일시에, 예컨대 분기가 반복적인 또는 순환하는 구성에 기인할 때 알려질 수 있거나, 또는 오프셋은 명령어 블록의 실행 동안 수신되는 입력 또는 계산에 의존할 수 있다. 명령어 블록의 실행 동안, 관련된 분기에 대한 프로세서 코어에 의해 생성되는 타겟 어드레스는, 프로세서 코어 상에서 실행하고 있는 명령어 블록의 어드레스에 더해질 오프셋으로서 해석될 것이다. 대안적으로, 오프셋은, 프로세서 코어 상에서 실행하고 있는 명령어 블록을 순차적으로 뒤따르는 명령어 블록의 어드레스에 더해질 수 있다.
간접의 분기 종료 타입은, 분기와 관련되는 다음 명령어 블록의 타겟 어드레스가 명령어 블록 내의 명령어에 의해 결정된다는 것을 나타낼 수 있다. 예를 들면, 어드레스는 로드 명령어를 통해 메모리로부터 유래할 수도 있거나, 또는 명령어 블록 내에서 계산될 수도 있다. 타겟 어드레스를 저장하는 메모리 어드레스는 컴파일시에 알려질 수 있거나 명령어 블록의 실행 동안 수신되는 입력 또는 계산에 의존할 수 있다. 명령어 블록의 실행 동안, 관련된 분기에 대한 프로세서 코어에 의해 생성되는 타겟 어드레스는 다음 명령어 블록의 타겟 어드레스를 저장하는 메모리 어드레스로서 해석될 것이다.
호출의 분기 종료 타입은, 분기와 관련되는 다음 명령어 블록의 타겟 어드레스가 서브루틴의 어드레스이다는 것을 나타낼 수 있다. 서브루틴의 어드레스는 컴파일시에 알려질 수 있거나 또는 런타임시에, 예컨대 어드레스가 명령어 블록의 실행 동안 수신되는 입력 또는 계산에 의존할 때 생성될 수 있다. 명령어 블록의 실행 동안, 관련된 분기에 대한 프로세서 코어에 의해 생성되는 타겟 어드레스는 서브루틴 시작의 메모리 어드레스로서 해석될 것이다. 이 어드레스는 분기 예측기(branch predictor)와 같은 제어 로직에 의해 저장될 수 있다. 특히, 분기 예측기는, 하나 이상의 링크 레지스터 또는 서브루틴의 리턴 어드레스(들)를 저장하기 위한 스택을 포함할 수 있다. 분기 예측기는 링크 레지스터 값 또는 스택의 최상부를 사용하여, 리턴 종료 타입(return exit type)을 갖는 명령어 블록에 대한 타겟 어드레스를 예측할 수 있다.
리턴의 분기 종료 타입은, 분기와 관련되는 다음 명령어 블록의 타겟 어드레스가, 프로세서 코어 상에서 실행되고 있는 서브루틴의 리턴 어드레스이다는 것을 나타낼 수 있다. 서브루틴의 리턴 어드레스는 서브루틴이 호출될 때 런타임시에 생성된다. 하나의 실시형태에서, 리턴 어드레스는 제어 로직에 의해서만 유지될 수 있고, 실행 동안 프로세서 코어에 의해 생성되는 타겟 어드레스는 무시될 수 있다. 대안적인 실시형태에서, 서브루틴의 명령어 블록(들)은 리턴 어드레스를 유지할 수 있고, 관련된 분기에 대한 프로세서 코어에 의해 생성되는 타겟 어드레스는 서브루틴으로부터의 리턴 어드레스로서 해석될 것이다. 프로세서 코어 상에서 실행하고 있는 명령어 블록에 의해 생성되는 타겟 어드레스는, 링크 레지스터에 저장되는 어드레스와 비교될 수 있다.
다른 분기 종료 타입 및 분기 정보가 가능하며 명령어 블록의 각각의 헤더 내의 더 많은 또는 더 적은 비트를 가지고 인코딩될 수 있다는 것이 이해되어야 한다. 예를 들면, 분기 정보는, 예컨대 컴파일러가 프로그램의 정적 분석으로부터 타겟 어드레스를 생성할 수 있을 때, 미리 결정된 타겟 어드레스를 포함할 수 있다. 또 다른 예로서, 분기 종료 타입은, 다수 회 실행될 수도 있는 블록을 나타내기 위한 루프, 시작 루프(begin-loop) 또는 종료 루프(end-loop)일 수 있는데, 이 경우, 루프 타입은, 블록이 그 자체로 되돌아 올 수 있다는 것을 나타낼 수 있고(단일 블록 루프), 시작 루프 타입은, 다중 블록 루프의 시작 블록을 나타낼 수 있고, 종료 루프 타입은 다중 블록 루프의 종료 블록을 나타낼 수 있다. 분기 정보는, 예를 들면, 루프가 고정된 횟수를 실행하는지의 여부 및 루프가 얼마나 자주 실행하는지를 포함할 수 있다.
컴파일러는 명령어 헤더(510)의 "X 플래그" 필드를 사용하여 실행 플래그를 인코딩할 수 있다. X 플래그는 명령어 블록에 대한 임의의 특수 실행 요건을 인코딩하기 위해 사용될 수 있다. 요건은, 명령어 블록 내에서 사용되는 임의의 특수 하드웨어 리소스(예컨대 코어가 상이한 모드를 갖는 경우 또는 상이한 타입의 코어가 블록 기반의 프로세서 상에서 이용 가능한 경우), 블록 기반의 프로세서의 제어 로직에 대한 컴파일러 힌트 또는 커맨드, 및/또는 디버그 기능성을 명시할 수 있다. 하나의 실시형태에서, 플래그는 다음을 나타내기 위한 비트를 포함할 수 있다: 벡터 모드로 구성되는 코어의 사용; 분기 예측기의 금지; 메모리 의존성 예측기 금지; 블록 동기화 필요성; 블록 다음의 휴지기(break after block); 및 블록 이전의 휴지기(break before block). 다른 실행 플래그가 가능하며 각각의 명령어 블록의 헤더 내에 인코딩될 수 있다는 것이 이해되어야 한다.
예시된 일반 블록 명령어(520)는 하나의 32 비트 워드로서 저장되고, 연산코드(opcode) 필드, 술어 필드, 브로드캐스트 ID 필드(broadcast ID field; BID), 제1 타겟 필드(T1), 및 제2 타겟 필드(T2)를 포함한다. 타겟 필드보다 더 많은 소비자를 갖는 명령어의 경우, 컴파일러는 이동 명령어를 사용하여 팬아웃 트리(fanout tree)를 구축할 수 있거나, 또는 브로드캐스트에 높은 팬 아웃 명령어(high-fanout instruction)를 할당할 수 있다. 브로드캐스트는 경량의 네트워크(lightweight network)를 거쳐 코어의 임의의 수의 소비자 명령어(consumer instruction)로 피연산자를 전송하는 것을 지원한다. 브로드캐스트 식별자는 일반 블록 명령어(520)에서 인코딩될 수 있다.
일반 명령어(520)에 의해 개략적으로 개설되는 일반 명령어 포맷이 블록 기반의 프로세서에 의해 프로세싱되는 명령어의 일부 또는 전부를 나타낼 수 있지만, 기술 분야에서 숙련된 자는, ISA의 특정한 예에 대해서 조차도, 명령어 필드 중 하나 이상이 특정 명령어에 대한 일반 포맷으로부터 벗어날 수도 있다는 것을 쉽게 이해할 것이다. 연산코드 필드는, 메모리 판독/기록, 레지스터 로드/저장, 가산, 감산, 곱셈, 나눗셈, 시프트, 회전, 시스템 연산, 또는 다른 적절한 명령어와 같은 명령어(520)에 의해 수행되는 연산(들)을 명시한다. 술어 필드는 명령어가 실행될 조건을 명시한다. 예를 들면, 술어 필드는 "참" 값을 명시할 수 있고 명령어는 대응하는 조건 플래그가 명시된 술어 값과 매치하는 경우에만 실행할 것이다. 몇몇 예에서, 술어 필드는, 적어도 부분적으로, 술어를 비교하기 위해 어떤 것이 사용되는지를 명시하고, 다른 예에서, 실행은 이전 명령어(예를 들면, 명령어 블록에서의 선행 명령어)에 의해 설정되는 플래그에 기초한다. 몇몇 예에서, 술어 필드는, 명령어가 항상 실행될 것이거나, 또는 절대 실행되지 않을 것이다는 것을 명시할 수 있다. 따라서, 술어 필드의 사용은, 분기 명령어의 수를 감소시키는 것에 의해, 더 조밀한 오브젝트 코드, 향상된 에너지 효율성, 및 향상된 프로세서 성능을 허용할 수 있다.
타겟 필드 T1 및 T2는 블록 기반의 명령어의 결과가 전송되는 명령어를 명시한다. 예를 들면, 명령어 슬롯 5의 ADD 명령어는, 자신의 계산된 결과가 슬롯 3 및 10에서 명령어로 전송될 것이다는 것을 명시할 수 있다. 특정한 명령어 및 ISA에 따라, 예시된 타겟 필드 중 하나 또는 둘 모두는 다른 정보로 대체될 수 있는데, 예를 들면, 제1 타겟 필드 T1은 즉시 피연산자, 추가적인 연산코드에 의해 대체될 수 있고, 두 개의 타겟을 명시할 수 있고, 등등을 할 수 있다.
분기 명령어(530)는 연산코드 필드, 술어 필드, 브로드캐스트 ID 필드(BID), 및 오프셋 필드를 포함한다. 연산코드 및 술어 필드는 일반 명령어와 관련하여 설명되는 것과 형식 및 기능에서 유사하다. 오프셋은 몇몇 예에서 네 개의 명령어 블록에서 표현될 수 있고, 따라서 분기가 실행될 수 있는 메모리 어드레스 범위를 확장시킨다. 일반 명령어(520) 및 분기 명령어(530)으로 나타내어지는 술어는, 명령어 블록 내의 명령어가 방향성 비순환 그래프(directed acyclic graph; DAG)를 형성하도록 사용될 수 있다. 예를 들면, 특정한 명령어의 실행은 이전 명령어의 결과(예를 들면, 두 개의 피연산자의 비교)에 기초할 수 있다. 술어가 거짓이면, 명령어는 특정한 명령어에 의해 계산되는 값을 커밋하지 않을 것이다. 술어 값이 필수 술어와 매치하지 않으면, 명령어는 발행되지 않는다. 예를 들면, 거짓 술어 값이 전송되면 BRO_F(술어화된 거짓(predicated false)) 명령어가 발행될 것이다.
본원에서 사용되는 바와 같이, 용어 "분기 명령어"는 프로그램 실행을 상대적인 메모리 위치로 변경하는 것으로 제한되는 것이 아니고, 절대 또는 기호 메모리 위치로의 점프, 서브루틴 호출 및 리턴, 및 실행 플로우를 수정할 수 있는 다른 명령어를 또한 포함한다. 몇몇 예에서, 실행 플로우는 시스템 레지스터(예를 들면, 프로그램 카운터(program counter; PC) 또는 명령어 포인터)의 값을 변경하는 것에 의해 수정되는 반면, 다른 예에서, 실행 플로우는 메모리의 지정된 위치에 저장되는 값을 수정하는 것에 의해 변경될 수 있다. 몇몇 예에서, 점프 레지스터 분기 명령어는 레지스터에 저장되는 메모리 위치로 점프하기 위해 사용된다. 몇몇 예에서, 서브루틴 호출 및 리턴은, 각각, 점프와 링크 및 점프 레지스터 명령어를 사용하여 구현된다.
VIII. 예시적인 컴파일러 방법
도 6은 블록 기반의 컴퓨터 아키텍쳐로 컴파일하기 위한 예시적인 방법(600)을 예시하는 플로우차트이다. 610에서, 컴파일러는 명령어 블록으로 그룹화되는 명령어 스트림을 생성할 수 있다. 컴파일러는 하이 레벨의 소스 코드(예컨대, C, C ++ 또는 Java)를, 타겟으로 삼은 블록 기반의 프로세서 상에서 실행 가능한 로우 레벨의 머신 코드로 변환할 수 있다. 머신 코드는, 컴퓨터의 하드웨어 리소스 및 코드의 제어 플로우에 따라 그룹화될 수 있는 명령어의 순차적인 스트림으로서 생성될 수 있다. 예를 들면, 생성된 머신 코드는 복수의 기본 블록을 포함할 수 있다. 기본 블록은 코드의 블록일 수 있는데, 이 경우, 제어는 블록의 제1 명령어에서만 블록에 진입할 수 있고 제어는 기본 블록의 마지막 명령어에서만 블록을 떠날 수 있다. 따라서, 기본 블록은 함께 실행되는 일련의 명령어이다. 주어진 명령어 블록은, 타겟으로 삼은 컴퓨터의 하드웨어 리소스 및 ISA의 제약 내에서 명령어 블록이 실행될 수 있는 한, 단일의 기본 블록, 기본 블록의 일부, 또는 다수의 블록일 수 있다.
명령어 블록의 사이즈 및 콘텐츠에 대한 제약은, 예를 들면, 프로세서 코어의 명령어 윈도우의 최대 사이즈, 레지스터 액세스의 최대 횟수, 로드/저장 액세스의 최대 횟수, 및 분기의 최대 횟수를 포함할 수 있다. 명령어 블록에서의 명령어 수는, 프로세서 코어의 명령어 윈도우 내에서 실행될 수 있는 명령어 수를 초과할 수 없다. 따라서, 명령어의 최대 수는, 타겟 프로세서의 명령어 윈도우 사이즈에 따라 128, 64 또는 32 개의 명령어일 수 있다. 몇몇 기본 블록은 명령어 윈도우보다 더 작을 수도 있다. 코어를 보다 효율적으로 사용하기 위해, 작은 기본 블록은, 결합된 기본 블록 사이의 분기를 데이터플로우 명령어로 변환하는 것에 의해 하나 이상의 다른 기본 블록과 결합될 수도 있다. 특히, 제1 기본 블록으로부터 제2 기본 블록(병합될 기본 블록)으로의 분기는, 술어를 계산하기 위한 명령어로 변환될 수 있고, 제2 기본 블록의 명령어는 술어 계산의 결과에 기초할 수 있다. 대안적으로, 몇몇 기본 블록은 명령어 윈도우보다 더 클 수도 있고 따라서 이들 기본 블록은 다수의 명령어 블록으로 분할될 수 있고, 그 결과 어떠한 명령어 블록도 최대 명령어 윈도우 사이즈보다 더 크지 않다. 주어진 명령어 윈도우에 대한 레지스터 또는 로드/저장 액세스의 횟수를 초과하면, 기본 블록은 다수의 명령어 블록으로 또한 분할될 수도 있다.
620에서, 주어진 명령어 블록에 대한 하나 이상의 종료 타입 및/또는 컴파일러 힌트가 결정될 수 있다. 예를 들면, 반복 카운트, 및 미리 결정된 타겟 어드레스와 같은 분기 정보 및 각각의 잠재적인 분기에 대한 분기 종료 타입이 결정될 수 있다. 도 5를 참조하여 상기에서 설명되는 바와 같이, 종료 타입의 예는, 명령어 블록의 제어 플로우에 따라, 널, 순차, 오프셋, 간접, 호출 및 리턴일 수 있다. (예컨대 다수의 기본 블록이 주어진 명령어 블록으로 결합되는 경우) 주어진 명령어 블록에서 단일의 분기 또는 다수의 분기가 가능할 수 있지만, 명령어 블록의 실행 동안 분기 중 하나만이 취해질 것이다. 잠재적인 분기의 각각은 상이한 종료 타입을 가질 수 있다. 잠재적인 분기의 각각은 식별자를 할당 받을 수 있고, 분기에 대응하는 종료 타입은 식별자에 대응하는 필드에서 인코딩될 수 있다. 예를 들면, 분기 0에 대한 종료 타입은 필드 0에서 인코딩될 수 있고 분기 1에 대한 종료 타입은 필드 1에서 인코딩될 수 있다.
630에서, 주어진 명령어 블록에 대한 헤더가 생성될 수 있다. 헤더는 주어진 명령어 블록에 대한 종료 타입 및 임의의 컴파일러 힌트를 포함할 수 있다. 도 5의 명령어 헤더(510)는 명령어 헤더의 하나의 예이다. 헤더는, 명령어 헤더(510)에 의해 도시되는 바와 같이, 고정된 사이즈일 수 있거나, 또는 헤더는 가변 사이즈일 수 있다. 예를 들면, 명령어 블록의 타겟 어드레스가 정적으로 계산될 수 있다면, 헤더는 미리 결정된 타겟 어드레스를 포함하도록 확장될 수 있다. 헤더의 사이즈는, 예를 들면, 헤더의 제1 워드의 하나 이상의 비트에서 인코딩될 수 있다.
640에서, 타겟 어드레스 계산은 주어진 명령어 블록에서 더 빠르도록 진전될 수 있다. 타겟 어드레스 계산을 진전시키는 것에 의해, 타겟 어드레스 계산이 진전되지 않는 경우보다 더 빨리 다음 명령어 블록이 페치되고 실행될 수 있다. 따라서, 현재 명령어 블록은, 잠재적으로, 다음 명령어 블록과 병렬로 실행될 수 있고, 블록 기반의 프로세서의 성능은 잠재적으로 증가될 수 있다. 이것은 종래의 ISA와는 대조적인데, 종래의 ISA에서는, 일반적으로, 기본 블록 내에서 실행되는 마지막 명령어가 다음 기본 블록의 타겟 어드레스로의 분기가 될 것이다(또는 루프의 경우 동일한 기본 블록의 시작으로 되돌아 갈 것이다). 몇몇 ISA는, 채워질 수 있는 만큼의 많은 지연 슬롯만큼 분기 명령어가 마지막 명령어보다 선행하도록 분기 지연 슬롯 또는 슬롯들을 노출시킬 수도 있다. 그러나, 분기 지연 슬롯의 사용은, 분기 지연 슬롯의 수가 프로세서의 파이프라인 스테이지의 수보다 더 적어야만 하기 때문에 제한되며, 통상적으로 하나 및 때로는 2이다. 따라서, 종래의 ISA에서는, 페치 및 디코드 로직이 직렬화 포인트로서 작용하기 때문에 제어 플로우는 기본 블록의 끝 또는 거의 끝까지 기본 블록을 실행하는 것으로부터 전환될 수 없다.
그러나, 다수의 프로세서 코어 및/또는 명령어 윈도우를 포함하는 블록 기반의 프로세서는, 잠재적으로, 주어진 명령어 블록의 타겟 어드레스 계산이, 블록의 끝으로부터 분리되는 것 및 실행의 더 이른 시간으로 승격 또는 진전되는 것을 가능하게 할 수 있다. 예를 들면, 타겟 어드레스가 계산된 이후, 주어진 명령어 블록은 프로세서 코어의 자신의 할당된 리소스를 사용하여 계속 실행될 수 있고, 한편 타겟 어드레스에서 시작하는 다음 명령어 블록은 동일한 또는 상이한 프로세서 코어의 상이한 리소스 상에서 개시된다. 따라서, 명령어 스트림이 원자적으로 실행된 명령어 블록으로 그룹화되고, 이들 명령어 블록을 실행하기 위한 병렬 리소스가 제공되기 때문에, 블록 기반의 프로세서의 타겟 어드레스 계산은, 분기 지연 슬롯을 사용하여 가능한 것보다 더 빠르도록 주어진 명령어 블록에서 진전될 수 있어서, 잠재적으로 더 많은 작업이 병렬로 수행되는 것을 허용하게 된다. 예를 들면, 블록 기반의 아키텍쳐에서, 타겟 어드레스 계산은, 타겟 어드레스를 계산하는 것이 명령어 블록의 다른 명령어에 의존하지 않는다면, 명령어 블록의 제1 명령어로 진전될 수 있다.
도 7은 명령어 블록(700)의 다양한 양태를 예시하고 컴파일러가 타겟 어드레스 계산을 명령어 블록(700)에서 어떻게 더 빠르도록 진전시킬 수 있는지의 예를 도시한다. 명령어 블록(700)은, 헤더(710), 데이터 지향 명령어(720), 및 제어 지향 명령어(730)를 포함할 수 있다. 데이터 지향 명령어(720)는 데이터를 계산하기 위한, 입력 데이터를 수신하기 위한, 및/또는 출력 데이터를 생성하기 위한 명령어를 포함할 수 있다. 예를 들면, 데이터 지향 명령어(720)는: 데이터에 대해 수학적 또는 논리적 연산을 수행하기 위해; 입력 디바이스, 레지스터 또는 메모리로부터 데이터를 판독하기 위해; 및/또는 출력 디바이스, 레지스터, 또는 메모리에 데이터를 기록하기 위해 사용될 수 있다. 제어 지향 명령어(730)는, 어떤 명령어 블록이 실행되고 어떤 순서로 실행되는지와 같은 프로그램의 제어 플로우를 결정하기 위한 명령어를 포함할 수 있다. 설명의 용이성을 위해, 데이터 지향 명령어(720) 및 제어 지향 명령어(730)는 명령어 블록(700) 내에서 명령어의 별개의 블록으로서 예시된다. 그러나, 데이터 지향 및 제어 지향 명령어는 명령어 블록(700) 내에서 혼합될 수 있다는 것이 이해되어야 한다. 또한, 몇몇 명령어는 데이터 지향 명령어(720) 및 제어 지향 명령어(730) 둘 다의 특성을 가질 수도 있다. 예를 들면, 몇몇 제어 플로우 결정은, 계산 이후 또는 데이터가 입력된 이후의 데이터 값에 의존한다.
컴파일러는 서로에 대해 상대적인 순서로 프로그램의 명령어를 방출할 수 있다. 몇몇 경우에, 적절한 프로그램 동작을 위해, 명령어 사이의 상대적 실행 순서는 유지되어야만 한다. 예를 들면, 몇몇 명령어는, 다른 명령어에 의해 소비되는 결과를 생성한다. 소비하는 명령어(consuming instruction)는, 소비하는 명령어가 생성하는 명령어(producing instruction)의 결과를 사용하기 때문에, 생성하는 명령어에 데이터 종속적이다. 따라서, 생성하는 명령어는 소비하는 명령어 이전에 실행되어야만 한다. 다른 예로서, 몇몇 명령어는 다른 명령어가 실행되는지의 여부를 결정 또는 제어한다. 제어된 명령어(controlled instruction)가 실행되는지의 여부를, 제어하는 명령어(controlling instruction)의 결과가 결정하기 때문에, 제어된 명령어는 제어하는 명령어에 제어 종속적이다. 대안적으로, 몇몇 명령어는, 이들 명령어의 실행이 서로에 대해 영향을 미치지 않을 때 서로 독립적일 수 있다. 독립적인 명령어는 기능성에서의 변경 없이 다수의 상이한 순서로 실행될 수 있다.
명령어 블록(700)은 타겟 어드레스 0을 계산하기 위한 명령어(들)(750)를 포함할 수 있고, 컴파일러는 명령어 블록(700)에서 명령어(들)(750)를 더 빠르도록 진전시킬 수 있다. 타겟 어드레스는, 실행할 다음 명령어 블록의 시작 어드레스를 결정하기 위해 사용될 수 있다. 각각의 명령어 블록은 하나 이상의 종료 포인트(exit point)를 포함할 수 있는데, 이 경우, 각각의 종료 포인트는 상이한 타겟 어드레스를 가리킬 수 있다.
특정한 예로서, 명령어 블록은, 예컨대 기본 블록이 명령어 윈도우보다 더 많은 명령어를 갖는 경우, 기본 블록의 일부일 수 있다. 명령어 블록(700)이 기본 블록의 일부인 경우, 실행할 다음 명령어 블록이 명령어 블록의 시퀀스에서 다음 명령어 블록일 것이기 때문에, 단지 하나의 종료 포인트가 존재한다. 타겟 어드레스는 컴파일시 다음 번 순차적인 명령어 블록의 어드레스로서 계산될 수 있다. 따라서, 타겟 어드레스는 순차의 종료 타입을 사용하여 헤더(710) 내에서 식별될 수 있다. 다시 말하면, 타겟 어드레스의 계산은, 헤더(710)가 디코딩될 때 그리고 명령어 블록의 다른 명령어가 실행되기 이전에 타겟 어드레스가 계산될 수 있도록, (원호(752)에 의해 도시되는 바와 같이) 헤더(710)로 진전될 수 있다. 타겟 어드레스 계산을 헤더로 진전시키는 것에 의해, 헤더가 디코딩되자마자 다음 명령어 블록이 비추측적으로 페치될 수 있다.
명령어 블록(700)이 단일의 기본 블록인 경우, 명령어 블록(700) 밖에 하나 이상의 타겟 어드레스가 존재할 수 있다. 예를 들면, 명령어 블록(700)은, 기본 블록이, 서브루틴 호출과 같은 무조건부 분기에서 끝날 때, 단일의 타겟 어드레스를 가질 수 있다. 타겟 어드레스가 컴파일 시간에 알려지면, 분기 정보는 호(752)에 의해 도시되는 바와 같이 헤더(710)로 진전될 수 있다. 그러나, 타겟 어드레스 계산이 제어 지향 명령어(730)와 같은, 명령어 블록(700) 내에서 실행되는 명령어에 의존하는 경우, 타겟 어드레스 계산 및 타겟 어드레스 계산이 의존하는 명령어는, 원호(754)에 의해 도시되는 바와 같이, 모든 데이터 지향 명령어(720) 앞으로 진전될 수 있다. 대안적으로, 타겟 어드레스 계산 및 타겟 어드레스 계산이 의존하는 명령어는, 데이터 지향 명령어(720)의 몇몇 앞으로 진전될 수 있다. 예를 들면, 명령어가 다음 명령어 블록에 대해 페치되기 이전에 현재 블록의 메모리 액세스가 수행되도록, 현재 명령어 블록(700)의 일부 또는 모든 메모리 로드 명령어가 타겟 어드레스 계산에 앞서 우선시될 수 있다.
명령어 블록(700)은 다수의 각각의 잠재적인 타겟 어드레스를 계산하기 위한 다수의 명령어(예를 들면, 750, 770)를 포함할 수 있고, 컴파일러는 명령어 블록(700)에서 명령어(750, 770) 중 하나 이상을 더 빠르도록 진전시킬 수 있다. 예를 들면, 조건부 분기가 프로그램으로 하여금 조건이 참이면 하나의 타겟 어드레스로 그리고 조건이 거짓이면 상이한 타겟 어드레스로 흐르게 할 수 있다. 예를 들면, 소스 코드는 다음을 명시할 수 있다:
Figure pct00001
여기서 조건 1은 조건 0의 역이다. 블록 기반의 아키텍쳐에서, 조건 또는 술어는, 제어 지향 명령어(730)에서와 같이, 하나의 명령어에서 평가될 수 있다. 제어 종속적 명령어는 평가의 결과에 기초할 수 있다. 특정한 예로서, 제어 지향 명령어(730)에서 테스트 명령어는 조건 0에 대해 테스트할 수 있다. 조건 0이 평가되고 조건 0이 참인 경우, 조건 0에 기초한 명령어(들)(740) 및 타겟 어드레스 0을 계산하기 위한 명령어(들)(750)가 실행될 수 있다. 조건 0이 참이 아니면(예를 들면, 조건 1이 참이면), 조건 1에 기초한 명령어(들)(760) 및 타겟 어드레스 1을 계산하기 위한 명령어(들)(770)가 실행될 수 있다. 원호(756)에 의해 도시되는 바와 같이, 컴파일러는 타겟 어드레스 0을 계산하기 위한 명령어(들)(750)를, 조건 0에 기초한 명령어(들)(740)의 일부 또는 전부보다 더 빠르도록 진전시킬 수 있다. 특히, 컴파일러는 명령어(들)(750) 및 명령어(들)(750)가 의존하는 명령어를, 명령어(들)(750)와는 독립적인 모든 예측된 명령어(740) 앞으로 진전시킬 수 있다. 마찬가지로, 원호(772)에 의해 도시되는 바와 같이, 컴파일러는 타겟 어드레스 1을 계산하기 위한 명령어(들)(770)를, 조건 1에 기초한 명령어(들)(760)의 일부 또는 전부보다 더 빠르도록 진전시킬 수 있다.
컴파일 이후, 명령어는, 프로그램을 실행하기 위한 블록 기반의 프로세서에 의해 명령어가 검색될 수 있도록, 컴퓨터 판독 가능한 메모리에 저장될 수 있다. 다음의 예는 블록 기반의 프로세서 상에서의 실행을 설명한다.
IX. 타겟 어드레스에 대한 조기(early) 액세스를 제공하는 예
도 8은, 블록 기반의 컴퓨터 아키텍쳐 상에서의 명령어의 실행을 제어하기 위한 방법(800)의 예를 예시하는 플로우차트이다. 예를 들면, 방법(800)은 블록 기반의 프로세서의 제어 로직에 의해 사용될 수 있다. 제어 로직은, 예를 들면, 블록 기반의 프로세서 외부의 컨트롤러에서 구현될 수 있거나, 블록 기반의 프로세서의 애플리케이션 고유의 하드웨어(예컨대 특수 목적의 제어 유닛 또는 분산형 로직 게이트) 내에서 구현될 수 있거나, 또는 블록 기반의 프로세서의 하나 이상의 프로세서 코어 내에서 코드로서 실행될 수 있다. 방법(800)은, 다수의 명령어 블록이 비추측적으로 병렬로 실행될 수 있도록, 제어 로직에 다음 명령어 블록의 타겟 어드레스에 대한 조기 액세스를 제공하기 위해 사용될 수 있다.
810에서, 제1 명령어 블록의 명령어 헤더가 페치되고 적어도 부분적으로 디코딩된다. 예를 들면, 제1 명령어 블록은, 명령어 캐시, 통합 명령어/데이터 레벨 1(L1) 캐시, 레벨 2(L2) 캐시, 및/또는 메인 메모리(예를 들면, 온 칩 메모리 및/또는 외부 메모리)를 포함할 수도 있는 메모리 시스템으로부터 페치될 수 있다. 명령어 헤더는 명령어 블록의 사이즈 및 하나 이상의 종료 타입을 포함할 수 있는데, 이 경우, 각각의 종료 타입은 명령어 블록으로부터의 잠재적인 분기에 대응한다. 제1 명령어 블록은, 제1 명령어 블록의 시작 어드레스에서 시작하는 메모리로부터 페치된다. 제1 명령어 블록의 사이즈는, 다음 번 순차적인 명령어 블록의 시작 어드레스를 계산하기 위해, 제1 명령어 블록의 시작 어드레스에 가산될 수 있다. 제1 명령어 블록의 사이즈는, 제1 명령어 블록이 매핑될 수 있는 곳을 결정하기 위해 이용 가능한 리소스에 비교될 수 있다.
820에서, 제1 명령어 블록은 블록 기반의 프로세서의 프로세서 코어에 매핑될 수 있다. 매핑된 명령어 블록은, 주어진 프로세서 코어 상에서 실행하도록 현재 할당되는 블록이다. 블록 기반의 프로세서에는 유한한 수의 동질성 또는 이질성 프로세서 코어를 포함한다. 통상적인 프로그램이, 프로세서 코어 상으로 들어갈 수 있는 것보다 더 많은 명령어 블록을 포함할 수 있다. 따라서, 프로그램의 각각의 명령어 블록은, 일반적으로, 프로그램 코어를, 프로그램의 다른 명령어 블록과 공유할 것이다. 다시 말하면, 주어진 코어는, 프로그램의 실행 동안 여러 가지 상이한 명령어 블록의 명령어를 실행할 수도 있다. 유한한 수의 프로세서 코어를 갖는다는 것은 또한, 모든 프로세서 코어가 명령어 블록을 실행하느라 바쁘고 디스패치를 위해 새로운 코어를 사용할 수 없을 때, 프로그램의 실행이 멈출 수도 있거나 또는 지연될 수도 있다는 것을 의미한다. 프로세서 코어가 이용 가능하게 되면, 명령어 블록의 인스턴스는 프로세서 코어에 매핑될 수 있다.
제어 로직은, 어떤 프로세서 코어 상에서 어떤 명령어 블록이 실행할 것인지 및 명령어 블록이 언제 실행될 것인지를 할당하기 위한 명령어 블록 스케줄러를 포함할 수 있다. 매핑은, 실행을 위해 사용될 타겟 에너지, 프로세서 코어의 수 및 구성, 프로세서 코어의 현재 및/또는 과거 사용량, 프로그램의 동적 플로우, 추측성 실행이 인에이블되는지의 여부, 추측성 블록이 실행될 신뢰도 레벨, 및 다른 요인과 같은 다양한 요인에 기초할 수 있다. 명령어 블록의 인스턴스는, 현재 이용 가능한 프로세서 코어에 매핑될 수 있다(예컨대 현재 어떠한 명령어 블록도 프로세서 코어 상에서 실행되고 있지 않는 경우). 하나의 실시형태에서, 명령어 블록의 인스턴스는 현재 사용 중인 프로세서 코어에 매핑될 수 있고(예컨대 코어가 명령어 블록의 상이한 인스턴스를 실행하고 있는 경우), 나중에 매핑된 인스턴스는, 더 일찍 매핑된 인스턴스가 완료되는 경우 시작할 수 있다. 다른 예로서, 명령어 블록의 인스턴스는 프로세서 코어 내의 자유 명령어 윈도우에 매핑될 수 있다.
명령어 블록이 특정한 프로세서 코어에 매핑되는 경우, 명령어 블록은 인플라이트(in-flight)이다. 인플라이트 명령어 블록은, 블록 기반의 프로세서의 특정한 코어를 타겟으로 하는 블록이며, 블록은 특정 프로세서 코어 상에서, 추측적으로 또는 비추측적으로, 실행될 것이거나 또는 실행 중일 것이다. 프로그램이 실행 중인 명령어 블록에 의해 제공되는 작업을 사용할 것이다는 것이 블록의 매핑 동안 알려지는 경우, 블록은 비추측적으로 실행된다. 프로그램이 실행 중인 명령어 블록에 의해 제공되는 작업을 사용할 것인지 또는 사용하지 않을 것인지의 여부가 매핑 동안 알려지지 않는 경우, 블록은 추측적으로 실행된다. 추측적으로 블록을 실행하는 것은, 예컨대 블록의 작업이 사용될 것이다는 것이 알려진 이후 또는 알려질 때 블록이 시작되는 경우보다 더 빠르게 추측성 블록이 시작되는 경우, 성능을 잠재적으로 증가시킬 수 있다. 그러나, 추측적으로 실행하는 것은, 예컨대 추측성 작업이 프로그램에 의해 사용되지 않는 경우, 프로그램을 실행할 때 사용되는 에너지를 잠재적으로 증가시킬 수 있다.
명령어 블록이 특정한 프로세서 코어에 매핑된 이후, 명령어 블록은 특정한 프로세서 코어에 의해 페치, 디코딩, 및 실행될 수 있다. 페치하는 것은, 메모리로부터 및 특정한 프로세서 코어의 버퍼 또는 레지스터 안으로 명령어 블록의 명령어를 로딩하는 것을 포함할 수 있다. 페치하는 것은, 프로세서 코어가 파이프라인식으로 연결될 때 디코딩 및 실행과 중첩할 수 있다. 명령어 블록의 명령어가 프로세서 코어 상으로 로딩되는 경우, 명령어 블록은 프로세서 코어 상에 상주한다. 명령어 블록은, 명령어 블록의 전부가 아닌 일부의 명령어가 로딩되는 경우, 부분적으로 상주한다. 명령어 블록의 모든 명령어가 로딩되는 경우 명령어 블록은 완전히 상주할 것이다. 명령어 블록은, 프로세서 코어가 리셋될 때까지 또는 상이한 명령어 블록이 프로세서 코어 상으로 페치될 때까지, 프로세서 코어 상에 상주할 것이다. 디코딩은, 페치된 명령어를, 상대적으로 조밀한 머신 코드로부터, 프로세서 코어의 하드웨어 리소스를 제어하기 위해 사용될 수 있는 덜 조밀한 표현으로 변환하는 것을 포함할 수 있다. 디코딩된 명령어는 프로세서 코어의 명령어 윈도우 내에 저장되며, 명령어의 피연산자가 준비되는 경우 그리고 코어의 리소스가 명령어를 실행하는 데 이용 가능한 경우, 실행될 수 있다. 일반적으로, 코어 상에서 실행되는 명령어는, 코어 밖의 아키텍쳐 상태가 업데이트되는 커밋 단계에 코어가 들어갈 때까지, 코어의 로컬 상태만을 업데이트한다. 그러나, 다음 명령어 블록의 타겟 어드레스를 생성하는 명령어는, 명령어 블록이 커밋되기 이전에 제어 로직과 통신할 수 있다. 특히, 다음 명령어 블록의 타겟 어드레스 및 분기 식별자는, 명령어 블록이 커밋되기 이전에 제어 로직으로 전달될 수 있다. 예를 들면, 블록의 타겟 어드레스가 오프셋을 갖는 분기 또는 오프셋 명령어를 갖는 호출에 의해 결정되는 경우, 타겟 어드레스는 타겟 블록이 디코딩될 때 결정될 수도 있다.
830에서, 제1 명령어 블록이 커밋하기 이전에 제1 명령어 블록으로부터의 타겟 어드레스(및 분기 식별자)는 제어 로직에 의해 수신될 수 있다. 수신된 타겟 어드레스는, 제2 명령어 블록의 시작 어드레스가 계산될 수 있도록, 분기 식별자에 대응하는 종료 타입에 따라 해석될 것이다. 예를 들면, 타겟 어드레스는, 수신된 분기 식별자에 대응하는 종료 타입에 따라, 오프셋 또는 서브루틴 어드레스로서 해석될 수 있다. 제2 명령어 블록은 프로그램 순서에서 다음 번 명령어 블록이고, 따라서 그것은 비추측성 명령어 블록이다.
840에서, 제2 명령어 블록의 명령어의 실행이 개시될 수 있다. 제2 명령어 블록의 실행을 개시하는 것은: 제2 명령어 블록을 블록 기반의 아키텍쳐의 L1 캐시로 프리페치하는 것; 제2 명령어 블록의 헤더를 프리페치하는 것; 상기 제2 명령어 블록의 헤더를 디코딩하는 것; 제2 명령어 블록을 프로세서 코어에 매핑하는 것; 제2 명령어 블록을 블록 기반의 아키텍쳐의 제2 코어의 명령어 윈도우로 페치하는 것; 제2 명령어 블록을 블록 기반의 아키텍쳐의 제1 코어의 명령어 윈도우로 페치하는 것; 제2 코어 상에 로딩되는 제2 명령어 블록을 리프레시하는 것; 제2 명령어 블록의 하나 이상의 명령어를 디코딩하는 것; 및/또는 제2 명령어 블록의 하나 이상의 명령어를 디코딩 및/또는 실행하는 것을 포함할 수 있다. 명령어 블록이 명령어 블록의 반복마다 하나의 종료 포인트만을 따르기 때문에, 명령어 블록 내의 다른 명령어가 실행 중이더라도, 취해진 종료 포인트에 대한 술어가 결정되면 다음 명령어 블록의 페치 및 실행은 시작될 수 있다. 예를 들면, 술어화된 및/또는 술어화되지 않은 레지스터 및/또는 메모리 기록은, 다음 명령어 블록으로의 분기를 명확하게 취한 이후에도 계속 이루어질 수 있다.
명령어 블록은, 예컨대 명령어 블록이 루프의 서브루틴 또는 바디를 실행하도록 매핑되는 경우, 반복적으로 실행될 수 있다. 제2 명령어 블록은 이미 블록 기반의 프로세서의 코어에 상주할 수 있고 따라서 코어를 리프레시하는 것은, 제2 명령어 블록을 다시 페치하고 다시 디코딩하는 데 사용될 시간과 에너지를 절약할 수 있다. 본원에서 사용되는 바와 같이, 명령어 블록 리프레시 또는 프로세서 코어 리프레시는, 프로세서 코어가, 프로세서 코어 상에 상주하는 하나 이상의 명령어 블록을 재실행하는 것을 가능하게 하는 것을 의미한다. 하나의 실시형태에서, 코어를 리프레시하는 것은 하나 이상의 명령어 블록에 대한 활성 준비 상태(active-ready state)를 리셋하는 것을 포함할 수 있다. 따라서, 블록이 리프레시될 때, 활성 준비 상태가 클리어되는 동안 디코딩된 명령어 및 디코딩된 준비 상태는 유지될 수 있다. 명령어 블록이 반복된 서브루틴 또는 루프의 일부인 경우 또는 추측성 블록이 종료되어 다시 실행되는 경우, 동일한 프로세서 코어 상에서 명령어 블록을 재실행하는 것이 바람직할 수도 있다. 리프레시하기 위한 결정은 프로세서 코어 자체에 의해(연속적인 재사용) 또는 프로세서 코어 외부에 의해(불연속적인 재사용), 예컨대 명령어 블록 스케줄링을 수행하는 제어 로직에 의해 이루어질 수 있다.
850에서, 공유 리소스에 대한 액세스 요청은, 공유 리소스에 대해 더 오래된 및/또는 비추측성 명령어 블록이, 더 새로운 및/또는 더욱 추측성 명령어 블록보다 더 높은 우선 순위를 가지도록, 우선 순위가 매겨질 수 있다. 하나의 예로서, 제어 로직은 가장 오래된 실행 중인 명령어 블록을 추적하고 그것이 공유 리소스에 대한 액세스를 요청할 때 그것에 항상 우선 순위를 제공할 수 있다. 가장 오래된 실행 중인 명령어 블록은 비추측성이지만, 반면 더 새롭게 실행 중인 명령어 블록은 비추측성 또는 추측성일 수 있다. 더 새롭게 실행 중인 명령어 블록은, 라운드 로빈, 랜덤 또는 다른 알고리즘을 사용하여 공유 리소스에 대한 우선 순위를 제공 받을 수 있다. 다른 예로서, 제어 로직은 각각의 명령어 블록에 대한 타임 스탬프를 생성할 수 있고 공유 리소스에 대한 액세스를 요청하는 가장 오래된 명령어 블록에 항상 우선 순위를 제공할 수 있다. 더 새로운 및/또는 더욱 추측성인 명령어 블록에 비해, 더 오래된 및/또는 비추측성 명령어 블록을 우선시하는 것에 의해, 더 오래된 명령어 블록은, 데이터 의존성이 조기에 결정될 수 있도록 그리고 새로운 명령어 블록이 사용할 리소스가 확보될 수 있도록, 더 빨리 완료될 수 있다. 또한, 공유 리소스에 대한 액세스가 중단된 추측성 명령어에 대해 낭비되지 않고 사용될 더 높은 가능성이 존재한다. 공유 리소스는, 예를 들면, 캐시, 레지스터 파일, 메모리 서브시스템, 입력 포트, 출력 포트, 특수 목적 코어 또는 가속기, 및/또는 다른 다양한 리소스를 포함할 수 있다.
다음은 방법(800)이 어떻게 사용될 수도 있는지의 하나의 예이다. 명령어 블록 1은 페치될 수 있고 헤더는 적어도 부분적으로 디코딩될 수 있다(810). 예를 들면, 헤더는, 명령어 블록 1일 얼마나 큰지 따라서 명령어 블록 1이 명령어 블록에 대한 충분한 저장 용량을 갖는 프로세서 코어에 매핑될 수 있는지를 나타낼 수 있다. 명령어 블록 1은 제1 프로세서 코어에 매핑될 수 있다(820). 명령어 블록 1은 명령어 블록 2에 대한 오프셋 명령어를 갖는 분기를 포함할 수도 있다. 명령어 블록 1이 제1 프로세서 코어 상으로 처음 페치되면, 분기의 오프셋은 아직 알려지지 않는다. 그러나, 명령어 블록 1의 타겟 어드레스는, 명령어 블록 1이 커밋되기 전에, 예컨대 명령어가 디코딩되고 있을 때 또는 명령어의 실행 동안, 결정될 수 있다(830). 특정한 예로서, 분기 명령어는 명령어 블록 1의 유일한 분기일 수 있다. 분기 명령어가 술어화되지 않으면, 분기 명령어의 디코딩 동안 타겟 어드레스가 알려질 것이다. 분기 명령어가 명령어 블록 내에서 계산되는 값에 대해 술어화되는 경우, 잠재적인 타겟 어드레스는 디코딩 이후 알려질 수 있고, 실제 타겟 어드레스는 술어를 계산한 후 알려질 것이다. 그러나, 술어를 계산하기를 기다리는 대신, 분기 예측기는 분기가 취해진 것으로 예측할 수도 있고, 술어가 계산되기 이전에, 잠재적인 타겟 어드레스를 사용하여, 명령어 블록 2의 추측성 실행을 개시할 수 있다. 따라서, 명령어 블록 2는, 현재 코어의 다른 명령어 윈도우, 또는 제2 코어 중 어느 하나에서 미리 실행될 수 있다. 분기 예측기가 정확하게 예측하면, 명령어 블록 2는 계속 실행될 수 있고 명령어 블록 1이 커밋된 이후 커밋될 수도 있다. 분기 예측기가 잘못 예측하면, 명령어 블록 2를 커밋하지 않고 명령어 블록 2는 중단될 수 있다.
도 9 내지 도 10은 블록 기반의 아키텍쳐의 상이한 구성 및 동작의 예를 예시한다. 그 예는 타겟 어드레스에 대한 조기 액세스 제공과 관련되는 다양한 양태를 예시한다. 도 9는, 복수의 프로세싱 코어(905), 제어 로직(920), 및 메모리 시스템을 포함하는 블록 기반의 아키텍쳐(900)를 도시한다. 메모리 시스템은, 코어(905)의 다수의 코어가 메모리 시스템에 대한 액세스를 시도할 수도 있기 때문에, 블록 기반의 아키텍쳐의 공유 리소스이다. 메모리 시스템은 크로스바(930), 레벨 1 캐시(L1$)(940), 레벨 2 캐시(L2$)(950), 및 메인 메모리(910)를 포함할 수 있다. 크로스바(930)는 코어와 L1 캐시(940) 사이에서 데이터를 라우팅하기 위해 사용될 수 있다. 크로스바(930) 및 L1 캐시(940)의 상이한 구현은, L1 캐시(940)에 대한 더 많은 또는 더 적은 동시적 액세스를 가능하게 할 수 있다. 하나의 실시형태에서, 크로스바(930)는, 메모리 액세스가 L1 캐시(940)의 상이한 뱅크에 대한 것일 때 다수의 코어가 L1 캐시(940)에 동시에 액세스하는 것을 가능하게 할 수 있다. 예를 들면, L1 캐시는 각각의 코어와 관련되는 뱅크를 가질 수 있다. 대안적인 실시형태에서, 크로스바(930)는 단일의 코어만이 주어진 시간에 L1 캐시(940)에 액세스하는 것을 가능하게 할 수 있다.
몇몇 실시형태에서, 제어 로직(920)은 다음 중 하나 이상을 적어도 부분적으로 사용하여 구현될 수 있다: 하드웨어에 내장된 유한 상태 머신, 프로그래밍 가능한 마이크로코드, 프로그래밍 가능한 게이트 어레이, 또는 다른 적절한 제어 회로. 하나의 실시형태에서, 제어 로직(920)은, 명령어 블록 스케줄링과 같은, 블록 기반의 아키텍쳐(900)의 제어 기능을 수행하는 명령어 블록을 실행하는 프로세서 코어(905) 중 하나일 수 있다. 다른 실시형태에서, 소프트웨어 코드를 실행하는 외부 프로세서는, 블록 기반의 아키텍쳐(900)의 제어 기능과 통신하기 위해 그리고 그 제어 기능을 수행하기 위해 사용될 수 있다.
프로그램의 명령어(912)는 명령어 블록(A-E)으로 그룹화되어 메인 메모리(910)에 저장될 수 있다. 명령어 블록 어드레스 테이블(914)이 명령어 블록의 시작 어드레스를 저장할 수 있다. 명령어 블록은, 코어(905) 및 제어 로직(920)이 블록에 더욱 신속하게 액세스할 수 있도록, L1 캐시(940) 및 L2 캐시(950)에 복사될 수 있다.
프로그램의 제1 명령어 블록(A)을 명령어 블록 A가 실행을 시작할 수 있는 코어 1로 로딩하는 것을 제어 로직(920)의 명령어 블록 스케줄러(925)가 매핑 및 개시하는 경우, 프로그램은 실행하기 시작할 수 있다. 명령어 블록 스케줄러(925)는, 어떤 명령어 블록이 어떤 코어에 매핑되는지에 관한 정보를 저장하는 명령어 블록 매핑 테이블(916)을 유지하는 것에 의해 코어의 상주성(residency)을 추적할 수 있다. 명령어 블록 매핑 테이블(916)은, (예시되는 바와 같은) 메모리(910)에 또는 소프트웨어에 의해 액세스 가능하지 않은 다른 메모리 구조체(예컨대 제어 로직(920)의 캐시) 내에 저장될 수 있다. 명령어 블록 스케줄러(925)는 명령어 블록의 명령어 헤더를 페치 및 디코딩할 수 있다. 헤더 정보는, 명령어 블록의 사이즈 및 다음 명령어 블록의 어드레스(예를 들면, 하나 이상의 종료 타입 필드)를 계산하는 방식에 관한 정보를 결정하기 위해 사용될 수 있다.
코어 1상에서의 블록 A의 실행 동안, 그리고 블록 A가 커밋되기 이전, 다음 명령어 블록에 대응하는 타겟 어드레스가 블록 A에 의해 생성되어 제어 로직(920)으로 전달될 수 있다. 다음 명령어 블록의 어드레스는, 블록 A의 헤더의 종료 타입 필드 및 수신된 타겟 어드레스에 기초하여 계산될 수 있다. 다음 명령어 블록의 어드레스가 계산될 때, 제어 로직(920)은 다음 명령어 블록의 실행을 개시할 수 있다. 예를 들면, 프로그램의 다음 명령어 블록은 블록 B일 수 있고 제어 로직(920)은 명령어 블록 B의 실행을 개시할 수 있다.
블록 B의 실행을 개시하는 것은: 블록 B를 L1 캐시(940)로 프리페치하는 것; 블록 B의 헤더를 페치하는 것; 블록 B의 헤더를 디코딩하는 것; 블록 B를 코어(905) 중 하나로 매핑하는 것; 블록 B를 코어(905) 중 하나(예컨대 코어 2, 또는 코어 1의 미사용 윈도우)로 페치하는 것; (코어(905) 중 하나 상에 블록 B가 이미 상주하는 경우) 블록 B를 리프레시하는 것; 블록 B의 하나 이상의 명령어를 디코딩하는 것; 및/또는 블록 B의 하나 이상의 명령어를 디코딩 및/또는 실행하는 것을 포함할 수 있다. 예를 들면, 블록 B는, 블록 A와 동시에 실행하기 시작할 수 있는 코어 2로 매핑되고 로딩될 수 있다. 따라서, 블록 A 및 블록 B는, 블록 A가 블록 B의 어드레스에 대한 조기 액세스를 제공하였기 때문에 병렬로 실행할 수 있다. 블록을 병렬로 실행하는 것에 의해, 블록이 순차적으로 실행될 때보다 프로그램이 더 빨리 완료될 수 있다.
제어 로직(920)은, 프로그램 블록의 추측성 실행을 개시하기 위해 사용될 수 있는 분기 예측기(도시되지 않음)를 포함할 수 있다. 예를 들면, 분기 예측기는, 코어 3이 메모리(910)로부터 블록 C의 명령어를 페치하기 시작할 수 있도록 블록 C를 코어 3으로 매핑하는 것에 의해, 명령어 블록 C의 실행을 개시할 수 있다.
상이한 코어(905) 상에 로딩되는 블록의 각각은, 메모리 시스템과 같은 공유 리소스에 대한 액세스를 요청할 수도 있다. 예를 들면, 블록 A 및 B는 블록 C의 명령어 페치와 동시에 메모리에게 데이터를 요청할 수도 있다. 제어 로직(920)은, 더 오래된 비추측성 명령어 블록이 더 새로운 비추측성 명령어 블록 및 추측성 명령어 블록에 비해 리소스에 대한 우선 순위를 가지게끔 공유 리소스에 대한 액세스에 우선 순위를 매기도록 구성될 수 있다. 이 예에서, 블록 A 및 B는 비추측적으로 실행하고 있고 블록 C는 추측적으로 실행하고 있다. 블록 A는 가장 오래된 블록이고, 블록 B가 블록 A에 의해 개시되었기 때문에, 블록 B가 블록 A보다 더 새로운 것이고, 블록 C는 가장 새로운 블록이다. 블록 A가 가장 오래된 비추측성 블록이기 때문에 블록 A는 블록 B 및 C에 비해 우선 순위를 가질 수 있고; 블록 B가 블록 C보다 더 오래 되었기 때문에 그리고 또한 블록 C가 추측성이지만 블록 B가 비추측성이기 때문에 블록 B가 블록 C에 비해 우선순위를 가질 수 있다.
프로그램 실행은 프로그램이 완료될 때까지 이러한 방식으로 계속될 수 있다. 제어 로직(920)은, 다수의 프로그램 또는 하나의 프로그램 중 어느 하나가 블록 기반의 아키텍쳐(900) 상에서 실행될 수 있도록 구성될 수 있다. 예를 들면, 제어 로직(920)은, 각각의 프로세스 또는 스레드가 코어(905)의 서브세트에 할당될 수 있도록 코어(905)를 분할할 수 있다.
도 10은, 블록 기반의 아키텍쳐(1000)가 도 9의 메모리 시스템과는 상이하게 편제되는 메모리 시스템을 사용할 수 있다는 것을 예시한다. 특히, 도 10은, 복수의 프로세싱 코어(1005), 제어 로직(1020), 및 메모리 시스템을 포함하는 블록 기반의 아키텍쳐(1000)를 도시한다. 메모리 시스템은, 각기 각각의 코어에 대한 전용(private) 레벨 1 캐시(L1$)(1030-1034), 크로스바(1040), 레벨 2 캐시(L2$)(1050), 및 메인 메모리(1010)를 포함할 수 있다. 여기서, 크로스바(1040)는 전용 L1 캐시(1030-1034)와 L2 캐시(1030) 사이에서 데이터를 라우팅하기 위해 사용될 수 있다. 크로스바(1040) 및 L2 캐시(1050)의 상이한 구현은, L2 캐시(1050)에 대한 더 많은 또는 더 적은 동시적 액세스를 가능하게 할 수 있다. 하나의 실시형태에서, 크로스바(1040)는, 메모리 액세스가 L2 캐시(1050)의 상이한 뱅크에 대한 것일 때 다수의 L1 캐시가 L2 캐시(1050)에 동시에 액세스하는 것을 가능하게 할 수 있다. 예를 들면, L2 캐시는 각각의 L1 캐시와 관련되는 뱅크를 가질 수 있다. 대안적인 실시형태에서, 크로스바(1040)는 주어진 시간에 단일의 L1 캐시만이 L2 캐시(1050)에 액세스하는 것을 가능하게 할 수 있다.
도 9 및 도 10의 메모리 시스템은 블록 기반의 아키텍쳐와 함께 사용될 수 있는 많은 가능한 메모리 시스템 중 단지 두 개만을 예시하고 있다는 것이 이해되어야 한다. 변형예는, 상이한 수 또는 레벨의 캐시, 상이한 캐시 편제(예컨대 별개의 명령어 및 데이터 캐시를 제공함), 레벨 사이의 상이한 연결, 및 기술 분야에서 공지되어 있는 다른 메모리 아키텍쳐를 포함할 수 있다.
X. 예시적인 컴퓨팅 환경
도 11은, 블록 기반의 프로세서에서의 불량 점프 검출을 비롯한, 설명된 실시형태, 기법 및 기술이 구현될 수 있는 적절한 컴퓨팅 환경(1100)의 일반화된 예를 예시한다. 예를 들면, 컴퓨팅 환경(1100)은, 본원에서 설명되는 바와 같이, 분기 명령어 타겟 위치를 검증하기 위해 개시된 기술을 구현할 수 있다.
기술이 다양한 범용 또는 특수 목적 컴퓨팅 환경에서 구현될 수도 있기 때문에, 컴퓨팅 환경(1100)은 기술의 기능성 또는 사용의 범위에 관해 어떠한 제한도 제안하도록 의도되지는 않는다. 예를 들면, 개시된 기술은, 핸드헬드 디바이스, 다중 프로세서 시스템, 프로그래밍 가능한 소비자 전자장치, 네트워크 PC, 미니컴퓨터, 메인프레임 컴퓨터, 및 등등을 비롯한, 다른 컴퓨터 시스템 구성을 가지고 구현될 수도 있다. 개시된 기술은, 통신 네트워크를 통해 링크되는 원격 프로세싱 디바이스에 의해 작업이 수행되는 분산 컴퓨팅 환경에서도 또한 실시될 수도 있다. 분산 컴퓨팅 환경에서, 프로그램 모듈(블록 기반의 명령어 블록에 대한 실행 가능 명령어를 포함함)은 로컬 및 원격 메모리 저장 디바이스 둘 다에 위치될 수도 있다.
도 11을 참조하면, 컴퓨팅 환경(1100)은 적어도 하나의 블록 기반의 프로세싱 유닛(1110) 및 메모리(1120)를 포함한다. 도 11에서, 이 가장 기본적인 구성(1130)은 점선 내에 포함된다. 블록 기반의 프로세싱 유닛(1110)은 컴퓨터 실행 가능 명령어를 실행하며, 실제 또는 가상 프로세서일 수도 있다. 다중 프로세싱 시스템에서는, 프로세싱 능력을 증가시키기 위해 다수의 프로세싱 유닛이 컴퓨터 실행 가능 명령어를 실행하며, 그러한 만큼, 다수의 프로세서가 동시에 실행될 수 있다. 메모리(1120)는 휘발성 메모리(예를 들면, 레지스터, 캐시, RAM), 불휘발성 메모리(예를 들면, ROM, EEPROM, 플래시 메모리, 등등), 또는 이들의 어떤 조합일 수도 있다. 메모리(1120)는, 예를 들면, 본원에서 설명되는 기술을 구현할 수 있는 소프트웨어(1180), 이미지 및 비디오를 저장한다. 컴퓨팅 환경은 추가적인 피쳐를 가질 수도 있다. 예를 들면, 컴퓨팅 환경(1100)은 스토리지(1140), 하나 이상의 입력 디바이스(1150), 하나 이상의 출력 디바이스(1160), 및 하나 이상의 통신 연결(1170)을 포함한다. 인터커넥션 메커니즘(interconnection mechanism)(도시되지 않음) 예컨대 버스, 컨트롤러, 또는 네트워크는 컴퓨팅 환경(1100)의 컴포넌트를 인터커넥트한다. 통상적으로, 오퍼레이팅 시스템 소프트웨어(도시되지 않음)는 컴퓨팅 환경(1100)에서 실행하는 다른 소프트웨어에 대한 동작 환경을 제공하고, 컴퓨팅 환경(1100)의 컴포넌트의 활동(activity)을 조화시킨다(coordinate).
스토리지(1140)는 착탈식 또는 비착탈식일 수도 있고, 자기 디스크, 자기 테이프 또는 카세트, CD-ROM, CD-RW, DVD, 또는 정보를 저장하기 위해 사용될 수 있고 컴퓨팅 시스템(1100) 내에서 액세스될 수 있는 임의의 다른 매체를 포함한다. 저장 디바이스(1140)는, 본원에서 설명되는 기술을 구현하기 위해 사용될 수 있는, 소프트웨어(1180)에 대한 명령어, 플러그인 데이터, 및 메시지를 저장한다.
입력 디바이스(들)(1150)는, 컴퓨팅 환경(1100)으로 입력을 제공하는, 키보드, 키패드, 마우스, 터치스크린 디스플레이, 펜, 또는 트랙볼과 같은 터치 입력 디바이스, 음성 입력 디바이스, 스캐닝 디바이스, 또는 다른 디바이스일 수도 있다. 오디오의 경우, 입력 디바이스(들)(1150)는 아날로그 또는 디지털 형태로 오디오 입력을 받아들이는 사운드 카드 또는 유사한 디바이스, 또는 컴퓨팅 환경(1100)에 오디오 샘플을 제공하는 CD-ROM 리더(reader)일 수도 있다. 출력 디바이스(들)(1160)는, 디스플레이, 프린터, 스피커, CD 라이터(CD-writer), 또는 컴퓨팅 환경(1100)으로부터의 출력을 제공하는 다른 디바이스일 수도 있다.
통신 연결(들)(1170)은 통신 매체(예를 들면, 연결 네트워크)를 통한 다른 컴퓨팅 엔티티로의 통신을 가능하게 한다. 통신 매체는, 컴퓨터 실행 가능 명령어, 압축된 그래픽 정보, 비디오, 또는 다른 데이터와 같은 정보를 변조된 데이터 신호에서 전달한다. 통신 연결(들)(1170)은, 유선 연결(예를 들면, 전기 또는 광섬유 연결을 통한 메가비트 또는 기가비트 이더넷, 인피니밴드(Infiniband), 파이버 채널)로 제한되지 않을 뿐만 아니라, 무선 기술(예를 들면, 블루투스(Bluetooth), 와이파이(WiFi)(IEEE 802.11a/b/n), 와이맥스(WiMax), 셀룰러, 위성, 레이저, 적외선을 통한 RF 연결) 및 개시된 에이전트, 브리지 및 에이전트 데이터 소비자에 대한 네트워크 연결을 제공하기 위한 다른 적절한 통신 연결을 포함한다. 가상 호스트 환경에서, 통신(들) 연결은, 가상 호스트에 의해 제공되는 가상화된 네트워크 연결일 수 있다.
개시된 방법의 몇몇 실시형태는, 컴퓨팅 클라우드(1190)에서 개시된 기술의 전부 또는 일부를 구현하는 컴퓨터 실행 가능 명령어를 사용하여 수행될 수 있다. 예를 들면, 개시된 컴파일러 및/또는 블록 기반의 프로세서 서버가 컴퓨팅 환경(1130)에 위치되거나, 또는 개시된 컴파일러는 컴퓨팅 클라우드(1190)에 위치되는 서버 상에서 실행될 수 있다. 몇몇 예에서, 개시된 컴파일러는 전통적인 중앙 처리 유닛(예를 들면, RISC 또는 CISC 프로세서) 상에서 실행된다.
컴퓨터 판독 가능한 매체는, 컴퓨팅 환경(1100) 내에서 액세스될 수 있는 임의의 이용가능한 매체이다. 제한없는 예로서, 컴퓨팅 환경(1100)에서, 컴퓨터 판독 가능한 매체는 메모리(1120) 및/또는 스토리지(1140)를 포함한다. 쉽게 이해되어야 하는 바와 같이, 용어 컴퓨터 판독 가능한 저장 매체는, 메모리(1120) 및 스토리지(1140)와 같은 데이터 저장을 위한 매체를 포함하고, 변조된 데이터 신호와 같은 송신 매체는 포함하지 않는다.
X. 개시된 기술의 추가적인 예
개시된 주제의 추가적인 예가 상기에서 논의되는 예에 따라 본원에서 논의된다.
하나의 실시형태에서, 블록 기반의 컴퓨팅 시스템은 복수의 프로세서 코어 및 제어 로직을 포함한다. 복수의 프로세서 코어는, 제1 명령어 블록의 명령어를 실행하도록 그리고 제1 명령어 블록이 커밋되기 이전에 제2 명령어 블록의 타겟 어드레스를 생성하도록 구성되는 제1 프로세서 코어를 포함한다. 제어 로직은, 제1 명령어 블록이 커밋되기 이전에, 제2 명령어 블록의 타겟 어드레스를 수신하도록 그리고 제2 명령어 블록의 비추측성 실행을 개시하도록 구성된다. 블록 기반의 컴퓨팅 시스템은 복수의 프로세서 코어에 의해 공유되는 리소스를 더 포함할 수도 있다. 제어 로직은 또한, 더 오래된 비추측성 명령어 블록이 더 새로운 비추측성 명령어 블록 및 추측성 명령어 블록에 비해 리소스에 대한 우선 순위를 가지게끔 공유 리소스에 대한 액세스에 우선 순위를 매기도록 구성될 수도 있다. 복수의 프로세서 코어에 의해 공유되는 리소스는, 예를 들면, 캐시, 레지스터 파일, 또는 메모리일 수도 있다. 제2 명령어 블록의 비추측성 실행을 개시하는 것은, 제1 명령어 블록의 헤더에 인코딩되는 종료 타입 정보에 적어도 부분적으로 기초할 수도 있다. 복수의 프로세서 코어의 각각의 프로세서 코어는 전용 명령어 캐시를 포함할 수도 있다. 제2 명령어 블록의 실행을 개시하는 것은, 제2 명령어 블록을 복수의 프로세서 코어의 제2 코어로 로딩하는 것을 포함할 수도 있다. 제1 명령어 블록은 제1 코어의 제1 명령어 윈도우에 로딩될 수도 있다. 제2 명령어 블록의 실행을 개시하는 것은, 제2 명령어 블록을 제1 코어의 제2 명령어 윈도우로 로딩하는 것을 포함할 수도 있다.
하나의 실시형태에서, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법은, 블록 기반의 아키텍쳐의 제1 코어를 사용하여 제1 명령어 블록의 하나 이상의 명령어를 실행하는 것; 및 제1 명령어 블록이 커밋되기 이전에, 제2 명령어 블록의 명령어의 비추측성 실행을 개시하는 것을 포함한다. 그 방법은, 제1 명령어 블록의 명령어에 대한 술어를 평가하는 것, 및 술어 평가에 적어도 부분적으로 기초하여, 개시를 수행하는 것을 더 포함할 수도 있다. 그 방법은, 제1 명령어 블록의 명령어 헤더에 저장되는 종료 타입 정보를 평가하는 것; 및 종료 타입 정보에 적어도 부분적으로 기초하여, 개시를 수행하는 것을 더 포함할 수도 있다. 개시된 비추측성 실행은, 제2 명령어 블록을 블록 기반의 아키텍쳐의 L1 캐시로 프리페치하는 것을 포함할 수도 있다. 개시된 비추측성 실행은, 제2 명령어 블록을 블록 기반의 아키텍쳐의 제2 코어의 명령어 윈도우로 페치하는 것을 포함할 수도 있다. 개시된 비추측성 실행은, 제2 명령어 블록을 블록 기반의 아키텍쳐의 제1 코어의 명령어 윈도우로 페치하는 것을 포함한다. 제2 명령어 블록은 개시 이전에 블록 기반의 아키텍쳐의 제2 코어 상에 로딩될 수도 있고, 개시된 비추측성 실행은 제2 코어 상에 로딩되는 제2 명령어 블록을 리프레시하는 것을 포함할 수도 있다. 개시된 비추측성 실행은 제2 명령어 블록의 헤더를 프리페치하는 것을 포함할 수도 있다. 개시된 비추측성 실행은 제2 명령어 블록의 헤더를 프리페치하는 것을 포함할 수도 있다. 그 방법은, 더 오래된 비추측성 명령어 블록이 더 새로운 비추측성 명령어 블록 및 추측성 명령어 블록에 비해 공유 리소스에 대한 우선 순위를 가지도록, 블록 기반의 아키텍쳐의 공유 리소스에 대한 액세스 요청에 우선 순위를 매기는 것을 더 포함할 수도 있다. 공유 리소스는, 예를 들면, 캐시, 레지스터 파일, 또는 메모리 서브시스템일 수도 있다.
하나의 실시형태에서, 컴퓨터 판독 가능한 저장 디바이스 또는 메모리는, 프로세서로 하여금, 소스 코드를 블록 기반의 컴퓨터 아키텍쳐 상에서 실행 가능한 머신 코드로 컴파일하기 위한 방법을 실행하게 하기 위한 명령어를 갖는다. 그 명령어는, 프로세서로 하여금, 블록 기반의 컴퓨터 아키텍쳐 상에서 실행 가능한 머신 코드 명령어의 스트림 - 머신 코드 명령어의 스트림은 복수의 명령어 블록으로 분할됨 - 을 생성하게 하는 명령어를 포함한다. 명령어는, 프로세서로 하여금, 복수의 명령어 블록의 각각의 명령어 블록에 대한 종료 타입을 결정하게 하는 명령어를 포함한다. 명령어는, 프로세서로 하여금, 각각의 명령어 블록의 헤더에 각각의 명령어 블록에 대한 종료 타입을 인코딩하게 하는 명령어를 포함한다. 명령어는, 프로세서로 하여금, 분기 타겟 어드레스를 계산하기 위한 명령어를 각각의 명령어 블록 내에서 진전시키게 하는 명령어를 더 포함할 수도 있다. 종료 타입은 다음의 타입 중 적어도 하나 이상을 포함할 수도 있다: 널, 순차, 오프셋, 간접, 호출, 또는 리턴.
개시된 주제의 원리가 적용될 수도 있는 많은 가능한 실시형태의 관점에서, 예시된 실시형태는 단지 바람직한 예에 불과하며 청구범위의 범위를 이들 바람직한 예로 제한하는 것으로 간주되어선 안된다는 것이 인식되어야 한다. 오히려, 청구된 주제의 범위는 다음의 청구범위에 의해 정의된다. 따라서, 이들 청구범위의 범위 내에 들어 오는 모든 것을 본 발명으로서 주장한다.

Claims (15)

  1. 블록 기반의 컴퓨팅 시스템으로서,
    제1 명령어 블록의 명령어를 실행하도록 그리고 상기 제1 명령어 블록이 커밋(commit)되기 이전에 제2 명령어 블록의 타겟 어드레스를 생성하도록 구성되는 제1 프로세서 코어를 포함하는 복수의 프로세서 코어; 및
    상기 제1 명령어 블록이 커밋되기 이전에, 상기 제2 명령어 블록의 상기 타겟 어드레스를 수신하도록 그리고 상기 제2 명령어 블록의 비추측성 실행(non-speculative execution)을 개시하도록 구성되는 제어 로직을 포함하는, 블록 기반의 컴퓨팅 시스템.
  2. 제1항에 있어서,
    상기 복수의 프로세서 코어에 의해 공유되는 리소스를 더 포함하고, 상기 제어 로직은 또한, 더 오래된 비추측성 명령어 블록(non-speculative instruction block)이 더 새로운 비추측성 명령어 블록 및 추측성 명령어 블록(speculative instruction block)에 비해 상기 리소스에 대한 우선 순위를 가지게끔 상기 공유 리소스에 대한 액세스에 우선 순위를 매기도록 구성되는 것인, 블록 기반의 컴퓨팅 시스템.
  3. 제1항 또는 제2항에 있어서,
    상기 제2 명령어 블록의 상기 비추측성 실행을 개시하는 것은, 상기 제1 명령어 블록의 헤더에 인코딩되는 종료 타입 정보(exit type information)에 적어도 부분적으로 기초하는 것인, 블록 기반의 컴퓨팅 시스템.
  4. 제1항 내지 제3항 중 어느 한 항에 있어서,
    상기 제2 명령어 블록의 실행을 개시하는 것은, 상기 제2 명령어 블록을 상기 복수의 프로세서 코어의 제2 코어로 로딩하는 것을 포함하는 것인, 블록 기반의 컴퓨팅 시스템.
  5. 제1항 내지 제4항 중 어느 한 항에 있어서,
    상기 제1 명령어 블록은 상기 제1 코어의 제1 명령어 윈도우에 로딩되고, 상기 제2 명령어 블록의 실행을 개시하는 것은, 상기 제2 명령어 블록을 상기 제1 코어의 제2 명령어 윈도우로 로딩하는 것을 포함하는 것인, 블록 기반의 컴퓨팅 시스템.
  6. 블록 기반의 아키텍쳐에서 분기를 수행하는 방법으로서,
    상기 블록 기반의 아키텍쳐의 제1 코어를 사용하여 제1 명령어 블록의 하나 이상의 명령어를 실행하는 단계; 및
    상기 제1 명령어 블록이 커밋되기 이전에, 제2 명령어 블록의 명령어의 비추측성 실행을 개시하는 단계를 포함하는, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  7. 제6항에 있어서,
    상기 제1 명령어 블록의 상기 명령어에 대한 술어(predicate)를 평가하는 단계; 및
    상기 술어 평가에 적어도 부분적으로 기초하여, 상기 개시하는 단계를 수행하는 단계를 더 포함하는, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  8. 제6항 또는 제7항에 있어서,
    상기 제1 명령어 블록의 명령어 헤더에 저장되는 종료 타입 정보를 평가하는 단계; 및
    상기 종료 타입 정보에 적어도 부분적으로 기초하여, 상기 개시하는 단계를 수행하는 단계를 더 포함하는, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  9. 제6항 내지 제8항 중 어느 한 항에 있어서,
    상기 개시된 비추측성 실행은, 상기 제2 명령어 블록을 상기 블록 기반의 아키텍쳐의 L1 캐시로 프리페치하는 단계를 포함하는 것인, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  10. 제6항 내지 제9항 중 어느 한 항에 있어서,
    상기 개시된 비추측성 실행은, 상기 제2 명령어 블록을 상기 블록 기반의 아키텍쳐의 제2 코어의 명령어 윈도우로 페치하는 단계를 포함하는 것인, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  11. 제6항 내지 제10항 중 어느 한 항에 있어서,
    상기 제2 명령어 블록은, 상기 개시 단계 이전에 상기 블록 기반의 아키텍쳐의 제2 코어 상에 로딩되고, 상기 개시된 비추측성 실행은 상기 제2 코어 상에 로딩되는 상기 제2 명령어 블록을 리프레시하는 단계를 포함하는 것인, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  12. 제6항 내지 제11항 중 어느 한 항에 있어서,
    상기 개시된 비추측성 실행은, 상기 제2 명령어 블록의 헤더를 프리페치하는 단계를 포함하는 것인, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  13. 제6항 내지 제12항 중 어느 한 항에 있어서,
    더 오래된 비추측성 명령어 블록이 더 새로운 비추측성 명령어 블록 및 추측성 명령어 블록에 비해 공유 리소스에 대한 우선 순위를 가지도록, 상기 블록 기반의 아키텍쳐의 상기 공유 리소스에 대한 액세스 요청에 우선 순위를 매기는 단계를 더 포함하는, 블록 기반의 아키텍쳐에서 분기를 수행하는 방법.
  14. 블록 기반의 프로세서에 대한 명령어를 포함하는 컴퓨터 판독 가능한 저장 디바이스 또는 메모리로서,
    상기 명령어는, 상기 블록 기반의 프로세서에 의한 실행시, 상기 블록 기반의 프로세서로 하여금 제6항 내지 제13항 중 어느 한 항의 방법을 수행하게 하는 것인, 컴퓨터 판독 가능한 저장 디바이스 또는 메모리.
  15. 소스 코드를 블록 기반의 컴퓨터 아키텍쳐 상에서 실행 가능한 머신 코드로 컴파일하기 위한 방법을 프로세서로 하여금 실행하게 하기 위한 명령어를 포함하는 컴퓨터 판독 가능한 저장 디바이스 또는 메모리로서,
    상기 명령어는,
    상기 프로세서로 하여금, 상기 블록 기반의 컴퓨터 아키텍쳐 상에서 실행 가능한 머신 코드 명령어의 스트림 - 상기 머신 코드 명령어의 스트림은 복수의 명령어 블록으로 분할됨 - 을 생성하게 하는 명령어;
    상기 프로세서로 하여금, 상기 복수의 명령어 블록의 각각의 명령어 블록에 대한 종료 타입을 결정하게 하는 명령어; 및
    상기 프로세서로 하여금, 상기 각각의 명령어 블록의 헤더에서 각각의 명령어 블록에 대한 상기 종료 타입을 인코딩하게 하는 명령어를 포함하는 것인, 컴퓨터 판독 가능한 저장 디바이스 또는 메모리.
KR1020187001900A 2015-06-26 2016-06-23 연속하는 블록을 병렬 실행하는 블록 기반의 아키텍쳐 KR20180021812A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US14/752,636 US20160378488A1 (en) 2015-06-26 2015-06-26 Access to target address
US14/752,636 2015-06-26
PCT/US2016/038854 WO2016210031A1 (en) 2015-06-26 2016-06-23 Block-based architecture with parallel execution of successive blocks

Publications (1)

Publication Number Publication Date
KR20180021812A true KR20180021812A (ko) 2018-03-05

Family

ID=56369217

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020187001900A KR20180021812A (ko) 2015-06-26 2016-06-23 연속하는 블록을 병렬 실행하는 블록 기반의 아키텍쳐

Country Status (15)

Country Link
US (1) US20160378488A1 (ko)
EP (2) EP3314401B1 (ko)
JP (1) JP2018519602A (ko)
KR (1) KR20180021812A (ko)
CN (1) CN107810478A (ko)
AU (1) AU2016281603A1 (ko)
BR (1) BR112017024351A2 (ko)
CA (1) CA2986061A1 (ko)
CL (1) CL2017003263A1 (ko)
CO (1) CO2017013272A2 (ko)
HK (1) HK1246442A1 (ko)
IL (1) IL256171A (ko)
MX (1) MX2017016200A (ko)
PH (1) PH12017550128A1 (ko)
WO (1) WO2016210031A1 (ko)

Families Citing this family (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10346168B2 (en) 2015-06-26 2019-07-09 Microsoft Technology Licensing, Llc Decoupled processor instruction window and operand buffer
US11755484B2 (en) 2015-06-26 2023-09-12 Microsoft Technology Licensing, Llc Instruction block allocation
US9946548B2 (en) 2015-06-26 2018-04-17 Microsoft Technology Licensing, Llc Age-based management of instruction blocks in a processor instruction window
US10169044B2 (en) 2015-06-26 2019-01-01 Microsoft Technology Licensing, Llc Processing an encoding format field to interpret header information regarding a group of instructions
US9940136B2 (en) 2015-06-26 2018-04-10 Microsoft Technology Licensing, Llc Reuse of decoded instructions
US9952867B2 (en) 2015-06-26 2018-04-24 Microsoft Technology Licensing, Llc Mapping instruction blocks based on block size
US10175988B2 (en) 2015-06-26 2019-01-08 Microsoft Technology Licensing, Llc Explicit instruction scheduler state information for a processor
US10409599B2 (en) 2015-06-26 2019-09-10 Microsoft Technology Licensing, Llc Decoding information about a group of instructions including a size of the group of instructions
US10409606B2 (en) 2015-06-26 2019-09-10 Microsoft Technology Licensing, Llc Verifying branch targets
US10191747B2 (en) 2015-06-26 2019-01-29 Microsoft Technology Licensing, Llc Locking operand values for groups of instructions executed atomically
US10095519B2 (en) 2015-09-19 2018-10-09 Microsoft Technology Licensing, Llc Instruction block address register
US11531552B2 (en) * 2017-02-06 2022-12-20 Microsoft Technology Licensing, Llc Executing multiple programs simultaneously on a processor core
CN109101276B (zh) 2018-08-14 2020-05-05 阿里巴巴集团控股有限公司 在cpu中执行指令的方法
US10824429B2 (en) 2018-09-19 2020-11-03 Microsoft Technology Licensing, Llc Commit logic and precise exceptions in explicit dataflow graph execution architectures
CN109783143B (zh) * 2019-01-25 2021-03-09 贵州华芯通半导体技术有限公司 用于流水线指令流的控制方法和控制设备
US20210096861A1 (en) * 2019-10-01 2021-04-01 Higon Austin R&D Center System and method to prefetch pointer based structures
CN111506520B (zh) * 2020-07-01 2020-09-22 腾讯科技(深圳)有限公司 一种地址生成的方法、相关装置以及存储介质

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
DE69327688T2 (de) * 1992-08-12 2000-09-07 Advanced Micro Devices Inc Befehlsdecoder
US5832297A (en) * 1995-04-12 1998-11-03 Advanced Micro Devices, Inc. Superscalar microprocessor load/store unit employing a unified buffer and separate pointers for load and store operations
GB2393274B (en) * 2002-09-20 2006-03-15 Advanced Risc Mach Ltd Data processing system having an external instruction set and an internal instruction set
US7882339B2 (en) * 2005-06-23 2011-02-01 Intel Corporation Primitives to enhance thread-level speculation
JP4339371B2 (ja) * 2007-03-22 2009-10-07 株式会社ソニー・コンピュータエンタテインメント 情報処理装置および情報処理方法
CN104011705A (zh) * 2011-12-01 2014-08-27 新加坡国立大学 多形异构性多核架构
US9182986B2 (en) * 2012-12-29 2015-11-10 Intel Corporation Copy-on-write buffer for restoring program code from a speculative region to a non-speculative region
US9594700B2 (en) * 2013-04-17 2017-03-14 Nvidia Corporation Speculative memory controller

Also Published As

Publication number Publication date
PH12017550128A1 (en) 2018-02-26
IL256171A (en) 2018-02-28
MX2017016200A (es) 2018-03-01
EP3314401B1 (en) 2020-02-12
BR112017024351A2 (pt) 2018-07-31
EP3314401A1 (en) 2018-05-02
CO2017013272A2 (es) 2018-03-20
HK1246442A1 (zh) 2018-09-07
CN107810478A (zh) 2018-03-16
CA2986061A1 (en) 2016-12-29
JP2018519602A (ja) 2018-07-19
WO2016210031A1 (en) 2016-12-29
AU2016281603A1 (en) 2017-11-30
EP3660668A1 (en) 2020-06-03
US20160378488A1 (en) 2016-12-29
CL2017003263A1 (es) 2018-06-29

Similar Documents

Publication Publication Date Title
EP3314401B1 (en) Block-based architecture with parallel execution of successive blocks
CN107810480B (zh) 根据性能度量的指令块分配
EP3350705B1 (en) Initiating instruction block execution using a register access instruction
EP3350686B1 (en) Debug support for block-based processor
EP3314398B1 (en) Reuse of decoded instruction blocks in a block based architecture
US11681531B2 (en) Generation and use of memory access instruction order encodings
US20170083319A1 (en) Generation and use of block branch metadata
US20170083320A1 (en) Predicated read instructions
US20160378491A1 (en) Determination of target location for transfer of processor control
US10198263B2 (en) Write nullification
US10445097B2 (en) Multimodal targets in a block-based processor
CN108027733B (zh) 在目标字段中存储无效
CN108027734B (zh) 空指令的动态生成
US10031756B2 (en) Multi-nullification
WO2017048645A1 (en) Multimodal targets in a block-based processor