KR20130097676A - 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제 - Google Patents

제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제 Download PDF

Info

Publication number
KR20130097676A
KR20130097676A KR1020130019269A KR20130019269A KR20130097676A KR 20130097676 A KR20130097676 A KR 20130097676A KR 1020130019269 A KR1020130019269 A KR 1020130019269A KR 20130019269 A KR20130019269 A KR 20130019269A KR 20130097676 A KR20130097676 A KR 20130097676A
Authority
KR
South Korea
Prior art keywords
vector
prediction
instruction
execution
predicate
Prior art date
Application number
KR1020130019269A
Other languages
English (en)
Other versions
KR101417597B1 (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 KR20130097676A publication Critical patent/KR20130097676A/ko
Application granted granted Critical
Publication of KR101417597B1 publication Critical patent/KR101417597B1/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
    • 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/30072Arrangements for executing specific machine instructions to perform conditional operations, e.g. using predicates or guards
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/28Error detection; Error correction; Monitoring by checking the correct order of processing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • 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/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3861Recovery, e.g. branch miss-prediction, exception handling

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Quality & Reliability (AREA)
  • Executing Machine-Instructions (AREA)
  • Advance Control (AREA)
  • Complex Calculations (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

제어 흐름이 프레디케이트 벡터가 널이라는 결정에 응답하여 명령들에 대해 브랜치하도록 하는 조건부 브랜치 명령이 미선택으로 예측되는, 브랜치 예측실패 거동을 억제하기 위한 방법이 고려된다. 그러나, 예측이 올바르지 않다는 검출에 응답하여, 예측실패 거동은 금지된다.

Description

제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제{BRANCH MISPREDICATION BEHAVIOR SUPPRESSION ON ZERO PREDICATE BRANCH MISPREDICT}
본 개시는 프로세서들에 관한 것이고, 더욱 구체적으로는, 프레디케이트된 브랜치 명령들(predicated branch instructions)의 브랜치 예측실패(branch misprediction) 동안의 벡터 명령 실행에 관한 것이다.
브랜치 예측은 대부분의 현대의 프로세서들에서 아주 흔하게 되었다. 후방 브랜치들(backward branches)은 크게 예측 가능할 수 있지만, 전방 브랜치들(forward branches)은 프로세싱되는 데이터의 성질에 따라 잘 예측될 수 있거나 예측되지 않을 수 있다.
벡터 명령들을 프로세싱하는 일부 프로세서들은 벡터 내의 요소들이 수정되는지, 또는 수정되지 않은 값을 유지하는지를 제어하기 위해 계산들을 수행할 때 프레디케이션(predication)을 마스킹(masking)하는 것을 이용한다. 더욱 구체적으로, 프레디케이트 벡터들(predicate vectors)은 벡터의 개별 요소들이 수정되는 것을 제어할 수 있다. 일부 경우들에서, 브랜치 명령은 프레디케이트 벡터가 모두 제로를 포함할 때 프레디케이트된 명령들에 대해 브랜치하는 데 이용될 수 있다. 이것은 일반적으로 브랜치들이 정확하게 예측되는 상황들에서 전력 및 성능에 대한 개선일 수 있다.
종래의 벡터 프로세서에서, 브랜치가 예측실패될 때, 프로세서 파이프라인은 통상적으로 플러시(flush)될 수 있고 새로운 명령이 브랜치 타깃 어드레스와 같은 상이한 어드레스로부터 인출될 수 있다. 그러나, 이러한 타입의 종래의 브랜치 예측실패 거동(branch misprediction behavior)은 불필요하고 낭비적일 수 있다.
브랜치 예측실패 거동을 억제하기 위한 방법의 다양한 실시예들이 개시된다. 대체로, 제어 흐름이 프레디케이트 벡터가 널(null)이라는 결정에 응답하여 명령들에 대해 브랜치하도록 하는 조건부 브랜치 명령이 미선택(not taken)으로 예측되는 방법이 고려된다. 그러나, 예측이 올바르지 않다는 검출에 응답하여, 예측실패 거동(misprediction behavior)은 금지된다.
일 실시예에서, 상기 방법은 프로그램 명령 실행의 제어 흐름이 조건부 흐름 제어 명령의 실행에 응답하여 변경되지 않는다고 예측하는 예측(prediction)을 발생하는 단계를 포함한다. 상기 조건부 흐름 제어 명령은 프레디케이트 벡터의 하나 이상의 요소들 각각이 널이라는 결정에 응답하여 제어 흐름을 변경한다. 또한, 상기 방법은 상기 예측이 올바르지 않음을 검출하는 단계, 및 상기 예측이 올바르지 않다는 검출에 응답하여 예측실패 거동을 금지하는 단계를 포함할 수 있다.
하나의 특정 구현에서, 예측실패 거동을 금지하는 단계는, 상기 조건부 흐름 제어 명령의 예측실패한 경로 내에 있는 프로그램 명령들을 실행하는 단계를 포함할 수 있다.
다른 특정 구현에서, 예측실패 거동을 금지하는 단계는, 상기 흐름 제어 명령과 명령 타깃 사이의 프로그램 순서로 프로그램 명령들을, 프로세서의 실행 파이프라인으로부터의 플러시(flush)를 금지하는 단계를 포함할 수 있다.
도 1은 컴퓨터 시스템의 일 실시예의 블록도이다.
도 2는 도 1에 도시된 프로세서의 실시예의 부가적인 상세를 예시하는 블록도이다.
도 3은 프로그램 코드 루프의 예시적인 병렬화(parallelization)를 예시하는 도면이다.
도 4a는 예 1에 도시된 루프의 스칼라 실행 동안 가변 상태들의 시퀀스를 예시하는 도면이다.
도 4b는 예 1의 루프의 매크로스칼라 벡터화 프로그램 코드를 위한 실행의 진행을 예시하는 도면이다.
도 5a 및 도 5b는 프로그램 소스 코드의 벡터화의 일 실시예를 예시하는 도면들이다.
도 6a는 비-추측 벡터화 프로그램 코드(non-speculative vectorized program code)의 일 실시예를 예시하는 도면이다.
도 6b는 추측 벡터화 프로그램 코드(speculative vectorized program code)의 다른 실시예를 예시하는 도면이다.
도 7은 프레디케이트된 브랜치 명령의 브랜치 예측실패 동안 도 2의 프로세서의 일 실시예의 동작을 도시하는 흐름도이다.
특정 실시예들이 도면들에 예시적으로 도시되고 본원에 상세하게 설명될 것이다. 그러나, 단일 실시예만이 특정 특징과 관련하여 설명되더라도, 도면들 및 상세한 설명은 개시된 특정 실시예들로 청구항들을 한정하도록 의도되지 않는다는 것을 이해해야 한다. 반대로, 이 개시의 이득을 갖는 이 기술분야의 통상의 기술자에게 명백한 모든 수정들, 등가물들 및 대안들을 커버하는 것이 의도된다. 본 개시에 제공된 특징들의 예들은 달리 서술되지 않는 한 제한이라기보다는 예시인 것으로 의도된다.
이 출원 전체에 걸쳐서 이용되는 바와 같이, 단어 "~할 수 있다(may)"는 의무적인 의미(즉, ~해야 한다(must)는 의미)라기보다는, 허용적인 의미(즉, ~할 가능성이 있다는 의미)로 이용된다. 유사하게, 단어들 "포함한다(include)", "포함하는(including)", 및 "포함한다(includes)"는 포함하지만 그것으로 한정되지 않음을 의미한다.
다양한 유닛들, 회로들, 또는 다른 컴포넌트들이 태스크 또는 태스크들을 수행"하도록 구성되는" 것으로서 설명될 수 있다. 그러한 문맥들에서, "~하도록 구성되는"은 동작 동안 태스크 또는 태스크들을 수행하는 "회로를 갖는"을 일반적으로 의미하는 구조의 폭넓은 설명이다. 이와 같이, 유닛/회로/컴포넌트는 유닛/회로/컴포넌트가 현재 온(on) 상태가 아닐 때에도 태스크를 수행하도록 구성될 수 있다. 일반적으로, "~하도록 구성되는"에 대응하는 구조를 형성하는 회로는 하드웨어 회로들을 포함할 수 있다. 유사하게, 다양한 유닛들/회로들/컴포넌트들은 설명에서 편의상 태스크 또는 태스크들을 수행하는 것으로서 설명될 수 있다. 이러한 설명은 구절 "~하도록 구성되는"을 포함하는 것으로서 해석되어야 한다. 하나 이상의 태스크를 수행하도록 구성되는 유닛/회로/컴포넌트는 그 유닛/회로/컴포넌트에 대한 해석에, 35 U.S.C. §112, 6절을 적용하지 않도록 명백하게 의도된다.
본 개시의 범위는 본원에서 다뤄지는 문제들 중 임의의 것 또는 전부를 완화하든지 그렇지 않든지, (명시적으로 또는 암시적으로) 본원에 개시된 특징들 중 임의의 특징 또는 그의 결합, 또는 그의 임의의 일반화를 포함한다. 따라서, 특징들의 임의의 그러한 결합에 이 출원(또는 그것에 대해 우선권을 주장하는 출원)의 소송 동안 새로운 청구항들이 만들어질 수 있다. 특히, 첨부된 청구항들과 관련하여, 종속 청구항들로부터의 특징들은 독립 청구항들의 특징들과 결합될 수 있고, 각각의 독립 청구항들로부터의 특징들은 임의의 적절한 방식으로 결합될 수 있고, 단지 첨부된 청구항들에 열거된 특정 결합들로 결합되지 않을 수 있다.
컴퓨터 시스템 개요
이제 도 1을 보면, 컴퓨터 시스템의 일 실시예의 블록도가 도시된다. 컴퓨터 시스템(100)은 프로세서(102), 레벨 2(L2) 캐시(106), 메모리(108), 및 대용량 저장 장치(110)를 포함한다. 도시된 바와 같이, 프로세서(102)는 레벨 1(L1) 캐시(104)를 포함한다. 특정 컴포넌트들이 컴퓨터 시스템(100)에 도시되고 설명되지만, 대안적인 실시예들에서, 상이한 컴포넌트들 및 상이한 수의 컴포넌트들이 컴퓨터 시스템(100)에 존재할 수 있다는 것에 주목한다. 예를 들어, 컴퓨터 시스템(100)은 메모리 계층구조의 일부(예를 들어, 메모리(108) 및/또는 대용량 저장 장치(110))를 포함하지 않을 수 있다. 대안적으로, L2 캐시(106)가 프로세서(102)의 외부에 도시되지만, 다른 실시예들에서, L2 캐시(106)는 프로세서(102)의 내부에 있을 수 있다는 것이 고려된다. 또한, 그러한 실시예들에서, 레벨 3(L3) 캐시(도시되지 않음)가 이용될 수 있다는 것에 주목한다. 또한, 컴퓨터 시스템(100)은 그래픽 프로세서들, 비디오 카드들, 비디오 캡처 장치들, 사용자 인터페이스 장치들, 네트워크 카드들, 광학 드라이브들, 및/또는 버스, 네트워크, 또는 다른 적절한 통신 채널을 이용하여 프로세서(102)에 결합되는 다른 주변장치들(모두 간략함을 위해 도시되지 않음)을 포함할 수 있다.
다양한 실시예에서, 프로세서(102)는 계산 동작들을 수행하는 범용 프로세서를 나타낼 수 있다. 예를 들어, 프로세서(102)는 마이크로프로세서, 마이크로컨트롤러, ASIC(application-specific integrated circuit), 또는 FPGA(field-programmable gate array)와 같은 중앙 프로세싱 유닛(CPU)일 수 있다. 그러나, 아래에서 더 설명되는 바와 같이, 프로세서(102)는 벡터 프로세싱을 위한 하나 이상의 메커니즘(예를 들어, 벡터 실행 유닛들)을 포함할 수 있다. 프로세서(102)의 예시적인 벡터 실행 유닛은 도 2의 설명과 결합하여 아래에서 더욱 상세하게 설명된다.
대용량 저장 장치(110), 메모리(108), L2 캐시(106), 및 L1 캐시(104)는 프로세서(102)를 위한 데이터 및 명령들을 저장하는 메모리 계층구조를 집합적으로 형성하는 저장 장치들이다. 더욱 구체적으로, 대용량 저장 장치(110)는 긴 액세스 시간을 갖는 디스크 드라이브 또는 대용량 플래시 메모리 유닛과 같은 고용량, 불휘발성 메모리일 수 있고, L1 캐시(104), L2 캐시(106), 및 메모리(108)는 더 짧은 액세스 시간을 갖는 더 작은 메모리일 수 있다. 이들 더 빠른 반도체 메모리들은 자주 이용되는 데이터의 사본들을 저장한다. 메모리(108)는 DRAM(dynamic random access memory) 계열의 메모리 장치들 내의 메모리 장치를 나타낼 수 있다. 메모리(108)의 사이즈는 통상적으로 L1 캐시(104) 및 L2 캐시(106)보다 크고, L1 캐시(104) 및 L2 캐시(106)는 통상적으로 SRAM(static random access memory) 계열의 장치들 내의 더 작은 장치들을 이용하여 구현된다. 일부 실시예들에서, L2 캐시(106), 메모리(108), 및 대용량 저장 장치(110)는 컴퓨터 시스템(100)에서 하나 이상의 프로세서 사이에 공유된다.
일부 실시예들에서, 메모리 계층구조의 장치들(즉, L1 캐시(104) 등)은 사이클당 복수의 캐시 라인들에 액세스(즉, 판독 및/또는 기입)할 수 있다. 이들 실시예는 불연속 메모리 어드레스들에 대한 포인터들 또는 어레이 인덱스들의 벡터에 기초하여 발생하는 메모리 액세스들의 더욱 효과적인 프로세싱을 가능하게 할 수 있다.
아래 설명되는 데이터 구조들 및 프로그램 명령들(즉, 코드)은, 컴퓨터 시스템(예를 들어, 컴퓨터 시스템(100))에 의한 이용을 위해 코드 및/또는 데이터를 저장할 수 있는 임의의 장치 또는 저장 매체일 수 있는, 비-일시적 컴퓨터 판독 가능한 저장 장치에 저장될 수 있다는 것에 주목한다. 대체로, 비-일시적 컴퓨터 판독 가능한 저장 장치는 휘발성 메모리, 불휘발성 메모리, 디스크 드라이브들과 같은 자기식 광학 저장 장치, 자기 테이프, CD(compact disc), DVD(digital versatile disc or digital video disc), 또는 지금 알려지거나 나중에 개발될 컴퓨터 판독 가능한 매체를 저장할 수 있는 다른 매체를 포함하고, 이것으로 한정되지 않는다. 이와 같이, 대용량 저장 장치(110), 메모리(108), L2 캐시(106), 및 L1 캐시(104)는 모두 비-일시적 컴퓨터 판독 가능한 저장 장치들의 예들이다.
프로세서
도 2를 참조하면, 도 1의 프로세서의 실시예의 부가적인 상세들을 예시하는 블록도가 도시된다. 도 2에 도시된 실시예에서, 프로세서(102)는 다수의 파이프라인 스테이지들을 포함할 수 있고, 간결함을 위해 전부가 도 2에 도시되지는 않는다. 따라서, 도시된 바와 같이, 프로세서(102)는 L1 캐시(104), 명령 인출 유닛(201), 브랜치 예측 유닛(210), 예측실패 유닛(212), 정수 실행 유닛(202), 부동 소수점 실행 유닛(206), 및 벡터 실행 유닛(204)을 포함한다. 정수 실행 유닛(202), 부동 소수점 실행 유닛(206), 및 벡터 실행 유닛(204)은 그룹으로서 "실행 유닛들"이라고 상호교환가능하게 지칭될 수 있다는 것에 주목한다.
다양한 실시예에서, 실행 유닛들은 예를 들어, 연관된 타입의 오퍼랜드에 대한, 논리적 연산들, 수학적 연산들, 또는 비트 연산들과 같은 계산 동작들을 수행할 수 있다. 더욱 구체적으로, 정수 실행 유닛(202)은 정수 오퍼랜드들을 수반하는 계산 동작들을 수행할 수 있고, 부동 소수점 실행 유닛(206)은 부동 소수점 오퍼랜드들을 수반하는 계산 동작들을 수행할 수 있고, 벡터 실행 유닛(204)은 벡터 오퍼랜드들을 수반하는 계산 동작들을 수행할 수 있다. 정수 실행 유닛들 및 부동 소수점 실행 유닛들은 일반적으로 이 기술분야에 알려져 있고 간결함을 위해 더 설명되지 않는다. 위에 언급한 바와 같이, 도 2에 도시된 프로세서(102)의 실시예는 특정 세트의 컴포넌트들을 포함하지만, 대안적인 실시예들에서, 프로세서(102)는 실행 유닛들에 결합될 수 있는 명령 디코드 유닛, 스케줄러, 또는 예비 스테이션들(reservations stations), 재정렬 버퍼(reorder buffer), 메모리 관리 유닛, I/O 인터페이스들 등과 같은 상이한 수 또는 타입의 실행 유닛들, 기능 유닛들, 및 파이프라인 스테이지들을 포함할 수 있다는 것이 고려된다.
벡터 실행 유닛(204)은 그것이 병렬로 복수의 데이터 요소들에 대해 동일한 연산을 수행할 수 있다는 점에서, 통상적인 의미의 단일 명령 다중 데이터(single-instruction-multiple-data; SIMD) 실행 유닛을 나타낼 수 있다. 그러나, 일부 실시예들에서, 여기에 설명된 벡터 명령들은 SIMD 명령들의 다른 구현들과 상이할 수 있다는 것에 주목한다. 예를 들어, 실시예에서, 벡터 명령에 대해 연산된 벡터의 요소들은 벡터의 요소들의 수에 따라 변하지 않는 사이즈를 가질 수 있다. 반대로, 일부 SIMD 구현들에서, 데이터 요소 사이즈는 연산되는 데이터 요소들의 수에 따라 변한다(예를 들어, SIMD 아키텍처는 8개의 8-비트 요소들뿐만 아니라, 4개의 16-비트 요소들, 2개의 32-비트 요소들 등에 대한 연산들을 지원한다). 일 실시예에서, 벡터 실행 유닛(204)은 오퍼랜드들의 벡터들에 포함되는 데이터 요소들 중 일부 또는 전부에 대해 연산할 수 있다. 더욱 구체적으로, 벡터 실행 유닛(204)은 벡터 프로그램 명령의 벡터 오퍼랜드의 상이한 요소들에 대해 동시에 연산하도록 구성될 수 있다.
일 실시예에서, 벡터 실행 유닛(204)은 벡터 실행 유닛(204)에 대한 오퍼랜드 벡터들 및 결과 벡터들을 유지할 수 있는 벡터 레지스터들을 포함할 수 있는 벡터 레지스터 파일(도시되지 않음)을 포함할 수 있다. 일부 실시예들에서, 벡터 레지스터 파일에 32개의 벡터 레지스터들이 존재할 수 있고, 각각의 벡터 레지스터는 128 비트를 포함할 수 있다. 그러나, 대안적인 실시예들에서, 레지스터당 상이한 수의 비트들 및/또는 상이한 수의 벡터 레지스터들이 존재할 수 있다.
벡터 실행 유닛(204)은 벡터 레지스터들로부터 오퍼랜드들을 검색하고, 벡터 실행 유닛(204)이 오퍼랜드 벡터의 데이터 요소들 중 일부 또는 전부에 대해 병렬로 연산들을 수행하도록 하는 벡터 명령들을 실행하도록 구성될 수 있다. 예를 들어, 벡터 실행 유닛(204)은 벡터의 요소들에 대해 논리적 연산들, 수학적 연산들, 또는 비트 연산들을 수행할 수 있다. 벡터 실행 유닛(204)은 명령 사이클당 하나의 벡터 연산을 수행할 수 있다(전술한 바와 같이, "사이클"은 벡터 실행 유닛(204)의 계산 동작들을 트리거, 동기화, 및/또는 제어하는 데 이용될 수 있는 1보다 큰 클록 사이클을 포함할 수 있다).
일 실시예에서, 벡터 실행 유닛(204)은 N 데이터 요소들(예를 들어, 바이트, 워드, 더블워드 등)을 유지하는 벡터들을 지원할 수 있고, 여기서 N은 임의의 플러스의 정수일 수 있다. 이들 실시예들에서, 벡터 실행 유닛(204)은 오퍼랜드 벡터의 N 또는 그보다 작은 데이터 요소들에 대한 연산들을 병렬로 수행할 수 있다. 예를 들어, 벡터 길이가 256 비트이고, 연산되는 데이터 요소들이 4-바이트 요소들이고, 연산이 데이터 요소들에 값을 부가하는 것인 실시예에서, 이들 실시예는 벡터의 임의의 수의 요소들에 값을 부가할 수 있다. N이 프로세서(102)의 상이한 구현들을 위해 상이할 수 있다는 것에 주목한다.
다양한 실시예에서, 벡터 실행 유닛(204)은 벡터 실행 유닛(204)이 연산하는 오퍼랜드 벡터의 데이터 요소들의 동적 제한을 가능하게 하는 적어도 하나의 제어 신호를 포함할 수 있다. 구체적으로, 제어 신호의 상태에 따라, 벡터 실행 유닛(204)은 벡터의 데이터 요소들 중 임의의 것 또는 전부에 대해 선택적으로 연산할 수 있다. 예를 들어, 벡터 길이가 512 비트이고, 연산되는 데이터 요소들이 4-바이트 요소들인 실시예에서, 제어 신호는 오퍼랜드 벡터의 16 데이터 요소들 중 일부 또는 전부에 대해 연산들이 수행되지 못하도록 어서트(assert)될 수 있다. 연산들이 수행되는 오퍼랜드 벡터의 데이터 요소들을 "동적으로" 제한하는 것은 실행시간에 각각의 사이클에 대해 별개로 제어 신호를 어서트하는 것을 수반할 수 있다는 것에 주목한다.
일부 실시예들에서, 아래에서 더욱 상세하게 설명되는 바와 같이, 프레디케이트들 또는 하나 이상의 스칼라 프레디케이트들의 벡터에 포함되는 값들에 기초하여, 벡터 실행 유닛(204)은 선택된 벡터 데이터 요소들에만 벡터 연산들을 적용한다. 일부 실시예들에서, 결과 벡터의 나머지 데이터 요소들은 영향을 받지 않은 채로 남거나(이것은 "프레디케이션"이라고도 지칭할 수 있음) 또는 제로로 된다(이것은 "제로화(zeroing)" 또는 "제로화 프레디케이션(zeroing predication)"이라고도 지칭할 수 있음). 일부 실시예들에서, 벡터 실행 유닛(204)에서 프레디케이션 또는 제로화로 인해 사용되지 않은 데이터 요소 프로세싱 서브시스템들("레인들")에 대한 클록들은 전력 공급(power) 및/또는 클록 게이팅(clock-gated)될 수 있어, 벡터 실행 유닛(204)에서의 동적 전력 소비를 줄일 수 있다.
다양한 실시예에서, 아키텍처는 실행시간에 그것이 병렬화를 적응할 수 있게 하기 위해 벡터 길이에 독립적(vector-length agnostic)일 수 있다. 더욱 구체적으로, 명령들 또는 연산들이 벡터 길이에 독립적일 때, 연산(즉, 명령 등)은 지원하는 하드웨어에 의해 부과되는 제한들까지, 임의의 길이의 벡터들을 이용하여 실행될 수 있다. 예를 들어, 벡터 실행 하드웨어가 8개의 별개의 4-바이트 요소들(따라서 8개의 요소들의 벡터 길이를 가짐)을 포함할 수 있는 벡터들을 지원하는 실시예들에서, 벡터 길이에 독립적인 연산이 벡터의 8개의 요소들 중 임의의 수에 대해 연산할 수 있다. 상이한 벡터 길이(예를 들어, 4개의 요소)를 지원하는 상이한 하드웨어 구현에서, 벡터 길이에 독립적인 연산은 기저 하드웨어에 의해 그것에 이용가능하게 된 상이한 수의 요소들에 대해 연산할 수 있다. 따라서, 컴파일러 또는 프로그래머는 기저 하드웨어(예를 들어, 벡터 실행 유닛(204))에 의해 지원되는 벡터 길이를 명시적으로 알 필요가 없다. 이러한 실시예들에서, 특정 벡터 길이에 의존(또는 이용)할 필요가 없는 프로그램 코드를 컴파일러가 발생하거나 프로그래머가 기입한다. 일부 실시예들에서, 프로그램 코드의 특정 벡터 사이즈를 특정하는 것이 금지될 수 있다. 따라서, 더 긴 벡터들을 지원하는 프로세서들로부터 성능 이득들을 잠재적으로 실현하면서, 이들 실시예들에서의 컴파일 코드(즉, 이진 코드)는 상이한 벡터 길이들을 가질 수 있는 다른 실행 유닛들에서 실행된다. 이러한 실시예들에서, 프로세서와 같은 주어진 하드웨어 유닛에 대한 벡터 길이는 실행시간 동안 시스템 레지스터로부터 판독될 수 있다. 따라서, 프로세스 기술이 더 긴 벡터들을 허용할 때, 레거시 이진 코드의 실행은 간단히 소프트웨어 개발자들에 의한 임의의 수고 없이 가속된다.
일반적으로, 벡터 길이들은 2의 제곱(예를 들어, 2, 4, 8 등)으로서 구현될 수 있다. 그러나, 일부 실시예들에서, 벡터 길이들은 2의 제곱일 필요는 없다. 구체적으로, 3, 7, 또는 다른 수의 데이터 요소들의 벡터들이 2의 제곱 수의 데이터 요소들을 갖는 벡터들과 동일한 방식으로 이용될 수 있다.
다양한 실시예에서, 벡터의 각각의 데이터 요소는 메모리 액세스들의 세트를 병렬로 수행하기 위해 벡터 실행 유닛(204)에 의해 이용되는 어드레스를 포함할 수 있다. 이러한 실시예들에서, 벡터의 하나 이상의 요소들이 무효 메모리 어드레스들을 포함하는 경우, 무효 메모리 판독 동작들이 일어날 수 있다. 따라서, 프로그램 종료가 생길 수 있는 무효 메모리 판독 동작들은 그 대신에 유효 어드레스들을 갖는 임의의 요소들이 판독되도록 하고 무효 요소들을 갖는 요소들이 플래깅(flagged)될 수 있도록 할 수 있어, 추측에 근거하고, 지나고 나서 보니 불법적인(in hindsight illegal), 판독 동작들에도 불구하고 프로그램 실행이 계속되도록 할 수 있다.
일부 실시예들에서, 프로세서(102)(및 따라서 벡터 실행 유닛(204))는 포인터들의 벡터들에 대해 연산 및 그것을 이용할 수 있다. 그러한 실시예들에서, 벡터당 데이터 요소들의 수는 데이터 타입의 사이즈에 상관없이 벡터당 포인터들의 수와 같다. 메모리에 대해 동작하는 명령들은 메모리 액세스의 사이즈를 나타내는 변형들(variants)을 가질 수 있지만, 프로세서 레지스터들 내의 요소들은 포인터 사이즈와 동일해야 한다. 이들 실시예에서, 32-비트 및 64-비트 어드레싱 모드들을 둘다 지원하는 프로세서들은 32-비트 모드의 벡터당 요소들의 수의 2배를 허용하도록 선택할 수 있어, 더 큰 스루풋을 달성한다. 이것은 동일한 폭의 데이터 경로를 가정하여, 32-비트 어드레싱에 대한 독특한 스루풋 이점을 암시한다. 구현에 특정한 기법들을 이용하여 요건을 완화할 수 있다. 예를 들어, 레지스터 쌍 형성(register pairing) 또는 일부 다른 특수 메커니즘을 통해 32-비트 모드에서 배정밀도 부동 소수점 수들이 지원될 수 있다.
일 실시예에서, 브랜치 예측 유닛(210)은 조건부 브랜치 명령들에 대한 인출 유닛(201)에 대한 브랜치 타깃 프로그램 카운터 어드레스들(PCs)을 발생하도록 구성될 수 있다. 더욱 구체적으로, 조건부 브랜치 명령들에 대해, 브랜치 예측 유닛(210)은 브랜치가 선택(taken)일지 미선택(not taken)일지를 예측할 수 있고, 제어 로직(도시되지 않음)은 예측에 기초하여 인출 유닛(201)에 대한 PC를 발생할 수 있다. 그 다음에 명령들이 브랜치의 예측 결과에 따라 추측에 근거한 방식으로 인출되고, 발행되고, 실행될 수 있다. 다양한 실시예에서, 브랜치 예측 유닛(210)은 예측들을 발생하기 위해 다양한 예측 메커니즘 중 임의의 것을 이용할 수 있다. 예를 들어, 브랜치 예측 유닛(210)은 개별 브랜치들에 대한 예측 상태(예를 들어, 상태 머신들, 테이블들, 카운터들, 또는 다른 데이터 구조들)를 유지하는 로컬 예측자들, 전체적으로 고려되는 복수의 브랜치에 걸친 예측을 수행하는 글로벌 예측자들, 로컬 및 글로벌 예측자들의 요소들을 결합하는 하이브리드 예측자들, 또는 다른 적절한 접근법들을 이용할 수 있다. 일부 실시예들에서, 브랜치 예측 유닛(210)은 (예를 들어, 하나의 기법에 따라 더 잘 예측된 브랜치가 상이한 기법에 따라 더 잘 예측될 때를 검출 및 적응하기 위해서) 실행 동안 변하는 브랜치 거동에 동적으로 적응하는 예측자들을 이용할 수 있다.
일 실시예에서, 예측실패 유닛(212)은 브랜치 예측이 올바르지 않을 때를 검출하도록 구성된다(예를 들어, 실행되는 시간에 브랜치의 실제 거동이 브랜치의 예측된 거동과 상이하므로, 브랜치가 예측실패되었음을 나타냄). 또한, 예측실패 유닛(212)은 실행 유닛들(202, 206, 및 204)과 브랜치 예측 유닛(210)에 예측실패의 표시를 제공하도록 구성될 수 있다. 예측실패 유닛(212)은 별개의 유닛으로서 도시되지만, 다른 실시예들에서, 예측실패 유닛(212)은 브랜치 예측 유닛(210)의 부분일 수 있거나, 인출 유닛(201)의 부분일 수 있거나, 다양한 실행 유닛들(예를 들어, 202, 204, 및 206) 중 임의의 것 또는 전부의 부분일 수 있다는 것이 고려된다는 점에 주목한다.
전술한 바와 같이, 종래의 프로세서가 브랜치 명령을 예측실패할 때, 파이프라인은 예측실패 경로의 명령들에 대해 플러싱되는데, 그것은 이들 추측에 근거하여 발행된 명령들이 올바르지 않은 추측에 비추어 프로세서의 상태를 수정하도록 허용되어서는 안 되기 때문이다. 그 다음, 인출 유닛은 올바른, 추측에 근거하지 않은 경로에 대한 명령들을 인출할 수 있다. 그러나, 이 플러시 및 채움 동작에 대한 패널티(penalty)가 존재한다: 유용한 작업이 재개될 수 있기 전에 수백 실행 사이클이 요구될 수 있다. 그러나, 도 7의 설명과 결합하여 아래에서 더욱 상세히 설명되는 바와 같이, 예를 들어, 프레디케이션은 예측실패 경로의 명령들이 실행되더라도 영향을 미치지 않도록 할 수 있기 때문에, 예측실패될 때, 올바른 프로세서 동작을 보장하기 위해 예측실패 경로의 명령들이 플러싱되도록 요구하지 않을 수 있는 특정 브랜치 명령들이 존재한다. 그러한 브랜치 명령들은 예측실패 경로의 명령들을 플러싱하고 상이한 브랜치 타깃으로부터 인출하는 종래의 예측실패 거동을 허용하기 위해 발생된 패널티보다 예측실패 경로의 명령들을 실행하기 위해 더 적은 패널티를 발생할 수 있다. 더욱 구체적으로, 예측실패 경로의 명령들이 실행할 수 있게 하기 위하여 종래의 예측실패 거동의 억제를 가능하게 할 수 있는 아래 설명된 매크로스칼라 아키텍처의 특정 명령들이 존재한다.
매크로스칼라 아키텍처 개요
명령 세트 아키텍처(매크로스칼라 아키텍처라고 지칭됨) 및 지원하는 하드웨어는 컴파일 시간에 병렬화를 완전히 결정할 필요 없이, 및 유용한 정적 분석 정보를 폐기하지 않고, 컴파일러들이 루프들에 대한 프로그램 코드를 발생할 수 있게 할 수 있다. 매크로스칼라 아키텍처의 다양한 실시예가 이제 설명될 것이다. 구체적으로, 아래 더 설명되는 바와 같이, 루프들에 대한 병렬화를 지시하지 않지만, 그 대신에 동적 상태들이 허용하는 경우 병렬화가 실행시간에 이용될 수 있게 하는 명령들의 세트가 제공된다. 따라서, 아키텍처는, 컴파일러에 의해 발생된 코드가, 이용되는 병렬화의 양을 스위칭함으로써 실행시간에 조건들에 따라 루프 반복들을 위한 비-병렬(스칼라) 및 병렬(벡터) 실행 사이에 동적으로 스위칭할 수 있게 하는 명령들을 포함한다.
따라서, 아키텍처는 루프 반복들을 위해 결정되지 않은 양의 벡터 병렬화를 가능하게 하지만, 실행시간에 병렬화가 이용되도록 요구하지 않는 명령들을 제공한다. 더욱 구체적으로, 아키텍처는 유효 벡터 길이가 실행시간 조건들에 따라 변할 수 있는 벡터 길이에 독립적인 명령들의 세트를 포함한다. 따라서, 실행시간 종속성이 코드의 비-병렬 실행을 요구하면, 실행은 하나의 요소의 유효 벡터 길이로 일어난다. 마찬가지로, 실행시간 조건들이 병렬 실행을 허용하면, 실행시간 종속성(및 기저 하드웨어의 벡터 길이)에 의해 어느 정도가 허용되든지 동일한 코드가 벡터 병렬 방식으로 실행된다. 예를 들어, 벡터의 8개의 요소 중 2개가 안전하게 병렬로 실행될 수 있는 경우, 프로세서(102)와 같은 프로세서는 2개의 요소를 병렬로 실행할 수 있다. 이들 실시예에서, 프로그램 코드를 벡터 길이에 독립적인 포맷으로 표현하는 것은, 기존의 시스템들에 존재하지 않는 광범위한 벡터화 기회를 가능하게 한다.
다양한 실시예에서, 컴파일 동안, 컴파일러는 먼저 프로그램 코드에서 주어진 루프의 루프 구조를 분석하고 정적 종속성 분석을 수행한다. 그 다음, 컴파일러는 정적 분석 정보를 유지하는 프로그램 코드를 발생하고, 예를 들어, 어떻게 실행시간 종속성을 해결하고 가능한 최대 양의 병렬화로 프로그램 코드를 프로세싱할지를 프로세서(102)와 같은 프로세서에 지시한다. 더욱 구체적으로, 컴파일러는 병렬로 루프 반복들의 대응하는 세트들을 수행하기 위한 벡터 명령들을 제공할 수 있고, 루프의 반복들 사이의 데이터 종속성이 에러를 일으키지 못하도록 벡터 명령들의 실행을 동적으로 제한하기 위한 벡터 제어 명령들을 제공할 수 있다. 이 접근법은, 실행시간 종속성에 대한 정보가 이용가능한, 실행시간에 대해 병렬화의 결정을 연기하므로, 소프트웨어 및 프로세서가 동적으로 변화하는 조건들에 대해 병렬화를 적응할 수 있게 한다. 프로그램 코드 루프 병렬화의 예가 도 3에 도시된다.
도 3의 좌측을 보면, 병렬화되지 않은 루프의 4개의 반복(예를 들어, 반복들 1-4)을 갖는 실행 패턴이 도시되고, 각각의 루프는 명령들 A-G를 포함한다. 직렬 연산들은 명령들이 수직으로 적층되어 도시된다. 도 3의 우측에는 병렬화된 루프의 버전이 있다. 이 예에서, 반복 내의 각각의 명령은 주어진 반복의 명령들 사이에 정적 종속성 체인이 존재하도록, 그 이전의 적어도 하나의 명령에 의존한다. 따라서, 주어진 반복 내의 명령들은 병렬화될 수 없다(즉, 주어진 반복 내의 명령들 A-G은 반복의 다른 명령들과 관련하여 항상 직렬로 실행된다). 그러나, 대안적인 실시예들에서, 주어진 반복 내의 명령들은 병렬화 가능할 수 있다.
도 3의 루프의 반복들 사이에 화살표들에 의해 도시된 바와 같이, 주어진 반복의 명령 E와 후속 반복의 명령 D 사이의 실행시간 데이터 종속성의 가능성이 존재한다. 그러나, 컴파일 동안, 컴파일러는 오직 이들 명령들 사이의 데이터 종속성의 가능성이 존재함을 결정할 수 있지만, 컴파일러는 이 정보가 오직 실행시간에 이용가능하기 때문에 어느 반복들에서 종속성들이 실제로 실현될 것인지를 알려줄 수 없다. 이 예에서, 실행시간에 실제로 실현하는 데이터 종속성이 1E로부터 2D, 및 3E 내지 4D로 실선 화살표들에 의해 도시되고, 실행시간에 실현하지 않는 데이터 종속성은 2E로부터 3D로의 점선 화살표를 이용하여 도시된다. 따라서, 도시된 바와 같이, 실행시간 데이터 종속성은 실제로 제1/제2 및 제3/제4 반복들 사이에 일어난다.
제2 및 제3 반복들 사이에 데이터 종속성이 존재하지 않기 때문에, 제2 및 제3 반복들은 안전하게 병렬로 프로세싱될 수 있다. 또한, 주어진 반복의 명령들 A-C 및 F-G은 오직 반복 내의 종속성들을 갖고, 따라서, 주어진 반복의 명령 A는 모든 다른 반복들의 명령 A와 병렬로 실행할 수 있고, 명령 B는 또한 모든 다른 반복들의 명령 B와 병렬로 실행할 수 있고, 등등이다. 그러나, 제2 반복의 명령 D는 제1 반복의 명령 E에 의존하기 때문에, 제1 반복의 명령들 D 및 E는 제2 반복에 대한 명령 D가 실행될 수 있기 전에 실행되어야 한다.
따라서, 우측의 병렬화 루프에서, 그러한 루프의 반복들은 최대 병렬화를 실현하면서, 정적 및 실행시간 데이터 종속성들을 둘다 수용하도록 실행된다. 더욱 구체적으로, 모든 4개의 반복들의 명령들 A-C 및 F-G은 병렬로 실행된다. 그러나, 제2 반복의 명령 D가 제1 반복의 명령 E에 의존하기 때문에, 제1 반복의 명령들 D 및 E는 제2 반복에 대한 명령 D가 실행될 수 있기 전에 실행되어야 한다. 그러나, 제2 및 제3 반복들 사이에 데이터 종속성이 존재하지 않기 때문에, 이들 반복들에 대한 명령들 D 및 E는 병렬로 실행될 수 있다.
매크로스칼라 아키텍처의 예들
다음의 예들은 매크로스칼라 연산들을 소개하고 도 3에 도시되고 병렬화 루프 예에서 전술한 루프와 같은 루프들의 벡터화에서의 이용을 입증한다. 이해의 용이성을 위해, 이들 예들은 C++ 포맷의 의사코드를 이용하여 제시된다.
다음의 예시적인 실시예들은 논의의 목적을 위한 것임에 주목한다. 실제 명령들 및 연산들은 단지 아키텍처의 이해를 돕는 것으로 의도된다. 그러나, 대안적인 실시예들에서, 명령들 또는 연산들은 예를 들어, 더 많은 원시 연산들의 마이크로코드 시퀀스를 이용하여 또는 서브-연산들의 상이한 시퀀스를 이용하여, 상이한 방식으로 구현될 수 있다. 명령들의 추가 분해는 매크로 연산에 관한 정보 및 대응하는 사용 모델이 모호하지 않도록 회피된다는 것에 주목한다.
표기법
아래 예들을 설명함에 있어서, 달리 언급되지 않는 한 벡터량들인 변수들에 대해 다음의 포맷이 이용된다:
p5 = a<b;
벡터 p5의 요소들은 a<b을 테스트한 결과에 따라 0 또는 1로 설정된다. 벡터 p5는 아래 더욱 상세히 설명되는 바와 같이, "프레디케이트 벡터"일 수 있음에 주목한다. 프레디케이트 벡터들을 발생하는 일부 명령들은 또한 결과로 생긴 프레디케이트들을 반영하기 위해 프로세서 상태 플래그들을 설정한다. 예를 들어, 프로세서 상태 플래그들 또는 조건 코드들은 FIRST, LAST, NONE, 및/또는 ALL 플래그들을 포함할 수 있다.
~p5; a=b+c;
프레디케이트 벡터 p5의 활성(즉, 비-제로) 요소들에 의해 지정된 벡터 'a'의 요소들만이 b+c의 결과를 받는다. a의 나머지 요소들은 변화하지 않는다. 이 연산은 "프레디케이션"이라고 하고, 프레디케이트 벡터 전에 물결표("~") 부호를 이용하여 표시된다.
!p5; a=b+c;
프레디케이트 벡터 p5의 활성(즉, 비-제로) 요소들에 의해 지정된 벡터 'a'의 요소들만이 b+c의 결과를 받는다. a의 나머지 요소들은 0으로 설정된다. 이 연산은 "제로화"라고 하고, 프레디케이트 벡터 전에 느낌표("!") 부호를 이용하여 표시된다.
Figure pat00001

다음의 명령들은 그에 따라 프로세서 상태 플래그들 및 브랜치를 테스트한다.
x+=VECLEN;
VECLEN은 벡터당 요소들의 수를 통신하는 기계값이다. 이 값은 어셈블러에 의해 결정되기보다는, 코드를 실행하는 프로세서에 의해 실행시간에 결정된다.
//Comment
많은 공통 프로그래밍 언어들과 유사한 방식으로, 다음의 예들은 코멘트들을 표시하기 위해 이중 포워드 슬래시(double forward slash)를 이용한다. 이들 코멘트들은 표시된 벡터에 포함되는 값들에 관한 정보 또는 대응하는 예에서 수행되는 연산들의 설명을 제공할 수 있다.
이들 예들에서, 다른 C++ 포맷의 오퍼레이터들은 그것들의 종래의 의미를 유지하지만, 요소별로 벡터에 걸쳐서 적용된다. 기능 호출들이 이용될 때, 그것들은 목적지 레지스터로 리턴되는 임의의 값을 배치하는 단일 명령을 암시한다. 이해의 간단함을 위해, 모든 벡터들은 정수들의 벡터들이지만, 대안적인 실시예들은 다른 데이터 포맷들을 지원한다.
구조적 루프 캐리 종속성들(Structural Loop-Carried Dependencies)
아래 코드 예 1에서, 종래의 벡터 아키텍처들을 이용하여 "벡터화 불가능한(non-vectorizable)" 프로그램 코드 루프가 도시된다. (벡터화 불가능한 것에 추가하여, 이 루프는 또한 데이터 종속성들의 미세 단위 성질(fine-grain nature)로 인한 종래의 멀티 스레딩 아키텍처들(multi-threading architectures)에 대해 멀티 스레드 가능(multi-threadable)하지 않다는 것에 주목한다.) 명확함을 위해, 이 루프는 루프가 벡터화 가능하지 않게 하는 기본적인 루프 캐리 종속성들에 추출되었다(distilled).
이 예에서, 변수들 r 및 s는 종래의 아키텍처들을 이용한 벡터화를 방지하는 루프 캐리 종속성들을 갖는다. 그러나, 루프는 조건(A[x]<FACTOR)이 항상 참 또는 항상 거짓인 것으로 알려지는 한 벡터화 가능하다는 것에 주목한다. 이들 가정들은 조건이 실행 동안 변화하도록 허용될 때 변화한다(공통 경우). 이 예에서 간단함을 위해, A[ ]와 B[ ] 사이에 에일리어싱(aliasing)이 존재하지 않는다고 추정한다.
예 1: 프로그램 코드 루프
Figure pat00002
매크로스칼라 아키텍처를 이용하여, 예 1의 루프는 조건(A[x]<FACTOR)이 변화하지 않는 세그먼트들로 벡터를 분할함으로써 벡터화될 수 있다. 그러한 벡터들을 분할하기 위한 프로세스들의 예들과, 분할을 가능하게 하는 명령들의 예들이 아래에 제시된다. 이 예에 대해 설명된 분할은 오직 조건절 내의 명령들에 적용될 필요가 있다는 것에 주목한다. A[x]의 제1 판독과 최종 연산 B[x]=r+s은, 잠재적으로 최종 루프 반복에 대해서 제외하고, 항상 풀 벡터(full vector)에 걸쳐서 병렬로 실행될 수 있다.
벡터화 코드의 명령들 및 예들이 매크로스칼라 아키텍처와 결합하여, 도 2의 프로세서(102)와 같은 벡터 프로세서의 동작을 설명하기 위해 도시되어 설명된다. 다음의 설명은 일반적으로 명령들의 수가 설명되고 나서 명령들을 이용하는 하나 이상의 벡터화 코드 샘플들이 제시되도록 조직된다. 일부 경우들에서, 특정 타입의 벡터화 이슈가 주어진 예에서 분석된다.
dest=VectorReadInt(Base, Offset)
VectorReadInt는 메모리 판독 동작을 수행하기 위한 명령이다. 데이터 사이즈에 의해 스케일링되는 오프셋들 Offset의 벡터(이 경우 정수)가 스칼라 베이스 어드레스 Base에 부가되어 메모리 어드레스들의 벡터를 형성하고 나서, 목적지 벡터로 판독된다. 명령이 프레디케이트 또는 제로화되면, 활성 요소들에 대응하는 어드레스들만이 판독된다. 설명된 실시예들에서, 무효 어드레스들에 대한 판독들은 결함으로 허용되지만, 그러한 결함들은 오직 제1 활성 어드레스가 무효인 경우 프로그램 종료를 일으킨다.
VectorWriteInt(Base, Offset, Value)
VectorWriteInt는 메모리 기입 동작을 수행하기 위한 명령이다. 데이터 사이즈에 의해 스케일링되는 오프셋들의 벡터 Offset(이 경우 정수)가 스칼라 베이스 어드레스 Base에 부가되어 메모리 어드레스들의 벡터를 형성한다. 값들 Value의 벡터가 이들 메모리 어드레스들에 기입된다. 이 명령이 프레디케이트 또는 제로화되면, 데이터는 활성 어드레스들에만 기입된다. 설명된 실시예들에서, 불법적 어드레스들에 대한 기입들은 항상 결함들을 발생한다.
dest=VectorIndex(Start, Increment)
VectorIndex는 Start에 의해 특정된 스칼라 시작 값으로부터 증분에 의해 단조적으로(monotonically) 조정하는 값들의 벡터들을 발생하기 위한 명령이다. 이 명령은 인덱스 조정이 일정할 때 루프 인덱스 변수들을 초기화하기 위해 이용될 수 있다. 프레디케이션 또는 제로화가 적용될 때, 제1 활성 요소는 시작 값을 수신하고, 증분은 오직 후속 활성 요소들에 적용된다. 예를 들어:
x = VectorIndex(0,1); // x = { 0 1 2 3 4 5 6 7 }
dest=PropagatePostT(dest, src, pred)
PropagatePostT 명령은 pred에 의해 결정되는 바와 같이, src의 활성 요소들의 값을, dest의 후속 비활성 요소들에 전파한다. 활성 요소들, 및 제1 활성 요소에 앞서는 임의의 비활성 요소들은 dest에서 변화하지 않은 채로 남는다. 이 명령의 목적은 조건부로 계산되는 값을 취해서, 등가 스칼라 코드에서 일어나는 바와 같이 후속 루프 반복들에 조건부로 계산된 값을 전파하는 것이다. 예를 들어:
Figure pat00003
dest=PropagatePriorF(src, pred)
PropagatePriorF 명령은 pred에 의해 결정되는 바와 같이, src의 비활성 요소들의 값을, dest의 후속 활성 요소들에 전파한다. 비활성 요소들은 src로부터 dest로 복사된다. 프레디케이트의 제1 요소가 활성이면, src의 최종 요소는 그 위치로 전파된다. 예를 들어:
Figure pat00004
dest=ConditionalStop(pred, deps)
ConditionalStop 명령은 프레디케이트들 pred의 벡터를 평가하고, deps에 의해 특정되는 바와 같은 데이터 종속성들을 나타내는 인접하는 프레디케이트 요소들 사이의 전이들(transitions)을 식별한다. 스칼라값 deps은 4 비트의 어레이로서 생각될 수 있고, 각각은 좌측에서 우측으로 프로세싱되는 바와 같이, pred의 참/거짓 요소들 사이의 가능한 전이를 지정한다. 이들 비트들은 설정되면 표시된 종속성의 존재를 전달하고, 설정되지 않으면 종속성의 부재를 보장한다. 그것들은:
kTF―프레디케이트가 참인 반복으로부터, 프레디케이트의 값이 거짓인 후속 반복으로의 루프 캐리 종속성을 나타낸다.
kFF―프레디케이트가 거짓인 반복으로부터, 프레디케이트의 값이 거짓인 후속 반복으로의 루프 캐리 종속성을 나타낸다.
kFT―프레디케이트가 거짓인 반복으로부터, 프레디케이트의 값이 참인 후속 반복으로의 루프 캐리 종속성을 나타낸다.
kTT―프레디케이트가 참인 반복으로부터, 프레디케이트의 값이 참인 후속 반복으로의 루프 캐리 종속성을 나타낸다.
종속하는 데이터를 발생하는 반복에 대응하는 요소 위치가 데이터에 종속하는 반복에 대응하는 요소 위치에서 목적지 벡터에 저장된다. 데이터 종속성이 존재하지 않으면, 0의 값이 그 요소에서 목적지 벡터에 저장된다. 결과로서 생기는 종속성 인덱스 벡터, 즉, DIV는 종속성들을 나타내는 요소 위치 인덱스들의 벡터를 포함한다. 아래 설명된 이유로, 벡터의 제1 요소는 (0보다는) 요소 번호 1이다.
예로서, 위의 예 1의 루프에서의 종속성들을 고려한다. 이 루프에서, 조건절의 참 및 거짓 반복들 사이의 전이들은 병렬화의 단절을 요구하는 루프 캐리 종속성을 나타낸다. 이것은 다음의 명령들을 이용하여 다뤄질 수 있다:
Figure pat00005
4번째 반복이 요구된 데이터를 발생하고 5번째 반복이 그것에 종속하기 때문에, (DIV인) 출력 벡터 p2의 위치 5에 4가 저장된다. 6번째 반복으로부터의 데이터에 종속하는 7번째 반복에 대해서 동일하게 적용된다. DIV의 다른 요소들은 종속성들의 부재를 나타내기 위해 0으로 설정된다. (이 예에서 벡터의 제1 요소가 요소 번호 1임에 주목한다.)
dest=GeneratePredicates(Pred, DIV)
GeneratePredicates는 종속성 인덱스 벡터 DIV를 취하고 pred에 의해 표시된, 프로세싱된 이전 그룹을 고려하여 안전하게 병렬로 프로세싱될 수 있는 요소들의 다음 그룹에 대응하는 프레디케이트들을 발생한다. pred의 요소들이 활성이 아니면, 프레디케이트들은 병렬로 안전하게 프로세싱될 수 있는 요소들의 제1 그룹에 대해 발생된다. pred가 벡터의 최종 요소들이 프로세싱되었음을 나타내면, 명령은 요소들이 프로세싱되어서는 안 되고 ZF 플래그가 설정됨을 나타내는 비활성 프레디케이트들의 결과 벡터를 발생한다. CF 플래그는 결과들의 최종 요소가 활성임을 나타내도록 설정된다. 제1 예의 값들을 이용하여, GeneratePredicates는 다음과 같이 연산한다.
Figure pat00006
모두 제로의 초기화된 프레디케이트 p2로부터, GeneratePredicates는 3개의 서브-벡터들(즉, p', p'', 및 p''')로 후속 벡터 계산들을 분할하는 p2의 새로운 인스턴스들(instances)을 발생한다. 이것은 하드웨어가 루프의 데이터 종속성들을 위반하는 것을 피하는 그룹들 내의 벡터를 프로세싱할 수 있게 한다.
도 4a에서, 예 1의 루프의 스칼라 실행 동안 변수 상태들의 시퀀스를 예시하는 도면이 도시된다. 더욱 구체적으로, 조건식의 방향의 임의 추출(randomized) 50/50 분포를 이용하여, 예 1의 루프의 변수 상태들의 진행(progression)이 도시된다. 도 4b에서, 예 1의 루프의 매크로스칼라 벡터화 프로그램 코드에 대한 실행의 진행을 예시하는 도면이 도시된다. 도 4a 및 도 4b에서, A[ ]로부터 판독된 값들은 좌측으로 기운 해시 마크들(leftward-slanting hash marks)을 이용하여 도시되고, B[ ]에 기입된 값들은 우측으로 기운 해시 마크들(rightward-slanting hash marks)을 이용하여 도시되고, (주어진 반복에서 변화되는 것에 따라) "r" 또는 "s"에 대한 값들은 음영 배경(shaded background)을 이용하여 도시된다. "s"가 변하고 있는 동안 "r"은 결코 변하지 않고, 그 반대로 가능함을 주시한다.
어떤 것도 모든 값들이 A[ ]로부터 병렬로 판독되고 B[ ]에 병렬로 기입되는 것을 방지하지 않는데, 그것은 값들의 세트가 루프 캐리 종속성 체인에 관여하지 않기 때문이다. 그러나, r 및 s의 계산을 위해, 요소들은 조건식의 값(즉, 참 또는 거짓의 런들(runs))이 동일하게 남는 동안에만 요소들이 병렬로 프로세싱될 수 있다. 이 루프에 대한 프로그램 코드의 실행에 대한 이 패턴이 도 4b에 도시된다. 예는 길이가 8개의 요소들을 갖는 벡터들을 이용한다는 것에 주목한다. 제1 벡터 명령을 프로세싱할 때, 제1 반복은 단독으로 수행되고(즉, 벡터 실행 유닛(204)은 제1 벡터 요소만을 프로세싱하고), 반복들 1-5은 벡터 실행 유닛(204)에 의해 병렬로 프로세싱되고 나서, 반복들 6-7이 벡터 실행 유닛(204)에 의해 병렬로 프로세싱된다.
도 5a 및 도 5b를 참조하면, 프로그램 코드의 벡터화의 일 실시예를 예시하는 도면들이 도시된다. 도 5a는 원래의 소스 코드를 도시하고, 도 5b는 매크로스칼라 아키텍처를 이용하여 수행될 수 있는 연산들을 나타내는 벡터화 코드를 예시한다. 도 5b의 벡터화 코드에서, 루프 1은 소스 코드로부터의 루프이고, 루프 2는 서브-벡터 파티션들을 프로세싱하는 벡터 분할 루프(vector-partitioning loop)이다.
예에서, 어레이 A[ ]는 풀 길이 벡터들로 판독 및 비교된다(즉, N 요소들의 벡터에 대해, 어레이 A[ ]의 N 위치들은 한번에 판독된다). 벡터 i2는 벡터의 분할을 제어하는 DIV이다. 분할은 관측되어야 하는 루프 캐리 종속성들을 나타내는, 참과 거짓 사이의 전이들에 대해 프레디케이트 p1를 모니터링함으로써 결정된다. 프레디케이트 벡터 p2는 임의의 시간에 어느 요소들이 작용될지를 결정한다. 이 특정 루프에서, p1은 임의의 서브-벡터 파티션(partition)의 모든 요소들에 동일한 값을 갖고, 따라서, 파티션의 제1 요소만이 어느 변수가 업데이트될지를 결정하기 위해 검사될 필요가 있다.
변수 "s"가 업데이트된 후에, PropagatePostT 명령은 벡터 내의 후속 요소들에 활성 파티션의 최종 값을 전파한다. 루프의 꼭대기에서, PropagatePriorF 명령은 다음 패스에 대한 준비로 벡터의 모든 요소들에 걸쳐서 최종 벡터 위치로부터 "s"의 최종 값을 복사한다. 변수 "r"은 특정 경우들에서 PropagatePriorF 명령을 이용하는 효율성을 예시하는, 상이한 방법을 이용하여 전파된다는 것에 주목한다.
소프트웨어 추측(Software Speculation)
이전 예에서, 벡터 분할 루프의 시작 이전의 벡터 파티션들이 결정될 수 있는데, 그것은 제어 흐름 결정이 루프 캐리 종속성들에 독립적이었기 때문이다. 그러나, 이것은 항상 그러한 것은 아니다. 예 2A 및 예 2B에 도시된 다음의 2개의 루프를 고려한다:
예 2A: 프로그램 코드 루프 1
Figure pat00007
예 2B: 프로그램 코드 루프 2
Figure pat00008
예 2A에서, 제어 흐름 결정은 루프 캐리 종속성 체인에 독립적이고, 도 2B에서, 제어 흐름 결정은 루프 캐리 종속성 체인의 부분이다. 일부 실시예들에서, 예 2B의 루프는 "j"의 값이 변화하지 않은 채로 남고 이 예측이 올바르지 않다고 판명되면 나중에 보상하는 추측을 일으킬 수 있다. 이러한 실시예들에서, "j"의 값에 대한 추측은 루프의 벡터화를 현저히 변화하지 않는다.
일부 실시예들에서, 컴파일러는 루프의 반복들 사이의 어떠한 데이터 종속성들도 항상 예측하지 않도록 구성될 수 있다. 이러한 실시예들에서, 실행시간 데이터 종속성들이 존재하는 경우에, 병렬로 프로세싱되는 활성 요소들의 그룹이 그 시간에 병렬로 안전하게 프로세싱될 수 있는 요소들의 그룹을 나타내도록 축소될 수 있다. 이들 실시예들에서, 어떠한 병렬화도 실제로 손실되지 않기 때문에 실제로 존재하는 더 많은 병렬화를 예측실패하기 위한 패널티가 약간 존재한다(즉, 필요한 경우, 반복들은 비-병렬 방식으로 한번에 하나의 요소를 프로세싱할 수 있다). 이들 실시예들에서, 병렬화의 실제 양은 나중의 스테이지에서 간단히 인식된다.
dest=VectorReadIntFF(Base, Offset, pf)
VectorReadIntFF는 VectorReadInt의 제1 결함 변형(first-faulting variant)이다. 이 명령은 적어도 제1 활성 요소가 유효 어드레스인 경우 결함을 발생하지 않는다. 무효 어드레스들에 대응하는 결과들은 제로로 되고, 이 데이터를 이용하는 나중의 명령들에 대해 프레디케이트들을 마스킹하는 데 이용될 수 있는 플래그들 pf이 리턴된다. 어드레스의 제1 활성 요소가 맵핑되지 않으면, 이 명령은 컴퓨터 시스템(100) 내의 가상 메모리 시스템(도시되지 않음)이 대응하는 페이지를 채울 수 있게 폴트(fault)함으로써, 프로세서(102)가 계속해서 앞으로 진행할 수 있도록 보장한다.
dest=Remaining(Pred)
나머지 명령은 프레디케이트들 Pred의 벡터를 평가하고, 벡터의 나머지 요소들을 계산한다. 이것은 최종 활성 프레디케이트를 뒤따르는 비활성 프레디케이트들의 세트에 대응한다. Pred에 활성 요소들이 존재하지 않으면, 모든 활성 프레디케이트들의 벡터가 리턴된다. 마찬가지로, Pred가 모든 활성 프레디케이트들의 벡터이면, 비활성 프레디케이트들의 벡터가 리턴된다. 예를 들어:
Figure pat00009
도 6a 및 도 6b는 예시적인 벡터화 프로그램 코드의 실시예들을 예시하는 도면들이다. 더욱 구체적으로, 도 6a에 도시된 코드 샘플은 예 2A(위에 제시됨)의 코드의 벡터화 버전이다. 도 6b에 도시된 코드 샘플은 예 2B의 코드의 벡터화 버전이다. 도 6b를 참조하면, A[ ]의 판독 및 후속 비교는 벡터 분할 루프 내부로 이동하였다. 따라서, 이들 연산들은 "j"의 값이 변화하지 않는 것을 추정한다(추측한다). "j"를 이용한 후에만, "j"가 값을 변화할 수 있는지를 결정하는 것이 가능하다. "j"가 업데이트된 후에, 나머지 벡터 요소들은 전체 벡터를 통해 반복하도록 필요에 따라 다시 계산된다. 추측 코드 샘플의 나머지 명령의 이용은 프로그램이 실제로 프로세싱에 안전한(즉, 해결되지 않은 데이터 종속성들을 갖지 않는) 이들 요소들의 서브-그룹을 결정할 수 있기 전에 어느 요소들이 벡터 분할 루프에서 프로세싱되도록 남아 있을지를 결정할 수 있게 한다.
다양한 실시예에서, 결함 허용(fault-tolerant) 판독 지원이 제공된다. 따라서, 이러한 실시예들에서, 프로세서(102)는 계산들에 나중에 이용될 값들을 로드하기 위한 시도로 벡터 명령(예를 들어, VectorReadFF)의 무효 요소들로부터 어드레스들을 이용하여 메모리로부터 데이터를 추측에 근거하여 판독할 수 있다. 그러나, 무효 판독이 발생하였음을 발견하면, 이들 값들은 궁극적으로 폐기되고, 따라서, 올바른 프로그램 거동에 적절하지 않다. 그러한 판독들은 존재하지 않는(non-existent) 또는 보호된 메모리를 참조할 수 있기 때문에, 이들 실시예들은 메모리로부터 잘못 판독한 무효이지만 무관한 데이터의 존재하에서 정상 실행을 계속하도록 구성될 수 있다. (가상 메모리를 지원하는 실시예들에서, 이것은 그렇게 할 필요가 확실할 때까지 페이징하지 않는 부가적인 이득을 가질 수 있다는 것에 주목한다.)
도 6a 및 도 6b에 도시된 프로그램 루프들에서, 나중의 반복들에 대한 프레디케이트 값에 상관없이, 조건이 참인 반복들과, 후속 반복들 사이에 루프 캐리 종속성이 존재한다. 이것은 ConditionalStop 명령의 파라미터들에 반영된다.
도 6a 및 도 6b의 샘플 프로그램 코드가 비-추측 및 추측 벡터 분할 사이의 차이를 강조한다. 더욱 구체적으로, 예 2A에서, ConditionalStop 이전에 메모리는 판독되고 프레디케이트는 계산된다. 분할 루프는 ConditionalStop 명령 후에 시작한다. 그러나, 예 2B에서, ConditionalStop 명령은 분할 루프 내부에서 실행되고, 앞선 연산들이 무효로 되는 종속성들을 인식하는 역할을 한다. 두 경우에, GeneratePredicates 명령은 분할 루프의 나머지를 위해 어느 요소들이 이용되는지를 제어하는 프레디케이트들을 계산한다.
프레디케이트에 대한 브랜치 예측실패
전술한 바와 같이, 프레디케이트 벡터들 및 따라서 프레디케이션은 벡터의 어느 요소들이 주어진 벡터 연산에 의해 변화할지 또는 변화하지 않은 채로 남을지를 결정하는 데 이용될 수 있다. 프레디케이션은 벡터 연산의 각각의 요소에 대해 개별적으로 제어될 수 있기 때문에, 어떤 경우에는, 벡터 연산이 실행될 때 결과적인 벡터의 요소가 실제로 수정되지 않도록, 벡터 연산의 모든 요소가 프레디케이트될 수 있는 것이 가능하다. 벡터의 요소들이 수정되지 않는 프레디케이트 벡터가 또한 널 프레디케이트 또는 엠프티 프레디케이트(empty predicate)로 지칭될 수 있다. 따라서, 프레디케이트 벡터가 널 또는 엠프티이면, 그 프레디케이트 벡터에 의해 프레디케이트되는 명령들의 결과들은 저장되지 않을 것이다. 널 프레디케이트로 실행되면, 그러한 명령들은 효과가 없을 것이지만, 그것들은 여전히 실행 리소스들(예를 들어, 실행 파이프라인의 슬롯)을 소모할 것이다. 따라서 그것들은 어쨌든 안전하게 실행으로부터 생략될 수 있어, 이것은 유용한 작업을 행하기 위해 실행 리소스들을 마련할 수 있다.
일부 실시예들에서, 브랜치 명령의 변형("엠프티/널 프레디케이트에 대한 브랜치" 명령이라고 지칭될 수 있음)이 널 프레디케이트 벡터에 의해 프레디케이트되는 명령들에 대해 브랜치하는 데 이용될 수 있다. 그러한 브랜치 명령 또는 다른 흐름 제어 명령은 예를 들어, 프레디케이트 벡터의 모든 요소들이 비활성 또는 "널"이면 프로그램 코드의 제어 흐름을 변경할 것이고, 브랜치 명령의 미선택 경로 또는 "셰도우(shadow)"에 있는 프로그램 명령들이 실행되지 않는 결과를 일으킨다. 따라서, 널 프레디케이트 명령에 대한 브랜치는 그의 명령들을 건너뛰는 데 이용될 수 있어, 그것들은 심지어 널 프레디케이트에 대해 실행될 필요가 없다. 예를 들어, 다음의 코드 세그먼트는 if-else 문을 포함한다. 참인 if 조건의 결과로서 수행되는 연산들은 거짓인 if 조건의 결과로서 수행되는 연산들과 상호 배타적이다.
예 3
Figure pat00010
예 3의 코드 세그먼트의 벡터화를 예시하는 코드 세그먼트의 예가 아래 예 4에 도시된다. 다음의 예시적인 코드 세그먼트에서, 전술한 바와 같은 브랜치 명령이 도시된다.
예 4
Figure pat00011
예 4의 코드 세그먼트에서, p1=(condition)는 프레디케이트 생성 명령이고, 브랜치들과 그것들 개개의 타깃들 사이의 명령들은 각각의 브랜치의 셰도우의 명령들이다. 엠프티 p1 명령들에 대한 브랜치를 이용하여 p1 벡터가 널일 때 명령들에 대해 브랜치한다. 예 3의 코드 세그먼트의 if-else 문들을 통해 구현된 상호 배타성을 구현하기 위해서, p1 벡터는 예 4의 코드 세그먼트에 덧붙여졌다. 따라서, 상호 배타성은 제2 브랜치 명령의 p1 벡터의 반대의 논리적 의미에서 브랜치함으로써 제공된다.
이 시나리오의 하나의 이슈는 그러한 흐름 제어 명령이 미선택으로 예측되고 예측이 잘못일 때 일어난다. 전술한 바와 같이, 종래의 예측실패 거동은 파이프라인이 플러싱되고 새로운 명령들이 파이프라인으로 인출되는 것을 지시한다. 이 시나리오에서, 예측실패 경로에 있는 명령들의 결과들은 저장되지 않을 수 있기 때문에, 그것의 명령들을 실행함에 있어서 실제로 해를 끼치지 않는다. 명령들을 실행하기 위한 패널티는 통상적으로 파이프라인을 플러싱하고 다시 채우기 위한 패널티보다 작다. 따라서, 아래 더 설명되는 바와 같이, 그러한 흐름 제어 명령의 예측실패를 검출하면, 예측실패 거동은 억제될 수 있다.
도 7에서, 프레디케이트된 브랜치 명령의 브랜치 예측실패 동안 도 2의 프로세서의 일 실시예의 동작을 도시하는 흐름도가 도시된다. 집합적으로 도 2 내지 도 7을 참조하여 도 7의 블록 701에서 시작하면, 브랜치 예측 유닛(210)은 프로그램 명령 실행의 제어 흐름이 프레디케이트 벡터의 요소들이 널이라는 결정에 응답하여 제어 흐름을 변경하는 조건부 흐름 제어 명령의 실행에 응답하여 변경되지 않을 것이라는 예측을 발생한다. 더욱 구체적으로, 일 실시예에서, 흐름 제어 명령은 널 프레디케이트 명령에 대한 브랜치일 수 있고, 예측은 미선택 브랜치 예측(branch not taken prediction)일 수 있다.
예측실패 유닛(212)은 브랜치 예측실패들을 검출하도록 구성된다. 따라서, 예측실패 유닛(212)은 예측이 올바르지 않음을 검출할 수 있다(블록 703). 예를 들어, 일 실시예에서, 예측실패 유닛(212)은 브랜치 명령이 선택 또는 미선택으로 예측되었는지를 추적할 수 있다. 일단 브랜치 명령이 실행되면, 벡터 실행 유닛은 브랜치 조건의 평가에 기초하여 브랜치가 실제로 선택 또는 미선택이었는지의 표시를 예측실패 유닛(212)에 제공할 수 있다. 예측실패의 검출에 응답하여, 예측실패 유닛(212)은 프로세서 예측실패 거동을 금지할 수 있다(블록 705). 일 실시예에서, 예측실패 유닛(212)은 예측실패 표시를 발생하고, 인출 유닛(201), 실행 유닛들(202, 204, 및 206) 및 브랜치 예측 유닛(210)에 그 표시를 제공하도록 구성될 수 있다. 그러한 실시예에서, 예측실패 브랜치로부터의 명령들을 갖는 실행 유닛의 파이프라인이 플러싱되는 것이 방지되고, 이로써 브랜치 명령의 예측실패 경로 내에 있는 명령들이 머신 상태를 변경하지 않고 실행될 수 있게 한다.
일 실시예에서, 예측실패 유닛(212)은 다음의 조건들이 충족될 때에 표시를 제공하도록 구성될 수 있다: 널 또는 엠프티 프레디케이트에 대한 브랜치가 올바르지 않게 미선택으로 예측되고, 엠프티 프레디케이트에 대한 브랜치의 조건-코드 플래그(condition-code flag; CCF)가 프레디케이트 생성 명령의 결과이고, 브랜치 명령과 브랜치 타깃 사이의 명령들 모두가, 프레디케이트 생성 명령으로부터 생기는 프레디케이트 또는 프레디케이트 생성 명령으로부터 생기는 프레디케이트에 의한 제로화 프레디케이션으로부터 얻어지는 프레디케이트로 프레디케이트된다. 위의 조건들이 충족되면, 올바르지 않게 실행된 명령들은 머신 상태에 영향을 주지 않을 수 있고, 이것은 그것들이 엠프티 프레디케이트로 실행되었고 따라서 양성(benign)이기 때문이다.
위의 실시예들은 상당히 상세하게 설명되었지만, 일단 위의 개시가 완전히 인식되면 다수의 변형들 및 수정들이 이 기술분야의 통상의 기술자에게 명백할 것이다. 다음의 청구항들은 모든 그러한 변형들 및 수정들을 포괄하는 것으로 해석되는 것이 의도된다.

Claims (13)

  1. 프로그램 명령 실행의 제어 흐름이 조건부 흐름 제어 명령의 실행에 응답하여 변경되지 않는다고 예측하는 예측(prediction)을 생성하는 단계 - 상기 조건부 흐름 제어 명령은, 프레디케이트 벡터(predicate vector)의 하나 이상의 요소들 각각이 널(null)이라는 결정에 응답하여 상기 제어 흐름을 변경함 -;
    상기 예측이 올바르지 않다고 검출하는 단계; 및
    상기 예측이 올바르지 않다고 검출하는 것에 응답하여, 예측실패 거동(misprediction behavior)을 금지하는 단계
    를 포함하는 방법.
  2. 제1항에 있어서, 상기 예측실패 거동을 금지하는 단계는, 상기 조건부 흐름 제어 명령의 예측실패한 경로 내에 있는 프로그램 명령들을 실행하는 단계를 포함하는 방법.
  3. 제1항에 있어서, 상기 예측실패 거동을 금지하는 단계는, 상기 조건부 흐름 제어 명령과 명령 타깃 사이의 프로그램 순서의 프로그램 명령들을, 프로세서의 실행 파이프라인으로부터 플러시(flush)하는 것을 금지하는 단계를 포함하는 방법.
  4. 제1항에 있어서, 하나 이상의 프레디케이트 요소들 각각은, 대응하는 벡터 요소가 특정 벡터 명령의 결과를 수신할 것인지, 또는 상기 특정 벡터 명령의 실행 동안 수정되지 않은 채로 유지될 것인지를 제어하는 방법.
  5. 제4항에 있어서, 상기 예측실패 거동을 금지하는 단계는, 상기 조건부 흐름 제어 명령에 의해 특정되는 조건-코드 플래그의 상태가 프레디케이트 생성 명령의 결과라는 결정을 수신하는 것에 또한 의존하는 방법.
  6. 제4항에 있어서, 상기 예측실패 거동을 금지하는 단계는, 상기 조건부 흐름 제어 명령과 상기 조건부 흐름 제어 명령의 명령 타깃 사이의 예측실패한 경로 내에 있는 프로그램 명령들이 상기 프레디케이트 벡터의 상기 프레디케이트 요소들에 의존한다는 결정을 수신하는 것에 또한 의존하는 방법.
  7. 제4항에 있어서, 상기 예측실패 거동을 금지하는 단계는, 상기 조건부 흐름 제어 명령과 상기 조건부 흐름 제어 명령의 명령 타깃 사이의 예측실패한 경로 내에 있는 프로그램 명령들이 상기 프레디케이트 벡터에 의한 제로화 프레디케이션(zeroing predication)으로부터 도출되는 프레디케이트 벡터에 의존한다는 결정을 수신하는 것에 또한 의존하는 방법.
  8. 벡터 프로그램 명령의 벡터 오퍼랜드(vector operand)의 상이한 요소들에 대해 동시에 동작하도록 구성되는 복수의 실행 파이프라인들을 포함하는 실행 유닛;
    상기 실행 유닛에 결합되며, 흐름 제어 명령이 프로그램 명령 실행의 제어 흐름을 변경하지 않을 것이라는 예측을 생성하도록 구성되는 예측 유닛 - 상기 흐름 제어 명령은, 프레디케이트 벡터의 하나 이상의 요소들 각각이 널이라는 결정에 응답하여 상기 제어 흐름을 변경함 -; 및
    상기 예측이 올바르지 않다고 검출하도록 구성되는 예측실패 검출 유닛
    을 포함하고,
    상기 예측실패 검출 유닛은, 상기 예측이 올바르지 않다고 검출하는 것에 응답하여 상기 실행 파이프라인들의 예측실패 거동을 금지하도록 또한 구성되는 프로세서.
  9. 제8항에 있어서, 예측실패 거동을 금지하기 위해서, 상기 예측실패 검출 유닛은, 상기 실행 유닛이 상기 흐름 제어 명령의 예측실패한 경로 내에 있는 프로그램 명령들을 실행하게 하도록 구성되는 프로세서.
  10. 제8항에 있어서, 하나 이상의 프레디케이트 요소들 각각은, 대응하는 벡터 요소가 특정 벡터 명령의 결과를 수신할 것인지, 또는 상기 특정 벡터 명령의 실행 동안 수정되지 않은 채로 유지될 것인지를 제어하도록 구성되는 프로세서.
  11. 제10항에 있어서, 상기 예측실패 검출 유닛은, 상기 흐름 제어 명령에 의해 특정되는 조건-코드 플래그의 상태가 프레디케이트 생성 명령의 결과라는 결정을 수신하는 것에 응답하여 예측실패 거동을 금지하도록 또한 구성되는 프로세서.
  12. 제11항에 있어서, 상기 예측실패 검출 유닛은, 상기 흐름 제어 명령과 상기 흐름 제어 명령의 명령 타깃 사이의 예측실패한 경로 내에 있는 프로그램 명령들이 상기 프레디케이트 벡터의 상기 프레디케이트 요소들 또는 상기 프레디케이트 벡터에 의한 제로화 프레디케이션으로부터 도출되는 프레디케이트 벡터 중 어느 하나에 의존한다는 결정을 수신하는 것에 응답하여 예측실패 거동을 금지하도록 또한 구성되는 프로세서.
  13. 프로그램 명령들을 저장하도록 구성되는 메모리; 및
    상기 메모리에 결합된 프로세서
    를 포함하고,
    상기 프로세서는,
    벡터 프로그램 명령의 벡터 오퍼랜드의 상이한 요소들에 대해 동시에 동작하도록 구성되는 복수의 실행 파이프라인들을 포함하는 실행 유닛;
    상기 실행 유닛에 결합되며, 흐름 제어 명령이 프로그램 명령 실행의 제어 흐름을 변경하지 않을 것이라는 예측을 생성하도록 구성되는 예측 유닛 - 상기 흐름 제어 명령은, 프레디케이트 벡터의 하나 이상의 요소들 각각이 널이라는 결정에 응답하여 상기 제어 흐름을 변경함 -; 및
    상기 예측이 올바르지 않다고 검출하도록 구성되는 예측실패 검출 유닛
    을 포함하고,
    상기 예측실패 검출 유닛은, 상기 예측이 올바르지 않다고 검출하는 것에 응답하여 상기 실행 파이프라인들의 예측실패 거동을 금지하도록 구성되는 시스템.
KR1020130019269A 2012-02-24 2013-02-22 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제 KR101417597B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US13/404,362 2012-02-24
US13/404,362 US9268569B2 (en) 2012-02-24 2012-02-24 Branch misprediction behavior suppression on zero predicate branch mispredict

Publications (2)

Publication Number Publication Date
KR20130097676A true KR20130097676A (ko) 2013-09-03
KR101417597B1 KR101417597B1 (ko) 2014-07-09

Family

ID=47720430

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020130019269A KR101417597B1 (ko) 2012-02-24 2013-02-22 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제

Country Status (7)

Country Link
US (1) US9268569B2 (ko)
EP (1) EP2631785A1 (ko)
JP (1) JP5612148B2 (ko)
KR (1) KR101417597B1 (ko)
CN (1) CN103353834B (ko)
TW (1) TW201349111A (ko)
WO (1) WO2013126228A2 (ko)

Families Citing this family (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9116686B2 (en) * 2012-04-02 2015-08-25 Apple Inc. Selective suppression of branch prediction in vector partitioning loops until dependency vector is available for predicate generating instruction
US9389860B2 (en) 2012-04-02 2016-07-12 Apple Inc. Prediction optimizations for Macroscalar vector partitioning loops
US20140189330A1 (en) * 2012-12-27 2014-07-03 Ayal Zaks Optional branches
US9367314B2 (en) * 2013-03-15 2016-06-14 Intel Corporation Converting conditional short forward branches to computationally equivalent predicated instructions
US9348589B2 (en) 2013-03-19 2016-05-24 Apple Inc. Enhanced predicate registers having predicates corresponding to element widths
US9817663B2 (en) 2013-03-19 2017-11-14 Apple Inc. Enhanced Macroscalar predicate operations
GB2519108A (en) * 2013-10-09 2015-04-15 Advanced Risc Mach Ltd A data processing apparatus and method for controlling performance of speculative vector operations
US10223113B2 (en) 2014-03-27 2019-03-05 Intel Corporation Processors, methods, systems, and instructions to store consecutive source elements to unmasked result elements with propagation to masked result elements
KR101818985B1 (ko) 2014-03-28 2018-02-28 인텔 코포레이션 마스킹된 결과 요소들로의 전파를 이용하여 소스 요소들을 대응하는 마스킹되지 않은 결과 요소들에 저장하기 위한 프로세서, 방법, 시스템 및 명령어
US9519482B2 (en) * 2014-06-20 2016-12-13 Netronome Systems, Inc. Efficient conditional instruction having companion load predicate bits instruction
TWI566090B (zh) * 2014-10-17 2017-01-11 Insyde Software Corp Debugging firmware / software to produce tracking systems and methods, recording media and computer program products
GB2540942B (en) * 2015-07-31 2019-01-23 Advanced Risc Mach Ltd Contingent load suppression
GB2548600B (en) * 2016-03-23 2018-05-09 Advanced Risc Mach Ltd Vector predication instruction
GB2558220B (en) 2016-12-22 2019-05-15 Advanced Risc Mach Ltd Vector generating instruction
US10503507B2 (en) * 2017-08-31 2019-12-10 Nvidia Corporation Inline data inspection for workload simplification
US11645078B2 (en) 2019-07-19 2023-05-09 Intel Corporation Detecting a dynamic control flow re-convergence point for conditional branches in hardware
CN111538535B (zh) * 2020-04-28 2021-09-21 支付宝(杭州)信息技术有限公司 一种cpu指令处理方法、控制器和中央处理单元
US11113067B1 (en) * 2020-11-17 2021-09-07 Centaur Technology, Inc. Speculative branch pattern update

Family Cites Families (47)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5522053A (en) 1988-02-23 1996-05-28 Mitsubishi Denki Kabushiki Kaisha Branch target and next instruction address calculation in a pipeline processor
US5471593A (en) 1989-12-11 1995-11-28 Branigin; Michael H. Computer processor with an efficient means of executing many instructions simultaneously
JPH04137169A (ja) 1990-09-28 1992-05-12 Nec Corp 情報処理装置
JPH04349570A (ja) * 1991-05-28 1992-12-04 Nec Corp 情報処理装置
US5835967A (en) * 1993-10-18 1998-11-10 Cyrix Corporation Adjusting prefetch size based on source of prefetch address
US5682493A (en) * 1993-10-21 1997-10-28 Sun Microsystems, Inc. Scoreboard table for a counterflow pipeline processor with instruction packages and result packages
EP0661625B1 (en) * 1994-01-03 1999-09-08 Intel Corporation Method and apparatus for implementing a four stage branch resolution system in a computer processor
US5687338A (en) * 1994-03-01 1997-11-11 Intel Corporation Method and apparatus for maintaining a macro instruction for refetching in a pipelined processor
US5809271A (en) * 1994-03-01 1998-09-15 Intel Corporation Method and apparatus for changing flow of control in a processor
US5740416A (en) * 1994-10-18 1998-04-14 Cyrix Corporation Branch processing unit with a far target cache accessed by indirection from the target cache
US5835951A (en) * 1994-10-18 1998-11-10 National Semiconductor Branch processing unit with target cache read prioritization protocol for handling multiple hits
US5732253A (en) * 1994-10-18 1998-03-24 Cyrix Corporation Branch processing unit with target cache storing history for predicted taken branches and history cache storing history for predicted not-taken branches
US5692168A (en) * 1994-10-18 1997-11-25 Cyrix Corporation Prefetch buffer using flow control bit to identify changes of flow within the code stream
JP3720371B2 (ja) * 1995-10-06 2005-11-24 アドバンスト・マイクロ・デバイシズ・インコーポレイテッド スーパースケーラープロセッサにおけるout−of−order実行のための統一化された機能オペレーションスケジューラ
US5799180A (en) 1995-10-31 1998-08-25 Texas Instruments Incorporated Microprocessor circuits, systems, and methods passing intermediate instructions between a short forward conditional branch instruction and target instruction through pipeline, then suppressing results if branch taken
US6282663B1 (en) 1997-01-22 2001-08-28 Intel Corporation Method and apparatus for performing power management by suppressing the speculative execution of instructions within a pipelined microprocessor
US6182210B1 (en) * 1997-12-16 2001-01-30 Intel Corporation Processor having multiple program counters and trace buffers outside an execution pipeline
US6157998A (en) * 1998-04-03 2000-12-05 Motorola Inc. Method for performing branch prediction and resolution of two or more branch instructions within two or more branch prediction buffers
JP2000293373A (ja) * 1999-04-12 2000-10-20 Hitachi Ltd 分岐予測装置
US6918032B1 (en) 2000-07-06 2005-07-12 Intel Corporation Hardware predication for conditional instruction path branching
US7165169B2 (en) * 2001-05-04 2007-01-16 Ip-First, Llc Speculative branch target address cache with selective override by secondary predictor based on branch instruction type
US20030135719A1 (en) 2002-01-14 2003-07-17 International Business Machines Corporation Method and system using hardware assistance for tracing instruction disposition information
US7155598B2 (en) 2002-04-02 2006-12-26 Ip-First, Llc Apparatus and method for conditional instruction execution
JP3709933B2 (ja) 2002-06-18 2005-10-26 日本電気株式会社 分岐予測による分岐命令高速化方法、およびプロセッサ
US7159103B2 (en) 2003-03-24 2007-01-02 Infineon Technologies Ag Zero-overhead loop operation in microprocessor having instruction buffer
US20050097304A1 (en) * 2003-10-30 2005-05-05 International Business Machines Corporation Pipeline recirculation for data misprediction in a fast-load data cache
US7587580B2 (en) * 2005-02-03 2009-09-08 Qualcomm Corporated Power efficient instruction prefetch mechanism
US7254700B2 (en) * 2005-02-11 2007-08-07 International Business Machines Corporation Fencing off instruction buffer until re-circulation of rejected preceding and branch instructions to avoid mispredict flush
US20060190710A1 (en) 2005-02-24 2006-08-24 Bohuslav Rychlik Suppressing update of a branch history register by loop-ending branches
US7734901B2 (en) 2005-10-31 2010-06-08 Mips Technologies, Inc. Processor core and method for managing program counter redirection in an out-of-order processor pipeline
US7711934B2 (en) * 2005-10-31 2010-05-04 Mips Technologies, Inc. Processor core and method for managing branch misprediction in an out-of-order processor pipeline
US8266413B2 (en) 2006-03-14 2012-09-11 The Board Of Trustees Of The University Of Illinois Processor architecture for multipass processing of instructions downstream of a stalled instruction
US7617387B2 (en) * 2006-09-27 2009-11-10 Qualcomm Incorporated Methods and system for resolving simultaneous predicted branch instructions
US7925868B2 (en) * 2007-01-24 2011-04-12 Arm Limited Suppressing register renaming for conditional instructions predicted as not executed
US7624254B2 (en) * 2007-01-24 2009-11-24 Qualcomm Incorporated Segmented pipeline flushing for mispredicted branches
US8131979B2 (en) 2008-08-15 2012-03-06 Apple Inc. Check-hazard instructions for processing vectors
US8271832B2 (en) 2008-08-15 2012-09-18 Apple Inc. Non-faulting and first-faulting instructions for processing vectors
US8099586B2 (en) * 2008-12-30 2012-01-17 Oracle America, Inc. Branch misprediction recovery mechanism for microprocessors
US8635437B2 (en) 2009-02-12 2014-01-21 Via Technologies, Inc. Pipelined microprocessor with fast conditional branch instructions based on static exception state
US20100262813A1 (en) 2009-04-14 2010-10-14 International Business Machines Corporation Detecting and Handling Short Forward Branch Conversion Candidates
JP5423156B2 (ja) * 2009-06-01 2014-02-19 富士通株式会社 情報処理装置及び分岐予測方法
US20110047357A1 (en) 2009-08-19 2011-02-24 Qualcomm Incorporated Methods and Apparatus to Predict Non-Execution of Conditional Non-branching Instructions
US8458684B2 (en) * 2009-08-19 2013-06-04 International Business Machines Corporation Insertion of operation-and-indicate instructions for optimized SIMD code
US8433885B2 (en) 2009-09-09 2013-04-30 Board Of Regents Of The University Of Texas System Method, system and computer-accessible medium for providing a distributed predicate prediction
US8555040B2 (en) 2010-05-24 2013-10-08 Apple Inc. Indirect branch target predictor that prevents speculation if mispredict is expected
US9098295B2 (en) * 2011-01-21 2015-08-04 Apple Inc. Predicting a result for an actual instruction when processing vector instructions
US8862861B2 (en) * 2011-05-13 2014-10-14 Oracle International Corporation Suppressing branch prediction information update by branch instructions in incorrect speculative execution path

Also Published As

Publication number Publication date
CN103353834B (zh) 2016-09-28
TW201349111A (zh) 2013-12-01
JP2013175201A (ja) 2013-09-05
KR101417597B1 (ko) 2014-07-09
US9268569B2 (en) 2016-02-23
WO2013126228A3 (en) 2015-06-18
US20130227251A1 (en) 2013-08-29
EP2631785A1 (en) 2013-08-28
WO2013126228A2 (en) 2013-08-29
CN103353834A (zh) 2013-10-16
JP5612148B2 (ja) 2014-10-22

Similar Documents

Publication Publication Date Title
KR101417597B1 (ko) 제로 프레디케이트 브랜치 예측실패에 대한 브랜치 예측실패 거동 억제
KR101511837B1 (ko) 벡터 분할 루프들의 성능 향상
US8555037B2 (en) Processing vectors using wrapping minima and maxima instructions in the macroscalar architecture
US9298456B2 (en) Mechanism for performing speculative predicated instructions
US8850162B2 (en) Macroscalar vector prefetch with streaming access detection
US9182959B2 (en) Predicate count and segment count instructions for processing vectors
US8527742B2 (en) Processing vectors using wrapping add and subtract instructions in the macroscalar architecture
US9471324B2 (en) Concurrent execution of heterogeneous vector instructions
US8539205B2 (en) Processing vectors using wrapping multiply and divide instructions in the macroscalar architecture
US9389860B2 (en) Prediction optimizations for Macroscalar vector partitioning loops
US9317284B2 (en) Vector hazard check instruction with reduced source operands
US20130318332A1 (en) Branch misprediction behavior suppression using a branch optional instruction
US9390058B2 (en) Dynamic attribute inference
US9335980B2 (en) Processing vectors using wrapping propagate instructions in the macroscalar architecture
US20130024669A1 (en) Processing vectors using wrapping shift instructions in the macroscalar architecture
US9335997B2 (en) Processing vectors using a wrapping rotate previous instruction in the macroscalar architecture
US20130024671A1 (en) Processing vectors using wrapping negation instructions in the macroscalar architecture
US9342304B2 (en) Processing vectors using wrapping increment and decrement instructions in the macroscalar architecture
US20130024656A1 (en) Processing vectors using wrapping boolean instructions in the macroscalar architecture

Legal Events

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

Payment date: 20170616

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20190617

Year of fee payment: 6