KR20240011204A - 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들 - Google Patents

행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들 Download PDF

Info

Publication number
KR20240011204A
KR20240011204A KR1020240002721A KR20240002721A KR20240011204A KR 20240011204 A KR20240011204 A KR 20240011204A KR 1020240002721 A KR1020240002721 A KR 1020240002721A KR 20240002721 A KR20240002721 A KR 20240002721A KR 20240011204 A KR20240011204 A KR 20240011204A
Authority
KR
South Korea
Prior art keywords
matrix
instruction
tile
input
data elements
Prior art date
Application number
KR1020240002721A
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 KR20240011204A publication Critical patent/KR20240011204A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T1/00General purpose image data processing
    • G06T1/20Processor architectures; Processor configuration, e.g. pipelining
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/16Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
    • 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/3001Arithmetic 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/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/30098Register arrangements
    • 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/3851Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution from multiple instruction streams, e.g. multistreaming
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T9/00Image coding
    • 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/34Addressing or accessing the instruction operand or the result ; Formation of operand address; Addressing modes

Abstract

행렬 연산 가속기에 관한 시스템, 방법, 및 장치가 설명된다. 일 실시예에서, 프로세서는 디코딩된 단일 명령어의 실행을 위해 스케줄링 모드로 스위칭가능한 단일 곱셈 누산 회로들의 2차원 그리드를 포함하는 행렬 연산 가속기 회로를 포함하고, 여기서 행렬 연산 가속기 회로는 제1 입력 2차원 행렬을 나타내는 제1 복수의 레지스터로부터 단일 곱셈 누산 회로들의 2차원 그리드의 제1 버퍼를 로드하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제1 입력 2차원 행렬을 나타내는 제2 복수의 레지스터로부터의 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우: 이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수를 방지하고, 제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 바로 직전의 입력 2차원 행렬에 대한 연산을 실행하여 결과물을 산출하고, 및 결과물을 결과물 스토리지에 저장하고, 및 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우: 제2 입력 2차원 행렬을 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼에 로드하고, 제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 제2 입력 2차원 행렬에 대한 연산을 실행하여 결과물을 산출하고, 및 결과물을 결과물 스토리지에 저장한다.

Description

행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들{APPARATUSES, METHODS, AND SYSTEMS FOR INSTRUCTIONS OF A MATRIX OPERATIONS ACCELERATOR}
본 개시내용은 일반적으로 컴퓨터 프로세서 아키텍처에 관한 것이고, 더 구체적으로는 행렬 연산 가속기 회로를 이용하여 행렬 연산을 수행하기 위한 명령어들을 실행하기 위한 장치들, 시스템들, 및 방법들에 관한 것이다.
프로세서, 또는 프로세서들의 세트는 명령어 세트, 예를 들어 명령어 세트 아키텍처(ISA)로부터의 명령어들을 실행한다. 명령어 세트는 프로그래밍에 관련된 컴퓨터 아키텍처의 일부이고, 일반적으로 네이티브 데이터 타입들, 명령어들, 레지스터 아키텍처, 어드레싱 모드들, 메모리 아키텍처, 인터럽트 및 예외 핸들링, 및 외부 입력 및 출력(I/O)을 포함한다. 본 명세서에서 명령어라는 용어는 매크로 명령어, 예를 들어, 실행을 위해 프로세서에 제공되는 명령어, 또는 마이크로 명령어, 예를 들어 매크로 명령어들을 디코딩하는 프로세서의 디코더로부터 기인하는 명령어를 지칭할 수 있다는 점에 유의해야 한다.
본 개시내용은 유사한 참조 번호가 유사한 요소를 표시하는 첨부 도면의 그림들에서 제한적인 것이 아니라 예를 들어서 예시된다.
도 1a는 본 개시내용의 실시예들에 따른 구성된 타일(tile)들의 실시예를 도시한다.
도 1b는 본 개시내용의 실시예들에 따른 구성된 타일들의 실시예를 도시한다.
도 2는 본 개시내용의 실시예들에 따른 행렬 스토리지의 몇 가지 예를 도시한다.
도 3은 본 개시내용의 실시예들에 따른 행렬(타일) 연산 가속기를 활용하는 시스템의 일 실시예를 도시한다.
도 4 및 도 5는 행렬 연산 가속기를 이용하여 메모리가 공유되는 방법의 상이한 실시예들을 도시한다.
도 6은 타일들을 이용한 행렬 곱셈 누산 연산("TMMA")의 실시예를 도시한다.
도 7은 체인화되고 단일화된(fused) 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다.
도 8은 체인화되고 단일화된 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다.
도 9는 체인화되고 단일화된 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다.
도 10은 체인화되고 단일화된 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다.
도 11은 2의 거듭제곱 크기의 SIMD 구현들을 예시하는데, 여기서 누산기들은 실시예에 따라 곱셈기들에 대한 입력들보다 더 큰 입력 크기들을 사용한다.
도 12는 행렬 연산 회로를 활용하는 시스템의 실시예를 도시한다.
도 13은 타일들을 사용하는 행렬 연산들을 지원하는 프로세서 코어 파이프라인의 실시예를 도시한다.
도 14는 타일들을 사용하는 행렬 연산들을 지원하는 프로세서 코어 파이프라인의 실시예를 도시한다.
도 15는 행 메이저 포맷(row major format) 및 열 메이저 포맷(column major format)으로 표현되는 행렬의 예를 도시한다.
도 16은 행렬들(타일들)의 사용의 예를 도시한다.
도 17은 행렬들(타일들)의 사용 방법의 실시예를 도시한다.
도 18은 실시예에 따른 타일들의 사용의 구성을 위한 지원을 도시한다.
도 19는 지원될 행렬들(타일들)의 설명의 실시예를 도시한다.
도 20a 내지 도 20d는 레지스터(들)의 예들을 도시한다.
도 21은 본 개시내용의 실시예들에 따른 행렬(타일) 연산 가속기를 활용하는 시스템의 실시예를 도시한다.
도 22는 본 개시내용의 실시예들에 따른 처리 요소 회로들의 2차원 그리드를 포함하는 행렬 연산 가속기 회로를 도시한다.
도 23은 본 개시내용의 실시예들에 따른 행렬 연산 가속기 회로의 디스패치 회로를 도시한다.
도 24는 본 개시내용의 실시예들에 따른 행렬 연산 가속기 회로의 디스패치 회로의 스케줄링 회로를 도시한다.
도 25는 본 개시내용의 실시예들에 따라, 베이스라인 스케줄링 모드로부터 입력 행렬을 재사용하는 스케줄링 모드로 스위칭가능한, 행렬 연산 가속기 회로의 디스패치 회로의 스케줄링 회로를 도시한다.
도 26은 본 개시내용의 실시예들에 따른 다중 경로에 대한 행렬 연산 가속기 회로의 디스패치 회로를 도시한다.
도 27은 본 개시내용의 실시예들에 따른 다중 패스에 대한 행렬 연산 가속기 회로의 디스패치 회로의 스케줄링 회로를 도시한다.
도 28은 본 개시내용의 실시예들에 따른 행렬 연산 회로를 위한 의사 코드를 도시한다.
도 29는 본 개시내용의 실시예들에 따른 행렬 연산 명령어를 처리하는 방법을 도시한다.
도 30a는 본 개시내용의 실시예들에 따른 일반 벡터 친화적 명령어 포맷(generic vector friendly instruction format) 및 그것의 클래스 A 명령어 템플릿들을 도시하는 블록도이다.
도 30b는 본 개시내용의 실시예들에 따른 일반 벡터 친화적 명령어 포맷 및 그것의 클래스 B 명령어 템플릿들을 도시하는 블록도이다.
도 31a는 본 개시내용의 실시예들에 따른, 도 30a 및 도 30b에서의 일반 벡터 친화형 명령어 포맷들에 대한 필드들을 도시하는 블록도이다.
도 31b는 본 개시내용의 일 실시예에 따른, 풀 오피코드 필드를 구성하는 도 31a에서의 특정 벡터 친화적 명령어 포맷의 필드들을 도시하는 블록도이다.
도 31c는 본 개시내용의 일 실시예에 따른 레지스터 인덱스 필드를 구성하는 도 31a에서의 특정 벡터 친화적 명령어 포맷의 필드들을 도시하는 블록도이다.
도 31d는 본 개시내용의 일 실시예에 따른 증강 연산 필드(3050)를 구성하는 도 31a에서의 특정 벡터 친화적 명령어 포맷의 필드들을 도시하는 블록도이다.
도 32는 본 개시내용의 일 실시예에 따른 레지스터 아키텍처의 블록도이다.
도 33a는 본 개시내용의 실시예들에 따른 예시적인 순차적 파이프라인 및 예시적인 레지스터 리네이밍, 비순차적 발행/실행 파이프라인의 둘 모두를 도시하는 블록도이다.
도 33b는 본 개시내용의 실시예들에 따른 프로세서에 포함될 순차적 아키텍처 코어의 예시적인 실시예 및 예시적인 레지스터 리네이밍, 비순차적 발행/실행 아키텍처 코어의 둘 모두를 도시하는 블록도이다.
도 34a는, 본 개시내용의 실시예들에 따라, 단일 프로세서 코어를, 온-다이 인터커넥트 네트워크로의 그의 접속 및 레벨 2(L2) 캐시의 그의 로컬 서브세트와 함께 나타낸 블록도이다.
도 34b는 본 개시내용의 실시예들에 따른 도 34a의 프로세서 코어의 일부의 확대도이다.
도 35는 본 개시내용의 실시예들에 따라, 둘 이상의 코어를 가질 수 있고, 통합 메모리 제어기를 가질 수 있고, 통합 그래픽을 가질 수 있는 프로세서의 블록도이다.
도 36은 본 개시내용의 일 실시예에 따른 시스템의 블록도이다.
도 37은 본 개시내용의 실시예에 따른 더 구체적인 예시적인 시스템의 블록도이다.
도 38은 본 개시내용의 실시예에 따른 제2의 더 구체적인 예시적인 시스템의 블록도이다.
도 39는 본 개시내용의 실시예에 따른 SoC(System-on-a-Chip)의 블록도이다.
도 40은 본 개시내용의 실시예들에 따라 소스 명령어 세트에서의 이진 명령어들을 타겟 명령어 세트에서의 이진 명령어들로 변환하기 위해 소프트웨어 명령어 변환기를 사용하는 것을 대비하는 블록도이다.
이하의 설명에서는 다수의 특정 상세 내용이 제시된다. 그러나, 실시예들은 이러한 상세 내용 없이도 실시될 수 있다는 것이 이해된다. 다른 경우들에서, 공지된 회로들, 구조들, 및 기술들은 이 설명의 이해를 모호하게 하지 않기 위해 상세히 나타내어지지 않는다.
본 명세서에서의 "일 실시예", "실시예", "예시적인 실시예" 등에 대한 언급은 설명된 실시예가 특정한 특징, 구조, 또는 특성을 포함할 수 있지만, 모든 실시예가 반드시 그 특정한 특징, 구조, 또는 특성을 포함하지는 않는다는 것을 나타낸다. 더욱이, 그러한 문구들은 반드시 동일한 실시예를 언급하는 것이 아니다. 또한, 특정의 특징, 구조, 또는 특성이 한 실시예와 연계하여 설명될 때, 명시적으로 설명되든지 아니든지 간에 다른 실시예들과 연계하여 그러한 특징, 구조, 또는 특성에 영향을 미치는 것은 본 기술 분야의 통상의 기술자의 지식 내에 있는 것이 제출된다.
행렬들은 머신 러닝 및 다른 벌크 데이터 처리와 같은 많은 컴퓨팅 작업들에서 점점 더 중요해지고 있다. 딥 러닝은 머신 학습 알고리즘의 클래스이다. 딥 신경망과 같은 딥 러닝 아키텍처는 컴퓨터 비전, 음성 인식, 자연 언어 처리, 오디오 인식, 소셜 네트워크 필터링, 기계 번역, 바이오 정보학 및 약품 설계를 포함하는 분야에 적용될 수 있다.
딥 러닝을 위해 사용되는 2개의 도구인 추론 및 훈련은 낮은 정밀도의 산술을 활용할 수 있다. 딥 러닝 알고리즘들 및 계산들의 처리량을 최대화하는 것은 딥 러닝 프로세서들, 예를 들어, 데이터 센터에서 딥 러닝을 수행하는 것들의 요구들을 충족시키는 데 도움을 줄 수 있다.
행렬-행렬 곱셈(GEMM 또는 일반 행렬 곱셈(General Matrix Multiplication)으로도 알려짐)은 특정 프로세서들에 대한 계산-집약적 연산이다. 행렬 곱셈(예를 들어, GEMM)을 위한 특별한 하드웨어는 딥 러닝과 같은 특정 애플리케이션들의 피크 계산(및 에너지 효율)을 개선하기 위한 양호한 옵션이다. 딥 러닝을 포함하는 이러한 응용들 중 일부는 출력 성분들이 충분한 비트들(예를 들어, 입력들보다 많은 것)을 갖는 한, 정확도를 잃지 않고서 비교적 적은 비트들을 갖는 입력 데이터 성분들에 대해 동작할 수 있다.
특정 프로세서들에서, 행렬들을 취급하는 것은 어려운 및/또는 명령어 집약적인 작업이다. 예를 들어, 행렬의 행들은 복수의 패킹된 데이터(예를 들어, SIMD 또는 벡터) 레지스터에 넣어질 수 있고, 그 후 개별적으로 연산될 수 있다. 예를 들어, 2개의 8x2(예를 들어, 행x열) 행렬의 덧셈은 데이터 크기들에 좌우되어 4개의 패킹된 데이터 레지스터로의 로드 또는 개더(gather)를 요구할 수 있다. 그 다음, 각각의 행렬로부터의 제1 행에 대응하는 패킹된 데이터 레지스터들의 제1 덧셈이 수행되고, 각각의 행렬로부터의 제2 행에 대응하는 패킹된 데이터 레지스터들의 제2 덧셈이 수행된다. 그 다음, 결과적인 패킹된 데이터 레지스터들이 메모리에 되돌려 스캐터링(scattering)된다. 작은 행렬들에 대해 이 시나리오가 수용 가능할 수 있는 반면, 이것은 종종 더 큰 행렬들에 대해서는 수용 가능하지 않다.
논의
중앙 처리 유닛(CPU), 그래픽 처리 유닛(GPU), 및 가속기와 같은 컴퓨터 하드웨어에서 행렬 연산을 지원하기 위한 메커니즘이 본 명세서에 설명된다. 행렬 연산들은 레지스터들과 같은 메모리의 하나 이상의 패킹된 영역들을 표현하는 2차원(2-D) 데이터 구조들을 활용한다. 이 설명 전체에 걸쳐, 이러한 2-D 데이터 구조들은 타일(tile)들로서 지칭된다. 행렬이 타일보다 작을 수 있거나(타일의 전부보다 작은 이용) 또는 복수의 타일을 활용할 수 있다(행렬이 임의의 하나의 타일의 크기보다 더 크다)는 것을 유의하라. 이 설명 전체에 걸쳐, 행렬(타일) 언어가 행렬에 영향을 미치는 타일들을 사용하여 수행되는 연산들을 나타내기 위해 사용된다. 해당 행렬이 임의의 하나의 타일보다 더 큰 지의 여부는 통상적으로 관련성이 없다.
각각의 타일은 본 명세서에 상술되고, 행렬(타일) 곱셈, 타일 덧셈, 타일 뺄셈, 타일 대각선, 타일 제로, 타일 변환, 타일 내적, 타일 브로드캐스트, 타일 행 브로드캐스트, 타일 열 브로드캐스트, 타일 곱셈, 타일 곱셈 및 누산, 타일 이동 등을 포함하지만, 이들로 제한되지는 않는 것들과 같은 상이한 연산들에 의해 작용을 받을 수 있다. 추가적으로, 스케일 및/또는 바이어스의 사용과 같은 연산자들에 대한 지원이 이러한 연산들과 함께 또는 미래에, 예를 들어, OpenCL "로컬 메모리", 데이터 압축/압축 해제 등의 비-수치적 응용들을 지원하기 위해 사용될 수 있다. 또한 본 명세서에서는 행렬 연산(예를 들어, TILEPARTIALDOTPRODUCT) 명령어들을 수행하기 위한 명령어들이 설명된다.
스토리지(예컨대, 메모리(비휘발성 및 휘발성), 레지스터들, 캐시 등)의 부분들은 상이한 수평 및 수직 차원들을 가진 타일들로 배열된다. 예를 들어, 한 타일은 4의 수평 차원(예를 들어, 행렬의 4개의 행) 및 8의 수직 차원(예를 들어, 행렬의 8개의 열)을 가질 수 있다. 통상적으로, 수평 차원은 성분 크기들(예를 들어, 2-, 4-, 8-, 16-, 32-, 64-, 128-비트 등)과 관련된다. 다수의 데이터 타입(단정도 부동 소수점, 배정도 부동 소수점, 정수 등)이 지원될 수 있다.
구성된 타일들의 예시적 사용
일부 실시예들에서, 타일 파라미터들이 구성될 수 있다. 예를 들어, 주어진 타일은 타일 옵션들을 제공하도록 구성될 수 있다. 예시적인 타일 옵션들은 타일의 행들의 수, 타일의 열들의 수, 타일이 VALID인지 여부, 및 타일이 동일 크기의 타일들의 PAIR로 구성되는지의 여부를 포함하지만 이에 제한되지는 않는다.
도 1a는 구성된 타일들의 실시예를 도시한다. 도시된 바와 같이, 애플리케이션 메모리(102)의 4 kB는 그 상에 4개의 1kB 타이틀인, 타일 t0(104), 타일 t1(106), 타일 t2(108), 및 타일 t3(110)을 저장하였다. 이 예에서, 4개의 타일은 쌍으로 구성되지 않고, 각각은 행들 및 열들로 배열된 성분들을 갖는다. 타일 t0(104) 및 타일 t1(106)은 4-바이트 성분들(예를 들어, 단정도 데이터)의 K개의 행 및 N개의 열을 가지며, 여기서 K는 8이고 N= 32이다. 타일 t2(108) 및 타일 t3(110)은 8-바이트 성분들(예를 들어, 배정도 데이터)의 K개의 행 및 N/2개의 열을 갖는다. 배정도 피연산자들이 단정도의 폭의 두 배이므로, 이러한 구성은 타일 옵션들을 제공하기 위해 사용되는 팔레트(palette)와 일치하며, 적어도 4 kB의 총 스토리지로 적어도 4개의 네임(name)을 공급한다. 연산 시에, 타일들은 로드 및 스토어 연산들을 이용하여 메모리로부터 로드되고 메모리에 저장될 수 있다. 사용되는 명령어 인코딩 방식에 좌우되어, 이용 가능한 애플리케이션 메모리의 양뿐만 아니라 이용 가능한 타일들의 크기, 수, 및 구성이 변한다.
도 1b는 구성된 타일들의 실시예를 도시한다. 도시된 바와 같이, 애플리케이션 메모리(122)의 4 kB는 2 쌍의 1kB 타이틀을 저장하였고, 제1 쌍은 타일 t4L(124) 및 타일 t4R(126)이고, 제2 쌍은 타일 t5L(128) 및 타일 t5R(130)이다. 도시된 바와 같이 타일 쌍들은 좌측 타일 및 우측 타일로 분할된다. 다른 실시예들에서, 타일 쌍은 짝수 타일 및 홀수 타일로 분할된다. 이 예에서, 4개의 타일 각각은 행들 및 열들로 배열된 성분들을 갖는다. 타일 t4L(124) 및 타일 t4R(126)은 4-바이트 성분들(예를 들어, 단정도 부동 소수점 데이터)의 K개의 행 및 N개의 열을 가지며, 여기서 K는 8과 동일하고 N은 32와 동일하다. 타일 t5L(128) 및 타일 t5R(130)은 8-바이트 성분들(예를 들어, 배정도 부동 소수점 데이터)의 K개의 행 및 N/2개의 열을 갖는다. 배정도 피연산자들이 단정도의 폭의 두 배이므로, 이 구성은 타일 옵션들을 제공하기 위해 사용되는 팔레트와 일치하며, 적어도 4 kB의 총 스토리지로 적어도 2개의 네임을 공급한다. 도 1a의 4개의 타일은 4개의 네임을 이용하고, 각각은 1 kB 타일을 네이밍하는 반면, 도 1b에서 2개의 타일 쌍은 쌍을 이룬 타일들을 지정하기 위해 2개의 네임을 이용할 수 있다. 일부 실시예들에서, 타일 명령어들은 쌍을 이룬 타일의 네임을 피연산자로서 접수한다. 연산 시에, 타일들은 로드 및 스토어 연산들을 이용하여 메모리로부터 로드되고 메모리에 저장될 수 있다. 사용되는 명령어 인코딩 방식에 좌우되어, 이용 가능한 애플리케이션 메모리의 양뿐만 아니라 이용 가능한 타일들의 크기, 수, 및 구성이 변한다.
일부 실시예들에서, 타일 파라미터들이 정의 가능하다. 예를 들어, "팔레트"는 타일 옵션들을 제공하기 위해 사용된다. 예시적인 옵션들은 타일 네임들의 수, 스토리지의 행에서의 바이트들의 수, 타일에서의 행들 및 열들의 수 등을 포함하지만, 이들로 제한되지는 않는다. 예를 들어, 타일의 최대 "높이"(행들의 수)는 다음과 같이 정의될 수 있다:
Tile Max Rows = Architected Storage / (The Number of Palette Names * The Number of Bytes per row).
이와 같이, 고정된 네임의 사용이 구현들에 걸쳐 상이한 스토리지 크기들을 활용할 수 있도록 애플리케이션이 작성될 수 있다.
타일들의 구성은 타일 구성("TILECONFIG") 명령어를 사용하여 행해지고, 여기서 특정 타일 사용은 선택된 팔레트에서 정의된다. 이 선언은 사용될 타일 네임들의 수, 네임(타일) 당 행들 및 열들의 요청된 수, 및 일부 실시예들에서, 각각의 타일의 요청된 데이터 타입을 포함한다. 일부 실시예들에서, 일관성 검사들이 TILECONFIG 명령어의 실행 동안 수행되어 이것이 팔레트 엔트리의 한정들과 일치하는지를 결정한다.
예시적 타일 스토리지 타입들
도 2는 행렬 스토리지의 몇 가지 예를 도시한다. (A)에서, 타일은 메모리에 저장된다. 도시된 바와 같이, 각각의 "행"은 4개의 패킹된 데이터 성분으로 구성된다. 다음 "행"을 얻기 위해, 스트라이드 값이 사용된다. 행들이 메모리에 연속적으로 저장될 수 있다는 것을 유의하라. 스트라이드된 메모리 액세스들은, 타일 스토리지가 밑에 있는 메모리 어레이 행 폭을 매핑하지 않을 때 하나의 행에서 이후 다음의 것으로의 액세스를 허용한다.
메모리로부터의 타일 로드들 및 메모리에의 스토어들은 통상적으로 애플리케이션 메모리로부터 데이터의 패킹된 행들로의 스트라이드된 액세스들이다. 예시적인 TILELOAD 및 TILESTORE 명령어들, 또는 로드-오피(load-op) 명령어들에서의 TILE 피연산자로서의 애플리케이션 메모리에 대한 다른 명령어 참조들은, 일부 실시예들에서, 2* 행들(까지의) 페이지 폴트들, 마스킹되지 않은 부동 소수점 예외들, 및/또는 명령어 당 인터럽트들을 핸들링하기 위해 재시작 가능하다.
(B)에서, 행렬은 패킹된 데이터 레지스터들(단일 명령어, 다중 데이터(SIMD) 또는 벡터 레지스터들)과 같은 복수의 레지스터로 구성된 타일에 저장된다. 이 예에서, 타일은 3개의 물리적 레지스터상에 오버레이된다. 통상적으로, 연속적인 레지스터들이 사용되지만, 반드시 그럴 필요는 없다.
(C)에서, 행렬은 타일 명령어들에서 사용되는 FMA(fused multiply accumulate) 회로에 액세스 가능한 비-레지스터 스토리지에서의 타일에 저장된다. 이 스토리지는 FMA의 내부에 있거나, 그것에 인접할 수 있다. 부가적으로, 이하에서 논의되는 일부 실시예들에서, 스토리지는 전체 행 또는 타일이 아니라 한 데이터 성분에 대한 것일 수 있다.
TMMA 아키텍처에 대한 지원되는 파라미터들은 CPUID를 통해 보고된다. 일부 실시예들에서, 정보의 리스트는 최대 높이 및 최대 SIMD 차원을 포함한다. TMMA 아키텍처를 구성하는 것은 각각의 타일에 대한 차원들, 각각의 타일에 대한 성분 크기 및 팔레트 식별자를 지정하는 것을 요구한다. 이 구성은 TILECONFIG 명령어를 실행함으로써 행해진다.
TILECONFIG 명령어의 성공적인 실행은 후속 TILE 연산자들을 가능하게 한다. TILERELEASEALL 명령어는 타일 구성을 클리어하고 (다음의 TILECONFIG 명령어가 실행될 때까지) TILE 연산들을 디스에이블시킨다. 일부 실시예들에서, XSAVE, XSTORE 등은 타일들을 사용하는 컨텍스트 스위칭(context switching)에서 사용된다. 일부 실시예들에서, 2 XCR0 비트가 XSAVE에서 사용되는데, 하나는 TILECONFIG 메타데이터에 대한 것이고, 하나의 비트는 실제 타일 페이로드 데이터에 대응한다.
TILECONFIG는 타일 사용을 구성할 뿐만 아니라, 프로그램이 타일들이 구성된 코드의 영역에 있음을 나타내는 상태 변수를 설정한다. 구현은 기존 레지스터 세트의 비 사용 등과 같이 타일 영역과 함께 사용될 수 있는 다른 명령어들에 대한 한정들을 하나하나 열거할 수 있다.
타일 영역에서 빠져나오는 것은 통상적으로 TILERELEASEALL 명령어로 행해진다. 이는 어떤 파라미터들도 취하지 않고 모든 타일들을 신속히 무효화하고(데이터가 더 이상 임의의 저장 또는 복원을 필요로 하지 않음을 나타냄), 타일 영역에 있는 것에 대응하는 내부 상태를 클리어한다.
일부 실시예들에서, 타일 연산들은 타일 구성에 의해 지정된 차원들을 넘는 임의의 행들 및 임의의 열들을 제로로 할 것이다. 예를 들어, 타일 연산들은 각각의 행이 기입됨에 따라 구성된 열들의 수(성분들의 크기로 팩토링(factoring)함)를 넘는 데이터를 제로로 할 것이다. 예를 들어, 64 바이트 행들 및 10개의 행 및 12개의 열로 구성된 타일을 갖는 경우, FP32 성분들을 기입하는 연산은 처음 10개의 행 각각을 출력/결과 데이터를 갖는 12*4 바이트로 기입할 것이고, 각각의 행에서 나머지 4*4 바이트를 제로로 할 것이다. 타일 연산들은 또한 처음 10개의 구성된 행 이후의 임의의 행들을 완전히 제로로 한다. 64 바이트 행들을 갖는 1K 타일을 사용할 때, 16개의 행이 있을 것이고, 따라서 이 예에서 마지막 6개의 행이 또한 제로로 될 것이다.
일부 실시예들에서, 컨텍스트 복원 명령어(예를 들어, XRSTOR)는, 데이터를 로드할 때, 타일에 대해 구성된 행들을 넘는 데이터가 제로로 유지될 것임을 강제한다. 어떤 유효 구성도 없다면, 모든 행들은 제로로 된다. 타일 데이터의 XRSTOR은 구성된 것들을 넘는 열들에 가비지(garbage)를 로드할 수 있다. 타일 구성과 연관되는 성분 폭이 없기 때문에 XRSTOR가 구성된 열들의 수를 넘어서 클리어하는 것은 가능하지 않아야 한다.
컨텍스트 저장(예를 들어, XSAVE)은 전체 TILE 스토리지 영역을 메모리에 기입할 때 이것을 노출시킨다. XRSTOR가 타일의 최우측 부분에 가비지 데이터를 로드하면, 그 데이터는 XSAVE에 의해 저장될 것이다. XSAVE는 각각의 타일에 대해 지정된 수를 넘는 행들에 대해 제로들을 기입할 것이다.
일부 실시예들에서, 타일 명령어들은 재시작 가능하다. 메모리에 액세스하는 연산들은 페이지 폴트들 후의 재시작을 허용한다. 부동 소수점 연산들을 처리하는 계산 명령어들은 마스킹되지 않은 부동 소수점 예외들을 또한 허용하며, 예외들의 마스킹은 제어 및/또는 상태 레지스터에 의해 제어된다.
이러한 이벤트들 후에 재시작 명령어들을 지원하기 위해, 명령어들은 이하 상세히 설명되는 시작 레지스터들에 정보를 저장한다.
행렬 (타일) 연산 시스템
예시적 하드웨어 지원
도 3은 행렬(타일) 연산 가속기를 활용하는 시스템의 실시예를 도시한다. 이 예시에서, 호스트 프로세서/처리 시스템(301)은 커맨드들(311)(예를 들어, 산술 또는 행렬 조작 연산들과 같은 행렬 조작 연산들, 또는 로드 및 스토어 연산들)을 행렬 연산 가속기(307)에 전달한다. 그러나, 이것은 단지 논의를 위한 목적으로 이러한 방식으로 도시된다. 후술하는 바와 같이, 이 가속기(307)는 처리 코어의 일부일 수 있다. 통상적으로, 타일 조작 연산자 명령어들인 커맨드들(311)은 레지스터-레지스터("reg-reg") 또는 레지스터-메모리("reg-mem") 포맷으로서 타일들을 참조할 것이다. TILESTORE, TILELOAD, TILECONFIG 등과 같은 다른 커맨드들은 타일에 대해 데이터 연산들을 수행하지 않는다. 커맨드들은 행렬 연산 가속기(307)가 핸들링하기 위한 디코딩된 명령어들(예를 들어, 마이크로-연산들(micro-ops)) 또는 매크로-명령어들일 수 있다.
이 예에서, 코히어런트 메모리 인터페이스(303)는 호스트 프로세서/처리 시스템(301) 및 행렬 연산 가속기(307)에 결합되어 이들이 메모리를 공유할 수 있도록 한다. 도 4 및 도 5는 행렬 연산 가속기를 이용하여 메모리가 공유되는 방법의 상이한 실시예들을 도시한다. 도 4에 도시된 바와 같이, 호스트 프로세서(401) 및 행렬 연산 가속기 회로(405)는 동일한 메모리(403)를 공유한다. 도 5는 호스트 프로세서(501) 및 행렬 연산 가속기(505)가 메모리를 공유하지 않지만 서로의 메모리에 액세스할 수 있는 실시예를 도시한다. 예를 들어, 프로세서(501)는 타일 메모리(507)에 액세스하고 그 호스트 메모리(503)를 정규의 것으로서 활용할 수 있다. 유사하게, 행렬 연산 가속기(505)는 호스트 메모리(503)에 액세스할 수 있지만, 더 통상적으로는 그 자신의 메모리(507)를 사용한다. 이러한 메모리들은 상이한 유형의 것일 수 있다는 것을 유의하라.
일부 실시예들에서, 타일들은 물리적 레지스터들 상의 오버레이를 이용하여 지원된다. 예를 들어, 타일은 구현에 좌우되어 16개의 1,024-비트 레지스터, 32개의 512-비트 레지스터 등을 활용할 수 있다. 일부 실시예들에서, 행렬 연산들은 레지스터들과 같은 메모리의 하나 이상의 패킹된 영역들을 표현하는 2차원(2-D) 데이터 구조들을 활용한다. 이 설명 전체에 걸쳐, 이러한 2-D 데이터 구조들은 타일들 또는 타일 레지스터들로 지칭된다.
일부 실시예들에서, 행렬 연산 가속기(307)는 데이터 버퍼들(305)에 결합되는 복수의 FMA(309)를 포함한다(일부 구현들에서, 이들 데이터 버퍼(305) 중 하나 이상은 도시된 바와 같이 그리드의 FMA들에 저장된다). 데이터 버퍼들(305)은 (예를 들어, 타일 로드 또는 타일 스토어 명령어를 사용하여) 메모리로부터 로드되는 타일들 및/또는 메모리에 저장되는 타일들을 버퍼링한다. 데이터 버퍼들은, 예를 들어, 복수의 레지스터일 수 있다. 통상적으로, 이들 FMA는 타일들을 판독 및 기입할 수 있는 체인화된 FMA들의 그리드(309)로서 배열된다. 이 예에서, 행렬 연산 가속기(307)는 타일들 T0, T1, 및 T2를 사용하여 행렬 곱셈 연산을 수행할 것이다. 타일들 중 적어도 하나는 FMA 그리드(309)에 하우징된다. 일부 실시예들에서, 연산에서의 모든 타일들은 FMA 그리드(309)에 저장된다. 다른 실시예들에서, 서브세트만이 FMA 그리드(309)에 저장된다. 도시된 바와 같이, T1은 하우징되고 T0 및 T2는 그렇지 않다. A, B, 및 C는 타일의 전체 공간을 차지하거나 그렇지 않을 수 있는 이러한 타일들의 행렬들을 참조한다는 점에 유의하라.
도 6은 타일들을 이용한 행렬 곱셈 누산 연산("TMMA")의 실시예를 도시한다.
행렬에서의 행들의 수(TILE A(601))는 특정 실시예들에서 계산의 레이턴시(latency)를 포함하는 직렬 (체인화된) FMA들의 수와 일치한다. 구현은 더 작은 높이의 그리드상에서 자유롭게 재순환하지만, 계산은 동일하게 유지된다.
소스/목적지 벡터는 N개의 행의 타일(TILE C(605))로부터 오고, FMA들의 그리드(611)는 N개의 벡터-행렬 연산을 수행하여 타일들의 행렬 곱셈을 수행하는 완전한 명령어를 초래한다. 타일 B(603)는 다른 벡터 소스이고, 각각의 스테이지에서 "브로드캐스트" 항들을 FMA들에 공급한다.
연산 시에, 일부 실시예들에서, (타일 B(603)에 저장된) 행렬 B의 성분들은 FMA들의 직사각형 그리드에 걸쳐 확산된다. (타일 A(601)에 저장되는) 행렬 A는 FMA들의 직사각형 그리드의 열 차원과 필적하도록 변환되는 행의 성분들을 갖는다. 그리드에서의 각각의 FMA에서, A 및 B의 성분이 곱해지고 (도면에서 위로부터의) 유입 가수(incoming summand)에 더해지고, 유출 합(outgoing sum)은 FMA들의 다음 행(또는 최종 출력)으로 넘겨진다.
단일 단계의 대기 시간은 K(행렬 B의 행 높이)에 비례하고 종속적 TMMA들은 통상적으로 해당 레이턴시를 숨기기에 충분한 소스-목적지 행들(단일 타일에서의 또는 타일에 걸친 것들)을 갖는다. 구현은 또한 시간 단계들에 걸쳐 SIMD(패킹된 데이터 성분) 차원 M(행렬 A의 행 높이)을 분할할 수 있지만, 이는 K가 곱해지는 상수를 단순히 변경한다. 프로그램이 TMMA에 의해 하나하나 열거된 최대보다 더 작은 K를 지정할 때, 구현은 이것을 "마스킹" 또는 "조기 아웃들(early outs)"로 자유롭게 구현한다.
전체 TMMA의 레이턴시는 N*K에 비례한다. 반복 레이트는 N에 비례한다. TMMA 명령어 당 MAC들의 수는 N*K*M이다.
도 7은 체인화되고 단일화된(fused) 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다. 특히, 이는 목적지의 하나의 패킹된 데이터 성분 위치의 반복의 실행 회로를 도시한다. 이 실시예에서, 체인화되고 단일화된 곱셈 누산은 유부호(signed) 소스들에 대해 연산하고 있는데, 여기서 누산기는 2x입력 데이터 크기이다.
제1 유부호 소스(소스 1(701)) 및 제2 유부호 소스(소스 2(703)) 각각은 4개의 패킹된 데이터 성분을 갖는다. 이들 패킹된 데이터 성분 각각은 부동 소수점 데이터와 같은 유부호 데이터를 저장한다. 제3 유부호 소스(소스 3(709))는 그 각각이 유부호 데이터를 저장하는 2개의 패킹된 데이터 성분을 갖는다. 제1 및 제2 유부호 소스들(701 및 703)의 크기들은 제3 유부호 소스(초기 값 또는 이전 결과)(709)의 크기의 절반이다. 예를 들어, 제1 및 제2 유부호 소스들(701 및 703)은 32 비트 패킹된 데이터 성분들(예를 들어, 단정도 부동 소수점)을 가질 수 있는 반면, 제3 유부호 소스(709)는 64 비트 패킹된 데이터 성분들(예를 들어, 배정도 부동 소수점)을 가질 수 있다.
이 예시에서, 제1 및 제2 유부호 소스들(701 및 703)의 2개의 최상위 패킹된 데이터 성분 위치 및 제3 유부호 소스(709)의 최상위 패킹된 데이터 성분 위치만이 도시된다. 물론, 다른 패킹된 데이터 성분 위치들도 처리될 것이다.
예시된 바와 같이, 패킹된 데이터 성분들은 쌍으로 처리된다. 예를 들어, 제1 및 제2 유부호 소스들(701 및 703)의 최상위 패킹된 데이터 성분 위치들의 데이터는 곱셈기 회로(705)를 이용하여 곱해지고, 제1 및 제2 유부호 소스들(701 및 703)의 제2 최상위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(707)를 이용하여 곱해진다. 일부 실시예들에서, 이들 곱셈기 회로(705 및 707)는 다른 패킹된 데이터 성분들 위치들에 대해 재사용된다. 다른 실시예들에서, 패킹된 데이터 성분들이 병렬로 처리되도록 추가적인 곱셈기 회로들이 사용된다. 일부 정황에서, 병렬 실행은 유부호 제3 소스(709)의 크기인 레인(lane)들을 사용하여 행해진다. 곱셈들 각각의 결과들은 덧셈 회로(711)를 이용하여 더해진다.
곱셈들의 결과들의 덧셈 결과는 (상이한 덧셈기(713) 또는 동일한 덧셈기(711)를 사용하여) 유부호 소스 3(709)의 최상위 패킹된 데이터 성분 위치로부터의 데이터에 더해진다.
마지막으로, 제2 덧셈의 결과는 유부호 제3 소스(709)로부터 이용되는 패킹된 데이터 성분 위치에 대응하는 패킹된 데이터 성분 위치에서 유부호 목적지(715)에 저장되거나 또는 반복이 있다면 다음 반복으로 넘겨진다. 일부 실시예들에서, 대응하는 기입마스크(비트)가 설정되면 스토리지가 발생하고, 설정되지 않으면 스토리지가 발생하지 않도록, 기입 마스크가 이 스토리지에 적용된다.
도 8은 체인화되고 단일화된 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다. 특히, 이는 목적지의 하나의 패킹된 데이터 성분 위치의 반복의 실행 회로를 도시한다. 이 실시예에서, 체인화되고 단일화된 곱셈 누산은 유부호(signed) 소스들에 대해 연산하고 있는데, 여기서 누산기는 2x입력 데이터 크기이다.
제1 유부호 소스(소스 1(801)) 및 제2 유부호 소스(소스 2(803)) 각각은 4개의 패킹된 데이터 성분을 갖는다. 이들 패킹된 데이터 성분 각각은 정수 데이터와 같은 유부호 데이터를 저장한다. 제3 유부호 소스(소스 3(809))는 그 각각이 유부호 데이터를 저장하는 2개의 패킹된 데이터 성분을 갖는다. 제1 및 제2 유부호 소스들(801 및 803)의 크기들은 제3 유부호 소스(809)의 크기의 절반이다. 예를 들어, 제1 및 제2 유부호 소스들(801 및 803)은 32-비트 패킹된 데이터 성분들(예를 들어, 단정도 부동 소수점)을 가질 수 있고, 제3 유부호 소스(809)는 64-비트 패킹된 데이터 성분들(예를 들어, 배정도 부동 소수점)을 가질 수 있다.
이 예시에서, 제1 및 제2 유부호 소스들(801 및 803)의 2개의 최상위 패킹된 데이터 성분 위치 및 제3 유부호 소스(809)의 최상위 패킹된 데이터 성분 위치만이 도시된다. 물론, 다른 패킹된 데이터 성분 위치들도 처리될 것이다.
예시된 바와 같이, 패킹된 데이터 성분들은 쌍으로 처리된다. 예를 들어, 제1 및 제2 유부호 소스들(801 및 803)의 최상위 패킹된 데이터 성분 위치들의 데이터는 곱셈기 회로(805)를 이용하여 곱해지고, 제1 및 제2 유부호 소스들(801 및 803)의 제2 최상위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(807)를 이용하여 곱해진다. 일부 실시예들에서, 이들 곱셈기 회로(805 및 807)는 다른 패킹된 데이터 성분들 위치들에 대해 재사용된다. 다른 실시예들에서, 패킹된 데이터 성분들이 병렬로 처리되도록 추가적인 곱셈기 회로들이 사용된다. 일부 정황에서, 병렬 실행은 유부호 제3 소스(초기 값 또는 이전 반복 결과)(809)의 크기인 레인들을 이용하여 행해진다. 곱셈들 각각의 결과들은 덧셈/포화(813) 회로를 이용하여 유부호 제3 소스(809)에 더해진다.
덧셈/포화(누산기) 회로(813)는 덧셈이 너무 큰 값을 야기할 때 피연산자의 부호를 보존한다. 특히, 포화 평가는 멀티-웨이-덧셈(multi-way-add)과 목적지 또는 다음 반복에 대한 기입 사이의 무한 정밀도 결과에 대해 발생한다. 누산기(813)가 부동 소수점이고 입력 항들이 정수일 때, 부동 소수점 누산기 입력 값 및 곱(product)들의 합이 무한 정밀도 값들(수백 비트의 고정 소수점 수들)로 전환되고, 곱셈 결과들과 제3 입력의 덧셈이 수행되고, 실제 누산기 타입으로의 단일 반올림이 수행된다.
무부호 포화(unsigned saturation)는 출력 값들이 해당 성분 폭에 대한 최대의 무부호 수(모두 1들)에 제한된다는 것을 의미한다. 유부호 포화는 값이 해당 성분 폭에 대한 최소 음수와 최대 양수 사이의 범위에 있는 것으로 제한된다(예를 들어, 바이트들에 대해, 그 범위는 -128(=-2^7) 내지 127(= 2^7-1)이다).
덧셈 및 포화 검사의 결과는 유부호 제3 소스(809)로부터 이용되는 패킹된 데이터 성분 위치에 대응하는 패킹된 데이터 성분 위치에서 유부호 결과(815)에 저장되거나 또는 반복이 있는 경우 다음 반복으로 넘겨진다. 일부 실시예들에서, 대응하는 기입마스크(비트)가 설정되면 스토리지가 발생하고, 설정되지 않으면 스토리지가 발생하지 않도록, 기입 마스크가 이 스토리지에 적용된다.
도 9는 체인화되고 단일화된 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다. 특히, 이는 목적지의 하나의 패킹된 데이터 성분 위치의 반복의 실행 회로를 도시한다. 이 실시예에서, 체인화되고 단일화된 곱셈 누산은 유부호 소스 및 무부호 소스에 대해 연산하고 있고, 여기서 누산기는 4x입력 데이터 크기이다.
제1 유부호 소스(소스 1(901)) 및 제2 무부호 소스(소스 2(903)) 각각은 4개의 패킹된 데이터 성분을 갖는다. 이들 패킹된 데이터 성분 각각은 부동 소수점 또는 정수 데이터와 같은 데이터를 갖는다. 제3 유부호 소스(초기 값 또는 결과(915))는 패킹된 데이터 성분을 갖는데, 이것의 패킹된 데이터 성분은 유부호 데이터를 저장한다. 제1 및 제2 소스들(901 및 903)의 크기들은 제3 유부호 소스(915)의 1/4이다. 예를 들어, 제1 및 제2 소스들(901 및 903)은 16-비트 패킹된 데이터 성분들(예를 들어, 워드)을 가질 수 있고, 제3 유부호 소스(915)는 64-비트 패킹된 데이터 성분들(예를 들어, 배정도 부동 소수점 또는 64-비트 정수)을 가질 수 있다.
이 예시에서, 제1 및 제2 소스들(901 및 903)의 4개의 최상위 패킹된 데이터 성분 위치들 및 제3 유부호 소스(915)의 최상위 패킹된 데이터 성분 위치가 도시된다. 물론, 다른 패킹된 데이터 성분 위치들도 존재하는 경우에 처리될 것이다.
예시된 바와 같이, 패킹된 데이터 성분들은 4개조로 처리된다. 예를 들어, 제1 및 제2 소스들(901 및 903)의 최상위 패킹된 데이터 성분 위치들의 데이터는 곱셈기 회로(905)를 이용하여 곱해지고, 제1 및 제2 소스들(901 및 903)의 제2 최상위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(907)를 이용하여 곱해지고, 제1 및 제2 소스들(901 및 903)의 제3 최상위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(909)를 이용하여 곱해지고, 제1 및 제2 소스들(901 및 903)의 최하위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(911)를 이용하여 곱해진다. 일부 실시예들에서, 제1 소스(901)의 유부호 패킹된 데이터 성분들은 부호 확장되고, 제2 소스(903)의 무부호 패킹된 데이터 성분들은 곱셈들 전에 제로 확장된다.
일부 실시예들에서, 이들 곱셈기 회로들(905-911)은 다른 패킹된 데이터 성분들 위치들에 대해 재사용된다. 다른 실시예들에서, 패킹된 데이터 성분들이 병렬로 처리되도록 추가적인 곱셈기 회로들이 사용된다. 일부 정황에서, 병렬 실행은 유부호 제3 소스(915)의 크기인 레인들을 사용하여 행해진다. 곱셈들 각각의 결과들은 덧셈 회로(913)를 이용하여 더해진다.
곱셈들의 결과들의 덧셈의 결과는 (상이한 덧셈기(917) 또는 동일한 덧셈기(913)를 사용하여) 유부호 소스 3(915)의 최상위 패킹된 데이터 성분 위치로부터의 데이터에 더해진다.
마지막으로, 제2 덧셈의 결과(919)는 유부호 제3 소스(915)로부터 이용되는 패킹된 데이터 성분 위치에 대응하는 패킹된 데이터 성분 위치에서 유부호 목적지에 저장되거나 또는 다음 반복으로 넘겨진다. 일부 실시예들에서, 대응하는 기입마스크(비트)가 설정되면 스토리지가 발생하고, 설정되지 않으면 스토리지가 발생하지 않도록, 기입 마스크가 이 스토리지에 적용된다.
도 10은 체인화되고 단일화된 곱셈 누산 명령어의 반복 실행의 서브세트의 실시예를 도시한다. 특히, 이는 목적지의 하나의 패킹된 데이터 성분 위치의 반복의 실행 회로를 도시한다. 이 실시예에서, 체인화되고 단일화된 곱셈 누산은 유부호 소스 및 무부호 소스에 대해 연산하고 있고, 여기서 누산기는 4x입력 데이터 크기이다.
제1 유부호 소스(1001) 및 제2 무부호 소스(1003) 각각은 4개의 패킹된 데이터 성분을 갖는다. 이들 패킹된 데이터 성분 각각은 부동 소수점 또는 정수 데이터와 같은 데이터를 저장한다. 제3 유부호 소스(1015)(초기 또는 이전 결과)는 패킹된 데이터 성분을 갖는데, 이것의 패킹된 데이터 성분은 유부호 데이터를 저장한다. 제1 및 제2 소스들의 크기들은 제3 유부호 소스(1015)(초기 또는 이전 결과)의 1/4이다. 예를 들어, 제1 및 제2 소스들은 16-비트 패킹된 데이터 성분들(예를 들어, 워드)을 가질 수 있고, 제3 유부호 소스(1015)는 64-비트 패킹된 데이터 성분들(예를 들어, 배정도 부동 소수점 또는 64-비트 정수)을 가질 수 있다.
이 예시에서, 제1 유부호 소스(1001) 및 제2 무부호 소스(1003)의 4개의 최상위 패킹된 데이터 성분 위치들 및 제3 유부호 소스(1015)의 최상위 패킹된 데이터 성분 위치가 도시된다. 물론, 다른 패킹된 데이터 성분 위치들도 존재하는 경우에 처리될 것이다.
예시된 바와 같이, 패킹된 데이터 성분들은 4개조로 처리된다. 예를 들어, 제1 유부호 소스(1001) 및 제2 무부호 소스(1003)의 최상위 패킹된 데이터 성분 위치들의 데이터는 곱셈기 회로(1005)를 이용하여 곱해지고, 제1 유부호 소스(1001) 및 제2 무부호 소스(1003)의 제2 최상위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(1007)를 이용하여 곱해지고, 제1 유부호 소스(1001) 및 제2 무부호 소스(1003)의 제3 최상위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(1009)를 이용하여 곱해지고, 제1 유부호 소스(1001) 및 제2 무부호 소스(1003)의 최하위 패킹된 데이터 성분 위치들로부터의 데이터는 곱셈기 회로(1011)를 이용하여 곱해진다. 일부 실시예들에서, 제1 유부호 소스(1001)의 유부호 패킹된 데이터 성분들은 부호 확장되고, 제2 무부호 소스(1003)의 무부호 패킹된 데이터 성분들은 곱셈들 전에 제로 확장된다.
일부 실시예들에서, 이들 곱셈기 회로(1005-1011)는 다른 패킹된 데이터 성분들 위치들에 대해 재사용된다. 다른 실시예들에서, 패킹된 데이터 성분들이 병렬로 처리되도록 추가적인 곱셈기 회로들이 사용된다. 일부 정황에서, 병렬 실행은 제3 유부호 소스(1015)(초기 또는 이전 결과)의 크기인 레인들을 사용하여 행해진다. 곱셈들의 결과들의 덧셈 결과는, 덧셈/포화 회로(1013)를 이용하여 제3 유부호 소스(1015)(초기 또는 이전 결과)의 최상위 패킹된 데이터 성분 위치로부터의 데이터에 더해진다.
덧셈/포화(누산기) 회로(1013)는 덧셈이 유부호 포화에 대해 너무 크거나 너무 작은 값을 초래할 때 피연산자의 부호를 보존한다. 특히, 포화 평가는 멀티-웨이-덧셈과 목적지에 대한 기입 사이의 무한 정밀도 결과에 대해 발생한다. 누산기(1013)가 부동 소수점이고 입력 항들이 정수일 때, 부동 소수점 누산기 입력 값 및 곱(product)들의 합이 무한 정밀도 값들(수백 비트의 고정 소수점 수들)로 전환되고, 곱셈 결과들과 제3 입력의 덧셈이 수행되고, 실제 누산기 타입으로의 단일 반올림이 수행된다.
덧셈 및 포화 검사의 결과(1019)는 제3 유부호 소스(1015)(초기 또는 이전 결과)로부터 이용되는 패킹된 데이터 성분 위치에 대응하는 패킹된 데이터 성분 위치에서 유부호 목적지에 저장되거나 또는 다음 반복으로 넘겨진다. 일부 실시예들에서, 대응하는 기입마스크(비트)가 설정되면 스토리지가 발생하고, 설정되지 않으면 스토리지가 발생하지 않도록, 기입 마스크가 이 스토리지에 적용된다.
도 11은 2의 거듭제곱 크기의 SIMD 구현들을 예시하는데, 여기서 누산기들은 실시예에 따라 곱셈기들에 대한 입력들보다 더 큰 입력 크기들을 사용한다. (곱셈기들에 대한) 소스 및 누산기 값들이 유부호이거나 무부호 값들일 수 있다는 점에 유의하라. 2X 입력 크기들을 갖는 누산기에 대해(다시 말해서, 누산기 입력 값이 소스들의 패킹된 데이터 성분 크기들의 크기의 2배임), 테이블(1101)은 상이한 구성들을 예시한다. 바이트 크기의 소스들에 대해, 누산기는 워드 또는 크기가 16-비트인 HPFP(half-precision floating-point) 값들을 사용한다. 워드 크기의 소스들에 대해, 누산기는 32-비트 정수 또는 크기가 32-비트인 SPFP(single-precision floating-point) 값들을 사용한다. SPFP 또는 32-비트 정수 크기의 소스들에 대해, 누산기는 64-정수 또는 크기가 64-비트인 DPFP(double-precision floating-point) 값들을 사용한다.
4X 입력 크기들을 갖는 누산기에 대해(다시 말해서, 누산기 입력 값은 소스들의 패킹된 데이터 성분 크기들의 크기의 4배임), 테이블(1103)은 상이한 구성들을 예시한다. 바이트 크기의 소스들에 대해, 누산기는 32-비트 정수 또는 크기가 32-비트인 SPFP(single-precision floating-point) 값들을 사용한다. 워드 크기의 소스들에 대해, 누산기는 64-비트 정수 또는 일부 실시예들에서 크기가 64-비트인 DPFP(double-precision floating-point) 값들을 사용한다.
8X 입력 크기들을 갖는 누산기에 대해(다시 말해서, 누산기 입력 값은 소스들의 패킹된 데이터 성분 크기들의 크기의 8배임), 테이블(1105)은 한 구성을 예시한다. 바이트 크기의 소스들에 대해, 누산기는 64-비트 정수를 사용한다.
초기에 언급한 바와 같이, 행렬 연산 회로가 코어에 또는 외부 가속기로서 포함될 수 있다. 도 12는 행렬 연산 회로를 활용하는 시스템의 실시예를 도시한다. 이 예시에서, 복수의 엔티티가 링 인터커넥트(1245)로 결합된다.
복수의 코어, 코어 0(1201), 코어 1(1203), 코어 2(1205), 및 코어 N(1207)은 비-타일-기반 명령어 지원을 제공한다. 일부 실시예들에서, 행렬 연산 회로(1251)가 코어(1203)에 제공되고, 다른 실시예들에서 행렬 연산 회로(1211 및 1213)는 링 인터커넥트(1245)상에서 액세스 가능하다.
부가적으로, 하나 이상의 메모리 제어기(1223 내지 1225)가 코어들 및/또는 행렬 연산 회로를 대신하여 메모리(1233 및 1231)와 통신하도록 제공된다.
도 13은 타일들을 사용하는 행렬 연산들을 지원하는 프로세서 코어 파이프라인의 실시예를 도시한다. 분기 예측 및 디코딩 회로(1303)는 명령어 스토리지(1301)에 저장된 명령어들로부터 명령어들의 분기 예측, 명령어들의 디코딩, 및/또는 둘 다를 수행한다. 예를 들어, 본 명세서에 상세히 설명된 명령어들은 명령어 스토리지에 저장될 수 있다. 일부 구현들에서, 별개의 회로가 분기 예측을 위해 사용되고, 일부 실시예들에서 적어도 일부 명령어들은 마이크로코드(1305)를 사용하여 하나 이상의 마이크로-연산, 마이크로-코드 엔트리 포인트들, 마이크로명령어들, 다른 명령어들, 또는 다른 제어 신호들로 디코딩된다. 분기 예측 및 디코딩 회로(1303)는 다양하고 상이한 메커니즘들을 이용하여 구현될 수 있다. 적합한 메커니즘들의 예들은 룩업 테이블, 하드웨어 구현, PLA(programmable logic array)들, 마이크로코드 ROM(read only memory)들 등을 포함하지만 이에 한정되지는 않는다.
분기 예측 및 디코딩 회로(1303)는 일부 실시예들에서 스케줄러 회로(1309)에 결합되는 할당/리네임(1307) 회로에 결합된다. 일부 실시예들에서, 이러한 회로들은 1) 논리적 피연산자 값들을 물리적 피연산자 값들(예를 들어, 일부 실시예들에서 레지스터 에일리어스 테이블)로 리네이밍하는 것, 2) 상태 비트들 및 플래그들을 디코딩된 명령어에 할당하는 것, 및 3)(예를 들어, 일부 실시예들에서 예약 스테이션을 이용하여) 명령어 풀로부터 실행 회로상에서의 실행을 위해 디코딩된 명령어를 스케줄링하는 것 중 하나 이상을 수행함으로써 레지스터 리네이밍, 레지스터 할당, 및/또는 스케줄링 기능을 제공한다.
스케줄러 회로(1309)는 예약 스테이션들, 중앙 명령어 윈도우 등을 포함하는 임의의 수의 상이한 스케줄러들을 나타낸다. 스케줄러 회로(1309)는 물리적 레지스터 파일(들)(1315)에 결합되거나 이것을 포함한다. 물리적 레지스터 파일(들)(1315) 각각은 하나 이상의 물리적 레지스터 파일들을 나타내고, 이들 중 상이한 물리적 레지스터 파일들은 스칼라 정수, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점, 상태(예를 들어, 실행될 다음 명령어의 어드레스인 명령어 포인터), 타일들 등과 같은 하나 이상의 상이한 데이터 타입을 저장한다. 일 실시예에서, 물리적 레지스터 파일(들)(1315)은 벡터 레지스터 회로, 기입 마스크 레지스터 회로, 및 스칼라 레지스터 회로를 포함한다. 이들 레지스터 회로는 아키텍처적 벡터 레지스터들(architectural vector registers), 벡터 마스크 레지스터들, 및 범용 레지스터들을 제공할 수 있다. 물리적 레지스터 파일(들)(1315)은 레지스터 리네이밍 및 비순차적 실행이 (예를 들어, 리오더 버퍼(들) 및 리타이어먼트 레지스터 파일(들)을 이용하여; 장래 파일(들), 이력 버퍼(들), 및 리타이어먼트 레지스터 파일(들)을 이용하여; 레지스터 맵들 및 레지스터들의 풀을 이용하는 등으로) 구현될 수 있는 다양한 방식을 예시하기 위해 리타이어먼트 회로(1317)에 의해 오버랩된다. 리타이어먼트 회로(1317) 및 물리적 레지스터 파일(들)(1315)은 실행 회로(1311)에 결합된다.
레지스터 리네이밍이 비순차적 실행의 맥락에서 설명되었지만, 레지스터 리네이밍은 순차적 아키텍처에서 사용될 수 있다는 점을 이해해야 한다. 프로세서의 예시된 실시예가 또한 개별적인 명령어 및 데이터 캐시 유닛들과 공유 L2 캐시 유닛을 포함하고 있지만, 대안의 실시예들은, 예를 들어, 레벨 1(L1) 내부 캐시, 또는 다수의 레벨의 내부 캐시와 같은, 명령어들 및 데이터 둘 다에 대한 단일의 내부 캐시를 가질 수 있다. 일부 실시예들에서, 시스템은 내부 캐시와, 코어 및/또는 프로세서에 대해 외부에 있는 외부 캐시의 조합을 포함할 수 있다. 대안적으로, 모든 캐시는 코어 및/또는 프로세서에 대해 외부에 있을 수 있다.
실행 회로(1311)는, 스칼라 회로(1321), 벡터/SIMD 회로(1323), 및 행렬 연산 회로(1327) 뿐만 아니라 캐시(1313)에 액세스하는 메모리 액세스 회로(1325)를 포함하는 하나 이상의 실행 회로의 세트이다. 실행 회로들은 다양한 타입의 데이터(예를 들어, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점)에 대해 다양한 연산들(예를 들어, 시프트, 덧셈, 뺄셈, 곱셈)을 수행한다. 일부 실시예들은 특정 기능들이나 기능들의 세트들에 전용되는 다수의 실행 유닛을 포함할 수 있지만, 다른 실시예들은 단 하나의 실행 유닛 또는 모두가 모든 기능들을 수행하는 다중 실행 유닛을 포함할 수 있다. 스칼라 회로(1321)는 스칼라 연산들을 수행하고, 벡터/SIMD 회로(1323)는 벡터/SIMD 연산들을 수행하고, 행렬 연산 회로(1327)는 본 명세서에서 상세히 설명된 행렬(타일) 연산들을 수행한다.
예를 들어, 예시적 레지스터 리네이밍, 비순차적 발행/실행 코어 아키텍처는 다음과 같이 파이프라인을 구현할 수 있다: 1) 명령어 페치 회로가 페치 및 길이 디코딩 스테이지들을 수행한다; 2) 분기 및 디코딩 회로(1303)가 디코딩 스테이지를 수행한다; 3) 할당/리네임(1307) 회로가 할당 스테이지 및 리네이밍 스테이지를 수행한다; 4) 스케줄러 회로(1309)가 스케줄링 스테이지를 수행한다; 5) 물리적 레지스터 파일(들)(스케줄러 회로(1309) 및 할당/리네임 회로(1307)에 결합되거나, 그에 포함됨) 및 메모리 유닛은 레지스터 판독/메모리 판독 스테이지를 수행한다; 실행 회로(1311)는 실행 스테이지를 수행한다; 6) 메모리 유닛 및 물리적 레지스터 파일(들) 유닛(들)은 라이트백/메모리 기입 스테이지를 수행한다; 7) 다양한 유닛들이 예외 핸들링 스테이지에 수반될 수 있다; 및 8) 리타이어먼트 유닛 및 물리적 레지스터 파일(들) 유닛(들)이 커밋 스테이지를 수행한다.
코어는 본 명세서에 설명된 명령어(들)을 포함하여, 하나 이상의 명령어 세트(예를 들어, 새로운 버전이 추가된 일부 확장을 갖는 x86 명령어 세트); 캘리포니아, 서니베일의 MIPS Technologies사의 MIPS 명령어 세트; 캘리포니아, 서니베일의 ARM Holdings의 (NEON과 같은 선택적 추가적 확장을 갖는) ARM 명령어 세트를 지원할 수 있다. 일 실시예에서, 코어(1390)는 패킹된 데이터 명령어 세트 확장(예를 들어, AVX1, AVX2)을 지원하는 로직을 포함하며, 그에 의해 많은 멀티미디어 애플리케이션들에 의해 이용되는 연산들이 패킹된 데이터를 이용하여 수행되는 것을 허용한다.
코어가 (연산들 또는 스레드들의 2개 이상의 병렬 세트를 실행하는) 멀티스레딩을 지원할 수 있고, 또한 시간 슬라이싱된 멀티스레딩, 동시 멀티스레딩(이 경우 단일 물리적 코어가 물리적 코어가 동시에 멀티스레딩하는 각각의 스레드들에게 논리적 코어를 제공함), 또는 이들의 조합(예를 들어, Intel® Hyperthreading technology에서와 같은 시간 슬라이싱된 페칭 및 디코딩 및 그 후의 동시 멀티스레딩)을 포함하는 다양한 방식으로 그렇게 할 수 있음을 이해해야 한다.
도 14는 타일들을 사용하는 행렬 연산들을 지원하는 프로세서 코어 파이프라인의 실시예를 도시한다. 분기 예측 및 디코딩 회로(1403)는 명령어 스토리지(1401)에 저장된 명령어들의 분기 예측, 명령어들의 디코딩, 및/또는 명령어들로부터의 둘 다를 수행한다. 예를 들어, 본 명세서에 상세히 설명된 명령어들은 명령어 스토리지에 저장될 수 있다. 일부 구현들에서, 별개의 회로가 분기 예측을 위해 사용되고, 일부 실시예들에서, 적어도 일부 명령어들은 마이크로코드(1405)를 사용하여 하나 이상의 마이크로-연산, 마이크로-코드 엔트리 포인트들, 마이크로명령어들, 다른 명령어들, 또는 다른 제어 신호들로 디코딩된다. 분기 예측 및 디코딩 회로(1403)는 다양하고 상이한 메커니즘들을 이용하여 구현될 수 있다. 적합한 메커니즘들의 예들은 룩업 테이블, 하드웨어 구현, PLA(programmable logic array)들, 마이크로코드 ROM(read only memory)들 등을 포함하지만 이에 한정되지는 않는다.
분기 예측 및 디코딩 회로(1403)는 일부 실시예들에서 스케줄러 회로(1409)에 결합되는 할당/리네임(1407) 회로에 결합된다. 일부 실시예들에서, 이러한 회로들은 1) 논리적 피연산자 값들을 물리적 피연산자 값들(예를 들어, 일부 실시예들에서 레지스터 에일리어스 테이블)로 리네이밍하는 것, 2) 상태 비트들 및 플래그들을 디코딩된 명령어에 할당하는 것, 및 3)(예를 들어, 일부 실시예들에서 예약 스테이션을 이용하여) 명령어 풀로부터 실행 회로상에서의 실행을 위해 디코딩된 명령어를 스케줄링하는 것 중 하나 이상을 수행함으로써 레지스터 리네이밍, 레지스터 할당, 및/또는 스케줄링 기능을 제공한다.
스케줄러 회로(1409)는 예약 스테이션들, 중앙 명령어 윈도우 등을 포함하는 임의의 수의 상이한 스케줄러들을 나타낸다. 스케줄러 유닛(들) 스케줄러 회로(1409)는 물리적 레지스터 파일(들)(1415)에 결합되거나 이것을 포함한다. 물리적 레지스터 파일(들)(1415) 각각은 하나 이상의 물리적 레지스터 파일들을 나타내고, 이들 중 상이한 물리적 레지스터 파일들은 스칼라 정수, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점, 상태(예를 들어, 실행될 다음 명령어의 어드레스인 명령어 포인터), 타일들 등과 같은 하나 이상의 상이한 데이터 타입을 저장한다. 일 실시예에서, 물리적 레지스터 파일(들)(1415)은 벡터 레지스터 회로, 기입 마스크 레지스터 회로, 및 스칼라 레지스터 회로를 포함한다. 이들 레지스터 회로는 아키텍처적 벡터 레지스터들(architectural vector registers), 벡터 마스크 레지스터들, 및 범용 레지스터들을 제공할 수 있다. 물리적 레지스터 파일(들)(1415)은 레지스터 리네이밍 및 비순차적 실행이 (예를 들어, 리오더 버퍼(들) 및 리타이어먼트 레지스터 파일(들)을 이용하여; 장래 파일(들), 이력 버퍼(들), 및 리타이어먼트 레지스터 파일(들)을 이용하여; 레지스터 맵들 및 레지스터들의 풀을 이용하는 등으로) 구현될 수 있는 다양한 방식을 예시하기 위해 리타이어먼트 회로(1417)에 의해 오버랩된다. 리타이어먼트 회로(1417) 및 물리적 레지스터 파일(들)(1415)은 실행 회로(1411)에 결합된다.
레지스터 리네이밍이 비순차적 실행의 맥락에서 설명되었지만, 레지스터 리네이밍은 순차적 아키텍처에서 사용될 수 있다는 점을 이해해야 한다. 프로세서의 예시된 실시예가 또한 개별적인 명령어 및 데이터 캐시 유닛들과 공유 L2 캐시 유닛을 포함하고 있지만, 대안의 실시예들은, 예를 들어, 레벨 1(L1) 내부 캐시, 또는 다수의 레벨의 내부 캐시와 같은, 명령어들 및 데이터 둘 다에 대한 단일의 내부 캐시를 가질 수 있다. 일부 실시예들에서, 시스템은 내부 캐시와, 코어 및/또는 프로세서에 대해 외부에 있는 외부 캐시의 조합을 포함할 수 있다. 대안적으로, 모든 캐시는 코어 및/또는 프로세서에 대해 외부에 있을 수 있다.
실행 회로(1411), 하나 이상의 실행 회로(1427)의 세트, 및 캐시(1413)에 액세스하는 하나 이상의 메모리 액세스 회로(1425)의 세트. 실행 회로들(1427)은 본 명세서에서 상세히 설명된 행렬(타일) 연산들을 수행한다.
예를 들어, 예시적 레지스터 리네이밍, 비순차적 발행/실행 코어 아키텍처는 다음과 같이 파이프라인을 구현할 수 있다: 1) 명령어 페치 회로가 페치 및 길이 디코딩 스테이지들을 수행한다; 2) 분기 및 디코딩 회로(1403)가 디코딩 스테이지를 수행한다; 3) 할당/리네임(1407) 회로가 할당 스테이지 및 리네이밍 스테이지를 수행한다; 4) 스케줄러 회로(1409)가 스케줄링 스테이지를 수행한다; 5) 물리적 레지스터 파일(들)(스케줄러 회로(1409) 및 할당/리네임 회로(1407)에 결합되거나, 그에 포함됨) 및 메모리 유닛은 레지스터 판독/메모리 판독 스테이지를 수행한다; 실행 회로(1411)는 실행 스테이지를 수행한다; 6) 메모리 유닛 및 물리적 레지스터 파일(들) 유닛(들)은 라이트백/메모리 기입 스테이지를 수행한다; 7) 다양한 유닛들이 예외 핸들링 스테이지에 수반될 수 있다; 및 8) 리타이어먼트 유닛 및 물리적 레지스터 파일(들) 유닛(들)이 커밋 스테이지를 수행한다.
코어는 본 명세서에 설명된 명령어(들)을 포함하여, 하나 이상의 명령어 세트(예를 들어, 새로운 버전이 추가된 일부 확장을 갖는 x86 명령어 세트); 캘리포니아, 서니베일의 MIPS Technologies사의 MIPS 명령어 세트; 캘리포니아, 서니베일의 ARM Holdings의 (NEON과 같은 선택적 추가적 확장을 갖는) ARM 명령어 세트를 지원할 수 있다. 일 실시예에서, 코어(1490)는 패킹된 데이터 명령어 세트 확장(예를 들어, AVX1, AVX2)을 지원하는 로직을 포함하며, 그에 의해 많은 멀티미디어 애플리케이션들에 의해 사용되는 연산들이 패킹된 데이터를 사용하여 수행되는 것을 허용한다.
코어가 (연산들 또는 스레드들의 2개 이상의 병렬 세트를 실행하는) 멀티스레딩을 지원할 수 있고, 또한 시간 슬라이싱된 멀티스레딩, 동시 멀티스레딩(이 경우 단일 물리적 코어가 물리적 코어가 동시에 멀티스레딩하는 각각의 스레드들에게 논리적 코어를 제공함), 또는 이들의 조합(예를 들어, Intel® Hyperthreading technology에서와 같은 시간 슬라이싱된 페칭 및 디코딩 및 그 후의 동시 멀티스레딩)을 포함하는 다양한 방식으로 그렇게 할 수 있음을 이해해야 한다.
레이아웃
이 설명 전반에 걸쳐서, 데이터는 행 메이저 데이터 레이아웃을 이용하여 표현된다. 열 메이저 사용자들은 그들의 오리엔테이션에 따라 항들을 변환해야 한다. 도 15는 행 메이저 포맷(row major format) 및 열 메이저 포맷(column major format)으로 표현되는 행렬의 예를 도시한다. 도시된 바와 같이, 행렬 A는 2x3 행렬이다. 이 행렬이 행 메이저 포맷으로 저장될 때, 행의 데이터 성분들은 연속적이다. 이 행렬이 열 메이저 포맷으로 저장될 때, 열의 데이터 성분들은 연속적이다. 는 행렬들의 잘 알려진 속성이며, 여기서 윗첨자 T는 트랜스폼(transform)을 의미한다. 열 메이저 데이터를 행 메이저 데이터로서 판독하는 것은 행렬이 트랜스폼 행렬처럼 보이는 것을 초래한다.
일부 실시예들에서, 행 메이저 시맨틱은 하드웨어에 이용되고, 열 메이저 데이터는 피연산자 순서를 스왑하는 것이며 그 결과는 행렬의 트랜스폼이지만, 메모리로부터의 후속 열 메이저 판독들에 대해, 그것은 정확한 비-트랜스폼 행렬이다.
예를 들어, 곱셈할 2개의 열 메이저 행렬이 있는 경우:
입력 행렬들은 다음과 같이 선형 메모리(열 메이저)에 저장될 것이다:
이들 행렬들을 2x3 및 3x2차원들을 갖는 행 메이저로서 판독하면, 이들은 다음과 같이 나타날 것이다:
순서를 스왑하고 행렬 곱셈을 하면:
트랜스폼 행렬이 출력되고, 이어서 행 메이저 순서로 저장될 수 있고:
그리고 후속하는 열 메이저 계산들에서 사용되고, 이것은 정확한 비-트랜스폼 행렬이다.
예시적 사용
도 16은 행렬들(타일들)의 사용의 예를 도시한다. 이 예에서, 행렬 C(1601)는 2개의 타일을 포함하고, 행렬 A(1603)는 1개의 타일을 포함하고, 행렬 B(1605)는 2개의 타일을 포함한다. 이 도면은 행렬 곱셈을 계산하기 위한 알고리즘의 내부 루프의 예를 도시한다. 이 예에서, 행렬 C(1601)로부터의 2개의 결과 타일, tmm0 및 tmm1이 중간 결과들을 누산하는데 사용된다. 행렬 A(1603)로부터의 하나의 타일(tmm2)은 이것이 행렬 B(1605)로부터의 2개의 타일에 의해 곱해짐에 따라 2번 재사용된다. 화살표에 의해 표시된 방향으로부터 새로운 A 행렬(타일) 및 2개의 새로운 B 행렬(타이들)을 로드하기 위한 포인터들. 도시되지 않은 외측 루프는 C 타일들에 대한 포인터들을 조정한다.
도시된 바와 같은 예시적인 코드는 타일 구성 명령어의 사용을 포함하고, 타일 사용을 구성하고, 타일들을 로드하고, 타일들을 처리하는 루프를 실행하고, 타일들을 메모리에 저장하고, 타일 사용을 해제하기 위해 실행된다.
도 17은 행렬들(타일들)의 사용의 실시예를 도시한다. (1701)에서, 타일 사용이 구성된다. 예를 들어, 타일당 행들 및 열들의 수를 설정하는 것을 포함하는 타일 사용을 구성하기 위해 TILECONFIG 명령어가 실행된다. 통상적으로, (1703)에서 적어도 하나의 행렬(타일)이 메모리로부터 로드된다. 적어도 하나의 행렬(타일) 연산은 행렬들(타일들)을 사용하여 (1705)에서 수행된다. (1707)에서, 적어도 하나의 행렬(타일)이 메모리에 출력 저장되고 컨텍스트 스위치가 (1709)에서 발생할 수 있다.
예시적 구성
타일 구성 하드웨어 지원
앞서 논의한 바와 같이, 타일 사용은 통상적으로 사용 이전에 구성될 필요가 있다. 예를 들어, 모든 행들 및 열들의 전체 사용이 필요하지 않을 수 있다. 이러한 행들 및 열들을 구성하지 않는 것이 일부 실시예들에서 전력을 절감할 뿐만 아니라, 이 구성은 연산이 에러를 발생할지를 결정하는 데 사용될 수 있다. 예를 들어, 형태(N x M)*(L x N)의 행렬 곱셈은 M과 L이 동일하지 않으면 통상적으로 작동하지 않을 것이다.
타일들을 사용하여 행렬들을 사용하기 전에, 일부 실시예들에서, 타일 지원이 구성될 것이다. 예를 들어, 타일 당 얼마나 많은 행들 및 열들, 사용될 타일들 등이 구성된다. TILECONFIG 명령어는, 이것이 컴퓨터가 (프로세서 코어의 일부로서 또는 외부 디바이스로서) 행렬 가속기를 사용하도록 구성하기 위해 지원을 제공하는 것이므로, 컴퓨터 자체에 대한 개선이다. 특히, TILECONFIG 명령어의 실행은 구성이 메모리로부터 검색되고 행렬 가속기 내의 행렬(타일) 설정들에 적용되게 야기한다.
타일 사용 구성
도 18은 실시예에 따른 타일들의 사용의 구성을 위한 지원을 도시한다. 메모리(1801)는 지원될 행렬들(타일들)의 타일 설명(1803)을 포함한다.
프로세서/코어(1805)의 명령어 실행 자원들(1811)은 타일 설명(1803)의 양태들을 타일 구성들(1817)에 저장한다. 타일 구성들(1817)은 팔레트를 위해 어떤 타일들이 구성되는지와(각각의 타일에서의 행들 및 열들의 수) 및 행렬 지원이 사용 중이라는 마킹을 상세히 하기 위해 팔레트 테이블(1813)을 포함한다. 특히, 명령어 실행 자원들(1811)은 타일 구성들(1817)에 의해 특정된 바와 같은 타일들을 사용하도록 구성된다. 명령어 실행 자원들(1811)은 또한 타일 사용을 표시하기 위한 머신 특정 레지스터 또는 구성 레지스터를 포함할 수 있다. 사용 중 및 시작 값들과 같은 추가 값들이 또한 설정된다. 타일 구성들(1817)은 타일 사용 및 구성 정보를 저장하기 위해 레지스터(들)(1819)를 활용한다.
도 19는 지원될 행렬들(타일들)의 설명의 실시예를 도시한다. 이것은 STTILECFG 명령어의 실행 시에 저장되는 설명이다. 이 예에서, 각각의 필드는 바이트이다. 바이트[0]에서, 팔레트 ID(1901)가 저장된다. 팔레트 ID는, 구성에 의해 정의된 바와 같이, 팔레트 ID마다, 타일에서의 바이트들의 수, 및 이 ID와 연관되는 타일들의 행당 바이트들을 저장하는 팔레트 테이블(1813)을 인덱싱하는 데 사용된다.
바이트 1은 "startRow" 레지스터(1903)에 저장될 값을 저장하고 바이트 2는 레지스터, "startP"(1905)에 저장될 값을 저장한다. 이들 이벤트 이후에 재시작 명령어들을 지원하기 위해, 명령어들은 이들 레지스터에 정보를 저장한다. 앞서 상세히 설명한 것들과 같은 중단 이벤트들 이후에 재시작 명령어들을 지원하기 위해, 명령어들은 이들 레지스터에 정보를 저장한다. startRow 값은 재시작을 위해 사용되어야 하는 행을 표시한다. startP 값은 쌍들이 사용될 때 스토어 연산들을 위한 행 내의 위치를 나타내고, 일부 실시예들에서, (쌍의 하위 타일에서의) 행의 하위 절반 또는 (쌍의 상위 타일에서의) 행의 상위 절반을 나타낸다. 일반적으로, 행(열) 내의 위치는 필요하지 않다.
TILECONFIG 및 STTILECFG를 예외로 하고, 성공적으로 실행되는 행렬(타일) 명령어들은 startRow 및 startP 둘 다를 제로로 설정할 것이다.
인터럽트된 행렬(타일) 명령어가 재시작되지 않은 임의의 시간에, startRow 및 startP 값들을 제로로 하는 것은 소프트웨어의 책임이다. 예를 들어, 마스킹되지 않은 부동 소수점 예외 핸들러들은 소프트웨어에서의 연산을 종료하고 프로그램 카운터 값을 또 다른 명령어, 보통은 다음 명령어로 변경하기로 결정할 수도 있다. 이 경우에, 소프트웨어 예외 핸들러는 프로그램을 재개하기 전에 운영 체제에 의해 그것에게 제시되는 예외에서 startRow 및 startP 값들을 제로로 해야만 한다. 운영 체제는 후속하여 복원 명령어를 이용하여 그런 값들을 리로드할 것이다.
바이트 3은 타일들(1907)의 쌍들의 표시(타일당 1b)를 저장한다.
바이트들 16-17은 타일 0에 대한 행들(1913) 및 열들(1915)의 수를 저장하고, 바이트들 18-19는 타일 1 등에 대한 행들 및 열들의 수 등을 저장한다. 다시 말해서, 각각의 2-바이트 그룹은 타일에 대한 다수의 행 및 열을 지정한다. 2 바이트의 그룹이 타일 파라미터들을 지정하는 데 사용되지 않은 경우, 이들은 값 제로를 가져야 한다. 구현 한계 또는 팔레트 한계보다 더 많은 타일들에 대해 타일 파라미터들을 지정하는 것은 고장을 초래한다. 구성되지 않은 타일들은 0개의 행, 0개의 열을 갖는 초기 상태에 설정된다.
마지막으로, 메모리에서의 구성은 통상적으로 몇 개의 연속적인 바이트에 대한 모든 제로들과 같은 종료 기술(ending delineation)로 끝난다.
예시적 타일 및 타일 구성 스토리지
도 20a 내지 도 20d는 레지스터(들)(1819)의 예들을 도시한다. 도 20a는 복수의 레지스터(1819)를 도시한다. 도시된 바와 같이, 각각의 타일(TMM0 2001... TMMN 2003)은 각각의 레지스터가 해당 특정 타일에 대한 행 및 열 크기를 저장하는 별개의 레지스터를 갖는다. StartP(2011) 및 StartRow(2013)는 별개의 레지스터들에 저장된다. 하나 이상의 상태 레지스터(2015)가 타일들이 사용을 위해 구성되는 것을 표시하기 위해 설정된다(예를 들어, TILES_CONFIGURED = 1).
도 20b는 복수의 레지스터(1819)를 도시한다. 도시된 바와 같이, 각각의 타일은 그 행들 및 열들에 대한 별개의 레지스터들을 갖는다. 예를 들어, TMM0 행 구성(2021), TMM0 열 구성(2023), StartP(2011) 및 StartRow(2013)는 별개의 레지스터들에 저장된다. 하나 이상의 상태 레지스터(2015)가 타일들이 사용을 위해 구성되는 것을 표시하기 위해 설정된다(예를 들어, TILES_CONFIGURED = 1).
도 20c는 단일 레지스터(1819)를 도시한다. 도시된 바와 같이, 이 레지스터는 타일 구성들(타일당 행들 및 열들)(2031), StartP(2011), 및 StartRow(2013)가 패킹된 데이터 레지스터들로서 단일 레지스터에 저장되는 식으로 저장한다. 하나 이상의 상태 레지스터(2015)가 타일들이 사용을 위해 구성되는 것을 표시하기 위해 설정된다(예를 들어, TILES_CONFIGURED = 1).
도 20d는 복수의 레지스터(1819)를 도시한다. 도시된 바와 같이, 단일 레지스터는 타일 구성들(타일당 행들 및 열들)(2031)을 저장한다. StartP 및 StartRow는 별개의 레지스터들(2011 및 2013)에 저장된다. 하나 이상의 상태 레지스터(2015)가 타일들이 사용을 위해 구성되는 것을 표시하기 위해 설정된다(예를 들어, TILES_CONFIGURED = 1).
시작 레지스터들을 이들이 개별적으로 도시되는 단일 레지스터로 조합하는 것 등과 같은 다른 조합들이 고려된다.
시스톨릭 어레이(Systolic Array)에 대한 스케줄링
위에서 언급된 바와 같이, 일반 행렬 곱셈(General Matrix Multiplication, GEMM으로도 알려짐)을 위한 하드웨어는 딥 러닝과 같은 특정 애플리케이션들의 피크 계산(및 에너지 효율)을 개선하기 위한 양호한 옵션이다. 심층 신경망들(deep Neural Networks, DNN들)에 기초한 응용들의 막대한 계산상 요구는 수많은(예를 들어, 수백 개) 처리 요소들, 예를 들어, 단일 곱셈 누산(fused multiply add, FMA) 회로들을 이용하는 하드웨어(예를 들어, 가속기)의 사용을 초래할 수 있다. 그러나, (예를 들어, DNN) 가속기들은 조밀한 행렬 곱셈들의 매우 규칙적인 데이터 흐름 패턴에 대해 최적화될 수 있다. 특정 실시예들에서, 가속기는 성능 및 면적/전력 효율을 최대화하기 위해 시스톨릭 어레이 구현을 사용한다. 시스톨릭 어레이는 매우 규칙적인 데이터 흐름들에 대해 최적화된 조밀한 2차원 어레이들을 포함할 수 있다.
특정 하드웨어에서, 명령어의 디코딩 및 실행은 구성가능한 시스톨릭 어레이 하드웨어(예를 들어, 행렬 연산 가속기 회로)로 하여금 C=A*B+C를 계산하게 야기하고, 여기서 A, B, 및 C는 각각 2차원 행렬이고, C의 각각의 성분에 대해, 하드웨어는 입력 행렬 A의 하나의 행과 행렬 B의 하나의 열의 내적(dot product)을 계산한다.
특정 실시예들에서, 행렬 연산 가속기 회로는 입력으로서 행렬 A(차원 M x K이고, 여기서 M 및 K는 정수임), 행렬 B(차원 K x N이고, 여기서 M 및 K는 정수임), 및 행렬 C(차원 M x N이고, M 및 N은 정수임)를 취하고, 이후 제각기 성분들에 대해 연산(예를 들어, 예를 들어, 단일 곱셈 누산)을 행하여 행렬에(예를 들어, 차원 M x N의 행렬 C에 되돌려, 여기서 M 및 N은 정수임) 저장되는 결과물을 산출한다. 일 실시예에서, M, K, 및 N은 16보다 작거나 같다. 특정 실시예들에서, 행렬 연산 가속기 회로는 다음과 같은 연산을 수행한다(예를 들어, 부동 소수점 수들에 대해):
도 21은 본 개시내용의 실시예들에 따른 행렬(타일) 연산 가속기(2107)를 활용하는 시스템의 실시예를 도시한다. 특정 실시예들에서, 호스트 프로세서/처리 시스템(2101)(예를 들어, 하드웨어 프로세서 코어, 예를 들어 도 33b의 프로세서 코어(3390))은 커맨드들(예를 들어, 산술 또는 행렬 조작 연산들, 로드, 및/또는 저장 연산들과 같은 행렬 조작 연산들)을 행렬 연산 가속기(2107)에 전달한다. 그러나, 이것은 단지 논의를 위한 목적으로 이러한 방식으로 도시된다. 본 명세서에서 상세히 설명하는 바와 같이, 가속기(2107)는 처리 코어의 일부일 수 있다. 타일 조작 연산자 명령어들인 커맨드들은 레지스터-레지스터("reg-reg") 또는 레지스터-메모리("reg-mem") 포맷으로서 타일들을 참조할 것이다. TILESTORE, TILELOAD, TILECONFIG 등과 같은 다른 커맨드들은 특정 실시예들에서 타일에 대해 데이터 연산들을 수행하지 않는다. 커맨드들은 가속기(2107)가 핸들링하기 위한 디코딩된 명령어들(예를 들어, 마이크로-연산들) 또는 매크로-명령어들일 수 있다. 일 실시예에서, 하드웨어 프로세서 코어는 행렬 연산 명령어가 하드웨어 프로세서 코어에 의해 실행되는 것에 응답하여 micro-op들을 행렬(타일) 연산 가속기(2107)에 보낸다.
일 실시예에서, 예약 스테이션(reservation station, RS) 회로(2111)는 커맨드들(예를 들어, micro-op들)을 행렬 연산 가속기(2107)에 보낸다. 특정 실시예들에서, 행렬 연산 가속기(2107)는 타일 행렬 유닛(tile matrix unit, TMU)이다. 특정 실시예들에서, 행렬 연산 가속기(2107)는 행렬 가속기 제어기 회로(2113)를 포함한다. 일 실시예에서, 행렬 가속기 제어기(예를 들어, 회로(2113))는 행렬 연산 가속기(2107)에서의, 그 바깥에서의, 및/또는 그 내에서의 데이터의 연산들 및 흐름을 제어한다. 행렬 연산 가속기(2107)(예를 들어, 행렬 가속기 제어기 회로(2113))는, 예를 들어, 호스트 프로세서/처리 시스템(2101)으로부터 행렬 연산 가속기(2107)의 하나 이상의 컴포넌트로의 수신된 요청들(예를 들어, 커맨드들)의 디스패치를 제어하는 디스패치 회로(2115)를 포함할 수 있다. 디스패치 회로의 예는 도 23을 참조하여 아래에 논의된다.
묘사된 행렬 연산 가속기(2107)는 데이터 버퍼들(예를 들어, 레지스터들)(2105)을 포함한다. 특정 실시예들에서, 데이터 버퍼들(예를 들어, 레지스터들)(2105)은, 예를 들어, 제1의 2차원 행렬(예를 들어, 저장소(2105)에 행렬 A를 저장하는 T0으로 표시된 타일), 제2의 2차원 행렬(예를 들어, 저장소(2105)에 행렬 B를 저장하는 T1로 표시된 타일), 제3의 2차원 행렬(예를 들어, 저장소(2105)에 행렬 C를 저장하는 T3으로 표시된 타일) 등을 나타내는 제1 복수의 레지스터(예를 들어, 타일) 내에 각자의 행렬을 저장하도록 구성가능하다. 시스템(예를 들어, 호스트 프로세서/처리 시스템(2101))은 호스트 프로세서/처리 시스템(2101)(예를 들어, OoO(Out of Order) 코어로서의 것)과 행렬 연산 가속기(2107) 사이에서 (예를 들어, 커맨드들과 대조적으로) 데이터를 송신 및 수신하기 위한(예를 들어, 코히어런트) 메모리 인터페이스(2103)(예를 들어, 데이터 캐시 유닛)를 포함할 수 있다.
특정 실시예들에서, 행렬 연산 가속기(2107)는 연산들을 수행하기 위해 처리 요소들(2109)의 그리드(예를 들어, FMA(fused multiply add) 회로들)를 이용한다. 일 실시예에서, 디스패치 회로(2115)는 데이터 버퍼들(2105)(예를 들어, 타일을 형성하는 레지스터들)로부터 처리 요소들(2109)의 그리드(예를 들어, FMA 회로들의 그리드)로의 데이터(예를 들어, 타일로부터의 하나 이상의 값)의 송신을 제어한다. 특정 실시예들에서, 처리 요소들(2109)의 그리드는 처리 요소들의 2차원 그리드, 예를 들어 도 22의 처리 요소 회로들(2200)의 2차원 그리드이다.
도 22는 처리 요소 회로들(2206-1 내지 2206-4)의 2차원 그리드를 포함하는 행렬 연산 가속기 회로(2200)의 실시예를 나타낸 것이다. 특정 실시예들에서, 데이터 저장소(2205)(예를 들어, 레지스터 파일)는, 제1 입력 2차원 행렬(A), 제2 입력 2차원 행렬(B), 및 제3 입력 2차원 행렬(C), 및 결과 저장소를 나타내는, 예를 들어 각자의 레지스터들의 세트(예를 들어, 타일)를 갖는 복수의 레지스터를 포함한다. 일 실시예에서, 출력 2차원 행렬 결과물은 제3 입력 2차원 행렬(C)을 형성하는 레지스터들에 저장되는데, 예를 들어 이들이 행렬 연산 가속기 회로(2200)에 의해 활용된 후에 입력 2차원 행렬(C)에 대한 값들을 오버라이트한다. 묘사된 행렬 연산 가속기 회로(2200)는 수행될 연산에 따라 입력 값들(예를 들어, 행렬 A 및 행렬 B로부터의 것들)을 처리 요소들에 라우팅하고 저장하기 위한 복수의 라우팅/버퍼 회로(2402-1 내지 2402-4)를 포함한다.
본 명세서의 도면들은 모든 데이터 통신 결합들(예를 들어, 접속들)을 묘사하지 않을 수 있다는 점에 유의한다. 본 기술분야의 통상의 기술자는 이것이 도면들에서 특정 상세 사항들을 모호하지 않게 하려는 것임을 이해할 것이다. 도면들에서의 양쪽 머리 화살표(double headed arrow)는 양방향 통신을 요구하지 않을 수 있고, 예를 들어, 그것은 일방향 통신(예를 들어, 해당 컴포넌트 또는 디바이스로 또는 그로부터)을 나타낼 수 있다는 점에 유의한다. 통신 경로들의 임의의 또는 모든 조합들이 본 명세서에서의 특정 실시예들에서 활용될 수 있다. 단일 라인은 그 안에 다수의 경로, 예를 들어 다수의 채널을 포함할 수 있다. 예를 들어, 라인(2210)은 다수의 경로(예를 들어, "X", 여기서 X는 임의의 양의 정수임), 예를 들어, 행렬 A로부터의 값에 대한 하나의 경로 및 행렬 B로부터의 값에 대한 하나의 경로를 포함할 수 있다.
연산을 수행하기 위한 요청 시에(예를 들어, 해당 동작을 야기하기 위한 명령어의 디코딩 및 실행에 의해), 행렬 연산 가속기 회로(2200)는 특정 실시예들에서 행렬 A 및 행렬 B로부터의 값들을 각자의 라우팅 회로에 보낸다. 예를 들어, 연산은 행렬 A에 행렬 B를 곱셈한 다음, 각자의 결과물을 행렬 C로부터의 대응하는 값에 덧셈하는 것일 수 있다. 일 실시예에서, 제1 라우팅 회로(2204-1)는 행렬 A[행][열]로부터의 제1 값 A[0][0](행 인덱스 0 및 열 인덱스 0으로부터의 값)을 수신하고 해당 값을 처리 요소들(2206-1)의 각각의 것의 제1 입력에 대한 해당 행에서의 각각의 처리 요소(2206-1)에 브로드캐스팅하고 및 행렬 B의 제1 행으로부터의 값들의 세트를 수신하고 이들 값들을 처리 요소들(2206-1) 각각의 것의 각자의 제2 입력에 보낸다(예를 들어, 처리 요소(2212)가 B[0][0]으로부터의 값을 수신하고, 처리 요소(2214)가 B[0][1]로부터의 값을 수신하는 등등이 되도록). 일 실시예에서, 처리 요소(2212)는 A[0][0]*B[0][0]인 곱셈의 결과물을 그 출력(2216)상에 제공하고 처리 요소(2214)는 A[0][0]*B[0][1]인 곱셈의 결과물을 그 출력(2218)상에 제공한다. 출력들(예를 들어, 출력(2216 및 2218))은 라우팅/버퍼 회로 2(2204-2)에 보내진다.
일 실시예에서, 제2 라우팅/버퍼 회로(2204-2)는 행렬 A[행][열]로부터의 제2 값 A[0][1](행 인덱스 0 및 열 인덱스 1로부터의 값)을 수신하고 해당 값을 처리 요소들(2206-2)의 각각의 것의 제1 입력에 대한 해당 행에서의 각각의 처리 요소(2206-2)에 브로드캐스팅하고, 행렬 B의 제2 행으로부터의 값들의 세트를 수신하고 이들 값들을 처리 요소들(2206-2) 각각의 것의 각자의 제2 입력에 보내고(예를 들어, 처리 요소(2222)가 B[1][0]으로부터의 값을 수신하고, 처리 요소(2224)가 B[1][1]로부터의 값을 수신하고, 등등이 되도록), 및 처리 요소들(2206-1)의 위의 행의 출력들로부터의 각자의 출력을 그렇게 한다. 일 실시예에서, 처리 요소(2222)는 출력(2216)(A[0][0]*B[0][0])에 덧셈된 A[0][1]*B[1][0]인 곱셈의 결과물을 그 출력(2226)상에 제공하고, 처리 요소(2224)는 출력(2218)(A[0][0]*B[0][1])에 덧셈된 A[0][1]*B[1][1]인 곱셈의 결과물을 그 출력(2228)상에 제공한다. 특정 실시예들에서, 이러한 단일 곱셈 누산 연산은 처리 요소들(2206-3 내지 2206-4)의 각각의 행에 의해 계속되어, 처리 요소들(2206-4)로부터 출력(2230) 및 출력(2232)을 생성한다. 4개가 처리 요소들의 행들(예를 들어, 그리고 행렬들 A, B, 및 C 각각의 것의 행들 및 열들)의 예시적인 개수이지만, 임의의 복수의 행일 수 있다는 것에 유의하라. 행렬 연산 가속기 회로(2200)에 대한 처리 요소들의 행들의 끝이 도달됨에 따라, 바이어스 덧셈 회로(2208)는 입력(2234)(예를 들어, 병렬 입력 포트들의 세트)으로부터의 행렬 C로부터의 각자의 성분(예를 들어, 행렬 C의 제1 행으로부터의 각자의 성분)을 덧셈하고, 출력(2236)(예를 들어, 병렬 출력 포트들의 세트)을 통해 행렬 C의 각자의 성분에 (예를 들어, 행렬 C의 제1 행의 각자의 성분 위치에) 결과물을 저장한다. 예를 들어, 행렬 C의 제1 행으로부터의 제1 성분은 출력(2230)으로부터의 결과물에 덧셈되고 해당 결과는 행렬 C의 제1 행의 제1 성분 위치에 되돌려 저장되고, 행렬 C의 제1 행으로부터의 제2 성분은 출력(2232)으로부터의 결과물에 덧셈되고 해당 결과는 행렬 C의 제1 행의 제2 성분 위치에 되돌려 저장된다. 이는 행렬 A의 각각의 행에 대해 반복될 수 있어서, 행렬 A * 행렬 B인 전체 곱셈을 생성한다(예를 들어, 그리고 행렬 C로부터의 바이어스를 각자의 결과물들에 덧셈한다).
따라서 회로의 특정 실시예들은, 예를 들어, 일부 입력 및 출력 버퍼들 및 로컬 제어 로직 회로와 함께, 처리 요소들(PE들)(예를 들어, FMA 유닛들)의 2차원(2D) 어레이를 사용한다. 일 실시예에서, 각각의 PE는 레지스터 파일과 같은 데이터 저장소로부터 그의 입력들의 일부를 얻고, 다른 PE들로부터의 다른 입력들을 얻고, PE들의 최종 행은 그 출력을 데이터 저장소로 되돌려 보낸다. 따라서, PE들은 이들 실시예들에서 파이프라인을 형성한다. 사용자는 일반적으로 큰 세트의 데이터 성분들(예를 들어, PE들보다 많은 데이터 성분들)에 대해 연산들의 시퀀스를 수행하기를 의도할 수 있다. 따라서, 성분들은 파이프라인을 시작하기 위해 어레이의 상부에 입력될 수 있고, 파이프라인을 통해 아래쪽으로 데이터를 조금씩 흘러가게 할 수 있다(적절한 경우, 파이프라인의 다양한 스테이지들에서 추가 입력들을 제공한다).
일 실시예에서, 처리 요소의 각각의 인스턴스는 곱셈기 회로(multiplier circuit)(예를 들어, 이것은 제1 입력 a, 제2 입력 b를 취하고, 및 결과적인 출력을 생성함) 및 덧셈기 회로(adder circuit)(제1 입력으로서의 곱셈기 회로로부터의 결과적인 출력을 제3 입력 c와 덧셈하여 결과물을 산출함)를 포함하는 FMA(fused multiply accumulate) 회로이다. 연산들 및/또는 데이터의 처리 요소 회로들(예를 들어, FMA 회로들)의 2차원 그리드로의 디스패치의 제어는 디스패치 회로(dispatch circuitry)에 의해 수행될 수 있다.
도 23은 본 개시내용의 실시예들에 따른 행렬 연산 가속기 회로의 디스패치 회로(2300)를 도시한다. 일 실시예에서, 디스패치 회로(2300)는 도 21에서의 디스패치 회로(2115)의 일부이다. 특정 실시예들에서, 디스패치 회로(2300)는 다중화기(2302)에 의해 다수의 계류중인 연산(micro-ops(micro-operations)) 중 하나를 선택하고 선택된 연산을 출력(2304)상에서 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 보낸다. 도 23에서, 계류중인 연산들은 입력(2306)상에서 큐(2308)가 되도록 수신된다. 입력(2306)은 예약 스테이션(예를 들어, 도 21의 RS 회로(2111))로부터의 것일 수 있다.
일 실시예에서, 디스패치 회로는 비순차적(프로그램) 예약 스테이션 회로로부터 연산 요청들(예를 들어, 각각의 명령어에 대해 하나씩 또는 단일 명령어에 대해 마이크로 연산들의 세트)을 수신하고, 예를 들어, 2개의 연속적인 연산(예를 들어, 명령어들)이 어떤 의존성 제한도 갖지 않고 차례 차례로 행렬 연산 가속기 회로(의 예를 들어 파이프라인)에서 실행될 수 있다는 가정 하에 연산들을 순차적으로 실행하며, 여기서 비순차적 회로가 A와 B 타일들에 의한 행렬 연산의 의존성을 관리하는 한편 연속적인 행렬 연산들 간의 의존성은 디스패치 큐에 의해 핸들링된다. 일 실시예에서, RS 회로는 의존성이 해소된 후에 다음 연산(예를 들어, μop(micro-operation))을 행렬 연산 가속기 회로에 디스패치한다. 묘사된 바와 같은 큐(2308)는 8개의 슬롯을 포함하지만, 단일의 또는 임의의 복수의 슬롯이 사용될 수 있다는 것이 이해되어야 한다.
특정 실시예들에서, 큐(2308)에서의 엔트리들은 데이터 버퍼들(예를 들어, 데이터 버퍼들(2105) 또는 데이터 버퍼들(2205))에서의 활용된 입력 타일(들) 및/또는 출력 타일(들) 및/또는 그리드(예를 들어, 도 21의 FMA 그리드(2109))에 의해 수행될 연산들을 식별하기 위한 정보를 저장한다. 일 실시예에서, 큐(2308)에서의 각각의 엔트리는 유효 비트(v)의 값(또는 해당 값에 대한 표시자), 연산(예를 들어, μop) 오피코드, 타일 차원들(예를 들어, M, K, N), 컨트롤들(예를 들어, 제로 컨트롤들), 타일 ID 값(예를 들어, 데이터 버퍼들에서의 A 타일, B 타일, 및 C 타일 위치 각각에 대한 값)을 저장한다. 메인 헤드(main head)는 행렬 연산 가속기 회로에 디스패치되는 현재 연산(예를 들어, 단일 명령어의 복수의 마이크로 연산의 제1 마이크로 연산)의 시작에 대한 포인터일 수 있다. 메인 테일(main tail)은 행렬 연산 가속기 회로에 디스패치되는 현재 연산(예를 들어, 해당 단일 명령어의 복수의 마이크로 연산의 최종 마이크로 연산)의 끝에 대한 포인터일 수 있다. 유효 비트(v)는, 예를 들어 해당 연산에 대한 요청된 연산이 행렬 연산 가속기 회로에 의해 완료될 때, 연산(예를 들어, 마이크로 연산)을 완료된 것으로서 마킹하기 위해 사용될 수 있다.
특정 실시예들에서, 스케줄링 회로(2310)는 연산(예를 들어, 복수의 마이크로 연산의 헤드)을 선택하여, 예를 들어 해당 선택된 연산에 대한 연산들을 시작하도록 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 보내기 위해 포함된다.
도 24는 본 개시내용의 실시예들에 따른 행렬 연산 가속기 회로의 디스패치 회로의 스케줄링 회로(2400)를 도시한다. 앞서 유의한 바와 같이, 연산(예를 들어, 마이크로 연산)은 일 수 있다. 스케줄링 회로는: M(예를 들어, 제1 어레이(예를 들어, 제1 행(예를 들어, 도 22의 PE들(2212, 2214,…, 2206-1)의 제1 행) 또는 제1 열)의 버퍼들(예를 들어 도 21의 버퍼(2105) 또는 도 22의 버퍼(2205))이 점유되는(예를 들어, 그리고 버스가 사용되어 A 타일을 행렬 연산 가속기 회로에 전송함) 사이클들의 수), K(예를 들어, B 타일을 행렬 연산 가속기 회로로 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수), 및 디스패치들 사이의 미리 선택된 최소(예를 들어, 4 사이클) 갭 중의 최대를 대기할 수 있다. 도 24에서, 출력(2402)은 다음 연산(예를 들어, 마이크로 연산)의 행렬 연산 가속기 회로로의 디스패치를 야기하기 위해 (예를 들어, 0 대신에 1의 값으로서) 어써트된다. 특정 실시예들에서, 스케줄링 회로(2400)는 B 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 K에 대해 1의 값을 어써트하고, 이어서 완료된 경우 0(예를 들어, 카운터 K에 대한 미리 결정된 값)을 어써트하는 K 카운터(2404), A 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 M에 대해 1의 값을 어써트하고, 이어서 완료된 경우 0(예를 들어, 카운터 M에 대한 미리 결정된 값)을 어써트하는 M 카운터(2406), 및 최소 사이클들의 수를 카운트 다운하는 동안 1의 값을 어써트하고, 이어서 종료될 때 0을 어써트하기 위해 출력(2402)(예를 들어, 디스패치는 출력(2402)에 대해 어써트된 1임)에 대한 연산들(예를 들어, 마이크로 연산)의 디스패칭 사이의 최소 사이클들을 카운트 다운하는 최소 사이클(예를 들어, 예로서 4 사이클, 그러나 임의의 단일 또는 복수의 사이클이 선택될 수 있음) 카운터(2408)를 포함한다. 일 실시예에서, OR 로직 게이트(2412)는 그것의 입력들 중 임의의 것이 1일 때 1을 어써트하고 NOT 로직 게이트(2414)는 OR 로직 게이트(2412)의 출력을 반전시킨다. 일례로서, 일단 각각의 카운터가 그것의 트리거링 임계값(예를 들어, 0)까지 카운트 다운하면, 그것은 OR 로직 게이트(2412)에 대한 그것의 각자의 라인상에서 0의 어써션을 야기할 것이고(예를 들어, 디스패치가 (2402)에 대해 발생할 때까지), 따라서 NOT 로직 게이트(2414)는 모든 카운터들(2404, 2406, 및 2408)이 0을 어써트할 때 1을 출력할 것이다. 각각의 디스패치 후에, 카운터(들)는 그들의 원래의(예를 들어, 비 제로) 값에 리셋될 수 있다.
선택적으로, 오버라이드 디스패치 컨트롤(2410)이 활용되어, 예를 들어 연산의 디스패치를 오버라이드하지 않는 모드에서 0을 어써트하고 연산의 디스패치를 오버라이드하는 모드에서 1을 어써트할 수 있다(그리고 따라서 출력(2402)으로부터 0의 출력을 야기함).
일 실시예에서, 행렬 연산 가속기 회로(예를 들어, 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 의한 실행을 위한 다음 연산(예를 들어, 마이크로 연산)을 선택하기 위한 트리거는 MAX{4, M, K}에 의해 주어지고, 여기서 M은 A 행렬 행들의 수이고 K는 A 행렬 열들(또는 B 행렬 행들)의 수이고, 4는 (예를 들어, 마이크로 연산) 실행을 위한 사이클들의 수에 대한 하한이다. 유의할 점은, 특정 실시예들에서, 스케줄링 회로는 적어도 K 사이클만큼 대기한다는 것이다(예를 들어, B 타일이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 로드되기 위한 단일 버스만이 있을 때)), (예를 들어, 사이클당 단일 B 행만의 페치를 가능하게 함). 이들 실시예들 중 특정의 것들에서, K는 B 행렬 행들의 수인 누산들의 수를 설정하고, 따라서 B 버스는 다음 K 사이클 동안 점유될 것이고, 어떠한 새로운 마이크로 연산도 이 시간 동안 디스패치될 수 없다. 이들 실시예들 중 특정의 것들에서, M은 A 행렬 행들이 A 버스를 사용하는 사이클들의 수를 설정하여, 예를 들어, 다음 마이크로 연산이 M 카운터뿐만 아니라 K 카운터가 제로화되어 출력된 후에만 디스패치될 수 있도록 한다. 또한, 연속적인 디스패치들 사이에서 최소 개수의(예를 들어, 4) 사이클이 요망될 수 있는데, 예를 들어, 여기서 C 행렬은 사이클 1에서 판독되어야 하고, 사이클 2에서 곱셈 결과(예를 들어, A x B)와 누산되어야 하고, 사이클 3에서 데이터 버퍼들에 다시 되돌려 기록되어야 하고, 사이클 4에서 다시 판독될 수 있기 전에 하나 더 사이클이 필요하다. 이는 상기에서의 단계들이 단일 사이클에 있음을 추정케 한다. 다른 실시예들에서, 단계들은 각각 하나보다 많은 사이클을 취할 수 있다.
특정 실시예들에서, 스케줄링 회로(2400)는 연산(예를 들어, 마이크로 연산)이 선택되고 및/또는 실행을 위해 연산 회로(도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 디스패치될 때 대응하는 큐(예를 들어, 도 23의 큐(2308))에서 유효 비트를 클리어하고 및/또는 (예를 들어, 다음 연산이 선택 판정에 이용가능하도록 하기 위해) 대응하는 큐(예를 들어, 도 23의 큐(2308))에서 그 헤드 포인터를 업데이트한다.
도 25는 본 개시내용의 실시예들에 따라, 베이스라인 스케줄링 모드로부터 입력 행렬을 재사용하는 스케줄링 모드로 스위칭가능한, 행렬 연산 가속기 회로의 디스패치 회로의 스케줄링 회로(2500)를 도시한다. 이들 실시예들에서의 입력 행렬은 입력 "B" 행렬(예를 들어, 타일)을 지칭하지만, 이것은 단지 예시적인 것일 뿐이며, 다른 행렬들(예를 들어, 타일들)이 유사하게 스케줄링될 수 있다.
스케줄링 회로(2500)는 행렬 연산 가속기 회로에 대해 수행될 다음 연산(예를 들어, 마이크로 연산), 및 특히 선택되고 및/또는 실행을 위해 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 디스패치되는 다음 연산을 식별하는 값을 수신하는 입력(2502)을 포함한다. 일 실시예에서, 입력(2502)은 도 23으로부터의 출력(2304)을 수신한다.
특정 실시예들에서, 입력(2502)은 스케줄링 회로(2500)에 의해 디스패치될 다음 연산(예를 들어, 그리고 대응하는 입력/출력 타일들)을 식별한다. 이들 실시예들 중 특정의 것들에서, 입력(2502)은 타일(예를 들어, 도 21에서 데이터 버퍼들(예를 들어, 레지스터들)(2105)에 타일을 형성하는 레지스터들의 세트)을 나타내는 ID(identification) 값을 포함한다. 스케줄링 회로(2500)는 행렬 연산 가속기 회로에 의해 처리되는 현재 타일(들)을 식별하는 스토리지(2504)를 포함하고, 특히, 그것은 그들의 데이터가 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들)에 로드되는 (또는 그들의 데이터가 연산 회로 내로/바깥으로 로드되고 있는) 현재 타일(들)을 식별할 수 있다. 일 실시예에서, 스케줄링 회로(2500)는 스토리지(2504)에서의 식별 값이 유효 값 또는 무효 값(예를 들어, 하드웨어가 또 다른 타일을 로드하고 있고 따라서 또 다른 식별 값)인지를 표시하는 유효 타일(예를 들어, 타일 B) 스토리지(2506)를 포함한다.
스케줄링 회로(2500)는 (i) 연산 회로 내로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내로) 로드되는 현재 타일(예를 들어, 타일 B)을 (ii) 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들)로 로드될 다음 타일(예를 들어, 다음 타일 B)과 비교하는 비교 회로(2508)를 포함한다. 일 실시예에서, 이 비교는 각각의 타일에 대해 스케줄링 회로에 의해 제공되는 식별 값, 예를 들어, 행렬 연산 가속기의 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105)) 내로 타일의 엔트리상에서 제공되는 식별 값을 비교함으로써 행해지며, 예를 들어, 여기서 식별 값은 타일에 대한 값들이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들)에 입력되기 전에 각각의 타일에 제공된다.
특정 실시예들에서, 비교 회로(2508)는 (i) 다음 연산을 위한 입력(2502)으로부터의 입력 타일(예를 들어, 도 21의 데이터 버퍼들(2105)에서의 그의 ID 값)(예를 들어, "새로운 타일 B")을, (ii) 연산 회로 내에 현재 로드되는(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들)에 현재 로드되는) 현재의 타일(예를 들어, 타일 B), 예를 들어, 도 21의 FMA 그리드(2109)에 현재 로드되는 타일에 대한 도 21의 데이터 버퍼들(2105)에 대한 ID 값과 비교한다. 일 실시예에서, 비교 회로(2508)는 사용 중인 현재 타일의 ID 값을 연산 회로에서 사용될 다음 타일의 ID 값과 비교하고, 동일하다면, 이들이 동일하다는 값(예를 들어, 1)을 어써트한다. 일 실시예에서, 비교 회로(2508)는 스토리지(2504)로부터의 사용 중인 현재 타일의 ID 값을 연산 회로에서 사용될 다음 타일의 ID 값과 비교하고, 그리고 동일하다면, 스토리지(2506)가 또한 스토리지(2504)에서의 식별 값이 예를 들어 유효 값인 것을 나타낼 때 이들이 동일하다는 값(예를 들어, 1)을 어써트하고, 다른 경우에는 상이한 값(예를 들어, 0)을 어써트한다.
특정 실시예들에서, (i) 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 로드되는 현재 타일(예를 들어, 타일 B)이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들) 내에 로드될 (ii) 다음 타일(예를 들어, 다음 타일 B)과 동일할 때, 동일한 타일(예를 들어, 동일한 타일 B) 값이 어써트되어 (예를 들어, 1), 예를 들어 연산 회로로부터 분리된 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105))로부터 그것을 리로드하지 않고서, 입력 행렬을 재사용하는, 예를 들어 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 이미 저장된 타일 B를 재사용하는 스케줄링 모드로의 스위칭을 (예를 들어, 출력(2510)을 통해) 야기한다.
특정 실시예들에서, 비교 회로(2508)는, (i) 연산 회로 내에 (예를 들어, 도 21에서의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 로드되는 현재 타일(예를 들어, 타일 B)이 (ii) 연산 회로에 로드될 다음 타일(예를 들어, 다음 타일 B)과 동일할 때 출력(2510)상에 제1 값(예를 들어, 1)을 출력한다. 출력(2510)은 이어서 NOT 로직 게이트(2512)에 입력될 수 있고 해당 출력 및 K 카운터(2516)로부터의 출력은 AND 로직 게이트(2514)(예를 들어, 모든 입력들이 1일 때만 1의 출력을 가짐)에 그리고 OR 로직 게이트(2522) 내로 입력될 수 있다.
특정 실시예들에서, 스케줄링 회로(2500)는 B 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 K에 대해 1의 값을 어써트하고, 이어서 완료된 경우 0(예를 들어, 카운터 K에 대한 미리 결정된 값)을 어써트하는 K 카운터(2516), A 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 M에 대해 1의 값을 어써트하고, 이어서 완료된 경우 0(예를 들어, 카운터 M에 대한 미리 결정된 값)을 어써트하는 M 카운터(2518), 및 최소 사이클들의 수를 카운트 다운하는 동안 1의 값을 어써트하고, 이어서 종료될 때 0을 어써트하기 위해 출력(2526)(예를 들어, 디스패치는 출력(2526)에 대해 어써트된 1임)에 대한 연산들(예를 들어, 마이크로 연산)의 디스패칭 사이의 최소 사이클들을 카운트 다운하는 최소 사이클(예를 들어, 예로서 4 사이클, 그러나 임의의 단일 또는 복수의 사이클이 선택될 수 있음) 카운터(2520)를 포함한다. 일 실시예에서, OR 로직 게이트(2522)는 그것의 입력들 중 임의의 것이 1일 때 1을 어써트하고 NOT 로직 게이트(2524)는 OR 로직 게이트(2522)의 출력을 반전시킨다. 일례로서, 일단 각각의 카운터가 그것의 트리거링 임계값(예를 들어, 0)까지 카운트 다운하고 그리고 (따라서, AND 로직 게이트(2514)가 K 카운터(2516)가 0을 어써트할 때 0을 출력함), 이는 OR 로직 게이트(2522)에 대한 그 각자의 라인상에서 0의 어써션을 야기할 것이고(예를 들어, 디스패치가 (2526)에 대해 발생할 때까지), 따라서 NOT 로직 게이트(2514)는 (i) 모든 카운터들(2516, 2518, 및 2520)이 0을 어써트할 때 또는 (ii) 출력(2510)이 0을 어써트하는 카운터들(2518 및 2520)과 함께 매칭을 위해 1인 경우 1을 출력할 것이다. 각각의 디스패치 후에, 카운터(들)는 그들의 원래의 (예를 들어, 비 제로) 값(예를 들어, A 및 B 타일들의 차원들에 의해 설정되는 바와 같음)에 리셋될 수 있다. 일 실시예에서, K 카운터(2516), M 카운터(2518) 및 최소 사이클 카운터(2520)가 OR 로직 게이트(2528)에 대한 그들 각자의 라인상에서 0을 어써트할 때, 그것은 0을 NOT 논리 게이트(2530)에 출력하고, 이것은 이어서 (다른 경우에는 제로 대신에) 1을 리셋으로서 출력하여, 유효 타일(타일 B) 스토리지(2506)가 스토리지(2504)에서의 식별 값이 무효 값이라는 것을 표시하도록 야기한다(예를 들어, 하드웨어는 또 다른 타일을 연산 회로에 로드한다).
선택적으로, 오버라이드 디스패치 컨트롤(2532)이 활용되어, 예를 들어 연산의 디스패치를 오버라이드하지 않는 모드에서 0을 어써트하고 연산의 디스패치를 오버라이드하는 모드에서 1을 어써트할 수 있다(그리고 따라서 출력(2526)으로부터 0의 출력을 야기함).
앞서 유의한 바와 같이, 스케줄링 회로는 (i) 예컨대, 예를 들어 연산 회로로부터 별개의 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105))로부터 그것을 리로드하지 않고서, 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 이미 저장된 타일의 재사용하는 것과 같은, 입력 행렬을 재사용하는 제1(예를 들어, 처리량 효율적) 스케줄링 모드, 및 (ii) 이미 연산 회로 내에 저장된 타일을 재사용하지 않는 제2 스케줄링 모드 사이에서 선택할 수 있다.
일 실시예에서, 행렬 연산 가속기 회로(예를 들어, 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들))에 의한 실행을 위해 다음 연산(예를 들어, 마이크로 연산)을 선택하기 위한 트리거는 (i) 제1(예를 들어, 처리량 효율적) 스케줄링 모드에서는 MAX{4,M}에 의해 주어지고 (ii) 제2 스케줄링 모드에서는 MAX{4,M,K}에 의해 주어지는데, 여기서 M은 A 행렬 행들의 수이고 K는 A 행렬 열들의 수이고, 4는 (예를 들어, 마이크로 연산) 실행을 위한 사이클들의 수에 대한 하한이다. 유의할 점은, 특정 실시예들에서, 스케줄링 회로는 적어도 K 사이클만큼 대기한다는 것이다(예를 들어, B 타일이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 로드되기 위한 단일 버스만이 있을 때)), (예를 들어, 사이클당 단일 B 행만의 페치를 가능하게 함). 이들 실시예들 중 특정의 것들에서, K는 B 행렬 행들의 수인 누산들의 수를 설정하고, 따라서 B 버스는 다음 K 사이클 동안 점유될 것이고, 어떠한 새로운 마이크로 연산도 이 시간 동안 디스패치될 수 없다. 이들 실시예들 중 특정의 것들에서, M은 A 행렬 행들이 A 버스를 사용하는 사이클들의 수를 설정하여, 예를 들어, 다음 마이크로 연산이 M 카운터뿐만 아니라 K 카운터가 제로화되어 출력된 후에만 디스패치될 수 있도록 한다. 또한, 연속적인 디스패치들 사이에서 최소 개수의(예를 들어, 4) 사이클이 요망될 수 있는데, 예를 들어, 여기서 C 행렬은 사이클 1에서 판독되어야 하고, 사이클 2에서 곱셈 결과(예를 들어, A x B)와 누산되어야 하고, 사이클 3에서 데이터 버퍼들에 다시 되돌려 기록되어야 하고, 사이클 4에서 다시 판독될 수 있기 전에 하나 더 사이클이 필요하다. 이는 상기에서의 단계들이 단일 사이클에 있음을 추정케 한다. 다른 실시예들에서, 단계들은 각각의 s에 대해 하나보다 많은 사이클을 취할 수 있다. 특정 실시예들에서, 타일 B는 에서의 B 행렬이다. 예를 들어, 이면 (M 또는 최소 사이클들)의 최대치를 대기하고, 그렇지 않으면 (M, K, 또는 최소 사이클들)의 최대치를 대기하는 것에 따른 스케줄링.
특정 실시예들에서, M, K, N에 대한 행렬 연산을 수행하는 데 있어서, B 행렬의 전송은 K(예를 들어, 16까지의) 사이클(예를 들어, B-전송 기간)에 대한 것이고, B-전송 기간 동안, 동일한 B 행렬을 사용하는 다음 연산(예를 들어, 은 그것의 A-버퍼가 자유로울 때 실행을 시작할 수 있다. 예를 들어, M, K, N의 B-전송 기간이 종료될 때, 연산은 정상으로 되돌아가고 B 행렬은 판독되어 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105)(예를 들어, 타일 행렬 버퍼(tile matrix buffer, TMB))로부터 연산 회로로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내로)(예를 들어, 타일 행렬 곱셈기(tile matrix multiplier, TMM)) 전송될 것이다. 일 실시예에서, 사용이 연속적인 경우, 회로(예를 들어, 스케줄링 회로)(예를 들어, OoO RS 회로로부터의 연산들)는 예를 들어 버퍼(예를 들어, B-버퍼)의 회수(reclamation) 및 재할당을 방지할 것이고, 어떠한 캐싱도 필요하지 않다. 따라서, 제1(예를 들어, 처리량 효율적) 스케줄링 모드를 활용하는 컴퓨터는 더 일찍 연산을 디스패치하는 능력을 가질 뿐만 아니라, 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105))로부터의 데이터의 (예를 들어, B-버스를 통한) 판독이 제거되는 것에 의해 개선되어서, 전력 소비를 감소시킨다.
특정 실시예들에서, 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105))로부터의 데이터가 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 저장될 때, 데이터 버퍼들은 회수되고, 예를 들어, 사용으로부터 할당 해제되고, 그 후 상이한 연산(예를 들어, 상이한 명령어)에 대해 행렬(예를 들어, 새로운 타일 B)를 저장하기 위해 재할당될 수 있다. 특정 실시예들에서, 입력 행렬을 재사용하는 제1(예를 들어, 처리량 효율적) 스케줄링 모드에 있을 때, 예를 들어, 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 이미 저장된 타일의 재사용, 무엇의 회수.
일 실시예에서, 입력 행렬을 재사용하는 제1(예를 들어, 처리량 효율적) 스케줄링 모드에 있을 때, 스케줄링 회로는 이전 연산(예를 들어, 단일 명령어)과 다음 연산(예를 들어, 단일 명령어)의 실행 사이의 버퍼(예를 들어, 연산 회로에서의 행렬 B에 대한 버퍼)의 회수를 방지하고 및/또는 입력 행렬을 재사용하지 않는 제2 스케줄링 모드에 있을 때, 스케줄링 회로는 이전 연산(예를 들어, 단일 명령어)과 다음 연산(예를 들어, 단일 명령어)의 실행 사이에 버퍼(예를 들어, 연산 회로에서의 행렬 B에 대한 버퍼)의 회수를 허용한다. 일 실시예에서, 입력 행렬을 재사용하지 않는 제2 스케줄링 모드에 있을 때, 스케줄링 회로는 이전 연산(예를 들어, 명령어)과 다음 연산(예를 들어, 명령어)의 실행 사이에 버퍼(예를 들어, 연산 회로에서의 행렬 B에 대한 버퍼)의 회수를 시작한다. 행렬 연산 가속기 회로(예를 들어, 제어기 회로)는 입력 2차원 행렬을 나타내는 각각의 복수의 레지스터에 대한 식별 값을 할당할 수 있고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 이전의 입력 2차원 행렬을 저장하는지에 대한 체크는 이전 연산(예를 들어, 명령어) 및 다음 연산(예를 들어, 명령어)으로부터의 대응하는 입력 2차원 행렬들에 대한 각자의 식별 값들을 비교하는 것일 수 있다. 행렬 연산 가속기 회로(예를 들어, 제어기 회로)는 동일한 값을 갖는 행렬에 대해 동일한 ID 값을 할당할 수 있다. 행렬 연산 가속기 회로(예를 들어, 제어기 회로)는 상이한 값들을 갖는 행렬들에 대해 상이한 ID 값들을 할당할 수 있다. 예를 들어, 제1 연산(예를 들어, 명령어)은 입력 2차원 행렬에 할당되는 제1 값을 가질 수 있고, 제2 연산(예를 들어, 명령어)은 그것이 동일한 입력 2차원 행렬일 때 할당되는 동일한 값을 가질 수 있고 그것이 제1 연산의 것과 상이한 입력 2차원 행렬일 때 할당되는 상이한 값을 가질 수 있다.
특정 실시예들에서, 스케줄링 회로(2500)는 연산(예를 들어, 마이크로 연산)이 선택되고 및/또는 실행을 위해 연산 회로(도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 디스패치될 때 대응하는 큐(예를 들어, 도 23의 큐(2308))에서 유효 비트를 클리어하고 및/또는 (예를 들어, 다음 연산이 선택 판정에 이용가능하도록 하기 위해) 대응하는 큐(예를 들어, 도 23의 큐(2308))에서 그 헤드 포인터를 업데이트한다. 일 실시예에서, B-버퍼 데이터의 재사용은 B-버퍼 내로 B 값들을 로드하는 연산이 "가능한 재사용"일 때 여전히 실행되고 있는 경우에만 허용되고, 제2 연산이 도착하고, 이어서 해당 제2 연산은 제1 연산과의 연속성에 대해 체크되어, 제2 연산은 제1 연산과의 연속성이 발견될 때만 회수된 값을 이용하도록 될 것인데, 예를 들어 재사용될 B 값들을 사용하는 제1 동작이 완료되지 않은 경우, 그것의 B-버퍼는 회수될 수 없고 따라서 제2 연산에 의해 (예를 들어, 연속성이 있는 한) 사용될 수 있다.
특정 실시예들에서, 입력 행렬을 재사용하는 제1(예를 들어, 처리량 효율적) 스케줄링 모드는 (예를 들어, 부동 소수점) FP 행렬 연산 가속기 회로의 성능을 가속화하기 위해 사용된다. 본 명세서에 개시된 스케줄링은 행렬 연산 가속기 회로 설계로만 제한되지 않고, 물려받은 제한들을 갖는 다른 변경된 레이턴시 마이크로 아키텍처로 확장될 수 있다는 것을 이해해야 한다. 더욱이, FMA 회로가 1 사이클 레이턴시를 가정하는 경우로 확장될 수 있다.
특정 실시예들에서, 행렬은 이용가능한 하드웨어(예를 들어, 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들))보다 큰 차원을 가질 수 있다. 본 명세서에서의 특정 실시예들은 스케줄링(예를 들어, 연산들(예를 들어, 마이크로 연산들)을 디스패치하는 것)을 위한 복수의(예를 들어, 3개의) 카운터를 활용하는데, 즉 유닛 제한들 및 BKxN 행렬의 재사용을 체크하기 위한 메커니즘을 핸들링하는 Keven, Kodd 및 Mc. 또한, 본 명세서에서의 특정 실시예들은, 차원(예를 들어, K)이 이용가능한 하드웨어보다 큰 경우에(예를 들어, K> 8), 예를 들어, 이들 연산들(예를 들어, 마이크로 연산들)이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에서의 제2 라운드에 대해 높은 우선순위로 디스패치되는 경우에, 연산들(예를 들어, 마이크로 연산들)을 핸들링하기 위한 보조 큐를 구현한다.
일 실시예에서, 스케줄링 회로는 M 사이클 동안 제1 행 을 유지하고, 행렬 의 제1 열의 M개의 성분 각각을 상이한 사이클로 브로드캐스팅한다. 한 사이클 또는 어떤 수의 사이클(예를 들어, 2 사이클) 후에, 특정 실시예들에서 제2 부분 FMA 연산을 계산하는 M 사이클 동안 FMA 그리드의 다음 FMA 어레이(예를 들어, 행 또는 열)가 점유된다. 특정 실시예들에서, K개의 부분 FMA 연산이 K개의 FMA 어레이를 통해 계산될 때까지 이 순차적 파이프라인 모드가 실행된다. 일 실시예에서, FMA 그리드 활용은 3개의 주요 제한, 즉 (1) 목적지에서의 행들의 수, (2) B-버스 대역폭(예를 들어, 사이클 당 512 비트), 및 (3) FMA 어레이들(예를 들어, 행들 또는 열들)의 수에 의해 제한된다. (1) M< 주어진 값(예를 들어, 16)의 경우에 대한 일례로서, 다음 연산(예를 들어, 마이크로 연산)을 M 사이클 후의 실행으로 보내는 것이 가능한데, 그 이유는 제1 FMA0 어레이가 이용 가능하고 M 사이클 후에 자유롭기 때문이다. 예를 들어, M=12의 경우에, 처음 12 사이클 동안 제1 FMA0이 사용된다. 그러나, 목적지 WB의 제1 결과는 16 사이클에 의해 계산된다. 이는 제1 연산(예를 들어, 마이크로 연산)이 이 예에서 완료되기 전에 다음 연산(예를 들어, 마이크로 연산)이 디스패치될 수 있다는 것을 의미한다. (2)에 대한 일례로서, FMA 그리드는 한 사이클에서 단일 행렬 행을 수신하도록 제한된다. 일 실시예에서, FMA 회로들의 덧셈기들은 주어진 수의 (예를 들어, 2개의) 사이클 레이턴시를 가지며, 이는 2 사이클마다 한 번씩 B-버스의 임계값(예를 들어, 512 비트)까지 보내는 것이 필요하다는 것을 의미한다. 따라서, 특정 실시예들은 2개의 연산(예를 들어, 마이크로 연산)을 동시에 실행하고, 매 사이클마다 B-버스 비지(B-bus busy)를 유지한다. 더욱이, 특정 실시예들은 연속적인 명령어들을 통한 재사용을 위해 BKxN 행렬 행을 버퍼에 유지한다. (3)에 대한 일례로서, FMA 그리드 아키텍처는 주어진 수(예를 들어, 16)의 부분 곱 덧셈(partial product addition)(예를 들어, )까지 지원하는 반면, FMA 그리드는 주어진 수보다 적은 수(예를 들어, 8)의 FMA 어레이들(예를 들어, 행들 또는 열들)을 포함한다. K≤8인 경우, 결과는 16 사이클 후에 준비되는 반면, K>8인 경우 대안적 해결책이 필요하다.
도 26은 본 개시내용의 실시예들에 따른 다중 경로에 대한 행렬 연산 가속기 회로의 디스패치 회로(2600)를 도시한다. 디스패치 회로(2600)는 두 개의 큐, 즉 메인 큐(2610) 및 제2 패스 큐(2612)를 포함한다. 일 실시예에서, 메인 큐(2610)는 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에서의 연산을 실행하기 위한 중요한 정보를 유지한다.
일 실시예에서, 제2 패스 큐(2612)는 위의 (3)을 핸들링하는 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들), (예를 들어, 그 K> 8)에서의 제2 패스에 적격인 연산(예를 들어, 마이크로 연산들)을 유지한다. 일 실시예에서, 제2 패스 큐(2612)에 삽입되는 모든 연산(예를 들어, 마이크로 연산)은 이것이 제2 패스에 대해 다시 디스패치되기 전에 16 사이클 동안 중단된다. 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)가 더 좁은 수의 (예를 들어, 8) FMA 회로들에 제한되는 실시예들에서, 제2 패스가 요구된다. 제2 패스는 적어도 16 사이클 후에 재시작될 수 있다(예를 들어, 16 사이클=8 FMA 유닛 * 2 사이클 ADD 레이턴시). 이 분할은 이하의 것으로 인해 가능하며, 이는 또한 제1 및 제2 경로들에서 계산되는 항들을 묘사한다는 점에 유의한다:
일 실시예에서, 메인 큐(2610)로부터 (예를 들어, 디스패치 회로(2300)의 인스턴스로서) 연산(예를 들어, 마이크로 연산)을 디스패치할 시에, 그의 누산 횟수가 관찰된다(예를 들어, K>8인지를 체크). 특정 실시예들에서, K<= 임계값(예를 들어, 8)인 경우, 연산(예를 들어, 마이크로 연산)은, 예를 들어 그것을 제2 패스 큐(2612)에 복사하지 않고서 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 직접 보내지고 및/또는 K>임계값(예를 들어, 8)인 경우, 연산(예를 들어, 마이크로 연산)은, 예를 들어 그것이 또한 제2 패스 큐(2612) 내에 복사되는 동안, 그것을 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 보내기를 계속한다. 일 실시예에서, 제2 패스 큐(2612)에서, K는 실행될 누산들의 나머지(예를 들어, K-8)인 것으로 업데이트된다. 일 실시예에서, 제2 패스 큐(2612)에 삽입되는 모든 연산(예를 들어, 마이크로 연산)은 (예를 들어, 16) 사이클 카운터를 트리거한다. 일 실시예에서, 일단 카운터가 그의 카운트(예를 들어, 16 사이클)를 완료하면, 그 대응하는 연산(예를 들어, 마이크로 연산)은 제2 실행부에 대한 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 보내질 자격이 있다. 일 실시예에서, 제2 패스 큐(2612)에서의 연산들(예를 들어, 마이크로 연산들)이 더 오래되었기 때문에, 이들은 준비되어 있는 경우에 디스패치에 대한 우선순위를 제공받는다. 이하는 큐 선택을 위해 사용될 수 있다: Select_queue = (Valid second-pass-uop) AND (16-cycles) ? second-PASS-QUEUE : MAIN-QUEUE. 일 실시예에서, 디스패치 회로(2600)의 스케줄링 회로(2602)는 제2 패스 큐(2612)로부터 엔트리를 선택하기 위해 멀티플렉서(2604)를 활용한다. 예를 들어, 출력(2608)을 통해 FMA 그리드에 보내질 연산을 제공하기 위해 멀티플렉서(2606)가 메인 큐(2610) 또는 제2 큐(2612) 중 어느 하나를 선택한다.
도 27은 본 개시내용의 실시예들에 따른 다중 패스에 대한 행렬 연산 가속기 회로의 디스패치 회로의 스케줄링 회로(2700)를 도시한다.
이들 실시예들에서의 입력 행렬은 입력 "B" 행렬(예를 들어, 타일)을 지칭하지만, 이것은 단지 예시적인 것일 뿐이며, 다른 행렬들(예를 들어, 타일들)이 유사하게 스케줄링될 수 있다.
스케줄링 회로(2700)는 행렬 연산 가속기 회로에 대해 수행될 다음 연산(예를 들어, 마이크로 연산), 및 특히 선택되고 및/또는 실행을 위해 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 PE 회로들)에 디스패치되는 다음 연산을 식별하는 값을 수신하는 입력(2702)을 포함한다. 일 실시예에서, 입력(2702)은 도 23으로부터의 출력(2304)을 수신한다.
특정 실시예들에서, 입력(2702)은 스케줄링 회로(2700)에 의해 디스패치될 다음 연산(예를 들어, 그리고 대응하는 입력/출력 타일들)을 식별한다. 이들 실시예들 중 특정의 것들에서, 입력(2702)은 타일(예를 들어, 도 21에서 데이터 버퍼들(예를 들어, 레지스터들)(2105)에 타일을 형성하는 레지스터들의 세트)을 나타내는 ID(identification) 값을 포함한다. 스케줄링 회로(2700)는 행렬 연산 가속기 회로에 의해 처리되는 현재 타일(들)을 식별하는 스토리지(2704)를 포함하고, 특히, 그것은 그들의 데이터가 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들)에 로드되는 (또는 그들의 데이터가 연산 회로 내로/바깥으로 로드되고 있는) 현재 타일(들)을 식별할 수 있다. 일 실시예에서, 스케줄링 회로(2700)는 스토리지(2704)에서의 식별 값이 유효 값 또는 무효 값(예를 들어, 하드웨어가 또 다른 타일을 로드하고 있고 따라서 또 다른 식별 값)인지를 표시하는 유효 타일(예를 들어, 타일 B) 스토리지(2706)를 포함한다.
스케줄링 회로(2700)는 (i) 연산 회로 내로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내로) 로드되는 현재 타일(예를 들어, 타일 B)을 (ii) 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들) 내에 로드될 다음 타일(예를 들어, 다음 타일 B)과 비교하는 비교 회로(2708)를 포함한다. 일 실시예에서, 이 비교는 각각의 타일에 대해 스케줄링 회로에 의해 제공되는 식별 값, 예를 들어, 행렬 연산 가속기의 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105)) 내로 타일의 엔트리상에서 제공되는 식별 값을 비교함으로써 행해지며, 예를 들어, 여기서 식별 값은 타일에 대한 값들이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들)에 입력되기 전에 각각의 타일에 제공된다.
특정 실시예들에서, 비교 회로(2708)는 (i) 다음 연산을 위한 입력(2702)으로부터의 입력 타일(예를 들어, 도 21의 데이터 버퍼들(2105)에서의 그의 ID 값)(예를 들어, "새로운 타일 B")을, (ii) 연산 회로 내에 현재 로드되는(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들)에 현재 로드되는) 현재 타일(예를 들어, 타일 B), 예를 들어, 도 21의 FMA 그리드(2109)에 현재 로드되는 타일에 대한 도 21의 데이터 버퍼들(2105)에 대한 ID 값과 비교한다. 일 실시예에서, 비교 회로(2708)는 사용 중인 현재 타일의 ID 값을 연산 회로에서 사용될 다음 타일의 ID 값과 비교하고, 동일하다면, 이들이 동일하다는 값(예를 들어, 1)을 어써트한다. 일 실시예에서, 비교 회로(2708)는 스토리지(2704)로부터의 사용 중인 현재 타일의 ID 값을 연산 회로에서 사용될 다음 타일의 ID 값과 비교하고, 그리고 동일하다면, 스토리지(2706)가 또한 스토리지(2704)에서의 식별 값이 예를 들어 유효 값인 것을 나타낼 때 이들이 동일하다는 값(예를 들어, 1)을 어써트하고, 다른 경우에는 상이한 값(예를 들어, 0)을 어써트한다.
특정 실시예들에서, (i) 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 로드되는 현재 타일(예를 들어, 타일 B)이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들) 내에 로드될 (ii) 다음 타일(예를 들어, 다음 타일 B)과 동일할 때, 동일한 타일(예를 들어, 동일한 타일 B) 값이 어써트되어 (예를 들어, 1), 예를 들어 연산 회로로부터 분리된 데이터 버퍼들(예를 들어, 도 21의 데이터 버퍼들(2105))로부터 그것을 리로드하지 않고서, 입력 행렬을 재사용하는, 예를 들어 연산 회로 내에 (예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 이미 저장된 타일 B를 재사용하는 스케줄링 모드로의 스위칭을 (예를 들어, 출력(2710)을 통해) 야기한다.
특정 실시예들에서, 비교 회로(2708)는, (i) 연산 회로 내에 (예를 들어, 도 21에서의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들) 내에) 로드되는 현재 타일(예를 들어, 타일 B)이 (ii) 연산 회로에 로드될 다음 타일(예를 들어, 다음 타일 B)과 동일할 때 출력(2710)상에 제1 값(예를 들어, 1)을 출력한다. 출력(2710)은 이어서 NOT 로직 게이트(2724)로부터의 입력과 함께 OR 로직 게이트(2726) 내로 입력될 수 있다. OR 로직 게이트(2726)로부터의 출력은 AND 로직 게이트(2730)의 제1 입력에 보내진다. AND 로직 게이트(2730)의 다른 입력은 M 카운터(2718)에 결합된 NOT 로직 게이트(2728)에 결합된다. AND 로직 게이트(2730)의 출력(2732)은 특정 실시예들에서 1일 때 다음 연산(예를 들어, 마이크로 연산)의 디스패치를 야기한다. 도 25와 비교하여, 도 27은 짝수 K에 대한 카운터(2716A) 및 홀수 K에 대한 카운터(2716B)를 포함하고, 양쪽 카운터들은 AND 로직 게이트(2720)의 각자의 입력에 결합된다. 일 실시예에서, K 짝수 카운터(2716A)는 B 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 짝수 K들에 대해 1의 값을 어써트하고, 이어서 완료될 때 0(예를 들어, 카운터 K 짝수에 대해 미리 결정된 값)을 어써트하고, K 홀수 카운터(2716B)는 B 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 홀수 K들에 대해 1의 값을 어써트하고, 이어서 완료될 때 0(예를 들어, 카운터 K 홀수에 대해 미리 결정된 값)을 어써트하고, 및 M 카운터(2718)는 A 타일을 행렬 연산 가속기 회로에 로드하는 자원들(예를 들어, 버스)이 점유되는 사이클들의 수를 카운트 다운하는 동안 M에 대해 1의 값을 어서트하고, 이어서 완료될 때 0(예를 들어, 카운터 M에 대해 미리 결정된 값)을 어써트한다. 각각의 디스패치 후에, 카운터(들)는 그들의 원래의(예를 들어, 비 제로) 값에 리셋될 수 있다.
일 실시예에서, 도 27은 다음과 같이 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로들)에 보내질 다음 연산의 트리거를 특정한다: 짝수 사이클들은 K 짝수 카운터(2716A)에 의해 추적되고, 홀수 사이클들은 K 홀수 카운터(2716B)에 의해 추적되고, 디스패치되는 임의의 연산(예를 들어, 마이크로 연산)은 그의 대응하는 K 짝수 또는 K 홀수 카운터들을 업데이트하고, 및 디스패치되는 임의의 연산(예를 들어, 마이크로 연산)은 또한 예를 들어 M 카운터를 업데이트하고, 및 BKxN 행렬 재사용이 체크된다.
일 실시예에서, (((K-even == 0) OR (K-odd == 0) OR (SAME-B == 1)) AND (M <= 1)) THEN인 경우, 다음 연산(예를 들어, 마이크로 연산)을 디스패치한다.
일 실시예에서, 디스패치 상태는 B 버스 사이클(예를 들어, 짝수 사이클, 또는 홀수 사이클) 중 하나가 이용가능하고(예를 들어, 그의 대응 카운터가 0임) 및 제1 FMA0이 이용가능한(예를 들어, M 카운터가 0 또는 1 임) 경우를 나타내고, 메인 큐(2610)에서 또는 제2 패스 큐(2612)에서 다음 연산(예를 들어, 마이크로 연산)을 실행을 위해 연산 회로(예를 들어, 도 21의 FMA 그리드(2109) 또는 도 22의 버퍼 회로(들))에 보낼 것이다.
특정 실시예들에서, M-counter==0일 때 트리거가 발생하는 경우, A 및 B는 동일 사이클상에서 TMM으로 보내져야 하고 및/또는 M-counter==1인 경우, B 버스는 A 버스 이전의 1 사이클 동안 TMM으로 보내져야 한다. 유의할 점은, 특정 실시예들이 FMA 회로(예를 들어, PE) 실행에 대한 다수의(예를 들어, 2) 사이클 레이턴시를 가정하는 경우, FMA 회로(예를 들어, PE)가 단일 사이클 레이턴시를 갖는 경우에 대한 스케줄링이 예를 들어 타일 재사용을 포함하여 가능하다는 것이다.
다음은 스케줄링을 지정하기 위한 예들이다. 일 실시예에서, 타일(예를 들어, 타일 B) 재사용 메커니즘이 다음의 것과 함께 활용된다.
예 1.1 3개의 숫자 a, b 및 c가 주어진다. a와 b의 곱에 c를 더한 것으로서 즉, 로서 FMA(Fused Multiplication Addition) 연산을 정의한다.
예 1.2 3개의 행렬 이 주어진다. 행렬 곱셈 MM(M, K, N)을 새로운 행렬 을 야기하는 연산으로서 정의하며, 여기서 각각의 성분 .
본 명세서에서의 특정 실시예들은 임계값(예를 들어, 16)인 아키텍처 제한을 부과한다.
예 1.3 MQ(Matrix Queue)는 행렬 곱셈 연산들의 정렬된 세트이다, 즉 MQ = {M M1, M M2, ...}. 이 세트는 행렬 곱셈 연산들이 RS에서 준비 상태인 것을 나타낸다.
예 1.4 BMQ(Big Matrix Queue)는 행렬 곱셈 연산들의 정렬된 세트이다, 즉 BMQ = {M M1, M M2, ...}. 이 큐는 제한 3에 따라 행렬 곱셈 유닛에서 여분 라운드를 필요로 하는 K> 8의 행렬 곱셈 연산들에 대해 활용된다. 이 큐에서의 각각의 성분은 내부 카운터를 가지며, 그것의 삽입 후에 16 사이클에 준비된다. 이 구조는 큐 MM의 최상부가 준비되어 있는지를 업데이트하고 체크하기 위한 두 가지 추가적인 방법 업데이트 및 준비를 구현한다.
일 실시예에서, 행렬 곱셈(MM) 연산 파라미터들(M, K, N) 및 피연산자들(A, B, C) 각각은 MM 성분 속성, 예를 들어 MM.K로서 정의된다. 행렬 곱셈 MM 및 그것의 피연산자들 A,B,C가 주어지면, 스케줄러는 초기 사이클을 입력 파라미터로서 수신하는 함수들 Dispatch_A, Dispatch_B, Dispatch_C를 통해 이러한 피연산자들의 초기 사이클 연산들을 동기화시킬 수 있다. 그 후, 연산을 위한 시작 사이클이 정의되면, 스케줄러는 연산 모드에 따라 MM 연산들의 나머지의 실행의 계속을 야기할 수 있다. 구체적으로, 제1(예를 들어, FMA_0) 어레이에서, Dispatch_A의 입력 사이클로부터 시작하여 각각의 결과적인 사이클에서, 성분들 a_(i,0)(여기서 i=0...M)을 브로드캐스팅하고, 이어서 제2(예를 들어, FMA_1) 어레이에서 사이클+2에서 성분들 a_(i,1)(여기서 i=0...M)을 계속 브로드캐스팅하고, 등등과 같이 된다. 일 실시예에서, MM.C 피연산자가 Dispatch_C를 통한 A의 삽입 후의 2 사이클에서 FMA_0 어레이에 삽입되는데, 그 이유는 이번이 FMA 곱셈 연산을 완료하기 위한 시간이기 때문이다. 일 실시예에서, Dispatch_B는 매 2 사이클마다 전체 B_i 행을 FMA_i에 제각기 삽입하는데, 여기서 i=0...K이다. 일부 실시예들에 따르면, 사이클당 단일 행렬 행의 로드가 시스템 제한이라는 점에 유의한다. 실제로, 이러한 제한에 기초하여, 스케줄러는 시간 라인을 짝수 및 홀수 사이클들로 분할하여, MM 연산들을 이러한 분류된 사이클들에 삽입할 수 있다. 그 후, 이러한 사이클들 중 하나가 매 사이클마다 업데이트되는 카운터들 M,K_even,K_odd를 통한 삽입을 위해 자유로운 때를 짜낸다(rack). MM.K> 8인 경우에, 특정 실시예들에서 MM(M,K,N) 연산을 2개의 연산, 즉 MM(M,8,N) 및 MM(M,K-8,N)으로 분할한다. 일 실시예에서, MM(M,8,N) 연산은 MM(M,K,N)의 처음 8개의 FMA 연산을 포함하고, 삽입될 때 실행에 곧게 보내지는데, 여기서 MM(M,K-8,N)은 (예를 들어, 도 26에서의 메인 큐(2610)에서) 인큐잉되고, 연산을 위해 적어도 임계 수(예를 들어, 16) 사이클들을 기다리고(MM(M,8,N)이 그 제1 라인 결과를 계산하기를 끝마칠 때까지), 이후 이 MM(M,8,N) 결과는 실행될 때 행렬 MM(M,K-8,N)의 C 입력으로서 삽입된다.
도 28은 본 개시내용의 실시예들에 따른 행렬 연산 회로를 위한 의사 코드(2800)를 도시한다.
도 29는 본 개시내용의 실시예들에 따른 행렬 연산 명령어를 처리하는 방법(2900)을 도시한다. 프로세서(예를 들어, 또는 프로세서 코어)는, 예를 들어 소프트웨어로부터 명령어를 실행하라는 요청을 수신한 것에 응답하여 방법(2900)을 수행할 수 있다. 프로세서(예를 들어, 또는 프로세서 코어)는 특정 연산을 행렬 연산 가속기 회로로 오프로드할 수 있다. 묘사된 방법(2900)은: 제1 입력 2차원 행렬을 식별하는 제1 필드, 제2 입력 2차원 행렬을 식별하는 제2 필드, 및 결과물 스토리지를 식별하는 필드를 갖는 명령어를 페치하고(2902), 하드웨어 프로세서 코어의 디코더에 의해 명령어를 디코딩된 명령어로 디코딩하고 - 하드웨어 프로세서 코어는 단일 곱셈 누산 회로들의 2차원 그리드를 포함하는 행렬 연산 가속기 회로에 결합되고, 행렬 연산 가속기 회로는 제1 입력 2차원 행렬을 나타내는 제1 복수의 레지스터 및 제2 입력 2차원 행렬을 나타내는 제2 복수의 레지스터에 결합됨 -(2904), 제1 필드(예를 들어, 타일 A), 제2 필드(예를 들어, 타일 B), (및 선택적으로, 제3 필드(예를 들어, 타일 C))와 연관되는 데이터를 검색하고(2906), (선택적으로) 실행을 위해 디코딩된 명령어를 스케줄링하고(2908), 디코딩된 명령어를 실행하여 제1 복수의 레지스터로부터의 제1 입력 2차원 행렬로 단일 곱셈 누산 회로들의 2차원 그리드의 제1 버퍼를 로드하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우: 이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수를 방지하고, 제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 바로 직전의 입력 2차원 행렬에 대한 연산을 실행하여 결과물을 산출하고, 및 결과물을 결과물 스토리지에 저장하고, 및 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우: 제2 입력 2차원 행렬을 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼에 로드하고, 제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 제2 입력 2차원 행렬에 대한 연산을 실행하여 결과물을 산출하고, 및 결과물을 결과물 스토리지에 저장하고(2910), 및 실행된 명령어의 결과를 커밋(2912)함으로써 행렬 연산(예를 들어, FMA) 명령어를 처리하는 단계를 포함한다.
상기의 사항이 사용될 수 있는 예시적인 아키텍처들, 시스템들 등이 아래에 상세히 설명된다.
개시된 기술들의 적어도 일부 실시예들은 다음의 예들을 고려하여 설명될 수 있다:
예 1. 장치로서:
단일 곱셈 누산 회로들의 2차원 그리드를 포함하는 행렬 연산 가속기 회로;
행렬 연산 가속기 회로에 결합된 제1 입력 2차원 행렬을 나타내는 제1 복수의 레지스터;
행렬 연산 가속기 회로에 결합된 제2 입력 2차원 행렬을 나타내는 제2 복수의 레지스터;
단일 명령어를 디코딩된 단일 명령어로 디코딩하는, 행렬 연산 가속기 회로에 결합된 하드웨어 프로세서 코어의 디코더 - 단일 명령어는 결과물 스토리지를 식별하는 필드를 포함함 -; 및
하드웨어 프로세서 코어의 실행 회로 - 하드웨어 프로세서 코어의 실행 회로는 디코딩된 단일 명령어를 실행하여: 제1 복수의 레지스터로부터의 제1 입력 2차원 행렬로 단일 곱셈 누산 회로(fused multiply accumulate circuit)들의 2차원 그리드의 제1 버퍼를 로드하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우: 이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수(reclamation)를 방지하고, 제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 바로 직전의 입력 2차원 행렬에 대한 연산을 수행하여 결과물을 산출하고, 및 결과물을 결과물 스토리지에 저장하고, 및 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우: 제2 입력 2차원 행렬을 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼에 로드하고, 제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 제2 입력 2차원 행렬에 대한 연산을 수행하여 결과물을 산출하고, 및 결과물을 결과물 스토리지에 저장함 - 를 포함한다.
예 2. 예 1의 장치로서, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우, 행렬 연산 가속기 회로는 이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수를 시작한다.
예 3. 예 1에 장치로서, 행렬 연산 가속기 회로는 입력 2차원 행렬을 나타내는 각각의 복수의 레지스터에 대한 식별 값을 할당하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하는 것은 이전 명령어 및 단일 명령어로부터의 대응하는 입력 2차원 행렬들에 대한 각자의 식별 값들을 비교하는 것을 포함한다.
예 4. 예 3의 장치로서, 행렬 연산 가속기 회로는 다음 명령어의 입력 2차원 행렬을 저장하는 제2 복수의 레지스터에 상이한 식별 값을 할당한다.
예 5. 예 1의 장치로서, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우, 행렬 연산 가속기 회로는 디코딩된 단일 명령어의 실행 동안 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼를 로드하지 않는다.
예 6. 예 1의 장치로서, 결과물 스토리지는 디코딩된 단일 명령어의 실행에 의해 형성된 적어도 하나의 출력 2차원 행렬을 나타내는 제3 복수의 레지스터이다.
예 7. 예 1의 장치로서, 연산은 2차원 그리드의 단일 곱셈 누산 회로들의 제1 진부분 집합(proper subset)의 각각의 것의 각자의 출력을 2차원 그리드의 단일 곱셈 누산 회로들의 제2 진부분 집합의 각각의 것의 각자의 입력에 다운스트림으로 송신하여 결과물을 형성하는 것을 포함한다.
예 8. 예 7의 장치로서, 단일 곱셈 누산 회로들의 제1 진부분 집합은 단일 곱셈 누산 회로들의 2차원 그리드의 행 또는 열 중 하나의 것이고 단일 곱셈 누산 회로들의 제2 진부분 집합은 단일 곱셈 누산 회로들의 2차원 그리드의 행 또는 열 중 하나의 것의 또 다른 것이다.
예 9. 방법으로서:
하드웨어 프로세서 코어의 디코더를 이용하여, 단일 명령어를 디코딩된 단일 명령어로 디코딩하는 단계 - 하드웨어 프로세서 코어는 단일 곱셈 누산 회로들의 2차원 그리드를 포함하는 행렬 연산 가속기 회로에 결합되고, 행렬 연산 가속기 회로는 제1 입력 2차원 행렬을 나타내는 제1 복수의 레지스터 및 제2 입력 2차원 행렬을 나타내는 제2 복수의 레지스터에 결합되고, 단일 명령어는 결과물 스토리지를 식별하는 필드를 포함함 -; 및
하드웨어 프로세서 코어의 실행 회로를 이용하여 디코딩된 단일 명령어를 실행하여:
제1 복수의 레지스터로부터의 제1 입력 2차원 행렬로 단일 곱셈 누산 회로(fused multiply accumulate circuit)들의 2차원 그리드의 제1 버퍼를 로드하고,
단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하고,
단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우:
이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수(reclamation)를 방지하고,
제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 바로 직전의 입력 2차원 행렬에 대한 연산을 수행하여 결과물을 산출하고, 및
결과물을 결과물 스토리지에 저장하고, 및
단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우:
제2 입력 2차원 행렬을 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼에 로드하고,
제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 제2 입력 2차원 행렬에 대한 연산을 수행하여 결과물을 산출하고, 및
결과물을 결과물 스토리지에 저장하는 단계를 포함한다.
예 10. 예 9의 방법으로서, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우, 이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수를 시작하는 단계를 추가로 포함한다.
예 11. 예 9의 방법으로서, 입력 2차원 행렬을 나타내는 각각의 복수의 레지스터에 대한 식별 값을 할당하는 단계를 추가로 포함하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하는 것은 이전 명령어 및 단일 명령어로부터의 대응하는 입력 2차원 행렬들에 대한 각자의 식별 값들을 비교하는 것을 포함한다.
예 12. 예 11의 방법으로서, 다음 명령어의 입력 2차원 행렬을 저장하는 제2 복수의 레지스터에 상이한 식별 값을 할당하는 단계를 추가로 포함한다.
예 13. 예 9의 방법으로서, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우, 디코딩된 단일 명령어의 실행 동안 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼를 로드하지 않는 단계를 추가로 포함한다.
예 14. 예 9의 방법으로서, 결과물 스토리지는 디코딩된 단일 명령어의 실행에 의해 형성된 적어도 하나의 출력 2차원 행렬을 나타내는 제3 복수의 레지스터이다.
예 15. 예 9의 방법으로서, 연산은 2차원 그리드의 단일 곱셈 누산 회로들의 제1 진부분 집합의 각각의 것의 각자의 출력을 2차원 그리드의 단일 곱셈 누산 회로들의 제2 진부분 집합의 각각의 것의 각자의 입력에 다운스트림으로 송신하여 결과물을 형성하는 것을 포함한다.
예 16. 예 15의 방법으로서, 단일 곱셈 누산 회로들의 제1 진부분 집합은 단일 곱셈 누산 회로들의 2차원 그리드의 행 또는 열 중 하나의 것이고 단일 곱셈 누산 회로들의 제2 진부분 집합은 단일 곱셈 누산 회로들의 2차원 그리드의 행 또는 열 중 하나의 것의 또 다른 것이다.
예 17. 머신에 의해 실행될 때 머신으로 하여금 방법을 수행하게 야기하는 코드를 저장하는 비일시적 머신 판독가능 매체로서, 방법은:
하드웨어 프로세서 코어의 디코더를 이용하여, 단일 명령어를 디코딩된 단일 명령어로 디코딩하는 단계 - 하드웨어 프로세서 코어는 단일 곱셈 누산 회로들의 2차원 그리드를 포함하는 행렬 연산 가속기 회로에 결합되고, 행렬 연산 가속기 회로는 제1 입력 2차원 행렬을 나타내는 제1 복수의 레지스터 및 제2 입력 2차원 행렬을 나타내는 제2 복수의 레지스터에 결합되고, 단일 명령어는 결과물 스토리지를 식별하는 필드를 포함함 -; 및
하드웨어 프로세서 코어의 실행 회로를 이용하여 디코딩된 단일 명령어를 실행하여:
제1 복수의 레지스터로부터의 제1 입력 2차원 행렬로 단일 곱셈 누산 회로(fused multiply accumulate circuit)들의 2차원 그리드의 제1 버퍼를 로드하고,
단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하고,
단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우:
이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수(reclamation)를 방지하고,
제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 바로 직전의 입력 2차원 행렬에 대한 연산을 수행하여 결과물을 산출하고, 및
결과물을 결과물 스토리지에 저장하고, 및
단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우:
제2 입력 2차원 행렬을 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼에 로드하고,
제1 버퍼로부터의 제1 입력 2차원 행렬 및 제2 버퍼로부터의 제2 입력 2차원 행렬에 대한 연산을 수행하여 결과물을 산출하고, 및
결과물을 결과물 스토리지에 저장하는 단계를 포함한다.
예 18. 예 17의 비일시적 머신 판독가능 매체로서, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하지 않는 경우, 방법은 이전 명령어와 디코딩된 단일 명령어의 실행 사이에 제2 버퍼의 회수를 시작하는 단계를 추가로 포함한다.
예 19. 예 17의 비일시적 머신 판독가능 매체로서, 방법은 입력 2차원 행렬을 나타내는 각각의 복수의 레지스터에 대한 식별 값을 할당하는 단계를 추가로 포함하고, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한 바로 직전의 입력 2차원 행렬을 저장하는지를 체크하는 것은 이전 명령어 및 단일 명령어로부터의 대응하는 입력 2차원 행렬들에 대한 각자의 식별 값들을 비교하는 것을 포함한다.
예 20. 예 19의 비일시적 머신 판독가능 매체로서, 방법은 다음 명령어의 입력 2차원 행렬을 저장하는 제2 복수의 레지스터에 상이한 식별 값을 할당하는 단계를 추가로 포함한다.
예 21. 예 17의 비일시적 머신 판독가능 매체로서, 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼가 제2 입력 2차원 행렬과 동일한, 이전 명령어의 실행으로부터의 바로 직전의 입력 2차원 행렬을 저장하는 경우, 방법은 디코딩된 단일 명령어의 실행 동안 단일 곱셈 누산 회로들의 2차원 그리드의 제2 버퍼를 로드하지 않는 단계를 추가로 포함한다.
예 22. 예 17의 비일시적 머신 판독가능 매체로서, 결과물 스토리지는 디코딩된 단일 명령어의 실행에 의해 형성된 적어도 하나의 출력 2차원 행렬을 나타내는 제3 복수의 레지스터이다.
예 23. 예 17의 비일시적 머신 판독가능 매체로서, 연산은 2차원 그리드의 단일 곱셈 누산 회로들의 제1 진부분 집합의 각각의 것의 각자의 출력을 2차원 그리드의 단일 곱셈 누산 회로들의 제2 진부분 집합의 각각의 것의 각자의 입력에 다운스트림으로 송신하여 결과물을 형성하는 것을 포함한다.
예 24. 예 23의 비일시적 머신 판독가능 매체로서, 단일 곱셈 누산 회로들의 제1 진부분 집합은 단일 곱셈 누산 회로들의 2차원 그리드의 행 또는 열 중 하나의 것이고 단일 곱셈 누산 회로들의 제2 진부분 집합은 단일 곱셈 누산 회로들의 2차원 그리드의 행 또는 열 중 하나의 것의 또 다른 것이다.
또 다른 실시예에서, 장치는 하드웨어 프로세서에 의해 실행될 때 하드웨어 프로세서로 하여금 본 명세서에 개시된 임의의 방법을 수행하게 야기하는 코드를 저장하는 데이터 저장 디바이스를 포함한다. 장치는 상세한 설명에서 설명된 대로의 것일 수 있다. 방법은 상세한 설명에서 설명된 대로의 것일 수 있다.
상세한 예시적인 시스템들, 프로세서들, 및 에뮬레이션
전술한 명령어들을 실행하기 위한 하드웨어, 소프트웨어 등의 예들이 본 명세서에서 상세히 설명된다. 예를 들어, 아래에 설명되는 것은 페치, 디코드, 스케줄, 실행, 리타이어 등과 같은 다양한 파이프라인 스테이지들을 포함하는 명령어 실행의 양태들을 상세히 설명한다.
명령어 세트들.
명령어 세트는 하나 이상의 명령어 포맷을 포함할 수 있다. 주어진 명령어 포맷은, 무엇보다도, 수행될 연산(예를 들어, 오피코드) 및 연산이 그에 대해 수행될 피연산자(들)를 지정하기 위한 다양한 필드들(예를 들어, 비트 수, 비트 로케이션) 및/또는 다른 데이터 필드(들)(예를 들어, 마스크)을 포함할 수 있다. 일부 명령어 포맷들은 명령어 템플릿들(또는 서브포맷들)의 정의를 통해 추가로 세분된다. 예를 들어, 주어진 명령어 포맷의 명령어 템플릿은 명령어 포맷의 필드들의 상이한 서브세트들을 갖도록 정의될 수 있고(포함된 필드들은 전형적으로 동일 순서에 있지만, 적어도 일부는 더 적은 필드가 포함되기 때문에 상이한 비트 위치들을 가짐) 및/또는 상이하게 해석되는 주어진 필드를 갖도록 정의될 수 있다. 따라서, ISA의 각각의 명령어는 주어진 명령어 포맷을 이용하여(및 정의된 경우, 그 명령어 포맷의 명령어 템플릿들 중 주어진 템플릿에서) 표현되고, 연산 및 피연산자들을 지정하기 위한 필드들을 포함한다. 예를 들어, 예시적인 ADD 명령어는 특정 오피코드 및 해당 오피코드를 특정하는 오피코드 필드 및 피연산자들(소스1/목적지 및 소스2)을 선택하기 위한 피연산자 필드들을 포함하는 명령어 포맷을 갖고; 명령어 스트림에서의 이 ADD 명령어의 발생은 특정 피연산자들을 선택하는 피연산자 필드들에서 특정 내용을 가질 것이다. AVX(Advanced Vector Extensions)(AVX1 및 AVX2)라고 지칭되고 VEX(Vector Extensions) 코딩 스킴을 이용하는 SIMD 확장 세트가 발표 및/또는 공표되었다(예를 들어, Intel® 64 and IA-32 Architectures Software Developer's Manual, November 2018을 참조하고; Intel® Architecture Instruction Set Extensions Programming Reference, October 2018을 참조하라).
예시적인 명령어 포맷들
본 명세서에 설명되는 명령어(들)의 실시예들은 상이한 포맷들로 구현될 수 있다. 추가적으로, 예시적인 시스템들, 아키텍처들, 및 파이프라인들이 아래에 상세하게 설명된다. 명령어(들)의 실시예들은 그러한 시스템들, 아키텍처들, 및 파이프라인들 상에서 실행될 수 있지만, 이러한 상세 설명된 것들에 한정되지는 않는다.
일반적 벡터 친화적 명령어 포맷
벡터 친화적 명령어 포맷은 벡터 명령어들에 적합한 명령어 포맷이다(예를 들어, 벡터 연산들에 특정적인 특정 필드들이 존재함). 벡터 및 스칼라 연산들 양자 모두가 벡터 친화적 명령어 포맷을 통해 지원되는 실시예들이 설명되지만, 대안적인 실시예들은 벡터 친화적 명령어 포맷의 벡터 연산들만을 사용한다.
도 30a 및 도 30b는 본 개시내용의 실시예들에 따른 일반 벡터 친화적 명령어 포맷 및 그것의 명령어 템플릿들을 예시하는 블록도들이다. 도 30a는 본 개시내용의 실시예들에 따른 일반 벡터 친화적 명령어 포맷(generic vector friendly instruction format) 및 그것의 클래스 A 명령어 템플릿들을 예시하는 블록도이고; 도 30b는 본 개시내용의 실시예들에 따른 일반 벡터 친화적 명령어 포맷 및 그것의 클래스 B 명령어 템플릿들을 예시하는 블록도이다. 구체적으로는, 일반 벡터 친화적 명령어 포맷(3000)에 대하여 클래스 A 및 클래스 B 명령어 템플릿들이 정의되고, 둘 모두는 메모리 액세스 없음(3005) 명령어 템플릿들 및 메모리 액세스(3020) 명령어 템플릿들을 포함한다. 벡터 친화적 명령어 포맷의 맥락에서 일반적(generic)이라는 용어는 임의의 특정 명령어 세트에 얽매이지 않는 명령어 포맷을 지칭한다.
벡터 친화적 명령어 포맷이 이하: 32 비트(4 바이트) 또는 64 비트(8 바이트) 데이터 성분 폭들(크기들)을 가진 64 바이트 벡터 피연산자 길이(또는 크기)(및 따라서, 64 바이트 벡터는 16 더블워드 크기 요소 또는 대안적으로 8 쿼드워드 크기 요소로 구성된다); 16 비트(2 바이트) 또는 8 비트(1 바이트) 데이터 성분 폭들(또는 크기들)을 가진 64 바이트 벡터 피연산자 길이(또는 크기); 32 비트(4 바이트), 64 비트(8 바이트), 16 비트(2 바이트), 또는 8 비트(1 바이트) 데이터 성분 폭들(또는 크기들)을 가진 32 바이트 벡터 피연산자 길이(또는 크기); 및 32 비트(4 바이트), 64 비트(8 바이트), 16 비트(2 바이트), 또는 8 비트(1 바이트) 데이터 성분 폭들(또는 크기들)을 가진 16 바이트 벡터 피연산자 길이(또는 크기)를 지원하는 본 개시내용의 실시예들이 설명될 것이지만; 대안적 실시예들은 더 크거나, 더 작거나 또는 상이한 데이터 성분 폭들(예를 들어, 128 비트(16 바이트) 데이터 성분 폭들)을 가진 더 크거나, 더 작거나 및/또는 상이한 벡터 피연산자 크기들(예를 들어, 256 바이트 벡터 피연산자들)을 지원할 수 있다.
도 30a에서의 클래스 A 명령어 템플릿들은: 1) 메모리 액세스 없음(3005) 명령어 템플릿들 내에 메모리 액세스 없음, 풀 라운드 제어형 연산(3010) 명령어 템플릿 및 메모리 액세스 없음, 데이터 변환형 연산(3015) 명령어 템플릿이 보여지고; 및 2) 메모리 액세스(3020) 명령어 템플릿들 내에 메모리 액세스, 일시적(3025) 명령어 템플릿 및 메모리 액세스, 비일시적(3030) 명령어 템플릿이 보여진 것을 포함한다. 도 30b에서의 클래스 B 명령어 템플릿들은: 1) 메모리 액세스 없음(3005) 명령어 템플릿들 내에 메모리 액세스 없음, 기입 마스크 제어, 부분 라운드 제어형 연산(3012) 명령어 템플릿 및 메모리 액세스 없음, 기입 마스크 제어, vsize형 연산(3017) 명령어 템플릿이 보여지고; 및 2) 메모리 액세스(3020) 명령어 템플릿들 내에 메모리 액세스, 기입 마스크 제어(3027) 명령어 템플릿이 보여지는 것을 포함한다.
일반 벡터 친화적 명령어 포맷(3000)은 도 30a-도 30b에 예시된 순서로 아래에 열거되는 다음의 필드들을 포함한다.
포맷 필드(3040) - 이 필드에서의 특정 값(명령어 포맷 식별자 값)은 벡터 친화적 명령어 포맷, 및 따라서 명령어 스트림들 내의 벡터 친화적 명령어 포맷에서의 명령어들의 발생들을 고유하게 식별한다. 이와 같이, 이 필드는 이것이 일반적 벡터 친화적 명령어 포맷만을 갖는 명령어 세트에 대해 필요하지 않다는 점에서 선택적이다.
베이스 연산 필드(3042) - 이것의 내용은 상이한 베이스 연산들을 구별한다.
레지스터 인덱스 필드(3044) - 이것의 내용은, 직접적으로 또는 어드레스 발생을 통해, 이들이 레지스터들에 있든지 메모리에 있든지, 소스 및 목적지 피연산자들의 위치들을 지정한다. 이들은 PxQ(예를 들어, 32x512, 16x128, 32x1024, 64x1024) 레지스터 파일로부터 N개의 레지스터를 선택하기에 충분한 비트 수를 포함한다. 일 실시예에서 N은 최대 3개의 소스 및 1개의 목적지 레지스터일 수 있지만, 대안적인 실시예들은 더 많거나 더 적은 소스들 및 목적지 레지스터들을 지원할 수 있다(예를 들어, 이러한 소스들 중 하나가 또한 목적지의 역할을 하는 경우에 최대 2개의 소스까지 지원할 수 있고, 이러한 소스들 중 하나가 또한 목적지의 역할을 하는 경우에 최대 3개의 소스를 지원할 수 있고, 최대 2개의 소스 및 1개의 목적지까지를 지원할 수 있다).
수정자 필드(3046) - 이것의 내용은 그렇게 하지 않는 것들로부터 메모리 액세스를 지정하는 일반적 벡터 명령어 포맷에서의 명령어들의 발생들을 구별한다; 즉, 메모리 액세스 없음(3005) 명령어 템플릿들과 메모리 액세스(3020) 명령어 템플릿들 간에서. 메모리 액세스 연산들은 (일부 경우에서 레지스터들에서의 값들을 사용하여 소스 및/또는 목적지 어드레스들을 지정하는) 메모리 계층구조에 대해 판독 및/또는 기입하는 반면에, 메모리 액세스 없음 연산들은 그렇게 하지 않는다(예를 들어, 소스 및 목적지들이 레지스터들임). 일 실시예에서 이 필드는 메모리 어드레스 계산들을 수행하는 3가지 상이한 방식 사이에서 또한 선택하지만, 대안적인 실시예들은 메모리 어드레스 계산들을 수행하는 더 많거나, 더 적거나 또는 상이한 방식들을 지원할 수 있다.
증강 연산 필드(augmentation operation field)(3050) - 이것의 내용은 다양한 상이한 연산들 중 어느 것이 베이스 연산에 부가하여 실행되어야 하는지를 구별해 준다. 이 필드는 맥락에 고유하다. 본 개시내용의 일 실시예에서, 이 필드는 클래스 필드(3068), 알파 필드(3052), 및 베타 필드(3054)로 분할된다. 증강 연산 필드(3050)는 연산들의 공통 그룹들이 2, 3, 또는 4개의 명령어보다는 단일 명령어에서 수행될 수 있게 한다.
스케일링 필드(3060) - 이것의 내용은 메모리 어드레스 생성을 위한(예를 들어, 2scale * index + base를 이용하는 어드레스 생성을 위한) 인덱스 필드의 내용의 스케일링(scaling)을 허용한다.
변위 필드(3062A) - 이것의 내용은 메모리 어드레스 생성(예를 들어, 2scale*index + base + displacement를 이용하는 어드레스 생성을 위한)의 일부로 이용된다.
변위 인자 필드(3062B)(변위 인자 필드(3062B)에 직접 걸친 변위 필드(3062A)의 병치(juxtaposition)는 어느 하나 또는 다른 것이 이용되는 것을 나타냄을 유의하라) - 이것의 내용은 어드레스 발생의 일부로서 사용된다; 이것은 메모리 액세스의 크기(N)에 의해 스케일링될 변위 인자를 지정한다 -여기서 N은 메모리 액세스에서의 바이트들의 수이다(예를 들어, 2scale*index + base + scaled displacement를 사용하는 어드레스 발생에 대해). 잉여 하위 비트들(redundant low-order bits)은 무시되고, 따라서 변위 인자 필드의 내용은 유효 어드레스를 계산하는데 이용될 최종 변위를 생성하기 위해서 메모리 피연산자 총 크기(N)로 곱해진다. N의 값은 (본 명세서에서 나중에 설명되는) 전체 오피코드 필드(full opcode field)(3074) 및 데이터 조작 필드(3054C)에 기초하여 런타임 시에 프로세서 하드웨어에 의해 결정된다. 변위 필드(3062A) 및 변위 인자 필드(3062B)는, 이들이 메모리 액세스 없음(3005) 명령어 템플릿들에 대해 이용되지 않고 및/또는 상이한 실시예들은 둘 중 하나만을 구현하거나 어느 것도 구현하지 않을 수 있다는 점에서 선택적이다.
데이터 성분 폭 필드(3064) - 이것의 내용은 다수의 데이터 성분 폭 중 어느 것이 사용될 것인지를 구별한다(일부 실시예들에서 모든 명령어들에 대해; 다른 실시예들에서 명령어들 중 일부만에 대해). 이 필드는, 이것이 단 하나의 데이터 성분 폭만이 지원되고 및/또는 데이터 성분 폭들이 오피코드들의 일부 양태를 이용하여 지원되는 경우에 필요하지 않다는 점에서 선택적이다.
기입 마스크 필드(3070) - 이것의 내용은, 데이터 성분 위치당 기초로, 목적지 벡터 피연산자에서의 그 데이터 성분 위치가 베이스 연산 및 증강 연산의 결과를 반영하는지를 제어한다. 클래스 A 명령어 템플릿들은 병합-기입마스킹(merging-writemasking)을 지원하는 반면에, 클래스 B 명령어 템플릿들은 병합-기입마스킹 및 제로잉-기입마스킹(zeroing-writemasking) 양쪽 모두를 지원한다. 병합할 때에, 벡터 마스크들은 목적지에서의 임의의 성분들의 세트가 (베이스 연산 및 증강 연산에 의해 지정되는) 임의의 연산의 실행 동안 업데이트들로부터 보호될 수 있게 해주고; 다른 일 실시예에서는, 대응하는 마스크 비트가 0을 갖는 경우에 목적지의 각각의 성분의 오래된 값을 보존한다. 이에 반해, 제로잉할 때에, 벡터 마스크들은 목적지에서의 임의의 성분들의 세트가 (베이스 연산 및 증강 연산에 의해 특정되는) 임의의 연산의 실행 동안 제로로 될 수 있게 하고; 일 실시예에서는, 목적지의 성분은 대응하는 마스크 비트가 0 값을 가질 때에 0으로 설정된다. 이러한 기능성의 서브세트는 수행되는 연산의 벡터 길이를 제어하는 능력이다(즉, 성분들의 범위(span)는 첫 번째 것으로부터 마지막 것까지 수정됨); 그러나, 수정되는 요소들이 연속적인 것은 필요하지 않다. 따라서, 기입 마스크 필드(3070)는 로드, 스토어, 산술, 논리 등을 포함하는 부분 벡터 연산들을 허용한다. 기입 마스크 필드(3070)의 내용이 사용될 기입 마스크를 포함하는 다수의 기입 마스크 레지스터 중 하나를 선택하는(그리고 따라서 기입 마스크 필드(3070)의 내용이 수행될 마스킹을 간접적으로 식별하는) 개시내용의 실시예들이 설명되지만, 대안 실시예들은 대신에 또는 추가적으로 마스크 기입 필드(3070)의 내용이 수행될 마스킹을 직접적으로 특정하는 것을 허용한다.
즉치 필드(3072) - 이것의 내용은 즉치의 스펙(specification)을 허용한다. 이 필드는, 이것이 즉치를 지원하지 않는 일반적 벡터 친화적 포맷의 구현에 존재하지 않으며, 즉치를 이용하지 않는 명령어들에 존재하지 않는다는 점에서 선택적이다.
클래스 필드(3068) - 이것의 내용은 명령어들의 상이한 클래스들 간을 구별한다. 도 30a 및 도 30d를 참조하면, 이 필드의 내용은 클래스 A 명령어들과 클래스 B 명령어들 사이에서 선택한다. 도 30a 및 도 30b에서, 필드에 특정 값이 존재하는 것을 나타내기 위해 라운딩된 코너 정사각형들이 이용된다(예를 들어, 도 30a 및 도 30b에서 제각기 클래스 필드(3068)에 대한 클래스 A(3068A) 및 클래스 B(3068B)).
클래스 A의 명령어 템플릿들
클래스 A의 메모리 액세스 없음(3005) 명령어 템플릿들의 경우에, 알파 필드(3052)는 RS 필드(3052A)로서 해석되고, 그것의 내용은 상이한 증강 연산 타입들 중 어느 것이 수행되어야 하는지를 구분하는 반면에(예를 들어, 라운드(3052A.1) 및 데이터 변환(3052A.2)은 메모리 액세스 없음, 라운드 타입 연산(3010) 및 메모리 액세스 없음, 데이터 변환형 연산(3015) 명령어 템플릿들에 대해 제각기 특정됨), 베타 필드(3054)는 특정 타입의 연산들 중 어느 연산이 수행될 것인지를 구분한다. 메모리 액세스 없음(3005) 명령어 템플릿들에서, 스케일링 필드(3060), 변위 필드(3062A) 및 변위 인자 필드(3062B)는 존재하지 않는다.
메모리 액세스 없음 명령어 템플릿들 - 풀 라운드 제어형 연산
메모리 액세스 없음 풀 라운드 제어형 연산(3010) 명령어 템플릿에서, 베타 필드(3054)는 라운드 제어 필드(3054A)로서 해석되고, 그것의 내용(들)은 정적 라운딩을 제공한다. 본 개시내용의 설명된 실시예들에서 라운드 제어 필드(3054A)는 모든 부동 소수점 예외 억제(SAE: suppress all floating point exceptions) 필드(3056) 및 라운드 연산 제어 필드(3058)를 포함하지만, 대안적인 실시예들은 이들 개념들 양쪽 모두를 동일한 필드로 인코딩하거나, 또는 이들 개념들/필드들 중 어느 한쪽만을 가질 수 있다(예를 들어, 라운드 연산 제어 필드(3058)만을 가질 수 있다).
SAE 필드(3056) - 이것의 내용은 예외 이벤트 보고를 디스에이블할 것인지 여부를 구별해 준다; SAE 필드(3056)의 내용이 억제가 인에이블링된 것을 표시할 때, 주어진 명령어는 어떠한 종류의 부동 소수점 예외 플래그도 보고하지 않고, 어떠한 부동 소수점 예외 핸들러도 일으키지 않는다.
라운드 연산 제어 필드(3058) - 이것의 내용은 라운딩 연산들의 그룹 중 어느 것을 수행할지를 구분한다(예를 들어, 라운드-업(Round-up), 라운드-다운(Round-down), 제로를 향한 라운드(Round-towards-zero) 및 최근접치로의 라운드(Round-to-nearest)). 따라서, 라운드 연산 제어 필드(3058)는 명령어당 기준으로 라운딩 모드의 변경을 허용한다. 프로세서가 라운딩 모드들을 지정하기 위한 제어 레지스터를 포함하는 본 개시내용의 일 실시예에서, 라운드 연산 제어 필드(3050)의 내용은 그 레지스터 값을 오버라이드한다.
메모리 액세스 없음 명령어 템플릿들 - 데이터 변환형 연산
메모리 액세스 없음 데이터 변환형 연산(3015) 명령어 템플릿에서, 베타 필드(3054)는 데이터 변환 필드(3054B)로서 해석되고, 이것의 내용은 다수의 데이터 변환 중 어느 것이 실행되어야 하는지를 구별해 준다(예컨대, 데이터 변환 없음, 스위즐링(swizzle), 브로드캐스트).
클래스 A의 메모리 액세스(3020) 명령어 템플릿의 경우에, 알파 필드(3052)는 축출 힌트 필드(eviction hint field)(3052B)로서 해석되고, 그것의 내용은 축출 힌트들 중 어느 것이 이용되어야 하는지를 구분하는 반면에(도 30a에서, 메모리 액세스, 일시적(3025) 명령어 템플릿 및 메모리 액세스, 비 일시적(3030) 명령어 템플릿에 대해 일시적(3052B.1) 및 비 일시적(3052B.2)가 제각기 특정됨), 베타 필드(3054)는 데이터 조작 필드(3054C)로서 해석되고, 그것의 내용은(프리미티브(primitives)로도 알려진) 복수의 데이터 조작 연산들 중 어느 연산이 수행되어야 하는지를 구분한다(예를 들어, 조작 없음; 브로드캐스트; 소스의 업 컨버전; 및 목적지의 다운 컨버전). 메모리 액세스(3020) 명령어 템플릿들은 스케일링 필드(3060), 및 선택적으로 변위 필드(3062A) 또는 변위 인자 필드(3062B)를 포함한다.
벡터 메모리 명령어들은 변환 지원에 의해 메모리로부터의 벡터 로드들 및 메모리로의 벡터 스토어들을 수행한다. 정규 벡터 명령어들에서와 같이, 벡터 메모리 명령어들은 데이터 성분당 방식으로 메모리로부터/로 데이터를 전달하고, 실제로 전달되는 성분들은 기입 마스크로서 선택되는 벡터 마스크의 내용에 의해 지시된다.
메모리 액세스 명령어 템플릿들 - 일시적
일시적 데이터는 캐싱으로부터 이익을 얻기에 충분할 만큼 빨리 재사용될 가능성이 있는 데이터이다. 그러나, 이것은 힌트이고, 상이한 프로세서는 힌트를 완전히 무시하는 것을 포함하는 상이한 방식으로 그것을 구현할 수 있다.
메모리 액세스 명령어 템플릿들 - 비일시적
비일시적 데이터는 제1 레벨 캐시 내의 캐싱으로부터 이익을 얻기에 충분할 만큼 빨리 재사용될 가능성이 없는 데이터이고, 축출에 대한 우선순위가 주어져야 한다. 그러나, 이것은 힌트이고, 상이한 프로세서는 힌트를 완전히 무시하는 것을 포함하는 상이한 방식으로 그것을 구현할 수 있다.
클래스 B의 명령어 템플릿들
클래스 B의 명령어 템플릿들의 경우에, 알파 필드(3052)는 기입 마스크 제어(Z) 필드(3052C)로서 해석되고, 이것의 내용은 기입 마스크 필드(3070)에 의해 제어되는 기입 마스킹이 병합이어야 하는지 또는 제로잉이어야 하는지를 구분한다.
클래스 B의 메모리 액세스 없음(3005) 명령어 템플릿들의 경우에, 베타 필드(3054)의 일부는 RL 필드(3057A)로서 해석되고, 이것의 내용은 상이한 증강 연산 타입들 중 어느 것이 수행되어야 하는지를 구분하는 반면에(예를 들어, 메모리 액세스 없음, 기입 마스크 제어, 부분 라운드 제어형 연산(3012) 명령어 템플릿, 및 메모리 액세스 없음, 기입 마스크 제어, VSIZE형 연산(3017) 명령어 템플릿에 대해 제각기 라운드(3057A.1) 및 벡터 길이(VSIZE)(3057A.2)가 특정됨), 베타 필드(3054)의 나머지는 특정 타입의 연산들 중 어느 연산이 수행되어야 하는지를 구분한다. 메모리 액세스 없음(3005) 명령어 템플릿들에서, 스케일링 필드(3060), 변위 필드(3062A) 및 변위 인자 필드(3062B)는 존재하지 않는다.
메모리 액세스 없음, 기입 마스크 제어, 부분 라운드 제어형 연산(3010) 명령어 템플릿에서, 베타 필드(3054)의 나머지는 라운드 연산 필드(3059A)로서 해석되고, 예외 이벤트 보고가 디스에이블된다(주어진 명령어는 어떠한 종류의 부동 소수점 예외 플래그도 보고하지 않고, 어떠한 부동 소수점 예외 핸들러도 발생시키지 않는다).
라운드 연산 제어 필드(3059A) - 라운드 연산 제어 필드(3058)처럼, 이것의 내용은 라운드 연산들의 그룹 중 어느 것을 수행할지를 구분한다(예를 들어, 라운드-업, 라운드-다운, 제로를 향한 라운드 및 최근접치로의 라운드). 따라서, 라운드 연산 제어 필드(3059A)는 명령어당 기준으로 라운딩 모드의 변경을 허용한다. 프로세서가 라운딩 모드들을 지정하기 위한 제어 레지스터를 포함하는 본 개시내용의 일 실시예에서, 라운드 연산 제어 필드(3050)의 내용은 그 레지스터 값을 오버라이드한다.
메모리 액세스 없음, 기입 마스크 제어, VSIZE형 연산(3017) 명령어 템플릿에서, 베타 필드(3054)의 나머지는 벡터 길이 필드(3059B)로서 해석되고, 이것의 내용은 다수의 데이터 벡터 길이 중 어느 것에 대해 수행되어야 하는지를 구분한다(예를 들어, 128, 256, 또는 512 바이트).
클래스 B의 메모리 액세스(3020) 명령어 템플릿의 경우에, 베타 필드(3054)의 부분은 브로드캐스트 필드(3057B)로서 해석되고, 이것의 내용은 브로드캐스트 타입 데이터 조작 연산이 수행되어야 하는지 여부를 구분하는 반면에, 베타 필드(3054)의 나머지는 벡터 길이 필드(3059B)로서 해석된다. 메모리 액세스(3020) 명령어 템플릿들은 스케일링 필드(3060), 및 선택적으로 변위 필드(3062A) 또는 변위 인자 필드(3062B)를 포함한다.
일반 벡터 친화적 명령어 포맷(3000)과 관련하여, 포맷 필드(3040), 베이스 연산 필드(3042), 및 데이터 성분 폭 필드(3064)를 포함하는 풀 오피코드 필드(3074)가 도시되어 있다. 풀 오피코드 필드(3074)가 이들 필드들 모두를 포함하는 일 실시예가 도시되어 있지만, 이들 모두를 지원하지는 않는 실시예들에서, 풀 오피코드 필드(3074)는 이들 필드들 모두보다 적은 필드들을 포함한다. 풀 오피코드 필드(3074)는 연산 코드(opcode)를 제공한다.
증강 연산 필드(3050), 데이터 성분 폭 필드(3064), 및 기입 마스크 필드(3070)는, 이들 피처들이 명령어당 기준으로 일반 벡터 친화적 명령어 포맷에서 특정되는 것을 허용한다.
기입 마스크 필드와 데이터 성분 폭 필드의 조합은, 이것들이 마스크가 상이한 데이터 성분 폭들에 기초하여 적용되는 것을 허용한다는 점에서 타입화된 명령어들(typed instructions)을 생성한다.
클래스 A 및 클래스 B 내에서 발견되는 다양한 명령어 템플릿들은 상이한 상황들에서 이롭다. 본 개시내용의 일부 실시예들에서, 상이한 프로세서들 또는 프로세서 내의 상이한 코어들은 클래스 A만을, 클래스 B만을, 또는 둘 모두의 클래스를 지원할 수 있다. 예를 들어, 범용 컴퓨팅에 대해 의도된 고성능 범용 비순차적 코어는 클래스 B만을 지원할 수 있고, 주로 그래픽 및/또는 과학(스루풋) 컴퓨팅에 대해 의도된 코어는 클래스 A만을 지원할 수 있고, 양쪽 모두를 위해 의도된 코어는 양쪽 모두를 지원할 수 있다(물론, 양쪽 모두의 클래스들로부터의 명령어들 및 템플릿들의 어떤 혼합을 갖지만 양쪽 모두의 클래스들로부터의 명령어들 및 템플릿들 전부를 갖지는 않는 코어는 본 개시내용의 범위 내에 있다). 또한, 단일 프로세서가 복수의 코어를 포함할 수 있는데, 이들 모두는 동일한 클래스를 지원하거나 또는 상이한 코어들이 상이한 클래스를 지원한다. 예를 들어, 별개의 그래픽 및 범용 코어들을 갖는 프로세서에서, 주로 그래픽 및/또는 과학 컴퓨팅에 대해 의도된 그래픽 코어들 중 하나는 클래스 A만을 지원할 수 있는 반면에, 범용 코어들 중 하나 이상은, 클래스 B만을 지원하는, 범용 컴퓨팅에 대해 의도된 비순차적 실행 및 레지스터 리네이밍을 갖는 고성능 범용 코어들일 수 있다. 별개의 그래픽 코어를 갖지 않는 또 다른 프로세서는 클래스 A 및 클래스 B 양쪽 모두를 지원하는 하나 이상의 범용 순차적 또는 비순차적 코어를 포함할 수 있다. 물론, 하나의 클래스로부터의 피처들은 본 개시내용의 상이한 실시예들에 있어서 다른 클래스에서 또한 구현될 수 있다. 고급 레벨 언어로 작성된 프로그램들은: 1) 실행을 위해 타겟 프로세서에 의해 지원되는 클래스(들)의 명령어들만을 갖는 형태; 또는 2) 모든 클래스의 명령어들의 상이한 조합들을 이용하여 작성된 대안 루틴들을 갖고 또한 코드를 현재 실행하고 있는 프로세서에 의해 지원되는 명령어들에 기초하여 실행되는 루틴들을 선택하는 제어 흐름 코드를 갖는 형태를 포함하여 다양하고 상이한 실행가능 형태들로 될 것이다(예를 들어, 저스트 인 타임(just in time) 컴파일링되거나 정적으로 컴파일링될 것이다).
예시적인 특정 벡터 친화적 명령어 포맷
도 31은 본 개시내용의 실시예들에 따른 예시적인 특정 벡터 친화적 명령어 포맷을 예시하는 블록도이다. 도 31은 필드들의 로케이션, 크기, 해석, 및 순서뿐만 아니라, 이들 필드들의 일부에 대한 값들을 특정한다는 점에서 특정적인 특정 벡터 친화적 명령어 포맷(3100)을 도시한다. 특정 벡터 친화적 명령어 포맷(3100)은 x86 명령어 세트를 확장하는 데 이용될 수 있고, 따라서 필드들 중 일부는 기존의 x86 명령어 세트 및 그의 확장(예를 들어, AVX)에서 이용된 것들과 유사하거나 동일하다. 이 포맷은 확장들을 갖는 기존의 x86 명령어 세트의 프리픽스 인코딩 필드, 실제 오피코드 바이트 필드(real opcode byte field), MOD R/M 필드, SIB 필드, 변위 필드, 및 즉치 필드들과 일관되게 유지된다. 도 31로부터의 필드들이 매핑되는 도 30으로부터의 필드들이 예시되어 있다.
본 개시내용의 실시예들은 예시의 목적으로 일반 벡터 친화적 명령어 포맷(3000)의 맥락에서 특정 벡터 친화적 명령어 포맷(3100)을 참조하여 설명되지만, 본 발명은 청구항에 기재된 경우를 제외하고는 특정 벡터 친화적 명령어 포맷(3100)에 제한되지 않음을 이해해야 한다. 예를 들어, 일반 벡터 친화적 명령어 포맷(3000)은 다양한 필드들에 대한 다양한 가능한 크기를 고려하는 반면에, 특정 벡터 친화적 명령어 포맷(3100)은 특정 크기의 필드들을 갖는 것으로 도시되어 있다. 특정의 예로서, 데이터 성분 폭 필드(3064)가 특정의 벡터 친화적 명령어 포맷(3100)에서 1 비트 필드로서 예시되어 있지만, 본 개시내용은 이것에만 제한되지 않는다[즉, 일반적 벡터 친화적 명령어 포맷(3000)은 데이터 성분 폭 필드(3064)의 다른 사이즈들을 고려한다].
일반 벡터 친화적 명령어 포맷(3000)은 도 31a에 도시된 순서로 아래에 열거되는 다음의 필드들을 포함한다.
EVEX 프리픽스(바이트 0-3)(3102) - 4 바이트 형태로 인코딩된다.
포맷 필드(3040)(EVEX 바이트 0, 비트 [7:0]) - 제1 바이트(EVEX 바이트 0)는 포맷 필드(3040)이고, 이것은 0x62(본 개시내용의 일 실시예에서 벡터 친화적 명령어 포맷을 구분하기 위해 이용되는 고유 값)를 포함한다.
제2 내지 제4 바이트(EVEX 바이트 1-3)는 특정 능력을 제공하는 다수의 비트 필드를 포함한다.
REX 필드(3105)(EVEX 바이트 1, 비트[7-5])는 EVEX.R 비트 필드(EVEX 바이트 1, 비트 - R), EVEX.X 비트 필드(EVEX 바이트 1, 비트 - X), 및 EVEX.B 비트 필드(EVEX 바이트 1, 비트 - B)로 구성된다. EVEX.R, EVEX.X, 및 EVEX.B 비트 필드들이 대응하는 VEX 비트 필드들과 동일 기능을 제공하고 1의 보수 형태를 이용하여 인코딩되고, 즉, ZMM0은 1111B로서 인코딩되고, ZMM15는 0000B로서 인코딩된다. 명령어들의 다른 필드들은 관련 기술분야에 공지된 바와 같이 레지스터 인덱스들의 하위 3 비트를 인코딩하여(rrr, xxx, 및 bbb), EVEX.R, EVEX.X 및 EVEX.B를 추가함으로써 Rrrr, Xxxx, 및 Bbbb가 형성될 수 있도록 한다.
REX' 필드(3110) - 이것은 REX' 필드(3110)의 제1 부분이고, 확장된 32 레지스터 세트의 상위 16 또는 하위 16 중 어느 하나를 인코딩하는 데 사용되는 EVEX.R' 비트 필드(EVEX 바이트 1, 비트 [4]-R')이다. 본 개시내용의 일 실시예에서, 이 비트는, 아래에 표시되는 바와 같은 다른 것들과 함께, (잘 알려진 x86 32 비트 모드에서) BOUND 명령어와 구분하기 위해 비트 반전된 포맷으로 저장되고, 그것의 실제 오피코드 바이트는 62이지만, (후술되는) MOD R/M 필드에서 MOD 필드에서의 11의 값을 수락하지 않으며; 본 개시내용의 대안적인 실시예들은 반전된 포맷으로 이것 및 아래의 다른 표시된 비트들을 저장하지 않는다. 하위 16개의 레지스터를 인코딩하기 위해 1의 값이 이용된다. 다시 말해서, R'Rrrr는 EVEX.R', EVEX.R, 및 다른 필드들로부터의 다른 RRR를 조합시킴으로써 형성된다.
오피코드 맵 필드(3115)(EVEX 바이트 1, 비트 [3:0] - mmmm) - 이것의 내용은 암시적인 선두 오피코드 바이트(implied leading opcode byte)(0F, 0F 38, 또는 0F 3)를 인코딩한다.
데이터 성분 폭 필드(3064)(EVEX 바이트 2, 비트 [7] - W)는 표기법 EVEX.W에 의해 표현된다. EVEX.W는 데이터형(32 비트 데이터 성분 또는 64 비트 데이터 성분)의 그래뉼래리티(크기)를 정의하는 데 사용된다.
EVEX.vvvv(3120)(EVEX 바이트 2, 비트들[6:3]-vvvv) - EVEX.vvvv의 역할은 하기를 포함할 수 있다: 1) EVEX.vvvv는 반전된(1의 보수) 형태로 지정되고 2개 이상의 소스 피연산자를 갖는 명령어들에 대해 유효한 제1 소스 레지스터 피연산자를 인코딩하고; 2) EVEX.vvvv는 특정한 벡터 시프트들을 위해 1의 보수 형태로 지정된 목적지 레지스터 피연산자를 인코딩하거나; 또는 3) EVEX.vvvv는 어떤 피연산자도 인코딩하지 않고, 필드는 예약되고 1111b를 포함해야 한다. 따라서, EVEX.vvvv 필드(3120)는 반전된 (1의 보수) 형태로 저장되는 제1 소스 레지스터 지정자의 4개의 하위 비트를 인코딩한다. 명령어에 의존하여, 추가의 상이한 EVEX 비트 필드가 지정자 크기를 32개의 레지스터로 확장하기 위해 이용된다.
EVEX.U (3068) 클래스 필드(EVEX 바이트 2, 비트 -U)-EVEX.U=0인 경우, 이것은 클래스 A 또는 EVEX.U0을 나타내고; EVEX.U=1인 경우, 이것은 클래스 B 또는 EVEX.U1을 나타낸다.
프리픽스 인코딩 필드(3125)(EVEX 바이트 2, 비트 [1:0] - pp) - 베이스 연산 필드에 대한 부가적인 비트들을 제공한다. EVEX 프리픽스 포맷의 레거시 SSE 명령어들에 대한 지원을 제공하는 것에 더하여, 이것은 또한 SIMD 프리픽스를 간소화하는 이득을 갖는다(SIMD 프리픽스를 표현하기 위한 바이트를 요구하는 것이 아니라, EVEX 프리픽스는 2 비트만을 요구함). 일 실시예에서, 레거시 포맷 및 EVEX 프리픽스 포맷 양자에서 SIMD 프리픽스(66H, F2H, F3H)를 이용하는 레거시 SSE 명령어들을 지원하기 위해, 이들 레거시 SIMD 프리픽스는 SIMD 프리픽스 인코딩 필드로 인코딩되고; 런타임에서 디코더의 PLA에 제공되기 전에 레거시 SIMD 프리픽스로 확장된다(그래서, PLA는 수정 없이 레거시와 이들 레거시 명령어의 EVEX 포맷 양자를 실행할 수 있다). 더 새로운 명령어들이 오피코드 확장으로서 직접적으로 EVEX 프리픽스 인코딩 필드의 내용을 이용할 수 있지만, 특정 실시예들은 일관성을 위해 유사한 방식으로 확장되지만, 상이한 의미들이 이들 레거시 SIMD 프리픽스들에 의해 특정되는 것을 허용한다. 대안적인 실시예는 2 비트 SIMD 프리픽스 인코딩들을 지원하도록 PLA를 재설계할 수 있고, 따라서 확장을 요구하지 않는다.
알파 필드(3052)(EVEX 바이트 3, 비트 [7]-EH; 또한, EVEX.EH, EVEX.rs, EVEX.RL, EVEX.write 마스크 제어, 및 EVEX.N 으로 알려진 바와 같이; 또한 α로 예시된 바와 같이) - 이전에 설명된 바와 같이, 이 필드는 맥락 특정적이다.
베타 필드(3054)(EVEX 바이트 3, 비트 [6:4]-SSS, EVEX.s2-0, EVEX.r2-0, EVEX.rr1, EVEX.LL0, EVEX.LLB라고도 알려짐; 또한 βββ로 예시됨) - 앞서 설명된 바와 같이, 이 필드는 맥락 특정적이다.
REX' 필드(3110) - 이것은 REX' 필드의 나머지이고, 확장된 32 레지스터 세트의 상위 16 또는 하위 16 중 어느 하나를 인코딩하는 데 사용될 수 있는 EVEX.V' 비트 필드(EVEX 바이트 3, 비트 [3]-V')이다. 이 비트는 비트 반전된 포맷으로 저장된다. 하위 16개의 레지스터를 인코딩하기 위해 1의 값이 이용된다. 다시 말해서, V'VVVV는 EVEX.V', EVEX.vvvv를 조합함으로써 형성된다.
기입 마스크 필드(3070)(EVEX 바이트 3, 비트 [2:0] - kkk) - 이것의 내용은 이전에 설명되는 바와 같이 기입 마스크 레지스터들에서의 레지스터의 인덱스를 특정한다. 본 개시내용의 일 실시예에서, 특정 값 EVEX.kkk=000은 특정 명령어에 대해 어떤 기입 마스크도 이용되지 않음을 암시하는 특별한 거동을 갖는다(이것은 모든 것들에 하드와이어드된 기입 마스크 또는 마스킹 하드웨어를 바이패스하는 하드웨어의 이용을 포함하는 각종 방식들로 구현될 수 있음).
실제 오피코드 필드(3130)(바이트 4)는 또한 오피코드 바이트로서 알려진다. 오피코드의 일부는 이 필드에서 특정된다.
MOD R/M 필드(3140)(바이트 5)는 MOD 필드(3142), Reg 필드(3144), 및 R/M 필드(3146)를 포함한다. 이전에 설명한 바와 같이, MOD 필드(3142)의 내용은 메모리 액세스 연산들과 메모리 액세스 없음 연산들을 구분한다. Reg 필드(3144)의 역할은 두 가지 상황: 목적지 레지스터 피연산자 또는 소스 레지스터 피연산자 중 어느 하나를 인코딩하는 상황, 또는 오피코드 확장으로서 취급되고 임의의 명령어 피연산자를 인코딩하는 데 사용되지 않는 상황으로 요약될 수 있다. R/M 필드(3146)의 역할은 다음을 포함할 수 있다: 메모리 어드레스를 참조하는 명령어 피연산자를 인코딩하는 것 또는 목적지 레지스터 피연산자 또는 소스 레지스터 피연산자를 인코딩하는 것.
SIB(Scale, Index, Base) 바이트(바이트 6) - 전술한 바와 같이, 스케일링 필드(3050)의 내용은 메모리 어드레스 생성을 위해 사용된다. SIB.xxx(3154)와 SIB.bbb(3156) - 이들 필드의 내용은 이전에 레지스터 인덱스들 Xxxx와 Bbbb에 관해서 언급되었다.
변위 필드(3062A)(바이트 7-10) - MOD 필드(3142)가 10을 포함할 때, 바이트 7-10은 변위 필드(3062A)이고, 이것은 레거시 32 비트 변위(disp32)와 동일하게 작용하며, 바이트 그래뉼래리티로 작용한다.
변위 인자 필드(3062B)(바이트 7) - MOD 필드(3142)가 01을 포함할 때, 바이트 7은 변위 인자 필드(3062B)이다. 이 필드의 위치는 바이트 그래뉼레리티로 작용하는, 레거시 x86 명령어 세트 8 비트 변위(disp8)의 위치와 동일하다. disp8이 부호 확장되기(sign extended) 때문에, 이것은 단지 -128과 127 바이트 오프셋들 사이를 어드레싱할 수 있고; 64바이트 캐시 라인들에 관하여, disp8은 4개의 실제 유용한 값인 -128, -64, 0, 64로만 설정될 수 있는 8 비트를 이용하며; 더 큰 범위가 종종 필요하기 때문에, disp32가 이용된다; 그러나, disp32는 4바이트를 요구한다. disp8 및 disp32와는 대조적으로, 변위 인자 필드(3062B)는 disp8의 재해석이고; 변위 인자 필드(3062B)를 이용할 때, 변위 인자 필드의 내용과 메모리 피연산자 액세스의 크기(N)를 곱한 것에 의해 실제 변위가 결정된다. 이러한 타입의 변위는 disp8*N으로 지칭된다. 이것은 평균 명령어 길이를 감소시킨다(단일 바이트가 그 변위에 사용되지만 훨씬 더 큰 범위를 갖는다). 이러한 압축된 변위는, 유효 변위가 메모리 액세스의 그래뉼래리티의 배수이고, 그에 따라 어드레스 오프셋의 잉여 하위 비트들이 인코딩될 필요가 없다는 가정에 기초한다. 다시 말해, 변위 인자 필드(3062B)는 레거시 x86 명령어 세트 8 비트 변위를 대체한다. 따라서, 변위 인자 필드(3062B)는 disp8이 disp8*N으로 오버로드된다는 것만 제외하고 x86 명령어 세트 8 비트 변위와 동일한 방식으로 인코딩된다(그래서 ModRM/SIB 인코딩 규칙들에서 어떠한 것도 변하지 않는다). 다시 말하면, 인코딩 규칙들 또는 인코딩 길이들에서 어떤 변경도 존재하지 않지만, (바이트당 어드레스 오프셋(byte-wise address offset)을 획득하기 위해 메모리 피연산자의 크기에 의해 변위를 스케일링할 필요가 있는) 하드웨어에 의한 변위 값의 해석에서만 변경이 존재한다. 즉치 필드(3072)는 이전에 설명되는 바와 같이 작동한다.
풀 오피코드 필드
도 31b는 본 개시내용의 일 실시예에 따른, 풀 오피코드 필드(3074)를 구성하는 특정의 벡터 친화적 명령어 포맷(3100)의 필드들을 예시하는 블록도이다. 구체적으로, 풀 오피코드 필드(3074)는 포맷 필드(3040), 베이스 연산 필드(3042), 및 데이터 성분 폭(W) 필드(3064)를 포함한다. 베이스 연산 필드(3042)는 프리픽스 인코딩 필드(3125), 오피코드 맵 필드(3115), 및 실제 오피코드 필드(3130)를 포함한다.
레지스터 인덱스 필드
도 31c는 본 개시내용의 일 실시예에 따른 레지스터 인덱스 필드(3044)를 구성하는 특정 벡터 친화적 명령어 포맷(3100)의 필드들을 예시하는 블록도이다. 구체적으로, 레지스터 인덱스 필드(3044)는 REX 필드(3105), REX' 필드(3110), MODR/M.reg 필드(3144), MODR/M.r/m 필드(3146), VVVV 필드(3120), xxx 필드(3154), 및 bbb 필드(3156)를 포함한다.
증강 연산 필드
도 31d는 본 개시내용의 일 실시예에 따른 증강 연산 필드(3050)를 구성하는 특정 벡터 친화적 명령어 포맷(3100)의 필드들을 예시하는 블록도이다. 클래스(U) 필드(3068)가 0을 포함할 때, 이는 EVEX.U0(클래스 A 3068A)을 나타내고(signify); 이것이 1을 포함할 때, 이는 EVEX.U1(클래스 B 3068B)을 나타낸다. U= 0이고 MOD 필드(3142)가 11을 포함할 때(메모리 액세스 없음 연산을 나타냄), 알파 필드(3052)(EVEX 바이트 3, 비트 [7] - EH)는 rs 필드(3052A)로서 해석된다. rs 필드(3052A)가 1을 포함할 때(라운드(3052A.1)), 베타 필드(3054)(EVEX 바이트 3, 비트 [6:4] - SSS)는 라운드 제어 필드(3054A)로서 해석된다. 라운드 제어 필드(3054A)는 1 비트 SAE 필드(3056) 및 2 비트 라운드 연산 필드(3058)를 포함한다. rs 필드(3052A)가 0을 포함할 때(데이터 변환(3052A.2)), 베타 필드(3054)(EVEX 바이트 3, 비트 [6:4] - SSS)는 3 비트 데이터 변환 필드(3054B)로서 해석된다. U= 0이고 MOD 필드(3142)가 00, 01, 또는 10을 포함할 때(메모리 액세스 연산을 나타냄), 알파 필드(3052)(EVEX 바이트 3, 비트 [7] - EH)는 축출 힌트(EH) 필드(3052B)로서 해석되고, 베타 필드(3054)(EVEX 바이트 3, 비트들[6:4]-SSS)는 3 비트 데이터 조작 필드(3054C)로서 해석된다.
U= 1일 때, 알파 필드(3052)(EVEX 바이트 3, 비트 [7] - EH)는 기입 마스크 제어(Z) 필드(3052C)로서 해석된다. U=1이고 MOD 필드(3142)가 11을 포함할 때(메모리 액세스 없음 연산을 나타냄), 베타 필드(3054)(EVEX 바이트 3, 비트 [4] - S0)의 일부는 RL 필드(3057A)로서 해석된다; 이것이 1(라운드 3057A.1)을 포함할 때, 베타 필드(3054)의 나머지(EVEX 바이트 3, 비트 [6-5]-S2-1)가 라운드 연산 필드(3059A)로서 해석되는 한편, RL(3057A) 필드가 0(VSIZE 3057.A2)을 포함할 때, 베타 필드(3054)의 나머지(EVEX 바이트 3, 비트 [6-5]- S2-1)는 벡터 길이 필드(3059B)(EVEX 바이트 3, 비트 [6-5]- L1-0)로서 해석된다. U=1이고 MOD 필드(3142)가 00, 01, 또는 10을 포함하면(메모리 액세스 연산을 나타냄), 베타 필드(3054)(EVEX 바이트 3, 비트 [6:4] - SSS)는 벡터 길이 필드(3059B)(EVEX 바이트 3, 비트 [6-5] - L1-0) 및 브로드캐스트 필드(3057B)(EVEX 바이트 3, 비트 [4] - B)로서 해석된다.
예시적인 레지스터 아키텍처
도 32는 본 개시내용의 일 실시예에 따른 레지스터 아키텍처(3200)의 블록도이다. 예시된 실시예에서, 512 비트 폭을 갖는 32 벡터 레지스터들(3210)이 있다; 이들 레지스터는 zmm0 내지 zmm31로서 참조된다. 하위 16개의 zmm 레지스터의 하위 256 비트는 레지스터들 ymm0-16상에 오버레이된다. 하위 16개의 zmm 레지스터의 하위 128 비트(ymm 레지스터들의 하위 128 비트)는 레지스터들 xmm0-15상에 오버레이된다. 특정 벡터 친화적 명령어 포맷(3100)은 아래 표에 예시된 바와 같이 이들 오버레이된 레지스터 파일에 대해 연산한다.
Figure pat00025
달리 말하면, 벡터 길이 필드(3059B)는 최대 길이와 하나 이상의 다른 더 짧은 길이 중에서 선택하고, 여기서 각각의 그런 더 짧은 길이는 선행하는 길이의 1/2 길이이며; 벡터 길이 필드(3059B)를 갖지 않은 명령어 템플릿들은 최대 벡터 길이에 대해 연산한다. 또한, 일 실시예에서, 특정 벡터 친화적 명령어 포맷(3100)의 클래스 B 명령어 템플릿들은 패킹된 또는 스칼라 단일/배정도 부동 소수점 데이터 및 패킹된 또는 스칼라 정수 데이터에 대해 연산한다. 스칼라 연산들은 zmm/ymm/xmm 레지스터 내의 최하위 데이터 성분 위치에 대해 수행되는 연산들이고; 상위 데이터 성분 위치들은 실시예에 의존하여 명령어 이전에 이들이 있었던 것과 동일하게 남겨지거나 또는 제로로 된다. 기입 마스크 레지스터들(3215) - 예시된 실시예에서, 8개의 기입 마스크 레지스터(k0 내지 k7)가 있고, 각각은 크기가 64 비트이다. 대안적 실시예에서, 기입 마스크 레지스터들(3215)은 그 크기가 16 비트이다. 이전에 설명된 바와 같이, 본 개시내용의 일 실시예에서, 벡터 마스크 레지스터 k0은 기입 마스크로서 이용될 수 없고; 통상적으로 k0을 나타내는 인코딩이 기입 마스크에 대해 이용될 때, 이것은 0xFFFF의 하드와이어드 기입 마스크(hardwired write mask)를 선택하여, 해당 명령어에 대한 기입 마스킹을 효과적으로 디스에이블한다.
범용 레지스터들(3225) - 예시된 실시예에서, 메모리 피연산자들을 어드레싱하기 위해 기존의 x86 어드레싱 모드들과 함께 이용되는 16개의 64 비트 범용 레지스터가 있다. 이들 레지스터는 RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, 및 R8 내지 R15라는 이름들로 참조된다.
MMX 패킹된 정수 플랫 레지스터 파일(3250)이 그 상에서 에일리어싱(aliasing)되는 스칼라 부동 소수점 스택 레지스터 파일(x87 스택)(3245) - 예시된 실시예에서, x87 스택은 x87 명령어 세트 확장을 사용하여 32/64/80 비트 부동 소수점 데이터에 대해 스칼라 부동 소수점 연산들을 실행하는데 사용되는 8 성분 스택인 한편; MMX 레지스터들은 64 비트 패킹된 정수 데이터에 대한 연산들을 실행할 뿐만 아니라 MMX 레지스터와 XMM 레지스터 사이에 실행되는 몇몇 연산들에 대해 피연산자들을 보유하는 데에 사용된다.
본 개시내용의 대안적인 실시예들은 더 넓거나 더 좁은 레지스터들을 이용할 수 있다. 추가적으로, 본 개시내용의 대안적인 실시예들은 더 많거나, 더 적거나, 또는 상이한 레지스터 파일들 및 레지스터들을 이용할 수 있다.
예시적인 코어 아키텍처, 프로세서, 및 컴퓨터 아키텍처
프로세서 코어들은 상이한 방식들로, 상이한 목적들을 위해, 그리고 상이한 프로세서들에서 구현될 수 있다. 예를 들어, 이러한 코어들의 구현들은 1) 범용 컴퓨팅을 위해 의도된 범용 순차적 코어; 2) 범용 컴퓨팅을 위해 의도된 고성능 범용 비순차적 코어; 3) 주로 그래픽 및/또는 과학(스루풋) 컴퓨팅을 위해 의도된 특수 목적 코어를 포함할 수 있다. 상이한 프로세서들의 구현들은 다음을 포함할 수 있다: 1) 범용 컴퓨팅을 위해 의도된 하나 이상의 범용 순차적 코어 및/또는 범용 컴퓨팅을 위해 의도된 하나 이상의 범용 비순차적 코어를 포함하는 CPU; 및 2) 주로 그래픽 및/또는 과학(스루풋)을 위해 의도된 하나 이상의 특수 목적 코어를 포함하는 코프로세서를 포함할 수 있다. 그러한 상이한 프로세서들은 상이한 컴퓨터 시스템 아키텍처들로 인도하는데, 이것은: 1) CPU와는 별개의 칩상의 코프로세서; 2) CPU와 동일한 패키지에서 별개의 다이상의 코프로세서; 3) CPU와 동일한 다이상의 코프로세서(이 경우에, 그러한 프로세서는 때때로 통합된 그래픽 및/또는 과학(스루풋) 로직, 또는 특수 목적 코어들과 같은 특수 목적 로직이라고 지칭된다); 4) 동일한 다이상에 설명된 CPU(때때로 애플리케이션 코어(들) 또는 애플리케이션 프로세서(들)로 지칭됨), 앞서 설명된 코프로세서, 및 추가 기능성을 포함할 수 있는 SoC(system on a chip)을 포함할 수 있다. 예시적인 코어 아키텍처들이 다음에 설명되고, 이어서 예시적인 프로세서들 및 컴퓨터 아키텍처들이 설명된다.
예시적인 코어 아키텍처들
순차적 및 비순차적 코어 블록도
도 33a는 본 개시내용의 실시예들에 따른 예시적인 순차적 파이프라인 및 예시적인 레지스터 리네이밍, 비순차적 발행/실행 파이프라인의 둘 모두를 도시하는 블록도이다. 도 33b는 본 개시내용의 실시예들에 따른 프로세서에 포함될 순차적 아키텍처 코어의 예시적인 실시예 및 예시적인 레지스터 리네이밍, 비순차적 발행/실행 아키텍처 코어의 둘 모두를 도시하는 블록도이다. 도 33a 및 도 33b의 실선 박스들은 순차적 파이프라인 및 순차적 코어를 예시하는 한편, 파선 박스들의 선택적 추가는 레지스터 리네이밍, 비순차적 발행/실행 파이프라인 및 코어를 예시한다. 순차적 양태가 비순차적 양태의 서브세트라는 점을 고려하여, 비순차적 양태가 설명될 것이다.
도 33a에서, 프로세서 파이프라인(3300)은 페치 스테이지(3302), 길이 디코딩 스테이지(3304), 디코딩 스테이지(3306), 할당 스테이지(3308), 리네이밍 스테이지(3310), 스케줄링(디스패치 또는 발행으로도 알려짐) 스테이지(3312), 레지스터 판독/메모리 판독 스테이지(3314), 실행 스테이지(3316), 라이트백/메모리 기입 스테이지(3318), 예외 핸들링 스테이지(3322), 및 커밋 스테이지(3324)를 포함한다.
도 33b는 실행 엔진 유닛(3350)에 결합된 프론트 엔드 유닛(3330)을 포함하는 프로세서 코어(3390)를 도시하고, 양자 모두는 메모리 유닛(3370)에 결합되어 있다. 코어(3390)는 RISC(reduced instruction set computing) 코어, CISC(complex instruction set computing) 코어, VLIW(very long instruction word) 코어, 또는 하이브리드 또는 대안의 코어 타입일 수 있다. 또 다른 옵션으로서, 코어(3390)는 예를 들어, 네트워크 또는 통신 코어, 압축 엔진, 코프로세서 코어, GPGPU(general purpose computing graphics processing unit) 코어, 그래픽 코어, 또는 그와 유사한 것과 같은 특수 목적 코어일 수 있다.
프론트 엔드 유닛(3330)은 디코딩 유닛(3340)에 결합되는 명령어 페치 유닛(3338)에 결합되는 명령어 TLB(translation lookaside buffer)(3336)에 결합되는 명령어 캐시 유닛(3334)에 결합되는 분기 예측 유닛(3332)을 포함한다. 디코딩 유닛(3340)(예를 들어, 디코딩 회로)은 명령어들(예를 들어, 매크로 명령어들)을 디코딩할 수 있고, 출력으로서 하나 이상의 마이크로 연산들, 마이크로 코드 엔트리 포인트들, 마이크로 명령어들, 다른 명령어들, 또는 다른 제어 신호들을 생성할 수 있고, 이들은 원래의 명령어들로부터 디코딩되거나, 또는 다른 방식으로 원래의 명령어들을 반영하거나, 또는 원래의 명령어들로부터 도출된다. 디코딩 유닛(3340)은 다양한 상이한 메커니즘들을 이용하여 구현될 수 있다. 적합한 메커니즘들의 예들은 룩업 테이블, 하드웨어 구현, PLA(programmable logic array)들, 마이크로코드 ROM(read only memory)들 등을 포함하지만 이에 한정되지는 않는다. 일 실시예에서, 코어(3390)는 (예를 들어, 디코드 유닛(3340)에서 또는 다른 방식으로 프론트 엔드 유닛(3330) 내에) 특정 매크로 명령어들을 위한 마이크로코드를 저장하는 마이크로코드 ROM 또는 다른 매체를 포함한다. 디코딩 유닛(3340)은 실행 엔진 유닛(3350)에서의 리네임/할당기 유닛(3352)에 결합된다.
실행 엔진 유닛(3350)은, 하나 이상의 스케줄러 유닛(들)(3356)의 세트 및 리타이어먼트 유닛(3354)에 결합된 리네임/할당자 유닛(3352)을 포함한다. 스케줄러 유닛(들)(3356)은 예약 스테이션들, 중앙 명령어 윈도우 등을 포함하는 임의의 수의 상이한 스케줄러들을 나타낸다. 스케줄러 유닛(들)(3356)은 물리적 레지스터 파일(들) 유닛(들)(3358)에 결합된다. 물리적 레지스터 파일(들)(3358) 각각은 하나 이상의 물리적 레지스터 파일들을 나타내고, 이들 중 상이한 물리적 레지스터 파일들은 스칼라 정수, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점, 상태(예를 들어, 실행될 다음 명령어의 어드레스인 명령어 포인터), 타일들 등과 같은 하나 이상의 상이한 데이터 타입을 저장한다. 일 실시예에서, 물리적 레지스터 파일(들) 유닛(3358)은 벡터 레지스터 유닛, 기입 마스크 레지스터 유닛, 및 스칼라 레지스터 유닛을 포함한다. 이들 레지스터 유닛은 아키텍처적 벡터 레지스터들, 벡터 마스크 레지스터들, 및 범용 레지스터들을 제공할 수 있다. 물리적 레지스터 파일(들) 유닛(들)(3358)은 레지스터 리네이밍 및 비순차적 실행이 (예를 들어, 리오더 버퍼(들) 및 리타이어먼트 레지스터 파일(들)을 이용하여; 장래 파일(들), 이력 버퍼(들), 및 리타이어먼트 레지스터 파일(들)을 이용하여; 레지스터 맵들 및 레지스터들의 풀을 이용하는 등으로) 구현될 수 있는 다양한 방식을 예시하기 위해 리타이어먼트 회로(3354)에 의해 오버랩된다. 리타이어먼트 유닛(3354) 및 물리적 레지스터 파일(들) 유닛(들)(3358)은 실행 클러스터(들)(3360)에 결합된다. 실행 클러스터(들)(3360)는 하나 이상의 실행 유닛(3362)(예를 들어, 실행 회로들)의 세트 및 하나 이상의 메모리 액세스 유닛(3364)의 세트를 포함한다. 실행 유닛들(3362)은 다양한 타입의 데이터(예를 들어, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점)에 대해 다양한 연산들(예를 들어, 시프트, 덧셈, 뺄셈, 곱셈)을 수행할 수 있다. 일부 실시예들은 특정 기능들이나 기능들의 세트들에 전용되는 다수의 실행 유닛을 포함할 수 있지만, 다른 실시예들은 단 하나의 실행 유닛 또는 모두가 모든 기능들을 수행하는 다중 실행 유닛을 포함할 수 있다. 스케줄러 유닛(들)(3356), 물리적 레지스터 파일(들) 유닛(들)(3358), 및 실행 클러스터(들)(3360)는 가능하게는 복수인 것으로 도시되는데, 그 이유는 소정 실시예들은 소정 타입들의 데이터/연산들에 대해 개별 파이프라인들(예를 들어, 스칼라 정수 파이프라인, 스칼라 부동 소수점/패킹된 정수/패킹된 부동 소수점/벡터 정수/벡터 부동 소수점 파이프라인, 및/또는 각각이 자신의 스케줄러 유닛, 물리적 레지스터 파일(들) 유닛, 및/또는 실행 클러스터를 갖는 메모리 액세스 파이프라인- 개별 메모리 액세스 파이프라인의 경우에, 이러한 파이프라인의 실행 클러스터만이 메모리 액세스 유닛(들)(3364)을 갖는 특정 실시예들이 구현됨)을 생성할 수 있기 때문이다. 별개의 파이프라인들이 사용되는 경우, 이 파이프라인들 중 하나 이상은 비순차적 발행/실행일 수 있고 나머지는 순차적일 수 있다는 점도 이해해야 한다.
메모리 액세스 유닛들(3364)의 세트는 메모리 유닛(3370)에 결합되고, 이 메모리 유닛은 레벨 2(L2) 캐시 유닛(3376)에 결합되는 데이터 캐시 유닛(3374)에 결합되는 데이터 TLB 유닛(3372)을 포함한다. 하나의 예시적인 실시예에서, 메모리 액세스 유닛들(3364)은 로드 유닛(load unit), 스토어 어드레스 유닛(store address unit), 및 스토어 데이터 유닛(store data unit)을 포함할 수 있으며, 이들 각각은 메모리 유닛(3370)에서의 데이터 TLB 유닛(3372)에 결합된다. 명령어 캐시 유닛(3334)은 메모리 유닛(3370)에서의 레벨 2(L2) 캐시 유닛(3376)에 또한 결합된다. L2 캐시 유닛(3376)은 하나 이상의 다른 레벨의 캐시에 및 최종적으로 메인 메모리에 결합된다.
예를 들어, 예시적인 레지스터 리네이밍, 비순차적 발행/실행 코어 아키텍처는 다음과 같이 파이프라인(3300)을 구현할 수 있다: 1) 명령어 페치(3338)가 페치 및 길이 디코딩 스테이지들(3302 및 3304)를 수행한다; 2) 디코딩 유닛(3340)이 디코딩 스테이지(3306)을 수행한다; 3) 리네임/할당기 유닛(3352)이 할당 스테이지(3308) 및 리네이밍 스테이지(3310)를 수행한다; 4) 스케줄러 유닛(들)(3356)이 스케줄 스테이지(3312)를 수행한다; 5) 물리적 레지스터 파일(들) 유닛(들)(3358) 및 메모리 유닛(3370)이 레지스터 판독/메모리 판독 스테이지(3314)를 수행한다; 실행 클러스터(3360)가 실행 스테이지(3316)를 수행한다; 6) 메모리 유닛(3370) 및 물리적 레지스터 파일(들) 유닛(들)(3358)이 라이트백/메모리 기입 스테이지(3318)을 수행한다; 7) 다양한 유닛들이 예외 핸들링 스테이지(3322)에 관련될 수 있다; 및 8) 리타이어먼트 유닛(3354) 및 물리적 레지스터 파일(들) 유닛(들)(3358)이 커밋 스테이지(3324)를 수행한다.
코어(3390)는 본 명세서에 설명된 명령어(들)을 포함하여, 하나 이상의 명령어 세트(예를 들어, 새로운 버전이 추가된 일부 확장을 갖는 x86 명령어 세트); 캘리포니아, 서니베일의 MIPS Technologies사의 MIPS 명령어 세트; 캘리포니아, 서니베일의 ARM Holdings의 (NEON과 같은 선택적 추가적 확장을 갖는) ARM 명령어 세트를 지원할 수 있다. 일 실시예에서, 코어(3390)는 패킹된 데이터 명령어 세트 확장(예를 들어, AVX1, AVX2)을 지원하는 로직을 포함하며, 그에 의해 많은 멀티미디어 애플리케이션들에 의해 이용되는 연산들이 패킹된 데이터를 이용하여 수행되는 것을 허용한다.
코어가 (연산들 또는 스레드들의 2개 이상의 병렬 세트를 실행하는) 멀티스레딩을 지원할 수 있고, 또한 시간 슬라이싱된 멀티스레딩, 동시 멀티스레딩(이 경우 단일 물리적 코어가 물리적 코어가 동시에 멀티스레딩하는 각각의 스레드들에게 논리적 코어를 제공함), 또는 이들의 조합(예를 들어, Intel® Hyper-Threading technology에서와 같은 시간 슬라이싱된 페칭 및 디코딩 및 그 후의 동시 멀티스레딩)을 포함하는 다양한 방식으로 그렇게 할 수 있음을 이해해야 한다.
레지스터 리네이밍이 비순차적 실행의 맥락에서 설명되었지만, 레지스터 리네이밍은 순차적 아키텍처에서 사용될 수 있다는 점을 이해해야 한다. 프로세서의 예시된 실시예가 또한 개별적인 명령어 및 데이터 캐시 유닛들(3334/3374) 및 공유 L2 캐시 유닛(3376)을 포함하고 있지만, 대안적 실시예들은, 예를 들어 레벨 1(L1) 내부 캐시, 또는 다수의 레벨의 내부 캐시와 같은, 명령어들 및 데이터 둘 다에 대한 단일의 내부 캐시를 가질 수 있다. 일부 실시예들에서, 시스템은 내부 캐시와, 코어 및/또는 프로세서에 대해 외부에 있는 외부 캐시의 조합을 포함할 수 있다. 대안적으로, 모든 캐시는 코어 및/또는 프로세서에 대해 외부에 있을 수 있다.
구체적인 예시적 순차적 코어 아키텍처
도 34a 및 도 34b는 더 특정적이고 예시적인 순차적 코어 아키텍처의 블록도를 예시하는데, 이 코어는 칩 내의 (동일 타입 및/또는 상이한 타입들의 다른 코어들을 포함하는) 여러 개의 로직 블록 중 하나일 것이다. 로직 블록들은, 애플리케이션에 의존하여, 일부 고정된 기능 로직, 메모리 I/O 인터페이스들, 및 다른 필요한 I/O 로직을 갖는 고 대역폭 인터커넥트 네트워크(예를 들어, 링 네트워크)를 통해 통신한다.
도 34a는, 본 개시내용의 실시예들에 따라, 단일 프로세서 코어를, 온-다이 인터커넥트 네트워크(3402)로의 그의 접속 및 레벨 2(L2) 캐시의 그의 로컬 서브세트(3404)와 함께 나타낸 블록도이다. 일 실시예에서, 명령어 디코더 유닛(3400)이 패킹된 데이터 명령어 세트 확장을 갖는 x86 명령어 세트를 지원한다. L1 캐시(3406)는 캐시 메모리의 스칼라 및 벡터 유닛들로의 저 레이턴시 액세스들을 허용한다. (설계를 단순화하기 위해) 일 실시예에서, 스칼라 유닛(3408) 및 벡터 유닛(3410)은 별개의 레지스터 세트들(제각기 스칼라 레지스터들(3412) 및 벡터 레지스터들(3414))을 이용하고, 이들 사이에 전달되는 데이터는 메모리에 기입된 다음, 레벨 1(L1) 캐시(3406)로부터 되돌려 판독되지만, 본 개시내용의 대안적인 실시예들은 상이한 접근법을 이용할 수 있다(예를 들어, 단일의 레지스터 세트를 이용하거나, 또는 기입 및 되돌려 판독되지 않고 2개의 레지스터 파일 사이에서 데이터가 전달되는 것을 허용하는 통신 경로를 포함함).
L2 캐시의 로컬 서브세트(3404)는, 프로세서 코어 당 하나씩인 별개의 로컬 서브세트들로 분할되는 글로벌 L2 캐시의 일부이다. 각각의 프로세서 코어는 L2 캐시의 그 자신의 로컬 서브세트(3404)에 대한 직접 액세스 경로를 갖는다. 프로세서 코어에 의해 판독되는 데이터는 그 L2 캐시 서브세트(3404)에 저장되며, 다른 프로세서 코어들이 그들 자신의 로컬 L2 캐시 서브세트들에 액세스하는 것과 병렬로 빠르게 액세스될 수 있다. 프로세서 코어에 의해 기입되는 데이터는 그 자신의 L2 캐시 서브세트(3404)에 저장되고, 필요한 경우 다른 서브세트들로부터 플러싱된다. 링 네트워크는 공유 데이터에 대한 코히어런시를 보장한다. 링 네트워크는 양방향성이어서, 프로세서 코어들, L2 캐시들 및 다른 로직 블록들과 같은 에이전트들이 칩 내에서 서로 통신하는 것을 허용한다. 각각의 링 데이터 경로는 방향당 1012 비트 폭이다.
도 34b는 본 개시내용의 실시예들에 따른 도 34a의 프로세서 코어의 일부의 확대도이다. 도 34b는 L1 캐시(3406)의 L1 데이터 캐시(3406A) 부분은 물론, 벡터 유닛(3410) 및 벡터 레지스터들(3414)에 관한 더 상세한 사항을 포함한다. 구체적으로, 벡터 유닛(3410)은 16-폭 벡터 처리 유닛(VPU)(16-폭 ALU(3428) 참조하라)이고, 이는 정수, 단정도 부동 소수점 및 배정도 부동 소수점 명령어들 중 하나 이상을 실행한다.
VPU는 스위즐 유닛(swizzle unit)(3420)에 의한 레지스터 입력들의 스위즐링, 수치 변환 유닛들(3422A-B)에 의한 수치 변환, 및 메모리 입력에 대한 복제 유닛(3424)을 이용하는 복제를 지원한다. 기입 마스크 레지스터들(3426)은 결과적인 벡터 기입들(resulting vector writes)을 서술(predicating)하는 것을 허용한다.
도 35는 본 개시내용의 실시예들에 따라, 둘 이상의 코어를 가질 수 있고, 통합 메모리 제어기를 가질 수 있고, 통합 그래픽을 가질 수 있는 프로세서(3500)의 블록도이다. 도 35의 실선 박스들은 단일 코어(3502A), 시스템 에이전트(3510), 하나 이상의 버스 제어기 유닛들(3516)의 세트를 갖는 프로세서(3500)를 도시하는 한편, 파선 박스들의 선택적 추가는 다수의 코어들(3502A-N), 시스템 에이전트 유닛(3510) 내의 하나 이상의 통합 메모리 제어기 유닛(들)(3514)의 세트, 및 특수 목적 로직(3508)을 갖는 대안 프로세서(3500)를 예시한다.
따라서, 프로세서(3500)의 상이한 구현은 다음을 포함할 수 있다: 1) 통합된 그래픽 및/또는 과학(스루풋) 로직(이것은 하나 이상의 코어를 포함할 수 있음)인 특수 목적 로직(3508)을 구비한 CPU, 및 하나 이상의 범용 코어들(예를 들어, 범용 순차적 코어들, 범용 비순차적 코어들, 이 둘의 조합)인 코어들(3502A-N); 2) 그래픽 및/또는 과학(스루풋)을 위해 주로 의도된 수많은 수의 특수 목적 코어들인 코어들(3502A-N)을 구비한 코프로세서; 및 3) 수많은 범용 순차적 코어들인 코어들(3502A-N)을 구비한 코프로세서. 따라서, 프로세서(3500)는 범용 프로세서와, 예를 들어 네트워크 또는 통신 프로세서, 압축 엔진, 그래픽 프로세서, GPGPU(general purpose graphics processing unit), 고-스루풋 MIC(many integrated core) 코프로세서(30개 이상의 코어를 포함함), 임베디드 프로세서, 또는 그와 유사한 것과 같은 코프로세서 또는 특수 목적 프로세서일 수 있다. 프로세서는 하나 이상의 칩상에 구현될 수 있다. 프로세서(3500)는, 예를 들어 BiCMOS, CMOS, 또는 NMOS와 같은 다수의 공정 기술 중 임의의 것을 사용하여 하나 이상의 기판상에 구현될 수 있고/있거나 그 일부일 수 있다.
메모리 계층구조는, 코어들 내의 하나 이상의 레벨의 캐시, 하나 이상의 공유 캐시 유닛(3506)의 세트, 및 통합 메모리 제어기 유닛들(3514)의 세트에 결합된 외부 메모리(도시되지 않음)를 포함한다. 공유 캐시 유닛들(3506)의 세트는 레벨 2(L2), 레벨 3(L3), 레벨 4(L4), 또는 다른 레벨들의 캐시와 같은 하나 이상의 중간 레벨 캐시, 최종 레벨 캐시(LLC)(last level cache), 및/또는 이들의 조합을 포함할 수 있다. 일 실시예에서 링 기반 인터커넥트 유닛(3512)은 통합 그래픽 로직(3508), 공유 캐시 유닛들(3506)의 세트, 및 시스템 에이전트 유닛(3510)/통합 메모리 제어기 유닛(들)(3514)을 상호접속하지만, 대안적인 실시예들은 이러한 유닛들을 상호접속하기 위해 임의의 수의 공지된 기술을 사용할 수 있다. 일 실시예에서, 하나 이상의 캐시 유닛(3506)과 코어들(3502A-N) 사이에 코히어런시가 유지된다.
일부 실시예들에서, 코어들(3502A-N) 중 하나 이상은 멀티스레딩이 가능하다. 시스템 에이전트(3510)는 코어들(3502A-N)을 조정하고 동작시키는 컴포넌트들을 포함한다. 시스템 에이전트 유닛(3510)은, 예를 들어 전력 제어 유닛(power control unit, PCU) 및 디스플레이 유닛을 포함할 수 있다. PCU는 코어들(3502A-N) 및 통합 그래픽 로직(3508)의 전력 상태를 조절하는데 필요한 로직 및 컴포넌트들이거나 이들을 포함할 수 있다. 디스플레이 유닛은 하나 이상의 외부 접속된 디스플레이들을 구동하기 위한 것이다.
코어들(3502A-N)은 아키텍처 명령어 세트의 관점에서 동종 또는 이종일 수 있는데; 즉 코어들(3502A-N) 중 둘 이상은 동일 명령어 세트를 실행할 수 있는 반면, 다른 코어들은 해당 명령어 세트의 서브세트만을 또는 상이한 명령어 세트를 실행할 수 있다.
예시적인 컴퓨터 아키텍처들
도 36 내지 도 39는 예시적인 컴퓨터 아키텍처들의 블록도들이다. 랩톱들, 데스크톱들, 핸드헬드 PC들, 퍼스널 디지털 어시스턴트들, 엔지니어링 워크스테이션들, 서버들, 네트워크 디바이스들, 네트워크 허브들, 스위치들, 임베디드 프로세서들, DSP들(digital signal processors), 그래픽 디바이스들, 비디오 게임 디바이스들, 셋톱 박스들, 마이크로 제어기들, 휴대 전화들, 휴대용 미디어 플레이어들, 핸드헬드 디바이스들, 및 다양한 다른 전자 디바이스들에 대해 본 기술분야에 알려진 다른 시스템 설계들 및 구성들이 또한 적합하다. 일반적으로, 본 명세서에 개시되는 바와 같은 프로세서 및/또는 다른 실행 로직을 통합할 수 있는 매우 다양한 시스템들 또는 전자 디바이스들이 일반적으로 적합하다.
이제 도 36을 참조하면, 본 개시내용의 일 실시예에 따른 시스템(3600)의 블록도가 도시되어 있다. 시스템(3600)은 제어기 허브(3620)에 결합되는 하나 이상의 프로세서(3610, 3615)를 포함할 수 있다. 일 실시예에서, 제어기 허브(3620)는 그래픽 메모리 제어기 허브(GMCH)(3690) 및 입력/출력 허브(IOH)(3650)(이는 별개의 칩들상에 있을 수 있음)를 포함하고; GMCH(3690)는 메모리(3640) 및 코프로세서(3645)가 그에 결합되는 메모리 및 그래픽 제어기들을 포함하고; IOH(3650)는 GMCH(3690)에 입력/출력(I/O) 디바이스들(3660)을 결합한다. 대안적으로, 메모리 및 그래픽 제어기들 중 하나 또는 모두는 (본 명세서에서 설명되는 바와 같이) 프로세서 내에 통합되고, 메모리(3640) 및 코프로세서(3645)는 프로세서(3610), 및 IOH(3650)와 단일 칩 내에 있는 제어기 허브(3620)에 직접 결합된다. 메모리(3640)는, 예를 들어, 실행될 때 프로세서로 하여금 본 개시내용의 임의의 방법을 수행하게 야기하는 코드를 저장하는 행렬 가속 코드(3640A)를 포함할 수 있다.
추가 프로세서들(3615)의 선택적 성질은 도 36에서 파선들로 표시된다. 각각의 프로세서(3610, 3615)는 본 명세서에 설명된 처리 코어들 중 하나 이상을 포함할 수 있고, 프로세서(3500)의 일부 버전일 수 있다.
메모리(3640)는, 예를 들어, DRAM(dynamic random access memory), PCM(phase change memory), 또는 이 둘의 조합일 수 있다. 적어도 일 실시예에서, 제어기 허브(3620)는 프론트사이드 버스(FSB)와 같은 멀티 드롭 버스, QPI(QuickPath Interconnect)와 같은 포인트-투-포인트 인터페이스, 또는 유사한 접속(3695)을 통해 프로세서(들)(3610, 3615)와 통신한다.
일 실시예에서, 코프로세서(3645)는, 예를 들어 고-스루풋 MIC 프로세서, 네트워크 또는 통신 프로세서, 압축 엔진, 그래픽 프로세서, GPGPU, 임베디드 프로세서 등과 같은 특수 목적 프로세서이다. 일 실시예에서, 제어기 허브(3620)는 통합 그래픽 가속기를 포함할 수 있다.
아키텍처적, 마이크로아키텍처적, 열적, 전력 소비 특성들, 및 그와 유사한 것을 포함하는 장점 판단 기준들의 범위를 두고 볼 때 물리적 리소스들(3610, 3615) 사이에는 다양한 차이가 있을 수 있다.
일 실시예에서, 프로세서(3610)는 일반 타입의 데이터 처리 동작들을 제어하는 명령어들을 실행한다. 명령어들 내에는 코프로세서 명령어들이 임베디드될 수 있다. 프로세서(3610)는 부속된 코프로세서(3645)에 의해 실행되어야 하는 유형인 것으로서 이들 코프로세서 명령어를 인식한다. 따라서, 프로세서(3610)는 코프로세서(3645)에, 코프로세서 버스 또는 다른 인터커넥트를 통해 이들 코프로세서 명령어(또는 코프로세서 명령어들을 나타내는 제어 신호들)을 발행한다. 코프로세서(들)(3645)는 수신된 코프로세서 명령어들을 수락하고 실행한다.
이제 도 37을 참조하면, 본 개시내용의 실시예에 따른 제1의 더 구체적인 예시적인 시스템(3700)의 블록도가 도시되어 있다. 도 37에 도시된 바와 같이, 멀티 프로세서 시스템(3700)은 포인트-투-포인트 인터커넥트 시스템이고, 포인트-투-포인트 인터커넥트(3750)를 통해 결합된 제1 프로세서(3770) 및 제2 프로세서(3780)를 포함한다. 프로세서들(3770 및 3780) 각각은 프로세서(3500)의 일부 버전일 수 있다. 본 개시내용의 일 실시예에서, 프로세서들(3770 및 3780)은 제각기 프로세서들(3610 및 3615)인 한편, 코프로세서(3738)는 코프로세서(3645)이다. 또 다른 실시예에서, 프로세서들(3770 및 3780)은 제각기 프로세서(3610) 코프로세서(3645)이다.
프로세서들(3770 및 3780)은 제각기 IMC(integrated memory controller) 유닛들(3772 및 3782)을 포함하는 것으로 도시되어 있다. 프로세서(3770)는 또한 그의 버스 제어기 유닛들의 일부로서 포인트-투-포인트(P-P) 인터페이스들(3776, 3778)을 포함하며; 유사하게 제2 프로세서(3780)는 P-P 인터페이스들(3786, 3788)을 포함한다. 프로세서들(3770, 3780)은 P-P 인터페이스 회로들(3778, 3788)을 이용하여 포인트-투-포인트(P-P) 인터페이스(3750)를 통해 정보를 교환할 수 있다. 도 37에 도시된 바와 같이, IMC들(3772 및 3782)은 프로세서들을 제각기 메모리들, 즉 메모리(3732) 및 메모리(3734)에 결합하는데, 이들은 제각기 프로세서들에 로컬로 소속되는 메인 메모리의 부분들일 수 있다.
프로세서들(3770, 3780)은 각각 포인트-투-포인트 인터페이스 회로들(3776, 3794, 3786, 3798)을 이용하여 개별 P-P 인터페이스들(3752, 3754)을 통해 칩셋(3790)과 정보를 교환할 수 있다. 칩셋(3790)은 선택적으로 고성능 인터페이스(3739)를 통해 코프로세서(3738)와 정보를 교환할 수 있다. 일 실시예에서, 코프로세서(3738)는, 예를 들어 고-스루풋 MIC 프로세서, 네트워크 또는 통신 프로세서, 압축 엔진, 그래픽 프로세서, GPGPU, 임베디드 프로세서 등과 같은 특수 목적 프로세서이다.
공유 캐시(도시되지 않음)는 어느 한 프로세서에 포함되거나, 양자 모두의 프로세서의 외부이지만 여전히 P-P 인터커넥트를 통해 프로세서들과 접속될 수 있어서, 프로세서가 저 전력 모드에 놓이는 경우 어느 한쪽 또는 양자 모두의 프로세서의 로컬 캐시 정보가 공유된 캐시에 저장될 수 있도록 한다.
칩셋(3790)은 인터페이스(3796)를 통해 제1 버스(3716)에 결합될 수 있다. 일 실시예에서, 제1 버스(3716)는 PCI(Peripheral Component Interconnect) 버스이거나, 또는 PCI Express 버스 또는 또 다른 제3 세대 I/O 인터커넥트 버스와 같은 버스일 수 있지만, 본 개시내용의 범위는 이에 제한되지는 않는다.
도 37에 도시된 바와 같이, 제1 버스(3716)를 제2 버스(3720)에 결합하는 버스 브리지(3718)와 함께, 다양한 I/O 디바이스들(3714)이 제1 버스(3716)에 결합될 수 있다. 일 실시예에서, 코프로세서, 고-스루풋 MIC 프로세서, GPGPU들, (예를 들어, 그래픽 가속기 또는 디지털 신호 처리(DSP) 유닛들과 같은) 가속기들, 필드 프로그래머블 게이트 어레이들, 또는 임의의 다른 프로세서와 같은 하나 이상의 부가적인 프로세서(들)(3715)가 제1 버스(3716)에 결합된다. 일 실시예에서, 제2 버스(3720)는 LPC(low pin count) 버스일 수 있다. 일 실시예에서는, 예를 들어, 키보드 및/또는 마우스(3722), 통신 디바이스들(3727), 및 명령어들/코드 및 데이터(3730)를 포함할 수 있는 디스크 드라이브 또는 기타 대용량 저장 디바이스와 같은 저장 유닛(3728)을 포함하는 다양한 디바이스들이 제2 버스(3720)에 결합될 수 있다. 또한, 오디오 I/O(3724)가 제2 버스(3720)에 결합될 수 있다. 다른 아키텍처들도 가능하다는 점에 유의한다. 예를 들어, 도 37의 포인트-투-포인트 아키텍처 대신에, 시스템은 멀티드롭 버스 또는 다른 이러한 아키텍처를 구현할 수 있다.
이제 도 38을 참조하면, 본 개시내용의 실시예에 따른 제2의 더 구체적인 예시적인 시스템(3800)의 블록도가 도시되어 있다. 도 37 및 도 38에서의 유사한 요소들은 유사한 참조 번호들을 지니며, 도 38의 다른 양태들을 모호하게 하는 것을 회피하기 위해 도 38로부터 도 37의 특정 양태들이 생략되었다.
도 38은 프로세서들(3770, 3780)이 제각기 통합 메모리 및 I/O 제어 로직("CL")(3772 및 3782)을 포함할 수 있다는 것을 예시한다. 따라서, CL(3772, 3782)은 통합된 메모리 제어기 유닛들을 포함하고, I/O 제어 로직을 포함한다. 도 38은 메모리들(3732, 3734)이 CL(3772, 3782)에 결합될 뿐만 아니라 I/O 디바이스들(3814)도 제어 로직(3772, 3782)에 결합되는 것을 예시한다. 레거시 I/O 디바이스들(3815)이 칩셋(3790)에 결합된다.
이제 도 39를 참조하면, 본 개시내용의 실시예에 따른 SoC(3900)의 블록도가 도시되어 있다. 도 35에서의 유사한 요소들은 유사한 참조 번호들을 지닌다. 또한, 파선 박스들은 더 진보된 SoC들에 대한 선택적인 특징들이다. 도 39에서, 인터커넥트 유닛(들)(3902)은 다음에 결합된다.: 하나 이상의 코어(202A-N) 및 공유 캐시 유닛(들)(3506)의 세트를 포함하는 애플리케이션 프로세서(3910); 시스템 에이전트 유닛(3510); 버스 제어기 유닛(들)(3516); 통합 메모리 제어기 유닛(들)(3514); 통합 그래픽 로직, 이미지 프로세서, 오디오 프로세서, 및 비디오 프로세서를 포함할 수 있는 세트 또는 하나 이상의 코프로세서(3920); SRAM(static random access memory) 유닛(3930); DMA(direct memory access) 유닛(3932); 하나 이상의 외부 디스플레이에 결합하기 위한 디스플레이 유닛(3940). 일 실시예에서, 코프로세서(들)(3920)는 특수 목적 프로세서, 예를 들어 네트워크 또는 통신 프로세서, 압축 엔진, GPGPU, 고-스루풋 MIC 프로세서, 임베디드 프로세서, 또는 그와 유사한 것을 포함한다.
본 명세서에 개시된(예를 들어, 메커니즘들의) 실시예들은 하드웨어, 소프트웨어, 펌웨어, 또는 이러한 구현 접근법들의 조합으로 구현될 수 있다. 본 개시내용의 실시예들은 적어도 하나의 프로세서, 저장 시스템(휘발성 및 비휘발성 메모리 및/또는 저장 요소들을 포함함), 적어도 하나의 입력 디바이스, 및 적어도 하나의 출력 디바이스를 포함하는 프로그래머블 시스템들상에서 실행되는 컴퓨터 프로그램들 또는 프로그램 코드로서 구현될 수 있다.
도 37에 예시된 코드(3730)와 같은 프로그램 코드는 본 명세서에 설명된 기능들을 수행하고 출력 정보를 생성하기 위해 입력 명령어들에 적용될 수 있다. 출력 정보는 공지된 방식으로 하나 이상의 출력 디바이스에 적용될 수 있다. 이 응용 목적을 위해, 처리 시스템은, 예를 들어; 디지털 신호 프로세서(DSP), 마이크로컨트롤러, ASIC(application specific integrated circuit ), 또는 마이크로프로세서와 같은 프로세서를 갖는 임의의 시스템을 포함한다.
프로그램 코드는 처리 시스템과 통신하기 위해 고급 절차형 또는 객체 지향형 프로그래밍 언어로 구현될 수 있다. 프로그램 코드는 또한 원할 경우 어셈블리어 또는 기계어로 구현될 수 있다. 사실상, 본 명세서에 설명된 메커니즘들은 범위에 있어서 임의의 특정 프로그래밍 언어로 한정되지는 않는다. 임의의 경우에, 이 언어는 컴파일링되거나 인터프리팅된 언어일 수 있다.
적어도 하나의 실시예의 하나 이상의 양태는 머신에 의해 판독될 때 이 머신으로 하여금 본 명세서에 설명된 기술들을 수행하기 위한 로직을 제작하게 하는, 프로세서 내의 다양한 로직을 표현하는 머신 판독 가능 매체상에 저장된 대표적인 명령어들에 의해 구현될 수 있다. "IP 코어들"로 알려진 이러한 표현들은 유형의(tangible) 머신 판독 가능 매체에 저장될 수 있고, 다양한 고객 또는 제조 설비에 공급되어 실제로 로직 또는 프로세서를 만드는 제조 기계들에 로드된다.
이러한 머신 판독 가능 저장 매체는, 저장 매체, 이를테면, 하드 디스크, 플로피 디스크를 포함하는 임의의 다른 유형의 디스크, 광학 디스크, 콤팩트 디스크 판독 전용 메모리(CD-ROM), CD-RW(compact disk rewritable), 및 자기-광 디스크, 반도체 디바이스, 이를테면, 판독 전용 메모리(ROM), 랜덤 액세스 메모리(RAM: random access memory), 이를테면, 동적 랜덤 액세스 메모리(DRAM: dynamic random access memory), 정적 랜덤 액세스 메모리(SRAM), 소거가능 프로그램가능 판독 전용 메모리(EPROM), 플래시 메모리, 전기적 소거가능 프로그램가능 판독 전용 메모리(EEPROM), 상 변화 메모리(PCM), 자기 또는 광학 카드, 또는 전자 명령어들을 저장하기에 적합한 임의의 다른 유형의 매체를 포함하는, 머신 또는 디바이스에 의해 제조되거나 형성된 물품들의 비 일시적인 유형의 배열들을 포함할 수 있지만, 이것들에만 제한되는 것은 아니다.
따라서, 본 개시내용의 실시예들은, 또한, 명령어들을 포함하거나, 또는 본 명세서에 개시되는 구조들, 회로들, 장치들, 프로세서들 및/또는 시스템 특징들을 정의하는, HDL(Hardware Description Language) 등의 설계 데이터를 포함하는 비 일시적이고 유형인 머신 판독 가능 매체를 포함한다. 이러한 실시예들은 프로그램 제품들로 또한 지칭될 수 있다.
에뮬레이션(이진 변환, 코드 모핑 등을 포함함)
일부 경우에, 명령어 변환기가 소스 명령어 세트로부터의 명령어를 타겟 명령어 세트로 변환하는 데 사용될 수 있다. 예를 들어, 명령어 변환기는 명령어를 코어에 의해 처리될 하나 이상의 다른 명령어로(예를 들어, 정적 바이너리 변환, 동적 컴필레이션(dynamic compilation)을 포함하는 동적 이진 변환을 이용하여) 번역하거나, 모핑하거나, 에뮬레이트하거나, 또는 달리 변환할 수 있다. 명령어 변환기는 소프트웨어, 하드웨어, 펌웨어, 또는 이들의 조합으로 구현될 수 있다. 명령어 변환기는 온 프로세서(on processor), 오프 프로세서(off processor), 또는 부분 온 및 부분 오프 프로세서(part on and part off processor)일 수 있다.
도 40은 본 개시내용의 실시예들에 따라 소스 명령어 세트에서의 이진 명령어들을 타겟 명령어 세트에서의 이진 명령어들로 변환하기 위해 소프트웨어 명령어 변환기를 사용하는 것을 대비하는 블록도이다. 예시된 실시예에서, 명령어 변환기는 소프트웨어 명령어 변환기이지만, 대안적으로 명령어 변환기는 소프트웨어, 펌웨어, 하드웨어, 또는 이들의 다양한 조합으로 구현될 수 있다. 도 40은 적어도 하나의 x86 명령어 세트 코어를 갖는 프로세서(4016)에 의해 네이티브로(natively) 실행될 수 있는 x86 이진 코드(4006)를 생성하기 위해 고급 언어(4002)로 된 프로그램이 x86 컴파일러(4004)를 이용하여 컴파일링될 수 있다는 것을 도시한다. 적어도 하나의 x86 명령어 세트 코어를 갖는 프로세서(4016)는, 적어도 하나의 x86 명령어 세트 코어를 갖는 인텔® 프로세서와 실질적으로 동일한 결과를 달성하기 위해서, (1) 인텔® x86 명령어 세트 코어의 명령어 세트의 상당부 또는 (2) 적어도 하나의 x86 명령어 세트 코어를 갖는 인텔® 프로세서상에서 실행되도록 되어 있는 오브젝트 코드 버전의 애플리케이션들 또는 다른 소프트웨어를 호환 가능하게 실행하거나 또는 다른 방식으로 처리함으로써, 적어도 하나의 x86 명령어 세트 코어를 갖는 인텔® 프로세서와 실질적으로 동일한 기능을 수행할 수 있는 임의의 프로세서를 나타낸다. x86 컴파일러(4004)는, 부가적인 링크 처리에 의해 또는 부가적인 링크 처리 없이, 적어도 하나의 x86 명령어 세트 코어(4016)를 갖는 프로세서상에서 실행될 수 있는 x86 이진 코드(4006)(예를 들어, 오브젝트 코드)를 발생하도록 동작 가능한 컴파일러를 나타낸다. 이와 유사하게, 도 40은 적어도 하나의 x86 명령어 세트 코어가 없는 프로세서(4014)(예컨대, 미국 캘리포니아주 서니베일 소재의 MIPS Technologies의 MIPS 명령어 세트를 실행하는 및/또는 미국 캘리포니아주 서니베일 소재의 ARM Holdings의 ARM 명령어 세트를 실행하는 코어들을 갖는 프로세서)에 의해 네이티브로 실행될 수 있는 대안의 명령어 세트 이진 코드(4010)를 생성하기 위해 고급 언어(4002)로 된 프로그램이 대안의 명령어 세트 컴파일러(4008)를 사용하여 컴파일링될 수 있다는 것을 도시한다. 명령어 변환기(4012)는 x86 바이너리 코드(4006)를 x86 명령어 세트 코어를 구비하지 않은 프로세서(4014)에 의해 네이티브로 실행될 수 있는 코드로 변환하는 데 사용된다. 이 변환된 코드는 대안적 명령어 세트 이진 코드(4010)와 동일할 가능성이 별로 없지만 - 그 이유는 이것을 할 수 있는 명령어 변환기를 만들기가 어렵기 때문임 -; 변환된 코드는 일반 연산을 달성할 것이고 대안적 명령어 세트로부터의 명령어들로 구성될 것이다. 따라서, 명령어 변환기(4012)는, 에뮬레이션, 시뮬레이션 또는 임의의 다른 프로세스를 통해, x86 명령어 세트 프로세서 또는 코어를 갖지 않는 프로세서 또는 기타 전자 디바이스가 x86 이진 코드(4006)를 실행할 수 있게 해 주는 소프트웨어, 펌웨어, 하드웨어, 또는 이들의 조합을 나타낸다.

Claims (10)

  1. 장치로서,
    제1 복수의 소스 행렬 데이터 요소를 저장하는 제1 하나 이상의 벡터 레지스터;
    제2 복수의 소스 행렬 데이터 요소를 저장하는 제2 하나 이상의 벡터 레지스터 - 상기 제1 및 제2 복수의 소스 행렬 데이터 요소의 각각의 소스 행렬 데이터 요소는 제1 데이터 요소 폭을 가짐 -;
    복수의 누산 행렬 데이터 요소를 저장하는 제3 하나 이상의 벡터 레지스터 - 상기 복수의 누산 데이터 요소의 각각의 누산 데이터 요소는 상기 제1 데이터 요소 폭의 적어도 2배인 제2 데이터 요소 폭을 가짐 -;
    복수의 처리 레인(processing lane)에서 동작 가능한 행렬 처리 회로 - 상기 행렬 처리 회로는 상기 복수의 처리 레인에서 대응하는 복수의 곱셈을 수행하기 위해 단일 행렬 명령어를 실행함 -; 및
    상기 단일 행렬 명령어에 따라 상기 제1 복수의 소스 행렬 데이터 요소의 제1 소스 행렬 데이터 요소를 상기 복수의 처리 레인의 다수의 처리 레인에 브로드캐스트하는 피연산자 라우팅 회로 - 상기 다수의 처리 레인의 각각의 처리 레인에서, 상기 행렬 처리 회로는 대응하는 곱을 생성하기 위해 상기 제1 소스 행렬 데이터 요소와 상기 제2 복수의 소스 행렬 데이터 요소의 상이한 데이터 요소의 대응하는 곱셈을 수행하고, 상기 대응하는 곱은 상기 제2 데이터 요소 폭을 갖는 대응하는 결과 행렬 데이터 요소를 생성하기 위해 대응하는 누산 행렬 데이터 요소 및 상기 제1 및 제2 복수의 소스 행렬 데이터 요소의 각자의 데이터 요소들의 곱셈들의 하나 이상의 다른 곱에 추가됨 -
    를 포함하는 장치.
  2. 제1항에 있어서, 각각의 처리 레인은 상기 제2 데이터 요소 폭과 동일한 처리 레인 폭을 갖는, 장치.
  3. 제1항 또는 제2항에 있어서, 상기 제1 및 제2 복수의 소스 행렬 데이터 요소는 16 비트 부동 소수점 데이터 요소들을 포함하고, 상기 누산 행렬 데이터 요소들은 32 비트 부동 소수점 데이터 요소들을 포함하는, 장치.
  4. 제1항 또는 제2항에 있어서,
    상기 단일 행렬 명령어의 실행 동안 상기 제1 복수의 소스 행렬 데이터 요소 및 상기 제2 복수의 소스 행렬 데이터 요소의 적어도 서브세트를 저장하는 로컬 버퍼 스토리지를 더 포함하는, 장치.
  5. 제4항에 있어서, 상기 제1 복수의 소스 행렬 데이터 요소 또는 상기 제2 복수의 소스 행렬 데이터 요소의 상기 서브세트 내의 하나 이상의 행렬 데이터 요소는 상기 행렬 처리 회로에 의해 다수의 연산에서 재사용되는, 장치.
  6. 제4항에 있어서, 상기 로컬 버퍼 스토리지는 상기 제1 복수의 소스 행렬 데이터 요소의 서브세트 및 상기 제2 복수의 소스 행렬 데이터 요소의 서브세트를 저장하는, 장치.
  7. 제5항에 있어서, 상기 행렬 처리 회로는 상기 제1 복수의 소스 행렬 데이터 요소의 서브세트 및 상기 제2 복수의 소스 행렬 데이터 요소의 서브세트와의 행렬 연산들을 수행하고, 대응하는 결과 데이터 요소들을 상기 로컬 버퍼 스토리지에 저장하고, 상기 대응하는 결과 데이터 요소들을 후속 행렬 연산들의 후속 결과 데이터 요소들과 결합하는, 장치.
  8. 제4항에 있어서,
    상기 행렬 처리 회로는 상기 로컬 버퍼 스토리지의 적어도 일부의 회수(reclamation)를 방지하는, 장치.
  9. 제1항 또는 제2항에 있어서,
    상기 행렬 처리 회로는 상기 복수의 처리 레인에 배열된 처리 요소들의 2차원 그리드를 포함하는, 장치.
  10. 제1항 또는 제2항에 있어서,
    집적 회로(IC)를 더 포함하고, 상기 IC는 상기 제1 하나 이상의 벡터 레지스터, 상기 제2 하나 이상의 벡터 레지스터, 상기 제3 하나 이상의 벡터 레지스터, 상기 행렬 처리 회로, 및 상기 피연산자 라우팅 회로를 포함하는, 장치.
KR1020240002721A 2019-12-28 2024-01-08 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들 KR20240011204A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US16/729,361 2019-12-28
US16/729,361 US11714875B2 (en) 2019-12-28 2019-12-28 Apparatuses, methods, and systems for instructions of a matrix operations accelerator
KR1020200123040A KR20210086447A (ko) 2019-12-28 2020-09-23 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
KR1020200123040A Division KR20210086447A (ko) 2019-12-28 2020-09-23 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들

Publications (1)

Publication Number Publication Date
KR20240011204A true KR20240011204A (ko) 2024-01-25

Family

ID=71098561

Family Applications (2)

Application Number Title Priority Date Filing Date
KR1020200123040A KR20210086447A (ko) 2019-12-28 2020-09-23 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들
KR1020240002721A KR20240011204A (ko) 2019-12-28 2024-01-08 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들

Family Applications Before (1)

Application Number Title Priority Date Filing Date
KR1020200123040A KR20210086447A (ko) 2019-12-28 2020-09-23 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들

Country Status (7)

Country Link
US (2) US11714875B2 (ko)
JP (2) JP2021108102A (ko)
KR (2) KR20210086447A (ko)
CN (2) CN113050990A (ko)
BR (1) BR102020019657A2 (ko)
DE (1) DE102020126212A1 (ko)
TW (1) TW202125287A (ko)

Families Citing this family (12)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2018174934A1 (en) 2017-03-20 2018-09-27 Intel Corporation Systems, methods, and apparatus for matrix move
US11372644B2 (en) * 2019-12-09 2022-06-28 Meta Platforms, Inc. Matrix processing instruction with optional up/down sampling of matrix
US11467834B2 (en) * 2020-04-01 2022-10-11 Samsung Electronics Co., Ltd. In-memory computing with cache coherent protocol
JP2021192187A (ja) * 2020-06-05 2021-12-16 富士通株式会社 出現頻度算出プログラム、グラフィックス プロセッシング ユニット、情報処理装置、及び出現頻度算出方法
CN113867790A (zh) * 2020-06-30 2021-12-31 上海寒武纪信息科技有限公司 计算装置、集成电路芯片、板卡和计算方法
CN113867799A (zh) * 2020-06-30 2021-12-31 上海寒武纪信息科技有限公司 计算装置、集成电路芯片、板卡、电子设备和计算方法
CN113867800A (zh) * 2020-06-30 2021-12-31 上海寒武纪信息科技有限公司 计算装置、集成电路芯片、板卡、电子设备和计算方法
CN113867793A (zh) * 2020-06-30 2021-12-31 上海寒武纪信息科技有限公司 计算装置、集成电路芯片、板卡、电子设备和计算方法
CN113867789A (zh) * 2020-06-30 2021-12-31 上海寒武纪信息科技有限公司 计算装置、集成电路芯片、板卡、电子设备和计算方法
US11494326B1 (en) * 2021-03-30 2022-11-08 Amazon Technologies, Inc. Programmable computations in direct memory access engine
US20230094414A1 (en) * 2021-09-24 2023-03-30 Intel Corporation Matrix operation with multiple tiles per matrix dimension
TWI819937B (zh) * 2022-12-28 2023-10-21 國立成功大學 應用於類神經網路的記憶內運算的加速器

Family Cites Families (56)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5247632A (en) 1989-01-23 1993-09-21 Eastman Kodak Company Virtual memory management arrangement for addressing multi-dimensional arrays in a digital data processing system
US5475822A (en) 1993-11-15 1995-12-12 Motorola, Inc. Data processing system for resuming instruction execution after an interrupt and method therefor
US7301541B2 (en) 1995-08-16 2007-11-27 Microunity Systems Engineering, Inc. Programmable processor and method with wide operations
US5892962A (en) 1996-11-12 1999-04-06 Lucent Technologies Inc. FPGA-based processor
US6161219A (en) 1997-07-03 2000-12-12 The University Of Iowa Research Foundation System and method for providing checkpointing with precompile directives and supporting software to produce checkpoints, independent of environment constraints
US6282634B1 (en) 1998-05-27 2001-08-28 Arm Limited Apparatus and method for processing data having a mixed vector/scalar register file
FR2787233B1 (fr) 1998-12-11 2001-02-16 St Microelectronics Sa Procede pour verifier l'integrite des circuits de decodage d'une memoire
US6901422B1 (en) 2001-03-21 2005-05-31 Apple Computer, Inc. Matrix multiplication in a vector processing system
US7725521B2 (en) 2001-10-29 2010-05-25 Intel Corporation Method and apparatus for computing matrix transformations
US6877020B1 (en) 2001-12-31 2005-04-05 Apple Computer, Inc. Method and apparatus for matrix transposition
US7003542B2 (en) 2002-01-02 2006-02-21 Intel Corporation Apparatus and method for inverting a 4×4 matrix
US7209939B2 (en) 2002-07-11 2007-04-24 Sun Microsystems, Inc. Precision improvement method for the Strassen/Winograd matrix multiplication method
US6944747B2 (en) 2002-12-09 2005-09-13 Gemtech Systems, Llc Apparatus and method for matrix data processing
US7657880B2 (en) * 2003-01-31 2010-02-02 Intel Corporation Safe store for speculative helper threads
US7159103B2 (en) * 2003-03-24 2007-01-02 Infineon Technologies Ag Zero-overhead loop operation in microprocessor having instruction buffer
US20040193668A1 (en) * 2003-03-31 2004-09-30 Patrick Devaney Virtual double width accumulators for vector processing
GB2409068A (en) * 2003-12-09 2005-06-15 Advanced Risc Mach Ltd Data element size control within parallel lanes of processing
US7873812B1 (en) 2004-04-05 2011-01-18 Tibet MIMAR Method and system for efficient matrix multiplication in a SIMD processor architecture
US20060190517A1 (en) 2005-02-02 2006-08-24 Guerrero Miguel A Techniques for transposition of a matrix arranged in a memory as multiple items per word
US20070186210A1 (en) 2006-02-06 2007-08-09 Via Technologies, Inc. Instruction set encoding in a dual-mode computer processing environment
US20070271325A1 (en) * 2006-05-08 2007-11-22 Nvidia Corporation Matrix multiply with reduced bandwidth requirements
US7792895B1 (en) 2006-06-16 2010-09-07 Nvidia Corporation Efficient matrix multiplication on a parallel processing device
US7912889B1 (en) 2006-06-16 2011-03-22 Nvidia Corporation Mapping the threads of a CTA to the elements of a tile for efficient matrix multiplication
US20080071851A1 (en) 2006-09-20 2008-03-20 Ronen Zohar Instruction and logic for performing a dot-product operation
US8122078B2 (en) 2006-10-06 2012-02-21 Calos Fund, LLC Processor with enhanced combined-arithmetic capability
US7797362B2 (en) 2007-02-23 2010-09-14 Texas Instruments Incorporated Parallel architecture for matrix transposition
US8392487B1 (en) 2007-03-29 2013-03-05 Compass Electro-Optical Systems Ltd Programmable matrix processor
US8028015B2 (en) 2007-08-10 2011-09-27 Inside Contactless S.A. Method and system for large number multiplication
US8923510B2 (en) 2007-12-28 2014-12-30 Intel Corporation Method and apparatus for efficiently implementing the advanced encryption standard
US8533251B2 (en) 2008-05-23 2013-09-10 International Business Machines Corporation Optimized corner turns for local storage and bandwidth reduction
US8250130B2 (en) 2008-05-30 2012-08-21 International Business Machines Corporation Reducing bandwidth requirements for matrix multiplication
US8060730B2 (en) 2008-05-30 2011-11-15 Freescale Semiconductor, Inc. Selective MISR data accumulation during exception processing
US20100180100A1 (en) 2009-01-13 2010-07-15 Mavrix Technology, Inc. Matrix microprocessor and method of operation
US20100191787A1 (en) * 2009-01-29 2010-07-29 Vns Portfolio Llc Sequential Multiplier
US8539201B2 (en) 2009-11-04 2013-09-17 International Business Machines Corporation Transposing array data on SIMD multi-core processor architectures
US8984043B2 (en) 2009-12-23 2015-03-17 Intel Corporation Multiplying and adding matrices
US8478969B2 (en) 2010-09-24 2013-07-02 Intel Corporation Performing a multiply-multiply-accumulate instruction
US20120113133A1 (en) 2010-11-04 2012-05-10 Shpigelblat Shai System, device, and method for multiplying multi-dimensional data arrays
US9727471B2 (en) * 2010-11-29 2017-08-08 Intel Corporation Method and apparatus for stream buffer management instructions
US20120254588A1 (en) 2011-04-01 2012-10-04 Jesus Corbal San Adrian Systems, apparatuses, and methods for blending two source operands into a single destination using a writemask
ES2943248T3 (es) 2011-04-01 2023-06-12 Intel Corp Formato de instrucción compatible con vectores y ejecución del mismo
US9503741B2 (en) 2011-06-08 2016-11-22 Vixs Systems, Inc. Video decoder with multi-format vector processor and methods for use therewith
US20140149480A1 (en) 2012-11-28 2014-05-29 Nvidia Corporation System, method, and computer program product for transposing a matrix
US9442723B2 (en) 2012-12-28 2016-09-13 Intel Corporation Method and apparatus for integral image computation instructions
US9286216B2 (en) 2014-01-16 2016-03-15 Carnegie Mellon University 3DIC memory chips including computational logic-in-memory for performing accelerated data processing
CN106293610B (zh) 2014-07-02 2019-03-15 上海兆芯集成电路有限公司 微处理器及其方法
US20160179523A1 (en) 2014-12-23 2016-06-23 Intel Corporation Apparatus and method for vector broadcast and xorand logical instruction
US10535114B2 (en) 2015-08-18 2020-01-14 Nvidia Corporation Controlling multi-pass rendering sequences in a cache tiling architecture
US10228911B2 (en) * 2015-10-08 2019-03-12 Via Alliance Semiconductor Co., Ltd. Apparatus employing user-specified binary point fixed point arithmetic
US10146535B2 (en) 2016-10-20 2018-12-04 Intel Corporatoin Systems, apparatuses, and methods for chained fused multiply add
US10437562B2 (en) * 2016-12-30 2019-10-08 Intel Corporation Apparatus and method for processing sparse data
EP3812900B1 (en) 2016-12-31 2023-11-29 Intel Corporation Systems, methods, and apparatuses for heterogeneous computing
GB2560159B (en) * 2017-02-23 2019-12-25 Advanced Risc Mach Ltd Widening arithmetic in a data processing apparatus
WO2018174934A1 (en) * 2017-03-20 2018-09-27 Intel Corporation Systems, methods, and apparatus for matrix move
US10678507B2 (en) * 2017-12-22 2020-06-09 Alibaba Group Holding Limited Programmable multiply-add array hardware
US10459876B2 (en) * 2018-01-31 2019-10-29 Amazon Technologies, Inc. Performing concurrent operations in a processing element

Also Published As

Publication number Publication date
US11714875B2 (en) 2023-08-01
JP2021108102A (ja) 2021-07-29
JP2024038122A (ja) 2024-03-19
TW202125287A (zh) 2021-07-01
US20240078283A1 (en) 2024-03-07
CN117724763A (zh) 2024-03-19
BR102020019657A2 (pt) 2021-06-29
CN113050990A (zh) 2021-06-29
KR20210086447A (ko) 2021-07-08
US20200201932A1 (en) 2020-06-25
DE102020126212A1 (de) 2021-07-01

Similar Documents

Publication Publication Date Title
EP3651017B1 (en) Systems and methods for performing 16-bit floating-point matrix dot product instructions
KR20240011204A (ko) 행렬 연산 가속기의 명령어들을 위한 장치들, 방법들, 및 시스템들
CN114625423A (zh) 用于执行将矩阵变换为行交错格式的指令的系统和方法
US10922077B2 (en) Apparatuses, methods, and systems for stencil configuration and computation instructions
KR20230002229A (ko) 체인화된 타일 연산들을 구현하기 위한 시스템들 및 방법들
CN110909883A (zh) 用于执行指定三元片逻辑操作的指令的系统和方法
US11269630B2 (en) Interleaved pipeline of floating-point adders
US20210406018A1 (en) Apparatuses, methods, and systems for instructions for moving data between tiles of a matrix operations accelerator and vector registers
JP2021057004A (ja) 行列演算アクセラレータの命令のための装置、方法、及びシステム
US20200310803A1 (en) Apparatuses, methods, and systems for transpose instructions of a matrix operations accelerator
CN112148251A (zh) 跳过无意义的矩阵运算的系统和方法
US20230315450A1 (en) Apparatuses, methods, and systems for 8-bit floating-point matrix dot product instructions
US20210279038A1 (en) Using fuzzy-jbit location of floating-point multiply-accumulate results
EP3757822B1 (en) Apparatuses, methods, and systems for enhanced matrix multiplier architecture
WO2022066356A1 (en) Apparatuses, methods, and systems for instructions for 16-bit floating-point matrix dot product instructions
CN110826722A (zh) 用于通过排序来生成索引并基于排序对元素进行重新排序的系统、装置和方法

Legal Events

Date Code Title Description
A107 Divisional application of patent