KR102520017B1 - 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들 - Google Patents

이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들 Download PDF

Info

Publication number
KR102520017B1
KR102520017B1 KR1020207034869A KR20207034869A KR102520017B1 KR 102520017 B1 KR102520017 B1 KR 102520017B1 KR 1020207034869 A KR1020207034869 A KR 1020207034869A KR 20207034869 A KR20207034869 A KR 20207034869A KR 102520017 B1 KR102520017 B1 KR 102520017B1
Authority
KR
South Korea
Prior art keywords
memory
descriptor
accelerator
thread
descriptors
Prior art date
Application number
KR1020207034869A
Other languages
English (en)
Other versions
KR20200140395A (ko
Inventor
라제쉬 엠. 산카란
길버트 네이거
나라얀 란가나탄
스테판 알. 반 도렌
조셉 누즈만
니알 디. 맥도넬
마이클 에이. 오'할론
록프라빈 비. 모수르
트레이시 가렛 드라이스데일
에리코 누르비타디
아시트 케이. 미쉬라
가네쉬 벤카테쉬
데보라 티. 마르
니콜라스 피. 카터
조나단 디. 피어스
에드워드 티. 그로쵸우스키
리차드 제이. 그레코
로버트 발렌타인
지저스 코발
토마스 디. 플렛처
데니스 알. 브래드포드
드와이트 피. 맨리
마크 제이. 차르니
제프리 제이. 쿡
폴 카프리올리
코이치 야마다
켄트 디. 그로소프
데이비드 비. 셰필드
Original Assignee
인텔 코포레이션
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 인텔 코포레이션 filed Critical 인텔 코포레이션
Publication of KR20200140395A publication Critical patent/KR20200140395A/ko
Application granted granted Critical
Publication of KR102520017B1 publication Critical patent/KR102520017B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/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
    • 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • 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
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • 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/3001Arithmetic instructions
    • G06F9/30014Arithmetic instructions with variable precision
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30047Prefetch instructions; cache control 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/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • 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/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/30087Synchronisation or serialisation 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/30076Arrangements for executing specific machine instructions to perform miscellaneous control operations, e.g. NOP
    • G06F9/3009Thread control 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/3017Runtime instruction translation, e.g. macros
    • 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/30181Instruction operation extension or modification
    • 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/30181Instruction operation extension or modification
    • G06F9/30189Instruction operation extension or modification according to execution mode, e.g. mode flag
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/3834Maintaining memory consistency
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3836Instruction issuing, e.g. dynamic instruction scheduling or out of order instruction execution
    • G06F9/3842Speculative instruction execution
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3854Instruction completion, e.g. retiring, committing or graduating
    • G06F9/3858Result writeback, i.e. updating the architectural state or memory
    • G06F9/38585Result writeback, i.e. updating the architectural state or memory with result invalidation, e.g. nullification
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3861Recovery, e.g. branch miss-prediction, exception handling
    • G06F9/3863Recovery, e.g. branch miss-prediction, exception handling using multiple copies of the architectural state, e.g. shadow registers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • 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/3877Concurrent instruction execution, e.g. pipeline, look ahead using a slave processor, e.g. coprocessor
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • 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/44Arrangements for executing specific programs
    • G06F9/4401Bootstrapping
    • G06F9/4411Configuring for operating with peripheral devices; Loading of device drivers
    • 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45504Abstract machines for programme code execution, e.g. Java virtual machine [JVM], interpreters, emulators
    • 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • 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/46Multiprogramming arrangements
    • G06F9/48Program initiating; Program switching, e.g. by interrupt
    • G06F9/4806Task transfer initiation or dispatching
    • G06F9/4843Task transfer initiation or dispatching by program, e.g. task dispatcher, supervisor, operating system
    • G06F9/4881Scheduling strategies for dispatcher, e.g. round robin, multi-level priority queues
    • 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/44Arrangements for executing specific programs
    • G06F9/455Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
    • G06F9/45533Hypervisors; Virtual machine monitors
    • G06F9/45558Hypervisor-specific management and integration aspects
    • G06F2009/45583Memory management, e.g. access or allocation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2213/00Indexing scheme relating to interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F2213/0026PCI express
    • 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/46Multiprogramming arrangements
    • G06F9/50Allocation of resources, e.g. of the central processing unit [CPU]
    • G06F9/5005Allocation of resources, e.g. of the central processing unit [CPU] to service a request
    • G06F9/5027Allocation of resources, e.g. of the central processing unit [CPU] to service a request the resource being a machine, e.g. CPUs, Servers, Terminals
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computational Mathematics (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Computer Security & Cryptography (AREA)
  • Multimedia (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Algebra (AREA)
  • Databases & Information Systems (AREA)
  • Executing Machine-Instructions (AREA)
  • Advance Control (AREA)
  • Computer Hardware Design (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)
  • Treatment Of Liquids With Adsorbents In General (AREA)
  • Steroid Compounds (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들의 실시예들이 설명된다. 일부 실시예들에서, 하드웨어 이종 스케줄러는 복수의 이종 처리 요소들 중 하나 이상의 이종 처리 요소 상에서의 실행을 위해 명령어들을 디스패치하고, 명령어들은 복수의 이종 처리 요소들 중 하나 이상의 이종 처리 요소에 의해 처리될 코드 조각에 대응하고, 명령어들은 복수의 이종 처리 요소들 중 하나 이상의 이종 처리 요소 중의 적어도 하나의 이종 처리 요소에 대한 고유 명령어들이다.

Description

이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들{SYSTEMS, METHODS, AND APPARATUSES FOR HETEROGENEOUS COMPUTING}
본 개시내용은 일반적으로 컴퓨팅 디바이스들의 분야에 관한 것으로, 더 상세하게는, 이종 컴퓨팅 방법들, 디바이스들, 및 시스템들에 관한 것이다.
오늘날의 컴퓨터들에서, CPU들은 애플리케이션 소프트웨어 및 운영 체제들을 실행하는 것과 같은 범용 컴퓨팅 태스크들을 수행한다. 그래픽 및 이미지 처리와 같은 특수화된 컴퓨팅 태스크들은, 그래픽 프로세서들, 이미지 프로세서들, 디지털 신호 프로세서들, 및 고정 기능 가속기들에 의해 처리된다. 오늘날의 이종 기계들에서, 각각의 유형의 프로세서는 상이한 방식으로 프로그래밍된다.
대용량 데이터 처리의 시대는 오늘날의 범용 프로세서들과 비교하여 더 낮은 에너지로 더 높은 성능을 요구한다. 가속기들(예컨대, 맞춤형 고정 기능 유닛들 또는 맞춤조정형 프로그래밍가능 유닛들)은 이러한 요구들을 충족시키는 것을 돕는다. 이러한 분야가 알고리즘들 및 작업부하들 둘 모두에서 급속한 진화를 겪고 있으므로, 이용가능한 가속기들의 세트는 선험적으로 예측하기가 어렵고, 제품 세대 내의 재고 유닛들에 걸쳐 달라지고 제품 세대들과 함께 진화할 가능성이 매우 크다.
실시예들은 첨부된 도면들과 함께 하기 상세한 설명에 의해 용이하게 이해될 것이다. 이러한 설명을 용이하게 하기 위해, 동일한 참조 번호들은 동일한 구조적 요소들을 지정한다. 실시예들은 첨부된 도면의 도면들에서 제한으로서가 아니라 예로서 예시된다.
도 1은 이종 다중처리 실행 환경의 표현이다.
도 2는 이종 다중처리 실행 환경의 표현이다.
도 3은 이종 스케줄러의 예시적인 구현을 예시한다.
도 4는 컴퓨터 시스템의 시스템 부팅 및 디바이스 발견의 실시예를 예시한다.
도 5는 3가지 유형의 처리 요소들에 대한 프로그램 페이즈들의 맵핑에 기반한 스레드 이전의 예를 예시한다.
도 6은 이종 스케줄러에 의해 수행되는 예시적인 구현 흐름이다.
도 7은 이종 스케줄러에 의한 스레드 목적지 선택을 위한 방법의 예를 예시한다.
도 8은 논리적 ID들에 대한 스트라이프형 맵핑을 사용하는 개념을 예시한다.
도 9는 논리적 ID들에 대한 스트라이프형 맵핑을 사용하는 예를 예시한다.
도 10은 코어 그룹의 예를 예시한다.
도 11은 이진 변환기 스위칭 메커니즘을 활용하는 시스템에서의 스레드 실행 방법의 예를 예시한다.
도 12는 가속기에 대한 핫 코드를 위한 코어 할당의 예시적인 방법을 예시한다.
도 13은 페이지 디렉토리 기준 레지스터 이벤트에 대한 기입 또는 기상(wake-up)을 위한 잠재적인 코어 할당의 예시적인 방법을 예시한다.
도 14는 직렬 페이즈 스레드들의 예를 예시한다.
도 15는 휴면 명령 이벤트에 대한 스레드 응답을 위한 잠재적인 코어 할당의 예시적인 방법을 예시한다.
도 16은 페이즈 변화 이벤트에 대한 응답으로의 스레드를 위한 잠재적인 코어 할당의 예시적인 방법을 예시한다.
도 17은 가속 구역을 기술하는 코드의 예를 예시한다.
도 18은 하드웨어 프로세서 코어에서 ABEGIN을 사용하는 실행 방법의 실시예를 예시한다.
도 19는 하드웨어 프로세서 코어에서 AEND를 사용하는 실행 방법의 실시예를 예시한다.
도 20은 패턴 매칭을 사용하여 ABEGIN/AEND 동등성을 제공하는 시스템을 예시한다.
도 21은 패턴 인식에 노출된 비-가속화된 기술된 스레드의 실행 방법의 실시예를 예시한다.
도 22는 패턴 인식에 노출된 비-가속화된 기술된 스레드의 실행 방법의 실시예를 예시한다.
도 23은 상이한 유형들의 메모리 의존성들, 그들의 시맨틱(semantic)들, 순서화 요건들, 및 사용 경우들을 예시한다.
도 24는 ABEGIN 명령어가 가리키는 메모리 데이터 블록의 예를 예시한다.
도 25는 ABEGIN/AEND 시맨틱들을 사용하도록 구성되는 메모리(2503)의 예를 예시한다.
도 26은 ABEGIN/AEND를 사용하여 상이한 실행 모드에서 연산하는 방법의 예를 예시한다.
도 27은 ABEGIN/AEND를 사용하여 상이한 실행 모드에서 연산하는 방법의 예를 예시한다.
도 28은 일 구현에 대한 부가적인 세부사항들을 예시한다.
도 29는 가속기의 실시예를 예시한다.
도 30은 다중-프로토콜 링크를 통해 프로세서에 결합된 가속기 및 하나 이상의 컴퓨터 프로세서 칩을 포함하는 컴퓨터 시스템들을 예시한다.
도 31은 실시예에 따른 디바이스 바이어스 흐름들을 예시한다.
도 32는 일 구현에 따른 예시적인 프로세스를 예시한다.
도 33은 피연산자들이 하나 이상의 I/O 디바이스로부터 해제되는 프로세스를 예시한다.
도 34는 2개의 상이한 유형의 작업 큐들을 사용하는 구현을 예시한다.
도 35는 I/O 패브릭 인터페이스를 통해 제출된 기술어들을 수신하는 다수의 작업 큐들을 포함하는 데이터 스트리밍 가속기(DSA) 디바이스의 구현을 예시한다.
도 36은 2개의 작업 큐를 예시한다.
도 37은 엔진들 및 그룹화들을 이용하는 다른 구성을 예시한다.
도 38은 기술어의 구현을 예시한다.
도 39는 완료 기록의 구현을 예시한다.
도 40은 예시적인 무연산(no-op) 기술어 및 무연산 완료 기록을 예시한다.
도 41은 예시적인 배치 기술어 및 무연산 완료 기록을 예시한다.
도 42는 예시적인 드레인 기술어 및 드레인 완료 기록을 예시한다.
도 43은 예시적인 메모리 이동 기술어 및 메모리 이동 완료 기록을 예시한다.
도 44는 예시적인 채움 기술어를 예시한다.
도 45는 예시적인 비교 기술어 및 비교 완료 기록을 예시한다.
도 46은 예시적인 즉시 비교 기술어를 예시한다.
도 47은 예시적인 데이터 기록 생성 기술어 및 델타 기록 생성 완료 기록을 예시한다.
도 48은 델타 기록의 포맷을 예시한다.
도 49는 예시적인 델타 기록 적용 기술어를 예시한다.
도 50은 델타 기록 생성 및 델타 기록 적용 연산들의 사용의 일 구현을 도시한다.
도 51은 예시적인 이중 캐스트를 이용한 메모리 복사 기술어 및 이중 캐스트를 이용한 메모리 복사 완료 기록을 예시한다.
도 52는 예시적인 CRC 생성 기술어 및 CRC 생성 완료 기록을 예시한다.
도 53은 예시적인 CRC 생성을 이용한 복사 기술어를 예시한다.
도 54는 예시적인 DIF 삽입 기술어 및 DIF 삽입 완료 기록을 예시한다.
도 55는 예시적인 DIF 스트립 기술어 및 DIF 스트립 완료 기록을 예시한다.
도 56은 예시적인 DIF 업데이트 기술어 및 DIF 업데이트 완료 기록을 예시한다.
도 57은 예시적인 캐시 플러시 기술어를 예시한다.
도 58은 ENQCMD에 의해 생성된 64 바이트 인큐 저장 데이터를 예시한다.
도 59는 MOVDIRI 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 60은 MOVDIRI64B 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 61은 ENCQMD 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 62는 ENQCMDS 명령어에 대한 포맷을 예시한다.
도 63은 ENCQMDS 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 64는 UMONITOR 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 65는 UMWAIT 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 66은 TPAUSE 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 67은 UMWAIT 및 UMONITOR 명령어들을 사용하는 실행의 예를 예시한다.
도 68은 TPAUSE 및 UMONITOR 명령어들을 사용하는 실행의 예를 예시한다.
도 69는, 가속기가 캐시 일관성(coherent) 인터페이스를 통해 복수의 코어들에 통신가능하게 결합되는 예시적인 구현을 예시한다.
도 70은 가속기, 및 데이터 관리 유닛, 복수의 처리 요소들 및 고속 온-칩 저장소를 포함하는 이전에 설명된 다른 구성요소들의 다른 도면을 예시한다.
도 71은 처리 요소들에 의해 수행되는 연산들의 예시적인 세트를 예시한다.
도 72a는 벡터 y를 생성하기 위한, 벡터 x에 대한 희소 행렬 A 간의 곱셈의 예를 도시한다.
도 72b는 각각의 값이 (값, 행 색인) 쌍으로서 저장되는 행렬 A의 CSR 표현을 예시한다.
도 72c는 (값, 열 색인) 쌍을 사용하는 행렬 A의 CSC 표현을 예시한다.
도 73a, 도 73b, 및 도 73c는 각각의 컴퓨팅 패턴의 의사 코드를 예시한다.
도 74는 데이터 관리 유닛 및 처리 요소들의 일 구현에 대한 처리 흐름을 예시한다.
도 75a는 spMspV_csc 및 scale_update 연산들에 대한 경로들(점선들을 사용함)을 강조한다.
도 75b는 spMdV_csr 연산에 대한 경로들을 예시한다.
도 76a-b는 인접 행렬로서 그래프를 표현하는 예를 도시한다.
도 76c는 정점 프로그램을 예시한다.
도 76d는 정점 프로그램을 실행하기 위한 예시적인 프로그램 코드를 예시한다.
도 76e는 GSPMV 공식화를 도시한다.
도 77은 프레임워크를 예시한다.
도 78은 각각의 PE 내부에 제공되는 맞춤화가능한 논리 블록들을 예시한다.
도 79는 각각의 가속기 타일의 연산을 예시한다.
도 80a는 템플릿의 일 구현의 맞춤화가능한 파라미터들을 요약한다.
도 80b는 조정 고려사항들을 예시한다.
도 81은 가장 일반적인 희소 행렬 포맷들 중 하나를 예시한다.
도 82는 CRS 데이터 포맷을 사용하는 희소 행렬-밀집 벡터 곱셈의 구현에 수반되는 단계들을 도시한다.
도 83은 가속기 논리 다이 및 DRAM의 하나 이상의 스택을 포함하는 가속기의 구현을 예시한다.
도 84a-b는 DRAM 다이의 스택을 통해 상부 관점으로부터 배향된 가속기 논리 칩의 일 구현을 예시한다.
도 85는 DPE의 고레벨 개요를 제공한다.
도 86은 블록화 방식의 구현을 예시한다.
도 87은 블록 기술어를 도시한다.
도 88은 단일 내적(dot-product) 엔진의 버퍼들 내에 맞춰지는 2행 행렬을 예시한다.
도 89는 이러한 포맷을 사용하는 내적 엔진에서의 하드웨어의 일 구현을 예시한다.
도 90은 포착을 행하는 매칭 논리 유닛의 콘텐츠들을 예시한다.
도 91은 구현에 따른 희소 행렬-희소 벡터 곱셈을 지원하는 내적 엔진 설계의 세부사항들을 예시한다.
도 92는 특정 값들을 사용하는 예를 예시한다.
도 93은 희소-밀집 및 희소-희소 내적 엔진들이 둘 모두의 유형들의 계산들을 처리할 수 있는 내적 엔진을 산출하도록 결합되는 방식을 예시한다.
도 94a는 12개의 가속기 스택들을 갖는 소켓 대체 구현을 예시한다.
도 94b는 프로세서/코어들의 세트 및 8개의 스택들을 갖는 다중칩 패키지(MCP) 구현을 예시한다.
도 95는 가속기 스택들을 예시한다.
도 96은 64개의 내적 엔진들, 8개의 벡터 캐시들, 및 통합된 메모리 제어기를 포함하는, WIO3 DRAM 스택 아래에 놓이도록 의도된 가속기에 대한 잠재적 레이아웃을 도시한다.
도 97은 7개의 DRAM 기술들을 비교한다.
도 98a-b는 적층식 DRAM들을 예시한다.
도 99는 너비-우선 검색(BFS) 목록을 예시한다.
도 100은 일 구현에 따라 람다 함수들을 특정하는 데 사용되는 기술어들의 포맷을 도시한다.
도 101은 실시예에서의 헤더 워드의 하위 6 바이트를 예시한다.
도 102는 행렬 값 버퍼, 행렬 색인 버퍼, 및 벡터 값 버퍼를 예시한다.
도 103은 람다 데이터 경로의 일 구현의 세부사항들을 예시한다.
도 104는 명령어 인코딩의 구현을 예시한다.
도 105는 하나의 특정 세트의 명령어들에 대한 인코딩들을 예시한다.
도 106은 예시적인 비교 술어들의 인코딩들을 예시한다.
도 107은 바이어싱을 사용하는 실시예를 예시한다.
도 108a-b는 작업 큐 기반 구현들과 함께 사용되는 메모리 맵핑된 I/O(MMIO) 공간 레지스터들을 예시한다.
도 109는 행렬 곱셈의 예를 예시한다.
도 110은 이진 트리 감소 네트워크를 이용한 옥토MADD 명령어 연산을 예시한다.
도 111은 곱셈 가산 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 112는 곱셈 가산 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
도 113a-c는 MADD 명령어를 수행하기 위한 예시적인 하드웨어를 예시한다.
도 114는 하드웨어 이종 스케줄러 회로 및 메모리와 그 스케줄러 회로의 상호작용의 예를 예시한다.
도 115는 소프트웨어 이종 스케줄러의 예를 예시한다.
도 116은 시스템 부팅 후 디바이스 발견을 위한 방법의 실시예를 예시한다;
도 117(A)-(B)는 공유 메모리 내의 스레드에 대한 이동의 예를 예시한다.
도 118은 이종 스케줄러에 의해 수행될 수 있는 스레드 이동을 위한 예시적인 방법을 예시한다.
도 119는 위에 상세히 설명된 바와 같은 추상적 실행 환경을 제공하도록 구성되는 프로세서의 블록도이다.
도 120은 예시적인 다중칩 구성을 예시하는 간략화된 블록도이다.
도 121은 다중칩 링크(MCL)의 예시적인 구현을 포함하는 시스템의 적어도 일부분을 표현하는 블록도를 예시한다.
도 122는 예시적인 MCL의 예시적인 논리적 PHY의 블록도를 예시한다.
도 123은 MCL을 구현하는 데 사용되는 논리의 다른 표현을 예시하여 도시된 간략화된 블록도를 예시한다.
도 124는 ABEGIN/AEND가 지원되지 않을 때의 실행의 예를 예시한다.
도 125는 본 발명의 일 실시예에 따른 레지스터 아키텍처의 블록도이다.
도 126a는 본 발명의 실시예들에 따른, 예시적인 순차적 파이프라인 및 예시적인 레지스터 재명명, 비-순차적 송출/실행 파이프라인 둘 모두를 예시하는 블록도이다.
도 126b는 본 발명의 실시예들에 따른 프로세서에 포함될 순차적 아키텍처 코어 및 예시적인 레지스터 재명명, 비-순차적 송출/실행 아키텍처 코어의 예시적인 실시예 둘 모두를 예시하는 블록도이다.
도 127a-b는, 코어가 칩 내의 수 개의 논리 블록들(동일한 유형 및/또는 상이한 유형들의 다른 코어들을 포함함) 중 하나의 논리 블록인 더 구체적인 예시적인 순차적 코어 아키텍처의 블록도를 예시한다.
도 128은 본 발명의 실시예들에 따른, 하나 초과의 코어를 가질 수 있고, 통합된 메모리 제어기를 가질 수 있고, 통합된 그래픽들을 가질 수 있는 프로세서의 블록도이다.
도 129는 본 발명의 일 실시예에 따른 시스템의 블록도를 도시한다.
도 130은 본 발명의 실시예에 따른 제1의 더 구체적인 예시적인 시스템의 블록도이다.
도 131은 본 발명의 실시예에 따른 제2의 더 구체적인 예시적인 시스템의 블록도이다.
도 132는 본 발명의 실시예에 따른 SoC의 블록도이다.
도 133은 본 발명의 실시예들에 따른, 소스 명령어 세트에서의 이진 명령어들을 대상 명령어 세트에서의 이진 명령어들로 변환하기 위해 소프트웨어 명령어 변환기를 사용하는 것을 대조하는 블록도이다.
다음의 상세한 설명에서, 본원의 일부를 형성하는 첨부된 도면들에 대한 참조가 이루어지며, 여기서, 동일한 번호들은 전반에 걸쳐 동일한 부분들을 지정하고, 실시될 수 있는 실시예들이 예시로서 도시된다. 본 개시내용의 범위로부터 벗어나지 않으면서 다른 실시예들이 활용될 수 있고 구조적 또는 논리적 변경들이 이루어질 수 있다는 것이 이해되어야 한다. 따라서, 다음의 상세한 설명은 제한적인 의미로 받아들여서는 안되며, 실시예들의 범위는 첨부되는 청구항들 및 그 등가물들에 의해 정의된다.
청구된 주제를 이해하는 데 가장 도움이 되는 방식으로, 다양한 동작들이 다수의 별개의 활동들 또는 동작들로서 차례로 설명될 수 있다. 그러나, 설명의 순서는, 이러한 동작들이 반드시 순서에 의존한다는 것을 의미하는 것으로 해석되어서는 안된다. 특히, 이러한 동작들은 제시된 순서로 수행되지 않을 수 있다. 설명된 동작들은 설명된 실시예와 상이한 순서로 수행될 수 있다. 부가적인 실시예들에서, 다양한 부가적인 동작들이 수행될 수 있고/거나 설명된 동작들이 생략될 수 있다.
본 개시내용의 목적들을 위해, "A 및/또는 B"라는 문구는 (A), (B), 또는 (A 및 B)를 의미한다. 본 개시내용의 목적들을 위해, "A, B, 및/또는 C"라는 문구는 (A), (B), (C), (A 및 B), (A 및 C), (B 및 C), 또는 (A, B 및 C)를 의미한다.
설명은 "실시예에서" 또는 "실시예들에서"라는 문구들을 사용할 수 있으며, 이들 각각은 동일하거나 상이한 실시예들 중 하나 이상을 지칭할 수 있다. 또한, 본 개시내용의 실시예들에 관하여 사용되는 바와 같은 "포함하는", "구비하는", "갖는" 등의 용어들은 동의어이다.
배경기술에서 논의된 바와 같이, 가속기 해결책들을 전개하고, 간편하게 활용하는 가속기들의 복잡도를 관리하는 것은, 가속기들의 상이한 조합들을 구현하는 광범위한 재고 유닛들 및 플랫폼들이 존재하기 때문에 난제일 수 있다. 또한, 운영 체제들의 다양성(및 버전들, 패치들 등)을 고려하면, 디바이스 드라이버 모델을 통해 가속기들을 전개하는 것은, 개발자 노력, 비-휴대성 및 대용량 데이터 처리의 엄격한 성능 요건들로 인한 채택에 대한 장애물들을 포함하는 제한들을 갖는다. 가속기들은 전형적으로, 범용 프로세서 상에서 실행되는 소프트웨어보다 더 효율적으로 기능들을 수행하는 하드웨어 디바이스들(회로들)이다. 예컨대, 하드웨어 가속기들은 (비디오 인코딩 또는 디코딩, 특정 해시 함수들 등과 같은) 특정 알고리즘/태스크들의 실행, 또는 (기계 학습, 희소 데이터 조작, 암호화, 그래픽, 물리학, 정규 표현, 패킷 처리, 인공 지능, 디지털 신호 처리 등과 같은) 알고리즘들/태스크들의 클래스들을 개선하기 위해 사용될 수 있다. 가속기들의 예들은 그래픽 처리 유닛("GPU")들, 고정 기능 필드-프로그래밍가능 게이트 어레이("FPGA") 가속기들, 및 고정 기능 주문형 집적 회로("ASIC")들을 포함하지만 이들로 제한되지 않는다. 일부 구현들에서, 가속기는, 범용 중앙 처리 유닛("CPU")이 시스템에서 다른 프로세서들보다 더 효율적인 경우 범용 CPU일 수 있다는 것을 유의한다.
주어진 시스템(예컨대, 시스템-온-칩("SOC; system-on-a-chip"), 프로세서 재고 유닛, 랙 등)의 전력 비용은 이용가능한 규소 영역의 일부 상에서만 처리 요소들에 의해 소비될 수 있다. 이는, 하드웨어 블록들 모두가 동시에 활성일 수는 없더라도, 특정 동작들에 대한 에너지 소비를 감소시키는 다양한 특수화된 하드웨어 블록들을 구축하는 것을 유리하게 한다.
스레드를 처리하기 위해 처리 요소(예컨대, 코어 또는 가속기)를 선택하고, 처리 요소와 인터페이싱하고/거나 이종 다중프로세서 환경 내에서의 전력 소비를 관리하기 위한 시스템들, 방법들 및 장치들의 실시예들이 상세히 설명된다. 예컨대, 다양한 실시예들에서, 이종 다중프로세서들은, 스레드의 대응하는 작업부하 및/또는 처리 요소들의 특성들에 기반하여 이종 다중프로세서들의 상이한 유형들의 처리 요소들 사이에서 스레드를 동적으로 이전시키고, 처리 요소들 중 하나 이상에 프로그래밍적 인터페이스를 제공하고, 특정 처리 요소 상에서의 실행을 위해 코드를 변환하고, 작업부하 및 선택된 처리 요소의 특성들 또는 이들의 조합들에 기반하여, 선택된 처리 요소와 함께 사용하기 위한 통신 프로토콜을 선택하도록 (예컨대, 설계에 의해 또는 소프트웨어에 의해) 구성된다.
제1 양상에서, 작업부하 디스패치 인터페이스, 즉, 이종 스케줄러는 동종 다중프로세서 프로그래밍 모델을 시스템 프로그래머들에게 제공한다. 특히, 이러한 양상은, 프로그래머들이 특정 아키텍처 또는 등가의 추상화를 목표로 하는 소프트웨어를 개발할 수 있게 하면서, 개발된 소프트웨어에 대한 대응하는 변경들을 요구하지 않고도 기본 하드웨어에 대한 지속적인 개선들을 가능하게 한다.
제2 양상에서, 다중-프로토콜 링크는 (이종 스케줄러와 같은) 제1 엔티티가 통신과 연관된 프로토콜을 사용하여 다수의 디바이스들과 통신할 수 있게 한다. 이는, 디바이스 통신을 위한 별개의 링크들을 가질 필요성을 대체한다. 특히, 이러한 링크는 그 링크 상에서 동적으로 다중화되는 3개 이상의 프로토콜을 갖는다. 예컨대, 공통 링크는: 1) 디바이스 발견, 디바이스 구성, 오류 보고, 인터럽트들, DMA-스타일 데이터 전송들 및 하나 이상의 독점 또는 산업 표준(이를테면, 예컨대 PCI 익스프레스 규격 또는 등가의 대안)에 명시될 수 있는 바와 같은 다양한 서비스들을 가능하게 하는 생산자/소비자, 발견, 구성, 인터럽트들(PDCI; producer/consumer, discovery, configuration, interrupts)의 프로토콜; 2) 디바이스가 일관성있는 판독 및 기입 요청들을 처리 요소에 송출할 수 있게 하는 캐싱 에이전트 일관성(CAC; caching agent coherence) 프로토콜; 및 3) 처리 요소가 다른 처리 요소의 로컬 메모리에 액세스할 수 있게 하는 메모리 액세스(MA) 프로토콜로 이루어진 프로토콜들을 지원한다.
제3 양상에서, 스레드 또는 스레드의 부분들의 스케줄링, 이전, 또는 에뮬레이션은 스레드의 페이즈에 기반하여 행해진다. 예컨대, 스레드의 데이터 병렬 페이즈는 전형적으로 SIMD 코어에 스케줄링되거나 이전되고; 스레드의 스레드 병렬 페이즈는 전형적으로 하나 이상의 스칼라 코어에 스케줄링되거나 이전되고; 직렬 페이즈는 전형적으로 비-순차적 코어에 스케줄링되거나 이전된다. 코어 유형들 각각은 에너지 또는 레이턴시를 최소화하며, 이들 둘 모두가 스레드의 스케줄링, 이전 또는 에뮬레이션에 고려된다. 에뮬레이션은, 스케줄링 또는 이전이 가능하지 않거나 유리하지 않은 경우 사용될 수 있다.
제4 양상에서, 스레드 또는 스레드의 부분들은 기회주의적으로 가속기에 오프로딩된다. 특히, 스레드 또는 스레드의 부분들의 가속기 시작(ABEGIN) 명령어 및 가속기 종료(AEND) 명령어는 가속기 상에서 실행가능할 수 있는 명령어들을 북엔드(bookend)한다. 가속기가 이용가능하지 않다면, ABEGIN과 AEND사이의 명령어들은 정상적으로 실행된다. 그러나, 가속기가 이용가능하고, 가속기를 사용하는 것(예컨대, 더 적은 전력을 사용하는 것)이 바람직할 때, ABEGIN 명령어와 AEND 명령어 사이의 명령어들은 그 가속기 상에서 실행되도록 변환되고 그 가속기 상에서의 실행을 위해 스케줄링된다. 그러므로, 가속기의 사용은 기회주의적이다.
제5 양상에서, 스레드 또는 스레드의 부분들은 ABEGIN 또는 AEND의 사용 없이 가속기로의 (기회주의적) 오프로드를 위해 분석된다. 가속기 상에서 실행가능할 수 있는 코드에 대해, 소프트웨어 또는 하드웨어 패턴 매칭이 스레드 또는 스레드의 부분들에 대해 실행된다. 가속기가 이용가능하지 않거나, 스레드 또는 스레드의 부분들이 가속기 실행에 적합하지 않으면, 스레드의 명령어들은 정상적으로 실행된다. 그러나, 가속기가 이용가능하고, 가속기를 사용하는 것(예컨대, 더 적은 전력을 사용하는 것)이 바람직할 때, 명령어들은 그 가속기 상에서 실행되도록 변환되고 그 가속기 상에서의 실행을 위해 스케줄링된다. 그러므로, 가속기의 사용은 기회주의적이다.
제6 양상에서, 선택된 목적지 처리 요소에 더 잘 맞도록 코드 조각(스레드의 부분)의 변환이 수행된다. 예컨대, 코드 조각은: 1) 상이한 명령어 세트를 활용하도록 변환되고, 2) 더 병렬로 만들어지고, 3) 덜 병렬로 만들어지고(직렬화됨), 4) 데이터 병렬이도록 만들어지고/거나(예컨대, 벡터화됨) 5) 덜 데이터 병렬이도록 만들어진다(예컨대, 비-벡터화됨).
제7 양상에서, (공유되거나 전용되는) 작업 큐는 디바이스에 의해 행해질 작업의 범위를 정의하는 기술어들을 수신한다. 전용 작업 큐들은 단일 애플리케이션에 대한 기술어들을 저장하는 반면, 공유 작업 큐들은 다수의 애플리케이션들에 의해 제출된 기술어들을 저장한다. 하드웨어 인터페이스/중재기(arbiter)는 (예컨대, 각각의 애플리케이션 및 QoS/공정성 정책들의 처리 요건들에 기반하여) 특정된 중재 정책에 따라 작업 큐들로부터의 기술어들을 가속기 처리 엔진들로 디스패치한다.
제8 양상에서, 밀집 행렬 곱셈에 대한 개선은 단일 명령어의 실행으로 2차원 행렬 곱셈을 허용한다. 복수의 패킹된 데이터(SIMD, 벡터) 소스들이 단일 패킹된 데이터 소스에 대해 곱해진다. 일부 예시들에서, 이진 트리가 곱셈들에 사용된다.
도 1은 이종 다중처리 실행 환경의 표현이다. 이러한 예에서, 제1 유형의 코드 조각(예컨대, 소프트웨어 스레드와 연관된 하나 이상의 명령어)이 이종 스케줄러(101)에 의해 수신된다. 코드 조각은, 예컨대, 기계 코드, 중간 표현, 바이트코드, 텍스트 기반 코드(예컨대, 어셈블리 코드, C++와 같은 고레벨 언어의 소스 코드) 등을 포함하는 임의의 수의 소스 코드 표현의 형태일 수 있다. 이종 스케줄러(101)는, 동종 다중프로세서 프로그래밍 모델을 제공한다(예컨대, 모든 스레드들이 스칼라 코어 상에서 그들이 실행 중인 것처럼 사용자 및/또는 운영 체제에 나타나고, 수신된 코드 조각에 대한 작업부하 유형(프로그램 페이즈)을 결정하고, 작업부하를 처리하기 위해, 결정된 작업부하 유형에 대응하는 처리 요소의 유형(스칼라, 비-순차적(OOO; out-of-order), 단일 명령어 다중 데이터(SIMD; single instruction, multiple data), 또는 가속기)을 선택하고(예컨대, 스레드 병렬 코드의 경우 스칼라, 직렬 코드의 경우 OOO, 데이터 병렬의 경우 SIMD, 그리고 데이터 병렬의 경우 가속기), 대응하는 처리 요소에 의한 처리를 위해 코드 조각을 스케줄링하도록 이루어짐). 도 1에 도시된 특정 구현에서, 처리 요소 유형들은 스칼라 코어(들)(103)(이를테면, 순차적 코어들), 연속적으로 저장된 다수의 데이터 요소들을 레지스터가 갖는, 패킹된 데이터 피연산자들에 대해 동작하는 단일 명령어 다중 데이터(SIMD) 코어(들)(105), 낮은 레이턴시의 비-순차적 코어(들)(107), 및 가속기(들)(109)를 포함한다. 일부 실시예들에서, 스칼라 코어(들)(103), 단일 명령어 다중 데이터(SIMD) 코어(들)(105), 낮은 레이턴시의 비-순차적 코어(들)(107)는 이종 프로세서 내에 있고, 가속기(들)(109)는 이러한 이종 프로세서 외부에 있다. 그러나, 처리 요소들의 다양한 상이한 배치들이 활용될 수 있다는 것이 유의되어야 한다. 일부 구현들에서, 이종 스케줄러(101)는, 수신된 코드 조각 또는 그의 부분을 선택된 유형의 처리 요소에 대응하는 포맷으로 변환하거나 해석한다.
처리 요소들(103-109)은 상이한 명령어 세트 아키텍처(ISA)들을 지원할 수 있다. 예컨대, 비-순차적 코어는 제1 ISA를 지원할 수 있고, 순차적 코어는 제2 ISA를 지원할 수 있다. 이러한 제2 ISA는 제1 ISA의 세트(하위 세트 또는 상위 세트)일 수 있거나, 상이할 수 있다. 부가적으로, 처리 요소들은 상이한 마이크로아키텍처들을 가질 수 있다. 예컨대, 제1 비-순차적 코어는 제1 마이크로아키텍처를 지원하고, 순차적 코어는 상이한 제2 마이크로아키텍처를 지원한다. 특정 유형의 처리 요소 내에서라 하더라도 ISA 및 마이크로아키텍처는 상이할 수 있다는 것을 유의한다. 예컨대, 제1 비-순차적 코어는 제1 마이크로아키텍처를 지원할 수 있고, 제2 비-순차적 코어는 상이한 마이크로아키텍처를 지원할 수 있다. 명령어들은, 특정 ISA에 대해, 그 명령어들이 그 특정 ISA의 일부라는 점에서 "고유(native)"하다. 고유 명령어들은 외부 변경들(예컨대, 변환)을 필요로 하지 않으면서 특정 마이크로아키텍처들 상에서 실행된다.
일부 구현들에서, 처리 요소들 중 하나 이상은 단일 다이 상에, 예컨대, 시스템-온-칩(SoC)으로서 통합된다. 그러한 구현들은, 예컨대, 개선된 통신 레이턴시, 제조/비용들, 감소된 핀 계수, 플랫폼 소형화 등으로부터 이익을 얻을 수 있다. 다른 구현들에서, 처리 요소들은 함께 패키징되며, 그에 의해, 단일 다이 상에 있지 않고도 위에서 참조된 SoC의 이점들 중 하나 이상이 달성된다. 이러한 구현들은, 예컨대, 처리 요소 유형별로 최적화된 상이한 프로세스 기술들, 증가된 수율을 위한 더 작은 다이 크기, 독점적 지적 재산 블록들의 통합 등으로부터 더 이익을 얻을 수 있다. 일부 종래의 다중-패키지 제한들에서는, 이질적 디바이스들이 부가되는 경우에 그 디바이스들과의 통신이 난제일 수 있다. 본원에서 논의되는 다중-프로토콜 링크는, 상이한 유형들의 디바이스들에 대한 공통 인터페이스를 사용자, 운영 체제("OS") 등에 제공함으로써 이러한 난제를 최소화하거나 완화시킨다.
일부 구현들에서, 이종 스케줄러(101)는 프로세서 코어(이를테면, OOO 코어(들)(107)) 상에서의 실행을 위해 컴퓨터 판독가능 매체(예컨대, 메모리)에 저장된 소프트웨어로 구현된다. 이러한 구현들에서, 이종 스케줄러(101)는 소프트웨어 이종 스케줄러로 지칭된다. 이러한 소프트웨어는 이진 변환기, 적시("JIT; just-in-time") 컴파일러, 코드 조각들을 포함하는 스레드들의 실행을 스케줄링하기 위한 OS(117), 패턴 매칭기(matcher), 그 내부의 모듈 구성요소, 또는 이들의 조합을 구현할 수 있다.
일부 구현들에서, 이종 스케줄러(101)는, 회로 및/또는 회로에 의해 실행되는 유한 상태 기계로서 하드웨어로 구현된다. 이러한 구현들에서, 이종 스케줄러(101)는 하드웨어 이종 스케줄러로 지칭된다.
프로그래밍적(예컨대, OS(117), 에뮬레이션 계층, 하이퍼바이저, 보안 모니터 등) 관점에서, 각각의 유형의 처리 요소(103-109)는 공유 메모리 어드레스 공간(115)을 활용한다. 일부 구현들에서, 공유 메모리 어드레스 공간(115)은 임의로, 도 2에 예시된 바와 같이, 2가지 유형의 메모리인 메모리(211) 및 메모리(213)를 포함한다. 이러한 구현들에서, 메모리들의 유형들은: 메모리 위치들에서의 (예컨대, 상이한 소켓들 상에 위치하는 등의) 차이들, 대응하는 인터페이스 표준들(예컨대, DDR4, DDR5 등)에서의 차이들, 전력 요건들에서의 차이들, 및/또는 사용되는 기본 메모리 기술들(예컨대, 고 대역폭 메모리(HBM), 동기식 DRAM 등)에서의 차이들을 포함하지만 이에 제한되지 않는 다양한 방식들로 구별될 수 있다.
공유 메모리 어드레스 공간(115)은 각각의 유형의 처리 요소에 의해 액세스가능하다. 그러나, 일부 실시예들에서, 상이한 유형들의 메모리는, 예컨대 작업부하 요구들에 기반하여, 상이한 처리 요소들에 우선적으로 할당될 수 있다. 예컨대, 일부 구현들에서, 플랫폼 펌웨어 인터페이스(예컨대, BIOS 또는 UEFI) 또는 메모리 저장소는 플랫폼에서 이용가능한 메모리 리소스들의 유형들 및/또는 특정 어드레스 범위들 또는 메모리 유형들에 대한 처리 요소 친화성을 표시하는 필드를 포함한다.
이종 스케줄러(101)는, 주어진 시점에서 스레드가 실행되어야 하는 경우를 결정하기 위해 스레드를 분석할 때 이러한 정보를 활용한다. 전형적으로, 스레드 관리 메커니즘은, 스레드 관리 메커니즘이 기존 스레드들을 관리하는 방식에 관해 정보에 근거한 결정을 행하는 데 이용가능한 정보 전체를 고려한다. 이는 다수의 방식들로 발현될 수 있다. 예컨대, 특정 처리 요소에 물리적으로 더 가까운 어드레스 범위에 대한 친화성을 갖는 그 처리 요소 상에서 실행되는 스레드는, 일반적인 상황들 하에서 그 처리 요소 상에서 실행될 스레드에 비해 우선적인 처리를 제공받을 수 있다.
다른 예는, 특정 메모리 유형(예컨대, 더 빠른 버전의 DRAM)으로부터 이익을 얻을 스레드가, 자신의 데이터를 그 메모리 유형으로 물리적으로 이동시키고 공유 어드레스 공간의 그 부분을 가리키도록 코드 내의 메모리 참조들을 조정되게 할 수 있다는 것이다. 예컨대, SIMD 코어(205) 상의 스레드가 제2 메모리 유형(213)을 활용할 수 있지만, 가속기(209)가 활성이고 메모리 유형(213)을 필요로 할 때(또는 적어도 SIMD 코어(205)의 스레드에 할당된 부분을 필요로 할 때) 이러한 사용으로부터 이동되게 될 수 있다.
예시적인 시나리오는 메모리가 다른 처리 요소들보다 하나의 처리 요소에 물리적으로 더 가까울 때이다. 일반적인 경우는, 코어들과 상이한 메모리 유형에 가속기가 직접 연결되는 것이다.
이러한 예들에서, 전형적으로, 데이터 이동을 개시하는 것은 OS이다. 그러나, (이종 스케줄러와 같은) 하위 레벨이 그 자체로 또는 다른 구성요소(예컨대, OS)로부터의 보조와 함께 이러한 기능을 수행하는 것을 방지하는 것이 존재하지 않는다. 이전 처리 요소의 데이터가 플러싱되고 페이지 테이블 엔트리가 무효화되는지 여부는, 데이터 이동을 행하기 위한 구현 및 페널티에 의존한다. 데이터가 즉시 사용될 가능성이 없다면, 하나의 메모리 유형으로부터 다른 메모리 유형으로 데이터를 이동시키기 보다는 저장소로부터 단순히 복사하는 것이 더 실현가능할 수 있다.
도 117(A)-(B)는 공유 메모리 내의 스레드에 대한 이동의 예를 예시한다. 이러한 예에서, 2가지 유형의 메모리는 어드레스 공간을 공유하는데, 각각은 그 공간 내에 자신 고유의 범위의 어드레스들을 갖는다. 117(A)에서, 공유 메모리(11715)는 제1 유형의 메모리(11701) 및 제2 유형의 메모리(11707)를 포함한다. 제1 유형의 메모리(11701)는 제1 어드레스 범위(11703)를 갖고, 그 범위 내에는 스레드 1(11705)에 전용인 어드레스들이 있다. 제2 유형의 메모리(11707)는 제2 어드레스 범위(11709)를 갖는다.
스레드 1(11705)의 실행 동안의 어떤 시점에서, 이종 스케줄러는 스레드 1(11705)을 이동시키는 결정을 행하며, 그에 따라, 제2 스레드(11711)는 스레드 1(11705)에 이전에 배정된 제1 유형의 메모리(11701) 내의 어드레스들을 사용한다. 이는 도 117(B)에 도시되어 있다. 이러한 예에서, 스레드 1(11705)은 제2 유형의 메모리(11707)로 재배정되고, 사용할 새로운 세트의 어드레스들이 주어지지만, 이는 반드시 그러할 필요는 없다. 메모리의 유형들 간의 차이들은 물리적 또는 공간적(예컨대, PE까지의 거리에 기반함)일 수 있다는 것을 유의한다.
도 118은 이종 스케줄러에 의해 수행될 수 있는 스레드 이동을 위한 예시적인 방법을 예시한다. 11801에서, 제1 스레드는 공유 메모리 공간 내의 제1 유형의 메모리를 사용하여 코어 또는 가속기와 같은 제1 처리 요소("PE") 상에서 실행되도록 지향된다. 예컨대, 도 117(A)에서, 이것은 스레드 1이다.
나중의 어떤 시점에, 11803에서, 제2 스레드를 실행하기 위한 요청이 수신된다. 예컨대, 애플리케이션, OS 등은 하드웨어 스레드가 실행될 것을 요청한다.
11805에서, 제2 스레드가 공유 어드레스 공간 내의 제1 유형의 메모리를 사용하여 제2 PE 상에서 실행되어야 한다는 결정이 이루어진다. 예컨대, 제2 스레드는 제1 유형의 메모리에 직접 결합되는 가속기 상에서 실행되고, (제1 스레드가 사용하는 메모리를 자유롭게 하는 것을 포함하는) 실행은 제2 스레드가 제2 유형의 메모리를 사용하게 하는 것보다 더 효율적이다.
일부 실시예들에서, 11807에서, 제1 스레드의 데이터는 제1 유형의 메모리로부터 제2 유형의 메모리로 이동된다. 이는, 단순히 제1 스레드 실행의 실행을 중단하고 그 장소에서 다른 스레드를 시작하는 것이 더 효율적이라면 반드시 발생하는 것은 아니다.
11809에서, 제1 스레드와 연관된 변환 색인 버퍼(TLB) 엔트리들이 무효화된다. 부가적으로, 대부분의 실시예들에서, 데이터의 플러시가 수행된다.
11811에서, 제2 스레드는 제2 PE로 지향되고, 제1 스레드에 이전에 배정된 제1 유형의 메모리 내의 어드레스들의 범위를 배정받는다.
도 3은 이종 스케줄러(301)의 예시적인 구현을 예시한다. 일부 예시들에서, 스케줄러(301)는 런타임 시스템의 일부이다. 예시된 바와 같이, 프로그램 페이즈 검출기(313)는 코드 조각을 수신하고, 코드 조각의 하나 이상의 특성을 식별하여 대응하는 프로그램 실행 페이즈가 직렬로서, 데이터 병렬로서, 또는 스레드 병렬로서 가장 잘 특성화되는지를 결정한다. 이것이 결정되는 방식의 예들이 아래에서 상세히 설명된다. 도 1과 관련하여 상세히 설명된 바와 같이, 코드 조각은 임의의 수의 소스 코드 표현들의 형태일 수 있다.
재발하는 코드 조각들의 경우, 패턴 매칭기(311)는 이러한 "핫" 코드를 식별하고, 일부 예시들에서, 코드 조각과 연관된 작업부하가 상이한 처리 요소 상에서의 처리에 더 적합할 수 있음을 표시하는 대응하는 특성들을 또한 식별한다. 패턴 매칭기(311) 및 그의 동작에 관련된 추가적인 세부사항이 예컨대 도 20의 맥락에서 아래에 기재된다.
선택기(309)는, 처리 요소의 특성들 및 전력 관리자(307)에 의해 제공되는 열 및/또는 전력 정보에 적어도 부분적으로 기반하여, 수신된 코드 조각의 고유 표현을 실행하기 위한 대상 처리 요소를 선택한다. 대상 처리 요소의 선택은 코드 조각에 대해 가장 잘 맞는 것(즉, 작업부하 특성들과 처리 요소 능력들 간의 매칭)을 선택하는 것과 같이 간단할 수 있지만, (예컨대, 전력 관리자(307)에 의해 제공될 수 있는 바와 같은) 시스템의 현재 전력 소비 수준, 처리 요소의 이용가능성, 일 유형의 메모리로부터 다른 유형의 메모리로 이동시킬 데이터의 양(및 그렇게 하기 위한 연관된 페널티) 등을 또한 고려할 수 있다. 일부 실시예들에서, 선택기(309)는, 하드웨어 회로에 구현되거나 하드웨어 회로에 의해 실행되는 유한 상태 기계이다.
일부 실시예들에서, 선택기(309)는 또한 대상 처리 요소와 통신하기 위한 대응하는 링크 프로토콜을 선택한다. 예컨대, 일부 구현들에서, 처리 요소들은 시스템 패브릭 또는 점대점 상호연결들 상에서 복수의 프로토콜들을 동적으로 다중화 또는 캡슐화할 수 있는 대응하는 공통 링크 인터페이스들을 활용한다. 예컨대, 특정 구현들에서, 지원되는 프로토콜들은: 1) 디바이스 발견, 디바이스 구성, 오류 보고, 인터럽트들, DMA-스타일 데이터 전송들 및 하나 이상의 독점 또는 산업 표준(이를테면, 예컨대 PCI 익스프레스 규격 또는 등가의 대안)에 명시될 수 있는 바와 같은 다양한 서비스들을 가능하게 하는 생산자/소비자, 발견, 구성, 인터럽트들(PDCI)의 프로토콜; 2) 디바이스가 일관성있는 판독 및 기입 요청들을 처리 요소에 송출할 수 있게 하는 캐싱 에이전트 일관성(CAC) 프로토콜; 및 3) 처리 요소가 다른 처리 요소의 로컬 메모리에 액세스할 수 있게 하는 메모리 액세스(MA) 프로토콜을 포함한다. 선택기(309)는 처리 요소에 통신될 요청의 유형에 기반하여 이러한 프로토콜들 사이에서 선택을 한다. 예컨대, 생산자/소비자, 발견, 구성 또는 인터럽트 요청은 PDCI 프로토콜을 사용하고, 캐시 일관성 요청은 CAC 프로토콜을 사용하고, 로컬 메모리 액세스 요청은 MA 프로토콜을 사용한다.
일부 구현들에서, 스레드는 페이즈 유형을 표시하기 위한 마커들을 포함하고, 그러므로, 페이즈 검출기는 활용되지 않는다. 일부 구현들에서, 스레드는 처리 요소 유형, 링크 프로토콜 및/또는 메모리 유형에 대한 힌트들 또는 명시적 요청들을 포함한다. 이러한 구현들에서, 선택기(309)는 자신의 선택 프로세스에서 이러한 정보를 활용한다. 예컨대, 선택기(309)에 의한 선택은 스레드 및/또는 사용자에 의해 번복될 수 있다.
구현에 따라, 이종 스케줄러는, 수신된 코드 조각들을 처리하고 대상 처리 요소들에 대한 대응하는 고유 인코딩들을 생성하기 위한 하나 이상의 변환기를 포함할 수 있다. 예컨대, 이종 스케줄러는, 제1 유형의 기계 코드를 제2 유형의 기계 코드로 변환하기 위한 변환기 및/또는 중간 표현을 대상 처리 요소에 대해 고유한 포맷으로 변환하기 위한 적시 컴파일러를 포함할 수 있다. 대안적으로, 또는 그에 부가하여, 이종 스케줄러는, 재발하는 코드 조각들(즉, "핫" 코드)을 식별하고 코드 조각 또는 대응하는 마이크로-연산들의 하나 이상의 고유 인코딩을 캐싱하기 위한 패턴 매칭기를 포함할 수 있다. 이러한 임의적 구성요소들 각각은 도 3에 예시되어 있다. 특히, 이종 스케줄러(301)는 변환기(303) 및 적시 컴파일러(305)를 포함한다. 이종 스케줄러(301)가 객체 코드 또는 중간 표현에 대해 동작할 때, 수신된 코드 조각을 대상 처리 요소들(103, 105, 107, 109) 중 하나 이상에 고유한 포맷으로 변환하기 위해 적시 컴파일러(305)가 호출된다. 이종 스케줄러(301)가 기계 코드(이진)에 대해 동작할 때, 이진 변환기(303)는 수신된 코드 조각을, (예컨대, 하나의 명령어 세트로부터 다른 명령어 세트로 변환할 때와 같이) 대상 처리 요소들 중 하나 이상에 고유한 기계 코드로 변환한다. 대안적인 실시예들에서, 이종 스케줄러(301)는 이러한 구성요소들 중 하나 이상을 생략할 수 있다.
예컨대, 일부 실시예들에서, 이진 변환기가 포함되지 않는다. 이는 프로그래밍 복잡도를 증가시킬 수 있는데, 그 이유는, 잠재적으로 이용가능한 가속기들, 코어들 등을 스케줄러가 처리하게 하는 대신, 프로그램이 이를 고려할 필요가 있을 것이기 때문이다. 예컨대, 프로그램은 상이한 포맷들로 루틴에 대한 코드를 포함할 필요가 있을 수 있다. 그러나, 일부 실시예들에서, 이진 변환기가 존재하지 않을 때, 상위 레벨에서 코드를 수용하는 JIT 컴파일러가 존재하고, JIT 컴파일러는 필요한 변환을 수행한다. 패턴 매칭기가 존재할 때, 특정 처리 요소 상에서 실행되어야 하는 코드를 찾기 위해 핫 코드가 여전히 검출될 수 있다.
예컨대, 일부 실시예들에서, JIT 컴파일러가 포함되지 않는다. 이는 또한 프로그래밍 복잡도를 증가시킬 수 있는데, 그 이유는, 프로그램이, 스케줄러가 그를 처리하게 하는 대신, 특정 ISA에 대한 기계 코드로 먼저 컴파일될 필요가 있을 것이기 때문이다. 그러나, 일부 실시예들에서, 이진 변환기가 존재하고 JIT 컴파일러가 존재하지 않을 때, 스케줄러는 아래에 상세히 설명되는 바와 같이 ISA들 사이에서 변환할 수 있다. 패턴 매칭기가 존재할 때, 특정 처리 요소 상에서 실행되어야 하는 코드를 찾기 위해 핫 코드가 여전히 검출될 수 있다.
예컨대, 일부 실시예들에서, 패턴 매칭기가 포함되지 않는다. 이는 또한 효율을 감소시킬 수 있는데, 그 이유는, 이동되었을 수 있는 코드가 실행 중인 특정 태스크에 덜 효율적인 코어 상에 유지될 가능성이 더 높기 때문이다.
일부 실시예들에서, 이진 변환기, JIT 컴파일러, 또는 패턴 매칭기가 존재하지 않는다. 이러한 실시예들에서는, 스레드/처리 요소 배정/이전에서 페이즈 검출 또는 스레드를 이동시키기 위한 명시적 요청들만이 활용된다.
다시 도 1 내지 도 3을 참조하면, 이종 스케줄러(101)는 하드웨어(예컨대, 회로), 소프트웨어(예컨대, 실행가능한 프로그램 코드), 또는 이들의 임의의 조합으로 구현될 수 있다. 도 114는 하드웨어 이종 스케줄러 회로 및 메모리와 그 스케줄러 회로의 상호작용의 예를 예시한다. 이종 스케줄러는, 필드 프로그래밍가능 게이트 어레이(FPGA) 기반 또는 주문형 집적 회로(ASIC) 기반 상태 기계로서, 본원에서 상세히 설명된 기능성을 제공하기 위한 소프트웨어가 내부에 저장된 메모리에 결합된 내장형 마이크로제어기로서, 다른 하위 구성요소들(예컨대, 데이터 위험 검출 회로 등)을 포함하는 논리 회로, 및/또는 비-순차적 코어에 의해 실행되는 소프트웨어(예컨대, 상태 기계)로서, 스칼라 코어에 의해 실행되는 소프트웨어(예컨대, 상태 기계)로서, SIMD 코어에 의해 실행되는 소프트웨어(예컨대, 상태 기계)로서, 또는 이들의 조합을 포함하지만 이에 제한되지 않는 많은 상이한 방식들로 만들어질 수 있다. 예시된 예에서, 이종 스케줄러는 다양한 기능들을 수행하기 위한 하나 이상의 구성요소를 포함하는 회로(11401)이다. 일부 실시예들에서, 이러한 회로(11401)는 프로세서 코어(11419)의 일부이지만, 회로(11401)는 칩셋의 일부일 수 있다.
스레드/처리 요소(PE) 추적기(11403)는 시스템 및 각각의 PE에서 실행 중인 각각의 스레드에 대한 상태(예컨대, PE의 이용가능성, 그의 현재 전력 소비 등)를 유지한다. 예컨대, 추적기(11403)는 테이블과 같은 데이터 구조에서 활성, 유휴 또는 비활성의 상태를 유지한다.
일부 실시예들에서, 패턴 매칭기(11405)는 "핫" 코드, 가속기 코드, 및/또는 PE 할당을 요청하는 코드를 식별한다. 이러한 매칭에 관한 더 많은 세부사항들이 나중에 제공된다.
PE 정보(11409)는 어떤 PE들(및 그들의 유형)이 시스템 내에 있는지 그리고 어떤 PE들이 OS에 의해 스케줄링될 수 있는지 등에 관한 정보를 저장한다.
이종 스케줄러 회로(11401) 내의 별개의 구성요소들로서 위에서 상세히 설명되었지만, 구성요소들은 이종 스케줄러 회로(11401)와 결합되고/거나 그 외부로 이동될 수 있다.
이종 스케줄러 회로(11401)에 결합된 메모리(11413)는 부가적인 기능성을 제공하는, (코어 및/또는 이종 스케줄러 회로(11401)에 의해) 실행될 소프트웨어를 포함할 수 있다. 예컨대, "핫" 코드, 가속기 코드, 및/또는 PE 할당을 요청하는 코드를 식별하는 소프트웨어 패턴 매칭기(11417)가 사용될 수 있다. 예컨대, 소프트웨어 패턴 매칭기(11417)는 코드 시퀀스를 메모리에 저장된 미리 결정된 세트의 패턴들과 비교한다. 메모리는 또한, 하나의 명령어 세트로부터 다른 명령어 세트로(이를테면, 하나의 명령어 세트로부터 가속기 기반 명령어들 또는 프리미티브(primitive)들로) 코드를 변환하기 위한 변환기를 저장할 수 있다.
이러한 구성요소들은, 스레드를 실행하기 위한 PE, 어떤 링크 프로토콜을 사용할 것인지, 그 PE 상에서 실행 중인 스레드가 이미 존재하는 경우에 어떤 이전이 발생해야 하는지 등의 선택을 행하는 선택기(11411)에 공급을 제공한다. 일부 실시예들에서, 선택기(11411)는, 하드웨어 회로에 구현되거나 하드웨어 회로에 의해 실행되는 유한 상태 기계이다.
메모리(11413)는 또한, 예컨대, 일부 구현들에서, 선택된 PE에 대한 상이한 포맷으로 스레드 코드를 변환하기 위한, 메모리에 저장되는 하나 이상의 변환기(11415)(예컨대, 이진, JIT 컴파일러 등)를 포함할 수 있다.
도 115는 소프트웨어 이종 스케줄러의 예를 예시한다. 소프트웨어 이종 스케줄러는, 필드 프로그래밍가능 게이트 어레이(FPGA) 기반 또는 주문형 집적 회로(ASIC) 기반 상태 기계로서, 본원에서 상세히 설명된 기능성을 제공하기 위한 소프트웨어가 내부에 저장된 메모리에 결합된 내장형 마이크로제어기로서, 다른 하위 구성요소들(예컨대, 데이터 위험 검출 회로 등)을 포함하는 논리 회로, 및/또는 비-순차적 코어에 의해 실행되는 소프트웨어(예컨대, 상태 기계)로서, 스칼라 코어에 의해 실행되는 소프트웨어(예컨대, 상태 기계)로서, SIMD 코어에 의해 실행되는 소프트웨어(예컨대, 상태 기계)로서, 또는 이들의 조합을 포함하지만 이에 제한되지 않는 많은 상이한 방식들로 만들어질 수 있다. 예시된 예에서, 소프트웨어 이종 스케줄러는 메모리(11413)에 저장된다. 이와 같이, 프로세서 코어(11419)에 결합된 메모리(11413)는 스레드들을 스케줄링하기 위해 (코어에 의해) 실행될 소프트웨어를 포함한다. 일부 실시예들에서, 소프트웨어 이종 스케줄러는 OS의 일부이다.
구현에 따라, 코어 내의 스레드/처리 요소(PE) 추적기(11403)는 시스템 및 각각의 PE에서 실행 중인 각각의 스레드에 대한 상태(예컨대, PE의 이용가능성, 그의 현재 전력 소비 등)를 유지하거나, 이는, 스레드/PE 추적기(11521)를 사용하여 소프트웨어에서 수행된다. 예컨대, 추적기는 테이블과 같은 데이터 구조에서 활성, 유휴 또는 비활성의 상태를 유지한다.
일부 실시예들에서, 패턴 매칭기(11405)는 "핫" 코드 및/또는 PE 할당을 요청하는 코드를 식별한다. 이러한 매칭에 관한 더 많은 세부사항들이 나중에 제공된다.
PE 정보(11409 및/또는 11509)는 어떤 PE들이 시스템 내에 있는지 그리고 어떤 PE들이 OS에 의해 스케줄링될 수 있는지 등에 관한 정보를 저장한다.
"핫" 코드, 가속기 코드, 및/또는 PE 할당을 요청하는 코드를 식별하는 소프트웨어 패턴 매칭기(11417)가 사용될 수 있다.
스레드/PE 추적기, 처리 요소 정보, 및/또는 패턴 매치들은, 스레드를 실행하기 위한 PE, 어떤 링크 프로토콜을 사용할 것인지, 그 PE 상에서 실행 중인 스레드가 이미 존재하는 경우에 어떤 이전이 발생해야 하는지 등의 선택을 행하는 선택기(11411)에 공급된다. 일부 실시예들에서, 선택기(11411)는 프로세서 코어(11419)에 의해 실행되게 구현되는 유한 상태 기계이다.
메모리(11413)는 또한, 예컨대, 일부 구현들에서, 선택된 PE에 대한 상이한 포맷으로 스레드 코드를 변환하기 위한, 메모리에 저장되는 하나 이상의 변환기(11415)(예컨대, 이진, JIT 컴파일러 등)를 포함할 수 있다.
동작 시, OS는, 실행 환경의 추상화를 제공하는 이종 스케줄러(이를테면, 예컨대 이종 스케줄러들(101, 301))를 활용하여 스레드들을 스케줄링하고 스레드들이 처리되게 한다.
아래의 표는 잠재적 추상화 특징들(예컨대, 프로그램이 보는 것), 잠재적 설계 자유도 및 아키텍처 최적화들(즉, 프로그래머로부터 숨겨진 것), 및 추상화에서 특정 특징을 제공하기 위한 잠재적인 이익들 또는 이유들을 요약한다.
Figure 112020130859394-pat00001
일부 예시적인 구현들에서, 이종 스케줄러는, 다른 하드웨어 및 소프트웨어 리소스들과 조합되어, 모든 것을 실행하고 모든 프로그래밍 기법들(예컨대, 컴파일러, 내장형(intrinsics), 어셈블리, 라이브러리들, JIT, 오프로드, 디바이스)을 지원하는 전체 프로그래밍 모델을 제공한다. 다른 예시적인 구현들은 ARM 홀딩스 리미티드(ARM Holdings, Ltd.), MIPS, IBM, 또는 이들의 실시권자들 또는 사용인들과 같은 다른 프로세서 개발 회사들에 의해 제공되는 것들을 따르는 대안적인 실행 환경들을 제공한다.
도 119는 위에 상세히 설명된 바와 같은 추상적 실행 환경을 제공하도록 구성되는 프로세서의 블록도이다. 이러한 예에서, 프로세서(11901)는 도 1에 상세히 설명된 것들과 같은 여러 상이한 코어 유형들을 포함한다. 각각의 (광역) SIMD 코어(11903)는 밀집 산술 프리미티브들을 지원하는 융합된 곱셈 누산/가산(FMA; fused multiply accumulate/add) 회로, 그의 고유 캐시(예컨대, L1 및 L2), 특수 목적 실행 회로, 및 스레드 상태들에 대한 저장소를 포함한다.
각각의 레이턴시-최적화된(OOO) 코어(11913)는 융합된 곱셈 누산/가산(FMA) 회로, 그의 고유 캐시(예컨대, L1 및 L2), 및 비-순차적 실행 회로를 포함한다.
각각의 스칼라 코어(11905)는 융합된 곱셈 누산/가산(FMA) 회로, 그의 고유 캐시(예컨대, L1 및 L2), 특수 목적 실행 회로를 포함하며, 스레드 상태들을 저장한다. 전형적으로, 스칼라 코어들(11905)은 메모리 레이턴시를 커버하기에 충분한 스레드들을 지원한다. 일부 구현들에서, SIMD 코어들(11903) 및 레이턴시-최적화된 코어들(11913)의 수는 스칼라 코어들(11905)의 수와 비교하여 적다.
일부 실시예들에서, 하나 이상의 가속기(11905)가 포함된다. 이러한 가속기들(11905)은 고정 기능 또는 FPGA 기반일 수 있다. 이러한 가속기들(11905)에 대해 대안적으로, 또는 그에 부가하여, 일부 실시예들에서, 가속기들(11905)은 프로세서 외부에 있다.
프로세서(11901)는 또한, 코어들 및 잠재적으로는 프로세서 내에 있는 임의의 가속기들에 의해 공유되는 최종 레벨 캐시(LLC; last level cache)(11907)를 포함한다. 일부 실시예들에서, LLC(11907)는 고속의 원자적 동작(atomics)을 위한 회로를 포함한다.
하나 이상의 상호연결부(11915)는 코어들 및 가속기들을 서로에 대해 그리고 외부 인터페이스들에 결합시킨다. 예컨대, 일부 실시예들에서, 메시 상호연결부는 다양한 코어들을 결합시킨다.
메모리 제어기(11909)는 코어들 및/또는 가속기들을 메모리에 결합시킨다.
복수의 입력/출력 인터페이스들(예컨대, PCIe, 아래에 상세히 설명되는 공통 링크)(11911)은 프로세서(11901)를 다른 프로세서들 및 가속기들과 같은 외부 디바이스들에 연결한다.
도 4는 컴퓨터 시스템의 시스템 부팅 및 디바이스 발견의 실시예를 예시한다. 예컨대, 어떤 코어들이 이용가능한지, 얼마나 많은 메모리가 이용가능한지, 코어들에 대한 메모리 위치들 등을 포함하는 시스템에 대한 정보가 이종 스케줄러에 의해 활용된다. 일부 실시예들에서, 이러한 정보는 진보된 구성과 전력 인터페이스(ACPI; Advanced Configuration and Power Interface)를 사용하여 구축된다.
401에서, 컴퓨터 시스템이 부팅된다.
403에서, 구성 설정들에 대한 질의가 이루어진다. 예컨대, 일부 BIOS 기반 시스템들에서, 부팅될 때, BIOS는 시스템을 테스트하고, 드라이브 및 다른 구성 설정들에 대해 자신 고유의 메모리 뱅크에 질의함으로써 연산을 위해 컴퓨터를 준비한다.
405에서, 플러그-인된 구성요소들에 대한 검색이 이루어진다. 예컨대, BIOS는 컴퓨터에서 임의의 플러그-인 구성요소들을 검색하고, 그러한 루틴들에 액세스하기 위해 메모리에 포인터들(인터럽트 벡터들)을 설정한다. BIOS는 디바이스 드라이버들뿐만 아니라 하드웨어 및 다른 주변 디바이스들과 인터페이싱하기 위한 애플리케이션 프로그램들로부터의 요청들을 수용한다.
407에서, 시스템 구성요소들(예컨대, 코어들, 메모리 등)의 데이터 구조가 생성된다. 예컨대, BIOS는 전형적으로 하드웨어 디바이스 및 주변 디바이스 구성 정보를 생성하고, 그로부터, OS가, 부착된 디바이스들과 인터페이싱한다. 추가로, ACPI는 시스템 보드에 대한 유연성 및 규모조정가능한 하드웨어 인터페이스를 정의하고, 특히 노트북 컴퓨터들과 같은 휴대용 디바이스들에서, 컴퓨터가 개선된 전력 관리를 위해 자신의 주변기기들을 켜거나 끌 수 있게 한다. ACPI 규격은 하드웨어 인터페이스들, 소프트웨어 인터페이스들(API들), 및 구현될 때, OS-지향 구성 및 전력 관리를 지원하는 데이터 구조들을 포함한다. 소프트웨어 설계자들은, ACPI를 사용하여, 하드웨어, 운영 체제 및 애플리케이션 소프트웨어를 비롯한 컴퓨터 시스템 전체에 걸쳐 전력 관리 특징들을 통합할 수 있다. 이러한 통합은, OS가, 어느 디바이스들이 활성인지를 결정할 수 있게 하고, 컴퓨터 서브시스템들 및 주변기기들에 대한 전력 관리 리소스들 모두를 처리할 수 있게 한다.
409에서, 운영 체제(OS)가 로딩되고 제어를 획득한다. 예컨대, 일단 BIOS가 자신의 시동 루틴들을 완료하면, BIOS는 OS에 제어를 넘긴다. ACPI BIOS가 컴퓨터의 제어를 OS에 넘길 때, BIOS는, 트리로서 그래픽으로 표현될 수 있는, ACPI 명칭 공간을 포함하는 데이터 구조를 OS로 내보낸다. 명칭 공간은 컴퓨터에 연결된 ACPI 디바이스들의 디렉토리로서 역할하고, 각각의 ACPI 디바이스에 대한 상태 정보를 추가로 정의하거나 제공하는 객체들을 포함한다. 트리 내의 각각의 노드는 디바이스와 연관되는 한편, 노드들, 서브노드들, 및 리프(leaf)들은, OS에 의해 평가될 때, ACPI 규격에 의해 정의된 바와 같이 디바이스를 제어하거나 특정된 정보를 OS에 반환할 객체들을 표현한다. OS, 또는 OS에 의해 액세스되는 드라이버는 명칭 공간 객체들을 열거하고 평가하는 함수들의 세트를 포함할 수 있다. OS가 ACPI 명칭 공간 내의 객체의 값을 반환하기 위한 함수를 호출할 때, OS는 그 객체를 평가한다고 일컬어진다.
일부 예시들에서, 이용가능한 디바이스들은 변경된다. 예컨대, 가속기, 메모리 등이 부가된다. 시스템 부팅 후 디바이스 발견을 위한 방법의 실시예가 도 116에 예시된다. 예컨대, 이러한 방법의 실시예들은, 부팅 후에 시스템에 부가된 가속기를 발견하는 데 사용될 수 있다. 11601에서, 전원이 켜지거나 리셋된 연결된 디바이스의 표시가 수신된다. 예컨대, 종점 디바이스는 PCIe 슬롯에 플러그 인되거나, 예컨대 OS에 의해 리셋된다.
11603에서, 연결된 디바이스를 이용하여 링크 훈련이 수행되고, 연결된 디바이스가 초기화된다. 예컨대, 링크 폭, 레인 극성들, 및/또는 최대 지원 데이터 레이트와 같은 링크 구성 파라미터들을 설정하기 위해 PCIe 링크 훈련이 수행된다. 일부 실시예들에서, 연결된 디바이스의 능력들이 (예컨대, ACPI 테이블에) 저장된다.
연결된 디바이스가 초기화를 완료할 때, 11605에서, 준비 메시지가 연결된 디바이스로부터 시스템으로 전송된다.
11607에서, 연결된 디바이스 준비 상태 비트가, 디바이스가 구성을 위해 준비되어 있음을 표시하도록 설정된다.
11609에서, 초기화된 연결된 디바이스가 구성된다. 일부 실시예들에서, 디바이스 및 OS는 디바이스에 대한 어드레스(예컨대, 메모리 맵핑된 I/O(MMIO) 어드레스)에 대해 합의한다. 디바이스는, 판매사(vendor) 식별 번호(ID), 디바이스 ID, 모델 번호, 일련 번호, 특성들, 리소스 요건들 등 중 하나 이상을 포함하는 디바이스 기술어를 제공한다. OS는, 기술어 데이터 및 시스템 리소스들에 기반하여 디바이스에 대한 부가적인 동작 및 구성 파라미터들을 결정할 수 있다. OS는 구성 질의들을 생성할 수 있다. 디바이스는 디바이스 기술어들로 응답할 수 있다. 이어서, OS는 구성 데이터를 생성하고, 이 데이터를 (예컨대, PCI 하드웨어를 통해) 디바이스에 전송한다. 이는, 디바이스와 연관된 어드레스 공간을 정의하기 위해 기준 어드레스 레지스터들의 설정을 포함할 수 있다.
시스템의 정보가 구축된 후에, OS는 스레드들을 스케줄링하여 스레드들로 하여금 이종 스케줄러(이를테면, 예컨대 이종 스케줄러들(101, 301))를 활용하여 처리되게 한다. 그런 다음, 이종 스케줄러는 각각의 스레드의 코드 조각들을 동적으로 그리고 (예컨대, 사용자 및/또는 OS에 대해) 투명하게, 가장 적합한 유형의 처리 요소에 맵핑하며, 그에 의해, 레거시 아키텍처 특징들에 대해 하드웨어를 구축할 필요성이 잠재적으로 피해지고, 잠재적으로는, 시스템 프로그래머 또는 OS에 마이크로아키텍처의 세부사항들을 노출시킬 필요성이 피해진다.
일부 예들에서, 가장 적합한 유형의 처리 요소는 처리 요소들의 능력들 및 코드 조각의 실행 특성들에 기반하여 결정된다. 일반적으로, 프로그램들 및 연관된 스레드들은 주어진 시점에서 처리되는 작업부하에 따라 상이한 실행 특성들을 가질 수 있다. 예시적인 실행 특성들 또는 실행 페이즈들은, 예컨대, 데이터 병렬 페이즈들, 스레드 병렬 페이즈들, 및 직렬 페이즈들을 포함한다. 아래의 표는 이러한 페이즈들을 식별하고 그들의 특성들을 요약한다. 표는 또한, 예시적인 작업부하들/동작들, 각각의 페이즈 유형을 처리하는 데 유용한 예시적인 하드웨어, 및 사용되는 하드웨어 및 페이즈의 전형적인 목표를 포함한다.
Figure 112020130859394-pat00002
일부 구현들에서, 이종 스케줄러는, 스레드 이전 및 에뮬레이션 사이에서 선택하도록 구성된다. 각각의 유형의 처리 요소가 임의의 유형의 작업부하를 처리할 수 있는 구성들(때때로, 그렇게 하기 위해 에뮬레이션을 요구함)에서, 가장 적합한 처리 요소는, 예컨대, 작업부하의 레이턴시 요건들, 에뮬레이션과 연관된 증가된 실행 레이턴시, 처리 요소들의 전력 및 열 특성들, 및 제약들 등을 포함하는 하나 이상의 기준에 기반하여 각각의 프로그램 페이즈에 대해 선택된다. 나중에 상세히 설명되는 바와 같이, 적합한 처리 요소의 선택은, 일부 구현들에서, 실행 중인 스레드들의 수를 고려하고 코드 조각에서 SIMD 명령어들 또는 벡터화가능한 코드의 존재를 검출함으로써 달성된다.
처리 요소들 사이에서 스레드를 이동시키는 것은 페널티가 없지 않다. 예컨대, 데이터는 공유 캐시로부터 하위 레벨 캐시로 이동될 필요가 있을 수 있고, 원래의 처리 요소 및 수신자 처리 요소 둘 모두는 이동을 수용하기 위해 자신의 파이프라인들을 플러싱할 것이다. 따라서, 일부 구현들에서, 이종 스케줄러는 너무 빈번한 이전들을 피하기 위해 (예컨대, 위에 참조된 하나 이상의 기준 또는 그 서브세트에 대한 임계값들을 설정함으로써) 히스테리시스를 구현한다. 일부 실시예들에서, 히스테리시스는 미리 정의된 비율(예컨대, 밀리초당 하나의 이전)을 초과하지 않도록 스레드 이전들을 제한함으로써 구현된다. 이와 같이, 이전율은 코드 생성, 동기화, 및 데이터 이전으로 인한 과도한 과부하를 피하기 위해 제한된다.
일부 실시예들에서, 예컨대, 이종 스케줄러에 의해 특정 스레드에 대한 바람직한 접근법으로서 이전이 선택되지 않을 때, 이종 스케줄러는 할당된 처리 요소 내의 스레드에 대한 누락된 기능성을 에뮬레이팅한다. 예컨대, 운영 체제에 이용가능한 스레드들의 총 수가 일정하게 유지되는 실시예에서, 이종 스케줄러는 (예컨대, 광역 동시 다중스레딩 코어에서) 이용가능한 하드웨어 스레드들의 수가 초과신청될 때 다중스레딩을 에뮬레이팅할 수 있다. 스칼라 또는 레이턴시 코어에서, 스레드의 하나 이상의 SIMD 명령어는 스칼라 명령어들로 변환되거나, SIMD 코어 상에서, 더 많은 스레드들이 생성되고/거나 명령어들이 변환되어 패킹된 데이터를 활용한다.
도 5는 3가지 유형의 처리 요소들에 대한 프로그램 페이즈들의 맵핑에 기반한 스레드 이전의 예를 예시한다. 도시된 바와 같이, 3가지 유형의 처리 요소들은 레이턴시-최적화형(예컨대, 비-순차적 코어, 가속기 등), 스칼라(명령어당 한 번에 하나의 데이터 항목을 처리함), 및 SIMD(명령어당 복수의 데이터 요소들을 처리함)를 포함한다. 전형적으로, 이러한 맵핑은 스레드 또는 코드 조각 단위로 프로그래머와 운영 체제에 대해 투명한 방식으로 이종 스케줄러에 의해 수행된다.
일 구현은, 작업부하의 각각의 페이즈를 가장 적합한 유형의 처리 요소에 맵핑하기 위해 이종 스케줄러를 사용한다. 이상적으로, 이는 레거시 특징들에 대해 하드웨어를 구축할 필요성을 완화하고, 이종 스케줄러가, 컴파일된 코드(기계 코드), 내장형(프로세서 또는 가속기 명령어들에 직접 맵핑하는 프로그래밍 언어 구조들), 어셈블리 코드, 라이브러리들, 중간형(JIT 기반), 오프로드(하나의 기계 유형으로부터 다른 기계 유형으로 이동), 및 디바이스 특정형과 같은 다수의 코드 유형들을 지원하는 전체 프로그래밍 모델을 제공한다는 점에서 마이크로아키텍처의 세부사항들을 노출시키는 것을 피한다.
특정 구성들에서, 대상 처리 요소에 대한 기본 선택은 레이턴시-최적화된 처리 요소이다.
다시 도 5를 참조하면, 작업부하에 대한 직렬 실행 페이즈(501)는 처음에 하나 이상의 레이턴시-최적화된 처리 요소 상에서 처리된다. (예컨대, 실행 전에 또는 실행 동안 코드에서 발견되는 명령어들의 유형에 의해 보이는 바와 같이 실행 보다 앞서, 또는 코드가 더 데이터 병렬이 됨에 따라 동적 방식으로) 페이즈 변이의 검출 시, 작업부하는, 데이터 병렬 실행 페이즈(503)를 완료하기 위해 하나 이상의 SIMD 처리 요소로 이전된다. 부가적으로, 실행 스케줄들 및/또는 변환들은 전형적으로 캐싱된다. 그 후, 작업부하는 다음 직렬 실행 페이즈(505)를 완료하기 위해, 하나 이상의 레이턴시-최적화된 처리 요소로 또는 제2 세트의 하나 이상의 레이턴시 최적화된 처리 요소로 다시 이전된다. 다음으로, 스레드 병렬 실행 페이즈(507)를 처리하기 위해, 작업부하는 하나 이상의 스칼라 코어로 이전된다. 그런 다음, 다음 직렬 실행 페이즈(509)의 완료를 위해, 작업부하는 하나 이상의 레이턴시-최적화된 처리 요소로 다시 이전된다.
이러한 예시적인 예는 레이턴시-최적화된 코어로의 반환을 도시하지만, 이종 스케줄러는 스레드가 종결될 때까지 하나 이상의 대응하는 유형들의 처리 요소 상에서의 임의의 후속 실행 페이즈들의 실행을 계속할 수 있다. 일부 구현들에서, 처리 요소는 완료될 태스크들을 저장하기 위해 작업 큐들을 활용한다. 이와 같이, 태스크들은 즉시 시작되지는 않을 수 있지만, 큐에서의 그들의 스폿이 도래함에 따라 실행된다.
도 6은, 예컨대 이종 스케줄러(101)와 같은 이종 스케줄러에 의해 수행되는 예시적인 구현 흐름이다. 이러한 흐름은 처리 요소(예컨대, 코어)의 선택을 도시한다. 예시된 바와 같이, 코드 조각은 이종 스케줄러에 의해 수신된다. 일부 실시예들에서, 이벤트가 발생했으며, 이는, 스레드 기상 명령; 페이지 디렉토리 기준 레지스터에 대한 기입; 휴면 명령; 스레드에서의 페이즈 변화; 및 원하는 재할당을 표시하는 하나 이상의 명령어를 포함하지만 이에 제한되지 않는다.
601에서, 이종 스케줄러는, 예컨대, 검출된 데이터 의존성들, 명령어 유형들, 및/또는 제어 흐름 명령어들에 기반하여 코드 조각에 병렬성이 존재하는지(예컨대, 직렬 페이즈의 코드 조각인지 또는 병렬 페이즈의 코드 조각인지)를 결정한다. 예컨대, SIMD 코드로 가득찬 스레드는 병렬로 간주될 것이다. 코드 조각이 병렬 처리로 처리가능하지 않으면, 이종 스케줄러는, 직렬 실행 페이즈(603)에서 코드 조각을 처리하기 위해 하나 이상의 레이턴시 민감 처리 요소(예컨대, OOO 코어)를 선택한다. 전형적으로, OOO 코어들은 (심화) 추론 및 동적 스케줄링을 갖고, 일반적으로, 더 간단한 대안들과 비교하여 더 낮은 와트당 성능을 갖는다.
일부 실시예들에서, 레이턴시 민감 처리 요소는, 그들이 전형적으로 스칼라 코어들보다 더 많은 전력 및 다이 공간을 소비하므로 이용가능하지 않다. 이러한 실시예들에서, 스칼라, SIMD 및 가속기 코어들만이 이용가능하다.
병렬 코드 조각들, 병렬화가능한 코드 조각들, 및/또는 벡터화가능한 코드 조각들에 대해, 이종 스케줄러는 605에서 코드의 병렬성의 유형을 결정한다. 스레드 병렬 코드 조각들에 대해, 이종 스케줄러는 607에서 스레드 병렬 처리 요소(예컨대, 다중프로세서 스칼라 코어들)를 선택한다. 스레드 병렬 코드 조각들은, 별개의 스칼라 코어들 상에서 동시에 실행될 수 있는 독립적인 명령어 시퀀스들을 포함한다.
데이터 병렬 코드는, 각각의 처리 요소가 상이한 데이터 단편들에 대해 동일한 태스크를 실행할 때 발생한다. 데이터 병렬 코드는 상이한 데이터 레이아웃들: 패킹형 및 무작위로 도입될 수 있다. 609에서, 데이터 레이아웃이 결정된다. 무작위 데이터는 SIMD 처리 요소들에 배정될 수 있지만, 이질적 메모리 위치들로부터 데이터를 가져오기 위한 수집 명령어들(613), 공간적 컴퓨팅 어레이(615)(작은 프로그래밍가능 처리 요소들의 어레이, 예컨대, FPGA들의 어레이 상으로 계산을 공간적으로 맵핑함) 또는 스칼라 처리 요소들의 어레이(617)의 활용을 요구한다. 611에서, 패킹된 데이터는 SIMD 처리 요소들 또는 밀집 산술 프리미티브들을 사용하는 처리 요소들에 배정된다.
일부 실시예들에서, 선택된 목적지 처리 요소에 더 잘 맞도록 코드 조각의 변환이 수행된다. 예컨대, 코드 조각은: 1) 상이한 명령어 세트를 활용하도록 변환되고, 2) 더 병렬로 만들어지고, 3) 덜 병렬로 만들어지고(직렬화됨), 4) 데이터 병렬이도록 만들어지고/거나(예컨대, 벡터화됨) 5) 덜 데이터 병렬이도록 만들어진다(예컨대, 비-벡터화됨).
처리 요소가 선택된 후에, 코드 조각은, 실행을 위해, 결정된 처리 요소들 중 하나에 송신된다.
도 7은 이종 스케줄러에 의한 스레드 목적지 선택을 위한 방법의 예를 예시한다. 일부 실시예들에서, 이러한 방법은 이진 변환기에 의해 수행된다. 701에서, 평가될 스레드, 또는 그의 코드 조각이 수신된다. 일부 실시예들에서, 이벤트가 발생했으며, 이는, 스레드 기상 명령; 페이지 디렉토리 기준 레지스터에 대한 기입; 휴면 명령; 스레드에서의 페이즈 변화; 및 원하는 재할당을 표시하는 하나 이상의 명령어를 포함하지만 이에 제한되지 않는다.
703에서, 코드 조각이 가속기로 오프로딩되어야 하는지의 결정이 이루어진다. 예컨대, 이는, 가속기에 전송될 코드 조각이 있는지이다. 이종 스케줄러는, 코드가, 가속기를 사용하고자 하는 요구를 식별하는 코드를 포함할 때, 이것이 올바른 동작임을 알 수 있다. 이러한 요구는, 코드의 구역이 가속기 상에서 실행될 수 있거나 본연적으로 실행될 수 있음을 표시하는 식별자(예컨대, 본원에서 설명되는 ABEGIN/AEND) 또는 특정 가속기를 사용하기 위한 명시적 명령일 수 있다.
일부 실시예들에서, 705에서, 선택된 목적지 처리 요소에 더 잘 맞도록 코드 조각의 변환이 수행된다. 예컨대, 코드 조각은: 1) 상이한 명령어 세트를 활용하도록 변환되고, 2) 더 병렬로 만들어지고, 3) 덜 병렬로 만들어지고(직렬화됨), 4) 데이터 병렬이도록 만들어지고/거나(예컨대, 벡터화됨) 5) 덜 데이터 병렬이도록 만들어진다(예컨대, 비-벡터화됨).
전형적으로, 707에서, 변환된 스레드는 나중의 사용을 위해 캐싱된다. 일부 실시예들에서, 이진 변환기는, 변환된 스레드가 향후에 이진 변환기의 사용에 이용가능하도록, 변환된 스레드를 국부적으로 캐싱한다. 예컨대, 코드가 "핫"(반복적으로 실행됨)이 되는 경우, 캐시는 (비록 송신 비용이 존재할 수 있긴 하지만) 변환 페널티 없이 향후의 사용을 위한 메커니즘을 제공한다.
709에서, (변환된) 스레드는 처리를 위해 목적지 처리 요소에 송신(예컨대, 오프로딩)된다. 일부 실시예들에서, 변환된 스레드는, 변환된 스레드가 향후의 사용에 국부적으로 이용가능하도록 수신자에 의해 캐싱된다. 또한, 코드가 "핫"이라고 수신자 또는 이진 변환기가 결정하는 경우, 이러한 캐싱은, 에너지가 덜 사용되는 더 빠른 실행을 가능하게 할 것이다.
711에서, 이종 스케줄러는, 예컨대, 검출된 데이터 의존성들, 명령어 유형들, 및/또는 제어 흐름 명령어들에 기반하여 코드 조각에 병렬성이 존재하는지(예컨대, 직렬 페이즈의 코드 조각인지 또는 병렬 페이즈의 코드 조각인지)를 결정한다. 예컨대, SIMD 코드로 가득찬 스레드는 병렬로 간주될 것이다. 코드 조각이 병렬 처리로 처리가능하지 않으면, 이종 스케줄러는, 직렬 실행 페이즈(713)에서 코드 조각을 처리하기 위해 하나 이상의 레이턴시 민감 처리 요소(예컨대, OOO 코어)를 선택한다. 전형적으로, OOO 코어들은 (심화) 추론 및 동적 스케줄링을 갖고, 그에 따라, 스칼라 대안들과 비교하여 더 양호한 와트당 성능을 가질 수 있다.
일부 실시예들에서, 레이턴시 민감 처리 요소는, 그들이 전형적으로 스칼라 코어들보다 더 많은 전력 및 다이 공간을 소비하므로 이용가능하지 않다. 이러한 실시예들에서, 스칼라, SIMD 및 가속기 코어들만이 이용가능하다.
병렬 코드 조각들, 병렬화가능한 코드 조각들, 및/또는 벡터화가능한 코드 조각들에 대해, 이종 스케줄러는 715에서 코드의 병렬성의 유형을 결정한다. 스레드 병렬 코드 조각들에 대해, 이종 스케줄러는 717에서 스레드 병렬 처리 요소(예컨대, 다중프로세서 스칼라 코어들)를 선택한다. 스레드 병렬 코드 조각들은, 별개의 스칼라 코어들 상에서 동시에 실행될 수 있는 독립적인 명령어 시퀀스들을 포함한다.
데이터 병렬 코드는, 각각의 처리 요소가 상이한 데이터 단편들에 대해 동일한 태스크를 실행할 때 발생한다. 데이터 병렬 코드는 상이한 데이터 레이아웃들: 패킹형 및 무작위로 도입될 수 있다. 719에서, 데이터 레이아웃이 결정된다. 무작위 데이터는 SIMD 처리 요소들에 배정될 수 있지만, 수집 명령어들(723), 공간 컴퓨팅 어레이(725), 또는 스칼라 처리 요소들의 어레이(727)의 활용을 요구한다. 721에서, 패킹된 데이터는 SIMD 처리 요소들 또는 밀집 산술 프리미티브들을 사용하는 처리 요소들에 배정된다.
일부 실시예들에서, 결정된 목적지 처리 요소에 더 잘 맞도록, 비-오프로딩된 코드 조각의 변환이 수행된다. 예컨대, 코드 조각은: 1) 상이한 명령어 세트를 활용하도록 변환되고, 2) 더 병렬로 만들어지고, 3) 덜 병렬로 만들어지고(직렬화됨), 4) 데이터 병렬이도록 만들어지고/거나(예컨대, 벡터화됨) 5) 덜 데이터 병렬이도록 만들어진다(예컨대, 비-벡터화됨).
처리 요소가 선택된 후에, 코드 조각은, 실행을 위해, 결정된 처리 요소들 중 하나에 송신된다.
OS는 어떤 코어들 및 가속기들이 액세스가능한지에 관계없이, 잠재적으로 이용가능한 스레드들의 총 수를 관측한다. 다음의 설명에서, 각각의 스레드는 논리적ID로 지칭되는 스레드 식별자(ID)에 의해 열거된다. 일부 구현들에서, 운영 체제 및/또는 이종 스케줄러는 스레드를 특정 처리 요소 유형(예컨대, 코어 유형), 처리 요소 ID, 및 그 처리 요소 상의 스레드 ID(예컨대, 코어 유형, 코어ID, 스레드ID의 투플(tuple))에 맵핑하기 위해 논리적 ID들을 활용한다. 예컨대, 스칼라 코어는 코어 ID 및 하나 이상의 스레드 ID를 갖고; SIMD 코어는 코어 ID 및 하나 이상의 스레드 ID를 갖고; OOO 코어는 코어 ID 및 하나 이상의 스레드 ID를 갖고/거나; 가속기는 코어 ID 및 하나 이상의 스레드 ID를 갖는다.
도 8은 논리적 ID들에 대한 스트라이프형 맵핑을 사용하는 개념을 예시한다. 스트라이프형 맵핑은 이종 스케줄러에 의해 사용될 수 있다. 이러한 예에서, 8개의 논리적 ID 및 각각이 하나 이상의 스레드를 갖는 3개의 코어 유형이 존재한다. 전형적으로, (코어ID, 스레드ID)로의 논리적ID로부터의 맵핑은 분할 및 모듈로(modulo)를 통해 컴퓨팅되고, 소프트웨어 스레드 친화성을 보존하기 위해 고정될 수 있다. (코어 유형)으로의 논리적ID로부터의 맵핑은 OS가 액세스가능한 향후의 새로운 코어 유형들을 수용하기 위해 이종 스케줄러에 의해 유연하게 수행된다.
도 9는 논리적 ID들에 대한 스트라이프형 맵핑을 사용하는 예를 예시한다. 이 예에서, 논리적ID들 1, 4 및 5은 제1 코어 유형에 맵핑되고, 모든 다른 논리적ID들은 제2 코어 유형에 맵핑된다. 제3 코어 유형은 활용되고 있지 않다.
일부 구현들에서, 코어 유형들의 그룹화들이 이루어진다. 예컨대, "코어 그룹" 투플은 하나의 OOO 투플, 및 논리적 ID들이 동일한 OOO 투플에 맵핑되는 모든 스칼라, SIMD, 및 가속기 코어 투플들로 이루어질 수 있다. 도 10은 코어 그룹의 예를 예시한다. 전형적으로, 직렬 페이즈 검출 및 스레드 이전은 동일한 코어 그룹 내에서 수행된다.
도 11은 이진 변환기 스위칭 메커니즘을 활용하는 시스템에서의 스레드 실행 방법의 예를 예시한다. 1101에서, 스레드가 코어 상에서 실행된다. 코어는 가속기를 포함하는 본원에서 상세히 설명된 유형들 중 임의의 유형일 수 있다.
스레드의 실행 동안의 어떤 시점에, 1103에서, 잠재적 코어 재할당 이벤트가 발생한다. 예시적인 코어 재할당 이벤트들은, 스레드 기상 명령; 페이지 디렉토리 기준 레지스터에 대한 기입; 휴면 명령; 스레드에서의 페이즈 변화; 및 상이한 코어로의 원하는 재할당을 표시하는 하나 이상의 명령어를 포함하지만 이에 제한되지 않는다.
1105에서, 이벤트가 처리되고, 코어 할당의 변경이 존재해야 하는지에 관한 결정이 이루어진다. 하나의 특정 코어 할당의 처리에 관련된 예시적인 방법들이 아래에 상세히 설명된다.
일부 실시예들에서, 코어 (재)할당은 이전율 제한 및 전력 소비 제한과 같은 하나 이상의 제한 요인에 영향을 받는다. 이전율 제한은 코어 유형, 코어ID 및 스레드ID별로 추적된다. 일단 스레드가 대상(코어 유형, 코어ID, 스레드ID)에 배정되면, 타이머가 시작되어 이진 변환기에 의해 유지된다. 타이머가 만료될 때까지 어떠한 다른 스레드들도 동일한 대상으로 이전되지 않을 것이다. 그러므로, 타이머가 만료하기 전에 스레드가 자신의 현재 코어로부터 떨어지게 이전될 수 있지만, 그 역은 참이 아니다.
상세히 설명된 바와 같이, 전력 소비 제한은 더 많은 코어 유형들(가속기들을 포함함)이 컴퓨팅 시스템에 (온-다이(on-die) 또는 오프-다이(off-die) 중 어느 하나로) 부가됨에 따라 점점 더 집중될 가능성이 있다. 일부 실시예들에서, 모든 코어들 상의 모든 실행 중인 스레드들에 의해 소비되는 순간 전력이 컴퓨팅된다. 계산된 전력 소비가 임계값을 초과할 때, 새로운 스레드들은 SIMD, 스칼라 및 전용 가속기 코어들과 같은 더 낮은 전력 코어들에만 할당되고, 하나 이상의 스레드는 OOO 코어로부터 더 낮은 전력 코어들로 강제적으로 이전된다. 일부 구현들에서, 전력 소비 제한은 이전율 제한에 비해 우선권을 가짐을 유의한다.
도 12는 가속기에 대한 핫 코드를 위한 코어 할당의 예시적인 방법을 예시한다. 1203에서, 코드가 "핫"이라는 결정이 이루어진다. 코드의 핫 부분은, 전력, 성능, 열, 다른 공지된 프로세서 척도(들), 또는 이들의 조합과 같은 고려사항들에 기반하여, 다른 코어에 비해 하나의 코어에서 실행하기에 더 적합한 코드의 부분을 지칭할 수 있다. 이러한 결정은 임의의 수의 기법들을 사용하여 행해질 수 있다. 예컨대, 동적 이진 최적화기가 스레드의 실행을 모니터링하는 데 활용될 수 있다. 핫 코드는 프로그램 실행 동안 정적 코드의 동적 실행 빈도를 기록하는 계수기 값들 등에 기반하여 검출될 수 있다. 코어가 OOO 코어이고 다른 코어가 순차적 코어인 실시예에서, 코드의 핫 부분은, 많이 재발하는 섹션의 실행을 위한 더 많은 이용가능 리소스를 잠재적으로 갖는, 직렬 코어 상에서 실행되기에 더 적합한 프로그램 코드의 핫 스폿을 지칭할 수 있다. 종종, 재발성이 높은 패턴을 갖는 코드의 섹션은, 순차적 코어 상에서 더 효율적으로 실행되도록 최적화될 수 있다. 본질적으로, 이러한 예에서, 콜드 코드(재발성이 낮음)는 본래의 OOO 코어에 분배되는 반면, 핫 코드(반복성이 높음)는 소프트웨어 관리된 순차적 코어에 분배된다. 코드의 핫 부분은 정적으로, 동적으로, 또는 이들의 조합으로 식별될 수 있다. 제1 경우에, 컴파일러 또는 사용자는 프로그램 코드의 섹션이 핫 코드라고 결정할 수 있다. 코어 내의 디코딩 논리는, 일 실시예에서, 프로그램 코드의 핫 부분을 식별하기 위한 핫 코드 식별자 명령어를 프로그램 코드로부터 디코딩하도록 적응된다. 그러한 명령어의 페치 또는 디코딩은 코어 상에서의 코드의 핫 섹션의 변환 및/또는 실행을 트리거링할 수 있다. 다른 예에서, 코드 실행은 프로파일링된 실행이고, 프로파일의 특성들 ― 실행과 연관된 전력 및/또는 성능 척도들 ― 에 기반하여, 프로그램 코드의 구역이 핫 코드로서 식별될 수 있다. 하드웨어의 동작과 유사하게, 모니터링 코드는 다른 코어 상에서 실행되는 프로그램 코드의 모니터링/프로파일링을 수행하기 위해 하나의 코어 상에서 실행될 수 있다. 그러한 모니터링 코드는 코어들 내의 저장 구조들에 보유되거나 프로세서를 포함하는 시스템에 보유되는 코드일 수 있다는 것을 유의한다. 예컨대, 모니터링 코드는 코어의 저장 구조들에 보유되는 마이크로코드 또는 다른 코드일 수 있다. 또 다른 예로서, 핫 코드의 정적 식별이 힌트로서 만들어진다. 그러나, 프로그램 코드 실행의 동적 프로파일링은 코드의 구역의 핫으로서의 정적 식별을 무시할 수 있으며, 이러한 유형의 정적 식별은 종종 컴파일러 또는 사용자 힌트로 지칭되며, 이는, 동적 프로파일링이, 어느 코어가 코드 배포에 적절한지를 결정할 시에 고려할 수 있다. 더욱이, 동적 프로파일링의 속성인 것처럼, 코드의 구역을 핫으로서 식별하는 것은 그 코드 섹션이 항상 핫으로서 식별되는 것으로 제한하지 않는다. 변환 및/또는 최적화 후에, 코드 섹션의 변환된 버전이 실행된다.
1203에서, 적절한 가속기가 선택된다. 이진 변환기, 가상 기계 모니터, 또는 운영 체제는 이용가능한 가속기들 및 원하는 성능에 기반하여 이러한 선택을 행한다. 많은 예시들에서, 가속기는 더 크고 보다 일반적인 코어보다 더 양호한 와트당 성능으로 핫 코드를 실행하기에 더 적절하다.
1205에서, 핫 코드는 선택된 가속기로 송신된다. 이러한 송신은 본원에서 상세히 설명되는 바와 같은 적절한 연결 유형을 활용한다.
마지막으로, 핫 코드는 선택된 가속기에 의해 수신되어 1207에서 실행된다. 실행하는 동안, 핫 코드는 상이한 코어로의 할당에 대해 평가될 수 있다.
도 13은 페이지 디렉토리 기준 레지스터 이벤트에 대한 기입 또는 기상을 위한 잠재적인 코어 할당의 예시적인 방법을 예시한다. 예컨대, 이는, 코드 조각의 페이즈를 결정하는 것을 예시한다. 1301에서, 기상 이벤트 또는 페이지 디렉토리 기준 레지스터(예컨대, 태스크 스위치) 이벤트가 검출된다. 예컨대, 중단된 스레드 또는 대기 상태 퇴장에 의해 인터럽트가 수신되는 것에 대해 기상 이벤트가 발생한다. 페이지 디렉토리 기준 레지스터에 대한 기입은 직렬 페이즈의 시작 또는 중지를 표시할 수 있다. 전형적으로, 이러한 검출은 이진 변환기를 실행하는 코어 상에서 발생한다.
1303에서, 기상하거나 태스크 스위치를 경험하는 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 코어들의 수가 계수된다. 일부 구현들에서, 테이블은 논리적ID들을 특정 이종 코어들에 맵핑하는 데 사용된다. 테이블은 논리적ID에 의해 색인된다. 테이블의 각각의 엔트리는, 논리적ID가 현재 실행 중인지 또는 중단되어 있는지를 표시하는 플래그, SIMD 코어 또는 스칼라 코어를 선호할지를 표시하는 플래그, 페이지 테이블 기준 어드레스(예컨대, CR3), 논리적ID가 현재 맵핑되어 있는 코어의 유형을 표시하는 값, 및 이전율을 제한하는 계수기들을 포함한다.
동일한 프로세스에 속하는 스레드들은 동일한 어드레스 공간, 페이지 테이블들, 및 페이지 디렉토리 기준 레지스터 값을 공유한다.
1305에서, 계수된 코어들의 수가 1보다 큰지에 관한 결정이 이루어진다. 이러한 계수는, 스레드가 직렬 페이즈에 있는지 또는 병렬 페이즈에 있는지를 결정한다. 계수가 1일 때, 이벤트를 경험하는 스레드는 직렬 페이즈(1311)에 있다. 이와 같이, 직렬 페이즈 스레드는 동일한 코어 그룹 내의 모든 스레드들 중에서 고유 페이지 디렉토리 기준 레지스터 값을 갖는 스레드이다. 도 14는 직렬 페이즈 스레드들의 예를 예시한다. 예시된 바와 같이, 프로세스는 하나 이상의 스레드를 갖고, 각각의 프로세스는 자신 고유의 할당된 어드레스를 갖는다.
이벤트를 경험하는 스레드가 OOO 코어에 배정되어 있지 않을 때, 그 스레드는 OOO 코어로 이전되고, OOO 코어 상의 기존의 스레드는 1313 또는 1315에서 SIMD 또는 스칼라 코어로 이전된다. 이벤트를 경험하는 스레드가 OOO 코어에 배정되어 있을 때, 그 스레드는 대부분의 상황들에서 OOO 코어에 유지된다.
계수가 1보다 클 때, 이벤트를 경험하는 스레드는 병렬 페이즈에 있고, 1309에서, 병렬 페이즈의 유형의 결정이 이루어진다. 이벤트를 경험하는 스레드가 데이터 병렬 페이즈에 있을 때, 스레드가 SIMD 코어에 배정되어 있지 않으면 스레드는 SIMD 코어에 배정되고, 그렇지 않고 스레드가 1313에서 이미 SIMD 코어에 있으면 스레드는 SIMD 코어 상에 남는다.
이벤트를 경험하는 스레드가 데이터 병렬 페이즈에 있을 때, 스레드가 SIMD 코어에 배정되어 있지 않으면 스레드는 SIMD 코어에 배정되고, 그렇지 않고 스레드가 1313에서 이미 SIMD 코어에 있으면 스레드는 SIMD 코어 상에 남는다.
이벤트를 경험하는 스레드가 스레드-병렬 페이즈에 있을 때, 스레드가 스칼라 코어에 배정되어 있지 않으면 스레드는 스칼라 코어에 배정되고, 그렇지 않고 스레드가 1315에서 이미 스칼라 코어에 있으면 스레드는 스칼라 코어 상에 남는다.
부가적으로, 일부 구현들에서, 스레드가 실행 중임을 표시하는 플래그가 스레드의 논리적ID에 대해 설정된다.
도 15는 휴면 명령 이벤트에 대한 스레드 응답을 위한 잠재적인 코어 할당의 예시적인 방법을 예시한다. 예컨대, 이는, 코드 조각의 페이즈를 결정하는 것을 예시한다. 1501에서, 스레드에 영향을 주는 휴면 이벤트가 검출된다. 예컨대, 중단, 대기 진입 및 타임아웃, 또는 일시정지 명령이 발생한다. 전형적으로, 이러한 검출은 이진 변환기를 실행하는 코어 상에서 발생한다.
일부 실시예들에서, 1503에서, 스레드의 논리적ID에 대한, 스레드가 실행 중임을 표시하는 플래그가 비워진다.
1505에서, 휴면 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 코어들의 스레드들의 수가 계수된다. 일부 구현들에서, 테이블은 논리적ID들을 특정 이종 코어들에 맵핑하는 데 사용된다. 테이블은 논리적ID에 의해 색인된다. 테이블의 각각의 엔트리는, 논리적ID가 현재 실행 중인지 또는 중단되어 있는지를 표시하는 플래그, SIMD 코어 또는 스칼라 코어를 선호할지를 표시하는 플래그, 페이지 테이블 기준 어드레스(예컨대, CR3), 논리적ID가 현재 맵핑되어 있는 코어의 유형을 표시하는 값, 및 이전율을 제한하는 계수기들을 포함한다. 그룹으로부터의 (임의의 페이지 테이블 기준 포인터를 갖는) 제1 실행 스레드가 언급된다.
1507에서, 시스템 내의 OOO 코어가 유휴인지에 관한 결정이 이루어진다. 유휴 OOO 코어는 활성으로 실행 중인 OS 스레드들을 갖지 않는다.
페이지 테이블 기준 포인터가 코어 그룹 내의 정확히 하나의 스레드에 의해 공유될 때, 1509에서, 공유 스레드는 SIMD 또는 스칼라 코어로부터 OOO 코어로 이동된다. 페이지 테이블 기준 포인터가 하나 초과의 스레드에 의해 공유될 때, 앞서 언급된 그룹의 제1 실행 스레드는, (제1 실행 스레드의 장소에서 실행되는) 깨어난 스레드를 위한 공간을 만들기 위해, 1511에서, SIMD 또는 스칼라 코어로부터 OOO 코어로 스레드 이전된다.
도 16은 페이즈 변화 이벤트에 대한 응답으로의 스레드를 위한 잠재적인 코어 할당의 예시적인 방법을 예시한다. 예컨대, 이는, 코드 조각의 페이즈를 결정하는 것을 예시한다. 1601에서, 잠재적 페이즈 변화 이벤트가 검출된다. 전형적으로, 이러한 검출은 이진 변환기를 실행하는 코어 상에서 발생한다.
1603에서, 스레드의 논리적ID가 스칼라 코어 상에서 실행 중이고 SIMD 명령어들이 존재하는지 여부에 관한 결정이 이루어진다. 그러한 SIMD 명령어들이 존재하지 않으면, 스레드는 정상적으로 계속 실행된다. 그러나, 스칼라 코어 상에서 실행 중인 스레드에 SIMD 명령어들이 존재하는 경우, 1605에서, 스레드는 SIMD 코어로 이전된다.
1607에서, 스레드의 논리적ID가 SIMD 코어 상에서 실행 중이고 SIMD 명령어들이 존재하지 않는지 여부에 관한 결정이 이루어진다. SIMD 명령어들이 존재하면, 스레드는 정상적으로 계속 실행된다. 그러나, SIMD 코어 상에서 실행 중인 스레드에 SIMD 명령어들이 존재하지 않는 경우, 1609에서, 스레드는 스칼라 코어로 이전된다.
본 설명 전체에 걸쳐 언급된 바와 같이, 이진 변환기로부터 액세스가능한 가속기들은 (더 에너지 효율적인 실행을 포함하는) 더 효율적인 실행을 제공할 수 있다. 그러나, 이용가능한 각각의 잠재적 가속기를 프로그래밍할 수 있는 것은 불가능하지는 않더라도 어려운 태스크일 수 있다.
기술된 명령어들을 사용하여 스레드의 일부분의 잠재적 가속기 기반 실행의 시작 및 종료를 명시적으로 표시하는 실시예들이 본원에서 상세히 설명된다. 어떠한 가속기도 이용가능하지 않은 경우, 기술된 명령어들 사이의 코드는 가속기의 사용이 없는 것처럼 실행된다. 일부 구현들에서, 이러한 명령어들 사이의 코드는 그 코드가 실행되는 코어의 일부 시맨틱들을 완화시킬 수 있다.
도 17은 가속 구역을 기술하는 코드의 예를 예시한다. 이러한 구역의 제1 명령어는 가속 시작(ABEGIN) 명령어(1701)이다. 일부 실시예들에서, ABEGIN 명령어는 비-가속기 코어들에 대한 완화된 (서브-)실행 모드에 진입하기 위한 허가를 제공한다. 예컨대, ABEGIN 명령어는, 일부 구현들에서, 프로그래머 또는 컴파일러가, 명령어의 필드들에서, 서브 모드의 어느 특징들이 표준 모드와 상이한지를 표시할 수 있게 한다. 예시적인 특징들은, 자기-수정 코드(SMC)를 무시하는 것, 메모리 일관성 모델 제한들을 약화시키는 것(예컨대, 저장 순서화 요건들을 완화시키는 것), 부동 소수점 시맨틱들을 변경하는 것, 성능 모니터링(perfmon)을 변경하는 것, 아키텍처 플래그 사용을 변경하는 것 등 중 하나 이상을 포함하지만 이에 제한되지 않는다. 일부 구현들에서, SMC는, 연관된 캐시 라인(또는 라인들)이 무효화되게 하는, 프로세서에 현재 캐싱된 코드 세그먼트에서의 메모리 위치에 대한 기입이다. 기입이, 프리페치된 명령어에 영향을 주면, 프리페치 큐는 무효화된다. 이러한 후자의 검사는 명령어의 선형 어드레스에 기반한다. 대상 명령어가 이미 디코딩되어 트레이스 캐시에 상주하는 코드 세그먼트 내의 명령어의 기입 또는 스누프(snoop)는 전체 트레이스 캐시를 무효화한다. SMC는 변환 색인 버퍼에서의 SMC 검출 회로의 전환에 의해 무시될 수 있다. 예컨대, 메모리 일관성 모델 제한들은 (메모리 유형 범위 레지스터 또는 페이지 속성 테이블과 같은) 하나 이상의 레지스터 또는 테이블에서의 설정을 변경함으로써 변경될 수 있다. 예컨대, 부동 소수점 시맨틱들을 변경할 때, 부동 소수점 실행 회로가 부동 소수점 계산을 수행하는 방식은 이러한 회로들의 거동을 제어하는 하나 이상의 제어 레지스터의 사용(예컨대, 부동 소수점 유닛(FPU) 제어 워드 레지스터의 설정)을 통해 변경된다. 변경할 수 있는 부동 소수점 시맨틱들은, 라운딩 모드, 예외 마스크들 및 상태 플래그들이 처리되는 방식, 0으로의 플러시(flush-to-zero), 비정규화들의 설정, 및 정밀도 (예컨대, 단일, 이중, 및 확장된) 제어를 포함하지만 이에 제한되지 않는다. 부가적으로, 일부 실시예들에서, ABEGIN 명령어는 명시적 가속기 유형 선호도를 허용하며, 그로써, 바람직한 유형의 가속기가 이용가능하다면 그 가속기가 선택될 것이다.
비-가속기 코드(1703)는 ABEGIN 명령어(1701)를 따른다. 이러한 코드는 시스템의 프로세서 코어(들)에 고유하다. 최악의 경우에, 이용가능한 가속기가 존재하지 않거나 ABEGIN이 지원되지 않는 경우, 이러한 코드는 코어에서 그대로 실행된다. 그러나, 일부 구현들에서, 서브 모드가 실행에 사용된다.
가속 종료(AEND) 명령어(1705)를 가짐으로써, 실행은, 가속기가 자신의 실행을 완료한 것처럼 보일 때까지 프로세서 코어 상에서 게이팅된다. 효과적으로, ABEGIN 및 AEND의 사용은 프로그래머가 가속기 및/또는 완화된 실행 모드를 사용하는 것에 참여/참여거부(opt-in/out)할 수 있게 한다.
도 18은 하드웨어 프로세서 코어에서 ABEGIN을 사용하는 실행 방법의 실시예를 예시한다. 1801에서, 스레드의 ABEGIN 명령어가 페치된다. 앞서 언급된 바와 같이, ABEGIN 명령어는 전형적으로 상이한 (서브-)실행 모드를 정의하는 데 사용되는 하나 이상의 필드를 포함한다.
1803에서, 페치된 ABEGIN 명령어가 디코딩 회로를 이용하여 디코딩된다. 일부 실시예들에서, ABEGIN 명령어는 마이크로연산들로 디코딩된다.
1805에서, 디코딩된 ABEGIN 명령어는 실행 회로에 의해 실행되어, ABEGIN 명령어에 후속하지만 AEND 명령어 전에 있는 명령어들에 대해 (ABEGIN 명령어의 하나 이상의 필드에 의해 명시적으로 정의될 수 있는) 상이한 모드로 스레드를 진입시킨다. 이러한 상이한 실행 모드는 가속기 이용가능성 및 선택에 따라, 가속기 상에 또는 기존의 코어 상에 있을 수 있다. 일부 실시예들에서, 가속기 선택은 이종 스케줄러에 의해 수행된다.
1807에서, 후속하는 비-AEND 명령어들이 상이한 실행 모드에서 실행된다. 가속기가 실행을 위해 사용될 때, 명령어들은 먼저 이진 변환기에 의해 상이한 명령어 세트로 변환될 수 있다.
도 19는 하드웨어 프로세서 코어에서 AEND를 사용하는 실행 방법의 실시예를 예시한다. 1901에서, AEND 명령어가 페치된다.
1903에서, 페치된 AEND 명령어가 디코딩 회로를 사용하여 디코딩된다. 일부 실시예들에서, AEND 명령어는 마이크로연산들로 디코딩된다.
1905에서, 디코딩된 AEND 명령어는 ABEGIN 명령어에 의해 이전에 설정된 상이한 실행 모드로부터 되돌아가기 위해 실행 회로에 의해 실행된다. 이러한 상이한 실행 모드는 가속기 이용가능성 및 선택에 따라, 가속기 상에 또는 기존의 코어 상에 있을 수 있다.
1807에서, 후속하는 비-AEND 명령어들이 원래의 실행 모드에서 실행된다. 가속기가 실행을 위해 사용될 때, 명령어들은 먼저 이진 변환기에 의해 상이한 명령어 세트로 변환될 수 있다.
도 124는 ABEGIN/AEND가 지원되지 않을 때의 실행의 예를 예시한다. 12401에서, ABEGIN 명령어가 페치된다. 12403에서, ABEGIN이 지원되지 않는다는 결정이 이루어진다. 예컨대, CPUID는 지원이 존재하지 않는다는 것을 표시한다.
지원이 존재하지 않을 때, 12405에서, 전형적으로, 스레드와 연관된 컨텍스트를 변경하지 않는 무연산(nop; no operation)이 실행된다. 실행 모드에서의 변경이 존재하지 않기 때문에, 12407에서, 지원되지 않는 ABEGIN에 후속하는 명령어들이 정상적으로 실행된다.
일부 실시예들에서, ABEGIN/AEND의 동등한 사용은 적어도 패턴 매칭을 사용하여 달성된다. 이러한 패턴 매칭은 하드웨어, 소프트웨어, 및/또는 둘 모두에 기반할 수 있다. 도 20은 패턴 매칭을 사용하여 ABEGIN/AEND 동등성을 제공하는 시스템을 예시한다. 예시된 시스템은 메모리(2005)에 저장된 변환기(2001)(예컨대, 이진 변환기, JIT 등)를 포함하는 스케줄러(2015)(예컨대, 위에 상세히 설명된 바와 같은 이종 스케줄러)를 포함한다. 코어 회로(2007)는 스케줄러(2015)를 실행한다. 스케줄러(2015)는 명시적 ABEGIN/AEND 명령어들을 갖거나 갖지 않을 수 있는 스레드(2019)를 수신한다.
스케줄러(2015)는 소프트웨어 기반 패턴 매칭기(2003)를 관리하고, 오프로드 동안 트랩들 및 컨텍스트 스위치들을 수행하고, 사용자-공간 저장 영역을 관리하고(나중에 상세히 설명됨), 가속기 코드(2011)를 생성하거나 가속기 코드(2011)로 변환한다. 패턴 매칭기(2003)는 가속기 사용 및/또는 완화된 실행 상태로부터 이익을 얻을 수 있지만 ABEGIN/AEND를 사용하여 기술되지 않는 수신된 스레드(2019)에서 발견되는 메모리에 저장된 (미리 정의된) 코드 시퀀스들을 인식한다. 전형적으로, 패턴들 그 자체는 변환기(2001)에 저장되지만, 적어도, 패턴 매칭기(2003)가 액세스가능하다. 선택기(2019)는 앞서 상세히 설명된 바와 같이 기능한다.
스케줄러(2015)는 또한 성능 모니터링 특징들을 제공할 수 있다. 예컨대, 코드가 완전한 패턴 매치를 갖지 않는 경우, 스케줄러(2015)는, 코드가 더 효율적으로 되기 위해 여전히 요건들의 완화를 필요로 할 수 있다는 것을 인식하고, 그에 따라 스레드와 연관된 동작 모드를 조정한다. 동작 모드의 관계는 위에서 상세히 설명되었다.
스케줄러(2015)는 또한, ABEGIN/AEND 구역에서 코어를 사이클링하는 것, 활성이도록 또는 정지되도록 가속기를 사이클링하는 것, ABEGIN 호출들을 계수하는 것, 가속기들의 큐잉을 지연시키는 것(동기화 처리), 및 메모리/캐시 통계들을 모니터링하는 것 중 하나 이상을 수행한다. 일부 실시예들에서, 이진 변환기(2001)는 병목 현상을 식별하는 데 유용할 수 있는 가속기 코드를 해석하는 데 사용되는 가속기 특정 코드를 포함한다. 가속기는 이러한 변환된 코드를 실행한다.
일부 실시예들에서, 코어 회로(2007)는, 저장된 패턴들(2017)을 사용하여 수신된 스레드(2019) 내의 (미리 정의된) 코드 시퀀스들을 인식하는 하드웨어 패턴 매칭기(2009)를 포함한다. 전형적으로, 이러한 패턴 매칭기(2009)는 소프트웨어 패턴 매칭기(2003)와 비교하여 경량이고, 구역들을 표현하기가 단순할 것을 추구한다(이를테면, rep movs). 인식된 코드 시퀀스들은 스케줄러(2015)에 의해 가속기에서 사용되기 위해 변환될 수 있고/거나, 스레드에 대한 동작 모드가 완화되게 할 수 있다.
실행할 가속기 코드(2011)를 수신하는 하나 이상의 가속기(2013)가 시스템에 결합된다.
도 21은 패턴 인식에 노출된 비-가속화된 기술된 스레드의 실행 방법의 실시예를 예시한다. 이러한 방법은 적어도 하나의 유형의 패턴 매칭기를 포함하는 시스템에 의해 수행된다.
일부 실시예들에서, 2101에서, 스레드가 실행된다. 전형적으로, 이러한 스레드는 비-가속기 코어 상에서 실행된다. 실행 스레드의 명령어들은 패턴 매칭기에 공급된다. 그러나, 스레드의 명령어들은 임의의 실행 이전에 패턴 매칭기에 공급될 수 있다.
2103에서, 스레드 내의 패턴이 인식(검출)된다. 예컨대, 소프트웨어 기반 패턴 매칭기 또는 하드웨어 패턴 매칭기 회로는, 통상적으로는 이용가능한 가속기와 연관되는 패턴을 찾는다.
2105에서, 인식된 패턴은 이용가능한 가속기에 대해 변환된다. 예컨대, 이진 변환기는 패턴을 가속기 코드로 변환한다.
2107에서, 변환된 코드는 실행을 위해 이용가능한 가속기로 전송된다.
도 22는 패턴 인식에 노출된 비-가속화된 기술된 스레드의 실행 방법의 실시예를 예시한다. 이러한 방법은, 도 20의 시스템에서와 같이 적어도 하나의 유형의 패턴 매칭기를 포함하는 시스템에 의해 수행된다.
일부 실시예들에서, 2201에서, 스레드가 실행된다. 전형적으로, 이러한 스레드는 비-가속기 코어 상에서 실행된다. 실행 스레드의 명령어들은 패턴 매칭기에 공급된다. 그러나, 스레드의 명령어들은 임의의 실행 이전에 패턴 매칭기에 공급될 수 있다.
2203에서, 스레드 내의 패턴이 인식(검출)된다. 예컨대, 소프트웨어 기반 패턴 매칭기 또는 하드웨어 패턴 매칭기 회로는, 통상적으로는 이용가능한 가속기와 연관되는 패턴을 찾는다.
2205에서, 이진 변환기는 인식된 패턴에 기반하여, 완화된 요건들을 사용하기 위해 스레드와 연관된 동작 모드를 조정한다. 예컨대, 이진 변환기는 인식된 패턴과 연관된 설정들을 활용한다.
상세히 설명된 바와 같이, 일부 실시예들에서, 코드의 병렬 구역들은 ABEGIN 및 AEND 명령어들에 의해 범위가 정해진다. ABEGIN/AEND 블록 내에서, 특정 메모리 로드 및 저장 연산들의 독립성이 보장된다. 다른 로드들 및 저장들은 잠재적인 의존성들을 허용한다. 이는, 구현들이 메모리 의존성들을 거의 또는 전혀 검사하지 않으면서 블록을 병렬화할 수 있게 한다. 모든 경우들에서, 블록을 실행하기 위한 가능한 방식들 중에 직렬의 경우가 포함되므로, 블록의 직렬 실행이 허용된다. 이진 변환기는 병렬 실행의 인스턴스들을 생성하기 위해 정적 의존성 분석을 수행하고, 이러한 인스턴스들을 하드웨어에 맵핑한다. 정적 의존성 분석은 외부, 중간 또는 내부 루프의 반복들을 병렬화할 수 있다. 분할은 구현 의존적이다. ABEGIN/AEND의 구현들은 구현에 가장 적절한 크기들로 병렬성을 추출한다.
ABEGIN/AEND 블록은 다수의 레벨들의 중첩된 루프들을 포함할 수 있다. 구현들은, 지원되는 병렬 실행의 양을 자유롭게 선택하거나, 직렬 실행으로 자유롭게 고장 대치(fall back)한다. ABEGIN/AEND는 SIMD 명령어들보다 훨씬 더 큰 구역들에 걸쳐 병렬성을 제공한다. 특정 유형의 코드에 대해, ABEGIN/AEND는 다중스레딩보다 더 효율적인 하드웨어 구현들을 허용한다.
ABEGIN/AEND의 사용을 통해, 프로그래머 및/또는 컴파일러는 병렬화를 위한 기준들이 충족되지 않는 경우에 CPU 코어에 의한 종래의 직렬 실행으로 다시 고장 대치할 수 있다. 종래의 비-순차적 CPU 코어 상에서 실행될 때, ABEGIN/AEND는 완화된 메모리 순서화의 결과로서 메모리 순서화 버퍼(MOB)의 영역 및 전력 요건들을 감소시킨다.
ABEGIN/AEND 블록 내에서, 프로그래머는 메모리 의존성들을 특정한다. 도 23은 상이한 유형들의 메모리 의존성들(2301), 그들의 시맨틱들(2303), 순서화 요건들(2305), 및 사용 경우들(2307)을 예시한다. 또한, 일부 시맨틱은 구현에 따라 ABEGIN/AEND 블록 내의 명령어들에 적용된다. 예컨대, 일부 실시예들에서, 레지스터 의존성들이 허용되지만, 레지스터들에 대한 수정들은 AEND를 넘어서 지속되지 않는다. 부가적으로, 일부 실시예들에서, ABEGIN/AEND 블록은 ABEGIN/AEND 블록 안팎으로의 브랜치들 없이 ABEGIN에서 입력되고 AEND 블록에서 퇴장(또는 패턴 인식에 기반하여 유사한 상태로 진입)되어야 한다. 마지막으로, 전형적으로, 명령어 스트림은 수정될 수 없다.
일부 구현들에서, ABEGIN 명령어는, 메모리 데이터 블록에 대한 포인터를 포함하는 소스 피연산자를 포함한다. 이러한 데이터 메모리 블록은 ABEGIN/AEND 블록 내에서 코드를 처리하기 위해, 실행시간 및 코어 회로에 의해 활용되는 많은 정보 단편들을 포함한다.
도 24는 ABEGIN 명령어가 가리키는 메모리 데이터 블록의 예를 예시한다. 예시된 바와 같이, 구현에 따라, 메모리 데이터 블록은 시퀀스 번호(2401), 블록 부류(2403), 구현 식별자(2405), 저장 상태 영역 크기(2407), 및 로컬 저장 영역 크기(2409)에 대한 필드들을 포함한다.
시퀀스 번호(2401)는 프로세서가 인터럽트 전에 (병렬) 계산을 통해 어디까지 진행했는지를 표시한다. 소프트웨어는 ABEGIN의 실행 이전에 시퀀스 번호(2401)를 0으로 초기화한다. ABEGIN의 실행은 실행의 진행을 추적하기 위해 0이 아닌 값들을 시퀀스 번호(2401)에 기입할 것이다. 완료 시에, AEND의 실행은 그 다음 사용을 위해서 시퀀스 번호(2401)를 재-초기화하기 위해 0을 기입할 것이다.
미리 정의된 블록 부류 식별자(2403)(즉, GUID)는 미리 정의된 ABEGIN/AEND 블록 부류를 특정한다. 예컨대, DMULADD 및 DGEMM은 블록 부류들로서 미리 정의될 수 있다. 미리 정의된 클래스를 이용하여, 이진 변환기는 이종 하드웨어에 대한 맵핑 분석을 수행하기 위해 바이너리(binary)를 분석할 필요가 없다. 대신, 변환기(예컨대, 이진 변환기)는 입력 값들을 단지 취함으로써 이러한 ABEGIN/AEND 부류에 대한 미리 생성된 변환들을 실행한다. ABEGIN/AEND로 묶인(enclosed) 코드는 단지 비-특수화된 코어 상에서 이러한 부류를 실행하는 데 사용되는 코드의 역할을 한다.
구현 ID 필드(2405)는 사용되는 실행 하드웨어의 유형을 표시한다. ABEGIN의 실행은 이러한 필드(2405)를 업데이트하여 사용되는 이종 하드웨어의 유형을 표시할 것이다. 이는, 구현이 ABEGIN/AEND 코드를 상이한 가속 하드웨어 유형을 갖거나 가속기를 전혀 갖지 않는 기계로 이전하는 것을 돕는다. 이러한 필드는, 저장된 컨텍스트의 가능한 변환이 대상 구현에 매칭될 수 있게 한다. 또는, 에뮬레이터는, ABEGIN/AEND 코드가 인터럽트되고 동일한 가속기 유형을 갖지 않는 기계로 이전될 때, 이전 후에 AEND를 퇴장할 때까지 코드를 실행하는 데 사용된다. 이러한 필드(2405)는 또한, 시스템이 ABEGIN/AEND 블록 실행 중간에 인터럽트되는 경우에도, 시스템이 동일한 기계 내의 상이한 이종 하드웨어에 ABEGIN/AEND 블록을 동적으로 재배정하는 것을 허용할 수 있게 할 수 있다.
상태 저장 영역 필드(2407)는 구현 특정적인 상태 저장 영역의 크기 및 포맷을 표시한다. 구현은, 상태 저장 영역의 구현 특정 부분이 CPUID에서 특정된 어떤 최대치를 초과하지 않을 것임을 보장할 것이다. 전형적으로, ABEGIN 명령어의 실행은 ABEGIN/AEND 블록 내에서 수정될 범용 및 패킹된 데이터 레지스터들, 연관된 플래그들, 및 부가적인 구현 특정 상태의 상태 저장 영역에 대한 기입을 야기한다. 병렬 실행을 용이하게 하기 위해, 레지스터들의 다수의 인스턴스들이 기입될 수 있다.
로컬 저장 영역(2409)은 로컬 저장 영역으로서 할당된다. 예비할 저장소의 양은 전형적으로 ABEGIN에 대한 즉시 피연산자로서 특정된다. ABEGIN 명령어의 실행 시에, 특정 레지스터(예컨대, R9)로의 기입이 로컬 저장소(2409)의 어드레스로 이루어진다. 장애가 있다면, 이러한 레지스터는 시퀀스 번호를 가리키도록 이루어진다.
병렬 실행의 각각의 인스턴스는 고유 로컬 저장 영역(2409)을 수신한다. 어드레스는 병렬 실행의 각각의 인스턴스마다 상이할 것이다. 직렬 실행에서, 하나의 저장 영역이 할당된다. 로컬 저장 영역(2409)은 아키텍처 범용 및 패킹된 데이터 레지스터들을 넘어서 일시적 저장을 제공한다. 로컬 저장 영역(2409)은 ABEGIN/AEND 블록 외부에서 액세스되지 않아야 한다.
도 25는 ABEGIN/AEND 시맨틱들을 사용하도록 구성되는 메모리(2503)의 예를 예시한다. ABEGIN/AEND를 지원하고 이러한 메모리(2503)를 활용하는 하드웨어(이를테면, 본원에 설명되는 다양한 처리 요소들)는 예시되지 않는다. 상세히 설명된 바와 같이, 메모리(2503)는, 사용될 레지스터들(2501), 플래그들(2505), 및 구현 특정 정보(2511)의 표시를 포함하는 저장 상태 영역(2507)을 포함한다. 부가적으로, 병렬 실행 인스턴스별 로컬 저장소(2509)가 메모리(2503)에 저장된다.
도 26은 ABEGIN/AEND를 사용하여 상이한 실행 모드에서 연산하는 방법의 예를 예시한다. 전형적으로, 이러한 방법은 변환기 및 실행 회로와 같은 엔티티들의 조합에 의해 수행된다. 일부 실시예들에서, 스레드는 이러한 모드에 진입하기 전에 변환된다.
2601에서, 예컨대, 완화된 실행 모드(가속기를 사용하거나 사용하지 않음)와 같은 상이한 실행 모드에 진입된다. 이러한 모드는 통상적으로 ABEGIN 명령어의 실행으로부터 진입되지만, 위에 상세히 설명된 바와 같이, 이러한 모드는 패턴 매치 때문에 진입될 수도 있다. 이러한 모드에 진입하는 것은 시퀀스 번호의 리셋을 포함한다.
2603에서, 저장 상태 영역에 대한 기입이 이루어진다. 예컨대, 수정될 범용 및 패킹된 데이터 레지스터들, 연관된 플래그들, 및 부가적인 구현 특정 정보가 기입된다. 이러한 영역은, 블록에서 무엇인가가 잘못되게 되면(예컨대, 인터럽트), 실행의 재시작 또는 롤백을 허용한다.
2605에서, 병렬 실행 인스턴스별 로컬 저장 영역이 예비된다. 이러한 영역의 크기는 위에 상세히 설명된 상태 저장 영역 필드에 의해 좌우된다.
블록의 실행 동안, 2607에서, 블록의 진행이 추적된다. 예컨대, 명령어가 성공적으로 실행되고 퇴거되는 경우, 블록의 시퀀스 번호가 업데이트된다.
2609에서, (예컨대, 블록이 완료되었는지 여부를 결정하기 위해) AEND 명령어에 도달했는지에 관한 결정이 행해진다. 그렇지 않다면, 2613에서, 로컬 저장 영역은 중간 결과들로 업데이트된다. 가능한 경우, 실행은 이러한 결과들로부터 선택되지만, 일부 예시들에서는, 2615에서, ABEGIN/AEND 전으로의 롤백이 발생한다. 예컨대, 예외 또는 인터럽트가 ABEGIN/AEND 블록의 실행 동안 발생하는 경우, 명령어 포인터는 ABEGIN 명령어를 가리킬 것이고, R9 레지스터는 중간 결과들로 업데이트되는 메모리 데이터 블록을 가리킬 것이다. 재개 시, 메모리 데이터 블록에 저장된 상태는 정확한 지점에서 재개하는 데 사용될 것이다. 부가적으로, 상태 저장 영역까지를 포함하는 메모리 데이터 블록의 초기 부분이 존재하지 않거나 액세스가능하지 않은 경우, 페이지 장애가 야기된다. 로컬 저장 영역에 대한 로드들 및 저장들에 대해, 페이지 장애들은 일반적인 방식으로, 즉, 존재하지 않거나 액세스가능하지 않은 페이지로의 제1 액세스 시에 보고된다. 일부 예시들에, 비-가속기 처리 요소가 재시작 시에 사용될 것이다.
블록이 성공적으로 완료되었다면, 2611에서, 따로 설정된 레지스터들이 플래그들과 함께 복원된다. 블록 이후에는 단지 메모리 상태만이 상이할 것이다.
도 27은 ABEGIN/AEND를 사용하여 상이한 실행 모드에서 연산하는 방법의 예를 예시한다. 전형적으로, 이러한 방법은 이진 변환기 및 실행 회로와 같은 엔티티들의 조합에 의해 수행된다.
2701에서, 예컨대, 완화된 실행 모드(가속기를 사용하거나 사용하지 않음)와 같은 상이한 실행 모드에 진입된다. 이러한 모드는 통상적으로 ABEGIN 명령어의 실행으로부터 진입되지만, 위에 상세히 설명된 바와 같이, 이러한 모드는 패턴 매치 때문에 진입될 수도 있다. 이러한 모드에 진입하는 것은 시퀀스 번호의 리셋을 포함한다.
2703에서, 저장 상태 영역에 대한 기입이 이루어진다. 예컨대, 수정될 범용 및 패킹된 데이터 레지스터들, 연관된 플래그들, 및 부가적인 구현 특정 정보가 기입된다. 이러한 영역은, 블록에서 무엇인가가 잘못되게 되면(예컨대, 인터럽트), 실행의 재시작 또는 롤백을 허용한다.
2705에서, 병렬 실행 인스턴스별 로컬 저장 영역이 예비된다. 이러한 영역의 크기는 위에 상세히 설명된 상태 저장 영역 필드에 의해 좌우된다.
2706에서, 블록 내의 코드가 실행을 위해 변환된다.
변환된 블록의 실행 동안, 2707에서, 블록의 진행이 추적된다. 예컨대, 명령어가 성공적으로 실행되고 퇴거되는 경우, 블록의 시퀀스 번호가 업데이트된다.
2709에서, (예컨대, 블록이 완료되었는지를 결정하기 위해) AEND 명령어에 도달했는지에 관한 결정이 행해진다. 그렇지 않다면, 2713에서, 로컬 저장 영역은 중간 결과들로 업데이트된다. 가능한 경우, 실행은 이러한 결과들로부터 선택되지만, 일부 예시들에서는, 2715에서, ABEGIN/AEND 전으로의 롤백이 발생한다. 예컨대, 예외 또는 인터럽트가 ABEGIN/AEND 블록의 실행 동안 발생하는 경우, 명령어 포인터는 ABEGIN 명령어를 가리킬 것이고, R9 레지스터는 중간 결과들로 업데이트되는 메모리 데이터 블록을 가리킬 것이다. 재개 시, 메모리 데이터 블록에 저장된 상태는 정확한 지점에서 재개하는 데 사용될 것이다. 부가적으로, 상태 저장 영역까지를 포함하는 메모리 데이터 블록의 초기 부분이 존재하지 않거나 액세스가능하지 않은 경우, 페이지 장애가 야기된다. 로컬 저장 영역에 대한 로드들 및 저장들에 대해, 페이지 장애들은 일반적인 방식으로, 즉, 존재하지 않거나 액세스가능하지 않은 페이지로의 제1 액세스 시에 보고된다. 일부 예시들에, 비-가속기 처리 요소가 재시작 시에 사용될 것이다.
블록이 성공적으로 완료되었다면, 2711에서, 따로 설정된 레지스터들이 플래그들과 함께 복원된다. 블록 이후에는 단지 메모리 상태만이 상이할 것이다.
위에 언급된 바와 같이, 일부 구현들에서, (다중-프로토콜 공통 링크(MCL)로 지칭되는) 공통 링크가 (도 1 및 도 2에서 설명된 처리 요소들과 같은) 디바이스들에 도달하는 데 사용된다. 일부 실시예들에서, 이러한 디바이스들은 PCI 익스프레스(PCIe) 디바이스들로서 보여진다. 이러한 링크는 그 링크 상에서 동적으로 다중화되는 3개 이상의 프로토콜을 갖는다. 예컨대, 공통 링크는: 1) 디바이스 발견, 디바이스 구성, 오류 보고, 인터럽트들, DMA-스타일 데이터 전송들 및 하나 이상의 독점 또는 산업 표준(이를테면, 예컨대 PCI 익스프레스 규격 또는 등가의 대안)에 명시될 수 있는 바와 같은 다양한 서비스들을 가능하게 하는 생산자/소비자, 발견, 구성, 인터럽트들(PDCI; producer/consumer, discovery, configuration, interrupts)의 프로토콜; 2) 디바이스가 일관성있는 판독 및 기입 요청들을 처리 요소에 송출할 수 있게 하는 캐싱 에이전트 일관성(CAC; caching agent coherence) 프로토콜; 및 3) 처리 요소가 다른 처리 요소의 로컬 메모리에 액세스할 수 있게 하는 메모리 액세스(MA) 프로토콜로 이루어진 프로토콜들을 지원한다. 이러한 프로토콜들의 특정 예들(예컨대, 인텔 온-칩 시스템 패브릭(IOSF; Intel On-Chip System Fabric), 다이 내 상호연결부(IDI; In-die Interconnect), 규모조정가능 메모리 상호연결부 3+(SMI3+))이 아래에 제공되지만, 본 발명의 기본 원리들은 임의의 특정 세트의 프로토콜들로 제한되지 않는다.
도 120은 예시적인 다중칩 링크(MCL)(12020)를 사용하여 통신가능하게 연결되는 2개 이상의 칩 또는 다이(예컨대, 12010, 12015)를 포함하는 예시적인 다중칩 구성(12005)을 예시하는 간략화된 블록도(12000)이다. 도 120이 예시적인 MCL(12020)을 사용하여 상호연결되는 2개(또는 그 초과)의 다이의 예를 도시하지만, MCL의 구현에 관하여 본원에서 설명되는 원리들 및 특징들은 다이(예컨대, 12010)와 다른 구성요소들을 연결하는 임의의 상호연결부 또는 링크에 적용될 수 있다는 것이 인식되어야 하며, 이러한 연결은, 잠재적인 다른 예들 중에서도, 2개 이상의 다이(예컨대, 12010, 12015)를 연결하는 것, 다이(또는 칩)를 다른 오프-다이 구성요소에 연결하는 것, 다이를 다른 디바이스 또는 오프-패키지 다이(예컨대, 12005)에 연결하는 것, 다이를 BGA 패키지에 연결하는 것, 인터포저 상의 패치(POINT; Patch on Interposer)의 구현을 포함한다.
일부 예시들에서, 더 큰 구성요소들(예컨대, 다이들(12010, 12015))은 그 자체로 IC 시스템들, 이를테면 시스템-온-칩(SoC), 다중프로세서 칩들, 또는 디바이스 상의, 예를 들면 단일 다이(예컨대, 12010, 12015) 상의 코어들, 가속기들 등과 같은 다수의 구성요소들(12025-12030 및 12040-12045)을 포함하는 다른 구성요소들일 수 있다. MCL(12020)은 잠재적으로 다수의 개별 구성요소들 및 시스템들로부터 복잡하고 다양한 시스템들을 구축하기 위한 유연성을 제공한다. 예컨대, 다이들(12010, 12015) 각각은 2개의 상이한 엔티티에 의해 제조되거나 다른 방식으로 제공될 수 있다. 추가로, 다이들 및 다른 구성요소들 그 자체는 디바이스(예컨대, 12010, 12015 각각) 내의 구성요소들(예컨대, 12025-12030 및 12040-12045) 사이의 통신을 위한 기반구조를 제공하는 상호연결부 또는 다른 통신 패브릭들(예컨대, 12035, 12050)을 포함할 수 있다. 다양한 구성요소들 및 상호연결부들(예컨대, 12035, 12050)은 다수의 상이한 프로토콜들을 지원하거나 사용한다. 추가로, 다이들(예컨대, 12010, 12015) 사이의 통신은 잠재적으로, 다수의 상이한 프로토콜들을 통한 다이들 상의 다양한 구성요소들 사이의 트랜잭션들을 포함할 수 있다.
다중칩 링크(MCL)의 실시예들은, 다수의 패키지 옵션들, 다수의 I/O 프로토콜들뿐만 아니라, 신뢰성, 이용가능성 및 서비스가능성(RAS) 특징들을 지원한다. 추가로, 물리 계층(PHY)은 물리적 전기 계층 및 논리 계층을 포함할 수 있고, 대략적으로 45 mm까지의 그리고 일부 경우들에서는 그를 초과하는 채널 길이들을 포함하는 더 긴 채널 길이들을 지원할 수 있다. 일부 구현들에서, 예시적인 MCL은 8-10 Gb/s를 초과하는 데이터 레이트들을 포함하는 높은 데이터 레이트들로 동작할 수 있다.
MCL의 일 예시적인 구현에서, PHY 전기 계층은 종래의 다중-채널 상호연결부 솔루션들(예컨대, 다중-채널 DRAM I/O)을 개선하여, 데이터 레이트 및 채널 구성을, 예를 들면, 잠재적인 다른 예들 중에서도, 조정된 중간-레일 종결, 저전력 활성 누화 소거, 회로 중복, 비트당 듀티 사이클 정정 및 디스큐(deskew), 라인 코딩, 및 송신기 등화를 포함하는 다수의 특징들에 의해 확장시킨다.
MCL의 일 예시적인 구현에서, PHY 논리적 계층은, 데이터 레이트 및 채널 구성을 확장하는 데 있어 (예컨대, 전기 계층 특징들에) 추가적으로 보조하는 한편 상호연결부가 전기 계층에 걸쳐 다수의 프로토콜들을 라우팅하는 것을 또한 가능하게 하도록 구현된다. 그러한 구현들은, 프로토콜 애그노스틱(agnostic)이고 잠재적으로는 임의의 기존 또는 향후의 상호연결 프로토콜과 함께 동작하도록 구조화되는 모듈식 공통 물리 계층을 제공 및 정의한다.
도 121을 참조하면, 다중칩 링크(MCL)의 예시적인 구현을 포함하는 시스템의 적어도 일부분을 표현하는 간략화된 블록도(12100)가 도시된다. MCL은 제1 디바이스(12105)(예컨대, 하나 이상의 하위 구성요소를 포함하는 제1 다이)를 제2 디바이스(12110)(예컨대, 하나 이상의 다른 하위 구성요소를 포함하는 제2 다이)와 연결하는 물리적 전기 연결들(예컨대, 레인들로서 구현되는 와이어들)을 사용하여 구현될 수 있다. 도면(12100)의 고레벨 표현에 도시된 특정 예에서, (채널들(12115, 12120) 내의) 모든 신호들은 단방향일 수 있고, 데이터 신호들이 업스트림 및 다운스트림 데이터 전송 둘 모두를 갖도록 레인들이 제공될 수 있다. 도 121의 블록도(12100)가 제1 구성요소(12105)를 업스트림 구성요소로서, 제2 구성요소(12110)를 다운스트림 구성요소들로서, 데이터를 전송하는 데 사용되는 MCL의 물리적 레인들을 다운스트림 채널(12115)로서 그리고 (구성요소(12110)로부터) 데이터를 수신하는 데 사용되는 레인들을 업스트림 채널(12120)로서 참조하지만, 디바이스들(12105, 12110) 사이의 MCL은 디바이스들 사이에서의 데이터 전송 및 수신 둘 모두를 위해 각각의 디바이스에 의해 사용될 수 있다는 것이 인식되어야 한다.
일 예시적인 구현에서, MCL은, 전기적 MCL PHY(12125a,b)(또는 총괄적으로 12125)와 MCL 논리적 PHY(12130a,b)(또는 총괄적으로 12130)를 구현하는 실행가능 논리를 포함하는 물리 계층(PHY)을 제공할 수 있다. 전기적 또는 물리적 PHY(12125)는 물리적 연결을 제공하며, 그 물리적 연결을 통해 데이터가 디바이스들(12105, 12110) 사이에서 통신된다. 링크의 높은 데이터 레이트 및 채널 구성 능력들을 설정하기 위해 신호 컨디셔닝 구성요소들 및 논리가 물리적 PHY(12125)와 관련하여 구현될 수 있으며, 이는 일부 애플리케이션들에서, 대략적으로 45 ㎜ 이상의 길이들로 엄격하게 클러스터링된 물리적 연결들을 수반한다. 논리적 PHY(12130)는 클로킹, (예컨대, 링크 계층들(12135a, 12135b)에 대한) 링크 상태 관리, 및 MCL을 통한 통신들에 사용되는 잠재적인 다수의 상이한 프로토콜들 간의 프로토콜 다중화를 용이하게 하기 위한 회로를 포함한다.
일 예시적인 구현에서, 물리적 PHY(12125)는, 각각의 채널(예컨대, 12115, 12120)에 대해 데이터 레인들의 세트를 포함하며, 이들을 통해 대역 내 데이터가 전송된다. 이러한 특정 예에서, 업스트림 및 다운스트림 채널들(12115, 12120) 각각에 50개의 데이터 레인들이 제공되지만, 레이아웃 및 전력 제약들, 원하는 애플리케이션들, 디바이스 제약들 등에 의해 허용되는 바와 같은 임의의 다른 수의 레인들이 사용될 수 있다. 각각의 채널은, 채널에 대한 스트로브 또는 클록 신호를 위한 하나 이상의 전용 레인, 채널에 대한 유효 신호를 위한 하나 이상의 전용 레인, 스트림 신호를 위한 하나 이상의 전용 레인, 및 링크 상태 기계 관리 또는 측대역 신호를 위한 하나 이상의 전용 레인을 더 포함할 수 있다. 물리적 PHY는, 일부 예들에서, 다른 예들 중에서도, MCL 연결 디바이스들(12105, 12110)의 상태 전환들 및 다른 속성들을 조정하는 데 사용되는 양방향의 더 낮은 주파수 제어 신호 링크일 수 있는 측대역 링크(12140)를 더 포함할 수 있다.
위에 언급된 바와 같이, MCL의 구현을 사용하여 다수의 프로토콜이 지원된다. 실제로, 다수의 독립적인 트랜잭션 계층들(12150a, 12150b)이 각각의 디바이스(12105, 12110)에서 제공될 수 있다. 예를 들면, 각각의 디바이스(12105, 12110)는, 다른 것들 중에서도, PCI, PCIe, CAC와 같은 2개 이상의 프로토콜을 지원하고 활용할 수 있다. CAC는 코어들, 최종 레벨 캐시(LLC)들, 메모리, 그래픽들, 및 I/O 제어기들 간에 통신하기 위해 온-다이로 사용되는 일관성있는 프로토콜이다. 이더넷 프로토콜, 인피니밴드 프로토콜들, 및 다른 PCIe 패브릭 기반 프로토콜들을 포함하는 다른 프로토콜들이 또한 지원될 수 있다. 논리적 PHY 및 물리적 PHY의 조합은 또한, 다른 예들 중에서도, 하나의 다이 상의 SerDes PHY(PCIe, 이더넷, 인피니밴드 또는 다른 고속 SerDes)를 다른 다이 상에 구현되는 그의 상위 계층들에 연결하기 위한 다이 간 상호연결부로서 사용될 수 있다.
논리적 PHY(12130)는 MCL 상의 이러한 다수의 프로토콜들 사이의 다중화를 지원한다. 예를 들면, 전용 스트림 레인은 어느 프로토콜이 채널의 데이터 레인들 상에서 실질적으로 동시에 전송되는 데이터에 적용되어야 하는지를 식별하는 인코딩된 스트림 신호를 어써팅(assert)하는데 사용될 수 있다. 또한, 논리적 PHY(12130)는 다양한 프로토콜들이 지원할 수 있거나 요청할 수 있는 다양한 유형들의 링크 상태 전환들을 협상한다. 일부 예시들에서, 채널의 전용 LSM_SB 레인을 통해 전송되는 LSM_SB 신호들이 측대역 링크(12140)와 함께 사용되어, 디바이스들(12105, 12110) 간의 링크 상태 전환들을 통신 및 협상할 수 있다. 추가로, 종래의 상호연결부들의 링크 훈련, 오류 검출, 스큐 검출, 디-스큐잉, 및 다른 기능성은 부분적으로 논리적 PHY(12130)를 사용하여 대체 또는 통제될 수 있다. 예를 들면, 각각의 채널 내의 하나 이상의 전용 유효 신호 레인을 통해 전송되는 유효 신호들은, 다른 예들 중에서도, 링크 활동을 시그널링하고, 스큐를 검출하고, 링크 오류들을 검출하고, 다른 특징들을 실현하는 데 사용될 수 있다. 도 121의 특정 예에서, 채널별로 다수의 유효 레인들이 제공된다. 예를 들면, 채널 내의 데이터 레인들은 (물리적으로 및/또는 논리적으로) 번들링 또는 클러스터링될 수 있고, 유효 레인은 각각의 클러스터에 대해 제공될 수 있다. 추가로, 일부 경우들에서는, 다른 예들 중에서도, 채널 내의 복수의 데이터 레인 클러스터들의 각각의 클러스터에 대해 전용 스트로브 신호를 제공하기 위해 다수의 스트로브 레인들이 제공될 수 있다.
위에 언급된 바와 같이, 논리적 PHY(12130)는 MCL에 의해 연결된 디바이스들 사이에서 전송되는 링크 제어 신호들을 협상 및 관리한다. 일부 구현들에서, 논리적 PHY(12130)는 MCL을 통해(즉, 대역 내에서) 링크 계층 제어 메시지들을 전송하기 위한 링크 계층 패킷(LLP) 생성 회로(12160)를 포함한다. 그러한 메시지들은 채널의 데이터 레인들을 통해 전송될 수 있고, 스트림 레인은, 다른 예들 중에서도, 데이터가 링크 계층 제어 데이터와 같은 링크 계층 간 메시징인 것을 식별한다. LLP 모듈(12160)을 사용하여 인에이블되는 링크 계층 메시지들은, 디바이스들(12105, 12110) 각각의 링크 계층들(12135a, 12135b) 사이의 다른 링크 계층 특징들 중에서도, 링크 계층 상태 전환, 전력 관리, 루프백, 디스에이블, 재-중심조정, 스크램블링의 협상 및 성능을 보조한다.
도 122를 참조하면, 예시적인 MCL의 예시적인 논리적 PHY를 예시하는 간략화된 블록도(12200)가 도시된다. 물리적 PHY(12205)는, 논리적 PHY(12210)와 MCL의 링크 계층을 지원하는 부가적인 논리를 포함하는 다이에 연결될 수 있다. 이러한 예에서, 다이는 MCL 상의 다수의 상이한 프로토콜들을 지원하기 위한 논리를 더 포함할 수 있다. 예컨대, 도 122의 예에서, PCIe 논리(12215)뿐만 아니라 CAC 논리(12220)가 제공되며, 그로써, 잠재적인 많은 다른 예들 중에서도, 2개 초과의 프로토콜 또는 PCIe 및 CAC 이외의 프로토콜들이 MCL을 통해 지원되는 예들을 포함하는, 2개의 다이를 연결하는 동일한 MCL을 통해 PCIe 또는 CAC를 사용하여 다이들이 통신할 수 있다. 다이들 사이에서 지원되는 다양한 프로토콜들은 다양한 레벨들의 서비스 및 특징들을 제공할 수 있다.
논리적 PHY(12210)는 다이의 상위 계층 논리의 요청들(예컨대, PCIe 또는 CAC를 통해 수신됨)과 관련하여 링크 상태 전환들을 협상하기 위한 링크 상태 기계 관리 논리(12225)를 포함할 수 있다. 논리적 PHY(12210)는 일부 구현들에서 링크 테스팅 및 디버그 논리(예컨대, 12230)를 더 포함할 수 있다. 위에 언급된 바와 같이, 예시적인 MCL은 MCL의 (다른 예시적인 특징들 중에서도) 프로토콜 애그노스틱, 고성능, 및 전력 효율 특징들을 가능하게 하기 위해 MCL을 통해 다이들 사이에서 전송되는 제어 신호들을 지원할 수 있다. 예를 들면, 논리적 PHY(12210)는, 위의 예들에서 설명된 바와 같이, 전용 데이터 레인들을 통한 데이터의 전송 및 수신과 관련하여 유효 신호들, 스트림 신호들, 및 LSM 측대역 신호들의 생성 및 전송뿐만 아니라 수신 및 처리를 지원할 수 있다.
일부 구현들에서, 다중화(예컨대, 12235) 및 역다중화(예컨대, 12240) 논리는, 논리적 PHY(12210)에 포함될 수 있거나 그렇지 않으면 논리적 PHY(12210)가 그들에 액세스가능할 수 있다. 예를 들면, 다중화 논리(예컨대, 12235)는 MCL 상으로 송출될 데이터(예컨대, 패킷들, 메시지들 등으로서 구현됨)를 식별하는 데 사용될 수 있다. 다중화 논리(12235)는 데이터를 통제하는 프로토콜을 식별할 수 있고, 프로토콜을 식별하도록 인코딩되는 스트림 신호를 생성할 수 있다. 예컨대, 일 예시적인 구현에서, 스트림 신호는 2개의 16진수 심볼(예컨대, CAC: FFh; PCIe: F0h; LLP: AAh; 측대역: 55h 등)의 바이트로서 인코딩될 수 있고, 식별된 프로토콜에 의해 통제되는 데이터의 동일한 윈도우(예컨대, 바이트 시간 기간 윈도우) 동안 전송될 수 있다. 유사하게, 역다중화 논리(12240)는, 착신 스트림 신호들을 해석하여 스트림 신호를 디코딩하고, 데이터 레인들 상에서 스트림 신호와 동시에 수신된 데이터에 적용할 프로토콜을 식별하는 데 이용될 수 있다. 그런 다음, 역다중화 논리(12240)는 프로토콜 특정 링크 계층 처리를 적용(또는 보장)하고, 데이터가 대응하는 프로토콜 논리(예컨대, PCIe 논리(12215) 또는 CAC 논리(12220))에 의해 처리되게 할 수 있다.
논리적 PHY(12210)는, 전력 관리 태스크들, 루프백, 디스에이블, 재-중심조정, 스크램블링 등을 포함하는 다양한 링크 제어 기능들을 처리하는 데 사용될 수 있는 링크 계층 패킷 논리(12250)를 더 포함할 수 있다. LLP 논리(12250)는, 다른 기능들 중에서도, MCLP를 통한 링크 계층 간 메시지들을 용이하게 할 수 있다. LLP 시그널링에 대응하는 데이터는 또한, 데이터 레인 LLP 데이터를 식별하도록 인코딩되는 전용 스트림 신호 레인 상에서 전송되는 스트림 신호에 의해 식별될 수 있다. 다중화 및 역다중화 논리(예컨대, 12235, 12240)는 또한 LLP 트래픽에 대응하는 스트림 신호들을 생성 및 해석하는 데 사용될 수 있을 뿐만 아니라, 그러한 트래픽이 적절한 다이 논리(예컨대, LLP 논리(12250))에 의해 처리되게 하는 데 사용될 수 있다. 마찬가지로, MCLP의 일부 구현들은, 다른 예들 중에서도, 비동기 및/또는 더 낮은 주파수 측대역 채널과 같은, 전용 측대역(예컨대, 측대역(12255) 및 지원 논리)을 포함할 수 있다.
논리적 PHY 논리(12210)는 링크 상태 관리 메시징을 생성하고 전용 LSM 측대역 레인을 통해 수신(및 사용)할 수 있는 링크 상태 기계 관리 논리를 더 포함할 수 있다. 예를 들면, LSM 측대역 레인은, 다른 잠재적인 예들 중에서도, 링크 훈련 상태를 발전시키기 위해 핸드셰이킹(handshaking)을 수행하고, 전력 관리 상태들(예컨대, L1 상태)로부터 퇴장하는 데 사용될 수 있다. LSM 측대역 신호는, 그 신호가 링크의 데이터 신호, 유효 신호, 및 스트림 신호와 정렬되지 않지만, 그 대신, 다른 예들 중에서도, 시그널링 상태 전환들에 대응하고, 링크에 의해 연결되는 2개의 다이 또는 칩 사이에 링크 상태 기계를 정렬시킨다는 점에서 비동기 신호일 수 있다. 전용 LSM 측대역 레인을 제공하는 것은, 일부 예들에서, 다른 예시적인 이점들 중에서도, 아날로그 전단(AFE)의 종래의 스??치(squelch) 및 수용된 검출 회로들이 제거될 수 있게 할 수 있다.
도 123을 참조하면, MCL을 구현하는 데 사용되는 논리의 다른 표현을 예시하는 간략화된 블록도(12300)가 도시된다. 예컨대, 논리적 PHY(12210)에는 정의된 논리적 PHY 인터페이스(LPIF)(12305)가 제공되며, 이를 통해, 시그널링 모드들(예컨대, 측대역) 및 복수의 상이한 프로토콜들(예컨대, PCIe, CAC, PDCI, MA 등)(12315, 12320, 12325) 중 임의의 하나가 예시적인 MCL의 물리 계층과 인터페이싱할 수 있다. 일부 구현들에서, 다중화 및 중재 논리(12330)가 또한 논리적 PHY(12210)와 별개의 계층으로서 제공될 수 있다. 일 예에서, LPIF(12305)는 이러한 MuxArb 계층(1230)의 양측 상의 인터페이스로서 제공될 수 있다. 논리적 PHY(12210)는 다른 인터페이스를 통해 물리적 PHY(예컨대, MCL PHY의 아날로그 전단(AFE)(12205))와 인터페이싱할 수 있다.
LPIF는, 완전히 상이한 PHY가 상위 계층들에 투명한 LPIF 하에서 구현될 수 있도록, 상위 계층들(예컨대, 12315, 12320, 12325)로부터 PHY(논리적 및 전기/아날로그)를 추상화할 수 있다. 이는, 다른 예들 중에서도, 기본 시그널링 기술 PHY가 업데이트될 때 상위 계층들이 온전하게 유지될 수 있기 때문에, 설계에서 모듈성 및 재사용을 촉진시키는 것을 보조할 수 있다. 추가로, LPIF는 다중화/역다중화, LSM 관리, 오류 검출 및 처리, 및 논리적 PHY의 다른 기능성을 가능하게 하는 다수의 신호들을 정의할 수 있다. 예컨대, 아래의 표는 예시적인 LPIF에 대해 정의될 수 있는 신호들의 적어도 일부분을 요약한다:
Figure 112020130859394-pat00003
표에서 언급된 바와 같이, 일부 구현들에서, 정렬 메커니즘은 AlignReq/AlignAck 핸드셰이크를 통해 제공될 수 있다. 예컨대, 물리 계층이 복원에 진입할 때, 일부 프로토콜들은 패킷 프레이밍을 손실할 수 있다. 패킷들의 정렬은, 예를 들면, 링크 계층에 의한 정확한 프레이밍 식별을 보장하도록 정정될 수 있다. 물리 계층은 자신이 복원에 진입할 때 StallReq 신호를 어써팅할 수 있으며, 그에 따라, 링크 계층은, 새로운 정렬된 패킷이 전송될 준비가 될 때 Stall 신호를 어써팅한다. 물리 계층 논리는 Stall 및 Valid 둘 모두를 샘플링하여 패킷이 정렬되어 있는지를 결정할 수 있다. 예를 들면, 물리 계층은, Stall 및 Valid가 어써팅되어 샘플링될 때까지 링크 계층 패킷들을 드레인하기 위해 trdy를 계속 드라이빙할 수 있으며, 다른 잠재적인 구현들 중에서도, 패킷 정렬을 보조하기 위해 Valid를 사용하는 다른 대안적인 구현들이 포함된다.
MCL 상의 신호들에 대해 다양한 장애 허용오차들이 정의될 수 있다. 예를 들면, 유효, 스트림, LSM 측대역, 저주파수 측대역, 링크 계층 패킷들, 및 다른 유형들의 신호들에 대해 장애 허용오차들이 정의될 수 있다. MCL의 전용 데이터 레인들을 통해 전송된 패킷들, 메시지들, 및 다른 데이터에 대한 장애 허용오차들은 데이터를 통제하는 특정 프로토콜에 기반할 수 있다. 일부 구현들에서, 다른 잠재적인 예들 중에서도, 순환 중복 검사(CRC), 재시도 버퍼들과 같은 오류 검출 및 처리 메커니즘들이 제공될 수 있다. 예들로서, MCL을 통해 전송된 PCIe 패킷들의 경우, 32 비트 CRC가 PCIe 트랜잭션 계층 패킷(TLP)들에 활용될 수 있고((예컨대, 리플레이 메커니즘을 통해) 전달이 보장됨), 16 비트 CRC가 PCIe 링크 계층 패킷들(이는, (예컨대, 리플레이가 적용되지 않는 경우) 손실이 발생하도록 구조화될 수 있음)에 활용될 수 있다. 추가로, PCIe 프레이밍 토큰들의 경우, 특정 해밍 거리(예컨대, 4의 해밍 거리)가 토큰 식별자에 대해 정의될 수 있고; 다른 예들 중에서도, 패리티 및 4 비트 CRC가 또한 활용될 수 있다. 반면에, CAC 패킷들의 경우, 16 비트 CRC가 활용될 수 있다.
일부 구현들에서는, (예컨대, 비트 및 심볼 잠금을 보장하는 것을 보조하기 위해) 로우로부터 하이(즉, 0-1)로 전환하기 위해 유효 신호를 활용하는 링크 계층 패킷(LLP)들에 대해 장애 허용오차들이 정의된다. 추가로, 일 예에서, 특정한 수의 연속적이고 동일한 LLP들이 전송되도록 정의될 수 있고, 각각의 요청에 대해 응답들이 예상될 수 있으며, 요청자는 응답 타임아웃 이후에 재시도하고, 이는 다른 정의된 특성들 중에서도, MCL 상의 LLP 데이터에서의 장애들을 결정하는 기준으로서 사용될 수 있다. 추가적인 예들에서, 예컨대, 전체 시간 기간 윈도우 또는 심볼에 걸쳐 (예컨대, 8개의 UI에 대해 유효 신호를 하이로 유지함으로써) 유효 신호를 연장하는 것을 통해, 유효 신호에 대한 장애 허용오차가 제공될 수 있다. 부가적으로, 스트림 신호들에서의 오류들 또는 장애들은, 다른 예들 중에서도, 스트림 신호의 인코딩 값들에 대한 해밍 거리를 유지함으로써 방지될 수 있다.
논리적 PHY의 구현들은 오류 검출, 오류 보고, 및 오류 처리 논리를 포함한다. 일부 구현들에서, 예시적인 MCL의 논리적 PHY는, 다른 예들 중에서도, (예컨대, 유효 및 스트림 레인들에 대한) PHY 계층 디-프레이밍(de-framing) 오류들, (예컨대, LSM 상태 전환들에 관한) 측대역 오류들, (예컨대, LSM 상태 전환들에 중요한) LLP들에서의 오류들을 검출하기 위한 논리를 포함할 수 있다. 일부 오류 검출/분석은, 다른 예들 중에서도, PCIe 특정 오류들을 검출하도록 적응되는 PCIe 논리와 같은 상위 계층 논리에 위임될 수 있다.
디-프레이밍 오류들의 경우에, 일부 구현들에서, 하나 이상의 메커니즘이 오류 처리 논리를 통해 제공될 수 있다. 디-프레이밍 오류들은 수반되는 프로토콜에 기반하여 처리될 수 있다. 예를 들면, 일부 구현들에서, 재시도를 트리거링하기 위해 링크 계층들에 오류가 통지될 수 있다. 디-프레이밍은 또한 논리적 PHY 디-프레이밍의 재정렬을 야기할 수 있다. 추가로, 다른 기법들 중에서도, 논리적 PHY의 재-중심조정이 수행될 수 있고, 심볼/윈도우 잠금이 재획득될 수 있다. 일부 예들에서, 중심조정은, PHY가 수신기 클록 페이즈를 최적의 지점으로 이동시켜 착신 데이터를 검출하는 것을 포함할 수 있다. 이러한 맥락에서, "최적"은 잡음 및 클록 지터에 대한 가장 큰 여유도를 갖는 경우를 지칭할 수 있다. 재-중심조정은, 다른 예들 중에서도, 예를 들면, PHY가 저전력 상태로부터 기상할 때 수행되는 단순화된 중심조정 기능들을 포함할 수 있다.
다른 유형들의 오류들은 다른 오류 처리 기법들을 수반할 수 있다. 예를 들면, 측대역에서 검출된 오류들은 (예컨대, LSM의) 대응하는 상태의 타임아웃 메커니즘을 통해 포착될 수 있다. 오류가 로그될 수 있고, 그런 다음, 링크 상태 기계는 리셋으로 전환될 수 있다. LSM은 재시작 명령이 소프트웨어로부터 수신될 때까지 리셋에 유지될 수 있다. 다른 예에서, 링크 제어 패킷 오류와 같은 LLP 오류들은, LLP 시퀀스에 대한 확인응답이 수신되지 않는 경우 LLP 시퀀스를 재시작할 수 있는 타임아웃 메커니즘으로 처리될 수 있다.
일부 실시예들에서, 위의 프로토콜들 각각은 PCIe의 변형이다. PCIe 디바이스들은 버스와 연관되는 공통 어드레스 공간을 사용하여 통신한다. 이러한 어드레스 공간은 버스 어드레스 공간 또는 PCIe 어드레스 공간이다. 일부 실시예들에서, PCIe 디바이스들은 PCIe 어드레스 공간과 상이할 수 있는 내부 어드레스 공간의 어드레스들을 사용한다.
PCIe 규격들은, PCIe 디바이스가 자신의 로컬 메모리(또는 그의 일부)를 버스에 노출시키고 그에 따라 CPU 또는 버스에 부착된 다른 디바이스들이 자신의 메모리에 직접 액세스할 수 있게 하는 메커니즘을 정의한다. 전형적으로, 각각의 PCIe 디바이스에는, PCI 기준 어드레스 레지스터(BAR)로 지칭되는 PCIe 어드레스 공간 내의 전용 구역이 배정된다. 게다가, 디바이스가 노출하는 어드레스들은 PCI BAR 내의 개개의 어드레스에 맵핑된다.
일부 실시예들에서, PCIe 디바이스(예컨대, HCA)는, 입력/출력 메모리 맵핑 유닛(IOMMU)을 사용하여 자신의 내부 어드레스들과 PCIe 버스 어드레스들 사이를 변환한다. 다른 실시예들에서, PCIe 디바이스는 PCI 어드레스 변환 서비스(ATS)를 사용하여 어드레스 변환 및 분석을 수행할 수 있다. 일부 실시예들에서, 변환될 어드레스들을 특정 프로세스의 가상 어드레스 공간에 속하는 것으로 특정하기 위해 프로세스 어드레스 공간 ID(PASID) 태그들과 같은 태그들이 사용된다.
도 28은 일 구현에 대한 부가적인 세부사항들을 예시한다. 위에 설명된 구현들에서와 같이, 이러한 구현은, 다중-프로토콜 링크(2800)를 통해 호스트 메모리(2860)를 갖는 호스트 프로세서(2802)에 결합되는 가속기 메모리(2850)를 갖는 가속기(2801)를 포함한다. 언급된 바와 같이, 가속기 메모리(2850)는 호스트 메모리(2860)와 상이한 메모리 기술을 활용할 수 있다(예컨대, 가속기 메모리는 HBM 또는 적층식 DRAM일 수 있는 한편 호스트 메모리는 SDRAM일 수 있음).
다중화기들(2811 및 2812)은 다중-프로토콜 링크(2800)가 PCDI, CAC, 및 MA 프로토콜(예컨대, SMI3+) 트래픽을 지원하는 동적으로 다중화된 버스라는 사실을 강조하도록 도시되어 있으며, 이들 각각은 가속기(2801) 및 호스트 프로세서(2802) 내의 상이한 기능 구성요소들로 라우팅될 수 있다. 제한이 아닌 예로서, 이러한 프로토콜들은 IOSF, IDI 및 SMI3+를 포함할 수 있다. 일 구현에서, 가속기(2801)의 PCIe 논리(2820)는, 명령들을 실행할 때 하나 이상의 가속기 코어(2830)에 의한 사용을 위해 가상-물리 어드레스 변환들을 캐싱하기 위한 로컬 TLB(2822)를 포함한다. 언급된 바와 같이, 가상 메모리 공간은 가속기 메모리(2850)와 호스트 메모리(2860) 사이에 분배된다. 유사하게, 호스트 프로세서(2802) 상의 PCIe 논리는, PCIe I/O 디바이스들(2806)의 그리고 일 구현에서는 가속기(2801)의 메모리 액세스들을 관리하기 위한 I/O 메모리 관리 유닛(IOMMU)(2810)을 포함한다. 가속기 상의 PCIe 논리(2820)에서 예시된 바와 같이, 호스트 프로세서 상의 PCIe 논리(2808)는, 디바이스 발견, 레지스터 액세스, 디바이스 구성 및 초기화, 인터럽트 처리, DMA 연산들, 및 어드레스 변환 서비스들(ATS)과 같은 기능들을 수행하기 위해 PCDI 프로토콜을 사용하여 통신한다. 언급된 바와 같이, 호스트 프로세서(2802) 상의 IOMMU(2810)는 이러한 기능들에 대한 제어 및 조정의 중심점으로서 동작할 수 있다.
일 구현에서, 가속기 코어(2830)는 가속기에 의해 요구되는 기능들을 수행하는 처리 엔진들(요소들)을 포함한다. 게다가, 가속기 코어(2830)는 호스트 메모리(2860)에 저장된 페이지들을 국부적으로 캐싱하기 위한 호스트 메모리 캐시(2834) 및 가속기 메모리(2850)에 저장된 페이지들을 캐싱하기 위한 가속기 메모리 캐시(2832)를 포함할 수 있다. 일 구현에서, 가속기 코어(2830)는 CAC 프로토콜을 통해 호스트 프로세서(2802)의 일관성 및 캐시 논리(2807)와 통신하여, 가속기(2801)와 호스트 프로세서(2802) 사이에서 공유되는 캐시 라인들이 일관성있게 유지되는 것을 보장한다.
가속기(2801)의 바이어스/일관성 논리(2840)는 다중-프로토콜 링크(2800)를 통해 불필요한 통신을 감소시키면서 데이터 일관성을 보장하기 위해, (예컨대, 페이지 레벨 세분성으로) 본원에서 설명된 다양한 디바이스/호스트 바이어스 기법들을 구현한다. 예시된 바와 같이, 바이어스/일관성 논리(2840)는 MA 메모리 트랜잭션들(예컨대, SMI3+)을 사용하여 호스트 프로세서(2802)의 일관성 및 캐시 논리(2807)와 통신한다. 일관성 및 캐시 논리(2807)는 그의 LLC(2809), 호스트 메모리(2860), 가속기 메모리(2850) 및 캐시들(2832, 2834), 및 코어들(2805)의 개별 캐시들 각각에 저장된 데이터의 일관성을 유지하는 것을 담당한다.
요약하면, 가속기(2801)의 일 구현은, PDCI 프로토콜(효과적으로는, 다중화된 버스용으로 다시 포맷된 PCIe 프로토콜임)에 의해 액세스되는 호스트 프로세서(2802) 상에서 실행되는 소프트웨어에 대한 PCIe 디바이스로서 나타난다. 가속기(2801)는 가속기 디바이스 TLB 및 표준 PCIe 어드레스 변환 서비스들(ATS)을 사용하여 공유 가상 메모리에 참여할 수 있다. 가속기는 또한 일관성/메모리 에이전트로서 취급될 수 있다. 특정 능력들(예컨대, 아래에 설명되는 ENQCMD, MOVDIR)은 (예컨대, 작업 제출을 위해) PDCI 상에서 이용가능한 한편, 가속기는, 가속기에서 그리고 특정 바이어스 전환 흐름들에서 호스트 데이터를 캐싱하기 위해 CAC를 사용할 수 있다. 호스트로부터의 가속기 메모리에 대한 액세스들(또는 가속기로부터의 호스트 바이어스 액세스들)은 설명된 바와 같이 MA 프로토콜을 사용할 수 있다.
도 29에 예시된 바와 같이, 일 구현에서, 가속기는, PCI 구성 레지스터들(2902), 및 디바이스 후단 리소스들(2905)에 대한 액세스를 제공하도록 프로그래밍될 수 있는 MMIO 레지스터들(2906)을 포함한다. 일 구현에서, MMIO 레지스터들(2906)에 대한 기준 어드레스들은 PCI 구성 공간에서 한 세트의 기준 어드레스 레지스터(BAR)들(2901)에 의해 특정된다. 이전의 구현들과는 달리, 본원에서 설명된 데이터 스트리밍 가속기(DSA)의 일 구현은 다수의 채널들 또는 PCI 기능들을 구현하지 않으며, 따라서, 디바이스에 각각의 레지스터의 하나의 인스턴스만이 존재한다. 그러나, 단일 플랫폼에 하나 초과의 DSA 디바이스가 존재할 수 있다.
구현은 본원에 설명되지 않은 부가적인 성능 또는 디버그 레지스터들을 제공할 수 있다. 임의의 그러한 레지스터들은 구현 특정적인 것으로 간주되어야 한다.
PCI 구성 공간 액세스들은 정렬된 1, 2, 또는 4 바이트 액세스들로서 수행된다. PCI 구성 공간에서의 구현되지 않은 레지스터들 및 예비 비트들에 액세스하는 것에 대한 규칙들에 대해서는 PCI 익스프레스 기준 규격을 참조한다.
BAR0 구역(능력, 구성, 및 상태 레지스터들)에 대한 MMIO 공간 액세스들은 정렬된 1, 2, 4 또는 8 바이트 액세스들로서 수행된다. 8 바이트 액세스들은 8 바이트 레지스터들에만 사용되어야 한다. 소프트웨어는 구현되지 않은 레지스터들을 판독하거나 기입하지 않아야 한다. BAR2 및 BAR4 구역들에 대한 MMIO 공간 액세스들은 ENQCMD, ENQCMDS, 또는 MOVDIR64B 명령어들(아래에서 상세히 설명됨)을 사용하여 64 바이트 액세스들로서 수행되어야 한다. ENQCMD 또는 ENQCMDS는 공유로서 구성되는 작업 큐(SWQ)에 액세스하는 데 사용되어야 하고, MOVDIR64B는 전용으로서 구성되는 작업 큐(DWQ)에 액세스하는 데 사용되어야 한다.
DSA PCI 구성 공간의 일 구현은 3개의 64 비트 BAR들(2901)을 구현한다. 디바이스 제어 레지스터(BAR0)는, 디바이스 제어 레지스터들의 물리적 기준 어드레스를 포함하는 64 비트 BAR이다. 이러한 레지스터들은, 디바이스 능력들, 디바이스를 구성 및 인에이블하기 위한 제어들, 및 디바이스 상태에 관한 정보를 제공한다. BAR0 구역의 크기는 인터럽트 메시지 저장소(2904)의 크기에 의존한다. 크기는, 인터럽트 메시지 저장소 엔트리들(2904)의 수에 16을 곱하여 32 KB를 더한 다음 2의 다음 제곱수로 반올림된다. 예컨대, 디바이스가 1024개의 인터럽트 메시지 저장소 엔트리(2904)를 지원하는 경우, 인터럽트 메시지 저장소는 16 KB이고, BAR0의 크기는 64 KB이다.
BAR2는 특권 및 비-특권 포털의 물리적 기준 어드레스를 포함하는 64 비트 BAR이다. 각각의 포털은 크기가 64 바이트이고 별개의 4 KB 페이지 상에 위치한다. 이는, 포털들이 CPU 페이지 테이블들을 사용하여 상이한 어드레스 공간들로 독립적으로 맵핑될 수 있게 한다. 포털들은 기술어들을 디바이스에 제출하는 데 사용된다. 특권 포털들은 커널 모드 소프트웨어에 의해 사용되고, 비-특권 포털들은 사용자 모드 소프트웨어에 의해 사용된다. 비-특권 포털들의 수는 지원되는 작업 큐들의 수와 동일하다. 특권 포털들의 수는, 작업 큐들(WQ들)의 수 × (MSI-X 테이블 크기 ― 1)이다. 기술어를 제출하는 데 사용되는 포털의 어드레스는, 디바이스가, 기술어를 배치할 WQ, 포털이 특권인지 또는 비-특권인지, 및 완료 인터럽트에 사용될 수 있는 MSI-X 테이블 엔트리를 결정할 수 있게 한다. 예컨대, 디바이스가 8개의 WQ들을 지원하는 경우, 주어진 기술어에 대한 WQ는 (포털-어드레스 >> 12) & 0x7이다. 포털-어드레스 >> 15가 0이면, 포털은 비-특권이고; 그렇지 않으면, 포털은 특권이고, 완료 인터럽트에 사용되는 MSI-X(2903) 테이블 색인은 포털-어드레스 >> 15이다. 비트 5:0은 0이어야 한다. 비트 11:6은 무시되며; 그에 따라, 페이지 상의 임의의 64 바이트-정렬된 어드레스가 동일한 효과로 사용될 수 있다.
비-특권 포털을 사용하는 기술어 제출들은, 작업 큐 구성(WQCFG) 레지스터를 사용하여 구성되는 바와 같은, WQ의 점유 임계치에 영향을 받는다. 특권 포털을 사용하는 기술어 제출들은 임계치에 영향을 받지 않는다. SWQ에 대한 기술어 제출들은 ENQCMD 또는 ENQCMDS를 사용하여 제출되어야 한다. SWQ 포털에 대한 임의의 다른 기입 연산은 무시된다. DWQ에 대한 기술어 제출들은 64 바이트 기입 연산을 사용하여 제출되어야 한다. 소프트웨어는 MOVDIR64B을 사용하여 비-단속적 64 바이트 기입을 보장한다. 디스에이블된 또는 전용 WQ 포털에 대한 ENQCMD 또는 ENQCMDS는 Retry를 반환한다. DWQ 포털에 대한 임의의 다른 기입 연산은 무시된다. BAR2 어드레스 공간에 대한 임의의 판독 연산은 모두 1을 반환한다. 커널 모드 기술어들은 완료 인터럽트들을 수신하기 위해 특권 포털들을 사용하여 제출되어야 한다. 커널 모드 기술어가 비-특권 포털을 이용하여 제출되는 경우, 어떠한 완료 인터럽트도 요청될 수 없다. 사용자 모드 기술어들은 특권 또는 비-특권 포털을 사용하여 제출될 수 있다.
BAR2 구역 내의 포털들의 수는 디바이스에 의해 지원되는 WQ들의 수에 MSI-X(2903) 테이블 크기를 곱한 것이다. MSI-X 테이블 크기는 전형적으로 WQ들의 수 더하기 1이다. 따라서, 예컨대, 디바이스가 8개의 WQ를 지원하는 경우, BAR2의 유용한 크기는 8 × 9 × 4 KB = 288 KB일 것이다. BAR2의 총 크기는 2의 다음 제곱수로 반올림되거나 512 KB일 것이다.
BAR4는 게스트 포털들의 물리적 기준 어드레스를 포함하는 64 비트 BAR이다. 각각의 게스트 포털은 크기가 64 바이트이고 별개의 4 KB 페이지에 위치한다. 이는, 포털들이 CPU 확장 페이지 테이블(EPT)들을 사용하여 상이한 어드레스 공간들로 독립적으로 맵핑될 수 있게 한다. GENCAP에서의 인터럽트 메시지 저장 지원 필드가 0이면, 이러한 BAR은 구현되지 않는다.
게스트 포털들은 디바이스에 기술어들을 제출하기 위해 게스트 커널 모드 소프트웨어에 의해 사용될 수 있다. 게스트 포털들의 수는 인터럽트 메시지 저장소 내의 엔트리들의 수에 지원되는 WQ들의 수를 곱한 것이다. 기술어를 제출하는 데 사용되는 게스트 포털의 어드레스는, 디바이스가 기술어에 대한 WQ를 결정할 수 있게 하고, 또한, (기술어가 커널 모드 기술어이고, 완료 인터럽트 요청 플래그가 기술어에 설정되어 있는 경우) 기술어 완료를 위한 완료 인터럽트를 생성하는 데 인터럽트 메시지 저장소 엔트리를 사용할 수 있게 한다. 예컨대, 디바이스가 8개의 WQ들을 지원하는 경우, 주어진 기술어에 대한 WQ는 (게스트-포털-어드레스 >> 12) & 0x7이고, 완료 인터럽트에 사용되는 인터럽트 테이블 엔트리 색인은 게스트-포털-어드레스 >> 15이다.
일 구현에서, MSI-X는 DSA가 제공하는 유일한 PCIe 인터럽트 능력이고, DSA는 레거시 PCI 인터럽트들 또는 MSI를 구현하지 않는다. 이러한 레지스터 구조의 세부사항들은 PCI 익스프레스 규격에 있다.
일 구현에서, 3개의 PCI 익스프레스 능력은 어드레스 변환을 제어한다. 표 A에 도시된 바와 같이, 이러한 능력들에 대한 값들의 특정 조합들만이 지원될 수 있다. 값들은, 일반 제어 레지스터(GENCTRL)의 인에이블 비트가 1로 설정되는 시간에 검사된다.
Figure 112020130859394-pat00004
디바이스가 인에이블되어 있는 동안 이러한 능력들 중 임의의 능력이 소프트웨어에 의해 변경되는 경우, 디바이스는 중단될 수 있고 소프트웨어 오류 레지스터에서 오류가 보고된다.
일 구현에서, 소프트웨어는, 디바이스가 어드레스 변환을 수행하기 위해 PASID를 사용하는지 여부를 제어하도록 PASID 능력을 구성한다. PASID가 디스에이블된 경우, 물리적 어드레스들만이 사용될 수 있다. PASID가 인에이블된 경우, IOMMU 구성에 따라, 가상 또는 물리적 어드레스들이 사용될 수 있다. PASID가 인에이블된 경우, 어드레스 변환 서비스들(ATS) 및 페이지 요청 서비스들(PRS) 둘 모두가 인에이블되어야 한다.
일 구현에서, 소프트웨어는, 메모리 액세스들을 수행하기 전에 디바이스가 어드레스들을 변환해야 하는지 여부를 제어하도록 ATS 능력을 구성한다. IOMMU(2810)에서 어드레스 변환이 인에이블되는 경우, 수용가능한 시스템 성능을 획득하기 위해 디바이스에서 ATS가 인에이블되어야 한다. IOMMU(2810)에서 어드레스 변환이 인에이블되지 않은 경우, ATS는 디스에이블되어야 한다. ATS가 디스에이블된 경우, 물리적 어드레스들만이 사용될 수 있고, 모든 메모리 액세스들은 변환되지 않은 액세스들을 사용하여 수행된다. ATS는, PASID가 인에이블된 경우 인에이블되어야 한다.
일 구현에서, 소프트웨어는, 어드레스 변환이 실패할 때 디바이스가 페이지를 요청할 수 있는지 여부를 제어하도록 PRS 능력을 구성한다. PRS는, PASID가 인에이블된 경우 인에이블되어야 하고 PASID가 디스에이블된 경우 디스에이블되어야 한다.
일부 구현들은, 하나 이상의 프로세서 코어, 가속기 디바이스 및/또는 다른 유형들의 처리 디바이스(예컨대, I/O 디바이스) 사이에서 원활하게 공유되는 가상 메모리 공간을 활용한다. 특히, 일 구현은, 동일한 가상 메모리 공간이 코어들, 가속기 디바이스들, 및/또는 다른 처리 디바이스들 사이에서 공유되는 공유 가상 메모리(SVM) 아키텍처를 활용한다. 게다가, 일부 구현들은, 공통 가상 메모리 공간을 사용하여 처리되는 물리적 시스템 메모리의 이종 형태들을 포함한다. 물리적 시스템 메모리의 이종 형태들은 DSA 아키텍처들과 연결되기 위해 상이한 물리적 인터페이스들을 사용할 수 있다. 예컨대, 가속기 디바이스는 고 대역폭 메모리(HBM)와 같은 로컬 가속기 메모리에 직접 결합될 수 있고, 각각의 코어는 동적 무작위 액세스 메모리(DRAM)와 같은 호스트 물리적 메모리에 직접 결합될 수 있다. 이러한 예에서, 공유 가상 메모리(SVM)는, 가속기, 프로세서 코어들, 및/또는 다른 처리 디바이스들이 가상 메모리 어드레스들의 일관된 세트를 이용하여 HBM 및 DRAM에 액세스할 수 있도록, HBM 및 DRAM의 결합된 물리적 메모리에 맵핑된다.
이들 및 다른 특징들의 가속기들이 아래에서 상세히 설명된다. 간략한 개요로서, 상이한 구현들은 다음의 기반구조 특징들 중 하나 이상을 포함할 수 있다:
공유 가상 메모리(SVM): 일부 구현들은, 사용자 레벨 애플리케이션들이 기술어들 내의 가상 어드레스들로 직접 DSA에 명령들을 제출할 수 있게 하는 SVM을 지원한다. DSA는, 페이지 장애들을 처리하는 것을 비롯하여 입력/출력 메모리 관리 유닛(IOMMU)을 사용하여 가상 어드레스들을 물리적 어드레스들로 변환하는 것을 지원할 수 있다. 기술어에 의해 참조되는 가상 어드레스 범위들은 다수의 이종 메모리 유형들에 걸쳐 분산된 다수의 페이지들에 걸쳐 있을 수 있다. 부가적으로, 일 구현은 또한, 데이터 버퍼들이 물리적 메모리에서 연속해 있는 한, 물리적 어드레스들의 사용을 또한 지원한다.
부분적 기술어 완료: SVM 지원으로, 어드레스 변환 동안 페이지 장애에 직면하는 연산이 가능하다. 일부 경우들에서, 디바이스는 장애에 직면하는 지점에서 대응하는 기술어의 처리를 종결할 수 있고, 부분적 완료 및 장애 정보를 표시하는 완료 기록을 소프트웨어에 제공하여, 소프트웨어가 교정 동작들을 취하고 장애를 해결한 후에 동작을 재시도할 수 있게 한다.
배치(batch) 처리: 일부 구현들은 "배치"로 기술어들을 제출하는 것을 지원한다. 배치 기술어는 가상으로 연속적인 작업 기술어들(즉, 실제 데이터 연산들을 포함하는 기술어들)의 세트를 가리킨다. 배치 기술어를 처리할 때, DSA는 특정된 메모리로부터 작업 기술어들을 페치하여 그들을 처리한다.
상태 비저장(stateless) 디바이스: 일 구현에서의 기술어들은, 기술어를 처리하는 데 요구되는 모든 정보가 기술어 페이로드 그 자체에 있도록 설계된다. 이는, 디바이스가 클라이언트 특정 상태를 거의 저장하지 않을 수 있게 하여, 디바이스의 확장성을 개선한다. 하나의 예외는, 사용될 때 신뢰된 소프트웨어에 의해 구성되는 완료 인터럽트 메시지이다.
캐시 할당 제어: 이는, 애플리케이션들이, 캐시에 기입할지 또는 캐시를 우회하여 메모리에 직접 기입할지를 특정할 수 있게 한다. 일 구현에서, 완료 기록들은 항상 캐시에 기입된다.
공유 작업 큐(SWQ) 지원: 아래에서 상세히 설명되는 바와 같이, 일부 구현들은 인큐 명령(ENQCMD) 및 인큐 명령들(ENQCMDS)의 명령어들을 사용하여 공유 작업 큐(SWQ)들을 통한 규모조정가능한 작업 제출을 지원한다. 이러한 구현에서, SWQ는 다수의 애플리케이션에 의해 공유된다.
전용 작업 큐(DWQ) 지원: 일부 구현들에서, MOVDIR64B 명령어를 사용하여 전용 작업 큐들(DWQ)을 통해 높은 처리량 작업 제출을 지원한다. 이러한 구현에서, DWQ는 하나의 특정 애플리케이션에 전용된다.
QoS 지원: 일부 구현들은, 서비스 품질(QoS) 레벨이 각각의 작업 큐에 대해 (예컨대, 커널 드라이버에 의해) 특정될 수 있게 한다. 그러면, 상이한 애플리케이션들에 상이한 작업 큐들을 배정할 수 있어서, 상이한 애플리케이션들로부터의 작업이 상이한 우선순위들을 갖는 작업 큐들로부터 디스패치될 수 있게 한다. 작업 큐들은 패브릭 QoS에 대한 특정 채널들을 사용하도록 프로그래밍될 수 있다.
바이어싱된 캐시 일관성 메커니즘들
일 구현은, 적층식 DRAM 또는 HBM과 같은 메모리가 직접 부착된 가속기들의 성능을 개선하고, 메모리가 직접 부착된 가속기들을 이용하는 애플리케이션들에 대한 애플리케이션 개발을 단순화한다. 이러한 구현은, 가속기 부착 메모리가 시스템 메모리의 일부로서 맵핑될 수 있게 하고, (현재의 IOMMU 구현들에서 사용되는 것과 같은) 공유 가상 메모리(SVM) 기술을 사용하여 액세스될 수 있게 하지만, 전체 시스템 캐시 일관성과 연관된 전형적인 성능 단점들로부터 어려움을 겪지 않는다.
번거로운 캐시 일관성 오버헤드 없이 시스템 메모리의 일부로서 가속기 부착 메모리에 액세스하는 능력은, 가속기 오프로드에 대한 유익한 동작 환경을 제공한다. 시스템 어드레스 맵의 일부로서 메모리에 액세스하는 능력은, 종래의 I/O DMA 데이터 복사들의 오버헤드 없이 호스트 소프트웨어가 피연산자들을 설정하고 계산 결과들에 액세스하는 것을 허용할 수 있다. 그러한 종래의 복사들은 드라이버 호출들, 인터럽트들, 및 메모리 맵핑된 I/O(MMIO) 액세스들을 수반하며, 이들 모두가 단순한 메모리 액세스들에 비해 비효율적이다. 동시에, 캐시 일관성 오버헤드들 없이 가속기 부착 메모리에 액세스하는 능력은 오프로딩된 계산의 실행 시간에 중요할 수 있다. 상당한 스트리밍 기입 메모리 트래픽이 있는 경우들에서, 예컨대, 캐시 일관성 오버헤드는 가속기에 의해 보이는 유효 기입 대역폭을 반분할 수 있다. 피연산자 설정의 효율, 결과 액세스들의 효율, 및 가속기 계산의 효율은 모두 가속기 오프로드가 얼마나 잘 동작할 것인지를 결정하는 역할을 한다. 오프로드 작업의 비용(예컨대, 피연산자들을 설정하는 것, 결과들을 얻는 것)이 너무 높은 경우, 오프로딩이 전혀 성과를 내지 못할 수 있거나, 가속기를 매우 큰 작업들만으로 제한할 수 있다. 가속기가 계산을 실행하는 효율은 동일한 효과를 가질 수 있다.
일 구현은, 메모리 액세스를 개시하는 엔티티(예컨대, 가속기, 코어 등) 및 액세스되는 메모리(예컨대, 호스트 메모리 또는 가속기 메모리)에 따라 상이한 메모리 액세스 및 일관성 기법들을 적용한다. 이러한 기법들은 일반적으로 "일관성 바이어스" 메커니즘으로 지칭되며, 이는, 가속기 부착 메모리에 대해 2개의 세트의 캐시 일관성 흐름들을 제공하는데, 하나의 세트는 가속기에 부착된 메모리에 대한 효율적인 가속기 액세스에 최적화되고, 두 번째 세트는 가속기 부착 메모리에 대한 호스트 액세스 및 가속기 부착 메모리에 대한 공유 가속기/호스트 액세스에 최적화된다. 추가로, 그 기법들은 이러한 흐름들 사이에서 스위칭하기 위한 2개의 기법들을 포함하는데, 하나의 기법은 애플리케이션 소프트웨어에 의해 구동되고, 다른 하나의 기법은 자율 하드웨어 힌트들에 의해 구동된다. 일관성 흐름들의 두 세트들 모두에서, 하드웨어는 완전한 캐시 일관성을 유지한다.
도 30에 일반적으로 예시된 바와 같이, 일 구현은, 가속기(3001) 및 하나 이상의 컴퓨터 프로세서 칩을 포함하는 컴퓨터 시스템들에 적용되며, 하나 이상의 컴퓨터 프로세서 칩은 프로세서 코어들 및 I/O 회로(3003)를 갖고, 가속기(3001)는 다중-프로토콜 링크(2800)를 통해 프로세서에 결합된다. 일 구현에서, 다중-프로토콜 링크(3010)는 위에 상세히 설명된 것들을 포함하지만 그에 제한되지 않는 복수의 상이한 프로토콜들을 지원하는 동적으로 다중화된 링크이다. 그러나, 본 발명의 기본 원리는 임의의 특정 세트의 프로토콜들로 제한되지 않는다는 것이 유의되어야 한다. 게다가, 가속기(3001) 및 코어 I/O(3003)는 구현에 따라 동일한 반도체 칩 또는 상이한 반도체 칩들 상에 통합될 수 있다는 것을 유의한다.
예시된 구현에서, 가속기 메모리 버스(3012)는 가속기(3001)를 가속기 메모리(3005)에 결합시키고, 별개의 호스트 메모리 버스(3011)는 코어 I/O(3003)를 호스트 메모리(3007)에 결합시킨다. 언급된 바와 같이, 가속기 메모리(3005)는 고 대역폭 메모리(HBM) 또는 적층식 DRAM(그 일부 예들이 본원에서 설명됨)을 포함할 수 있고, 호스트 메모리(3007)는 2배속 동기식 동적 무작위 액세스 메모리(예컨대, DDR3 SDRAM, DDR4 SDRAM 등)와 같은 DRAM을 포함할 수 있다. 그러나, 본 발명의 기본 원리는 임의의 특정 유형들의 메모리 또는 메모리 프로토콜들로 제한되지 않는다.
일 구현에서, 가속기(3001), 및 프로세서 칩들(3003) 내의 처리 코어들 상에서 실행되는 "호스트" 소프트웨어 둘 모두는, "호스트 바이어스" 흐름들 및 "디바이스 바이어스" 흐름들로서 지칭되는 2개의 별개의 세트의 프로토콜 흐름들을 사용하여 가속기 메모리(3005)에 액세스한다. 아래에 설명되는 바와 같이, 일 구현은, 특정 메모리 액세스들에 대한 프로토콜 흐름들을 변조 및/또는 선택하기 위한 다수의 옵션들을 지원한다.
일관성 바이어스 흐름들은, 프로세서 칩들(3003) 중 하나와 가속기(3001) 사이의 다중-프로토콜 링크(2800) 상의 2개의 프로토콜 계층들, 즉, CAC 프로토콜 계층 및 MA 프로토콜 계층 상에서 부분적으로 구현된다. 일 구현에서, 일관성 바이어스 흐름들은: (a) 새로운 방식들로 CAC 프로토콜 내의 기존의 연산코드(opcode)들을 사용하는 것, (b) 기존의 MA 표준에 새로운 연산코드들을 부가하는 것, 및 (c) 다중-프로토콜 링크(3001)에 MA 프로토콜에 대한 지원을 부가하는 것(이전 링크들은 CAC 및 PCDI만을 포함함)에 의해 인에이블된다. 다중-프로토콜 링크는 단지 CAC 및 MA만을 지원하는 것으로 제한되지 않는다는 것을 유의하며; 일 구현에서는, 단순히, 적어도 그러한 프로토콜들을 지원할 것이 요구된다.
본원에서 사용되는 바와 같이, 도 30에 예시된 "호스트 바이어스" 흐름들은, 가속기 그 자체로부터의 요청들을 비롯하여, 가속기(3001)가 부착되는 프로세서 칩(3003) 내의 표준 일관성 제어기(3009)를 통해 가속기 메모리(3005)에 모든 요청들을 퍼넬링(funnel)하는 한 세트의 흐름들이다. 이는, 가속기(3001)로 하여금 자신 고유의 메모리에 액세스하기 위해 우회적 경로를 취하게 하지만, 가속기(3001) 및 프로세서 코어 I/O(3003) 둘 모두로부터의 액세스들이 프로세서의 표준 일관성 제어기들(3009)을 사용하여 일관성있게 유지될 수 있게 한다. 일 구현에서, 흐름들은, 프로세서 코어들(3009)이 일관성 제어기들(3009)에 요청들을 송출하는 방식과 동일하거나 유사한 방식으로, 다중-프로토콜 링크를 통해 프로세서의 일관성 제어기들(3009)에 요청들을 송출하기 위해 CAC 연산코드들을 사용한다. 예컨대, 프로세서 칩의 일관성 제어기들(3009)은, 가속기(3001)로부터의 요청들로부터 비롯되는 UPI 및 CAC 일관성 메시지들(예컨대, 스누프들)을, 그 메시지들이 프로세서 코어(3003)로부터의 요청들에 대한 것인 것처럼, 가속기를 대신하는 내부 프로세서 에이전트들 및 모든 피어 프로세서 코어 칩들(예컨대, 3003)에 송출할 수 있다. 이러한 방식으로, 가속기(3001)에 의해 액세스되는 데이터와 프로세서 코어들의 I/O(3003) 사이에 일관성이 유지된다.
일 구현에서, 일관성 제어기들(3009)은 또한 메모리 액세스 메시지들을 다중-프로토콜 링크(2800)를 통해 가속기의 메모리 제어기(3006)에 조건부로 송출한다. 이러한 메시지들은, 일관성 제어기들(3009)이 그들의 프로세서 다이에 국부적인 메모리 제어기들에 전송하는 메시지들과 유사하고, 데이터가 다중-프로토콜 링크(2800)의 프로세서의 일관성 제어기(3009)로 반환된 다음 다중-프로토콜 링크(2800)를 통해 CAC 응답으로서 가속기(3001)에 반환되게 강제하는 대신, 가속기(3001) 내부의 에이전트에 데이터가 직접 반환될 수 있게 하는 새로운 연산코드들을 포함한다.
도 30에 도시된 "호스트 바이어스" 모드의 일 구현에서, 가속기 부착 메모리(3005)를 대상으로 하는 프로세서 코어들(3003)로부터의 모든 요청들은, 그 요청들이 정상 호스트 메모리(3007)를 대상으로 했던 것처럼, 프로세서 일관성 제어기들(3009)에 직접 전송된다. 일관성 제어기들(3009)은, 그들이 가속기(3001)로부터의 액세스들에 대해 행하는 것처럼, 그리고 그들이 정상 호스트 메모리(3007)에 대한 액세스들에 대해 행하는 것처럼, 그들의 표준 캐시 일관성 알고리즘들을 적용하고 그들의 표준 캐시 일관성 메시지들을 전송할 수 있다. 일관성 제어기들(3009)은 또한 이러한 부류의 요청들에 대해 다중-프로토콜 링크(2800)를 통해 MA 명령들을 조건부로 전송하지만, 이러한 경우에, MA 흐름들은 다중-프로토콜 링크(2800)를 통해 데이터를 반환한다.
도 31에 예시된 "디바이스 바이어스" 흐름들은, 가속기(3001)가 호스트 프로세서의 캐시 일관성 제어기들(3007)과 협의하지 않고도 자신의 국부적으로 부착된 메모리(3005)에 액세스할 수 있게 하는 흐름들이다. 더 구체적으로, 이러한 흐름들은 가속기(3001)가 다중-프로토콜 링크(2800)를 통해 요청을 전송하지 않고도 메모리 제어기(3006)를 통해 자신의 국부적으로 부착된 메모리에 액세스할 수 있게 한다.
"디바이스 바이어스" 모드에서, 프로세서 코어들의 I/O(3003)로부터의 요청들은 위의 "호스트 바이어스"에 대한 설명에 따라 송출되지만, 그 요청들은 그들의 흐름의 MA 부분에서 상이하게 완료된다. "디바이스 바이어스"에 있을 때, 가속기 부착 메모리(3005)에 대한 프로세서 요청들은 "캐싱되지 않은" 요청들로서 송출된 것처럼 완료된다. 이러한 "캐싱되지 않은" 관례는, 디바이스 바이어스 흐름들에 영향을 받는 데이터가 결코 프로세서의 캐시 계층구조에 캐싱될 수 없도록 이용된다. 이러한 사실은, 가속기(3001)가 프로세서 상의 캐시 일관성 제어기들(3009)과 협의하지 않고도 자신의 메모리(3005) 내의 디바이스 바이어싱된 데이터에 액세스할 수 있게 한다.
일 구현에서, "캐싱되지 않은" 프로세서 코어(3003) 액세스 흐름에 대한 지원은, 프로세서들의 CAC 버스 상의 전역적으로 관측된 한 번 사용("GO-UO; globally observed, use once") 응답으로 구현된다. 이러한 응답은 데이터 단편을 프로세서 코어(3003)에 반환하고, 데이터의 값을 한 번만 사용하도록 프로세서에 지시한다. 이는, 데이터의 캐싱을 방지하고, "캐싱되지 않은" 흐름의 필요성을 충족시킨다. GO-UO 응답을 지원하지 않는 코어들을 갖는 시스템들에서, "캐싱되지 않은" 흐름들은 다중-프로토콜 링크(2800)의 MA 계층 및 프로세서 코어(3003)의 CAC 버스 상에서 다중-메시지 응답 시퀀스를 사용하여 구현될 수 있다.
구체적으로, 프로세서 코어가 가속기(3001)에서 "디바이스 바이어스" 페이지를 대상으로 하는 것으로 발견될 때, 가속기는, 가속기로부터 대상 캐시 라인에 대한 향후 요청들을 차단하기 위해 몇몇 상태를 설정하고, 다중-프로토콜 링크(2800)의 MA 계층 상에서 특수한 "디바이스 바이어스 히트" 응답을 전송한다. 이러한 MA 메시지에 대한 응답으로, 프로세서의 캐시 일관성 제어기(3009)는 데이터를 요청 프로세서 코어(3003)에 반환하고, 스누프-무효화 메시지가 데이터 반환에 바로 후속된다. 프로세서 코어(3003)가 스누프-무효화를 완료된 것으로 확인응답할 때, 캐시 일관성 제어기(3009)는 다른 특수한 MA "디바이스 바이어스 보크(Bock) 완료" 메시지를 다중-프로토콜 링크(2800)의 MA 계층 상에서 다시 가속기(3001)로 전송한다. 이러한 완료 메시지는 가속기(3001)로 하여금 전술된 차단 상태를 해제하게 한다.
도 107은 바이어싱을 사용하는 실시예를 예시한다. 일 구현에서, 디바이스 바이어스 흐름과 호스트 바이어스 흐름 사이의 선택은, 가속기 메모리(3005)에서 바이어스 테이블(10707)로서 유지될 수 있는 바이어스 추적기 데이터 구조에 의해 드라이빙된다. 이러한 바이어스 테이블(10707)은 가속기 부착 메모리 페이지당 1 또는 2 비트를 포함하는 페이지-세분성 구조(즉, 메모리 페이지의 세분성으로 제어됨)일 수 있다. 바이어스 테이블(10707)은, (예컨대, 바이어스 테이블(10707)의 빈번하게/최근에 사용된 엔트리들을 캐싱하기 위한) 가속기 내의 바이어스 캐시(10703)가 있거나 없이, 가속기 부착 메모리(3005)의 빼앗긴(stolen) 메모리 범위에서 구현될 수 있다. 대안적으로, 전체 바이어스 테이블(10707)이 가속기(3001) 내에 유지될 수 있다.
일 구현에서, 가속기 부착 메모리(3005)에 대한 각각의 액세스와 연관된 바이어스 테이블 엔트리가 가속기 메모리에 대한 실제 액세스 이전에 액세스되어, 다음의 동작들이 야기된다:
· 디바이스 바이어스에서 자신들의 페이지를 찾는 가속기(3001)로부터의 로컬 요청들이 가속기 메모리(3005)에 직접 전달된다.
· 호스트 바이어스에서 자신들의 페이지를 찾는 가속기(3001)로부터의 로컬 요청들이 다중-프로토콜 링크(2800) 상에서 CAC 요청으로서 프로세서(3003)에 전달된다.
· 디바이스 바이어스에서 자신들의 페이지를 찾는 프로세서(3003)로부터의 MA 요청들이 위에 설명된 "캐싱되지 않은" 흐름을 사용하여 요청을 완료한다.
· 호스트 바이어스에서 자신들의 페이지를 찾는 프로세서(3003)로부터 MA 요청들이 통상적인 메모리 판독과 같은 요청을 완료한다.
페이지의 바이어스 상태는, 소프트웨어 기반 메커니즘, 하드웨어 보조 소프트웨어 기반 메커니즘, 또는 제한된 세트의 경우들에 대해, 순수한 하드웨어 기반 메커니즘에 의해 변경될 수 있다.
바이어스 상태를 변경하기 위한 하나의 메커니즘은 API 호출(예컨대, OpenCL)을 이용하고, 이는 차례로, 가속기의 디바이스 드라이버를 호출하고, 이는 차례로, 가속기(3001)에게 바이어스 상태를 변경하도록 지시하는 메시지를 가속기(3001)에 전송하고(또는 명령 기술어를 인큐잉함), 일부 전환들의 경우, 호스트에서의 캐시 플러싱 동작을 수행한다. 캐시 플러싱 동작은 호스트 바이어스로부터 디바이스 바이어스로의 전환을 위해 요구되지만, 반대 전환에 대해서는 요구되지 않는다.
일부 경우들에서, 소프트웨어가 언제 바이어스 전환 API 호출들을 수행할 것인지를 결정하고 바이어스 전환을 요구하는 페이지들을 식별하는 것은 너무 어렵다. 그러한 경우들에서, 가속기는 바이어스 전환 "힌트" 메커니즘을 구현할 수 있으며, 여기서, 그 메커니즘은 바이어스 전환의 필요성을 검출하고, 그와 같은 것을 표시하는 메시지를 가속기의 드라이버에 전송한다. 힌트 메커니즘은, 호스트 바이어스 페이지들에 대한 가속기 액세스들 또는 디바이스 바이어스 페이지들에 대한 호스트 액세스들에 대해 트리거링되고, 그 이벤트를 인터럽트를 통해 가속기의 드라이버에 시그널링하는, 바이어스 테이블 탐색에 응답하는 메커니즘만큼 단순할 수 있다.
일부 구현들은 바이어스 전환 상태 값들을 인에이블하기 위해 제2 바이어스 상태 비트를 요구할 수 있다는 것을 유의한다. 이는, 시스템들이, 메모리 페이지들에, 그 페이지들이 바이어스 변경의 프로세스에 있는 동안(즉, 캐시들이 부분적으로 플러싱되고, 후속 요청들로 인한 증분 캐시 오염이 억제되어야 할 때) 계속 액세스할 수 있게 한다.
일 구현에 따른 예시적인 프로세스가 도 32에 예시된다. 프로세스는 본원에서 설명되는 시스템 및 프로세서 아키텍처들 상에서 구현될 수 있지만, 임의의 특정 시스템 또는 프로세서 아키텍처로 제한되지 않는다.
3201에서, 특정 세트의 페이지들이 디바이스 바이어스에 배치된다. 언급된 바와 같이, 이는, 바이어스 테이블 내의 이러한 페이지들의 엔트리들을 (예컨대, 각각의 페이지와 연관된 비트를 설정함으로써) 그 페이지들이 디바이스 바이어스들에 있음을 표시하도록 업데이트함으로써 달성될 수 있다. 일 구현에서, 일단 디바이스 바이어스로 설정되면, 페이지들은 호스트 캐시 메모리에 캐싱되지 않을 것이 보장된다. 3202에서, 페이지들은 디바이스 메모리로부터 할당된다(예컨대, 소프트웨어는 드라이버/API 호출을 개시함으로써 페이지들을 할당함).
3203에서, 피연산자들이 프로세서 코어로부터 할당된 페이지들로 푸시된다. 하나의 이식에서, 이는, API 호출을 사용하여 피연산자 페이지들을 (예컨대, OpenCL API 호출을 통해) 호스트 바이어스로 전환하는 소프트웨어에 의해 달성된다. 어떠한 데이터 복사들 또는 캐시 플러시들도 요구되지 않으며, 피연산자 데이터는, 호스트 캐시 계층구조의 어떤 임의적 위치에서 이러한 스테이지로 끝날 수 있다.
3204에서, 가속기 디바이스는 결과들을 생성하기 위해 피연산자들을 사용한다. 예컨대, 가속기 디바이스는 명령들을 실행하고 자신의 로컬 메모리(예컨대, 위에 논의된 3005)로부터 직접 데이터를 처리할 수 있다. 일 구현에서, 소프트웨어는 OpenCL API를 사용하여 피연산자 페이지들을 다시 디바이스 바이어스로 전환한다(예컨대, 바이어스 테이블을 업데이트함). API 호출의 결과로서, 작업 기술어들이 (예컨대, 아래에 설명되는 바와 같은 공유 또는 전용 작업 큐들을 통해) 디바이스에 제출된다. 작업 기술어는 호스트 캐시로부터 피연산자 페이지들을 플러싱할 것을 디바이스에 지시할 수 있고, 그 결과, (예컨대, CAC 프로토콜 상에서 CLFLUSH를 사용하여 실행되는) 캐시 플러시로 이어진다. 일 구현에서, 가속기는 어떠한 호스트 관련 일관성 오버헤드도 없이 실행되어 데이터를 결과 페이지들에 덤핑한다.
3205에서, 할당된 페이지들로부터 결과들을 가져온다. 예컨대, 일 구현에서, 소프트웨어는 (예컨대, OpenCL API를 통해) 하나 이상의 API 호출을 수행하여 결과 페이지들을 호스트 바이어스로 전환한다. 이러한 동작은 일부 바이어스 상태가 변경되게 할 수 있지만, 어떠한 일관성 또는 캐시 플러싱 동작들도 야기하지 않는다. 그런 다음, 호스트 프로세서 코어들은, 필요에 따라, 결과 데이터에 액세스하고 결과 데이터를 캐싱 및 공유할 수 있다. 마지막으로, 3206에서, 할당된 페이지들이 (예컨대, 소프트웨어를 통해) 해제된다.
피연산자들이 하나 이상의 I/O 디바이스로부터 해제되는 유사한 프로세스가 도 33에 예시된다. 3301에서, 특정 세트의 페이지들이 디바이스 바이어스에 배치된다. 언급된 바와 같이, 이는, 바이어스 테이블 내의 이러한 페이지들의 엔트리들을 (예컨대, 각각의 페이지와 연관된 비트를 설정함으로써) 그 페이지들이 디바이스 바이어스들에 있음을 표시하도록 업데이트함으로써 달성될 수 있다. 일 구현에서, 일단 디바이스 바이어스로 설정되면, 페이지들은 호스트 캐시 메모리에 캐싱되지 않을 것이 보장된다. 3302에서, 페이지들은 디바이스 메모리로부터 할당된다(예컨대, 소프트웨어는 드라이버/API 호출을 개시함으로써 페이지들을 할당함).
3303에서, 피연산자들이 I/O 에이전트로부터 할당된 페이지들로 푸시된다. 하나의 이식에서, 이는, 데이터를 기입하기 위해 비-할당 저장들을 사용하는 I/O 에이전트 및 I/O 에이전트에 대한 DMA 요청을 소프트웨어가 게시함으로써 달성된다. 일 구현에서, 데이터는 호스트 캐시 계층구조에 결코 할당되지 않으며, 대상 페이지들은 디바이스 바이어스에 유지된다.
3304에서, 가속기 디바이스는 결과들을 생성하기 위해 피연산자들을 사용한다. 예컨대, 소프트웨어는 가속기 디바이스에 작업을 제출할 수 있으며; 필요한 페이지 전환이 존재하지 않는다(즉, 페이지들은 디바이스 바이어스에 유지됨). 일 구현에서, 가속기 디바이스는 어떠한 호스트 관련 일관성 오버헤드도 없이 실행되며, 가속기는 데이터를 결과 페이지들에 덤핑한다.
3305에서, I/O 에이전트는 할당된 페이지들로부터 (예컨대, 소프트웨어로부터의 지시 하에) 결과들을 가져온다. 예컨대, 소프트웨어는 I/O 에이전트에 DMA 요청을 게시할 수 있다. 소스 페이지들이 디바이스 바이어스에 유지되므로 어떠한 페이지 전환도 필요하지 않다. 일 구현에서, I/O 브릿지는, 결과 페이지들로부터 캐싱불가능한 데이터 복사를 포착하기 위해 RdCurr(판독 전류) 요청들을 사용한다.
일부 구현들에서, 작업 큐(WQ)들은 소프트웨어에 의해 제출된 "기술어들", 서비스 품질(QoS) 및 공정성 정책들을 구현하는 데 사용되는 중재기들, 기술어들을 처리하기 위한 처리 엔진들, 어드레스 변환 및 캐싱 인터페이스, 및 메모리 판독/기입 인터페이스를 보유한다. 기술어들은 수행될 작업의 범위를 정의한다. 도 34에 예시된 바와 같이, 일 구현에서, 2개의 상이한 유형의 작업 큐들: 전용 작업 큐들(3400) 및 공유 작업 큐들(3401)이 존재한다. 전용 작업 큐들(3400)은 단일 애플리케이션(3413)에 대한 기술어들을 저장하는 반면, 공유 작업 큐들(3401)은 다수의 애플리케이션들(3410-3412)에 의해 제출된 기술어들을 저장한다. 하드웨어 인터페이스/중재기(3402)는 (예컨대, 각각의 애플리케이션(3410-3413) 및 QoS/공정성 정책들의 처리 요건들에 기반하여) 특정된 중재 정책에 따라 작업 큐들(3400-3401)로부터의 기술어들을 가속기 처리 엔진들(3405)로 디스패치한다.
도 108a-b는 작업 큐 기반 구현들과 함께 사용되는 메모리 맵핑된 I/O(MMIO) 공간 레지스터들을 예시한다. 버전 레지스터(10807)는 디바이스에 의해 지원되는 이러한 아키텍처 규격의 버전을 보고한다.
일반 능력 레지스터(GENCAP)(10808)는 최대 전송 크기, 최대 배치 크기 등과 같은 디바이스의 일반적인 능력들을 특정한다. 표 B는 GENCAP 레지스터에서 특정될 수 있는 다양한 파라미터들 및 값들을 열거한다.
Figure 112020130859394-pat00005
Figure 112020130859394-pat00006
일 구현에서, 작업 큐 능력 레지스터(WQCAP)(10810)는 전용 및/또는 공유 동작 모드들, 엔진들의 수, 작업 큐들의 수에 대한 지원과 같은 작업 큐들의 능력들을 특정한다. 아래의 표 C는 구성될 수 있는 다양한 파라미터들 및 값들을 열거한다.
Figure 112020130859394-pat00007
일 구현에서, 연산 능력 레지스터(OPCAP)(10811)는 디바이스에 의해 지원되는 연산 유형들을 특정하기 위한 비트마스크이다. 각각의 비트는 비트 위치와 동일한 코드를 갖는 연산 유형에 대응한다. 예컨대, 이 레지스터의 비트 0은 무연산 연산(코드 0)에 대응한다. 비트는 연산이 지원되는 경우에 설정되고, 연산이 지원되지 않는 경우에 비워진다.
Figure 112020130859394-pat00008
일 구현에서, 일반 구성 레지스터(GENCFG)(10812)는 가상 채널(VC) 조종 태그들을 특정한다. 아래의 표 E를 참조한다.
Figure 112020130859394-pat00009
일 구현에서, 일반 제어 레지스터(GENCTRL)(10813)는 하드웨어 또는 소프트웨어 오류들에 대해 인터럽트들이 생성되는지 여부를 표시한다. 아래의 표 F를 참조한다.
Figure 112020130859394-pat00010
일 구현에서, 디바이스 인에이블 레지스터(ENABLE)는, 오류 코드들, 디바이스들이 인에이블되는지 여부에 관한 표시자들, 및 디바이스 리셋 값들을 저장한다. 더 많은 세부사항들에 대해서는 아래의 표 G를 참조한다.
Figure 112020130859394-pat00011
Figure 112020130859394-pat00012
일 구현에서, 인터럽트 원인 레지스터(INTCAUSE)는 인터럽트의 원인을 표시하는 값들을 저장한다. 아래의 표 H를 참조한다.
Figure 112020130859394-pat00013
일 구현에서, 명령 레지스터(CMD)(10814)는 WQ 드레인(Drain WQ), PASID 드레인(Drain PASID), 및 모두 드레인(Drain All) 명령들을 제출하는 데 사용된다. 중단 필드는 요청된 연산이 드레인인지 또는 중단인지를 표시한다. 이러한 레지스터에 기입하기 전에, 소프트웨어는 이 레지스터를 통해 이전에 제출된 임의의 명령이 완료되었음을 보장할 수 있다. 이러한 레지스터에 기입하기 전에, 소프트웨어는, 명령 구성 레지스터를 구성할 수 있고 완료 기록이 요청된 경우에는 명령 완료 기록 어드레스 레지스터를 또한 구성할 수 있다.
모두 드레인 명령은 모든 WQ들 및 모든 엔진들 내의 모든 미해결 기술어들을 드레인 또는 중단한다. PASID 드레인 명령은 모든 WQ들 및 모든 엔진들 내의 특정된 PASID를 사용하여 기술어들을 드레인 또는 중단한다. WQ 드레인은 특정된 WQ 내의 모든 기술어들을 드레인 또는 중단한다. 구현에 따라, 임의의 드레인 명령은, 그 명령이 대기할 것이 요구되는 기술어들에 부가하여 다른 기술어들의 완료를 대기할 수 있다.
중단 필드가 1인 경우, 소프트웨어는, 영향을 받는 기술어들이 포기될 것을 요청하고 있다. 그러나, 하드웨어는 여전히 그들 중 일부 또는 전부를 완료할 수 있다. 기술어가 포기되면, 어떠한 완료 기록도 기입되지 않고, 해당 기술어에 대해 어떠한 완료 인터럽트도 생성되지 않는다. 다른 메모리 액세스들 중 일부 또는 전부가 발생할 수 있다.
명령의 완료는 (요청되는 경우) 완료 인터럽트를 생성함으로써 표시되고, 이러한 레지스터의 상태 필드를 비움으로써 표시된다. 완료가 시그널링되는 때에, 모든 영향을 받는 기술어들이 완료 또는 포기되고, 어떠한 추가적인 어드레스 변환들, 메모리 판독들, 메모리 기입들, 또는 인터럽트들도, 임의의 영향을 받는 기술어들로 인해 생성되지 않을 것이다. 아래의 표 I를 참조한다.
Figure 112020130859394-pat00014
표 I
일 구현에서, 소프트웨어 오류 상태 레지스터(SWERROR)(10815)는 다수의 상이한 유형들의 오류들, 이를테면: 기술어를 제출하는 데 있어서의 오류; 기술어 내의 완료 기록 어드레스 변환 오류; 기술어 내의 완료 기록 어드레스 유효 플래그가 0인 경우, 기술어 검증 오류; 및 기술어 내의 완료 기록 어드레스 유효 플래그가 0인 경우, 기술어를 처리하는 동안의 페이지 장애와 같은 오류를 저장한다. 아래의 표 J를 참조한다.
Figure 112020130859394-pat00015
Figure 112020130859394-pat00016
일 구현에서, 하드웨어 오류 상태 레지스터(HWERROR)(10816)는 소프트웨어 오류 상태 레지스터(상기 참조)와 유사한 방식으로 이루어진다.
일 구현에서, 그룹 구성 레지스터들(GRPCFG)(10817)은 각각의 작업 큐/엔진 그룹에 대한 구성 데이터(도 36-37 참조)를 저장한다. 특히, 그룹 구성 테이블은 작업 큐들의 엔진들로의 맵핑을 제어하는 BAR0에서의 레지스터들의 어레이이다. 엔진들과 동일한 수의 그룹들이 존재하지만, 소프트웨어는 자신이 필요로 하는 그룹들의 수를 구성할 수 있다. 각각의 활성 그룹은 하나 이상의 작업 큐 및 하나 이상의 엔진을 포함한다. 임의의 미사용 그룹에서는 WQ들의 필드와 엔진 필드 둘 모두가 0과 동일해야 한다. 그룹 내의 임의의 WQ에 제출된 기술어들은 그룹 내의 임의의 엔진에 의해 처리될 수 있다. 각각의 활성 작업 큐는 단일 그룹 내에 있어야 한다. 활성 작업 큐는, 대응하는 WQCFG 레지스터의 WQ 크기 필드가 0이 아닌 작업 큐이다. 그룹 내에 있지 않은 임의의 엔진은 비활성이다.
각각의 GRPCFG 레지스터(10817)는 3개의 서브 레지스터로 분할될 수 있고, 각각의 서브 레지스터는 하나 이상의 32 비트 워드이다(표 K-M을 참조). 이 레지스터들은 디바이스가 인에이블되어 있는 동안에 판독 전용일 수 있다. 이들은 또한 WQCAP의 작업 큐 구성 지원 필드가 0인 경우에 판독 전용이다.
각각의 그룹 G에 대한 BAR0에서의 서브 레지스터들의 오프셋들은 일 구현에서 다음과 같으며, 0 ≤ G < 엔진들의 수이다.
Figure 112020130859394-pat00017
Figure 112020130859394-pat00018
Figure 112020130859394-pat00019
일 구현에서, 작업 큐 구성 레지스터들(WQCFG)(10818)은 각각의 작업 큐의 연산을 특정하는 데이터를 저장한다. WQ 구성 테이블은 BAR0에서의 16 바이트 레지스터들의 어레이이다. WQ 구성 레지스터들의 수는 WQCAP에서의 WQ들의 필드의 수와 매칭된다.
각각의 16 바이트 WQCFG 레지스터는 4개의 32 비트 서브 레지스터들로 분할되고, 이들은 또한 정렬된 64 비트 판독 또는 기입 연산들을 이용하여 판독 또는 기입될 수 있다.
각각의 WQCFG-A 서브 레지스터는 디바이스가 인에이블되어 있는 동안 또는 WQCAP의 작업 큐 구성 지원 필드가 0인 경우에 판독 전용이다.
각각의 WQCFG-B는 WQCAP의 작업 큐 구성 지원 필드가 0이 아닌 한 언제라도 기입가능하다. WQ 임계치 필드가, WQ가 인에이블된 때 WQ 크기보다 큰 값을 포함하는 경우, WQ는 인에이블되지 않고 WQ 오류 코드는 4로 설정된다. WQ 임계치 필드가, WQ가 인에이블되어 있는 동안 WQ 크기보다 큰 값으로 기입되는 경우, WQ는 디스에이블되고 WQ 오류 코드는 4로 설정된다.
각각의 WQCFG-C 서브 레지스터는 WQ가 인에이블되어 있는 동안 판독 전용이다. 그 서브 레지스터는 WQ 인에이블을 1로 설정하기 전에 또는 그와 동시에 기입될 수 있다. WQCAP의 작업 큐 구성 지원 필드가 0인 경우, 다음의 필드들: WQ 모드, WQ 장애 시 차단 인에이블, 및 WQ 우선순위는 항상 판독 전용이다. WQCAP의 작업 큐 구성 지원 필드가 0인 경우라 하더라도 WQ가 인에이블되지 않은 때에는 WQCFG-C의 다음의 필드들: WQ PASID 및 WQ U/S는 기입가능하다.
각각의 WQCFG-D 서브 레지스터는 언제라도 기입가능하다. 그러나, 디바이스가 인에이블되지 않은 때에 WQ 인에이블을 1로 설정하는 것은 오류이다.
WQ 인에이블이 1로 설정된 때, WQ 인에이블됨 및 WQ 오류 코드 필드들 둘 모두가 비워진다. 후속하여, WQ 인에이블됨 또는 WQ 오류 코드는 WQ가 성공적으로 인에이블되었는지 여부를 표시하는 0이 아닌 값으로 설정될 것이다.
모든 WQCFG 레지스터들의 WQ 크기 필드들의 합은 GENCAP에서의 총 WQ 크기 필드보다 크지 않아야 한다. 이러한 제약은 디바이스가 인에이블되는 때에 검사된다. WQ 크기 필드가 0인 WQ들은 인에이블될 수 없으며, 그러한 WQCFG 레지스터들의 모든 다른 필드들은 무시된다. WQ 크기 필드는 디바이스가 인에이블되어 있는 동안에 판독 전용이다. 서브 레지스터들 각각에 관련된 데이터에 대해서는 표 N을 참조한다.
Figure 112020130859394-pat00020
Figure 112020130859394-pat00021
일 구현에서, 작업 큐 점유 인터럽트 제어 레지스터들(10819)(작업 큐(WQ) 당 하나)은 작업 큐 점유가 특정된 임계값으로 떨어질 때 소프트웨어가 인터럽트를 요청할 수 있게 한다. WQ에 대한 WQ 점유 인터럽트 인에이블이 1이고 현재 WQ 점유가 WQ 점유 제한에 있거나 그 미만일 때, 다음의 연산들이 수행될 수 있다:
1. WQ 점유 인터럽트 인에이블 필드가 비워짐.
2. 인터럽트 원인 레지스터의 비트 3이 1로 설정됨.
3. 인터럽트 원인 레지스터의 비트 3이 단계 2 이전에 0인 경우, 인터럽트는 MSI-X 테이블 엔트리 0을 사용하여 생성됨.
4. 레지스터가 인에이블 = 1 및 제한 ≥ 현재 WQ 점유로 기입되는 경우, 인터럽트는 즉시 생성됨. 결과적으로, 레지스터가 인에이블 = 1 및 제한 ≥ WQ 크기로 기입되는 경우, 인터럽트는 항상 즉시 생성됨.
Figure 112020130859394-pat00022
일 구현에서, 작업 큐 상태 레지스터들(WQ 당 하나)(10820)은 각각의 WQ 내의 현재 엔트리들의 수를 특정한다. 이 수는, 기술어들이 큐에 제출되거나 큐로부터 디스패치될 때마다 변할 수 있으므로, WQ 내에 공간이 존재하는지 여부를 결정하는 데 있어 의존될 수 없다.
일 구현에서, MSI-X 엔트리들(10821)은 MSI-X 테이블 데이터를 저장한다. 엔트리들의 오프셋 및 수는 MSI-X 능력에 있다. 제안된 엔트리들의 수는 WQ들의 수에 2를 더한 것이다.
일 구현에서, MSI-X 계류 비트 어레이(10822)는, MSI-X 능력에 있는, 엔트리들의 오프셋 및 수를 저장한다.
일 구현에서, 인터럽트 메시지 저장소 엔트리들(10823)은 테이블 구조에 인터럽트 메시지들을 저장한다. 이러한 테이블의 포맷은 PCIe-정의된 MSI-X 테이블의 포맷과 유사하지만, 크기는 2048개의 엔트리들로 제한되지 않는다. 그러나, 이러한 테이블의 크기는 상이한 DSA 구현들 간에 변할 수 있고, 일부 구현들에서는 2048개 미만의 엔트리들일 수 있다. 일 구현에서, 엔트리들의 수는 일반 능력 레지스터의 인터럽트 메시지 저장소 크기 필드에 있다. 인터럽트 메시지 저장 지원 능력이 0인 경우, 이러한 테이블은 존재하지 않는다. DSA가 많은 수의 가상 기계들 또는 컨테이너들을 지원하기 위해, 지원되는 테이블 크기는 상당할 필요가 있다.
일 구현에서, IMS 내의 각각의 엔트리의 포맷은 아래의 표 P에 기재된 바와 같다:
Figure 112020130859394-pat00023
도 35는 (예컨대, 위에 설명된 다중-프로토콜 링크(2800)와 같은) I/O 패브릭 인터페이스(3501)를 통해 제출된 기술어들을 수신하는 다수의 작업 큐들(3511-3512)을 포함하는 데이터 스트리밍 가속기(DSA) 디바이스의 일 구현을 예시한다. DSA는, 클라이언트들로부터 다운스트림 작업 요청들(이를테면, 프로세서 코어들의 요청들, 피어 입력/출력(IO) 에이전트들(이를테면, 네트워크 인터페이스 제어기(NIC)의 요청들, 및/또는 소프트웨어 연쇄 오프로드 요청들)을 수신하기 위해, 그리고 판독, 기입, 및 어드레스 변환 동작들을 위해 I/O 패브릭 인터페이스(3501)를 사용한다. 예시된 구현은, 작업 큐들 사이를 중재하고 작업 기술어를 복수의 엔진들(3550) 중 하나에 디스패치하는 중재기(3513)를 포함한다. 중재기(3513) 및 작업 큐들(3511-1012)의 동작은 작업 큐 구성 레지스터(3500)를 통해 구성될 수 있다. 예컨대, 중재기(3513)는, 작업 큐들(3511-1012) 각각으로부터 엔진들(3550) 각각으로 기술어들을 디스패치하기 위해 다양한 QoS 및/또는 공정성 정책들을 구현하도록 구성될 수 있다.
일 구현에서, 작업 큐들(3511-3512)에 큐잉된 기술어들 중 일부는 작업 기술어들의 배치를 포함/식별하는 배치 기술어들(3515)이다. 중재기(3513)는, 변환 캐시(3520)(프로세서의 상의 잠재적인 다른 어드레스 변환 서비스들)를 통해 변환된 어드레스들을 사용하여, 메모리로부터 기술어들(3518)의 어레이를 판독함으로써 배치 기술어들을 처리하는 배치 처리 유닛(3516)에 배치 기술어들을 전달한다. 일단 물리적 어드레스가 식별되면, 데이터 판독/기입 회로(3540)는 메모리로부터 기술어들의 배치를 판독한다.
제2 중재기(3519)는 배치 처리 유닛(3516)에 의해 제공되는 작업 기술어들(3518)의 배치들과 작업 큐들(3511-3512)로부터 검색된 개별 작업 기술어들(3514) 사이를 중재하고 작업 기술어들을 작업 기술어 처리 유닛(3530)으로 출력한다. 일 구현에서, 작업 기술어 처리 유닛(3530)은 (데이터 R/W 유닛(3540)을 통해) 메모리를 판독하고, 데이터에 대해 요청된 동작을 수행하고, 출력 데이터를 생성하고, (데이터 R/W 유닛(3540)을 통해) 출력 데이터를 기입하고, 완료 기록들과 인터럽트 메시지들을 기입하기 위한 스테이지들을 갖는다.
일 구현에서, 작업 큐 구성은, 소프트웨어가, 게시되지 않은 ENQCMD/S 명령어들을 사용하여 기술어들을 수신하는 공유 작업 큐(SWQ)로서 또는 게시된 MOVDIR64B 명령어들을 사용하여 기술어들을 수신하는 전용 작업 큐(DWQ)로서 각각의 WQ를 (WQ 구성 레지스터(3500)를 통해) 구성할 수 있게 한다. 도 34와 관련하여 위에 언급한 바와 같이, DWQ는 단일 애플리케이션으로부터 제출된 작업 기술어들 및 배치 기술어들을 처리할 수 있는 반면, SWQ는 다수의 애플리케이션들 간에 공유될 수 있다. WQ 구성 레지스터(3500)는 또한, 소프트웨어가, 어느 WQ들(3511-3512)이 어느 가속기 엔진들(3550)에 공급되는지, 및 각각의 엔진에 공급되는 WQ들(3511-3512)의 상대적인 우선순위들을 제어할 수 있게 한다. 예컨대, 우선순위들의 순서화된 세트(예컨대, 높음, 중간, 낮음; 1, 2, 3 등)가 특정될 수 있고, 기술어들은 일반적으로, 더 낮은 우선순위의 작업 큐들로부터의 디스패치들보다 앞서 또는 더 빈번하게 더 높은 우선순위의 작업 큐들로부터 디스패치될 수 있다. 예컨대, 높은 우선순위 및 낮은 우선순위로서 식별된 2개의 작업 큐들을 이용하여, 디스패치될 매 10개의 기술어들마다, 10개의 기술어들 중 8개는 높은 우선순위 작업 큐로부터 디스패치될 수 있는 한편, 10개의 기술어들 중 2개는 낮은 우선순위의 작업 큐로부터 디스패치된다. 작업 큐들(3511-3512) 간의 상이한 우선순위 레벨들을 달성하기 위해 다양한 다른 기법들이 사용될 수 있다.
일 구현에서, 데이터 스트리밍 가속기(DSA)는 PCI 익스프레스 구성 메커니즘과 호환가능한 소프트웨어이고, PCI 헤더 및 그의 구성-맵핑된 레지스터 세트 내의 확장된 공간을 구현한다. 구성 레지스터들은 루트 컴플렉스(Root Complex)로부터 CFC/CF8 또는 MMCFG를 통해 프로그래밍될 수 있다. 모든 내부 레지스터들은 JTAG 또는 SMBus 인터페이스들을 통해 또한 액세스가능할 수 있다.
일 구현에서, DSA 디바이스는 자신의 동작을 제어하기 위해 메모리 맵핑된 레지스터들을 사용한다. 능력, 구성, 및 작업 제출 레지스터들(포털들)은 BAR0, BAR2, 및 BAR4 레지스터들에 의해 정의되는 MMIO 구역들을 통해 액세스가능하다(아래에 설명됨). 각각의 포털은, 프로세서 페이지 테이블들을 사용하여 상이한 어드레스 공간들(클라이언트들)에 각각의 포털이 독립적으로 맵핑될 수 있도록 별개의 4K 페이지 상에 있을 수 있다.
언급된 바와 같이, 소프트웨어는 기술어들을 통해 DSA에 대한 작업을 특정한다. 기술어들은 DSA가 수행할 동작의 유형, 데이터 및 상태 버퍼들의 어드레스들, 즉시 피연산자들, 완료 속성들 등을 특정한다(기술어 포맷 및 세부사항들에 대한 부가적인 세부사항들은 아래에 기재됨). 완료 속성들은 완료 기록을 기입할 어드레스, 및 임의적 완료 인터럽트를 생성하는 데 필요한 정보를 특정한다.
일 구현에서, DSA는 디바이스 상에서 클라이언트 특정 상태를 유지하는 것을 피한다. 기술어를 처리하기 위한 모든 정보는 기술어 그 자체에 있다. 이는, 가상화된 시스템 내의 상이한 가상 기계들(또는 기계 컨테이너들) 사이뿐만 아니라 사용자 모드 애플리케이션들 사이에서의 그의 공유가능성을 개선한다.
기술어는 동작 및 연관된 파라미터들(작업 기술어로 지칭됨)을 포함할 수 있거나, 기술어는 작업 기술어들의 어레이(배치 기술어로 지칭됨)의 어드레스를 포함할 수 있다. 소프트웨어는 메모리에 기술어를 준비하고 디바이스의 작업 큐(WQ)(3511-3512)에 기술어를 제출한다. 기술어는 WQ의 모드 및 클라이언트의 특권 레벨에 따라 MOVDIR64B, ENQCMD, 또는 ENQCMDS 명령어를 사용하여 디바이스에 제출된다.
각각의 WQ(3511-3512)는 고정된 수의 슬롯들을 가지며, 그러므로, 과중한 부하 하에서는 가득 차게 될 수 있다. 일 구현에서, 디바이스는, 소프트웨어가 흐름 제어를 구현하는 것을 돕기 위해, 요구되는 피드백을 제공한다. 디바이스는 작업 큐들(3511-3512)로부터 기술어들을 디스패치하고 이들을 추가적인 처리를 위해 엔진들에 제출한다. 엔진(3550)이 기술어를 완료하거나 중단을 초래하는 특정 장애들 또는 오류들에 직면할 때, 엔진(3550)은 호스트 메모리의 완료 기록에 기입하거나, 인터럽트를 송출하거나, 또는 둘 모두를 행함으로써 호스트 소프트웨어에 통지한다.
일 구현에서, 각각의 작업 큐는 다수의 레지스터를 통해 액세스가능하고, 각각의 레지스터는 디바이스 MMIO 공간 내의 별개의 4 KB 페이지에 있다. 각각의 WQ에 대한 하나의 작업 제출 레지스터는 "비-특권 포털"로 지칭되고, 사용자 모드 클라이언트들에 의해 사용될 사용자 공간에 맵핑된다. 다른 작업 제출 레지스터는 "특권 포털"로 지칭되고, 커널 모드 드라이버에 의해 사용된다. 나머지는 게스트 포털들이고, 가상 기계들에서 커널 모드 클라이언트들에 의해 사용된다.
언급된 바와 같이, 각각의 작업 큐(3511-3512)는 전용 모드 또는 공유 모드인 2개의 모드들 중 하나에서 실행되도록 구성될 수 있다. DSA는 전용 및 공유 모드들에 대한 지원을 표시하기 위해 작업 큐 능력 레지스터의 능력 비트들을 노출시킨다. 그것은 또한 모드들 중 하나에서 동작하게 각각의 WQ를 구성하도록 작업 큐 구성 레지스터들(3500)의 제어를 노출시킨다. WQ의 모드는 WQ가 디스에이블되어 있는 동안에만(즉, WQCFG.인에이블됨 = 0) 변경될 수 있다. WQ 능력 레지스터 및 WQ 구성 레지스터들의 부가적인 세부사항들은 아래에 기재된다.
일 구현에서는, 공유 모드에서, DSA 클라이언트는 ENQCMD 또는 ENQCMDS 명령어들을 사용하여 기술어들을 작업 큐에 제출한다. ENQCMD 및 ENQCMDS는 64 바이트 비-게시된 기입을 사용하고, 완료되기 전에 디바이스로부터의 응답을 대기한다. DSA는, 작업 큐에 공간이 존재하는 경우 "성공"을 (예컨대, 요청 클라이언트/애플리케이션에) 반환하거나, 또는 작업 큐가 가득 찬 경우 "재시도"를 반환한다. ENQCMD 및 ENQCMDS 명령어들은 제로 플래그에서 명령 제출의 상태를 반환할 수 있다(0은 성공을 표시하고, 1은 재시도를 표시함). ENQCMD 및 ENQCMDS 명령어들을 사용하여, 다수의 클라이언트들은 기술어들을 동일한 작업 큐에 직접 그리고 동시에 제출할 수 있다. 디바이스가 이러한 피드백을 제공하므로, 클라이언트들은 그들의 기술어들이 수용되었는지 여부를 알 수 있다.
공유 모드에서, DSA는, 커널 모드 클라이언트들에 대한 특권 포털을 통해 제출들을 위한 일부 SWQ 용량을 예비할 수 있다. 비-특권 포털을 통한 작업 제출은, SWQ 내의 기술어들의 수가 SWQ에 대해 구성된 임계치에 도달할 때까지 수용된다. 특권 포털을 통한 작업 제출은 SWQ가 가득 찰 때까지 수용된다. 게스트 포털들을 통한 작업 제출은 비-특권 포털과 동일한 방식으로 임계치에 의해 제한된다.
ENQCMD 또는 ENQCMDS 명령어가 "성공"을 반환하는 경우, 기술어는 디바이스에 의해 수용되고 처리를 위해 큐잉된다. 명령어가 "재시도"를 반환하는 경우, 소프트웨어는 기술어를 SWQ에 다시 제출하는 것을 시도할 수 있거나, 또는 그것이 비-특권 포털을 사용하는 사용자 모드 클라이언트인 경우, 소프트웨어는 커널 모드 드라이버에게 특권 포털을 사용하여 그를 대신하여 기술어를 제출할 것을 요청할 수 있다. 이는, 서비스의 거부를 피하는 것을 돕고, 순방향 진행 보장을 제공한다. 대안적으로, 소프트웨어는 SWQ가 가득 찬 경우 다른 방법들(예컨대, CPU를 사용하여 작업을 수행하게 함)을 사용할 수 있다.
클라이언트들/애플리케이션들은 프로세스 어드레스 공간 ID(PASID)로 지칭되는 20 비트 ID를 사용하여 디바이스에 의해 식별된다. PASID는 디바이스 TLB(1722) 내의 어드레스들을 탐색하고 어드레스 변환 또는 페이지 요청들을 IOMMU(1710)에 (예컨대, 다중-프로토콜 링크(2800)를 통해) 전송하기 위해 디바이스에 의해 사용된다. 공유 모드에서, 각각의 기술어와 함께 사용될 PASID는 기술어의 PASID 필드에 포함된다. 일 구현에서, ENQCMD는 현재 스레드의 PASID를 특정 레지스터(예컨대, PASID MSR)로부터 기술어로 복사하는 반면, ENQCMDS는 감시자 모드 소프트웨어가 PASID를 기술어에 복사할 수 있게 한다.
"전용" 모드에서, DSA 클라이언트는 MOVDIR64B 명령어를 사용하여 기술어들을 디바이스 작업 큐에 제출할 수 있다. MOVDIR64B는 64 바이트 게시된 기입을 사용하고, 명령어는 기입 연산의 게시된 속성으로 인해 더 빠르게 완료된다. 전용 작업 큐들의 경우, DSA는 작업 큐 내의 슬롯들의 총 수를 노출시킬 수 있고, 흐름 제어를 제공하기 위해 소프트웨어에 의존한다. 소프트웨어는, 작업 큐가 가득 찬 상태를 검출하기 위해, 제출되고 완료된 기술어들의 수를 추적하는 것을 담당한다. 작업 큐 내에 어떠한 공간도 존재하지 않을 때 소프트웨어가 전용 WQ에 기술어를 잘못 제출하면, 기술어는 드롭되고 오류가 (예컨대, 소프트웨어 오류 레지스터에) 기록될 수 있다.
MOVDIR64B 명령어는 ENQCMD 또는 ENQCMDS 명령어들이 하는 것처럼 PASID를 채우지 않으므로, 기술어 내의 PASID 필드는 전용 모드에서 사용될 수 없다. DSA는 전용 작업 큐들에 제출된 기술어들 내의 PASID 필드를 무시할 수 있고, 대신 WQ 구성 레지스터(3500)의 WQ PASID 필드를 사용하여 어드레스 변환을 행한다. 일 구현에서, WQ PASID 필드는, DSA 드라이버가 전용 모드로 작업 큐를 구성할 때 DSA 드라이버에 의해 설정된다.
전용 모드는 다수의 클라이언트들/애플리케이션들에 의해 단일 DWQ를 공유하지 않지만, DSA 디바이스는 다수의 DWQ들을 갖도록 구성될 수 있고, DWQ들 각각은 클라이언트들에 독립적으로 배정될 수 있다. 게다가, DWQ들은, 상이한 클라이언트들/애플리케이션들에 대해 상이한 성능 레벨들을 제공하기 위해 동일하거나 상이한 QoS 레벨들을 갖도록 구성될 수 있다.
일 구현에서, 데이터 스트리밍 가속기(DSA)는 작업 큐들(3511-1012)에 제출된 기술어들을 처리하는 2개 이상의 엔진(3550)을 포함한다. DSA 아키텍처의 일 구현은 0 내지 3으로 번호가 매겨진 4개의 엔진을 포함한다. 엔진들 0 및 1은 각각 디바이스의 전체 대역폭(예컨대, 판독들에 대해 30 GB/s, 기입들에 대해 30 GB/s)까지 활용할 수 있다. 물론, 모든 엔진들의 결합된 대역폭은 또한 디바이스가 이용가능한 최대 대역폭으로 제한된다.
일 구현에서, 소프트웨어는 그룹 구성 레지스터들을 이용하여 WQ들(3511-3512) 및 엔진들(3550)을 그룹들로 구성한다. 각각의 그룹은 하나 이상의 WQ 및 하나 이상의 엔진을 포함한다. DSA는 그룹 내의 임의의 엔진을 사용하여 그룹 내의 임의의 WQ에 게시된 기술어를 처리할 수 있고, 각각의 WQ 및 각각의 엔진은 하나의 그룹에만 있을 수 있다. 그룹들의 수는 엔진들의 수와 동일할 수 있고, 따라서, 각각의 엔진은 별개의 그룹 내에 있을 수 있지만, 임의의 그룹이 하나 초과의 엔진을 포함하는 경우 모든 그룹들이 사용될 필요는 없다.
DSA 아키텍처가 작업 큐들, 그룹들, 및 엔진들을 구성하는데 있어서 큰 유연성을 허용하지만, 하드웨어는 특정 구성들에서 사용하기 위해 제한적으로 설계될 수 있다. 엔진들 0 및 1은 소프트웨어 요건들에 따라 2개의 상이한 방식 중 하나로 구성될 수 있다. 하나의 추천되는 구성은 동일한 그룹 내에 엔진들 0 및 1 둘 모두를 배치하는 것이다. 하드웨어는 어느 엔진이든 하나의 엔진을 사용하여 그룹 내의 임의의 작업 큐로부터의 기술어들을 처리한다. 이러한 구성에서, 하나의 엔진에 높은 레이턴시 메모리 어드레스 변환 또는 페이지 장애로 인해 정지가 발생하면, 다른 엔진이 계속 동작하여 전체 디바이스의 처리량을 최대화할 수 있다.
도 36은 각각의 그룹(3611 및 3612)에서의 2개의 작업 큐(3621-3622 및 3623-3624)를 각각 도시하지만, 지원되는 최대 WQ 수까지의 임의의 수의 WQ가 존재할 수 있다. 그룹 내의 WQ들은, 상이한 우선순위들을 갖는 공유 WQ들, 또는 하나의 공유 WQ와 나머지 다른 전용 WQ들, 또는 동일하거나 상이한 우선순위들을 갖는 다수의 전용 WQ들일 수 있다. 예시된 예에서, 그룹(3611)은 엔진들 0 및 1(3601)에 의해 서비스되고, 그룹(3612)은 엔진들 2 및 3(3602)에 의해 서비스된다.
도 37에 도시된 바와 같이, 엔진 0(3700) 및 엔진 1(3701)을 사용하는 다른 구성은 이들을 별개의 그룹들(3710 및 3711)에 각각 배치하는 것이다. 유사하게, 그룹 2(3712)는 엔진 2(3702)에 배정되고, 그룹 3은 엔진 3(3703)에 배정된다. 게다가, 그룹 0(3710)은 2개의 작업 큐(3721 및 3722)로 구성되고; 그룹 1(3711)은 작업 큐(3723)로 구성되고; 작업 큐 2(3712)는 작업 큐(3724)로 구성되고; 그룹 3(3713)은 작업 큐(3725)로 구성된다.
소프트웨어는, 레이턴시 민감 동작들이 다른 동작들 뒤에서 차단될 가능성을 감소시키기를 소프트웨어가 원할 때 이러한 구성을 선택할 수 있다. 이러한 구성에서, 소프트웨어는 엔진 1(3702)에 연결된 작업 큐(3723)에 레이턴시 민감 동작들을 제출하고, 다른 동작들은 엔진 0(3700)에 연결된 작업 큐들(3721-3722)에 제출한다.
엔진 2(3702) 및 엔진 3(3703)은, 예컨대, 페이즈 변화 메모리와 같은 고 대역폭 비-휘발성 메모리에 기입하기 위해 사용될 수 있다. 이러한 엔진들의 대역폭 능력은 이러한 유형의 메모리의 예상되는 기입 대역폭과 매칭하도록 크기가 정해질 수 있다. 이러한 사용을 위해, 엔진 구성 레지스터의 비트 2 및 3은 1로 설정되어야 하며, 이는, 가상 채널 1(VC1)이 이들 엔진들로부터의 트래픽에 사용되어야 한다는 것을 표시한다.
고 대역폭 비-휘발성 메모리(예컨대, 페이즈 변화 메모리)를 갖지 않는 플랫폼에서, 또는 DSA 디바이스가 이러한 유형의 메모리에 기입하는 데 사용되지 않을 때, 엔진들 2 및 3은 미사용될 수 있다. 그러나, 제출된 동작들이 제한된 대역폭을 용인한다면, 소프트웨어가 부가적인 낮은 레이턴시 경로들로서 그들을 이용하는 것이 가능하다.
각각의 기술어가 작업 큐의 헤드에 도달함에 따라, 그 기술어는 스케줄러/중재기(3513)에 의해 제거되어 그룹 내의 엔진들 중 하나에 전달될 수 있다. 메모리 내의 작업 기술어들(3518)을 지칭하는 배치 기술어(3515)의 경우, 엔진은 (즉, 배치 처리 유닛(3516)을 사용하여) 메모리로부터 작업 기술어들의 어레이를 페치한다.
일 구현에서, 각각의 작업 기술어(3514)에 대해, 엔진(3550)은 완료 기록 어드레스에 대한 변환을 프리페치하고, 작업 기술어 처리 유닛(3530)에 연산을 전달한다. 작업 기술어 처리 유닛(3530)은 소스 및 목적지 어드레스 변환들을 위해 디바이스 TLB(1722) 및 IOMMU(1710)를 사용하고, 소스 데이터를 판독하고, 특정된 동작을 수행하고, 목적지 데이터를 메모리에 다시 기입한다. 동작이 완료될 때, 엔진은 완료 기록을 미리 변환된 완료 어드레스에 기입하고, 작업 기술어에 의해 요청되는 경우에 인터럽트를 생성한다.
일 구현에서, DSA의 다수의 작업 큐들은 다수의 레벨들의 서비스 품질(QoS)을 제공하기 위해 사용될 수 있다. 각각의 WQ의 우선순위는 WQ 구성 레지스터(3500)에서 특정될 수 있다. WQ들의 우선순위들은 동일한 그룹 내의 다른 WQ들에 상대적이다(예컨대, 홀로 그룹 내에 있는 WQ의 우선순위 레벨은 의미가 없음). 그룹 내의 작업 큐들은 동일하거나 상이한 우선순위들을 가질 수 있다. 그러나, 단일 SWQ가 동일한 목적에 기여할 것이므로, 동일한 그룹에서 동일한 우선순위를 갖는 다수의 공유 WQ들을 구성하는 것은 무의미하다. 스케줄러/중재기(3513)는 작업 큐들(3511-3512)로부터 엔진들(3550)로 그들의 우선순위에 따라 작업 기술어들을 디스패치한다.
도 38은, 수행될 연산을 특정하는 연산 필드(3801), 복수의 플래그들(3802), 프로세스 어드레스 공간 식별자(PASID) 필드(3803), 완료 기록 어드레스 필드(3804), 소스 어드레스 필드(3805), 목적지 어드레스 필드(3806), 완료 인터럽트 필드(3807), 전송 크기 필드(3808), 및 (잠재적인) 하나 이상의 연산 특정 필드(3809)를 포함하는 기술어(1300)의 일 구현을 예시한다. 일 구현에서, 3개의 플래그: 완료 기록 어드레스 유효, 완료 기록 요청, 및 완료 인터럽트 요청이 존재한다.
공통 필드들은 신뢰 필드들 및 비신뢰 필드들 둘 모두를 포함한다. 신뢰 필드들은 항상 DSA 디바이스에 의해 신뢰되는데, 그 이유는, 신뢰 필드들이 CPU에 의해 또는 호스트 상의 특권 (링 0 또는 VMM) 소프트웨어에 의해 채워지기 때문이다. 비신뢰 필드들은 DSA 클라이언트들에 의해 직접 공급된다.
일 구현에서, 신뢰 필드들은 PASID 필드(3803), 예비 필드(3811), 및 U/S(사용자/감시자) 필드(3810)(즉, 0의 오프셋에서 시작하는 4 바이트)를 포함한다. 기술어가 ENQCMD 명령어로 제출될 때, 소스 기술어에서의 이러한 필드들은 무시될 수 있다. MSR(예컨대, PASID MSR)에 포함된 값은 기술어가 디바이스에 전송되기 전에 이러한 필드들에 배치될 수 있다.
일 구현에서, 기술어가 ENQCMDS 명령어로 제출될 때, 소스 기술어에서의 이러한 필드들은 소프트웨어에 의해 초기화된다. PCI 익스프레스 PASID 능력이 인에이블되지 않은 경우, U/S 필드(3810)는 1로 설정되고 PASID 필드(3803)는 0으로 설정된다.
기술어가 MOVDIR64B 명령어로 제출될 때, 기술어에서의 이러한 필드들은 무시될 수 있다. 대신, 디바이스는 WQ 구성 레지스터(3500)의 WQ U/S 및 WQ PASID 필드들을 사용한다.
이러한 필드들은 배치 내의 임의의 기술어에 대해 무시될 수 있다. 배치 기술어(3515)의 대응하는 필드들은 배치 내의 모든 각각의 기술어(3518)에 사용된다. 표 Q는 이러한 신뢰 필드들 각각에 대한 설명 및 비트 위치들을 제공한다.
Figure 112020130859394-pat00024
아래의 표 R은 기술어의 연산 필드(3801)에 따라 일 구현에서 수행되는 것을 열거한다.
Figure 112020130859394-pat00025
아래의 표 S는 기술어의 일 구현에서 사용되는 플래그들을 열거한다.
Figure 112020130859394-pat00026
Figure 112020130859394-pat00027
Figure 112020130859394-pat00028
일 구현에서, 완료 기록 어드레스(3804)는 완료 기록의 어드레스를 특정한다. 완료 기록은 32 바이트일 수 있고, 완료 기록 어드레스는 32 바이트 경계 상에 정렬된다. 완료 기록 어드레스 유효 플래그가 0인 경우, 이러한 필드는 예비된다. 완료 기록 요청 플래그가 1인 경우, 동작 완료 시에 완료 기록이 이러한 어드레스에 기입된다. 완료 기록 요청이 0인 경우, 페이지 장애 또는 오류가 있는 경우에만 완료 기록이 이러한 어드레스에 기입된다.
비교와 같은 결과를 산출하는 임의의 연산에 대해, 완료 기록 어드레스 유효 및 완료 기록 요청 플래그들 둘 모두가 1이어야 하고 완료 기록 어드레스는 유효해야 한다.
가상 어드레스들을 사용하는 임의의 연산에 대해, 완료 기록 요청 플래그가 설정되어 있든 설정되어 있지 않든, 완료 기록 어드레스가 유효해야 하며, 따라서, 페이지 장애 또는 오류가 존재하는 경우에 완료 기록이 기입될 수 있다.
최상의 결과들의 경우, 이 필드는 모든 기술어들에서 유효해야 하는데, 그 이유는, 기술어를 제출한 소프트웨어에 디바이스가 오류들을 보고할 수 있게 하기 때문이다. 이 플래그가 0이고 예기치 않은 오류가 발생하는 경우, 오류는 SWERROR 레지스터에 보고되고, 요청을 제출한 소프트웨어에는 오류가 통지되지 않을 수 있다.
완료 기록 어드레스 필드(3804)는 배치 기술어에 완료 큐 인에이블 플래그가 설정되어 있는 경우 배치 내의 기술어들에 대해 무시되며; 배치 기술어의 완료 큐 어드레스가 대신 사용된다.
일 구현에서, 메모리로부터 데이터를 판독하는 동작들에 대해, 소스 어드레스 필드(3805)는 소스 데이터의 어드레스를 특정한다. 소스 어드레스에 대한 어떠한 정렬 요건도 존재하지 않는다. 데이터를 메모리에 기입하는 동작들에 대해, 목적지 어드레스 필드(3806)는 목적지 버퍼의 어드레스를 특정한다. 목적지 어드레스에 대한 어떠한 정렬 요건도 존재하지 않는다. 일부 연산 유형들의 경우, 이러한 필드는 제2 소스 버퍼의 어드레스로서 사용된다.
일 구현에서, 전송 크기 필드(3808)는 연산을 수행하기 위해 소스 어드레스로부터 판독될 바이트 수를 표시한다. 이 필드의 최대값은 232-1일 수 있지만, 최대 허용 전송 크기는 더 작을 수 있고, 일반 능력 레지스터의 최대 전송 크기 필드로부터 결정되어야 한다. 전송 크기는 0이 아니어야 한다. 대부분의 연산 유형들의 경우, 전송 크기에 대한 어떠한 정렬 요건도 존재하지 않는다. 동작 설명들에서 예외들이 유의된다.
일 구현에서, 인터럽트 메시지 저장 사용 플래그가 1인 경우, 완료 인터럽트 처리 필드(3807)는 완료 인터럽트를 생성하는 데 사용될 인터럽트 메시지 저장소 엔트리를 특정한다. 이러한 필드의 값은 GENCAP의 인터럽트 메시지 저장소 크기 필드의 값보다 작아야 한다. 일 구현에서, 완료 인터럽트 처리 필드(3807)는 다음의 조건들: 인터럽트 메시지 저장 사용 플래그가 0이거나; 완료 인터럽트 요청 플래그가 0이거나; U/S 비트가 0이거나; 일반 능력 레지스터의 인터럽트 메시지 저장 지원 필드가 0이거나; 또는 기술어가 게스트 포털을 통해 제출되는 것 중 임의의 조건 하에서 예비된다.
도 39에 예시된 바와 같이, 완료 기록(3900)의 일 구현은, 연산이 완료되거나 오류에 직면할 때 DSA가 기입하는 32 바이트 메모리 구조이다. 완료 기록 어드레스는 32 바이트로 정렬되어야 한다.
이러한 섹션은 대부분의 연산 유형들에 공통인 완료 기록의 필드들을 설명한다. 각각의 연산 유형의 설명은 포맷이 이 포맷과 상이한 경우에 완료 기록 다이어그램을 포함한다. 부가적인 연산 특정 필드들이 아래에 추가로 설명된다. 완료 기록(3900)은 모든 필드들이 필요하지는 않더라도 항상 32 바이트일 수 있다. 완료 기록(3900)은, 연산이 페이지 장애로 인해 부분적으로 완료된 경우 그 연산을 계속하기에 충분한 정보를 포함한다.
완료 기록은 (기술어(3800)의 완료 기록 어드레스(3804)에 의해 식별되는) 메모리에서의 32 바이트로 정렬된 구조로서 구현될 수 있다. 완료 기록(3900)은 연산이 완료되었는지 여부를 표시하기 위해 완료 상태 필드(3904)를 포함한다. 연산이 성공적으로 완료된 경우, 완료 기록은, 존재한다면, 연산 유형에 따라, 연산의 결과를 포함할 수 있다. 연산이 성공적으로 완료되지 않은 경우, 완료 기록은 장애 또는 오류 정보를 포함한다.
일 구현에서, 상태 필드(3904)는 기술어의 완료 상태를 보고한다. 소프트웨어는 이러한 필드를 0으로 초기화하여, 완료 기록이 기입된 때를 소프트웨어가 검출할 수 있어야 한다.
Figure 112020130859394-pat00029
위의 표 T는 일 구현에 대한 다양한 상태 코드들 및 연관된 설명들을 제공한다.
아래의 표 U는, 장애 어드레스가 판독이었는지 또는 기입이었는지를 표시하기 위한 제1 비트 및 장애 액세스가 사용자 모드 액세스였는지 또는 감시자 모드 액세스였는지를 표시하기 위한 제2 비트를 포함하는 일 구현에서 이용가능한 장애 코드들(3903)을 예시한다.
Figure 112020130859394-pat00030
일 구현에서, 이러한 완료 기록(3900)이 배치의 일부로서 제출된 기술어에 대한 것인 경우, 색인 필드(3902)는 이러한 완료 기록을 생성한 기술어의 배치에서의 색인을 포함한다. 배치 기술어의 경우, 이러한 필드는 0xff일 수 있다. 배치의 일부가 아닌 임의의 다른 기술어의 경우, 이러한 필드는 예비될 수 있다.
일 구현에서, 연산이 페이지 장애로 인해 부분적으로 완료된 경우, 완료된 바이트 필드(3901)는 장애가 발생하기 전에 처리된 소스 바이트들의 수를 포함한다. 이러한 계수에 의해 표현된 소스 바이트들 모두는 완전히 처리되었고, 결과는 연산 유형에 따른 필요에 따라 목적지 어드레스에 기입되었다. 일부 연산 유형들의 경우, 이러한 필드는 또한 연산이 장애 이외의 어떤 이유로 완료 전에 중지될 때 사용될 수 있다. 연산이 완전히 완료된 경우, 이러한 필드는 0으로 설정될 수 있다.
출력 크기가 이러한 값으로부터 용이하게 결정가능하지 않은 연산 유형들의 경우, 완료 기록은 또한 목적지 어드레스에 기입된 바이트들의 수를 포함한다.
연산이 페이지 장애로 인해 부분적으로 완료된 경우, 이러한 필드는 장애를 야기한 어드레스를 포함한다. 일반적인 규칙으로서, 모든 기술어들은 유효 완료 기록 어드레스(3804)를 가져야 하고, 완료 기록 어드레스 유효 플래그는 1이어야 한다. 이러한 규칙에 대한 일부 예외들이 아래에서 설명된다.
일 구현에서, 완료 기록의 제1 바이트는 상태 바이트이다. 디바이스에 의해 기입된 상태 값들은 모두 0이 아니다. 소프트웨어는, 디바이스가 완료 기록에 기입한 때를 알릴 수 있기 위해, 기술어를 제출하기 전에 완료 기록의 상태 필드를 0으로 초기화해야 한다. 완료 기록을 초기화하는 것은 또한 완료 기록이 맵핑되는 것을 보장하며, 따라서, 디바이스는, 디바이스가 완료 기록에 액세스할 때 페이지 장애에 직면하지 않을 것이다.
완료 기록 요청 플래그는, 연산이 성공적으로 완료되었더라도 디바이스가 완료 기록을 기입해야 한다는 것을 디바이스에게 표시한다. 이러한 플래그가 설정되지 않은 경우, 디바이스는 오류가 존재하는 경우에만 완료 기록을 기입한다.
기술어 완료는 다음의 방법들 중 임의의 방법을 사용하여 소프트웨어에 의해 검출될 수 있다:
1. 완료 기록을 폴링하여, 상태 필드가 0이 아니게 되는 것을 대기한다.
2. 완료 기록 어드레스에 대해 (본원에서 설명된 바와 같은) UMONITOR/UMWAIT 명령어들을 사용하여, 완료 기록 어드레스가 기입될 때까지 또는 타임아웃까지 차단한다. 그런 다음, 소프트웨어는 상태 필드가 0이 아닌지 여부를 검사하여, 연산이 완료되었는지 여부를 결정해야 한다.
3. 커널 모드 기술어들의 경우, 연산이 완료될 때 인터럽트를 요청한다.
4. 기술어가 배치 내에 있는 경우, 동일한 배치 내의 후속 기술어에 펜스 플래그를 설정한다. 펜스를 갖는 기술어 또는 동일한 배치 내의 임의의 후속 기술어의 완료는 펜스에 선행하는 모든 기술어들의 완료를 표시한다.
5. 기술어가 배치 내에 있는 경우, 배치를 개시한 배치 기술어의 완료는 배치 내의 모든 기술어들의 완료를 표시한다.
6. 드레인 기술어 또는 드레인 명령을 송출하고 그것이 완료되기를 대기한다.
완료 상태가 페이지 장애로 인한 부분적 완료를 표시하는 경우, 완료 기록은, 장애에 직면하기 전에 (존재한다면) 얼마나 많은 처리가 완료되었는지를 그리고 장애에 직면한 가상 어드레스를 표시한다. 소프트웨어는 (프로세서로부터 장애 어드레스에 관여(touch)함으로써) 장애를 수정하고 새로운 기술어에서 작업의 나머지를 다시 제출하거나 소프트웨어에서 작업의 나머지를 완료할 것을 선택할 수 있다. 기술어 목록 및 완료 기록 어드레스들에 대한 장애들은 상이하게 처리되고 아래에서 더 상세히 설명된다.
DSA의 일 구현은 메시지 시그널링 인터럽트들만을 지원한다. DSA는 2가지 유형의 인터럽트 메시지 저장소: (a) 호스트 드라이버에 의해 사용되는 인터럽트 메시지들을 저장하는, MSI-X 능력을 통해 열거된 MSI-X 테이블; 및 (b) 게스트 드라이버들에 의해 사용되는 인터럽트 메시지들을 저장하는 디바이스 특정 인터럽트 메시지 저장(IMS) 테이블을 제공한다.
일 구현에서, 인터럽트들은, 3가지 유형의 이벤트들: (1) 커널 모드 기술어의 완료; (2) 드레인 또는 중단 명령의 완료; 및 (3) 소프트웨어 또는 하드웨어 오류 레지스터에 게시된 오류에 대해 생성될 수 있다. 각각의 유형의 이벤트에 대해, 별개의 인터럽트 인에이블이 존재한다. 중단/드레인 명령들의 완료 및 오류들로 인한 인터럽트들은 MSI-X 테이블의 엔트리 0을 사용하여 생성된다. 인터럽트 원인 레지스터는 인터럽트에 대한 이유를 결정하기 위해 소프트웨어에 의해 판독될 수 있다.
커널 모드 기술어(예컨대, U/S 필드가 1인 기술어)의 완료를 위해, 사용되는 인터럽트 메시지는 기술어가 제출된 방식 및 기술어 내의 인터럽트 메시지 저장 사용 플래그에 의존한다.
특권 포털을 통해 제출된 커널 모드 기술어에 대한 완료 인터럽트 메시지는 일반적으로, 포털 어드레스에 의해 결정되는 MSI-X 테이블 내의 엔트리이다. 그러나, GENCAP 내의 인터럽트 메시지 저장 지원 필드가 1인 경우, 특권 포털을 통해 제출된 기술어는 기술어에 인터럽트 메시지 저장 사용 플래그를 설정함으로써 이러한 거동을 번복할 수 있다. 이러한 경우에, 기술어 내의 완료 인터럽트 처리 필드는 인터럽트 메시지 저장소에 대한 색인로서 사용된다.
게스트 포털을 통해 제출된 커널 모드 기술어에 대한 완료 인터럽트 메시지는 포털 어드레스에 의해 결정되는 인터럽트 메시지 저장소 내의 엔트리이다.
DSA에 의해 생성된 인터럽트들은 커널 또는 VMM 소프트웨어에 의해 구성되는 바와 같은 인터럽트 리맵핑 및 게시 하드웨어를 통해 처리된다.
Figure 112020130859394-pat00031
언급된 바와 같이, DSA는 다수의 기술어들을 한 번에 제출하는 것을 지원한다. 배치 기술어는 호스트 메모리 내의 작업 기술어들의 어레이의 어드레스 및 어레이 내의 요소들의 수를 포함한다. 작업 기술어들의 어레이는 "배치"로 지칭된다. 배치 기술어들의 사용은, DSA 클라이언트들이 단일 ENQCMD, ENQCMDS, 또는 MOVDIR64B 명령어를 사용하여 다수의 작업 기술어들을 제출할 수 있게 하고, 잠재적으로는 전체 처리량을 개선할 수 있다. DSA는 배치 내의 작업 기술어들의 수에 대한 제한을 강제한다. 제한은 일반 능력 레지스터 내의 최대 배치 크기 필드에 표시된다.
배치 기술어들은 다른 작업 기술어들과 동일한 방식으로 작업 큐들에 제출된다. 배치 기술어가 디바이스에 의해 처리될 때, 디바이스는 메모리로부터 작업 기술어들의 어레이를 판독하고, 그런 다음, 작업 기술어들 각각을 처리한다. 작업 기술어들은 반드시 순서대로 처리될 필요는 없다.
배치 기술어의 PASID(3803) 및 U/S 플래그는 배치 내의 모든 기술어들에 사용된다. 배치 내의 기술어들에서의 PASID 및 U/S 필드들(3810)은 무시된다. 배치 내의 각각의 작업 기술어는 직접 제출된 작업 기술어들과 마찬가지로, 완료 기록 어드레스(3804)를 특정할 수 있다. 대안적으로, 배치 기술어는 배치로부터의 모든 작업 기술어들의 완료 기록들이 디바이스에 의해 기입되는 "완료 큐" 어드레스를 특정할 수 있다. 이러한 경우, 배치 내의 기술어들에서의 완료 기록 어드레스 필드들(3804)은 무시된다. 완료 큐는 기술어 계수보다 큰 하나의 엔트리여야 하며, 따라서, 배치 내의 모든 각각의 기술어에 대한 완료 기록을 위한 공간에 더하여 배치 기술어에 대한 공간이 존재한다. 완료 기록들은 기술어들이 완료되는 순서로 생성되며, 이는, 그들이 기술어 어레이에 나타나는 순서와 동일하지 않을 수 있다. 각각의 완료 기록은 그 완료 기록을 생성한 배치 내의 기술어의 색인을 포함한다. 배치 기술어 그 자체에 대해 0xff의 색인이 사용된다. 0의 색인은 배치 기술어들 이외의 직접 제출된 기술어들에 대해 사용된다. 배치 내의 일부 기술어들은, 그 기술어들이 완료 기록을 요청하지 않고 성공적으로 완료된 경우, 완료 기록들을 생성하지 않을 수 있다. 이러한 경우에, 완료 큐에 기입된 완료 기록들의 수는 배치 내의 기술어들의 수보다 작을 수 있다. 배치 기술어에 대한 완료 기록은 (요청되는 경우) 배치 내의 모든 기술어들에 대한 완료 기록들 후에 완료 큐에 기입된다.
배치 기술어가 완료 큐를 특정하지 않는 경우, 배치 기술어에 대한 완료 기록은 (요청되는 경우) 배치 내의 모든 기술어들이 완료된 후에 자신 고유의 완료 기록 어드레스에 기입된다. 배치 기술어에 대한 완료 기록은 배치 내의 기술어들 중 임의의 기술어가 성공과 동일하지 않은 상태로 완료되었는지 여부의 표시를 포함한다. 이는, 배치 내의 모든 기술어들이 성공적으로 완료된 일반적인 경우에서, 소프트웨어가 배치 기술어에 대한 완료 기록만을 탐색할 수 있게 한다.
완료 인터럽트는 필요한 경우 배치 내의 하나 이상의 작업 기술어에 의해 요청될 수도 있다. 배치 기술어에 대한 완료 기록은 (요청되는 경우) 배치 내의 모든 기술어들에 대한 완료 기록들 및 완료 인터럽트들 후에 기입된다. 배치 기술어에 대한 완료 인터럽트는 (요청되는 경우), 임의의 다른 기술어와 마찬가지로, 배치 기술어에 대한 완료 기록 후에 생성된다.
배치 기술어는 배치에 포함되지 않을 수 있다. 중첩된 또는 연쇄형 기술어 어레이들은 지원되지 않는다.
기본적으로, DSA는 작업 기술어들을 실행하는 동안 임의의 순서화를 보장하지 않는다. 기술어들은, 처리량을 최대화하기에 적합하다고 디바이스가 예상하는 임의의 순서로 디스패치 및 완료될 수 있다. 그러므로, 순서화가 요구되는 경우, 소프트웨어는 명시적으로 순서화해야 하는데; 예컨대, 소프트웨어는, 기술어를 제출하고, 완료 기록 또는 기술어로부터의 인터럽트를 대기하여 완료를 보장하고, 그런 다음, 다음 기술어를 제출할 수 있다.
소프트웨어는 또한 배치 기술어에 의해 특정된 배치 내의 기술어들에 대한 순서화를 특정할 수 있다. 각각의 작업 기술어는 펜스 플래그를 갖는다. 설정될 때, 펜스는, 동일한 배치 내의 이전 기술어들이 완료될 때까지 그 기술어의 처리가 시작되지 않을 것임을 보장한다. 이는, 펜스를 갖는 기술어가, 동일한 배치 내의 이전 기술어에 의해 생성된 데이터를 소비할 수 있게 한다.
기술어는, 연산에 의해 생성된 모든 기입들이 전역적으로 관측가능한 후에; 요청된 경우, 목적지 리드백 후에; 필요한 경우, 완료 기록에 대한 기입이 전역적으로 관측가능한 후에; 그리고 요청된 경우, 완료 인터럽트의 생성 후에 완료된다.
배치 내의 임의의 기술어가 성공과 동일하지 않은 상태로 완료되는 경우, 예컨대, 배치 내의 임의의 기술어가 페이지 장애로 인해 부분적으로 완료되는 경우, 1과 동일한 펜스 플래그를 갖는 후속 기술어 및 배치 내의 임의의 후속하는 기술어들이 포기된다. 배치를 제출하는 데 사용된 배치 기술어에 대한 완료 기록은 얼마나 많은 기술어가 완료되었는지를 표시한다. 부분적으로 완료되었고 완료 기록을 생성한 임의의 기술어들은 완료된 것으로 계수된다. 오직 포기된 기술어들만이 완료되지 않은 것으로 간주된다.
펜스는 또한 완료 기록들 및 인터럽트들에 대한 순서화를 보장한다. 예컨대, 펜스 및 완료 인터럽트 요청 세트를 갖는 무연산 기술어는 배치 내의 모든 선행 기술어들이 완료된 후에(그리고 필요한 경우, 그들의 완료 기록들이 기입된 후에) 인터럽트가 생성되게 할 것이다. 완료 기록 기입은 항상, 동일한 작업 기술어에 의해 생성된 데이터 기입들 뒤로 순서화되고, (요청된 경우) 완료 인터럽트는 항상, 동일한 작업 기술어에 대한 완료 기록 기입 뒤로 순서화된다.
드레인은, 클라이언트가 자신 고유의 PASID에 속하는 모든 기술어들이 완료되기를 대기할 수 있게 하는 기술어이다. 이는 전체 PASID에 대한 펜스 연산으로서 사용될 수 있다. 드레인 연산은 그 PASID를 갖는 모든 이전 기술어들이 완료되었을 때 완료된다. 소프트웨어에 의해 사용될 수 있는 드레인 기술어는, 모든 그의 기술어들의 완료에 대한 단일 완료 기록 및 인터럽트를 요청한다. 드레인은 정상 작업 큐에 제출되는 정상 기술어다. 드레인 기술어는 배치 내에 포함되지 않을 수 있다. (펜스 플래그는, 배치 내의 이전 기술어들이 완료되기를 대기하기 위해 배치에서 사용될 수 있음).
소프트웨어는, 드레인 기술어가 제출된 후에 그리고 그 드레인 기술어가 완료되기 전에, 특정된 PASID를 갖는 기술어들이 디바이스에 제출되지 않음을 보장해야 한다. 부가적인 기술어들이 제출되는 경우, 드레인 연산이 또한, 부가적인 기술어들이 완료되기를 대기하는 지 여부가 특정되지 않는다. 이는 드레인 연산이 긴 시간을 소요하게 할 수 있다. 디바이스가 부가적인 기술어들이 완료되기를 대기하지 않는 경우라 하더라도, 부가적인 기술어들 중 일부는 드레인 동작이 완료되기 전에 완료될 수 있다. 이러한 방식으로, 드레인은 펜스와 상이한데, 그 이유는, 모든 이전 연산들이 완료될 때까지 어떠한 후속 연산들도 시작되지 않음을 펜스가 보장하기 때문이다.
일 구현에서, 중단/드레인 명령들은 특권 소프트웨어(OS 커널 또는 VMM)에 의해 중단/드레인 레지스터에 기입함으로써 제출된다. 이러한 명령들 중 하나를 수신할 시, DSA는 특정 기술어들의 완료를 대기한다(아래에 설명됨). 명령이 완료될 때, 소프트웨어는, 디바이스에 계류 중인 특정된 카테고리에 기술어들이 더 이상 존재하지 않음을 확인할 수 있다.
일 구현에서, 3가지 유형의 드레인 명령들: 모두 드레인, PASID 드레인, 및 WQ 드레인이 존재한다. 각각의 명령은, 임의의 미해결 기술어들을 처리하여 완료하는 것이 아니라 그 기술어들을 폐기할 수 있음을 디바이스에 알리는 중단 플래그를 갖는다.
모두 드레인 명령은, 모두 드레인 명령 이전에 제출된 모든 기술어들의 완료를 대기한다. 모두 드레인 명령 이후에 제출된 기술어들은 모두 드레인이 완료될 때 진행 중일 수 있다. 디바이스는 새로운 기술어들에 대해 작업을 시작할 수 있는 한편, 모두 드레인 명령은 이전 기술어들이 완료되기를 대기한다.
PASID 드레인 명령은, 특정된 PASID와 연관된 모든 기술어들을 대기한다. PASID 드레인 명령이 완료될 때, 디바이스 내의 PASID에 대한 기술어들이 더 이상 존재하지 않는다. 소프트웨어는, PASID 드레인 명령이 제출된 후에 그리고 그 명령이 완료되기 전에, 특정된 PASID를 갖는 기술어들이 디바이스에 제출되지 않음을 보장할 수 있으며, 그렇지 않으면 거동이 정의되지 않는다.
WQ 드레인 명령은, 특정된 작업 큐에 제출된 모든 기술어들을 대기한다. 소프트웨어는, WQ 드레인 명령이 제출된 후에 그리고 그 명령이 완료되기 전에, 기술어들이 WQ에 제출되지 않음을 보장할 수 있다.
DSA를 사용하고 있는 애플리케이션 또는 VM이 일시중단될 때, 그 애플리케이션 또는 VM은 DSA에 제출된 미해결 기술어들을 가질 수 있다. 이러한 작업은 완료되어야 하므로, 클라이언트는 나중에 재개될 수 있는 일관성있는 상태로 있다. PASID 드레인 및 모두 드레인 명령들은 임의의 미해결 기술어들을 대기하기 위해 OS 또는 VMM에 의해 사용된다. PASID 드레인 명령은 단일 PASID를 사용하는 애플리케이션 또는 VM에 사용된다. 모두 드레인 명령은 다수의 PASID들을 사용하는 VM에 사용된다.
DSA를 사용하는 애플리케이션이 종료되거나 운영 체제(OS)에 의해 종결될 때, OS는, 어드레스 공간, 할당된 메모리, 및 PASID를 자유롭게 하거나 재사용할 수 있기 전에 미해결 기술어들이 존재하지 않음을 보장할 필요가 있다. 임의의 미해결 기술어들을 소거하기 위해, OS는 PASID 드레인 명령을 사용하여 클라이언트의 PASID를 종결하고 중단 플래그가 1로 설정된다. 이러한 명령을 수신할 시, DSA는 추가적인 처리 없이 특정된 PASID에 속하는 모든 기술어들을 폐기한다.
DSA의 일 구현은, 다수의 WQ들로부터 작업을 디스패치하기 위한 서비스 품질을 특정하는 메커니즘을 제공한다. DSA는 소프트웨어가 총 WQ 공간을 다수의 WQ들로 분할할 수 있게 한다. 각각의 WQ에는 작업을 디스패치하기 위해 상이한 우선순위가 배정될 수 있다. 일 구현에서, DSA 스케줄러/중재기(3513)는 더 높은 우선순위 WQ들이 더 낮은 우선순위 WQ들보다 더 많이 서비스되도록 WQ들로부터 작업을 디스패치한다. 그러나, DSA는, 더 높은 우선순위 WQ들이 더 낮은 우선순위 WQ들을 기아상태가 되게 하지 않음을 보장한다. 언급된 바와 같이, 구현 요건들에 기반하여 다양한 우선순위화 방식들이 이용될 수 있다.
일 구현에서, WQ 구성 레지스터 테이블은 WQ들을 구성하는 데 사용된다. 소프트웨어는, 활성 WQ들의 수를 원하는 QoS 레벨들의 수에 매칭하도록 구성할 수 있다. 소프트웨어는, WQ 구성 레지스터 테이블에 WQ 크기 및 몇몇 부가적인 파라미터들을 프로그래밍함으로써 각각의 WQ를 구성한다. 이는 전체 WQ 공간을 원하는 수의 WQ로 효과적으로 분할한다. 미사용 WQ들은 0의 크기를 갖는다.
오류들은 크게 2개의 카테고리: 1) 특정 PASID들의 처리 기술어들에서 발생하는 연계 오류들, 및 2) PASID 특정적이지 않고 속성이 전역적인 비연계 오류들로 분할될 수 있다. DSA는, 하나의 PASID로부터의 오류들이 발생되거나 다른 PASID들에 가능한 한 많은 영향을 주는 것을 피하려 시도한다. PASID 특정 오류들은, 오류가 완료 기록 그 자체에 있을 때(예컨대, 완료 기록 어드레스 상의 페이지 장애)를 제외하고는 개개의 기술어들의 완료 기록에서 보고된다.
기술어 제출에서의 또는 기술어의 완료 기록 상의 오류는 소프트웨어 오류 레지스터(SWERROR)를 통해 호스트 드라이버에 보고될 수 있다. 하드웨어 오류는 하드웨어 오류 레지스터(HWERROR)를 통해 보고될 수 있다.
DSA의 일 구현은, 디바이스 인에이블 레지스터 내의 인에이블 비트가 1로 설정될 때 다음의 검사들을 수행한다:
· 버스 마스터 인에이블이 1이다.
· PASID, ATS 및 PRS 능력들의 조합이 유효하다. (섹션 6.1.3의 표 6-3 참조)
· 모든 WQCFG 레지스터들의 WQ 크기 필드들의 합은 총 WQ 크기보다 크지 않다.
· 각각의 GRPCFG 레지스터에 대해, WQ들 및 엔진 필드들은 둘 모두가 0이거나 둘 모두가 0이 아니다.
· WQCFG 레지스터 내의 크기 필드가 0이 아닌 각각의 WQ가 하나의 그룹 내에 있다.
· WQCFG 레지스터 내의 크기 필드가 0인 각각의 WQ가 임의의 그룹 내에 있지 않다.
· 각각의 엔진은 단지 하나의 그룹 내에 있다.
이러한 검사들 중 임의의 검사가 실패하는 경우, 디바이스는 인에이블되지 않고, 오류 코드는 디바이스 인에이블 레지스터의 오류 코드 필드에 기록된다. 이러한 검사들은 임의의 순서로 수행될 수 있다. 따라서, 하나의 유형의 오류의 표시는 다른 오류들이 또한 존재하지 않는다는 것을 의미하지 않는다. 동일한 구성 오류들은 상이한 시간들에서 또는 상이한 버전들의 디바이스에 대해 상이한 오류 코드들을 초래할 수 있다. 검사들 중 어떠한 검사도 실패하지 않은 경우, 디바이스는 인에이블되고 인에이블됨 필드는 1로 설정된다.
디바이스는 WQCFG 레지스터 내의 WQ 인에이블 비트가 1로 설정될 때 다음의 검사들을 수행한다:
· 디바이스가 인에이블된다(즉, 디바이스 인에이블 레지스터 내의 인에이블됨 필드가 1임).
· WQ 크기 필드가 0이 아니다.
· WQ 임계치가 WQ 크기 필드보다 크지 않다.
· WQ 모드 필드가 지원되는 모드를 선택한다. 즉, WQCAP 내의 공유 모드 지원 필드가 0인 경우 WQ 모드는 1이거나, 또는 WQCAP 내의 전용 모드 지원 필드가 0인 경우 WQ 모드는 0이다. 공유 모드 지원 및 전용 모드 지원 필드들 둘 모두가 1인 경우, WQ 모드의 어느 하나의 값이 허용된다.
· GENCAP 내의 장애 시 차단 지원 비트가 0인 경우, WQ 장애 시 차단 인에이블 필드는 0이다.
이러한 검사들 중 임의의 검사가 실패하는 경우, WQ는 인에이블되지 않고, WQ 구성 레지스터(3500)의 WQ 오류 코드 필드에 오류 코드가 기록된다. 이러한 검사들은 임의의 순서로 수행될 수 있다. 따라서, 하나의 유형의 오류의 표시는 다른 오류들이 또한 존재하지 않는다는 것을 의미하지 않는다. 동일한 구성 오류들은 상이한 시간들에서 또는 상이한 버전들의 디바이스에 대해 상이한 오류 코드들을 초래할 수 있다. 검사들 중 어떠한 검사도 실패하지 않은 경우, 디바이스는 인에이블되고 WQ 인에이블됨 필드는 1로 설정된다.
일 구현에서, DSA는 기술어가 수신될 때 다음의 검사들을 수행한다:
· 기술어를 제출하는 데 사용된 레지스터 어드레스에 의해 식별되는 WQ가 활성 WQ이다(WQCFG 레지스터 내의 크기 필드가 0이 아님). 이러한 검사가 실패하는 경우, 오류는 소프트웨어 오류 레지스터(SWERROR)에 기록된다.
· 기술어가 공유 WQ에 제출된 경우,
· 기술어는 ENQCMD 또는 ENQCMDS로 제출되었다. 이러한 검사가 실패하는 경우, 오류는 SWERROR에 기록된다.
· 기술어가 비-특권 또는 게스트 포털을 통해 제출된 경우, 현재의 큐 점유는 WQ 임계치보다 크지 않다. 이러한 검사가 실패하는 경우, 재시도 응답이 반환된다.
· 기술어가 특권 포털을 통해 제출된 경우, 현재의 큐 점유는 WQ 크기보다 작다. 이러한 검사가 실패하는 경우, 재시도 응답이 반환된다.
· 기술어가 전용 WQ에 제출된 경우,
· 기술어는 MOVDIR64B로 제출되었다.
· 큐 점유는 WQ 크기보다 작다.
이러한 검사들 중 어느 하나가 실패하는 경우, 오류는 SWERROR에 기록된다.
일 구현에서, 디바이스는, 기술어가 처리될 때 각각의 기술어에 대해 다음의 검사들을 수행한다:
· 연산 코드 필드의 값이 지원되는 연산에 대응한다. 이는, 기술어가 제출된 컨텍스트에서 연산이 유효한지 검사하는 것을 포함한다. 예컨대, 배치 내부의 배치 기술어는 무효 연산 코드로서 취급될 것이다.
· 예비 플래그들이 설정되지 않는다. 이는 GENCAP 레지스터의 대응하는 능력 비트가 0인 플래그들을 포함한다.
· 지원되지 않는 플래그들이 설정되지 않는다. 이는 특정 연산들과 함께 사용하기 위해 예비되는 플래그들을 포함한다. 예컨대, 배치의 일부로서가 아니라 직접 인큐잉되는 기술어들에 펜스 비트가 예비된다. 이는 또한, WQCFG 레지스터 내의 장애 시 차단 인에이블 필드가 0일 때 예비되는 장애 시 차단 플래그와 같은, 구성에서 디스에이블되는 플래그들을 포함한다.
· 요구된 플래그들이 설정된다. 예컨대, 비교 연산을 위한 기술어에서 완료 기록 요청 플래그는 1이어야 한다.
· 예비 필드들이 0이다. 이는 특정된 동작에 대한 정의된 의미를 갖지 않는 임의의 필드들을 포함한다. 일부 구현들은 모든 예비 필드들을 검사하지 않을 수 있지만, 소프트웨어는 최대 호환성을 위해 모든 미사용 필드들을 소거하도록 주의해야 한다. 배치 기술어에서, 기술어 계수 필드는 GENCAP 레지스터 내의 최대 배치 크기 필드보다 크지 않다.
· 전송 크기, 소스 크기, 최대 델타 기록 크기, 델타 기록 크기, 및 최대 목적지 크기(기술어 유형에 대해 적용가능함)가 GENCAP 레지스터 내의 최대 전송 크기 필드보다 크지 않다.
· 이중 캐스트 기술어를 이용한 메모리 복사에서, 2개의 목적지 어드레스들의 비트들 11:0이 동일하다.
· 인터럽트 메시지 저장 사용 플래그가 설정되는 경우, 완료 인터럽트 처리가 인터럽트 메시지 저장소 크기보다 작다.
일 구현에서, 완료 기록 어드레스(3804)가 변환될 수 없는 경우, 기술어(3800)는 폐기되고 오류는 소프트웨어 오류 레지스터에 기록된다. 그렇지 않고, 이러한 검사들 중 임의의 검사가 실패하는 경우, 실패한 검사 유형을 표시하는 상태 필드와 0으로 설정된 완료된 바이트가 완료 기록에 기입된다. 요청된 경우, 완료 인터럽트가 생성된다.
이러한 검사들은 임의의 순서로 수행될 수 있다. 따라서, 완료 기록에서의 하나의 유형의 오류의 표시는 다른 오류들이 또한 존재하지 않는다는 것을 의미하지 않는다. 동일한 무효 기술어는 상이한 시간들에서 또는 상이한 버전들의 디바이스에 대해 상이한 오류 코드들을 보고할 수 있다.
기술어들 내의 예비 필드들(3811)은, 3개의 카테고리들: 항상 예비되는 필드들; 일부 조건들 하에서(예컨대, 능력, 구성 필드, 기술어가 제출되는 방식, 또는 기술어 그 자체 내의 다른 필드들의 값들에 기반하여) 예비되는 필드들; 및 연산 유형에 기반하여 예비되는 필드들에 속할 수 있다. 다음의 표들은 필드들이 예비되는 조건들을 열거한다.
Figure 112020130859394-pat00032
Figure 112020130859394-pat00033
Figure 112020130859394-pat00034
Figure 112020130859394-pat00035
언급된 바와 같이, DSA는 물리적 또는 가상 어드레스들의 사용을 지원한다. 프로세서 코어들 상에서 실행되는 프로세스들과 공유되는 가상 어드레스들의 사용은 공유 가상 메모리(SVM)로 지칭된다. SVM을 지원하기 위해, 디바이스는 어드레스 변환들을 수행할 때 PASID를 제공하고, 이는, 어드레스에 대해 어떠한 변환도 존재하지 않을 때 발생하는 페이지 장애들을 처리한다. 그러나, 디바이스 그 자체는 가상 어드레스와 물리적 어드레스를 구별하지 않으며; 이러한 구별은 IOMMU(1710)의 프로그래밍에 의해 제어된다.
일 구현에서, DSA는, 어드레스 변환 서비스(ATS)를 이용하기 위해 PCDI를 사용하여 PCIe 논리(2808)와 통신하는 PCIe 논리(2820)를 도시하는 도 28에 표시된 바와 같이, ATS 및 페이지 요청 서비스(PRS) PCI 익스프레스 능력들을 지원한다. ATS는 어드레스 변환 동안의 디바이스 거동을 설명한다. 기술어가 기술어 처리 유닛에 진입할 때, 디바이스(2801)는 기술어 내의 어드레스들에 대한 변환들을 요청할 수 있다. 디바이스 TLB(2822)에 히트(hit)가 있는 경우, 디바이스는 대응하는 호스트 물리적 어드레스(HPA)를 사용한다. 미스(miss) 또는 허가 장애가 존재하는 경우, DSA(2801)의 일 구현은 변환을 위해 어드레스 변환 요청을 IOMMU(2810)에 (즉, 다중-프로토콜 링크(2800)를 거쳐) 전송한다. 그런 다음, IOMMU (2810)는 개개의 페이지 테이블들을 순회하는 것에 의해 변환의 위치를 찾을 수 있고, 변환된 어드레스 및 유효 허가들을 포함하는 어드레스 변환 응답을 반환한다. 그런 다음, 디바이스(2801)는 디바이스 TLB(2822)에 변환을 저장하고, 연산을 위해 대응하는 HPA를 사용한다. IOMMU(2810)가 페이지 테이블들에서 변환의 위치를 찾을 수 없는 경우, IOMMU(2810)는 어떠한 변환도 이용가능하지 않음을 표시하는 어드레스 변환 응답을 반환할 수 있다. IOMMU(2810) 응답이 변환을 표시하지 않거나 연산에 의해 요구되는 허가를 포함하지 않는 유효 허가들을 표시할 때, 그것은 페이지 장애로 간주된다.
DSA 디바이스(2801)는, 1) 완료 기록 어드레스(3804); 2) 배치 기술어 내의 기술어 목록 어드레스; 또는 3) 소스 버퍼 또는 목적지 버퍼 어드레스 중 하나 상에서 페이지 장애에 직면할 수 있다. DSA 디바이스(2801)는, 페이지 장애가 해결될 때까지 차단할 수 있거나 또는 기술어를 조기에 완료하고 부분적 완료를 클라이언트로 반환할 수 있다. 일 구현에서, DSA 디바이스(2801)는 완료 기록 어드레스들(3804) 및 기술어 목록 어드레스들 상의 페이지 장애들에 대해 항상 차단한다.
DSA가 페이지 장애들에 대해 차단할 때, DSA는 OS 페이지 장애 핸들러에 의한 서비스를 위해 IOMMU(2810)에 페이지 요청 서비스들(PRS) 요청으로서 장애를 보고한다. IOMMU(2810)는 인터럽트를 통해 OS에 통지할 수 있다. OS는 어드레스를 검증하고, 성공적인 검사들 시에, 페이지 테이블에 맵핑을 생성하고, IOMMU(2810)를 통해 PRS 응답을 반환한다.
일 구현에서, 각각의 기술어(3800)는, 페이지 장애가 소스 또는 목적지 버퍼 어드레스 상에서 발생할 때 DSA(2801)가 부분적 완료 또는 블록을 반환해야 하는지 여부를 표시하는 장애 시 차단 플래그를 갖는다. 장애 시 차단 플래그가 1이고, 장애에 직면하면, PRS 응답이 수신될 때까지, 장애에 직면한 기술어가 차단된다. 장애가 있는 기술어 뒤의 다른 연산들이 또한 차단될 수 있다.
장애 시 차단이 0이고 소스 또는 목적지 버퍼 어드레스 상에서 페이지 장애에 직면할 때, 디바이스는, 동작을 중지하고, 완료 기록에 장애 어드레스 및 진행 정보와 함께 부분적 완료 상태를 기입한다. 클라이언트 소프트웨어가 부분적 완료를 표시하는 완료 기록을 수신할 때, 그것은 (예컨대, 페이지에 관여함으로써) 프로세서 상에서 장애를 수정하고 나머지 작업을 갖는 새로운 작업 기술어를 제출하는 옵션을 갖는다.
대안적으로, 소프트웨어는 프로세서 상에서 나머지 작업을 완료할 수 있다. 일반 능력 레지스터(GENCAP) 내의 장애 시 차단 지원 필드는 이러한 특징에 대한 디바이스 지원을 표시할 수 있고, 작업 큐 구성 레지스터 내의 장애 시 차단 인에이블 필드는, VMM 또는 커널 드라이버가, 애플리케이션들이 특징을 사용하도록 허용되는지 여부를 제어할 수 있게 한다.
디바이스 페이지 장애들은 비교적 비용이 많이 들 수 있다. 사실상, 디바이스 페이지 장애들을 서비스하는 비용은 프로세서 페이지 장애들을 서비스하는 비용보다 더 높을 수 있다. 디바이스가 장애들에 대해 장애 시 차단 대신 부분적 작업 완료를 수행하는 경우라 하더라도, 페이지 장애를 서비스하고 작업을 다시 제출하기 위해서는 소프트웨어 개입이 요구되기 때문에 여전히 오버헤드들이 초래된다. 그러므로, 최상의 성능을 위해, 소프트웨어가 피닝 및 언피닝(unpinning)의 오버헤드들을 초래함이 없이 디바이스 페이지 장애들을 최소화하는 것이 바람직하다.
배치 기술어 목록들 및 소스 데이터 버퍼들은 전형적으로, 그들이 디바이스에 제출되기 직전에 소프트웨어에 의해 생성된다. 그러므로, 이러한 어드레스들은 시간적 구역성으로 인해 장애들을 초래할 가능성이 없다. 그러나, 완료 기술어들 및 목적지 데이터 버퍼들은, 그들이 디바이스에 제출되기 전에 소프트웨어에 의해 관여되지 않는 경우 장애들을 초래할 가능성이 더 크다. 그러한 장애들은 제출 전에 이러한 페이지들에 명시적으로 "기입 관여하는" 소프트웨어에 의해 최소화될 수 있다.
디바이스 TLB 무효화 요청 동안, 무효화되는 어드레스가 기술어 처리 유닛에서 사용되고 있는 경우, 디바이스는, 무효화 요청을 완료하기 전에 어드레스에 대해 엔진이 완료되기를 대기한다.
가적인 기술어 유형들
일부 구현들은 다음의 부가적인 기술어 유형들 중 하나 이상을 활용할 수 있다:
무연산
도 40은 예시적인 무연산 기술어(4000) 및 무연산 완료 기록(4001)을 예시한다. 무연산 연산(4005)은 어떠한 DMA 연산도 수행하지 않는다. 무연산 기술어는, 완료 기록 및/또는 완료 인터럽트를 요청할 수 있다. 무연산 기술어가 배치 내에 있는 경우, 무연산 기술어는 배치 내의 모든 이전 기술어들의 완료 후에 무연산 기술어의 완료가 발생하는 것을 보장하기 위해, 펜스 플래그를 특정할 수 있다.
배치
도 41은 예시적인 배치 기술어(4100) 및 무연산 완료 기록(4101)을 예시한다. 배치 연산(4108)은 다수의 기술어들을 한 번에 큐잉한다. 기술어 목록 어드레스(4102)는 처리될 작업 기술어들의 연속적 어레이의 어드레스이다. 일 구현에서, 어레이 내의 각각의 기술어는 64 바이트이다. 기술어 목록 어드레스(4102)는 64 바이트로 정렬된다. 기술어 계수(4103)는 어레이 내의 기술어들의 수이다. 어레이 내의 기술어들의 세트는 "배치"로 지칭된다. 배치 내에 허용되는 기술어들의 최대 수는 GENCAP 내의 최대 배치 크기 필드에 주어진다.
배치 기술어 내의 PASID(4104) 및 U/S 플래그(4105)는 배치 내의 모든 기술어들에 대해 사용된다. 배치 내의 기술어들에서의 PASID(4104) 및 U/S 플래그 필드들(4105)은 무시된다. 배치 기술어(4100) 내의 완료 큐 인에이블 플래그가 설정되는 경우, 완료 기록 어드레스 유효 플래그는 1이어야 하고, 완료 큐 어드레스 필드(4106)는 배치 내의 모든 기술어들에 대해 사용되는 완료 큐의 어드레스를 포함한다. 이러한 경우, 배치 내의 기술어들에서의 완료 기록 어드레스 필드들(4106)은 무시된다. 일반 능력 레지스터 내의 완료 큐 지원 필드가 0인 경우, 완료 큐 인에이블 플래그가 예비된다.
배치 기술어 내의 완료 큐 인에이블 플래그가 0인 경우, 배치 내의 각각의 기술어에 대한 완료 기록은 각각의 기술어 내의 완료 기록 어드레스(4106)에 기입된다. 이러한 경우, 배치 기술어에서 완료 기록 요청 플래그가 1인 경우, 완료 큐 어드레스 필드는 오직 배치 기술어에 대해서만 완료 기록 어드레스(4106)로서 사용된다.
배치 완료 기록(4101)의 상태 필드(4110)는, 배치 내의 기술어들 모두가 성공적으로 완료된 경우 성공을 표시하고; 그렇지 않은 경우, 상태 필드(4110)는, 하나 이상의 기술어가 성공과 동일하지 않은 상태로 완료되었음을 표시한다. 완료 기록의 완료된 기술어 필드(4111)는 처리된 배치 내의 기술어들의 완료가 성공적이든 성공적이지 않든 그들의 총 수를 포함한다. 완료된 기술어들(4111)은 배치 내에 펜스가 존재하는 경우 또는 배치를 판독하는 동안 페이지 장애가 발생한 경우에 기술어 계수(4103)보다 작을 수 있다.
드레인
도 42는 예시적인 드레인 기술어(4200) 및 드레인 완료 기록(4201)을 예시한다. 드레인 연산(4208)은, PASID(4202)와 연관된, 드레인 기술어(4200)가 제출되는 작업 큐 내의 모든 미해결 기술어들의 완료를 대기한다. 이러한 기술어는 디바이스를 사용하고 있는 프로세스에 의한 정상 셧다운 동안 사용될 수 있다. PASID(4202)와 연관된 모든 기술어들을 대기하기 위해, 소프트웨어는, PASID (4202)가 사용된 모든 각각의 작업 큐에 별개의 드레인 연산을 제출해야 한다. 소프트웨어는, 드레인 기술어(4201)가 제출된 후에 그리고 그 드레인 기술어가 완료되기 전에, 특정된 PASID(4202)를 갖는 기술어들이 작업 큐에 제출되지 않음을 보장해야 한다.
드레인 기술어(4201)는 배치 내에 포함되지 않을 수 있으며, 이는 지원되지 않는 연산 유형으로서 취급된다. 드레인은 완료 기록 요청 또는 완료 인터럽트 요청을 특정해야 한다. 완료 통지는 다른 기술어들이 완료된 후에 이루어진다.
메모리 이동
도 43은 예시적인 메모리 이동 기술어(4300) 및 메모리 이동 완료 기록(4301)을 예시한다. 메모리 이동 연산(4308)은 소스 어드레스(4302)로부터 목적지 어드레스(4303)로 메모리를 복사한다. 복사된 바이트 수는 전송 크기(4304)에 의해 주어진다. 메모리 어드레스들 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다. 소스 및 목적지 구역들이 겹치는 경우, 메모리 복사는, 전체 소스 버퍼가 임시 공간에 복사되고 그런 다음 목적지 버퍼에 복사되는 것처럼 이루어진다. 이는, 목적지 버퍼의 시작이 소스 버퍼의 끝과 겹칠 때 복사의 방향을 반전시킴으로써 구현될 수 있다.
연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 복사가 소스 및 목적지 버퍼들의 시작에서 시작하여 수행된 경우 완료 기록의 방향 필드(4310)는 0이고, 복사의 방향이 반전된 경우 방향 필드는 1이다.
부분적 완료 후에 연산을 재개하기 위해, 방향이 0인 경우, 연속 기술어 내의 소스 및 목적지 어드레스 필드들(4302-4303)은 완료된 바이트만큼 증가되어야 하고, 전송 크기는 완료된 바이트(4311)만큼 감소되어야 한다. 방향이 1인 경우, 전송 크기(4304)는 완료된 바이트(4311)만큼 감소되어야 하지만, 소스 및 목적지 어드레스 필드들(4302-4303)은 원래의 기술어에서의 것들과 동일해야 한다. 후속하는 부분적 완료가 발생하는 경우, 방향 필드(4310)는, 제1 부분적 완료에 대한 것과 동일하지 않을 수 있다는 것을 유의한다.
채움
도 44는 예시적인 채움 기술어(4400)를 예시한다. 메모리 채움 연산(4408)은 목적지 어드레스(4406)에서의 메모리를 패턴 필드(4405)에서의 값으로 채운다. 패턴 크기는 8 바이트일 수 있다. 더 작은 패턴을 사용하기 위해, 소프트웨어는 기술어 내의 패턴을 복제해야 한다. 기입된 바이트 수는 전송 크기(4407)에 의해 주어진다. 전송 크기가 패턴 크기의 배수일 필요는 없다. 목적지 어드레스 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다. 연산이 페이지 장애로 인해 부분적으로 완료된 경우, 완료 기록의 완료된 바이트 필드는, 장애가 발생하기 전에 목적지에 기입된 바이트들의 수를 포함한다.
비교
도 45는 예시적인 비교 기술어(4500) 및 비교 완료 기록(4501)을 예시한다. 비교 연산(4508)은 소스1 어드레스(4504)에서의 메모리를 소스2 어드레스(4505)에서의 메모리와 비교한다. 비교된 바이트 수는 전송 크기(4506)에 의해 주어진다. 메모리 어드레스들 또는 전송 크기(4506)에 대한 어떠한 정렬 요건들도 존재하지 않는다. 완료 기록 어드레스 유효 및 완료 기록 요청 플래그들은 1이어야 하고, 완료 기록 어드레스는 유효해야 한다. 비교의 결과는 완료 기록(4501)의 결과 필드(4510)에 기입되며: 0의 값은 2개의 메모리 구역이 매칭됨을 표시하고, 1의 값은 그들이 매칭되지 않음을 표시한다. 결과(4510)가 1인 경우, 완료 기록의 완료된 바이트(4511) 필드는 제1 차이의 바이트 오프셋을 표시한다. 연산이 페이지 장애로 인해 부분적으로 완료된 경우, 결과는 0이다. 차이가 검출된 경우, 페이지 장애 대신 차이가 보고될 것이다.
연산이 성공적이고 검사 결과 플래그가 1인 경우, 완료 기록의 상태 필드(4512)는, 아래의 표에 도시된 바와 같이 결과 및 예상 결과에 따라 설정된다. 이는, 펜스 플래그와 동일한 배치 내의 후속 기술어가 비교의 결과에 기반하여 배치의 실행을 계속하거나 중지할 수 있게 한다.
Figure 112020130859394-pat00036
즉시 비교
도 46은 예시적인 즉시 비교 기술어(4600)를 예시한다. 즉시 비교 연산(4608)은 소스 어드레스(4601)에서의 메모리를 패턴 필드(4602)에서의 값과 비교한다. 패턴 크기는 8 바이트이다. 더 작은 패턴을 사용하기 위해, 소프트웨어는 기술어 내의 패턴을 복제해야 한다. 비교된 바이트 수는 전송 크기(4603)에 의해 주어진다. 전송 크기가 패턴 크기의 배수일 필요는 없다. 완료 기록 어드레스 유효 및 완료 기록 요청 플래그들은 1이어야 하고, 완료 기록 어드레스(4604)는 유효해야 한다. 비교의 결과는 완료 기록의 결과 필드에 기입되며: 0의 값은 메모리 구역이 패턴에 매칭됨을 표시하고, 1의 값은 메모리 구역이 매칭되지 않음을 표시한다. 결과가 1인 경우, 완료 기록의 완료된 바이트 필드는 제1 차이의 위치를 표시한다. 그 위치는 정확한 바이트 위치가 아닐 수 있지만, 제1 차이보다 크지 않도록 보장된다. 연산이 페이지 장애로 인해 부분적으로 완료된 경우, 결과는 0이다. 차이가 검출된 경우, 페이지 장애 대신 차이가 보고될 것이다. 일 구현에서, 즉시 비교에 대한 완료 기록 포맷 및 검사 결과와 예상 결과의 거동은 비교와 동일하다.
델타 기록 생성
도 47은 예시적인 데이터 기록 생성 기술어(4700) 및 델타 기록 생성 완료 기록(4701)을 예시한다. 델타 기록 생성 연산(4708)은 소스1 어드레스(4705)에서의 메모리를 소스2 어드레스(4702)에서의 메모리와 비교하고, 소스2에 매칭하도록 소스1을 업데이트하는 데 필요한 정보를 포함하는 델타 기록을 생성한다. 비교된 바이트 수는 전송 크기(4703)에 의해 주어진다. 전송 크기는, 아래에 설명되는 바와 같이, 델타 기록에 저장될 수 있는 최대 오프셋에 의해 제한된다. 메모리 어드레스들 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다. 완료 기록 어드레스 유효 및 완료 기록 요청 플래그들은 1이어야 하고, 완료 기록 어드레스(4704)는 유효해야 한다.
델타 기록의 최대 크기는 최대 델타 기록 크기(4709)에 의해 주어진다. 최대 델타 기록 크기(4709)는 델타 크기(10 바이트)의 배수여야 하고, GENCAP에서의 최대 전송 크기보다 크지 않아야 한다. 델타 기록의 실제 크기는 소스1과 소스2 사이에서 검출되는 차이들의 수에 의존하며; 이는 완료 기록의 델타 기록 크기 필드(4710)에 기입된다. 델타 기록에 필요한 공간이 기술어에서 특정된 최대 델타 기록 크기(4709)를 초과하면, 연산은 부분적 델타 기록으로 완료된다.
비교의 결과는 완료 기록(4701)의 결과 필드(4711)에 기입된다. 2개의 구역이 정확히 매칭하는 경우, 결과는 0이고, 델타 기록 크기는 0이고, 완료된 바이트는 0이다. 2개의 구역이 매칭하지 않고, 델타들의 완전한 세트가 델타 기록에 기입되었다면, 결과는 1이고, 델타 기록 크기는 발견된 모든 차이들의 전체 크기를 포함하고, 완료된 바이트는 0이다. 2개의 구역이 매칭하지 않고, 모든 델타를 기록하는 데 필요한 공간이 최대 델타 기록 크기를 초과하는 경우, 결과는 2이고, 델타 기록 크기(4710)는 델타 기록에 기입된 델타 세트의 크기(전형적으로는 기술어에서 특정된 델타 기록 크기와 동일하거나 거의 동일함)를 포함하고, 완료된 바이트(4712)는 델타 기록 내의 공간이 초과되기 전에 비교된 바이트 수를 포함한다.
연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 결과(4711)는 이전 단락에서 설명된 바와 같이 0 또는 1이고, 완료된 바이트(4712)는 페이지 장애가 발생하기 전에 비교된 바이트 수를 포함하고, 델타 기록 크기는 페이지 장애가 발생하기 전에 델타 기록에서 사용된 공간을 포함한다.
델타 기록의 포맷이 도 48에 도시된다. 델타 기록은 델타들의 어레이를 포함한다. 각각의 델타는 소스1에서의 대응하는 8 바이트와 상이한 소스2로부터의 8 바이트 데이터 블록(4802) 및 2 바이트 오프셋(4801)을 포함한다. 델타 기록의 총 크기는 10의 배수이다. 오프셋(4801)은 8 바이트의 배수를 나타내는 16 비트 필드이므로, 표현될 수 있는 최대 오프셋은 0x7FFF8이며, 따라서 최대 전송 크기는 0x80000 바이트(512 KB)이다.
연산이 성공적이고 검사 결과 플래그가 1인 경우, 완료 기록의 상태 필드는, 아래의 표에 도시된 바와 같이 결과 및 예상 결과에 따라 설정된다. 이는, 펜스 플래그와 동일한 배치 내의 후속 기술어가 델타 기록 생성의 결과에 기반하여 배치의 실행을 계속하거나 중지할 수 있게 한다. 예상 결과의 비트 7:2는 무시된다.
Figure 112020130859394-pat00037
델타 기록 적용
도 49는 예시적인 델타 기록 적용 기술어(4901)를 예시한다. 델타 기록 적용 연산(4902)은 목적지 어드레스(4903)에서의 메모리의 콘텐츠들에 델타 기록을 적용한다. 델타 기록 어드레스(4904)는 1과 동일한 결과로 완료된 델타 기록 생성 연산(4902)에 의해 생성된 델타 기록의 어드레스이다. 델타 기록 크기(4905)는, 델타 기록 생성 연산(4902)의 완료 기록에서 보고되는 바와 같은 델타 기록의 크기이다. 목적지 어드레스(4903)는 델타 기록이 생성된 때의 소스1 어드레스에서의 메모리와 동일한 콘텐츠들을 포함하는 버퍼의 어드레스이다. 전달 크기(4906)는 델타 기록이 생성될 때 사용된 전송 크기와 동일하다. 델타 기록 적용 연산(4902)이 완료된 후에, 목적지 어드레스(4903)에서의 메모리는 델타 기록이 생성된 때 소스2 어드레스에서의 메모리에 있던 콘텐츠와 매칭될 것이다. 메모리 어드레스들 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다.
델타 기록 적용 연산(4902) 동안 페이지 장애에 직면하는 경우, 완료 기록의 완료된 바이트 필드는 목적지에 성공적으로 적용된 델타 기록의 바이트 수를 포함한다. 소프트웨어가 연산을 재개하기 위해 다른 기술어를 제출하기로 선택한 경우, 연속 기술어는 원래의 것과 동일한 목적지 어드레스(4903)를 포함해야 한다. 델타 기록 어드레스(4904)는 (이 어드레스가 제1 미적용된 델타를 가리키므로) 완료된 바이트만큼 증가되어야 하고, 델타 기록 크기(4905)는 완료된 바이트만큼 감소되어야 한다.
도 50은 델타 기록 생성 및 델타 기록 적용 연산들의 사용의 일 구현을 도시한다. 먼저, 델타 기록 생성 연산(5001)이 수행된다. 그 연산은, 2개의 소스 버퍼들 ― 소스들 1 및 2 ― 을 판독하고 델타 기록(5010)을 기입하여, 그 완료 기록(5003)에 실제 델타 기록 크기(5004)를 기록한다. 델타 기록 적용 연산(5005)은 델타 기록 생성 연산(5001)에 의해 기입된 델타 기록의 콘텐츠를 그 크기 및 소스1 데이터의 사본과 함께 취하여, 목적지 버퍼(5015)를 원래의 소스2 버퍼의 복제본으로 업데이트한다. 델타 기록 생성 연산은 최대 델타 기록 크기(5002)를 포함한다.
이중 캐스트를 이용한 메모리 복사
도 51은 예시적인 이중 캐스트를 이용한 메모리 복사 기술어(5100) 및 이중 캐스트를 이용한 메모리 복사 완료 기록(5102)을 예시한다. 이중 캐스트 연산(5104)을 이용한 메모리 복사는 소스 어드레스(5105)로부터 목적지1 어드레스(5106) 및 목적지2 어드레스(5107) 둘 모두로 메모리를 복사한다. 복사된 바이트 수는 전송 크기(5108)에 의해 주어진다. 소스 어드레스 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다. 2개의 목적지 어드레스들(5106-5107)의 비트들 11:0은 동일해야 한다.
소스 구역이 목적지 구역들 중 어느 하나와 겹치는 경우, 메모리 복사는, 전체 소스 버퍼가 임시 공간에 복사되고 그런 다음 목적지 버퍼들에 복사되는 것처럼 이루어진다. 이는, 목적지 버퍼의 시작이 소스 버퍼의 끝과 겹칠 때 복사의 방향을 반전시킴으로써 구현될 수 있다. 소스 구역이 목적지 구역들 둘 모두와 겹치는 경우, 또는 2개의 목적지 구역들이 겹치는 경우, 그것은 오류이다. 연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 복사 연산은 두 목적지 구역 모두에 동일한 바이트 수를 기입한 후에 중지되고, 복사가 소스 및 목적지 버퍼들의 시작에서 시작하여 수행된 경우 완료 기록의 방향 필드(5110)는 0이고, 복사의 방향이 반전된 경우 방향 필드는 1이다.
부분적 완료 후에 연산을 재개하기 위해, 방향(5110)이 0인 경우, 연속 기술어 내의 소스 어드레스 필드(5105) 및 두 목적지 어드레스 필드(5106-5107) 모두는 완료된 바이트(5111)만큼 증가되어야 하고, 전송 크기(5108)는 완료된 바이트(5111)만큼 감소되어야 한다. 방향이 1인 경우, 전송 크기(5108)는 완료된 바이트(5111)만큼 감소되어야 하지만, 소스 어드레스 필드(5105) 및 목적지 어드레스 필드들(5106-5107)은 원래의 기술어에서의 것들과 동일해야 한다. 후속하는 부분적 완료가 발생하는 경우, 방향 필드(5110)는, 제1 부분적 완료에 대한 것과 동일하지 않을 수 있다는 것을 유의한다.
순환 중복 검사(CRC) 생성
도 52는 예시적인 CRC 생성 기술어(5200) 및 CRC 생성 완료 기록(5201)을 예시한다. CRC 생성 연산(5204)은 소스 어드레스에서의 메모리 상에서 CRC를 컴퓨팅한다. CRC 계산에 사용되는 바이트 수는 전송 크기(5205)에 의해 주어진다. 메모리 어드레스들 또는 전송 크기(5205)에 대한 어떠한 정렬 요건들도 존재하지 않는다. 완료 기록 어드레스 유효 및 완료 기록 요청 플래그들은 1이어야 하고, 완료 기록 어드레스(5206)는 유효해야 한다. 컴퓨팅된 CRC 값은 완료 기록에 기입된다.
연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 부분적 CRC 결과가 페이지 장애 정보와 함께 완료 기록에 기입된다. 소프트웨어가 장애를 정정하고 연산을 재개하는 경우, 소프트웨어는 이러한 부분적 결과를 연속 기술어의 CRC 시드 필드에 복사해야 한다. 그렇지 않으면, CRC 시드 필드는 0이어야 한다.
CRC 생성을 이용한 복사
도 53은 예시적인 CRC 생성을 이용한 복사 기술어(5300)를 예시한다. CRC 생성 연산을 이용한 복사(5305)는 소스 어드레스(5302)로부터 목적지 어드레스(5303)로 메모리를 복사하고, 복사된 데이터에 대해 CRC를 컴퓨팅한다. 복사된 바이트 수는 전송 크기(5304)에 의해 주어진다. 메모리 어드레스들 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다. 소스 및 목적지 구역들이 겹치는 경우, 그것은 오류이다. 완료 기록 어드레스 유효 및 완료 기록 요청 플래그들은 1이어야 하고, 완료 기록 어드레스는 유효해야 한다. 컴퓨팅된 CRC 값은 완료 기록에 기입된다.
연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 부분적 CRC 결과가 페이지 장애 정보와 함께 완료 기록에 기입된다. 소프트웨어가 장애를 정정하고 연산을 재개하는 경우, 소프트웨어는 이러한 부분적 결과를 연속 기술어의 CRC 시드 필드에 복사해야 한다. 그렇지 않으면, CRC 시드 필드는 0이어야 한다. 일 구현에서, CRC 생성을 이용한 복사에 대한 완료 기록 포맷은 CRC 생성에 대한 포맷과 동일하다.
데이터 무결성 필드(DIF) 삽입
도 54는 예시적인 DIF 삽입 기술어(5400) 및 DIF 삽입 완료 기록(5401)을 예시한다. DIF 삽입 연산(5405)은 소스 어드레스(5402)로부터 목적지 어드레스(5403)로 메모리를 복사하고, 소스 데이터에 대해 데이터 무결성 필드(DIF)를 컴퓨팅하고, DIF를 출력 데이터에 삽입한다. 복사된 소스 바이트 수는 전송 크기(5406)에 의해 주어진다. 예컨대, 512, 520, 4096, 또는 4104 바이트인 소스 데이터의 각각의 블록에 대해 DIF 계산이 수행된다. 전송 크기는 소스 블록 크기의 배수여야 한다. 목적지에 기입된 바이트 수는 각각의 소스 블록에 대해 전송 크기 더하기 8 바이트이다. 메모리 어드레스들에 대한 어떠한 정렬 요건도 존재하지 않는다. 소스 및 목적지 구역들이 겹치는 경우, 그것은 오류이다. 연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 기준 태그 및 애플리케이션 태그의 업데이트된 값들이 페이지 장애 정보와 함께 완료 기록에 기입된다. 소프트웨어가 장애를 정정하고 연산을 재개하는 경우, 소프트웨어는 이러한 필드들을 연속 기술어에 복사할 수 있다.
DIF 스트립
도 55는 예시적인 DIF 스트립 기술어(5500) 및 DIF 스트립 완료 기록(5501)을 예시한다. DIF 스트립 연산(5505)은 소스 어드레스(5502)로부터 목적지 어드레스(5503)로 메모리를 복사하고, 소스 데이터에 대해 데이터 무결성 필드(DIF)를 컴퓨팅하고, 컴퓨팅된 DIF를 데이터에 포함된 DIF와 비교한다. 판독된 소스 바이트 수는 전송 크기(5506)에 의해 주어진다. 512, 520, 4096, 또는 4104 바이트일 수 있는 각각의 소스 데이터 블록에 대해 DIF 계산이 수행된다. 전송 크기는 각각의 소스 블록에 대해 8 바이트 더하기 소스 블록 크기의 배수여야 한다. 목적지에 기입된 바이트의 수는 각각의 소스 블록에 대해 전송 크기 빼기 8 바이트이다. 메모리 어드레스에 대한 어떠한 정렬 요건도 존재하지 않는다. 소스 및 목적지 구역들이 겹치는 경우, 그것은 오류이다. 연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 기준 태그 및 애플리케이션 태그의 업데이트된 값들이 페이지 장애 정보와 함께 완료 기록에 기입된다. 소프트웨어가 장애를 정정하고 연산을 재개하는 경우, 소프트웨어는 이러한 필드들을 연속 기술어에 복사할 수 있다.
DIF 업데이트
도 56은 예시적인 DIF 업데이트 기술어(5600) 및 DIF 업데이트 완료 기록(5601)을 예시한다. DIF 업데이트 연산(5605)을 이용한 메모리 이동은 소스 어드레스(5602)로부터 목적지 어드레스(5603)로 메모리를 복사하고, 소스 데이터에 대해 데이터 무결성 필드(DIF)를 컴퓨팅하고, 컴퓨팅된 DIF를 데이터에 포함된 DIF와 비교한다. 이는, 기술어 내의 목적지 DIF 필드들을 사용하여 소스 데이터에 대한 DIF를 동시에 컴퓨팅하고, 컴퓨팅된 DIF를 출력 데이터에 삽입한다. 판독된 소스 바이트 수는 전송 크기(5606)에 의해 주어진다. 512, 520, 4096, 또는 4104 바이트일 수 있는 각각의 소스 데이터 블록에 대해 DIF 계산이 수행된다. 전송 크기(5606)는 각각의 소스 블록에 대해 8 바이트 더하기 소스 블록 크기의 배수여야 한다. 목적지에 기입된 바이트 수는 전송 크기(5606)와 동일하다. 메모리 어드레스들에 대한 어떠한 정렬 요건도 존재하지 않는다. 소스 및 목적지 구역들이 겹치는 경우, 그것은 오류이다. 연산이 페이지 장애로 인해 부분적으로 완료되는 경우, 소스 및 목적지 기준 태그들 및 애플리케이션 태그들의 업데이트된 값들이 페이지 장애 정보와 함께 완료 기록에 기입된다. 소프트웨어가 장애를 정정하고 연산을 재개하는 경우, 소프트웨어는 이러한 필드들을 연속 기술어에 복사할 수 있다.
아래의 표 AA는 일 구현에서 사용되는 DIF 플래그들을 예시한다. 표 BB는 일 구현에서 사용되는 소스 DIF 플래그들을 예시하고, 표 CC는 일 구현에서의 목적지 DIF 플래그들을 예시한다.
Figure 112020130859394-pat00038
소스 DIF 플래그들
Figure 112020130859394-pat00039
목적지 DIF 플래그들
Figure 112020130859394-pat00040
일 구현에서, DIF 결과 필드는 DIF 연산의 상태를 보고한다. 이러한 필드는 오직 DIF 스트립 및 DIF 업데이트 연산들에 대해서만 그리고 완료 기록의 상태 필드가 성공 또는 거짓 술어를 갖는 성공인 경우에만 정의될 수 있다. 아래의 표 DD는 예시적인 DIF 결과 필드 코드들을 예시한다.
Figure 112020130859394-pat00041
F 검출 조건은 표 EE에 도시된 다음 중 하나가 참일 때 검출된다:
Figure 112020130859394-pat00042
연산이 성공적이고 검사 결과 플래그가 1인 경우, 완료 기록의 상태 필드는, 아래의 표 FF에 도시된 바와 같이 DIF 결과에 따라 설정된다. 이는, 펜스 플래그와 동일한 배치 내의 후속 기술어가 연산의 결과에 기반하여 배치의 실행을 계속하거나 중지할 수 있게 한다.
Figure 112020130859394-pat00043
캐시 플러시
도 57은 예시적인 캐시 플러시 기술어(5700)를 예시한다. 캐시 플러시 연산(5705)은 목적지 어드레스에서 프로세서 캐시들을 플러싱한다. 플러싱된 바이트 수는 전송 크기(5702)에 의해 주어진다. 전송 크기가 캐시 라인 크기의 배수일 필요는 없다. 목적지 어드레스 또는 전송 크기에 대한 어떠한 정렬 요건들도 존재하지 않는다. 목적지 구역에 의해 부분적으로 커버되는 임의의 캐시 라인이 플러싱된다.
목적지 캐시 채움 플래그가 0인 경우, 영향을 받는 캐시 라인들은 캐시 계층구조의 모든 각각의 레벨로부터 무효화될 수 있다. 캐시 라인이 캐시 계층구조의 임의의 레벨에서 수정된 데이터를 포함하는 경우, 데이터는 메모리에 다시 기입된다. 이는, 일부 프로세서들에서 구현되는 CLFLUSH 명령어의 거동과 유사하다.
목적지 캐시 채움 플래그가 1인 경우, 수정된 캐시 라인들은 주 메모리에 기입되지만, 캐시들로부터 축출되지 않는다. 이는, 일부 프로세서들에서의 CLWB 명령어의 거동과 유사하다.
가속기들이라는 용어는 때때로, 임의의 종류의 컴퓨팅 또는 I/O 태스크를 오프로딩하거나 수행하기 위해 호스트 프로세서들 상에서 실행되는 소프트웨어에 의해 사용될 수 있는 느슨하게 결합된 에이전트들을 지칭하기 위해 본원에서 사용된다. 가속기 및 사용 모델의 유형에 따라, 이들은 메모리로의 데이터 이동 또는 저장, 계산, 통신, 또는 이들의 임의의 조합을 수행하는 태스크들일 수 있다.
"느슨하게 결합"된은 이러한 가속기들이 호스트 소프트웨어에 의해 노출되고 액세스되는 방식을 지칭한다. 구체적으로, 이들은 프로세서 ISA 확장들로서 노출되지 않고, 대신, 플랫폼 상의 PCI 익스프레스 열거가능 종점 디바이스들로서 노출된다. 느슨한 결합은 이러한 에이전트들이 호스트 소프트웨어로부터의 작업 요청들을 수용하고 호스트 프로세서에 비동기적으로 동작할 수 있게 한다.
"가속기들"은 프로그래밍가능 에이전트들(이를테면, GPU/GPGPU), 고정 기능 에이전트들(이를테면, 압축 또는 암호화 엔진들), 또는 필드 프로그래밍가능 게이트 어레이(FPGA)와 같은 재구성가능 에이전트들일 수 있다. 이들 중 일부는 계산 오프로드에 사용될 수 있는 반면, 다른 것들(이를테면, RDMA 또는 호스트 패브릭 인터페이스들)은 패킷 처리, 통신, 저장, 또는 메시지 전달 연산들을 위해 사용될 수 있다.
가속기 디바이스들은 온-다이(즉, 프로세서와 동일한 다이), 온-패키지, 온-칩셋, 온-마더보드를 포함하는 상이한 레벨들에서 물리적으로 통합될 수 있거나; 또는 별개의 PCIe 부착 디바이스일 수 있다. 통합 가속기들의 경우, PCI 익스프레스 종점 디바이스들로서 열거된다 하더라도, 이러한 가속기들 중 일부는 (온-다이 일관성 패브릭에 또는 외부 일관성 인터페이스들에) 일관성있게 부착될 수 있는 반면, 다른 것들은 내부 비-일관성 인터페이스들에 또는 외부 PCI 익스프레스 인터페이스에 부착될 수 있다.
개념적 레벨에서, "가속기", 및 고성능 I/O 디바이스 제어기는 유사하다. 이들을 구별하는 것은, 능력들, 이를테면, 통합/공유 가상 메모리, 페이징가능한 메모리 상에서 연산하는 능력, 사용자 모드 작업 제출, 태스크 스케줄링/선점, 및 낮은 레이턴시 동기화 지원이다. 이와 같이, 가속기들은 고성능 I/O 디바이스들의 새롭고 개선된 카테고리로서 간주될 수 있다.
오프로드 처리 모델들
가속기 오프로드 처리 모델들은 크게 3가지 사용 카테고리들로 분류될 수 있다:
1. 스트리밍: 스트리밍 오프로드 모델에서, 작은 작업 단위들이 가속기에 높은 레이트로 스트리밍된다. 이러한 사용의 전형적인 예는 다양한 유형들의 패킷 처리를 높은 레이트로 수행하는 네트워크 데이터 평면이다.
2. 낮은 레이턴시: 일부 오프로드 사용들의 경우, 오프로드 연산의 레이턴시(가속기에 대해 태스크를 디스패칭하는 것과 그에 대해 가속기가 연산하는 것 모두)가 중요하다. 이러한 사용의 예는 호스트 패브릭에 걸친 원격 획득(get), 부과(put), 및 원자적 동작 연산들을 포함하는 낮은 레이턴시 메시지 전달 구성들이다.
3. 규모조정가능: 규모조정가능 오프로드는, 컴퓨팅 가속기들의 서비스들에, 디바이스 상에서 지원되는 작업 큐들의 수 또는 도어벨들의 수와 같은 가속기 디바이스에 의해 부과되는 제약들 없이, (가상 기계들 내에서 그리고 가상 기계들에 걸쳐) 많은 (한정되지 않은) 수의 클라이언트 애플리케이션들이 (예컨대, 계층구조 보호 도메인의 최상위 링, 이를테면, 링-3으로부터) 직접 액세스가능한 사용들을 지칭한다. 본원에서 설명된 가속기 디바이스들 및 프로세서 상호연결부들 중 몇몇이 이러한 카테고리 내에 속한다. 이러한 확장성은 GPU, GPGPU, FPGA 또는 압축 가속기들과 같은 작업의 시간 공유/스케줄링 또는 잠금 없는 연산에 대한 큰 확장성 요건들을 갖는 엔터프라이즈 데이터베이스들과 같은 메시지 전달 사용들을 지원하는 오프로드 디바이스들을 컴퓨팅하는 데 적용된다.
오프로드 모델들에 걸친 작업 디스패치
위의 오프로드 처리 모델들 각각은 아래에 설명되는 바와 같은 자신 고유의 작업 디스패치 난제들을 부과한다.
1. 스트리밍 오프로드 사용들을 위한 작업 디스패치
스트리밍 사용들의 경우, 전형적인 작업 디스패치 모델은 메모리 상주 작업 큐들을 사용하는 것이다. 구체적으로, 디바이스는 메모리에 작업 큐의 위치 및 크기를 구성한다. 하드웨어는 작업 큐에 새로운 작업 요소들을 부가할 때 소프트웨어에 의해 업데이트되는 도어벨(테일 포인터) 레지스터를 구현한다. 하드웨어는 작업 큐 요소들에 대한 생산자-소비자 흐름 제어를 강제하기 위해 현재의 헤드 포인터를 소프트웨어에 보고한다. 스트리밍 사용들의 경우, 전형적인 모델은, 소프트웨어가, 헤드 포인터(이는 종종, 소프트웨어에 의한 UC MMIO 판독들의 오버헤드들을 피하기 위해 하드웨어에 의해 호스트 메모리에 유지됨) 및 소프트웨어에 캐싱된 테일 포인터와 협의함으로써 작업 큐에 공간이 존재하는지를 검사하고, 메모리 상주 작업 큐에 새로운 작업 요소들을 부가하고 디바이스에 대한 도어벨 레지스터 기입을 사용하여 테일 포인터를 업데이트하는 것이다.
도어벨 기입은 전형적으로 MMIO에 대한 4 바이트 또는 8 바이트 캐싱불가(UC) 기입이다. 일부 프로세서들 상에서, UC 기입은 (생산자-소비자 사용들에 필요한) UC 기입을 송출하기 전에 더 오래된 저장들이 전역적으로 관측되는 것을 보장하는 직렬화된 연산이지만, 또한, UC 기입이 플랫폼에 의해 게시될 때까지, 프로세서 파이프라인에서의 모든 더 신생의 저장들이 송출되는 것을 차단한다. Xeon 서버 프로세서 상에서의 UC 기입 연산에 대한 전형적인 레이턴시는 대략 80-100 nsec 정도이고, 이 시간 동안, 모든 더 신생의 저장 연산들이 코어에 의해 차단되어, 스트리밍 오프로드 성능이 제한된다.
UC 도어벨 기입에 후속하는 더 신생의 저장들의 직렬화를 처리하기 위한 하나의 접근법은 기입 결합(WC) 저장 연산을 (WC 약한 순서화로 인해) 도어벨 기입에 사용하는 것이며, 도어벨 기입들에 대해 WC 저장들을 사용하는 것은 몇몇 난제들을 부과하는데, 즉, 도어 기입 크기(전형적으로, DWORD 또는 QWORD)가 캐시 라인 크기보다 작다. 이러한 부분적 기입들은, 프로세서가 잠재적인 기입 결합 기회를 위해 자신의 기입 결합 버퍼(WCB)들에 그 부분적 기입들을 유지하는 것으로 인해 추가적인 레이턴시를 초래하여, 도어벨 기입이 프로세서로부터 송출되는 데 레이턴시를 초래한다. 소프트웨어는 그들이 명시적 저장 펜스를 통해 송출되도록 강제할 수 있어서, UC 도어벨과 마찬가지로 더 신생의 저장들에 대한 동일한 직렬화를 초래한다.
WC 맵핑된 MMIO에 대한 또 다른 문제는 (판독 부작용을 가질 수 있는 레지스터들을 갖는) WC 맵핑된 MMIO에 대한 잘못 예측된 그리고 추측성인 판독들(MOVNTDQA를 이용함)의 노출이다. 이를 처리하는 것은, WC 맵핑된 도어벨 레지스터들을 UC 맵핑된 MMIO 레지스터들의 나머지와 별개의 페이지들에 호스팅할 것을 디바이스들에 요구할 것이므로, 디바이스들에게 번거롭다. 이는 또한, 가상화된 사용들에서 난제들을 부과하며, 여기서, VMM 소프트웨어는 더 이상 EPT 페이지 테이블들을 이용하여 게스트에 노출된 임의의 디바이스 MMIO에 대한 게스트 메모리 유형을 무시하고 UC 맵핑을 강제할 수 없다.
본원에서 설명되는 MOVDIRI 명령어는 이러한 스트리밍 오프로드 사용들에 대해 도어벨 기입들에 대한 UC 또는 WC 저장들을 사용하는 것에 대한 위의 제한들을 처리한다.
2. 낮은 레이턴시 오프로드 사용들에 대한 작업 디스패치
일부 유형들의 가속기 디바이스들은 최소한의 레이턴시로 요청된 연산을 완료하기 위해 고도로 최적화된다. (처리량에 대해 최적화되는) 스트리밍 가속기들과는 달리, 이러한 가속기들은 통상적으로, 메모리 호스트형 작업 큐들로부터 작업 요소들(및 일부 경우들에서는 심지어 데이터 버퍼들)을 페치하기 위한 DMA 판독 레이턴시들을 피하기 위해, 디바이스 호스트형 작업 큐들(디바이스 MMIO를 통해 노출됨)을 구현한다. 대신, 호스트 소프트웨어는 작업 기술어들(및 일부 경우들에서는 또한 데이터)을 디바이스 MMIO를 통해 노출되는 디바이스 호스트형 작업 큐들에 직접 기입함으로써 작업을 제출한다. 그러한 디바이스들의 예들은 호스트 패브릭 제어기들, 원격 DMA(RDMA) 디바이스들, 및 비-휘발성 메모리(NVM)-익스프레스와 같은 새로운 저장 제어기들을 포함한다. 디바이스 호스트형 작업 큐 사용은 기존의 ISA에 대해 몇몇 난제들을 초래한다.
UC 기입들의 직렬화 오버헤드들을 피하기 위해, 디바이스 호스트형 작업 큐들의 MMIO 어드레스들은 전형적으로 WC로서 맵핑된다. 이는 스트리밍 가속기들을 위한 WC 맵핑된 도어벨들과 동일한 난제들을 노출시킨다.
게다가, WC 저장들을 디바이스 호스트형 작업 큐들에 사용하는 것은, 일부 프로세서들의 기입 원자성 거동에 대해 보호할 것을 디바이스들에 요구한다. 예컨대, 일부 프로세서들은 단지 캐시 라인 경계 내의 8 바이트 크기의 기입들까지 (그리고 LOCK 연산들에 대해) 기입 연산 원자성을 보장하고, 어떠한 보장된 기입 완료 원자성도 정의하지 않는다. 기입 연산 원자성은 프로세서 저장 연산이 다른 에이전트들에 의해 관측되는 세분성이고, 프로세서 명령어 세트 아키텍처 및 일관성 프로토콜들의 속성이다. 기입 완료 원자성은 비-캐싱가능 저장 연산이 수신기(메모리의 경우에서는 메모리 제어기, 또는 MMIO의 경우에서는 디바이스)에 의해 관측되는 세분성이다. 기입 완료 원자성은 기입 연산 원자성보다 강하며, 프로세서 명령어 세트 아키텍처뿐만 아니라 플랫폼의 기능이다. 기입 완료 원자성 없이, N 바이트의 비-캐싱가능 저장 연산을 수행하는 프로세서 명령어는 디바이스 호스트형 작업 큐에 의해 다수의 (조각난) 기입 트랜잭션들로서 수신될 수 있다. 현재, 디바이스 하드웨어는, 디바이스 호스트형 작업 큐에 기입된 데이터 또는 작업 기술어의 각각의 워드를 추적함으로써 그러한 조각난 기입들에 대해 보호할 필요가 있다.
본원에서 설명된 MOVDIR64B 명령어는 보장된 64 바이트 기입 완료 원자성으로 64 바이트 기입들을 지원함으로써 위의 제한들을 처리한다. MOVDIR64B는 또한 영구 메모리(메모리 제어기에 부착된 NVM)에 대한 기입들 및 불투명 브릿지들(NTB)을 통한 시스템들에 걸친 데이터 복제와 같은 다른 사용들에 유용하다.
3. 규모조정가능 오프로드 사용들을 위한 작업 디스패치
애플리케이션들로부터 I/O 디바이스들에 작업을 제출하기 위한 종래의 접근법은, 커널 디바이스 드라이버들을 통해 I/O 제어기 디바이스로 요청을 라우팅하는 커널 I/O 스택에 시스템 호출들을 행하는 것을 수반한다. 이러한 접근법은 규모조정가능하지만(임의의 수의 애플리케이션들이 디바이스의 서비스들을 공유할 수 있음), 그것은, 종종, 고성능 디바이스들 및 가속기들에 대한 성능 병목현상인 직렬화된 커널 I/O 스택의 레이턴시 및 오버헤드들을 초래한다.
낮은 오버헤드 작업 디스패치를 지원하기 위해, 일부 고성능 디바이스들은 디바이스로의 직접 작업 디스패치를 허용하고 작업 완료들을 검사하기 위해 직접 링-3 액세스를 지원한다. 이러한 모델에서, 디바이스의 일부 리소스들(도어벨, 작업 큐, 완료 큐 등)이 애플리케이션 가상 어드레스 공간에 할당 및 맵핑된다. 일단 맵핑되면, 링-3 소프트웨어(예컨대, 사용자 모드 드라이버 또는 라이브러리)가 작업을 가속기에 직접 디스패치할 수 있다. 공유 가상 메모리(SVM) 능력을 지원하는 디바이스들의 경우, 도어벨 및 작업 큐들은, 도어벨 및 작업 큐가 맵핑되는 애플리케이션 프로세스의 프로세스 어드레스 공간 식별자(PASID)를 식별하기 위해 커널 모드 드라이버에 의해 설정된다. 특정 작업 큐를 통해 디스패치된 작업 항목을 처리할 때, 디바이스는 I/O 메모리 관리 유닛(IOMMU)을 통한 가상-물리 어드레스 변환들을 위해 그 작업 큐에 대해 구성된 개개의 PASID를 사용한다.
직접 링-3 작업 제출에 대한 난제들 중 하나는 확장성의 문제이다. 가속기 디바이스에 직접 작업을 제출할 수 있는 애플리케이션 클라이언트들의 수는 가속기 디바이스에 의해 지원되는 큐들/도어벨들(또는 디바이스 호스트형 작업 큐들)의 수에 의존한다. 이는, 도어벨 또는 디바이스 호스트형 작업 큐가 애플리케이션 클라이언트에 정적으로 할당/맵핑되고, 가속기 디바이스 설계에 의해 지원되는 고정된 수의 이러한 리소스들이 존재하기 때문이다. 일부 가속기 디바이스들은 (애플리케이션에 대한 요구에 따라 도어벨들을 동적으로 분리하고 재-부착함으로써) 그들이 갖는 도어벨 리소스들을 오버-커밋(over-committing)함으로써 이러한 확장성 난제를 '차선적으로 해결'하려 시도하지만, 이는 종종 번거롭고 번거롭고 규모조정하기가 어렵다. (단일 루트 I/O 가상화(SR-IOV)와 같은) I/O 가상화를 지원하는 디바이스들을 이용하면, 제한된 도어벨/작업 큐 리소스들이 상이한 가상 기계들에 배정된 상이한 가상 기능(VF)들에 걸쳐 분할될 필요가 있기 때문에 그러한 리소스들이 더 제한된다.
확장 문제는 잠금 없는 연산을 위해 데이터베이스들과 같은 엔터프라이즈 애플리케이션들에 의해 사용되는 (64 K 내지 1 M 큐 쌍들을 지원하는 RDMA 디바이스들 중 일부의) 고성능 메시지 전달 가속기들에 대해 그리고 많은 수의 클라이언트들로부터 제출된 태스크들에 걸친 가속기 리소스들의 공유를 지원하는 컴퓨팅 가속기들에 대해 가장 중요하다.
본원에서 설명된 ENQCMD/S 명령어들은 위의 확장 제한들을 처리하여, 제한되지 않은 수의 클라이언트들이 가속기 상의 작업 큐 리소스들을 신청하고 공유할 수 있게 한다.
일 구현은 직접 저장들 및 인큐 저장들을 포함하는 프로세서 코어들에 의한 새로운 유형들의 저장 연산들을 포함한다.
일 구현에서, 직접 저장들은 본원에서 설명된 MOVDIRI 및 MOVDIR64B 명령어들에 의해 생성된다.
캐싱가능성: UC 및 WC 저장들과 유사하게, 직접 저장들은 캐싱불가능하다. 직접 저장이 캐싱되어 있는 어드레스로 송출되는 경우, 직접 저장 이전에, 라인은 (수정되는 경우) 라이트백되고 캐시로부터 무효화된다.
메모리 순서화: WC 저장들과 유사하게, 직접 저장들은 약하게 순서화된다. 구체적으로, 직접 저장들은 더 오래된 WB/WC/NT 저장들, CLFLUSHOPT 및 CLWB를 거슬러 상이한 어드레스들에 순서화되지 않는다. 상이한 어드레스들에 대한 더 신생의 WB/WC/NT 저장들, CLFLUSHOPT, 또는 CLWB는 더 오래된 직접 저장들을 통과할 수 있다. 동일한 어드레스로의 직접 저장들은 항상 더 오래된 저장들(직접 저장들을 포함함)과 함께 동일한 어드레스에 순서화된다. 직접 저장들은 저장 펜싱(예컨대, SFENCE, MFENCE, UC/WP/WT 저장들, LOCK, IN/OUT 명령어들 등)을 강제하는 임의의 연산에 의해 펜싱된다.
기입 결합: 직접 저장들은 정상 WC 저장들과 상이한 기입 결합 거동을 갖는다. 구체적으로, 직접 저장들은 기입 결합 버퍼로부터의 즉시 축출의 자격이 있으며, 그에 따라, 동일한 어드레스에 대한 더 신생의 저장들(직접 저장들을 포함함)과 결합되지 않는다. 기입 결합 버퍼들에 보유된 더 오래된 WC/NT 저장들은 동일한 어드레스에 대한 더 신생의 직접 저장들과 결합될 수 있고, 그러한 결합을 피할 필요가 있는 사용들은 동일한 어드레스에 대한 직접 저장들을 실행하기 전에 명시적으로 펜스 WC/NT 저장들을 저장해야 한다.
원자성: 직접 저장들은 직접 저장을 송출하는 명령어의 기입 크기에 대한 기입 완료 원자성을 지원한다. MOVDIRI의 경우에, 목적지가 4 바이트로 정렬될 때(또는 8 바이트로 정렬될 때), 기입 완료 원자성은 4 바이트(또는 8 바이트)이다. MOVDIR64B의 경우, 목적지는 64 바이트로 정렬되도록 강제되고, 기입 완료 원자성은 64 바이트이다. 기입 완료 원자성은, 직접 저장들이 메모리 제어기 또는 루트 컴플렉스에 의해 처리되는 바와 같이 다수의 기입 트랜잭션들로 조각나지 않음을 보장한다. 직접 저장들을 지원하는 프로세서들 상에서의 루트 컴플렉스 구현들은, 직접 저장들이 단일의 조각나지 않은 게시된 기입 트랜잭션으로서 외부 PCI 익스프레스 패브릭(및 PCI 익스프레스 순서화를 따르는 SoC 내의 내부 I/O 패브릭들) 상에서 전달됨을 보장한다. 임의의 에이전트(프로세서 또는 비-프로세서 에이전트)로부터 메모리 위치로의 판독 연산은 직접 저장 연산을 송출하는 명령어에 의해 기입된 데이터를 전부 알거나 전혀 알지 못할 것이다.
목적지 메모리 유형 무시: 직접 저장들은 목적지 어드레스 메모리 유형(UC/WP 유형들을 포함함)을 무시하고 항상 약한 순서화를 따른다. 이는, 맵핑된 UC 메모리 유형별 UC 순서화를 따르는 통상적인 MOV 연산들을 사용하여 엄격한 직렬화 요건을 가질 수 있는 다른 레지스터들에 계속 액세스하면서, 소프트웨어가 디바이스 MMIO를 UC로서 맵핑하고 직접 저장 명령어들(MOVDIRI 또는 MOVDIR64B)을 사용하여 특정 레지스터들(이를테면, 도어벨 또는 디바이스 호스트형 작업 큐 레지스터들)에 액세스할 수 있게 한다. 이는 또한, 직접 저장 명령어들이 게스트 소프트웨어 내에서부터 연산될 수 있게 하는 한편, 가상 기계 모니터(VMM) 소프트웨어(디바이스 특정 정보를 갖지 않음)가 게스트 노출된 MMIO를 프로세서 확장 페이지 테이블(EPT)들 내의 UC로서 맵핑하여, 게스트 메모리 유형이 무시된다.
직접 저장들을 지원하는 SoC들은 다음과 같이 직접 저장들에 대한 기입 완료 원자성을 보장할 필요가 있다:
주 메모리로의 직접 저장들: 주 메모리에 대한 직접 저장들의 경우, 일관성 패브릭 및 시스템 에이전트는, 직접 저장에서의 모든 데이터 바이트가 단일의 (조각나지 않은) 기입 트랜잭션으로서 메모리에 대한 요청들을 위해 홈 에이전트 또는 다른 전역 관측가능성(GO) 지점으로 송출됨을 보장해야 한다. 영구 메모리를 지원하는 플랫폼들의 경우, 홈 에이전트들, 메모리 제어기들, 메모리-사이드-캐시들, 인라인 메모리 암호화 엔진들, 영구 메모리를 부착하는 (DDR-T와 같은) 메모리 버스들, 및 영구 메모리 제어기들 그 자체가 직접 저장들에 대해 동일하거나 더 높은 세분성의 기입 완료 원자성을 지원해야 한다. 따라서, 소프트웨어는 MOVDIR64B를 사용하는 64 바이트의 직접 저장을 메모리에(휘발성 또는 영구) 수행할 수 있고, 모든 64 바이트의 기입이 모든 에이전트들에 의해 원자적으로 처리될 것임이 보장될 수 있다. 영구 메모리에 대한 정상 기입들과 마찬가지로, 소프트웨어가 명시적으로 지속성을 커밋할 필요가 있는 경우, 소프트웨어는 펜스/커밋/펜스 시퀀스로의 직접 저장을 따른다.
메모리 맵핑된 I/O에 대한 직접 저장들: 메모리 맵핑된 I/O(MMIO)에 대한 직접 저장들의 경우, 일관성 패브릭 및 시스템 에이전트는, 직접 저장에서의 모든 데이터 바이트가 단일의 (조각나지 않은) 기입 트랜잭션으로서 루트 컴플렉스(MMIO에 대한 요청들을 위한 전역 관측가능성 지점)로 송출됨을 보장해야 한다. 루트 컴플렉스 구현들은, 각각의 직접 저장이 PCI 익스프레스 루트 컴플렉스 통합 종점(RCIEP)들 및 루트 포트(RP)들을 부착하는 내부 I/O 패브릭들 상에서의 단일의 (조각나지 않은) 게시된 기입 트랜잭션으로서 처리 및 전달됨을 보장해야 한다. PCI 익스프레스 루트 포트들 및 스위치 포트들은 각각의 직접 저장을 단일의 게시된 기입 트랜잭션으로서 전달해야 한다. 기입 완료 원자성은 보조 브릿지들(이를테면, 레거시 PCI, PCI-X 브릿지들) 또는 보조 버스들(이를테면, USB, LPC 등) 상에 있는 또는 그 뒤에 있는 디바이스들을 대상으로 하는 직접 저장들에 대해 정의되거나 보장되지 않는다.
일부 SoC 구현들은 WC 기입 요청들에 대한 기입 완료 원자성을 이미 보장한다는 것을 유의한다. 구체적으로, 부분 라인 WC 기입들(WCiL) 및 전체 라인 WC 기입들(WCiLF)은 이미 시스템 에이전트, 메모리 제어기들, 루트 컴플렉스 및 I/O 패브릭들에 의해 기입 완료 원자성으로 처리된다. 그러한 구현들의 경우, 프로세서가 WC 기입들로부터의 직접 기입들을 구별할 필요가 없고, 직접 저장들과 WC 저장들 사이의 거동 차이가 프로세서 코어의 내부에 있다. 따라서, 직접 기입들에 대한 내부 또는 외부 패브릭 규격들에 대한 어떠한 변경들도 제안되지 않는다.
PCI 익스프레스 종점 또는 RCIEP에 의해 수신된 직접 기입의 처리는 디바이스 구현 특정적이다. 디바이스의 프로그래밍 인터페이스에 따라, 디바이스와 그의 드라이버는 그의 레지스터들(예컨대, 도어벨 레지스터들 또는 디바이스 호스트형 작업 큐 레지스터들) 중 일부가 항상 직접 저장 명령어들(이를테면, MOVDIR64B)을 사용하여 기입되고 디바이스 내에서 그들을 원자적으로 처리할 것을 요구할 수 있다. 디바이스 상의 다른 레지스터들에 대한 기입들은 어떠한 원자성도 고려하거나 기대함이 없이 디바이스에 의해 처리될 수 있다. RCIEP들의 경우, 기입 원자성 요건을 갖는 레지스터가 측대역 또는 개인 유선 인터페이스들을 통한 액세스를 위해 구현되는 경우, 그러한 구현들은 구현 특정 수단을 통해 기입 원자성 특성을 보장해야 한다.
일 구현에서의 인큐 저장들은, 본원에서 설명된 ENQCMD 및 ENQCMDS 명령어들에 의해 생성된다. 인큐 저장의 의도된 대상은 가속기 디바이스 상의 공유 작업 큐(SWQ)이다. 일 구현에서, 인큐 저장들은 다음의 특성들을 갖는다.
게시되지 않음: 인큐 저장들은 대상 어드레스에 대한 64 바이트 비-게시 기입 트랜잭션을 생성하고, 성공 또는 재시도 상태를 표시하는 완료 응답을 수신한다. 완료 응답에서 반환된 성공/재시도 상태는 (예컨대, 제로 플래그에서) ENQCMD/S 명령어에 의해 소프트웨어로 반환될 수 있다.
캐싱가능성: 일 구현에서, 인큐 저장들은 캐싱가능하지 않다. 인큐 저장들을 지원하는 플랫폼들은, 인큐 비-게시 기입들이 이러한 저장들을 수용하도록 명시적으로 인에이블되는 어드레스(MMIO) 범위들로만 라우팅되는 것을 강제한다.
메모리 순서화: 인큐 저장들은 비-게시 기입 완료 상태로 아키텍처 상태(예컨대, 제로 플래그)를 업데이트할 수 있다. 따라서, 최대 하나의 인큐 저장이 주어진 논리 프로세서로부터 미해결될 수 있다. 그러한 의미에서, 논리 프로세서로부터의 인큐 저장은 동일한 논리 프로세서로부터 송출된 다른 인큐 저장을 통과할 수 없다. 인큐 저장들은 더 오래된 WB/WC/NT 저장들, CLFLUSHOPT 또는 CLWB를 거슬러 상이한 어드레스들에 순서화되지 않는다. 그러한 순서화를 강제할 필요가 있는 소프트웨어는 그러한 저장들 후에 그리고 인큐 저장 전에 명시적 저장 펜싱을 사용할 수 있다. 인큐 저장들은 항상, 더 오래된 저장들과 함께 동일한 어드레스에 순서화된다.
정렬: ENQCMD/S 명령어들은 인큐 저장 목적지 어드레스가 64 바이트로 정렬되는 것을 강제한다.
원자성: ENQCMD/S 명령어들에 의해 생성된 인큐 저장들은 64 바이트 기입 완료 원자성을 지원한다. 기입 완료 원자성은, 인큐 저장들이 루트 컴플렉스에 의해 처리되는 바와 같이 다수의 트랜잭션들로 조각나지 않음을 보장한다. 인큐 저장들을 지원하는 프로세서들 상에서의 루트 컴플렉스 구현들은, 각각의 인큐 저장이 종점 디바이스에 단일의 (조각나지 않은) 64 바이트 비-게시 기입 트랜잭션으로서 전달되는 것을 보장한다.
목적지 메모리 유형 무시: 직접 저장들과 유사하게, 인큐 저장들은 목적지 어드레스 메모리 유형(UC/WP 유형들을 포함함)을 무시하고, 항상 위에 설명된 바와 같은 순서화를 따른다. 이는, 소프트웨어가, UC로서 디바이스 MMIO를 계속 맵핑하고 ENQCMD/S 명령어들을 사용하여 공유 작업 큐(SWQ) 레지스터들에 계속 액세스할 수 있게 하면서, 통상적인 MOV 명령어들을 사용하거나 직접 저장(MOVDIRI 또는 MOVDIR64B) 명령어들을 통해 다른 레지스터들에 계속 액세스할 수 있게 한다. 이는 또한, 인큐 저장 명령어들이 게스트 소프트웨어 내에서부터 연산될 수 있게 하는 한편, VMM 소프트웨어(디바이스 특정 정보를 갖지 않음)가 게스트 노출된 MMIO를 프로세서 확장 페이지 테이블(EPT)들 내의 UC로서 맵핑하여, 게스트 메모리 유형이 무시된다.
인큐 저장들에 대한 플랫폼 고려사항들
일부 구현들의 경우, 플랫폼 통합 디바이스들의 특정 세트는 공유 작업 큐(SWQ) 능력을 지원한다. 이러한 디바이스들은 내부 I/O 패브릭들을 통해 루트 컴플렉스에 부착될 수 있다. 이러한 디바이스들은 PCI 익스프레스 루트 컴플렉스 통합 종점(RCIEP)들 또는 가상 루트 포트(VRP)들 뒤의 PCI 익스프레스 종점 디바이스들로서 호스트 소프트웨어에 노출될 수 있다.
SWQ들을 갖는 통합 디바이스들을 지원하는 플랫폼들은 내부 I/O 패브릭들에 대한 인큐 비-게시 기입 요청들의 라우팅을 그러한 디바이스들로만 제한해야 한다. 이는, 새로운 트랜잭션 유형(인큐 비-게시 기입)이 인큐-미인식 종점 디바이스에 의한 잘못 형성된 트랜잭션 계층 패킷(TLP)으로서 취급되지 않는 것을 보장하기 위한 것이다.
(주 메모리 어드레스 범위들 및 모든 다른 메모리 맵핑된 어드레스 범위들을 포함하는) 모든 다른 어드레스들에 대한 인큐 저장들은 플랫폼에 의해 종결되고, (오류가 아닌) 정상 응답은 재시도 완료 상태로 송출 프로세서에 반환된다. 비-특권 소프트웨어(링-3 소프트웨어 또는 VMX 비-루트 모드에서의 링-0 소프트웨어)가 ENQCMD/S 명령어들을 실행함으로써 인큐 비-게시 기입 트랜잭션들을 생성할 수 있으므로, 그러한 인큐 저장 종결들에 대해 어떠한 플랫폼 오류들도 생성되지 않는다.
루트 컴플렉스 구현들은, 인큐 저장들이 처리되어, 내부 I/O 패브릭들 상에서 단일의 (조각나지 않은) 비-게시 기입 트랜잭션들로서 SWQ들을 지원하는 통합 디바이스들로 전달되는 것을 보장해야 한다.
플랫폼 성능 고려사항들
이 섹션은, 시스템 에이전트 및 시스템 에이전트들에 의한 인큐 저장들의 처리에서의 성능 고려사항들 중 일부를 설명한다.
인큐 저장들에 대한 시스템 에이전트 추적기(TOR) 엔트리 할당을 위한 완화된 순서화:
메모리 일관성을 유지하기 위해, 시스템 에이전트 구현들은 전형적으로, 일관성 메모리 및 MMIO에 대한 (TOR 엔트리들을 할당할 때의) 캐시 라인 어드레스에 대한 요청들에 대해 엄격한 순서화를 강제한다. 이는 일관성 메모리 액세스들에 대한 전체 순서화를 지원하는 데 요구되지만, 인큐 저장들에 대한 이러한 엄격한 순서화는 성능 문제를 부과한다. 이는, 인큐 저장들이 디바이스들 상의 공유 작업 큐(SWQ)들을 대상으로 하고, 그에 따라, 동일한 목적지 SWQ 어드레스를 갖는 다수의 논리 프로세서들로부터 송출된 인큐 저장 요청들을 갖는 것이 일반적일 것이기 때문이다. 또한, 시스템 에이전트에 게시된 통상적인 저장들과는 달리, 인큐 저장들은 게시되지 않고 판독들과 유사한 레이턴시를 초래한다. 공유 작업 큐에 대해 미해결인 하나의 인큐 저장만을 허용하는 조건을 피하기 위해, 시스템 에이전트 구현들은, 동일한 어드레스로의 인큐 저장 요청들에 대한 엄격한 순서화를 완화시킬 것이 요구되고, 대신, 동일한 어드레스로의 다수의 인-플라이트(in-flight) 인큐 저장들에 대한 TOR 할당들을 허용한다. 논리 프로세서가 한 번에 최대 하나의 인큐 저장만을 송출할 수 있으므로, 시스템 에이전트/플랫폼은 순서화에 대한 염려 없이 독립적으로 각각의 인큐 저장을 취급할 수 있다.
I/O 브릿지 에이전트들에서의 다수의 미해결 인큐 비-게시 기입들의 지원:
I/O 브릿지 구현들은 전형적으로, 다운스트림 경로에서 지원되는 비-게시 (판독) 요청들의 수를 작은 수로(종종 단일 요청으로) 제한한다. 이는, 프로세서로부터 MMIO로의 판독들(대부분 UC 판독들임)이 대부분의 사용들에 대해 성능이 중요하지 않고, 판독들에 대한 큰 큐 깊이를 지원하는 것이, 반환된 데이터에 대한 버퍼들을 요구하여 하드웨어 비용이 추가되기 때문이다. 인큐 저장들이 일반적으로 가속기 디바이스들에 대해 작업 디스패치에 사용될 것으로 예상되므로, 인큐 비-게시 기입들에 대해 이러한 제한된 큐잉을 적용하는 것은 성능에 유해할 수 있다. 개선된 인큐 비-게시 기입 대역폭을 위한 증가된 큐 깊이(논리 프로세서들의 수의 몇몇 실용적인 비율이며, 논리 프로세서가 한 번에 하나의 미해결 인큐 저장 요청만을 가질 수 있기 때문임)를 지원하는 I/O 브릿지 구현들이 권장된다. 판독 요청들과는 달리, 인큐 저장들은 데이터 버퍼들의 하드웨어 비용을 발생시키지 않는데, 그 이유는, 인큐 비-게시 기입 완료들이 완료 상태(성공 대 재시도)만을 반환하고 어떠한 데이터도 반환하지 않기 때문이다.
인큐 비-게시 기입들에 대한 가상 채널 지원
생산자-소비자 순서화 요건들(이를테면, PCI 익스프레스 트랜잭션 순서화에 의해 특정됨)을 갖는 I/O 버스들 상의 전형적인 메모리 판독 및 기입 요청들과는 달리, 인큐 비-게시 기입들은 I/O 버스에 대한 어떠한 순서화 요건들도 갖지 않는다. 이는, 인큐 비-게시 기입들을 송출하고 개개의 완료들을 반환하기 위한 비-VC0 가상 채널의 사용을 가능하게 한다. 비-VC0 채널을 사용하는 이점은, 인큐 비-게시 기입 완료들이 디바이스로부터 호스트로 VC0에 대한 업스트림 게시 기입들 뒤에 순서화되는 것을 피함으로써 더 양호한 레이턴시(코어를 유지하기 위한 더 적은 사이클들)를 가질 수 있다는 점이다. 통합 디바이스 사용들을 주의 깊게 고려하고 인큐 비-게시 완료 레이턴시를 최소화하는 구현들이 권장된다.
인큐 비-게시 기입의 종간 종결
높은 레이턴시 상황들에 대한(이를테면, 내부 링크를 기상시키기 위한 전력 관리 또는 잠금 흐름에 대한) 특정 흐름 제어를 처리하기 위해, 중간 에이전트(시스템 에이전트, I/O 브릿지 등)는, 정당한 인큐 저장 요청을 드롭하고 송출 코어에 재시도 응답으로 완료를 반환하는 것이 허용된다. 인큐 저장을 송출하는 소프트웨어는, 재시도 응답이 중간 에이전트 또는 대상으로부터 온 경우에는 직접적인 가시성을 갖지 않고, 일반적으로 소프트웨어에서 (잠재적으로는 약간의 백-오프로) 재시도할 것이다.
그러한 중간 종결을 수행하는 구현들은, 그러한 거동이 SWQ를 공유하는 소프트웨어 클라이언트들에 걸쳐 어떠한 서비스 거부 공격들도 노출시킬 수 없다는 것을 확인하기 위해 극도로 주의해야 한다.
종점 디바이스들 상에서의 공유 작업 큐 지원
도 34는, 다수의 비-협력 소프트웨어 에이전트들(애플리케이션들(3410-3412))이 본원에서 설명되는 ENQCMD/S 명령어들을 활용하여 공유 작업 큐(3401)를 통해 작업을 제출할 수 있게 하는 공유 작업 큐(SWQ)의 개념을 예시한다.
공유 작업 큐(SWQ)들을 구현하는 종점 디바이스들에 다음의 고려사항들은 적용가능하다.
SWQ들 및 그의 열거: 디바이스 물리적 기능(PF)은 하나 이상의 SWQ를 지원할 수 있다. 각각의 SWQ는, 디바이스 MMIO 어드레스 범위에서 64 바이트 정렬되고 크기가 정해진 레지스터(본원에서 SWQ_REG로 지칭됨)를 통해 인큐 비-게시 기입들에 대해 액세스가능하다. 디바이스 상의 각각의 그러한 SWQ_REG는 고유한 시스템 페이지 크기(4 KB) 구역에 위치하도록 권장된다. 디바이스에 대한 디바이스 드라이버는, 적절한 소프트웨어 인터페이스들을 통해 SWQ 능력, 지원되는 SWQ들의 수 및 대응하는 SWQ_REG 어드레스들을 소프트웨어에 보고/열거하는 것을 담당한다. 드라이버는 또한, 소프트웨어 조정 또는 정보제공 목적들을 위해 지원되는 SWQ의 깊이를 임의로 보고할 수 있다(그렇지만, 이는 기능적 정확성을 위해 요구되지는 않음). 다수의 물리적 기능들을 지원하는 디바이스들의 경우, 각각의 물리적 기능에 대해 독립적인 SWQ들을 지원하는 것이 권장된다.
단일 루트 I/O 가상화(SR-IOV) 디바이스들 상에서의 SWQ 지원: SR-IOV를 지원하는 디바이스들은, 개개의 가상 기능(VF) 기준 어드레스 레지스터(BAR)들 내의 SWQ_REG들을 통해 노출되는, 각각의 VF에 대해 독립적인 SWQ들을 지원할 수 있다. 이러한 설계점은 VF들에 걸친 작업 제출에 대한 최대 성능 격리를 허용하고, 적은 수 내지 중간 정도의 수의 VF들에 적절할 수 있다. 많은 수의 VF들(여기서, VF 당 독립적인 SWQ는 실용적이지 않음)을 지원하는 디바이스들의 경우, 단일 SWQ가 다수의 VF들에 걸쳐 공유될 수 있다. 이러한 경우에도, 각각의 VF는, 이들이 SWQ를 공유하는 VF들에 걸친 공통 SWQ에 의해 백킹(back)된다는 것을 제외하고는, 자신의 VF BAR들 내에 자신 고유의 개인 SWQ_REG들을 갖는다. 그러한 디바이스 설계들의 경우, 어느 VF들이 SWQ를 공유하는지가 하드웨어 설계에 의해 정적으로 결정될 수 있거나, 주어진 VF의 SWQ_REG와 SWQ 인스턴스 간의 맵핑은 물리적 기능 및 그의 드라이버를 통해 동적으로 설정/해제될 수 있다. VF들에 걸쳐 SWQ를 공유하는 디바이스 설계들은 QoS에 특별한 주의를 기울이고 이 섹션에서 나중에 설명되는 바와 같이 서비스 거부 공격에 대해 보호할 필요가 있다. VF들에 걸쳐 SWQ들을 공유할 때, 어느 VF가 SWQ에 수용되는 인큐 요청을 수신했는지를 식별하기 위해 디바이스 설계에서 주의가 기울여져야 한다. SWQ로부터 작업 요청들을 디스패치할 때, 디바이스는, 업스트림 요청들이 (인큐 요청 페이로드에서 전달된 PAISD에 부가하여) 개개의 VF의 요청기-ID(버스/디바이스/기능#)로 적절히 태그지정되는 것을 확인해야 한다.
인큐 비-게시 기입 어드레스: SWQ들을 지원하는 종점 디바이스들은 그들의 PF 또는 VF 메모리 BAR들을 통해 라우팅되는 임의의 어드레스들에 인큐 비-게시 기입들을 수용할 것이 요구된다. SWQ_REG 어드레스가 아닌 어드레스에 대해 종점 디바이스에 의해 수신된 임의의 인큐 비-게시 기입 요청의 경우, 디바이스는 이를 오류(예컨대, 잘못 형성된 TLP 등)로서 취급하지 않고 대신에 재시도(MRS)의 완료 상태로 완료를 반환할 것이 요구될 수 있다. 이는, SWQ-가능 디바이스 상의 비-SWQ_REG 어드레스들에 대해 잘못하여 또는 악의적으로 인큐 저장들을 송출하는 ENQCMD/S 명령어들의 비-특권(링-3 또는 링-0 VMX 게스트) 소프트웨어 사용이, 플랫폼 특정 오류 처리 결과들로 치명적이지 않거나 치명적인 오류를 보고하는 것을 초래할 수 없음을 보장하도록 이루어질 수 있다.
SWQ_REG들에 대한 비-인큐 요청 처리: SWQ들을 지원하는 종점 디바이스들은, SWQ_REG 어드레스들에 대한 비-인큐 요청들(통상적인 메모리 기입들 및 판독들)을 치명적이거나 치명적이지 않은 오류들로 그들을 취급함이 없이 묵시적으로 드롭할 수 있다. SWQ_REG 어드레스들에 대한 판독 요청들은, 요청된 데이터 바이트들에 대해 모두 1의 값으로 (UR 또는 CA와는 대조적으로) 성공적인 완료 응답을 반환할 수 있다. SWQ_REG 어드레스들에 대한 통상적인 메모리 (게시된) 기입 요청들은 종점 디바이스에 의한 동작 없이 간단히 드롭된다. 이는, 비-특권 소프트웨어가, 플랫폼 특정 오류 처리 결과들로 치명적이지 않거나 치명적인 오류를 보고하는 것을 잘못하여 또는 악의적으로 야기하도록 SWQ_REG 어드레스에 대한 통상적인 판독 및 기입 요청들을 생성할 수 없음을 보장하도록 이루어질 수 있다.
SWQ 큐 깊이 및 저장소: SWQ 큐 깊이 및 저장소는 디바이스 구현 특정적이다. 디바이스 설계들은, 디바이스의 최대 활용을 달성하기 위해 SWQ에 대해 충분한 큐 깊이가 지원됨을 보장해야 한다. SWQ에 대한 저장소는 디바이스 상에서 구현될 수 있다. SoC 상의 통합 디바이스들은 빼앗긴 주 메모리(디바이스 사용에 예비된 비-OS 가시적 개인 메모리)를 SWQ에 대한 유출(spill) 버퍼로서 활용할 수 있어서, 온-디바이스 저장소로 가능한 것보다 더 큰 SWQ 큐 깊이들이 허용된다. 그러한 설계들의 경우, 유출 버퍼의 사용은 소프트웨어에 투명한데, 디바이스 하드웨어는 언제 유출시킬지를 결정하고(그와 대비하여, 인큐 요청을 드롭하고 재시도 완료 상태를 전송함), 명령 실행을 위해 유출 버퍼로부터 페치하고, 임의의 명령 특정 순서화 요건들을 유지한다. 모든 목적들을 위해, 그러한 유출 버퍼 사용은 SWQ 저장소에 대해 로컬 디바이스 부착 DRAM을 사용하는 별개의 디바이스와 등등하다. 빼앗긴 메모리에서 유출 버퍼를 갖는 디바이스 설계들은, 그러한 빼앗긴 메모리가 자신이 할당된 디바이스에 의한 유출 버퍼 판독 및 기입들 이외의 임의의 액세스들로부터 보호되는 것을 확인하기 위해 극도로 주의해야 한다.
비-차단 SWQ 거동: 성능 이유들로, 디바이스 구현들은, 성공 또는 재시도 완료 상태로 인큐 비-게시 기입 요청들에 신속하게 응답하고, SWQ 용량이 자유롭게 되게 하여 요청을 수용하기 위해 인큐 완료들을 차단하지 않아야 한다. SWQ에 대한 인큐 요청을 수용하거나 거절하기 위한 결정은 용량, QoS/점유 또는 임의의 다른 정책들에 기반할 수 있다. 일부 예시적인 QoS 고려사항들이 다음에 설명된다.
SWQ QoS 고려사항들: SWQ_REG 어드레스를 대상으로 하는 인큐 비-게시 기입의 경우, 종점 디바이스는, 개개의 SWQ에 대한 요청을 수용할지(그리고 성공적인 완료 상태를 전송함) 또는 요청을 드롭할지(그리고 재시도 완료 상태를 전송함)를 결정하기 위해 승인 제어를 적용할 수 있다. 승인 제어는 디바이스 및 사용 특정적일 수 있고, 하드웨어에 의해 지원/강제되는 특정 정책들은 물리적 기능(PF) 드라이버 인터페이스들을 통해 소프트웨어에 노출될 수 있다. SWQ는 다수의 생산자 클라이언트를 갖는 공유 리소스이기 때문에, 디바이스 구현들은 생산자들에 걸친 서비스 거부 공격들에 대한 충분한 보호를 보장해야 한다. SWQ에 대한 QoS는 SWQ에 대한 작업 요청들(인큐 요청들을 통함)의 수용만을 지칭하고, 상이한 생산자들에 의해 제출된 작업 요청들을 처리할 때 디바이스의 실행 리소스들을 공유하기 위해 QoS가 적용되는 방식에 대해 디바이스 하드웨어에 의해 적용되는 임의의 QoS에 직교한다. 인큐 요청들을 SWQ에 수용하기 위한 승인 정책들을 강제하도록 종점 디바이스들을 구성하기 위한 일부 예시적인 접근법들이 아래에 설명된다. 이들은 단지 예시 목적들을 위해 문서화되고, 정확한 구현 선택들은 디바이스 특정적일 것이다.
일 구현에서, MOVDIRI 명령어는 직접 저장 연산을 사용하여 소스 피연산자(제2 피연산자) 내의 이중워드 정수를 목적지 피연산자(제1 피연산자)로 이동시킨다. 소스 피연산자는 범용 레지스터일 수 있다. 목적지 피연산자는 32 비트 메모리 위치일 수 있다. 64 비트 모드에서, 명령어의 기본 연산 크기는 32 비트이다. MOVDIRI는 목적지를 이중워드 또는 사중워드 정렬되도록 정의한다.
직접 저장은 데이터를 기입하기 위한 기입 결합(WC) 메모리 유형 프로토콜을 사용함으로써 구현될 수 있다. 이러한 프로토콜을 사용하여, 프로세서는 데이터를 캐시 계층구조에 기입하지 않고, 대응하는 캐시 라인을 메모리로부터 캐시 계층구조로 페치하지도 않는다. 목적지 어드레스가 캐싱되는 경우, 직접 저장 이전에, 라인은 (수정되는 경우) 라이트백되고 캐시로부터 무효화된다. 비-시간적 힌트를 번복하기 위해 목적지에 대한 캐싱되지 않은(UC) 및 기입 방지(WP) 메모리 유형을 허용하는 비-시간적 힌트를 갖는 저장들과 달리, 직접 저장들은 항상 목적지 어드레스 메모리 유형(UC 및 WP 유형들을 포함함)에 관계없이 WC 메모리 유형 프로토콜을 따른다.
WC 저장들 및 비-시간적 힌트들을 갖는 저장들과는 달리, 직접 저장들은, 기입 결합 버퍼로부터의 즉시 축출의 자격이 있으며, 그에 따라, 동일한 어드레스에 대한 더 신생의 저장들(직접 저장들을 포함함)과 결합되지 않는다. 기입 결합 버퍼에 보유된 더 오래된 WC 및 비-시간적 저장들은 동일한 어드레스에 대한 더 신생의 직접 저장들과 결합될 수 있다.
직접 저장들에 의해 사용되는 WC 프로토콜은 약하게 순서화된 메모리 일관성 모델을 따르기 때문에, 필요한 경우 순서화를 강제하기 위해 펜싱 연산은 MOVDIRI 명령어를 따라야 한다.
직접 저장들은 MOVDIRI에 의해 4 바이트 경계로 정렬된 목적지에 송출되고, 4 바이트 기입 완료 원자성을 보장한다. 이는, 데이터가 단일의 조각나지 않은 4 바이트(또는 8 바이트) 기입 트랜잭션으로 목적지에 도달함을 의미한다. 목적지가 기입 크기에 맞게 정렬되어 있지 않은 경우, MOVDIRI에 의해 송출된 직접 저장들은 분할되어 2개의 부분들로 목적지에 도달한다. 그러한 분할된 직접 저장의 각각의 부분은 더 신생의 저장들과 병합되지 않을 것이지만, 임의의 순서로 목적지에 도달할 수 있다.
도 59는 MOVDIRI 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
5901에서, 명령어가 페치된다. 예컨대, MOVDIRI가 페치된다. MOVDIRI 명령어는 연산코드(및 일부 실시예에서는 프리픽스), 목적지 피연산자를 나타내는 목적지 필드, 및 소스 레지스터 피연산자를 나타내는 소스 필드를 포함한다.
5903에서, 페치된 명령어가 디코딩된다. 예컨대, MOVDIRI 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
5905에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
5907에서, 디코딩된 명령어가 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 이중워드 크기의 데이터를, 데이터를 캐싱함이 없이 소스 레지스터 피연산자로부터 목적지 레지스터 피연산자로 이동시킨다.
5909에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
소스 메모리 어드레스로부터 목적지 메모리 어드레스로 64 바이트 기입 원자성을 갖는 직접 저장으로서 64 바이트가 이동된다. 소스 피연산자는 통상적인 메모리 피연산자이다. 목적지 피연산자는 범용 레지스터에서 특정된 메모리 위치이다. 레지스터 콘텐츠는 임의의 세그먼트 번복이 없는 ES 세그먼트로의 오프셋으로서 해석된다. 64 비트 모드에서, 레지스터 피연산자 폭은 64 비트(또는 32 비트)이다. 64 비트 모드 외에는, 레지스터 폭은 32 비트 또는 16 비트이다. MOVDIR64B는 목적지 어드레스가 64 바이트로 정렬될 것을 요구한다. 소스 피연산자에 대해 어떠한 정렬 제한도 강제되지 않는다.
MOVDIR64B는 소스 메모리 어드레스로부터 64 바이트를 판독하고, 목적지 어드레스에 64 바이트 직접 저장 연산을 수행한다. 로드 연산은 소스 어드레스 메모리 유형에 기반한 통상적인 판독 순서화를 따른다. 직접 저장은 데이터를 기입하기 위한 기입 결합(WC) 메모리 유형 프로토콜을 사용함으로써 구현된다. 이러한 프로토콜을 사용하여, 프로세서는 데이터를 캐시 계층구조에 기입하지 않을 수 있고, 대응하는 캐시 라인을 메모리로부터 캐시 계층구조로 페치하지 않을 수 있다. 목적지 어드레스가 캐싱되는 경우, 직접 저장 이전에, 라인은 (수정되는 경우) 라이트백되고 캐시로부터 무효화된다.
비-시간적 힌트를 번복하기 위해 목적지에 대한 UC/WP 메모리 유형들을 허용하는 비-시간적 힌트를 갖는 저장들과 달리, 직접 저장들은 목적지 어드레스 메모리 유형(UC/WP 유형들을 포함함)에 관계없이 WC 메모리 유형 프로토콜을 따를 수 있다.
WC 저장들 및 비-시간적 힌트들을 갖는 저장들과는 달리, 직접 저장들은 기입 결합 버퍼로부터의 즉시 축출의 자격이 있으며, 그에 따라, 동일한 어드레스에 대한 더 신생의 저장들(직접 저장들을 포함함)과 결합되지 않는다. 기입 결합 버퍼에 보유된 더 오래된 WC 및 비-시간적 저장들은 동일한 어드레스에 대한 더 신생의 직접 저장들과 결합될 수 있다.
직접 저장들에 의해 사용되는 WC 프로토콜은 약하게 순서화된 메모리 일관성 모델을 따르기 때문에, 필요한 경우 순서화를 강제하기 위해 펜싱 연산들은 MOVDIR64B 명령어를 따라야 한다.
소스 어드레스로부터의 64 바이트 로드 연산에 대해 제공되는 원자성 보장이 없고, 프로세서 구현들은 64 바이트를 판독하기 위해 다수의 로드 연산들을 사용할 수 있다. MOVDIR64B에 의해 송출된 64 바이트 직접 저장은 64 바이트 기입 완료 원자성을 보장한다. 이는, 데이터가 단일의 조각나지 않은 64 바이트 기입 트랜잭션으로 목적지에 도달함을 의미한다.
도 60은 MOVDIRI64B 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
6001에서, 명령어가 페치된다. 예컨대, MOVDIRI64B가 페치된다. MOVDIRI64B 명령어는 연산코드(및 일부 실시예에서는 프리픽스), 목적지 피연산자를 나타내는 목적지 필드, 및 소스 레지스터 피연산자를 나타내는 소스 필드를 포함한다.
6003에서, 페치된 명령어가 디코딩된다. 예컨대, MOVDIRI64B 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
6005에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
6007에서, 디코딩된 명령어가 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 64 바이트 데이터를, 데이터를 캐싱함이 없이 소스 레지스터 피연산자로부터 목적지 레지스터 피연산자로 이동시킨다.
6009에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
일 구현에서, ENQCMD 명령은, 소스 메모리 어드레스(제2 피연산자)에서 목적지 피연산자의 디바이스 공유 작업 큐(SWQ) 메모리 어드레스로 64 바이트 기입 원자성을 갖는 비-게시 기입을 사용하여 64 바이트 명령을 인큐잉한다. 소스 피연산자는 통상적인 메모리 피연산자이다. 목적지 피연산자는 범용 레지스터에서 특정된 메모리 어드레스이다. 레지스터 콘텐츠는 임의의 세그먼트 번복이 없는 ES 세그먼트로의 오프셋으로서 해석된다. 64 비트 모드에서, 레지스터 피연산자 폭은 64 비트 또는 32 비트이다. 64 비트 모드 외에는, 레지스터 폭은 32 비트 또는 16 비트이다. ENQCMD는 목적지 어드레스가 64 바이트로 정렬될 것을 요구한다. 소스 피연산자에 대해 어떠한 정렬 제한도 강제되지 않는다.
일 구현에서, ENQCMD는 소스 메모리 어드레스로부터 64 바이트 명령을 판독하고, 64 바이트 인큐 저장 데이터를 포맷하고, 목적지 어드레스에 대해 저장 데이터의 64 바이트 인큐 저장 연산을 수행한다. 로드 연산은 소스 어드레스 메모리 유형에 기반한 통상적인 판독 순서화를 따른다. 소스 메모리 어드레스로부터 판독된 64 바이트 명령 데이터의 하위 4 바이트가 0이 아닌 값을 갖거나, PASID 유효 필드 비트가 0인 경우, 일반적인 보호 오류가 발생할 수 있다. 그렇지 않으면, 64 바이트 인큐 저장 데이터는 다음과 같이 포맷된다:
인큐 저장 데이터 [511:32] = 명령 데이터 [511:32]
인큐 저장 데이터 [31] = 0
인큐 저장 데이터 [30:20] = 0
인큐 저장 데이터 [19:0] = PASID MSR [19:0]
일 구현에서, ENQCMD에 의해 생성된 64 바이트 인큐 저장 데이터는 도 58에 예시된 포맷을 갖는다. 명령 기술어 내의 상위 60 바이트는 대상 디바이스 특정 명령(5801)을 특정한다. PRIV 필드(5802)(비트 31)는 ENQCMD 명령어에 의해 생성된 인큐 저장들에 대한 사용자 특권을 전달하도록 0으로 강제될 수 있다. PASID 필드(비트 19:0)(5804)는 ENQCMD1을 실행하는 소프트웨어 스레드에 대한 시스템 소프트웨어에 의해 배정된 (PASID MSR에서 프로그래밍된 바와 같이) 프로세스 어드레스 공간 아이덴티티를 전달한다.
인큐 저장 연산은 64 바이트의 데이터를 기입하기 위해 비-게시 기입 프로토콜을 사용한다. 비-게시 기입 프로토콜은 데이터를 캐시 계층구조에 기입하지 않을 수 있고, 대응하는 캐시 라인을 캐시 계층구조로 페치하지 않을 수 있다. 인큐 저장들은 (UC/WP 유형들을 포함하는) 목적지 어드레스 메모리 유형에 관계없이 비-게시 기입 프로토콜을 항상 따른다.
비-게시 기입 프로토콜은 비-게시 기입에 대한 성공 또는 재시도 상태를 표시하기 위해 완료 응답을 반환할 수 있다. ENQCMD 명령어는 제로 플래그에서 이러한 완료 상태를 반환할 수 있다(0은 성공을 표시하고, 1은 재시도를 표시함). 성공 상태는, 비-게시 기입 데이터(64 바이트)가 대상 공유 작업 큐에 의해 수용된다는 것을 표시한다(그러나 반드시 그렇게 동작하는 것은 아님). 재시도 상태는, 비-게시 기입이 용량 또는 다른 시간적 이유들로 인해(또는 유효 공유 작업 큐 어드레스가 아닌 목적지 어드레스로 인해) 목적지 어드레스에 의해 수용되지 않았다는 것을 표시한다.
일 구현에서, 최대 하나의 인큐 저장이 주어진 논리 프로세서로부터 미해결될 수 있다. 그러한 의미에서, 인큐 저장은 또 다른 인큐 저장을 통과할 수 없다. 인큐 저장들은 더 오래된 WB 저장들, WC 및 비-시간적 저장들, CLFLUSHOPT 또는 CLWB를 거슬러 상이한 어드레스들에 순서화되지 않는다. 그러한 순서화를 강제할 필요가 있는 소프트웨어는 그러한 저장들 후에 그리고 인큐 저장 전에 명시적 저장 펜싱을 사용해야 한다. ENQCMD는 다른 저장들에 의해 영향을 받지 않는 공유 작업 큐(SWQ) 어드레스들에만 영향을 미친다.
소스 어드레스로부터의 64 바이트 로드 연산에 대해 제공되는 원자성 보장이 없고, 프로세서 구현들은 64 바이트를 판독하기 위해 다수의 로드 연산들을 사용할 수 있다. ENQCMD에 의해 송출된 64 바이트 인큐 저장은 64 바이트 기입 완료 원자성을 보장한다. 데이터는 단일의 조각나지 않은 64 바이트 비-게시 기입 트랜잭션으로서 목적지에 도달할 수 있다.
일부 실시예들에서, PASID 아키텍처 MSR은 ENQCMD 명령어에 의해 사용된다.
Figure 112020130859394-pat00044
도 61은 ENCQMD 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
6101에서, 명령어가 페치된다. 예컨대, ENCQMD가 페치된다. ENCQMD 명령어는 연산코드(및 일부 실시예에서는 프리픽스), 목적지 메모리 어드레스 피연산자를 나타내는 목적지 필드, 및 소스 메모리 피연산자를 나타내는 소스 필드를 포함한다.
6103에서, 페치된 명령어가 디코딩된다. 예컨대, ENCQMD 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
6105에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
6107에서, 디코딩된 명령어가 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 명령(검색된 데이터)을 목적지 메모리 어드레스에 기입한다. 일부 실시예들에서, 목적지 메모리 어드레스는 공유 작업 큐 어드레스이다.
6109에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
일 구현에서, ENQCMDS 명령어는, 소스 메모리 어드레스(제2 피연산자)에서 목적지 피연산자의 디바이스 공유 작업 큐(SWQ) 메모리 어드레스로 64 바이트 기입 원자성을 갖는 비-게시 기입을 사용하여 64 바이트 명령을 인큐잉한다. 소스 피연산자는 통상적인 메모리 피연산자이다. 목적지 피연산자는 범용 레지스터에서 특정된 메모리 어드레스이다. 레지스터 콘텐츠는 임의의 세그먼트 번복이 없는 ES 세그먼트로의 오프셋으로서 해석될 수 있다. 64 비트 모드에서, 레지스터 피연산자 폭은 64 비트 또는 32 비트이다. 64 비트 모드 외에는, 레지스터 폭은 32 비트 또는 16 비트이다. ENQCMD는 목적지 어드레스가 64 바이트로 정렬될 것을 요구한다. 소스 피연산자에 대해 어떠한 정렬 제한도 강제되지 않는다.
(임의의 특권 레벨로부터 실행될 수 있는) ENQCMD와는 달리, ENQCMDS는 특권 명령어이다. 프로세서가 보호 모드에서 실행 중일 때, CPL은 이러한 명령어를 실행하기 위해 0이어야 한다. ENQCMDS는 소스 메모리 어드레스로부터 64 바이트 명령을 판독하고, 이 데이터를 사용하여 목적지 어드레스에 64 바이트 인큐 저장 연산을 수행한다. 로드 연산은 소스 어드레스 메모리 유형에 기반한 통상적인 판독 순서화를 따른다. 64 바이트 인큐 저장 데이터는 다음과 같이 포맷된다:
인큐 저장 데이터 [511:32] = 명령 데이터 [511:32]
인큐 저장 데이터 [31] = 명령 데이터 [31]
인큐 저장 데이터 [30:20] = 0
인큐 저장 데이터 [19:0] = 명령 데이터 [19:0]
ENQCMDS에 의해 생성된 64 바이트 인큐 저장 데이터는 ENQCMD와 동일한 포맷을 가질 수 있다. 일 구현에서, ENQCMDS는 도 62에 예시된 포맷을 갖는다.
명령 기술어 내의 상위 60 바이트는 대상 디바이스 특정 명령(6201)을 특정한다. PRIV 필드(비트 31)(6202)는 ENQCMDS 명령어에 의해 생성된 인큐 저장들에 대한 사용자(0) 또는 감시자(1) 특권을 전달하기 위해 소스 피연산자 어드레스에서 명령 데이터의 비트 31에 의해 특정된다. PASID 필드(비트들 19:0)(6204)는 소스 피연산자 어드레스1에서 명령 데이터의 비트들 19:0에서 특정된 바와 같은 프로세스 어드레스 공간 아이덴티티를 전달한다.
일 구현에서, 인큐 저장 연산은 64 바이트의 데이터를 기입하기 위해 비-게시 기입 프로토콜을 사용한다. 비-게시 기입 프로토콜은 데이터를 캐시 계층구조에 기입하지 않고, 대응하는 캐시 라인을 캐시 계층구조로 페치하지도 않는다. 인큐 저장들은 (UC/WP 유형들을 포함하는) 목적지 어드레스 메모리 유형에 관계없이 비-게시 기입 프로토콜을 항상 따른다.
비-게시 기입 프로토콜은 비-게시 기입에 대한 성공 또는 재시도 상태를 표시하기 위해 완료 응답을 반환한다. ENQCMD 명령어는 제로 플래그에서 이러한 완료 상태를 반환한다(0은 성공을 표시하고, 1은 재시도를 표시함). 성공 상태는, 비-게시 기입 데이터(64 바이트)가 대상 공유 작업 큐에 의해 수용된다는 것을 표시한다(그러나 반드시 그렇게 동작하는 것은 아님). 재시도 상태는, 비-게시 기입이 용량 또는 다른 시간적 이유들로 인해(또는 유효 공유 작업 큐 어드레스가 아닌 목적지 어드레스로 인해) 목적지 어드레스에 의해 수용되지 않았다는 것을 표시한다.
최대 하나의 인큐 저장(ENQCMD 또는 ENQCMDS)이 주어진 논리 프로세서로부터 미해결될 수 있다. 그러한 의미에서, 인큐 저장은 또 다른 인큐 저장을 통과할 수 없다. 인큐 저장들은 더 오래된 WB 저장들, WC 및 비-시간적 저장들, CLFLUSHOPT 또는 CLWB를 거슬러 상이한 어드레스들에 순서화되지 않을 수 있다. 그러한 순서화를 강제할 필요가 있는 소프트웨어는 그러한 저장들 후에 그리고 인큐 저장 전에 명시적 저장 펜싱을 사용할 수 있다.
ENQCMDS는 다른 저장들에 의해 영향을 받지 않는 공유 작업 큐(SWQ) 어드레스들에만 영향을 미친다.
소스 어드레스로부터의 64 바이트 로드 연산에 대해 제공되는 원자성 보장이 없고, 프로세서 구현들은 64 바이트를 판독하기 위해 다수의 로드 연산들을 사용할 수 있다. ENQCMDS에 의해 송출된 64 바이트 인큐 저장은 64 바이트 기입 완료 원자성을 보장한다(즉, 단일의 조각나지 않은 64 바이트 비-게시 기입 트랜잭션으로서 목적지에 도달함).
도 63은 ENCQMDS 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
6301에서, 명령어가 페치된다. 예컨대, ENCQMDS가 페치된다. ENCQMDS 명령어는 연산코드(및 일부 실시예에서는 프리픽스), 목적지 메모리 어드레스 피연산자를 나타내는 목적지 필드, 및 소스 메모리 피연산자를 나타내는 소스 필드를 포함한다.
6303에서, 페치된 명령어가 디코딩된다. 예컨대, ENCQMDS 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
6305에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
6307에서, 디코딩된 명령어가 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 특권 모드로 실행되어, 명령(검색된 데이터)을 목적지 메모리 어드레스에 기입한다. 일부 실시예들에서, 목적지 메모리 어드레스는 공유 작업 큐 어드레스이다.
6309에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
일 구현은, 가속기 및 호스트 프로세서 간의 효율적인 동기화를 보장하기 위해 2개의 명령어: UMONITOR 및 UMWAIT를 활용한다. 간략하게, UMONITOR 명령어는 소스 레지스터에서 특정된 어드레스를 사용하여 어드레스 모니터링 하드웨어를 대비(arm)시키고, UMWAIT 명령어는 일정 범위의 어드레스들을 모니터링하면서 구현 의존적 최적화된 상태에 진입할 것을 프로세서에 지시한다.
UMONITOR 명령어는 r32/r64 소스 레지스터에서 지정된 어드레스(모니터링 하드웨어가 저장 연산들을 검사하는 어드레스 범위는 CPUID 모니터 리프(leaf) 함수를 사용함으로써 결정될 수 있음)를 사용하여 어드레스 모니터링 하드웨어를 대비시킨다. 특정된 어드레스 범위 내의 어드레스로의 저장은 모니터링 하드웨어를 트리거링한다. 모니터 하드웨어의 상태는 UMWAIT에 의해 사용된다.
UMONITOR 명령어의 일 구현에 대해 다음의 피연산자 인코딩들이 사용된다:
Figure 112020130859394-pat00045
r32/r64 소스 레지스터의 콘텐츠는 유효 어드레스이다(64 비트 모드에서는, r64가 사용됨). 기본적으로, DS 세그먼트는 모니터링되는 선형 어드레스를 생성하는 데 사용된다. 세그먼트 번복들이 사용될 수 있다. 어드레스 범위는 라이트백 유형의 메모리를 사용해야 한다. 라이트백 메모리만이 모니터링 하드웨어를 정확하게 트리거링하도록 보장된다.
UMONITOR 명령어는 다른 메모리 트랜잭션들에 대한 로드 연산으로서 순서화된다. 명령어는 바이트 로드와 연관된 승인 검사 및 장애들에 영향을 받는다. 로드와 같이, UMONITOR은 페이지 테이블들에 A 비트를 설정하지만 D 비트는 설정하지 않는다.
UMONITOR 및 UMWAIT는 임의의 특권 레벨에서 실행될 수 있다. 명령어의 연산은 비-64 비트 모드들과 64 비트 모드에서 동일하다.
UMONITOR은 레거시 MWAIT 명령어와 상호연산되지 않는다. UMONITOR이 MWAIT를 실행하기 전에 실행되었고 레거시 MONITOR 명령어의 가장 최근의 실행에 후속하는 경우, MWAIT는 최적화된 상태에 진입하지 않을 수 있다. 실행은 MWAIT에 후속하는 명령어에서 재개될 것이다.
UMONITOR 명령어는 트랜잭션 구역 내부에서 사용될 때 트랜잭션 중단을 야기한다.
UMONITOR은 소스 레지스터의 콘텐츠를 유효 어드레스로서 사용하여 모니터 하드웨어에 대한 어드레스 범위를 설정하고, 모니터 하드웨어를 대비된 상태로 둔다. 특정된 어드레스 범위에 대한 저장은 모니터 하드웨어를 트리거링할 것이다.
도 64는 UMONITOR 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
6401에서, 명령어가 페치된다. 예컨대, UMONITOR이 페치된다. UMONITOR 명령어는 연산코드(및 일부 실시예에서는 프리픽스) 및 명시적 소스 레지스터 피연산자를 포함한다.
6403에서, 페치된 명령어가 디코딩된다. 예컨대, UMONITOR 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
6405에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
6407에서, 디코딩된 명령어는 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 검색된 소스 레지스터 데이터에 의해 정의된 어드레스에 대한 저장에 대해 모니터링 하드웨어를 대비시킨다.
6409에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
UMWAIT는 어드레스들의 범위를 모니터링하면서 구현 의존적 최적화된 상태에 진입할 것을 프로세서에 지시한다. 최적화된 상태는 경량의 전력/성능 최적화된 상태 또는 개선된 전력/성능 최적화된 상태일 수 있다. 2개의 상태 사이의 선택은 명시적 입력 레지스터 비트[0] 소스 피연산자에 의해 통제된다.
Figure 112020130859394-pat00046
UMWAIT는 임의의 특권 레벨에서 실행될 수 있다. 이러한 명령어의 연산은 비-64 비트 모드들과 64 비트 모드에서 동일하다.
입력 레지스터는, 다음의 표에서 기술된 바와 같은, 프로세서가 진입해야 하는 선호하는 최적화된 상태와 같은 정보를 포함할 수 있다. 비트 0 이외의 비트들이 예비되고, 0이 아닌 경우 #GP를 초래할 것이다.
Figure 112020130859394-pat00047
명령어는 타임-스탬프 계수기가 암시적 64 비트 입력 값에 도달하거나 그를 초과할 때 (모니터링 하드웨어가 미리 트리거링하지 않은 경우) 기상한다.
UMWAIT 명령어를 실행하기 전에, 운영 체제는, 프로세서가 2개의 전력/성능 최적화된 상태 중 어느 하나를 포함할 수 있는 자신의 연산을 일시중단할 수 있게 하는 최대 지연을 특정할 수 있다. 운영 체제는, TSC 퀀타(quanta) 값을 다음의 32 비트 MSR에 기입함으로써 그렇게 행할 수 있다:
UMWAIT_CONTROL[31:2] ― 프로세서가 C0.1 또는 C0.2 중 어느 하나에 상주할 수 있는 TSC 퀀타에서의 최대 시간을 결정한다. 0 값은 OS가 프로세서에 대해 어떠한 제한도 제기하지 않음을 표시한다. 최대 시간 값은 32b 값이며, 여기서, 상위 30b가 이 필드로부터 비롯되고 하위 2 비트는 0인 것으로 가정된다.
UMWAIT_CONTROL[1] ― 예비된다.
UMWAIT_CONTROL[0] ―C0.2가 OS에 의해 허용되지 않는다. 1의 값은 모든 C0.2 요청들이 C0.1로 되돌아감을 의미한다.
일 구현에서, UMWAIT 명령어를 실행한 프로세서가 운영 체제 시간 제한의 만료로 인해 기상하는 경우, 명령어들은 올림 플래그(carry flag)를 설정하고; 그렇지 않은 경우, 그 플래그는 소거된다.
UMWAIT 명령어는 트랜잭션 구역 내부에서 사용될 때 트랜잭션 중단을 야기한다. 일 구현에서, UMWAIT 명령어는 UMONITOR 명령어와 함께 연산된다. 2개의 명령어는, 대기할 어드레스(UMONITOR) 및 대기 어드레스에서 시작하기 위한 구현 의존적 최적화된 연산(UMWAIT)의 정의를 허용한다. UMWAIT의 실행은, UMONITOR에 의해 대비된 어드레스 범위에 대한 이벤트 또는 저장 연산을 대기하는 동안 구현 의존적 최적화된 상태에 프로세서가 진입할 수 있는 프로세서에 대한 힌트이다.
다음의 것들은 프로세서로 하여금 구현 의존적 최적화된 상태를 퇴장하게 할 수 있다: UMONITOR 명령어에 의해 대비된 어드레스 범위에 대한 저장, 비-마스킹가능 인터럽트(NMI) 또는 시스템 관리 인터럽트(SMI), 디버그 예외, 기계 검사 예외, BINIT# 신호, INIT# 신호, 및 RESET# 신호. 다른 구현 의존적 이벤트들이 또한 프로세서로 하여금 구현 의존적 최적화된 상태를 퇴장하게 할 수 있다.
게다가, 외부 인터럽트는, 마스킹가능 인터럽트들이 금지된지 여부에 관계없이 프로세서로 하여금 구현 의존적 최적화된 상태를 퇴장하게 할 수 있다.
구현 의존적 최적화된 상태로부터의 퇴장에 후속하여, 제어는 UMWAIT 명령어에 후속하는 명령어로 넘어간다. (NMI 또는 SMI를 포함하는) 마스킹되지 않은 계류 인터럽트는 그 명령어의 실행 전에 전달될 수 있다.
HLT 명령어와는 달리, UMWAIT 명령어는 SMI의 처리에 후속하는 UMWAIT 명령어에서의 재시작을 지원하지 않는다. 선행 UMONITOR 명령어가 성공적으로 어드레스 범위를 대비하지 않았거나 또는 UMONITOR가 UMWAIT를 실행하기 전에 실행되지 않았고 레거시 MONITOR 명령어의 가장 최근의 실행에 후속하는 경우(UMWAIT는 MONITOR와 상호연산되지 않음), 프로세서는 최적화된 상태에 진입하지 않을 것이다. 실행은 UMWAIT에 후속하는 명령어에서 재개될 것이다.
UMWAIT는 C1보다 수치적으로 낮은 C0-하위 상태들을 진입하기 위해 사용되고, 그에 따라, UMONITOR 명령어에 의해 대비되는 어드레스 범위에 대한 저장은, 저장이 다른 프로세서 에이전트들에 의해 비롯되었거나 저장이 비-프로세서 에이전트들에 의해 비롯된 경우에는 프로세서로 하여금 UMWAIT를 퇴장하게 할 것임을 유의한다.
도 65는 UMWAIT 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
6501에서, 명령어가 페치된다. 예컨대, UMWAIT가 페치된다. UMWAIT 명령어는 연산코드(및 일부 실시예에서는 프리픽스) 및 명시적 소스 레지스터 피연산자를 포함한다.
6503에서, 페치된 명령어가 디코딩된다. 예컨대, UMWAIT 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
6505에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
6507에서, 디코딩된 명령어는 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 프로세서(또는 코어)를, 어드레스들의 범위를 모니터링하면서, 명시적 소스 레지스터 피연산자의 데이터에 의해 정의되는 구현 의존적 상태에 진입하게 한다.
6509에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
TPAUSE는 구현 의존적 최적화된 상태에 진입할 것을 프로세서에 지시한다. 2개의 그러한 최적화된 상태: 경량 전력/성능 최적화된 상태 및 개선된 전력/성능 최적화된 상태로부터 선택된다. 2개의 최적화된 상태 사이의 선택은 명시적 입력 레지스터 비트[0] 소스 피연산자에 의해 통제된다.
Figure 112020130859394-pat00048
TPAUSE는 임의의 특권 레벨에서 실행될 수 있다. 이러한 명령어의 연산은 비-64 비트 모드들과 64 비트 모드에서 동일하다.
PAUSE와는 달리, TPAUSE 명령어는 트랜잭션 구역 내부에서 사용될 때 중단을 야기하지 않을 것이다. 입력 레지스터는, 다음의 표에서 기술된 바와 같은, 프로세서가 진입해야 하는 바람직한 최적화된 상태와 같은 정보를 포함한다. 비트 0 이외의 비트들이 예비되고, 0이 아닌 경우 #GP를 초래할 것이다.
Figure 112020130859394-pat00049
명령어는 타임-스탬프 계수기가 암시적 64 비트 입력 값에 도달하거나 그를 초과할 때 (모니터링 하드웨어가 미리 트리거링하지 않은 경우) 기상한다. TPAUSE 명령어를 실행하기 전에, 운영 체제는, 프로세서가 2개의 전력/성능 최적화된 상태 중 어느 하나에서 자신의 연산을 일시중단할 수 있게 하는 최대 지연을 특정할 수 있다. 운영 체제는, TSC 퀀타 값을 다음의 32 비트 MSR에 기입함으로써 그렇게 행할 수 있다:
UMWAIT_CONTROL[31:2] ― 프로세서가 C0.1 또는 C0.2 중 어느 하나에 상주할 수 있는 TSC 퀀타에서의 최대 시간을 결정한다. 0 값은 OS가 프로세서에 대해 어떠한 제한도 제기하지 않음을 표시한다. 최대 시간 값은 32b 값이며, 여기서, 상위 30b가 이 필드로부터 비롯되고 하위 2 비트는 0인 것으로 가정된다.
UMWAIT_CONTROL[1] ― 예비된다.
UMWAIT_CONTROL[0] ― C0.2가 OS에 의해 허용되지 않는다. '1의 값은 모든 C0.2 요청들이 C0.1로 되돌아감을 의미한다.
OS 시간 제한의 만료로 인한 기상 이유는 올림 플래그를 설정함으로써 표시될 수 있다.
TPAUSE 명령어를 실행한 프로세서가 운영 체제 시간 제한의 만료로 인해 기상하는 경우, 명령어는 올림 플래그를 설정하고; 그렇지 않은 경우, 그 플래그는 소거된다.
다수의 어드레스 범위들을 모니터링하는 경우, TPAUSE 명령어는, 모니터링하기 위한 어드레스들의 세트 및 후속 TPAUSE 명령어로 구성되는 트랜잭션 구역 내에 배치될 수 있다. 트랜잭션 구역은, 대기할 어드레스들과 TPAUSE 명령어의 실행에서 시작하기 위한 구현 의존적 최적화된 연산의 세트의 정의를 허용한다. 일 구현에서, TPAUSE의 실행은 판독 세트에 의해 정의된 범위 내의 어드레스들로의 이벤트 또는 저장 연산을 대기하는 동안 구현 의존적 최적화된 상태에 진입할 것을 프로세서에 지시한다.
트랜잭션 메모리 구역 내에서의 TPAUSE의 사용은 C0.1(경량 전력/성능 최적화된 상태)로 제한될 수 있다. 소프트웨어가 비트[0]=0을 설정하여 C0.2(개선된 전력/성능 최적화된 상태)에 대한 자신의 선호도를 표시하는 경우라 하더라도, 프로세서는 C0.1에 진입할 수 있다.
다음의 것들은 프로세서로 하여금 구현 의존적 최적화된 상태를 퇴장하게 할 수 있다: 트랜잭션 구역 내의 판독-세트 범위에 대한 저장, NMI 또는 SMI, 디버그 예외, 기계 검사 예외, BINIT# 신호, INIT# 신호, 및 RESET# 신호. 모든 이러한 이벤트들은 또한 트랜잭션을 중단시킬 것이다.
다른 구현 의존적 이벤트들은 프로세서로 하여금 구현 의존적 최적화된 상태를 퇴장하게 할 수 있고, 비-중단 트랜잭션 구역을 초래하여 TPAUSE에 후속하는 명령어로 진행될 수 있다. 게다가, 일부 실시예들에서, 외부 인터럽트는, 마스킹가능 인터럽트들이 금지된지 여부에 관계없이 프로세서로 하여금 구현 의존적 최적화된 상태를 퇴장하게 한다. 마스킹가능 인터럽트들이 금지된 경우에, 실행은 TPAUSE에 후속하는 명령어로 진행될 것이지만, 인터럽트 인에이블됨 플래그가 설정된 경우에는 트랜잭션 구역이 중단될 것임이 유의되어야 한다.
도 66은 TPAUSE 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다. 예컨대, 본원에서 상세히 설명된 하드웨어가 사용된다.
6601에서, 명령어가 페치된다. 예컨대, TPAUSE가 페치된다. TPAUSE 명령어는 연산코드(및 일부 실시예에서는 프리픽스) 및 명시적 소스 레지스터 피연산자를 포함한다.
6603에서, 페치된 명령어가 디코딩된다. 예컨대, TPAUSE 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
6605에서, 디코딩된 명령어의 소스 피연산자와 연관된 데이터 값들이 검색된다. 부가적으로, 일부 실시예들에서, 명령어가 스케줄링된다.
6607에서, 디코딩된 명령어는 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 프로세서(또는 코어)를, 명시적 소스 레지스터 피연산자의 데이터에 의해 정의되는 구현 특정 상태에 진입하게 한다.
6609에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
도 67은 UMWAIT 및 UMONITOR 명령어들을 사용하는 실행의 예를 예시한다.
6701에서, 모니터링할 어드레스들의 범위를 설정하기 위해 UMWAIT 명령어가 실행된다.
6703에서, 모니터링되고 있는 어드레스들의 범위에 대해, 명령어를 실행하는 코어를, 명령어의 명시적 소스 레지스터 피연산자의 데이터에 의해 정의되는 구현 의존적 상태에 진입하게 하기 위해 UMONITOR 명령어가 실행된다.
6705에서, 모니터링되는 어드레스들에 대한 저장, NMI, SMI, 디버그 예외, 기계 검사 예외, 초기화(init) 신호, 또는 리셋 신호 중 하나의 경우에 구현 의존적 상태에서 퇴장된다.
도 68은 TPAUSE 및 UMONITOR 명령어들을 사용하는 실행의 예를 예시한다.
6801에서, 모니터링할 어드레스들의 범위를 설정하기 위해 TPAUSE 명령어가 실행된다.
6803에서, 모니터링되고 있는 어드레스들의 범위에 대해, 명령어를 실행하는 코어를, 명령어의 명시적 소스 레지스터 피연산자의 데이터에 의해 정의되는 구현 의존적 상태에 진입하게 하기 위해 UMONITOR 명령어가 실행된다.
6805에서, 모니터링되는 어드레스들에 대한 저장, NMI, SMI, 디버그 예외, 기계 검사 예외, 초기화 신호, 또는 리셋 신호 중 하나의 경우에 구현 의존적 상태에서 퇴장된다.
6807에서, 스레드와 연관된 트랜잭션은 구현 의존적 상태에서 퇴장될 시에 중단된다.
일부 구현들에서, 가속기는, 프로세서 코어들 또는 다른 처리 요소들에 결합되어, 몇몇 예를 들자면, 그래픽 연산들, 기계 학습 연산들, 패턴 분석 연산들, 및 (아래에서 상세히 설명되는 바와 같은) 희소 행렬 곱셈 연산들과 같은 특정 유형들의 연산들을 가속시킨다. 가속기는 버스 또는 다른 상호연결부(예컨대, 점대점 상호연결부)를 통해 프로세서/코어들에 통신가능하게 결합될 수 있거나, 프로세서와 동일한 칩 상에 통합되고 내부 프로세서 버스/상호연결부를 통해 코어들에 통신가능하게 결합될 수 있다. 가속기가 연결되는 방식에 관계없이, 프로세서 코어들은, 특정 처리 태스크들을, 그러한 태스크들을 효율적으로 처리하기 위한 전용 회로/논리를 포함하는 가속기에 (예컨대, 명령어들 또는 uop들의 시퀀스들의 형태로) 할당할 수 있다.
도 69는, 가속기(6900)가 캐시 일관성 인터페이스(6930)를 통해 복수의 코어들(6910-6911)에 통신가능하게 결합되는 예시적인 구현을 예시한다. 코어들(6910-6911) 각각은, 가상-물리 어드레스 변환들을 저장하기 위한 변환 색인 버퍼(6912-6913), 및 데이터와 명령어들을 캐싱하기 위해 하나 이상의 캐시(6914-6915)(예컨대, L1 캐시, L2 캐시 등)를 포함한다. 메모리 관리 유닛(6920)은, 동적 무작위 액세스 메모리(DRAM)일 수 있는 시스템 메모리(6950)에 대한 코어들(6910-6911)에 의한 액세스를 관리한다. L3 캐시와 같은 공유 캐시(6926)는 프로세서 코어들(6910-6911) 간에 그리고 캐시 일관성 인터페이스(6930)를 통해 가속기(6900)와 공유될 수 있다. 일 구현에서, 코어들(6910-1011), MMU(6920) 및 캐시 일관성 인터페이스(6930)는 단일 프로세서 칩 상에 통합된다.
예시된 가속기(6900)는, 캐시(6907) 및 복수의 처리 요소들(6901-6902, N)에 대한 연산들을 스케줄링하기 위한 스케줄러(6906)를 갖는 데이터 관리 유닛(6905)을 포함한다. 예시된 구현에서, 각각의 처리 요소는 자신 고유의 로컬 메모리(6903-6904, N)를 갖는다. 아래에서 상세히 설명되는 바와 같이, 각각의 로컬 메모리(6903-6904, N)는 스택형 DRAM으로서 구현될 수 있다.
일 구현에서, 캐시 일관성 인터페이스(6930)는 코어들(6910-6911)과 가속기(6900) 사이에 캐시 일관성 연결을 제공하여, 사실상 가속기를 코어들(6910-6911)의 피어로서 취급한다. 예컨대, 캐시 일관성 인터페이스(6930)는, 가속기(6900)에 의해 액세스/수정되고 가속기 캐시(6907) 및/또는 로컬 메모리들(6903-6904, N)에 저장된 데이터가 코어 캐시들(6910-6911), 공유 캐시(6926) 및 시스템 메모리(6950)에 저장된 데이터와 일관성이 있도록 보장하게 캐시 일관성 프로토콜을 구현할 수 있다. 예컨대, 캐시 일관성 인터페이스(6930)는 공유 캐시(6926) 및 로컬 캐시들(6914-6915) 내의 캐시 라인들의 상태를 검출하기 위해 코어들(6910-6911) 및 MMU(6920)에 의해 사용되는 스누핑 메커니즘들에 참여할 수 있고, 프록시로서 동작하여, 처리 요소들(6901-6902, N)에 의해 캐시 라인들에 대한 액세스들 및 시도된 수정들에 대한 응답으로 스누프 업데이트들을 제공할 수 있다. 게다가, 캐시 라인이 처리 요소들(6901-6902, N)에 의해 수정될 때, 캐시 일관성 인터페이스(6930)는 캐시 라인들이 공유 캐시(6926) 또는 로컬 캐시들(6914-6915) 내에 저장되어 있는 경우 그 캐시 라인들의 상태를 업데이트할 수 있다.
일 구현에서, 데이터 관리 유닛(1005)은 시스템 메모리(6950) 및 공유 캐시(6926)에 대한 가속기(6900) 액세스를 제공하는 메모리 관리 회로를 포함한다. 게다가, 데이터 관리 유닛(6905)은 캐시 일관성 인터페이스(6930)에 업데이트들을 제공하고, 필요한 경우(예컨대, 캐시 라인들에 대한 상태 변경들을 결정하기 위해) 캐시 일관성 인터페이스(6930)로부터 업데이트들을 수신할 수 있다. 예시된 구현에서, 데이터 관리 유닛(6905)은 처리 요소들(6901-6902)에 의해 실행될 명령어들/연산들을 스케줄링하기 위한 스케줄러(6906)를 포함한다. 그 스케줄링 연산들을 수행하기 위해, 스케줄러(6906)는, 명령어들/연산들이 일관성 있는 순서로 실행되는 것을 보장하기 위해(예컨대, 제1 명령어가 제1 명령어로부터의 결과들에 의존하는 제2 명령어 전에 실행되는 것을 보장하기 위해) 명령어들/연산들 사이의 의존성들을 평가할 수 있다. 상호의존적이지 않은 명령어들/연산들은 처리 요소들(6901-6902) 상에서 병렬로 실행될 수 있다.
도 70은 가속기(6900), 및 데이터 관리 유닛(6905), 복수의 처리 요소들(6901-N) 및 고속 온-칩 저장소(7000)(예컨대, 일 구현에서는, 스택형 로컬 DRAM을 사용하여 구현됨)를 포함하는 이전에 설명된 다른 구성요소들의 다른 도면을 예시한다. 일 구현에서, 가속기(6900)는 하드웨어 가속기 아키텍처이고, 처리 요소들(6901-N)은 희소/밀집 행렬들에 대한 연산들을 포함하는 행렬*벡터 및 벡터*벡터 연산들을 수행하기 위한 회로를 포함한다. 특히, 처리 요소들(6901-N)은 열 및 행 배향 행렬 처리를 위한 하드웨어 지원을 포함할 수 있고, 기계 학습(ML) 알고리즘들에서 사용되는 것과 같은 "규모조정 및 업데이트" 연산을 위한 마이크로아키텍처 지원을 포함할 수 있다.
설명된 구현들은, 빈번하게 사용되고, 무작위로 액세스되고, 잠재적으로 희소한 (예컨대, 수집/분산) 벡터 데이터를 고속 온-칩 저장소(7000)에 유지하고, 가능할 때마다 스트리밍 방식으로 액세스되는 크고 드물게 사용되는 행렬 데이터를 오프-칩 메모리(예컨대, 시스템 메모리(6950))에 유지하고, 규모 확대를 위해 행렬 내/행렬 간 블록 병렬성을 노출시킴으로써 최적화되는 행렬/벡터 연산들을 수행한다.
처리 요소들(6901-N)의 구현들은 희소 행렬들, 밀집 행렬들, 희소 벡터들, 및 밀집 벡터들의 상이한 결합들을 처리한다. 본원에서 사용되는 바와 같이, "희소" 행렬 또는 벡터는 요소들 대부분이 0인 행렬 또는 벡터이다. 대조적으로, "밀집" 행렬 또는 벡터는 요소들 대부분이 0이 아닌 행렬 또는 벡터이다. 행렬/벡터의 "희소도"는 0 값 요소들의 수를 요소들의 총 수(예컨대, m × n 행렬의 경우 m × n)로 나눈 것에 기반하여 정의될 수 있다. 일 구현에서, 행렬/벡터는, 자신의 희소도가 특정 임계치를 초과하는 경우 "희소"한 것으로 간주된다.
처리 요소들(6901-N)에 의해 수행되는 예시적인 연산 세트가 도 71의 표에 예시된다. 특히, 연산 유형들은, 희소 행렬을 사용하는 제1 곱셈(7100), 밀집 행렬을 사용하는 제2 곱셈(7101), 규모조정 및 업데이트 연산(7102) 및 내적(dot product) 연산(7103)을 포함한다. 열들은 제1 입력 피연산자(7110) 및 제2 입력 피연산자(7111)(이들 각각은 희소 또는 밀집 행렬/벡터를 포함할 수 있음); 출력 포맷(7112) (예컨대, 밀집 벡터 또는 스칼라); 행렬 데이터 포맷(예컨대, 압축된 희소 행, 압축된 희소 열, 행 배향 등)(7113); 및 연산 식별자(7114)에 대해 제공된다.
일부 현재의 작업부하들에서 발견되는 실행시간-우세 컴퓨팅 패턴들은 행 배향 및 열 배향 방식으로의 벡터에 대한 행렬 곱셈의 변형들을 포함한다. 이들은 잘 알려진 행렬 포맷들: 압축된 희소 행(CSR) 및 압축된 희소 열(CSC)에 대해 작동한다. 도 72a는 벡터 y를 생성하기 위한, 벡터 x에 대한 희소 행렬 A 간의 곱셈의 예를 도시한다. 도 72b는 각각의 값이 (값, 행 색인) 쌍으로서 저장되는 행렬 A의 CSR 표현을 예시한다. 예컨대, 행0에 대한 (3,2)는 3의 값이 행 0에 대한 요소 위치 2에 저장된다는 것을 표시한다. 도 72c는 (값, 열 색인) 쌍을 사용하는 행렬 A의 CSC 표현을 예시한다.
도 73a, 도 73b 및 도 73c는 각각의 컴퓨팅 패턴의 의사 코드를 예시하며, 이는 아래에서 상세히 설명된다. 특히, 도 73a는 행 배향 희소 행렬 밀집 벡터 곱셈(spMdV_csr)을 예시하고; 도 73b는 열 배향 희소 행렬 희소 벡터 곱(spMspC_csc)을 예시하고; 도 73c는 규모조정 및 업데이트 연산(scale_update)을 예시한다.
A. 행 배향 희소 행렬 밀집 벡터 곱셈(spMdV_csr)
이는, 고성능 컴퓨팅과 같은 많은 애플리케이션 도메인들에서 중요한 잘 알려진 컴퓨팅 패턴이다. 여기서, 행렬 A의 각각의 행에 대해, 벡터 x에 대한 그 행의 내적이 수행되고, 그 결과가 행 색인이 가리키는 y 벡터 요소에 저장된다. 이러한 계산은 샘플들의 세트(즉, 행렬의 행들)에 걸쳐 분석을 수행하는 기계 학습(ML) 알고리즘에서 사용된다. 그것은 "미니-배치"와 같은 기법들에서 사용될 수 있다. 또한, ML 알고리즘들이 학습 알고리즘들의 확률적 변형들에서와 같이 밀집 벡터에 대한 희소 벡터의 내적만을 수행하는 경우(즉, spMdV_csr 루프의 반복)들이 존재한다.
이러한 계산에 대한 성능에 영향을 줄 수 있는 알려진 요인은 내적 계산에서 희소 x 벡터 요소들에 무작위로 액세스할 필요성이다. 종래의 서버 시스템의 경우, x 벡터가 클 때, 이는 메모리 또는 마지막 레벨 캐시에 대한 불규칙한 액세스들(수집)을 초래할 것이다.
이를 해결하기 위해, 처리 요소의 일 구현은, 행렬 A를 열 블록들로 그리고 x 벡터를 다수의 하위 세트들(각각이 A 행렬 열 블록에 대응함)로 분할한다. 블록 크기는 x 벡터 하위 세트가 칩에 맞춰질 수 있도록 선택될 수 있다. 그러므로, 그 벡터에 대한 무작위 액세스들은 온-칩으로 국한될 수 있다.
B. 열 배향 희소 행렬 희소 벡터 곱셈(spMspV_csc)
희소 행렬을 희소 벡터에 대해 곱하는 이러한 패턴은 spMdV_csr만큼 잘 알려져 있지 않다. 그러나, 이는 일부 ML 알고리즘들에서 중요하다. 이는, 알고리즘이 데이터 세트 내의 행렬 열들로서 표현되는 피쳐들의 세트(따라서, 열 배향 행렬 액세스들이 필요함)에 대해 동작할 때 사용된다.
이러한 컴퓨팅 패턴에서, 행렬 A의 각각의 열이 판독되고 벡터 x의 대응하는 0이 아닌 요소에 대해 곱해진다. 그 결과는, y 벡터에 유지되는 부분 내적들을 업데이트하는 데 사용된다. 0이 아닌 x 벡터 요소들과 연관된 모든 열들이 처리된 후에, y 벡터는 최종 내적을 포함할 것이다.
행렬 A에 대한 액세스들이 규칙적이지만(즉, A의 열들에서의 스트림임), 부분 내적들을 업데이트하기 위한 y 벡터에 대한 액세스들은 불규칙적이다. 액세스할 y 요소는 처리되고 있는 A 벡터 요소의 행 색인에 의존한다. 이를 해결하기 위해, 행렬 A는 행 블록들로 분할될 수 있다. 결과적으로, 벡터 y는 이러한 블록들에 대응하는 하위 세트들로 분할될 수 있다. 이러한 방식으로, 행렬 행 블록을 처리할 때, 벡터 y의 y 벡터 하위 세트에만 불규칙하게 액세스(수집/분산)할 필요가 있다. 블록 크기를 적절하게 선택함으로써, y 벡터 하위 세트는 온-칩으로 유지될 수 있다.
C. 규모조정 및 업데이트(scale_update)
이러한 패턴은 전형적으로, 행렬 내의 각각의 샘플에 규모조정 인자들을 적용하고 이들을 각각이 피쳐(즉, A 내의 열)에 대응하는 가중치들의 세트로 감소시키기 위해 ML 알고리즘들에 의해 사용된다. 여기서, x 벡터는 규모조정 인자들을 포함한다. (CSR 포맷의) 행렬 A의 각각의 행에 대해, 그 행에 대한 규모조정 인자들이 x 벡터로부터 판독되고, 그런 다음, 그 행에 있는 A의 각각의 요소에 적용된다. 그 결과는 y 벡터의 요소를 업데이트하는 데 사용된다. 모든 행들이 처리된 후, y 벡터는 감소된 가중치들을 포함한다.
이전 컴퓨팅 패턴과 유사하게, y 벡터에 대한 불규칙한 액세스들은 y가 클 때 성능에 영향을 줄 수 있다. 행렬 A를 열 블록들로 그리고 y 벡터를 이러한 블록들에 대응하는 다수의 하위 세트들로 분할하는 것은, 불규칙한 액세스들을 각각의 y 하위 세트 내로 국한시키는 것을 도울 수 있다.
일 구현은, 위에 논의된 컴퓨팅 패턴들을 효율적으로 수행할 수 있는 하드웨어 가속기를 포함한다. 가속기는 범용 프로세서들과 통합될 수 있는 하드웨어 IP 블록이다. 일 구현에서, 가속기(6900)는, 컴퓨팅 패턴들을 수행하기 위해, 프로세서들과 공유되는 상호연결부를 통해 메모리(6950)에 독립적으로 액세스한다. 이는 오프-칩 메모리에 상주하는 임의의 임의적으로 큰 행렬 데이터 세트들을 지원한다.
도 74는 데이터 관리 유닛(6905) 및 처리 요소들(6901-6902)의 일 구현에 대한 처리 흐름을 예시한다. 이러한 구현에서, 데이터 관리 유닛(6905)은 처리 요소 스케줄러(7401), 판독 버퍼(7402), 기입 버퍼(7403), 및 감소 유닛(7404)을 포함한다. 각각의 PE(6901-6902)는 입력 버퍼(7405-7406), 곱셈기(7407-7408), 가산기(7409-7410), 로컬 RAM (7421-7422), 합산 레지스터(7411-7412), 및 출력 버퍼(7413-7414)를 포함한다.
가속기는, 임의의 임의적으로 큰 행렬 데이터를 지원하기 위해, 위에 논의된 행렬 블록화 방식들(즉, 행 및 열 블록화)을 지원한다. 가속기는 행렬 데이터의 블록을 처리하도록 설계된다. 각각의 블록은 PE들(6901-6902)에 의해 병렬로 처리되는 서브 블록들로 더 분할된다.
동작 시, 데이터 관리 유닛(6905)은 메모리 서브시스템으로부터 자신의 판독 버퍼(7402)로 행렬 행들 또는 열들을 판독하고, 이는 그 후, 처리를 위해 PE들(6901-6902)에 걸쳐 PE 스케줄러(7401)에 의해 동적으로 분배된다. 데이터 관리 유닛은 또한 자신의 기입 버퍼(7403)로부터 메모리에 결과들을 기입한다.
각각의 PE(6901-6902)는 행렬 서브 블록을 처리하는 것을 담당한다. PE는 무작위로 액세스될 필요가 있는 벡터(즉, 위에 설명된 바와 같이, x 또는 y 벡터의 하위 세트)를 저장하는 온-칩 RAM(7421-7422)을 포함한다. PE는 또한, 곱셈기(7407-7408) 및 가산기(7409-7410)를 포함하는 부동 소수점 곱셈-누산(FMA) 유닛, 입력 데이터로부터 행렬 요소들을 추출하기 위한 입력 버퍼들(7405-7406) 내의 언패킹 논리, 및 누산된 FMA 결과들을 유지하기 위한 합산 레지스터(7411-7412)를 포함한다.
가속기의 일 구현은, (1) 가속기가 온-칩 PE RAM들(7421-7422)에 불규칙하게 액세스(수집/분산)되는 데이터를 배치하고, (2) 가속기가 PE들이 잘 활용되는 것을 보장하기 위해 하드웨어 PE 스케줄러(7401)를 활용하고, (3) 범용 프로세서들과 달리, 가속기가 희소 행렬 연산들에 필수적인 하드웨어 리소스들만으로 구성되기 때문에 극도의 효율들을 달성한다. 전체적으로, 가속기는 자신에게 제공되는 이용가능 메모리 대역폭을 성능으로 효율적으로 변환한다.
성능의 규모조정은 다수의 행렬 서브 블록들을 병렬로 처리하기 위해 가속기 블록에서 더 많은 PE들을 이용하고/거나 다수의 행렬 블록을 병렬로 처리하기 위해 더 많은 가속기 블록들(각각은 한 세트의 PE들을 가짐)을 이용함으로써 이루어질 수 있다. 이들 옵션들의 조합이 아래에서 고려된다. PE들 및/또는 가속기 블록들의 수는 메모리 대역폭과 매칭하도록 조정되어야 한다.
가속기(6900)의 일 구현은 소프트웨어 라이브러리를 통해 프로그래밍될 수 있다. 그러한 라이브러리는 메모리에 행렬 데이터를 준비하고, 계산에 관한 정보(예컨대, 계산 유형, 행렬 데이터에 대한 메모리 포인터)로 가속기(6900) 내의 제어 레지스터들을 설정하고, 가속기를 시작한다. 그런 다음, 가속기는 메모리 내의 행렬 데이터에 독립적으로 액세스하고, 계산을 수행하고, 그 결과들을 소프트웨어가 소비하도록 메모리에 다시 기입한다.
가속기는, 도 75a-b에 도시된 바와 같이, 자신의 PE들을 적절한 데이터 경로 구성으로 설정함으로써 상이한 컴퓨팅 패턴들을 처리한다. 특히, 도 75a는 spMspV_csc 및 scale_update 연산들에 대한 경로들을 (점선들을 사용하여) 강조하고, 도 75b는 spMdV_csr 연산에 대한 경로들을 예시한다. 각각의 컴퓨팅 패턴을 수행하기 위한 가속기 연산이 아래에서 상세히 설명된다.
spMspV_csc의 경우, 초기 y 벡터 하위 세트는 DMU(6905)에 의해 PE의 RAM(7421)에 로딩된다. 그런 다음, 메모리로부터 x 벡터 요소들이 판독된다. 각각의 x 요소에 대해, DMU(6905)는 대응하는 행렬 열의 요소들을 메모리로부터 스트리밍하고 그들을 PE(6901)에 공급한다. 각각의 행렬 요소는 PE의 RAM(7421)으로부터 판독할 y 요소를 가리키는 값(A.val) 및 색인(A.idx)을 포함한다. DMU(6905)는 또한, 곱셈-누산(FMA) 유닛에 의해 A.val에 대해 곱해지는 x 벡터 요소(x.val)를 제공한다. 그 결과는 A.idx에 의해 가리켜지는 PE의 RAM 내의 y 요소를 업데이트하는 데 사용된다. 작업부하들에 의해 사용되진 않더라도, 가속기는 또한 (x가 밀집이므로) 단지 하위 세트 대신 모든 행렬 열들을 처리함으로써 밀집 x 벡터(spMdV_csc)에 대한 열 방향 곱셈을 지원한다는 것을 유의한다.
scale_update 연산은, DMU(6905)가 CSC 포맷 대신 CSR 포맷으로 표현되는 A 행렬의 행들을 판독하는 것을 제외하고는 spMspV_csc와 유사하다. spMdV_csr의 경우, x 벡터 하위 세트는 PE의 RAM(7421)에 로딩된다. DMU(6905)는 메모리로부터의 행렬 행 요소들(즉, {A.Val,A.idx} 쌍들)에서 스트리밍한다. A.idx는 RAM(7421)으로부터 적절한 x 벡터 요소를 판독하는 데 사용되고, 이는 FMA에 의해 A.Val에 대해 곱해진다. 결과들은 합산 레지스터(7412)에 누산된다. 합산 레지스터는 PE가 행의 끝을 표시하는 마커를 볼 때마다 출력 버퍼에 기입되며, 이는 DMU(6905)에 의해 공급된다. 이러한 방식으로, 각각의 PE는 자신이 담당하는 행 서브 블록에 대한 합을 생성한다. 행에 대한 최종 합을 생성하기 위해, 모든 PE들에 의해 생성된 서브 블록 합들은 DMU 내의 감소 유닛(7404)(도 74 참조)에 의해 함께 가산된다. 최종 합들은 출력 버퍼(7413-7414)에 기입되고, 이는 그 후 DMU(6905)가 메모리에 기입한다.
그래프 데이터 처리
일 구현에서, 본원에서 설명된 가속기 아키텍처들은 그래프 데이터를 처리하도록 구성된다. 그래프 분석은 그래프들로서 표현된 데이터 간의 관계에 관한 정보를 추출하기 위해 그래프 알고리즘들에 의존한다. (소셜 미디어와 같은 소스들로부터의) 그래프 데이터의 확산은 그래프 분석에 대한 강한 요구 및 광범위한 사용으로 이어졌다. 그러므로, 그래프 분석을 가능한 한 효율적으로 할 수 있는 것이 대단히 중요하다.
이러한 필요성을 해결하기 위해, 일 구현은, 사용자에 의해 정의된 그래프 알고리즘을 주어진 입력 그래프 알고리즘에 맞춤화된 하드웨어 가속기 아키텍처 "템플릿"에 자동으로 맵핑한다. 가속기는 위에 설명된 아키텍처들을 포함할 수 있고, FPGA/ASIC으로서 구현될 수 있으며, 이는 극도의 효율로 실행될 수 있다. 요약하면, 일 구현은 다음을 포함한다:
(1) 일반화된 희소 행렬 벡터 곱셈(GSPMV) 가속기에 기반하는 하드웨어 가속기 아키텍처 템플릿. 이는, 그래프 알고리즘이 행렬 연산들로서 공식화될 수 있다는 것을 보여왔기 때문에 임의의 그래프 알고리즘을 지원한다.
(2) 아키텍처 템플릿에 대한 광범위하게 사용되는 "정점 중심" 그래프 프로그래밍 추상화를 맵핑하고 조정하기 위한 자동 접근법.
기존의 희소 행렬 곱셈 하드웨어 가속기들이 존재하지만, 그 가속기들은 그래프 알고리즘들의 맵핑을 허용하는 맞춤가능성을 지원하지 않는다.
설계 프레임워크의 일 구현은 다음과 같이 동작한다:
(1) 사용자는 정점 중심 그래프 프로그래밍 추상화에 후속하는 "정점 프로그램들"로서 그래프 알고리즘을 특정한다. 이러한 추상화는 그 대중성으로 인해 본원에서 예로서 선택된다. 정점 프로그램은 하드웨어 세부사항들을 노출시키지 않으므로, 하드웨어 전문지식이 없는 사용자들(예컨대, 데이터 과학자들)이 이를 생성할 수 있다.
(2) (1)의 그래프 알고리즘과 함께, 프레임워크의 일 구현은 다음의 입력들을 수용한다:
a. 생성될 대상 하드웨어 가속기의 파라미터들(예컨대, 온-칩 RAM들의 최대량). 이러한 파라미터들은 사용자에 의해 제공될 수 있거나, 기존의 시스템(예컨대, 특정 FPGA 보드)을 대상으로 할 때의 기존의 알려진 파라미터들의 라이브러리로부터 획득될 수 있다.
b. 설계 최적화된 객체들(예컨대, 최대 성능, 최소 영역)
c. 대상 그래프 데이터의 특성들(예컨대, 그래프의 유형) 또는 그래프 데이터 자체. 이것은 임의적이며, 자동 조정을 돕는 데 사용된다.
(3) 위의 입력들을 고려하여, 프레임워크의 일 구현은, 자동 조정을 사용하여, 입력 그래프 알고리즘을 최적화하기 위해 하드웨어 템플릿에 적용할 한 세트의 맞춤화들을 결정하고, 이러한 파라미터들을 아키텍처 템플릿 상에 맵핑하여 합성가능 RTL로 가속기 인스턴스를 생성하고, 입력 그래프 알고리즘 규격으로부터 도출된 기능 및 성능 소프트웨어 모델들에 대해, 생성된 RTL의 기능 및 성능 검증을 수행한다.
일 구현에서, 위에 설명된 가속기 아키텍처는 (1) 맞춤화가능 하드웨어 템플릿을 만드는 것 및 (2) 정점 프로그램에 의해 필요한 기능성들을 지원하는 것에 의해, 정점 프로그램들의 실행을 지원하도록 확장된다. 이러한 템플릿에 기반하여, 사용자에 의해 공급되는 정점 프로그램을 하드웨어 템플릿에 맵핑하여 정점 프로그램에 대해 최적화된 합성가능 RTL(예컨대 베릴로그(Verilog)) 구현 인스턴스를 생성하기 위한 설계 프레임워크가 설명된다. 프레임워크는 또한, 생성된 RTL이 정확하고 최적화됨을 보장하기 위해 자동 검증 및 조정을 수행한다. 이러한 프레임워크에 대한 다수의 사용 경우들이 존재한다. 예컨대, 생성된 합성가능 RTL은 주어진 정점 프로그램을 효율적으로 실행하기 위해 FPGA 플랫폼(예컨대, Xeon-FPGA)에 배치될 수 있다. 또는, 생성된 합성가능 RTL은 ASIC 구현을 생성하기 위해 추가로 개량될 수 있다.
그래프들은 인접 행렬들로서 표현될 수 있고, 그래프 처리는 희소 행렬 연산들로서 공식화될 수 있다. 도 76a-b는 인접 행렬로서 그래프를 표현하는 예를 도시한다. 행렬에서 각각의 0이 아닌 값들은 그래프에서 2개의 노드 사이의 에지를 표현한다. 예컨대, 행 0 열 2에서의 1은 노드 A로부터 C로의 에지를 표현한다.
그래프 데이터에 대한 계산들을 설명하기 위한 가장 대중적인 모델들 중 하나는 정점 프로그래밍 모델이다. 일 구현은, 정점 프로그램들을 일반화된 희소 행렬 벡터 곱셈(GSPMV)으로서 공식화하는, Graphmat 소프트웨어 프레임워크로부터의 정점 프로그래밍 모델 변형을 지원한다. 도 76c에 도시된 바와 같이, 정점 프로그램은, 그래프 내의 에지들/정점들(edata/vdata), 그래프 내의 정점들에 걸쳐 전송된 메시지들(mdata), 및 임시 데이터(tdata)(프로그램 코드의 최상부 부분에 예시됨)와 연관된 데이터 유형들; 및 (프로그램 코드의 최하부 부분에 예시된 바와 같은) 그래프 데이터를 판독 및 업데이트하는 미리 정의된 API들을 사용하는, 상태 비저장의, 사용자에 의해 정의된 컴퓨팅 기능들로 이루어진다.
도 76d는 정점 프로그램을 실행하기 위한 예시적인 프로그램 코드를 예시한다. 에지 데이터는 (도 76b에서와 같이) 인접 행렬 A로서 표현되고, 정점 데이터는 벡터 y로서, 그리고 메시지들은 희소 벡터 x로서 표현된다. 도 76e는 GSPMV 공식화를 도시하며, 여기서 SPMV에서의 multiply() 및 add() 연산들은 사용자에 의해 정의된 PROCESS_MSG() 및 REDUCE()에 의해 일반화된다.
여기서의 하나의 관측은, 정점 프로그램을 실행하는 데 필요한 GSPMV 변형이, 희소 벡터 x(즉, 메시지들)에 대한 희소 행렬 A(즉, 인접 행렬)의 열 배향 곱셈을 수행하여 출력 벡터 y(즉, 정점 데이터)를 생성한다는 것이다. 이러한 연산은 (위의 가속기와 관련하여 이전에 설명된) col_spMspV로 지칭된다.
설계 프레임워크. 템플릿 맵핑 구성요소(7711), 검증 구성요소(7712) 및 자동 조정 구성요소(7713)를 포함하는 프레임워크의 일 구현이 도 77에 도시된다. 프레임워크의 입력들은 사용자에 의해 특정된 정점 프로그램(7701), 설계 최적화 목표들(7703)(예컨대, 최대 성능, 최소 영역), 및 대상 하드웨어 설계 제약들(7702)(예컨대, 온-칩 RAM들의 최대량, 메모리 인터페이스 폭)이다. 자동 조정을 돕기 위한 임의적 입력으로서, 프레임워크는 또한 그래프 데이터 특성들(7704)(예컨대, 유형 = 자연적 그래프) 또는 샘플 그래프 데이터를 수용한다.
이러한 입력들을 고려하여, 프레임워크의 템플릿 맵핑 구성요소(7711)는 입력 정점 프로그램을 하드웨어 가속기 아키텍처 템플릿에 맵핑하고, 정점 프로그램(7701)을 실행하는 데 최적화된 가속기 인스턴스의 RTL 구현(7705)을 생성한다. 자동 조정 구성요소(7713)는 하드웨어 설계 제약들을 충족시키면서, 생성된 RTL을 주어진 설계 목표들에 대해 최적화하기 위해 자동 조정(7713)을 수행한다. 또한, 검증 구성요소(7712)는 입력들로부터 도출된 기능 및 성능 모델들에 대해 생성된 RTL을 자동으로 검증한다. 검증 테스트 벤치들(7706) 및 조정 보고들(7707)이 RTL과 함께 생성된다.
일반화된 희소 행렬 벡터 곱셈(GSPMV) 하드웨어 아키텍처 템플릿
GSPMV에 대한 아키텍처 템플릿의 일 구현이 도 77에 도시되어 있으며, 이는 위에서 설명된 가속기 아키텍처에 기반한다(예컨대, 도 74 및 연관된 본문 참조). 도 77에 예시된 구성요소들 중 다수는 맞춤화가능하다. 일 구현에서, 정점 프로그램들의 실행을 지원하기 위한 아키텍처는 다음과 같이 확장되었다.
도 78에 예시된 바와 같이, 맞춤화가능한 논리 블록들은 정점 프로그램에 의해 필요한 PROCESS_MSG()(1910), REDUCE()(7811), APPLY(7812), 및 SEND_MSG()(7813)를 지원하기 위해 각각의 PE 내부에 제공된다. 게다가, 일 구현은, 사용자에 의해 정의된 그래프 데이터(즉, vdata, edata, mdata, tdata)를 지원하기 위해 맞춤화가능 온-칩 저장 구조들 및 패킹/언패킹 논리(7805)를 제공한다. 예시된 데이터 관리 유닛(6905)은 (위에 설명된 바와 같이 PE들을 스케줄링하기 위한) PE 스케줄러(7401), (활성 열, x 데이터를 저장하기 위한) aux 버퍼들(7801), 판독 버퍼(7402), 시스템 메모리에 대한 액세스를 제어하기 위한 메모리 제어기(7803), 및 기입 버퍼(7403)를 포함한다. 게다가, 도 78에 도시된 구현에서, 오래된 및 새로운 vdata 및 tdata가 로컬 PE 메모리(7421) 내에 저장된다. 다양한 제어 상태 기계들은, 도 76d 및 도 76e의 알고리즘들에 의해 특정된 기능성들을 유지하면서 정점 프로그램들을 실행하는 것을 지원하도록 수정될 수 있다.
각각의 가속기 타일의 연산이 도 79에 요약된다. 7901에서, y 벡터(vdata)가 PE RAM(7421)에 로딩된다. 7902에서, x 벡터 및 열 포인터들이 aux 버퍼(7801)에 로딩된다. 7903에서, 각각의 x 벡터 요소에 대해, A 열은 (edata)로 스트리밍되고, PE들은 PROC_MSG()(7810) 및 REDUCE()(7811)를 실행한다. 7904에서, PE들은 APPLY()(7812)를 실행한다. 7905에서, PE들은 SEND_MSG()(7813)를 실행하여 메시지들을 생성하고, 데이터 관리 유닛(6905)은 이들을 x 벡터들로서 메모리에 기입한다. 7906에서, 데이터 관리 유닛(6905)은 PE RAM들(7421)에 저장된 업데이트된 y 벡터들(vdata)을 다시 메모리에 기입한다. 위의 기법들은 도 76d 및 도 76e에 도시된 정점 프로그램 실행 알고리즘을 따른다. 성능을 규모 확대하기 위해, 아키텍처는 타일 내의 PE들의 수 및/또는 설계에서의 타일들의 수를 증가시키는 것을 허용한다. 이러한 방식으로, 아키텍처는 (즉, (인접 행렬의 블록들에 걸친) 서브그래프들에 걸쳐 또는 각각의 서브그래프 내의) 그래프 내의 다수의 레벨들의 병렬성들을 이용할 수 있다. 도 80a의 표는 템플릿의 일 구현의 맞춤화가능한 파라미터들을 요약한다. 최적화를 위해, 타일들에 걸쳐 비대칭 파라미터들을 배정하는 것이 또한 가능하다(예컨대, 하나의 타일에 다른 타일보다 더 많은 PE들이 있음).
자동 맵핑, 검증, 및 조정
조정. 입력들에 기반하여, 프레임워크의 일 구현은, 입력 정점 프로그램 및 (임의적으로는) 그래프 데이터에 대해 하드웨어 아키텍처 템플릿을 최적화하기 위해 하드웨어 아키텍처 템플릿을 맞춤화하는 데 사용할 최상의 설계 파라미터들을 결정하기 위해 자동 조정을 수행한다. 도 80b의 표에 요약되어 있는 많은 조정 고려사항들이 존재한다. 예시된 바와 같이, 이러한 조정 고려사항들은 데이터의 구역성, 그래프 데이터 크기들, 그래프 컴퓨팅 기능들, 그래프 데이터 구조, 그래프 데이터 액세스 속성들, 그래프 데이터 유형들, 및 그래프 데이터 패턴들을 포함한다.
템플릿 맵핑. 이러한 페이즈에서, 프레임워크는 조정 페이즈에 의해 결정된 템플릿 파라미터들을 취하고, 템플릿의 맞춤화가능한 부분들에 "채움"으로써 가속기 인스턴스를 생성한다. 사용자에 의해 정의된 컴퓨팅 기능들(예컨대, 도 76c)은 기존의 고레벨 합성(HLS; High-Level Synthesis) 툴들을 사용하여 입력 규격으로부터 적절한 PE 컴퓨팅 블록들로 맵핑될 수 있다. 저장 구조들(예컨대, RAM들, 버퍼들, 캐시) 및 메모리 인터페이스들은 그들의 대응하는 설계 파라미터들을 사용하여 인스턴스화된다. 패킹/언패킹 논리는 데이터 유형 규격들로부터 자동으로 생성될 수 있다(예컨대, 도 76a). 제어 유한 상태 기계(FSM)들의 부분들이 또한 제공된 설계 파라미터들(예컨대, PE 스케줄링 방식들)에 기반하여 생성된다.
검증. 일 구현에서, 템플릿 맵핑에 의해 생성된 가속기 아키텍처 인스턴스(합성가능 RTL)는 그 후 자동으로 검증된다. 이를 행하기 위해, 프레임워크의 일 구현은 "골든" 레퍼런스("golden" reference)로서 사용될 정점 프로그램의 기능 모델을 도출한다. 테스트 벤치들은 아키텍처 인스턴스의 RTL 구현의 모의실험들에 대하여 이러한 골든 레퍼런스의 실행을 비교하도록 생성된다. 프레임워크는 또한, 분석적 성능 모델 및 사이클-정밀 소프트웨어 시뮬레이터에 대해 RTL 모의실험들을 비교함으로써 성능 검증을 수행한다. 그것은 실행시간 실패를 보고하고, 성능에 영향을 주는 설계의 병목현상들을 정확히 찾아낸다.
희소 데이터 세트들 ― 값들 대부분이 0인 벡터들 또는 행렬들 ― 에 대한 계산들은 상업적으로 중요한 애플리케이션들의 수를 증가시키는 데 중요하지만, 전형적으로, 오늘날의 CPU들 상에서 실행될 때 최고 성능의 수 퍼센트만을 달성한다. 과학적 컴퓨팅 분야에서, 희소 행렬 계산들은 수십 년 동안 선형 솔버(solver)들의 키 커널들이었다. 더 최근에는, 기계 학습 및 그래프 분석의 폭발적 성장이 희소 계산들을 주류로 이동시켰다. 희소 행렬 계산들은 많은 기계 학습 애플리케이션들에 대해 가장 중요하고, 많은 그래프 알고리즘들의 핵심을 이룬다.
희소 행렬 계산들은 컴퓨팅이 제한되는 것이 아니라 메모리 대역폭이 제한되는 경향이 있어서, CPU 변경들이 그들의 성능을 개선하는 것을 어렵게 만든다. 이들은 행렬 데이터 요소당 연산들을 거의 실행하지 않으며, 종종, 임의의 데이터를 재사용하기 전에 전체 행렬에 걸쳐 반복하여, 캐시들을 비효과적으로 만든다. 게다가, 많은 희소 행렬 알고리즘들은 희소 행렬-벡터 곱셈에서 발견되는 result[row] += matrix[row][i].value * vector[matrix[row][i].index] 연산과 같은 상당한 수의 데이터 의존적 수집들 및 분산들을 포함하며, 이들은 프로페처들의 유효성을 예측하고 감소시키기가 어렵다.
종래의 마이크로프로세서들보다 더 나은 희소 행렬 성능을 제공하기 위해, 시스템은 현재의 CPU들보다 상당히 더 높은 메모리 대역폭 및 매우 에너지 효율적인 컴퓨팅 아키텍처를 제공해야 한다. 메모리 대역폭을 증가시키는 것은 성능을 개선하는 것을 가능하게 하지만, DRAM 액세스들의 높은 에너지/비트 비용은 그 대역폭을 처리하는 데 이용가능한 전력의 양을 제한한다. 에너지 효율적인 컴퓨팅 아키텍처 없이는, 시스템은, 자신의 전력 예산을 초과하지 않고는 고 대역폭 메모리 시스템으로부터의 데이터를 처리할 수 없는 위치에 처할 수 있다.
일 구현은, 에너지 효율적인 방식으로 희소 행렬 알고리즘들이 요구하는 대역폭을 처리하는 맞춤식 컴퓨팅 아키텍처와 결합된, 그 대역폭을 제공하는 스택형 DRAM을 사용하는 희소 행렬 계산들을 위한 가속기를 포함한다.
희소 행렬 개요
많은 애플리케이션들은 대부분의 값들이 0인 데이터 세트들을 생성한다. 유한 요소 방법들은 객체들을 포인트들의 메쉬로서 모델링하며, 여기서, 각각의 포인트의 상태는 메쉬 내의 그 포인트 근처의 포인트들의 상태의 함수이다. 수학적으로, 이는 행렬로서 표현되는 방정식들의 시스템이 되며, 여기서, 각각의 행은 하나의 포인트의 상태를 설명하고, 행 내의 값들은 행이 설명하는 포인트의 상태에 직접 영향을 주지 않는 모든 포인트들에 대해 0이다. 그래프들은 인접 행렬로서 표현될 수 있으며, 여기서, 행렬 내의 각각의 요소 {i,j}는 그래프에서의 정점들 i와 j 사이의 에지의 가중치를 제공한다. 대부분의 정점들은 그래프 내의 다른 정점들 중 작은 부분에만 연결되므로, 인접 행렬 내의 대다수의 요소들은 0이다. 기계 학습에서, 모델들은 전형적으로 많은 샘플들로 이루어진 데이터 세트들을 사용하여 훈련되며, 이들 각각은 피처들(시스템 또는 객체의 상태의 관측들)의 세트 및 그 피처들의 세트에 대한 모델의 원하는 출력을 포함한다. 샘플들 대부분은 가능한 피쳐들의 작은 하위 세트만을 포함하는 것이 매우 일반적인데, 예컨대, 피쳐들이 문서에 존재할 수 있는 상이한 워드들을 표현할 때, 값들 대부분이 0인 데이터 세트를 다시 생성하는 것이 매우 일반적이다.
값들 대부분이 0인 데이터 세트들은 "희소"한 것으로 설명되고, 희소 데이터 세트들은 극도로 희소하여 자신의 요소들의 1 % 미만의 0이 아닌 값들을 갖는 것이 매우 일반적이다. 이러한 데이터 세트들은, 행렬 내의 0이 아닌 요소들의 값들만을 특정하는 데이터 구조들을 사용하여 종종 행렬들로서 표현된다. 이는 각각의 0이 아닌 요소를 표현하는 데 필요한 공간의 양을 증가시키지만, 요소의 위치 및 그 값 둘 모두를 특정할 필요가 있으므로, 행렬이 충분히 희소한 경우에는 전체 공간(메모리) 절감이 상당할 수 있다. 예컨대, 희소 행렬의 가장 간단한 표현들 중 하나는 좌표 목록(COO) 표현이고, 여기서, 각각의 0이 아닌 값은 {행 색인, 열 색인, 값} 투플에 의해 특정된다. 이는 각각의 0이 아닌 값에 대해 요구되는 저장소의 양을 3배로 늘리지만, 행렬 내의 요소들 중 1 %만이 0이 아닌 값들을 갖는 경우, COO 표현은 밀집 표현이 취할 공간(행렬 내의 각각의 요소의 값을 표현하는 공간)의 3 %만을 차지할 것이다.
도 81은 가장 일반적인 희소 행렬 포맷들 중 하나인, 압축된 행 저장소(CRS, 때때로 CSR로 축약됨) 포맷을 예시한다. CRS 포맷에서, 행렬(8100)은 3개의 어레이: 0이 아닌 요소들의 값들을 포함하는 값 어레이(8101), 행렬의 그 포맷의 행 내의 각각의 0이 아닌 요소의 위치를 특정하는 색인들의 어레이(8102), 및 색인들 및 값들의 목록들에서 행렬의 각각의 행이 시작하는 곳을 특정하는 행 시작 어레이(8103)에 의해 설명된다. 따라서, 예시적인 행렬의 제2 행의 제1의 0이 아닌 요소는 색인들 및 값들의 어레이들 내의 위치 2에서 발견될 수 있고, 그 요소가 행 내의 위치 0에서 발생하고 값 7을 가짐을 표시하는 투플 {0, 7}에 의해 설명된다. 다른 일반적으로 사용되는 희소 행렬 포맷들은, CRS에 대한 열 주요 이중화인 압축된 희소 열(CSC), 및 행이 행렬의 가장 긴 행보다 더 적은 0이 아닌 요소들을 가질 때 명시적 0들로 메워지는, 0이 아닌 값들 및 그들의 색인들의 고정 폭 목록으로서 행렬의 각각의 행을 표현하는 ELLPACK을 포함한다.
희소 행렬들에 대한 계산들은 그들의 밀집 행렬 대응물들과 동일한 구조를 갖지만, 희소 데이터의 특성은 그들의 밀집 행렬 대응물들보다 그들을 훨씬 더 대역폭-집약적이게 만드는 경향이 있다. 예컨대, 행렬-행렬 곱셈의 희소 및 밀집 변형들 둘 모두는 모든 i, j에 대해 Ci,j = Ai,·B,j를 컴퓨팅함으로써 C = A·B를 찾는다. 밀집 행렬-행렬 계산에서, 이는 상당한 데이터 재사용을 초래하는데, 그 이유는, B의 각각의 요소가 그러하듯이 A의 각각의 요소가 (N × N 행렬들을 가정하면) N개의 곱셈-가산 연산에 참여하기 때문이다. 행렬-행렬 곱셈이 캐시 구역성을 위해 차단되는 한, 이러한 재사용은, 계산이 낮은 바이트/연산 비를 갖게 되고 컴퓨팅이 제한되는 것을 야기한다. 그러나, 희소 변형에서, A의 각각의 요소는 B의 대응하는 행에 0이 아닌 값들이 존재하는 만큼 많은 곱셈-가산 연산들에만 참여하는 반면, B의 각각의 요소는 A의 대응하는 열에 0이 아닌 요소들이 존재하는 만큼 많은 곱셈-가산들에만 참여한다. 밀집 행렬-행렬 곱셈이 표준적인 컴퓨팅-제한적 계산들 중 하나라는 사실에도 불구하고, 행렬들의 희소도가 증가함에 따라 바이트/연산 비 또한 증가하여, 많은 희소 행렬-행렬 계산들의 성능이 메모리 대역폭에 의해 제한되게 만든다.
다음의 4개의 연산은 오늘날의 애플리케이션들에서 보이는 희소 행렬 계산들의 대부분을 구성한다: 희소 행렬-밀집 벡터 곱셈(SpMV), 희소 행렬-희소 벡터 곱셈, 희소 행렬-희소 행렬 곱셈, 및 완화/평활화(relaxation/smoother) 연산들, 이를테면, 고성능 복소 구배 기준점(Conjugate Gradient benchmark)의 구현들에서 더 매끄럽게 사용되는 가우스-자이델 평활화. 이러한 연산들은 희소 행렬 가속기를 실용적으로 만드는 2개의 특성을 공유한다. 첫째, 이러한 연산들에서는 벡터 내적들이 우세하며, 이는, 4개의 중요한 계산 모두를 구현할 수 있는 간단한 하드웨어를 구현하는 것을 가능하게 한다. 예컨대, 행렬-벡터 곱셈은 행렬 내의 각각의 행과 벡터의 내적을 취하는 것에 의해 수행되는 반면, 행렬-행렬 곱셈은 하나의 행렬의 각각의 행과 다른 행렬의 각각의 열의 내적을 취한다. 둘째, 애플리케이션들은 일반적으로, 지원 벡터 기계 알고리즘이 모델을 훈련하면서 수행하는 상이한 벡터들에 의한 동일한 행렬의 수천 개의 곱셈들과 같이, 동일한 행렬에 대해 다수의 계산들을 수행한다. 동일한 행렬의 이러한 반복된 사용은, 프로그램 실행 동안 가속기로/로부터 행렬들을 전송하고/거나 하드웨어의 태스크를 단순화하는 방식으로 행렬을 재-포맷하는 것을 실용적이게 하는데, 그 이유는, 데이터 전송들/변환들의 비용이 각각의 행렬에 대한 많은 연산들에 걸쳐 분할상환될 수 있기 때문이다.
희소 행렬 계산들은 전형적으로 그들이 실행되는 시스템의 최고 성능의 수 퍼센트만을 달성한다. 이것이 발생하는 이유를 시연하기 위해, 도 82는 CRS 데이터 포맷을 사용하는 희소 행렬-밀집 벡터 곱셈의 구현에 수반되는 단계들(8201-8204)을 도시한다. 첫째, 8201에서, 행렬의 행을 표현하는 데이터 구조가 메모리로부터 판독되고, 이는 일반적으로, 예측하고 프리페치하기 쉬운 한 세트의 순차적 판독들을 수반한다. 둘째, 8202에서, 행렬 행 내의 0이 아닌 요소들의 색인들은 벡터의 대응하는 요소들을 수집하는 데 사용되며, 이는, 다수의 데이터 의존적이고 예측이 어려운 메모리 액세스들(수집 연산)을 요구한다. 더욱이, 이러한 메모리 액세스들은 종종, 각각의 참조된 캐시 라인 내의 하나 또는 2개의 워드에만 관여하며, 그 결과, 벡터가 캐시에 맞지 않을 때에는 대역폭이 상당히 낭비되게 된다.
셋째, 8203에서, 프로세서는 행렬 행의 0이 아닌 요소들과 벡터의 대응하는 요소들의 내적을 컴퓨팅한다. 마지막으로, 8204에서, 내적의 결과가 결과 벡터에 기입되고, 이는 또한 순차적으로 액세스되며, 프로그램은 행렬의 다음 행으로 진행한다. 이는 계산의 개념적/알고리즘적 관점이고, 프로그램이 실행하는 연산들의 정확한 시퀀스는 프로세서의 ISA 및 벡터 폭에 의존할 것임을 유의한다.
이러한 예는 희소 행렬 계산들의 다수의 중요한 특성들을 예시한다. 32 비트 데이터 유형들을 가정하고, 행렬 또는 벡터 중 어느 것도 캐시에 맞지 않다고 가정하면, 출력 행의 제1 요소를 컴퓨팅하는 것은, 7.2:1의 바이트/연산 비의 경우, DRAM으로부터 36 바이트를 판독하는 것을 요구하지만, 5개의 컴퓨팅 명령어(3개의 곱셈들 및 2개의 가산들)만을 요구한다.
그러나, 메모리 대역폭은 고성능 희소 행렬 계산들에 대한 유일한 난제가 아니다. 도 82가 도시하는 바와 같이, SpMV 내의 벡터에 대한 액세스들은 데이터 의존적이고 예측하기가 어려워서, 벡터 액세스들의 레이턴시가 애플리케이션에 노출된다. 벡터가 캐시에 맞지 않는 경우, 많은 스레드들이 데이터를 대기하며 중단된 채 있는 때라 하더라도 프로세서가 DRAM 대역폭을 포화시키기에 충분한 병렬성을 제공하지 않는 한, SpMV 성능은 DRAM 레이턴시뿐만 아니라 대역폭에 민감하게 된다.
따라서, 희소 행렬 계산들을 위한 아키텍처는 효과적일 몇 가지 것들을 제공해야 한다. 그 아키텍처는, 희소 계산들의 바이트/연산 요구들을 충족시키기 위해 높은 메모리 대역폭을 전달해야 한다. 그 아키텍처는 또한, 캐시에 맞지 않을 수 있는 큰 벡터들로부터 고 대역폭 수집들을 지원해야 한다. 마지막으로, DRAM 대역폭에 맞춰 충분한 산술 연산/초를 수행하는 것은 그 자체로는 난제가 아니지만, 아키텍처는, 시스템 전력 예산들 내로 유지하기 위해서는 그 연산들 및 그들이 요구하는 메모리 액세스들 모두를 에너지 효율적인 방식으로 수행해야 한다.
일 구현은 높은 희소 행렬 성능에 필요한 3개의 특징인 높은 메모리 대역폭, 큰 벡터들로부터의 고 대역폭 수집들, 및 에너지 효율적인 계산을 제공하도록 설계된 가속기를 포함한다. 도 83에 예시된 바와 같이, 가속기의 일 구현은, 가속기 논리 다이(8305) 및 DRAM 다이의 하나 이상의 스택(8301-8304)을 포함한다. 아래에서 더 상세히 설명되는 스택형 DRAM은 낮은 에너지/비트에서 높은 메모리 대역폭을 제공한다. 예컨대, 스택형 DRAM들은 2.5 pJ/비트에서 256 - 512 GB/초를 전달할 것으로 예상되는 반면, LPDDR4 DIMM들은 68 GB/초만을 전달할 것으로 예상되고 12 pJ/비트의 에너지 비용을 가질 것이다.
가속기 스택의 최하부에 있는 가속기 논리 칩(8305)은 희소 행렬 계산들의 요구들에 맞춤화되고, 2-4 와트의 전력만을 소비하면서 DRAM 스택(8301-8304)에 의해 제공되는 대역폭을 소비할 수 있으며, 에너지 소비는 스택의 대역폭에 비례한다. 보존적이기 위해, 이러한 애플리케이션의 나머지에 대해서는 273 GB/초의 스택 대역폭(WIO3 스택들의 예상 대역폭)이 가정된다. 더 높은 대역폭의 스택들에 기반한 설계들은 메모리 대역폭을 소비하기 위해 더 많은 병렬성을 포함할 것이다.
도 84는 DRAM 다이(8301-8304)의 스택을 통해 상부 관점으로부터 배향된 가속기 논리 칩(8305)의 일 구현을 예시한다. 도면의 중심을 향하는 스택 DRAM 채널 블록들(8405)은 논리 칩(8305)을 DRAM들(8301-8304)에 연결하는 규소 관통 비아들을 표현하는 한편, 메모리 제어기 블록들(7410)은 DRAM 채널들에 대한 제어 신호들을 생성하는 논리를 포함한다. 8개의 DRAM 채널(8405)이 도면에 도시되지만, 가속기 칩 상에 구현되는 실제 채널 수는 사용되는 스택형 DRAM들에 따라 변할 것이다. 개발되고 있는 스택 DRAM 기술들 중 대부분은 4개 또는 8개의 채널을 제공한다.
내적 엔진(DPE)들(8420)은 아키텍처의 컴퓨팅 요소들이다. 도 84a-b에 도시된 특정 구현에서, 8개의 DPE들의 각각의 세트는 벡터 캐시(8415)와 연관된다. 도 85는, 2개의 버퍼(8505-8506), 2개의 64 비트 곱셈-가산 ALU들(8510), 및 제어 논리(8500)를 포함하는 DPE의 고레벨 개요를 제공한다. 계산 동안, 칩 제어 유닛(8500)은 처리되는 데이터의 청크들을 버퍼 메모리들(8505-8506)로 스트리밍한다. 일단 각각의 버퍼가 가득 차면, DPE의 제어 논리는 버퍼들 사이를 시퀀싱하여, 버퍼들이 포함하는 벡터들의 내적들을 컴퓨팅하고 그 결과들을 DPE의 결과 래치(8512)에 기입하며, 그러한 결과 래치는, 계산의 결과를 스택 DRAM(8301-8304)에 다시 기입하기 위해 다른 DPE의 결과 래치들과 데이지 체인으로 연결된다.
일 구현에서, 가속기 논리 칩은 전력 소비를 최소화하기 위해 대략적으로 1 GHz 및 0.65 V에서 동작한다(그러나, 특정 동작 주파수 및 전압은 상이한 애플리케이션들에 대해 수정될 수 있음). 14 nm 설계 연구들에 기반한 분석은, 소프트 오류들을 방지하기 위해 강한 ECC가 요구될 수도 있지만 32-64 KB 버퍼들이 그 전압에서 이러한 주파수 규격을 충족시킨다는 것을 보여준다. 곱셈-가산 유닛은, 0.65 V 공급 전압 및 얕은 파이프라인으로 타이밍을 충족시키기 위해 기준 클록 비율의 절반에서 동작될 수 있다. 2개의 ALU들을 갖는 것은 DPE별 사이클당 하나의 배정밀도(double-precision) 곱셈-가산의 처리량을 제공한다.
273 GB/초 및 1.066 MHz의 클록 비율에서, DRAM 스택(8301-8304)은 논리 칩 클록 사이클당 256 바이트의 데이터를 전달한다. 어레이 색인들 및 값들이 적어도 32 비트의 양이라고 가정하면, 이는, 사이클당 32개의 희소 행렬 요소들(4 바이트의 색인 + 4 바이트의 값 = 8 바이트/요소)로 변환되어, 칩이 사이클당 32회의 곱셈-가산들을 수행하여 유지할 것이 요구된다. (이는 행렬-벡터 곱셈을 위한 것이고, 스택 DRAM 대역폭의 100%가 행렬을 페치하는 데 사용되도록 벡터 캐시에서의 높은 히트 비율을 가정함). 도 84에 도시된 64개의 DPE들은 요구되는 컴퓨팅 처리량의 2-4배를 제공하여, ALU들(8510)이 당시에 100 %가 사용되지는 않는 경우라 하더라도 칩이 피크 스택 DRAM 대역폭에서 데이터를 처리할 수 있게 한다.
일 구현에서, 벡터 캐시들(8415)은 행렬-벡터 곱셈에서 벡터의 요소들을 캐싱한다. 이는, 아래에 설명되는 행렬 블록화 방식의 효율을 상당히 증가시킨다. 일 구현에서, 각각의 벡터 캐시 블록은 8-채널 아키텍처에서 256-512 KB의 총 용량에 대해 32-64 KB의 캐시를 포함한다.
칩 제어 유닛(8401)은 계산의 흐름을 관리하고, 가속기 내의 다른 스택들 및 시스템 내의 다른 소켓들과의 통신을 처리한다. 복잡도 및 전력 소비를 감소시키기 위해, 내적 엔진들은 결코 메모리로부터 데이터를 요청하지 않는다. 대신, 칩 제어 유닛(8401)은 메모리 시스템을 관리하여, 데이터의 적절한 블록들을 DPE들 각각에 푸시하는 전송들을 개시한다.
일 구현에서, 다중-스택 가속기 내의 스택들은, 도면에 도시된 이웃 연결들(8431)을 사용하여 구현되는 KTI 링크들(8430)의 네트워크를 통해 서로 통신한다. 칩은 또한 다중-소켓 시스템 내의 다른 소켓(들)과 통신하는 데 사용되는 3개의 부가적인 KTI 링크들을 제공한다. 다중-스택 가속기에서, 스택들의 오프-패키지 KTI 링크들(8430) 중 하나만이 활성일 것이다. 다른 스택들 상의 메모리를 대상으로 하는 KTI 트랜잭션들은 온-패키지 KTI 네트워크를 통해 적절한 스택으로 라우팅될 것이다.
가속기의 일 구현 상에서 희소 행렬-밀집 벡터 및 희소 행렬-희소 벡터 곱셈을 구현하기 위한 기법들 및 하드웨어가 본원에서 설명된다. 이는 또한, 희소 행렬 연산들을 지원하는 가속기를 생성하기 위해, 행렬-행렬 곱셈, 완화 연산들, 및 다른 기능들을 지원하도록 확장될 수 있다.
희소-희소 및 희소-밀집 행렬-벡터 곱셈들이 동일한 기본 알고리즘(벡터와 행렬 내의 각각의 행의 내적을 취함)을 실행하지만, 벡터가 밀집일 때와 비교하여 벡터가 희소할 때 이러한 알고리즘이 구현되는 방식에서 상당한 차이들이 존재하며, 이는 아래의 표에 요약된다.
Figure 112020130859394-pat00050
희소 행렬-밀집 벡터 곱셈에서, 벡터의 크기는 고정되고 행렬 내의 열들의 수와 동일하다. 과학 계산들에서 발견되는 행렬들 중 많은 행렬들이 행당 대략적으로 10개의 0이 아닌 요소들을 평균으로 하므로, 희소 행렬-밀집 벡터 곱셈에서의 벡터가 행렬 그 자체의 5-10 %만큼 많은 공간을 차지하는 것은 드문 일이 아니다. 다른 한편으로는, 희소 벡터들은 종종 상당히 짧아서, 행렬의 행들과 유사한 수의 0이 아닌 값을 포함하며, 이는, 온-칩 메모리에서 희소 벡터들을 캐싱하는 것을 훨씬 더 용이하게 한다.
희소 행렬-밀집 벡터 곱셈에서, 벡터 내의 각각의 요소의 위치는 그의 색인에 의해 결정되고, 이는, 행렬의 구역에서 0이 아닌 값들에 대응하는 벡터 요소들을 수집하고 행렬과 곱해질 임의의 밀집 벡터에 대해 수집될 필요가 있는 벡터 요소들의 세트를 사전 컴퓨팅하는 것을 실현가능하게 한다. 그러나, 희소 벡터 내의 각각의 요소의 위치는 예측불가능하고, 벡터 내의 0이 아닌 요소들의 분포에 의존한다. 이는, 행렬 내의 어느 0이 아닌 값들이 벡터 내의 0이 아닌 값들에 대응하는지를 결정하기 위해 희소 벡터 및 행렬 내의 0이 아닌 요소들을 검사할 필요가 있게 한다.
행렬과 벡터 내의 0이 아닌 요소들의 색인들을 비교하는 것이 도움이 되는데, 그 이유는, 희소 행렬-희소 벡터 내적을 컴퓨팅하는 데 요구되는 명령어들/연산들의 수가 예측불가능하고 행렬과 벡터의 구조에 의존하기 때문이다. 예컨대, 단일의 0이 아닌 요소를 갖는 행렬 행과 많은 0이 아닌 요소들을 갖는 벡터의 내적을 취하는 것이 고려된다. 행의 0이 아닌 값이 벡터 내의 0이 아닌 값들보다 낮은 색인을 갖는 경우, 내적은 하나의 색인 비교만을 요구한다. 행의 0이 아닌 값이 벡터 내의 0이 아닌 값들 중 임의의 것보다 높은 색인을 갖는 경우, 내적을 컴퓨팅하는 것은, 벡터의 모든 각각의 색인과 행의 0이 아닌 값의 색인을 비교하는 것을 요구한다. 이는, 일반적인 관행인 벡터를 통한 선형 검색을 가정한다. 이진 검색과 같은 다른 검색들은 최악의 경우에 더 빠를 것이지만, 벡터와 행 내의 0이 아닌 값들이 겹치는 일반적인 경우에는 상당한 오버헤드를 부가할 것이다. 대조적으로, 희소 행렬-밀집 벡터 곱셈을 수행하는 데 요구되는 연산들의 수는 고정되고 행렬 내의 0이 아닌 값들의 수에 의해 결정되어, 계산에 요구되는 시간의 양을 예측하는 것을 용이하게 한다.
이러한 차이들 때문에, 가속기의 일 구현은 희소 행렬-밀집 벡터 및 희소 행렬-희소 벡터 곱셈을 구현하는 데 동일한 고레벨 알고리즘을 사용하며, 벡터가 내적 엔진들에 걸쳐 분산되는 방식 및 내적이 컴퓨팅되는 방식에서 차이가 있다. 가속기는 큰 희소 행렬 계산들에 대해 의도되기 때문에, 행렬 또는 벡터가 온-칩 메모리에 맞을 것이라고 가정될 수 없다. 대신, 일 구현은 도 86에 약술된 블록화 방식을 사용한다.
특히, 이러한 구현에서, 가속기는, 온-칩 메모리에 맞도록 크기가 정해진 고정 크기 데이터 블록들(8601-8602)로 행렬들을 분할할 것이고, 다음 블록으로 진행하기 전에 출력 벡터의 청크를 생성하기 위해 블록 내의 행들을 벡터와 곱할 것이다. 이러한 접근법은 2가지 난제를 제기한다. 첫째, 희소 행렬의 각각의 행에서의 0이 아닌 값들의 수는, 연구된 데이터 세트들에서 낮게는 하나 내지 높게는 46,000개로 데이터 세트들 간에 광범위하게 변한다. 이는, 각각의 내적 엔진에 하나 또는 심지어 고정된 수의 행들을 배정하는 것을 비실용적이게 한다. 따라서, 일 구현은 행렬 데이터의 고정 크기 청크들을 각각의 내적 엔진에 배정하고, 청크가 다수의 행렬 행들을 포함하는 경우 및 단일 행이 다수의 청크들에 걸쳐 분할되는 경우를 처리한다.
두 번째 난제는, 행렬의 각각의 블록에 대해 스택 DRAM으로부터 전체 벡터를 페치하는 것이 상당한 양의 대역폭을 낭비할 가능성을 갖는다는 것이다(즉, 블록 내에 대응하는 0이 아닌 값이 존재하지 않는 벡터 요소들을 페치함). 이는 특히, 벡터가 희소 행렬의 크기의 상당한 부분일 수 있는 희소 행렬-밀집 벡터 곱셈에 대한 문제이다. 이를 해결하기 위해, 일 구현은, 행렬 내의 각각의 블록(8601-8602)에 대해, 블록 내의 0이 아닌 값들에 대응하는 벡터(8610) 요소들의 세트를 열거하는 페치 목록(8611-8612)을 구성하고, 블록을 처리할 때 그 요소들만을 페치한다. 페치 목록들이 또한 스택 DRAM으로부터 페치되어야 하지만, 대부분의 블록들에 대한 페치 목록은 블록의 크기의 작은 부분일 것이라는 것이 결정되었다. 런-렝스(run-length) 인코딩들과 같은 기법들이 또한 페치 목록의 크기를 감소시키기 위해 사용될 수 있다.
따라서, 가속기 상에서의 행렬-벡터 곱셈은 다음과 같은 연산들의 시퀀스를 수반할 것이다:
1. DRAM 스택으로부터 행렬 데이터의 블록을 페치하고 이를 내적 엔진들에 걸쳐 분배한다.
2. 행렬 데이터 내의 0이 아닌 요소들에 기반하여 페치 목록을 생성한다.
3. 스택 DRAM으로부터 페치 목록 내의 각각의 벡터 요소를 페치하고 이를 내적 엔진들에 분배한다.
4. 벡터와 블록 내의 행들의 내적을 컴퓨팅하고, 그 결과들을 스택 DRAM에 기입한다.
5. 계산과 병렬로, 행렬 데이터의 다음 블록을 페치하고 전체 행렬이 처리될 때까지 반복한다.
가속기가 다수의 스택들을 포함할 때, 행렬의 "파티션들"은 상이한 스택들에 정적으로 배정될 수 있고, 그런 다음, 블록화 알고리즘이 각각의 파티션에 대해 병렬로 실행될 수 있다. 이러한 블록화 및 브로드캐스트 방식은 모든 메모리 참조들이 중앙 제어 유닛으로부터 비롯되는 이점을 가지며, 이는, 네트워크가 예측불가능한 요청들을 라우팅할 필요가 없고 내적 엔진들과 메모리 제어기들 사이에서 응답하기 때문에, 온-칩 네트워크의 설계를 크게 단순화한다. 이는 또한, 개별 내적 엔진들이 자신의 계산의 일부를 수행할 것을 요구하는 벡터 요소들에 대한 메모리 요청들을 그 개별 내적 엔진들이 송출하는 것과는 달리, 주어진 블록이 필요로 하는 각각의 벡터 요소에 대한 하나의 메모리 요청만을 송출함으로써 에너지를 절감한다. 마지막으로, 색인들의 조직화된 목록으로부터 벡터 요소들을 페치하는 것은, 그러한 페치들이 스택형 DRAM 내의 페이지 히트들을 최대화하고 그에 따라 대역폭 사용을 최대화하는 방식으로 요구하는 메모리 요청들을 스케줄링하는 것을 용이하게 한다.
본원에서 설명된 가속기 구현들 상에서의 희소 행렬-밀집 벡터 곱셈을 구현하는 것에 대한 하나의 난제는, 메모리로부터 스트리밍되는 벡터 요소들을 각각의 내적 엔진의 버퍼들 내의 행렬 요소들의 색인들에 매칭시키는 것이다. 일 구현에서, 벡터의 256 바이트(32-64 요소)가 사이클마다 내적 엔진에 도달하고, 각각의 벡터 요소는, 행렬 데이터의 고정 크기 블록들이 각각의 내적 엔진의 행렬 버퍼 내로 페치되었기 때문에, 내적 엔진의 행렬 버퍼 내의 0이 아닌 값들 중 임의의 것에 대응할 수 있다.
각각의 사이클마다 그러한 많은 비교들을 수행하는 것은 면적 및 전력에서 엄청나게 비용이 많이 들 것이다. 대신, 일 구현은, 도 87에 도시된 포맷을 사용하여, 많은 희소 행렬 애플리케이션들이, 동일한 행렬을 동일하거나 상이한 벡터들과 반복적으로 곱하고, 각각의 내적 엔진이 그 행렬의 청크를 처리할 필요가 있는 페치 목록의 요소들을 사전 컴퓨팅한다는 사실을 이용한다. 기준선 CRS 포맷에서, 행렬은 그 행 내의 각각의 0이 아닌 값의 위치를 정의하는 색인들의 어레이(8702), 각각의 0이 아닌 값들을 포함하는 어레이(8703), 및 색인 및 값 어레이들에서 각각의 행이 시작하는 곳을 표시하는 어레이(8701)에 의해 설명된다. 이를 위해, 일 구현은, 전체 계산 중 그 부분을 수행하기 위해 각각의 내적 엔진이 포착할 필요가 있는 벡터 데이터 버스트들을 식별하는 블록 기술어들의 어레이(8705)를 부가한다.
도 87에 도시된 바와 같이, 각각의 블록 기술어는 8개의 16 비트 값들 및 버스트 기술어들의 목록으로 이루어진다. 처음 16 비트 값은 얼마나 많은 버스트 기술어들이 블록 기술어 내에 있는지를 하드웨어에 알리는 한편, 나머지 7개는 처음을 제외한 스택 DRAM 데이터 채널들 모두에 대한 버스트 기술어 목록 내에서의 시작 지점들을 식별한다. 이러한 값들의 수는 스택형 DRAM이 제공하는 데이터 채널들의 수에 따라 변할 것이다. 각각의 버스트 기술어는, 하드웨어가 주의를 기울일 필요가 있는 데이터 버스트를 하드웨어에 알리는 24 비트 버스트 계수, 및 도트 처리 엔진이 필요로 하는 값들을 포함하는 버스트 내의 워드들을 식별하는 "필요한 워드들" 비트-벡터를 포함한다.
일 구현에 포함된 다른 데이터 구조는 행렬 버퍼 색인(MBI)들의 어레이(8704)이며, 행렬 내의 0이 아닌 값당 하나의 MBI로 이루어진다. 각각의 MBI는 0이 아닌 값에 대응하는 밀집 벡터 요소가 관련 내적 엔진의 벡터 값 버퍼에 저장될 위치를 제공한다(예컨대, 도 89 참조). 희소 행렬-밀집 벡터 곱셈을 수행할 때, 원래의 행렬 색인들이 아니라 행렬 버퍼 색인들이 내적 엔진의 행렬 색인 버퍼(8704)에 로딩되고, 내적을 계산할 때 대응하는 벡터 값을 탐색하는 데 사용되는 어드레스의 기능을 한다.
도 88은, 단지 하나의 스택형 DRAM 데이터 채널 및 4-워드 데이터 버스트들을 갖는 시스템 상에서 단일 내적 엔진의 버퍼들 내에 맞춰진 2-행 행렬에 대해 상기의 내용이 작동하는 방식을 예시한다. 행 시작 값들(8801), 행렬 색인들(8802) 및 행렬 값들(8803)을 포함하는 원래의 CRS 표현이 도면의 좌측에 도시된다. 2개의 행은 열들 {2, 5, 6} 및 {2, 4, 5}에서 0이 아닌 요소들을 가지므로, 벡터의 요소들 2, 4, 5, 및 6은 내적들을 컴퓨팅하는 데 요구된다. 블록 기술어들은 이를 반영하여, 제1의 4-워드 버스트의 워드 2(벡터의 요소 2) 및 제2의 4-워드 버스트의 워드들 0, 1, 및 2(벡터의 요소들 4-6)가 요구됨을 표시한다. 벡터의 요소 2가 내적 엔진이 필요로 하는 벡터의 제1 워드이므로, 그 요소는 벡터 값 버퍼 내의 위치 0에 위치할 것이다. 벡터의 요소 4는 위치 1에 위치하는 그러한 방식으로 이루어질 것이다.
행렬 버퍼 색인 어레이 데이터(8804)는, 하드웨어가 행렬 내의 0이 아닌 값에 대응하는 값을 찾을 벡터 값 버퍼 내의 위치를 보유한다. 행렬 색인들의 어레이에서의 제1 엔트리가 값 "2"를 가지므로, 행렬 버퍼 색인들의 어레이에서의 제1 엔트리가 값 "0"을 획득하며, 이는 벡터의 요소 2가 벡터 값 버퍼에 저장될 위치에 대응한다. 유사하게, 행렬 색인들의 어레이에 "4"가 나타나는 경우마다 행렬 버퍼 색인들에 "1"이 나타날 것이고, 행렬 색인들의 어레이에서의 각각의 "5"는 행렬 버퍼 색인에서 대응하는 "2"를 가질 것이고, 행렬 색인 어레이에서의 각각의 "6"은 행렬 버퍼 색인에서의 "3"에 대응할 것이다.
본 발명의 일 구현은, 다중-스택 가속기의 총 대역폭이 CPU로부터 가속기로 데이터를 전송하는 데 사용되는 KTI 링크들의 대역폭보다 훨씬 더 크다는 사실을 이용하여, 행렬이 가속기 상에 로딩될 때 밀집 벡터들로부터의 빠른 수집들을 지원하는 데 요구되는 사전 계산들을 수행한다. 이러한 사전 계산된 정보는, 동일 행렬 색인의 다수의 사본들이 내적 엔진 상에 맵핑된 행렬의 청크 내에서 얼마나 자주 발생하는지에 따라, 행렬을 보유하는 데 요구되는 메모리의 양을 75 %까지 증가시킨다. 그러나, 행렬-벡터 곱셈이 수행될 때 행렬 색인들의 어레이 대신 16 비트 행렬 버퍼 색인들의 어레이가 페치되기 때문에, 스택 DRAM들로부터 페치되는 데이터의 양은 종종, 특히 64 비트 색인들을 사용하는 행렬들에 대해, 원래의 CRS 표현에서보다 적을 것이다.
도 89는 이러한 포맷을 사용하는 내적 엔진에서의 하드웨어의 일 구현을 예시한다. 행렬-벡터 곱셈을 수행하기 위해, 블록을 구성하는 행렬의 청크들이 행렬 색인 버퍼(8903) 및 행렬 값 버퍼(8905)에 복사되고(원래의 행렬 색인들 대신 행렬 버퍼 색인들을 복사함), 관련 블록 기술어가 블록 기술어 버퍼(8902)에 복사된다. 그런 다음, 페치 목록이 사용되어 밀집 벡터로부터 요구되는 요소들을 로딩하고 이들을 내적 엔진들로 브로드캐스팅한다. 각각의 내적 엔진은, 각각의 데이터 채널을 통해 지나가는 벡터 데이터의 버스트들의 수를 계수한다. 주어진 데이터 채널 상에서의 계수가 버스트 기술어에서 특정된 값과 매칭할 때, 매치 논리(8920)는 특정된 워드들을 포착하고 이들을 자신의 벡터 값 버퍼(8904)에 저장한다.
도 90은 이러한 포착을 행하는 매치 논리(8920) 유닛의 콘텐츠들을 도시한다. 래치(9005)는 계수기가 버스트 기술어 내의 값과 매칭할 때 데이터 채널의 와이어들 상의 값을 포착한다. 시프터(9006)는 요구되는 워드들(9002)을 버스트(9001)로부터 추출하고, 이들을 그 크기가 벡터 값 버퍼의 행들과 매칭되는 라인 버퍼(9007) 내의 올바른 위치로 라우팅한다. 버스트 계수(9001)가 내부 계수기(9004)와 동일할 때 로드 신호가 생성된다. 라인 버퍼가 가득 채워질 때, 라인 버퍼는 (다중화기(9008)를 통해) 벡터 값 버퍼(9004)에 저장된다. 이러한 방식으로 다수의 버스트들로부터의 워드들을 라인들로 어셈블리하는 것은, 벡터 값 버퍼가 지원할 필요가 있는 사이클당 기입들의 수를 감소시켜, 그 버퍼의 크기를 감소시킨다.
일단 벡터의 모든 요구되는 요소들이 벡터 값 버퍼에 포착되면, 내적 엔진은 ALU들(8910)을 사용하여 요구되는 내적(들)을 컴퓨팅한다. 제어 논리(8901)는, 사이클당 하나의 요소로, 행렬 색인 버퍼(8903) 및 행렬 값 버퍼(8904)를 순차적으로 거친다. 행렬 색인 버퍼(8903)의 출력은 다음 사이클에서의 벡터 값 버퍼(8904)에 대한 판독 어드레스로서 사용되는 반면, 행렬 값 버퍼(8904)의 출력은, 그 출력이 벡터 값 버퍼(8904)로부터의 대응하는 값과 동시에 ALU들(8910)에 도달하도록 래치된다. 예컨대, 도 88로부터의 행렬을 사용하여, 내적 계산의 제1 사이클에서, 하드웨어는 행렬 값 버퍼(8905)로부터의 값 "13"과 함께 행렬 색인 버퍼(8903)로부터 행렬 버퍼 색인 "0"을 판독할 것이다. 제2 사이클에서, 행렬 색인 버퍼(8903)로부터의 값 "0"은, 이후 사이클 3에서 "13"과 곱해지는 벡터 요소 "2"의 값을 페치하는, 벡터 값 버퍼(8904)에 대한 어드레스로서 동작한다.
행 시작 비트-벡터(8901)의 값들은, 행렬의 행이 끝나고 새로운 행이 시작되는 때를 하드웨어에 알린다. 하드웨어가 행의 끝에 도달할 때, 하드웨어는 행에 대한 누산된 내적을 자신의 출력 래치(8911)에 배치하고, 다음 행에 대한 내적을 누산하기 시작한다. 각각의 내적 엔진의 내적 래치들은 라이트백을 위해 출력 벡터를 어셈블리하는 데이지 체인으로 연결된다.
희소 행렬-희소 벡터 곱셈에서, 벡터는 희소 행렬-밀집 벡터 곱셈에서보다 훨씬 더 적은 메모리를 차지하는 경향이 있지만, 희소하기 때문에, 주어진 색인에 대응하는 벡터 요소를 직접 페치하는 것은 가능하지 않다. 대신, 벡터가 검색되어야 해서, 각각의 내적 엔진이 필요로 하는 요소들만을 내적 엔진에 라우팅하는 것을 비실용적이게 하고, 각각의 내적 엔진에 배정된 행렬 데이터의 내적들을 컴퓨팅하는 데 요구되는 시간의 양을 예측불가능하게 한다. 이 때문에, 희소 행렬-희소 벡터 곱셈에 대한 페치 목록은 단지 행렬 블록 내의 가장 낮은 및 가장 높은 0이 아닌 요소들의 색인을 특정하고, 그러한 지점들 사이의 벡터의 모든 0이 아닌 요소들은 내적 엔진들에 브로드캐스팅되어야 한다.
도 91은 희소 행렬-희소 벡터 곱셈을 지원하는 내적 엔진 설계의 세부사항들을 도시한다. 행렬 데이터의 블록을 처리하기 위해, 행렬의 내적 엔진의 청크의 색인들(희소-밀집 곱셈에서 사용되는 행렬 버퍼 색인들이 아님) 및 값들이 행렬 색인 및 값 버퍼들에 기입되며, 이들은 블록을 처리하는 데 요구되는 벡터의 구역의 색인들 및 값들이다. 그런 다음, 내적 엔진 제어 논리(9140)는, 4개의 색인들의 블록들을 4x4 비교기(9120)에 출력하는 색인 버퍼들(9102-9103) 사이를 시퀀싱한다. 4x4 비교기(9120)는 벡터(9102)로부터의 색인들 각각을 행렬(9103)로부터의 색인들 각각에 비교하고, 임의의 매칭들의 버퍼 어드레스들을 매칭된 색인 큐(9130)에 출력한다. 매칭된 색인 큐(9130)의 출력들은 행렬 값 버퍼(9105) 및 벡터 값 버퍼(9104)의 판독 어드레스 입력들을 드라이빙하고, 이는, 매치들에 대응하는 값들을 곱셈-가산 ALU(9110)에 출력한다. 이러한 하드웨어는, 매칭된 색인 큐(9130)가 빈 공간을 갖는 한, 내적 엔진이 사이클당 적어도 4개에서 많게는 8개의 색인을 소비할 수 있게 하여, 색인 매치들이 드물 때 데이터의 블록을 처리하는 데 요구되는 시간의 양을 감소시킨다.
희소 행렬-밀집 벡터 내적 엔진과 마찬가지로, 행 시작들의 비트-벡터(9101)는 행렬의 새로운 행을 시작하는 행렬 버퍼들(9102-9103) 내의 엔트리들을 식별한다. 그러한 엔트리에 직면할 때, 제어 논리(9140)는 벡터 색인 버퍼(9102)의 시작으로 리셋하고, 그들의 최저 값으로부터 벡터 색인들을 검사하여 이들을 행렬 색인 버퍼(9103)의 출력들과 비교하기 시작한다. 유사하게, 벡터의 끝에 도달하면, 제어 논리(9140)는 행렬 색인 버퍼(9103)에서 다음 행의 시작으로 넘어가고 벡터 색인 버퍼(9102)의 시작으로 리셋한다. "완료" 출력은, 내적 엔진이 데이터 블록 또는 벡터의 구역을 처리하는 것을 마치고 다음 것으로 진행할 준비가 된 때를 칩 제어 유닛에 통지한다. 가속기의 일 구현을 단순화하기 위해, 제어 논리(9140)는 내적 엔진들 모두가 처리를 마칠 때까지 다음 블록/구역으로 진행하지 않을 것이다.
많은 경우들에서, 벡터 버퍼들은 블록을 처리하는 데 요구되는 희소 벡터 모두를 보유할만큼 충분히 클 것이다. 일 구현에서, 32 비트 값들이 사용되는지 또는 64 비트 값들이 사용되는지에 따라, 1,024개 또는 2,048개의 벡터 요소들에 대한 버퍼 공간이 제공된다.
벡터의 요구되는 요소들이 벡터 버퍼들에 맞지 않을 때, 다중패스 접근법이 사용될 수 있다. 제어 논리(9140)는 벡터의 전체 버퍼를 각각의 내적 엔진으로 브로드캐스팅할 것이고, 내적 엔진은, 자신의 행렬 버퍼들 내의 행들에 걸쳐 반복하기 시작할 것이다. 내적 엔진이 행의 끝에 도달하기 전에 벡터 버퍼의 끝에 도달할 때, 내적 엔진은, 현재 행 위치 비트-벡터(9111)에 비트를 설정하여 벡터의 다음 구역이 도달될 때 자신이 행을 처리하는 것을 재개해야 하는 곳을 표시할 것이고, 행의 시작이 지금까지 처리된 벡터 색인들 중 임의의 벡터 색인보다 더 높은 색인 값을 갖지 않는 한, 행의 시작에 대응하는 행렬 값들의 버퍼(9105)의 위치에 자신이 누산한 부분 내적을 저장할 것이고, 다음 행으로 넘어갈 것이다. 행렬 버퍼의 행들 모두가 처리된 후에, 내적 엔진은 벡터의 다음 구역을 요청하기 위해 자신의 완료 신호를 어써팅할 것이고, 전체 벡터가 판독될 때까지 프로세스를 반복할 것이다.
도 92는 특정 값들을 사용하는 예를 예시한다. 계산의 시작에서, 행렬의 4-요소 청크가 행렬 버퍼들(9103, 9105)에 기입되었고, 벡터의 4-요소 구역이 벡터 버퍼들(9102, 9104)에 기입되었다. 행 시작들의 비트-벡터(9101) 및 현재 행 위치 비트-벡터(9106) 둘 모두는 값 "1010"을 가지며, 이 값은, 행렬의 내적 엔진의 청크가 2개의 행을 포함한다는 것을 표시하며, 그 중 하나의 행은 행렬 버퍼 내의 제1 요소에서 시작하고, 그 중 하나의 행은 세 번째에서 시작한다.
제1 구역이 처리될 때, 청크의 제1 행은 색인 3에서 색인 매치를 보고, 행렬 및 벡터 버퍼들의 대응하는 요소들의 곱(4 × 1 = 4)을 컴퓨팅하고, 그 값을 행의 시작에 대응하는 행렬 값 버퍼(9105)의 위치에 기입한다. 제2 행은 색인 1에서 하나의 색인 매치를 보고, 벡터와 행렬의 대응하는 요소들의 곱을 컴퓨팅하고, 그 결과(6)를 행의 시작에 대응하는 위치에서 행렬 값 버퍼(9105)에 기입한다. 현재 행 위치 비트-벡터의 상태는 "0101"로 변경되고, 이는, 각각의 행의 제1 요소가 처리되었고 계산이 제2 요소들로 재개되어야 한다는 것을 표시한다. 그런 다음, 내적 엔진은 자신의 완료 라인을 어써팅하여 벡터의 다른 구역에 대해 준비가 되었음을 시그널링한다.
내적 엔진이 벡터의 제2 구역을 처리할 때, 행 1이 색인 4에서의 색인 매치를 갖는 것을 보고, 행렬과 벡터의 대응하는 값들의 곱(5 × 2 = 10)을 컴퓨팅하고, 제1 벡터 영역이 처리된 후에 저장된 부분 내적에 그 값을 가산하고, 그 결과(14)를 출력한다. 제2 행은 색인 7에서 매치를 발견하고, 도면에 도시된 바와 같이 결과(38)를 출력한다. 이러한 방식으로 부분 내적들 및 계산의 상태를 저장하는 것은, 부분 곱들을 위한 상당한 양의 가외의 저장소를 요구하지 않으면서, (벡터가 오름차순으로 색인들로 분류되기 때문에) 벡터의 나중의 구역들에서 색인들에 아마도 매칭할 수 없는 행렬의 처리 요소들을 중복 작업 처리하는 것을 피한다.
도 93은 위에 설명된 희소-밀집 및 희소-희소 내적 엔진들이 둘 모두의 유형들의 계산들을 처리할 수 있는 내적 엔진을 산출하도록 결합되는 방식을 도시한다. 2개의 설계들 사이의 유사성을 고려할 때, 유일한 요구되는 변경들은, 어느 모듈들이 버퍼들(9104-9105)의 판독 어드레스 및 기입 데이터 입력들을 드라이빙하는지를 결정하는 한 세트의 다중화기(9350) 및 곱셈-가산 ALU들(9110)에 행렬 값 버퍼의 출력이 전송되는지 또는 행렬 값 버퍼의 래칭된 출력이 전송되는지를 선택하는 다중화기(9351)와 함께, 매칭된 색인 큐(9330) 및 희소-밀집 내적 엔진의 매치 논리(9311) 및 희소-희소 내적 엔진의 비교기(9320) 양자를 인스턴스화하는 것이다. 일 구현에서, 이러한 다중화기들은 행렬-벡터 곱셈의 시작에서 설정되고 연산 전체에 걸쳐 동일한 구성으로 유지되는 제어 유닛(9140) 내의 구성 비트에 의해 제어된다.
단일 가속기 스택은 희소 행렬 연산들에 대해 서버 CPU에 필적하는 성능을 전달할 것이어서, 스마트폰들, 태블릿들, 및 다른 모바일 디바이스들에 대해 매력적인 가속기가 되게 한다. 예컨대, 하나 이상의 서버 상에서 모델을 훈련한 다음 모바일 디바이스들에 그 모델들을 배치하여 착신 데이터 스트림을 처리하는 기계 학습 애플리케이션에 대한 다수의 제안들이 존재한다. 모델들은 그들을 훈련하는 데 사용되는 데이터 세트들보다 훨씬 더 작은 경향이 있으므로, 단일 가속기 스택의 제한된 용량은 이러한 애플리케이션들에서의 제한이 더 적지만, 가속기의 성능 및 전력 효율은 모바일 디바이스들이 그들의 주 CPU들 상에서 실현가능한 것보다 훨씬 더 복잡한 모델들을 처리할 수 있게 할 것이다. 비-모바일 시스템들을 위한 가속기들은 매우 높은 대역폭 및 성능을 전달하기 위해 다수의 스택들을 결합할 것이다.
다중-스택 구현의 2개의 구현이 도 94a 및 도 94b에 예시된다. 이러한 구현들 둘 모두는 현대의 서버 CPU들과 핀-호환가능한 패키지 상에 여러 개의 가속기 스택들을 통합한다. 도 94a는 12개의 가속기 스택들(9401-9412)을 갖는 소켓 대체 구현을 예시하고, 도 94b는 프로세서/코어 세트(9430)(예컨대, 적은 코어 계수 Xeon) 및 8개의 스택들을(9421-9424) 갖는 다중칩 패키지(MCP) 구현을 예시한다. 도 94a에서의 12개의 가속기 스택들은 현재 패키지들에서 사용되는 39 mm × 39 mm 열 확산기 아래에 맞는 어레이로 배치되는 반면, 도 94b에서의 구현은 8개의 스택들 및 프로세서/코어 세트를 동일한 풋프린트 내에 통합한다. 일 구현에서, 스택들에 사용되는 물리적 치수들은 8GB WIO3 스택들에 대한 치수들이다. 다른 DRAM 기술들은 상이한 치수들을 가질 수 있으며, 이는 패키지에 맞는 스택들의 수를 변경할 수 있다.
이러한 구현들 둘 모두는 KTI 링크들을 통해 CPU와 가속기들 사이에 낮은 레이턴시 메모리 기반 통신을 제공한다. Xeon 구현들을 위한 소켓 대체 설계는 다중-소켓 시스템에서 CPU들 중 하나 이상을 대체하고, 96 GB의 용량 및 3.2 TB/s의 스택 DRAM 대역폭을 제공한다. 예상 전력 소비는 Xeon 소켓의 전력 예산 내에서 양호한 90 W이다. MCP 접근법은, 가속기에서 60 W의 전력을 소비하면서 64 GB의 용량 및 2.2 TB/s의 대역폭을 제공한다. 이는, 150 W의 소켓당 전력 예산을 가정하면, CPU에 대해 90 W를 남기며, 이는 중간 범위 Xeon CPU를 지원하기에 충분하다. 상세한 패키지 설계가 패키지 내의 논리에 대한 더 많은 공간을 허용하는 경우, 부가적인 스택들 또는 더 강력한 CPU가 사용될 수 있지만, 이는, 총 전력 소비를 소켓의 전력 예산 내로 유지하기 위해 Xeon + FPGA 혼성 부품에 대해 조사되는 코어 파킹 기법들과 같은 메커니즘들을 요구할 것이다.
이러한 설계들 둘 모두는, 규소 인터포저들 또는 다른 정교한 통합 기술들을 요구하지 않고도 구현될 수 있다. 현재의 패키지들에서 사용되는 유기 기판들은, 스택 간 KTI 네트워크 및 오프-패키지 KTI 링크들을 지원하기에 충분한, 다이 둘레의 cm당 대략적으로 300개의 신호들을 허용한다. 스택형 DRAM 설계들은 전형적으로, 냉각이 문제가 되기 전에 ~10 W의 전력을 소비하는 논리 칩들을 지원할 수 있고, 이는, 256 GB/초의 대역폭을 제공하는 스택에 대한 2 W의 논리 다이 전력의 추정치들을 훨씬 초과한다. 마지막으로, 다중칩 패키지들은 배선을 위해 칩들 사이에 1-2 mm의 공간을 요구하며, 이는 현재 설계들과 일치한다.
구현들은 또한 PCIe 카드들 상에서 그리고/또는 DDR4-T 기반 가속기들을 사용하여 구현될 수 있다. PCIe 카드에 대해 300 W 전력 제한을 가정하면, 카드가 320 GB의 총 용량 및 11 TB/초의 대역폭에 대해 40개의 가속기 스택들을 지원할 수 있게 된다. 그러나, PCIe 채널의 긴 레이턴시 및 제한된 대역폭은, CPU와의 드문 상호 작용만을 요구하는 큰 문제들로 PCIe 기반 가속기를 제한한다.
대안적으로, 가속기 스택들은 도 95에 도시된 바와 같이 DDR-T DIMM 기반 가속기들(9501-9516)을 구현하는 데 사용될 수 있다. DDR-T는 DDR4 소켓들 및 마더보드들과 호환가능하도록 설계된 메모리 인터페이스이다. DDR4와 동일한 핀 배치 및 커넥터 포맷을 사용하여, DDR-T는 상이한 타이밍 특성들을 갖는 메모리 디바이스들의 사용을 허용하는 트랜잭션 기반 인터페이스(9500)를 제공한다. 이러한 구현에서, 가속기 스택들(9501-9516)은 계산들을 수행하는 데 사용되지 않을 때 단순한 메모리들로서 동작한다.
DDR-T DIMM은 16개의 가속기 스택들에 대해, 또는 카드의 양면이 사용되는 경우에는 32개에 대해 충분한 공간을 제공하며, 126-256 GB의 메모리 용량과 4-8 TB/초의 총 대역폭이 제공된다. 그러나, 그러한 시스템은 DDR4-DIMM에 의해 소비된 ~10 W보다 훨씬 더 많은 120-240 와트의 전력을 소비할 것이다. 이는 능동 냉각을 요구할 것이며, 이는, 마더보드 상의 각각의 DIMM에 대해 할당된 제한된 공간에 맞추기 어려울 것이다. 그럼에도 불구하고, DDR-T 기반 가속기는, 사용자가 가속을 위해 임의의 CPU 성능을 포기하려 하지 않고 팬들 또는 다른 냉각 시스템들을 위한 가속기 DIMM들 사이의 충분한 공간을 포함하는 맞춤형 마더보드 설계의 비용을 지불하고자 하는 애플리케이션들에 대해 매력적일 수 있다.
일 구현에서, 다중-스택 가속기에서의 스택들은 별개의 개별 KTI 노드들일 것이고, 시스템 소프트웨어에 의해 별개의 디바이스들로서 관리될 것이다. 시스템 펌웨어는, 토폴로지를 고유하게 결정해야 하는 존재하는 가속기 스택들의 수에 기반하여 부팅 시에 다중-스택 가속기 내의 라우팅 테이블을 정적으로 결정할 것이다.
일 구현에서, 가속기에 대한 저레벨 인터페이스는, 소켓 기반 가속기들에 대한 그의 적합성으로 인해 가속기 추상화 계층(AAL) 소프트웨어를 사용하여 구현될 것이다. 가속기들은, 스택형 DRAM을 호스트 시스템에 의해 액세스가능하지 않은 가속기에 대한 개인 (비-일관성) 메모리로서 취급하여 코어 캐시 인터페이스 규격(CCI)에 의해 설명된 바와 같이 캐싱 에이전트를 구현할 수 있다(즉, 캐싱 에이전트 + 개인 캐시 메모리 구성, 이를테면 CA+PCM). CCI 규격은 가속기를 제어하기 위해 드라이버에 의해 사용되는 각각의 가속기에 대한 별개의 구성/상태 레지스터(CSR) 어드레스 공간을 요구한다. 그 규격에 따르면, 각각의 가속기는, 가속기의 상태를 표시하는 데 사용되는 호스트 메모리에 맵핑되는 피닝된 메모리 구역인 디바이스 상태 메모리(DSM)를 통해 호스트에 자신의 상태를 통신할 것이다. 따라서, 12-스택 시스템에서, 단일의 통합 드라이버 에이전트에 의해 관리되는 12개의 별개의 DSM 구역이 존재할 것이다. 이러한 메커니즘들은 각각의 스택에 대한 명령 버퍼를 생성하는 데 사용될 수 있다. 명령 버퍼는, AAL 드라이버에 의해 관리되는 순환 큐로서 구현되는, 시스템 메모리에 맵핑되는 피닝된 메모리 구역이다. 드라이버는 명령들을 각각의 스택의 명령 버퍼 내에 기입하고, 각각의 스택은 자신의 전용 명령 버퍼로부터 항목들을 소비한다. 따라서, 이러한 구현에서는 명령 생산과 소비가 분리될 것이다.
예로서, 호스트 CPU에 연결된 단일 가속기 스택으로 구성되는 시스템을 고려한다. 사용자는 다음의 계산: wn+1 = wn - αAwn을 수행하기 위해 코드를 기입하며, 여기서, A는 행렬이고 wx는 벡터들이다. 소프트웨어 프레임워크 및 AAL 드라이버는 이 코드를 다음의 명령의 시퀀스로 분해한다:
TRANSMIT - 개인 캐시 메모리로 파티션들의 시퀀스(wn+1, wn, α, A)를 로딩함
MULTIPLY - 파티션들의 시퀀스를 곱함(tmp = wn * α * A)
SUBTRACT - 파티션들의 시퀀스를 감산함(wn+1 = wn - tmp)
RECEIVE - 그 결과(wn+1)를 비롯하여 호스트 메모리에 파티션들의 시퀀스를 저장함
이러한 명령들은 호스트 또는 개인 캐시 메모리에 위치한 개략적으로 나눠진(대략적으로 16 MB-512 MB) 데이터 유닛들인 "파티션들"에 대해 연산한다. 파티션들은 가속기(들)를 사용하는 분산형 계산들의 가속을 용이하게 하기 위해 맵리듀스(MapReduce) 또는 스파크(Spark) 분산형 컴퓨팅 시스템이 사용하는 데이터의 블록들 상에 쉽게 맵핑되도록 의도된다. AAL 드라이버는 호스트 메모리 구역들 또는 가속기 스택들에 대한 파티션들의 정적 일대일 맵핑을 생성하는 것을 담당한다. 가속기 스택들은 각각 자신의 배정받은 파티션들을 자신의 개인 캐시 메모리(PCM) 어드레스 공간에 개별적으로 맵핑한다. 파티션들은 고유 식별자인 파티션 색인에 더하여 (호스트 메모리 내에 위치한 파티션들의 경우) 대응하는 메모리 구역(들) 및 데이터 포맷에 의해 설명된다. PCM에 위치한 파티션들은 중앙 제어 유닛에 의해 관리되고, 중앙 제어 유닛은 파티션에 대한 PCM 어드레스 구역을 결정한다.
일 구현에서, 가속기의 PCM을 초기화하기 위해, 호스트는 호스트 메모리로부터 데이터를 로딩할 것을 가속기에 지시한다. TRANSMIT 연산은 가속기로 하여금 호스트 메모리를 판독하고 판독된 데이터를 가속기의 PCM에 저장하게 한다. 송신될 데이터는 {파티션 색인, 호스트 메모리 구역, 데이터 포맷} 투플들의 시퀀스에 의해 설명된다. 호스트 드라이버에 의한 데이터 마샬링의 오버헤드를 피하기 위해, 가속기는 시스템 프로토콜 2(SPL2) 공유 가상 메모리(SVM)를 구현할 수 있다.
각각의 투플에서의 데이터 포맷은 메모리에서의 파티션의 레이아웃을 설명한다. 가속기가 지원할 포맷들의 예들은 압축된 희소 행(CSR) 및 다차원 밀집 어레이를 포함한다. 위의 예들의 경우, A는 CSR 포맷일 수 있는 반면, wn은 어레이 포맷일 수 있다. 명령 규격은, TRANSMIT 연산에 의해 참조되는 모든 파티션들을 PCM으로 로딩할 것을 가속기에 지시하기 위해, 필요한 정보 및 호스트 메모리 어드레스들을 포함한다.
각각의 연산은 파티션들의 시퀀스들의 형태로 적은 수의 피연산자들을 참조할 수 있다. 예컨대, MULTIPLY 연산은 가속기로 하여금 스택형 DRAM을 판독하고 행렬-벡터 곱셈을 수행하게 한다. 따라서, 이러한 예에서는 다음의 4개의 피연산자들을 갖는다: 목적지 벡터 tmp, 승수 A, 피승수 wn 및 스칼라 α. 목적지 벡터 tmp는 연산을 포함하는 명령의 일부로서 드라이버에 의해 특정된 파티션들의 시퀀스에 누산된다. 명령은, 요구되는 경우, 파티션들의 시퀀스를 초기화할 것을 가속기에 지시할 것이다.
RECEIVE 연산은 가속기로 하여금 PCM을 판독하고 호스트 메모리를 기입하게 한다. 이러한 연산은 모든 다른 연산들에 대해 임의적 필드로서 구현될 수 있고, 그 결과를 호스트 메모리에 저장하라는 지시와 함께 MULTIPLY와 같은 연산을 수행하기 위한 명령이 잠재적으로 융합된다. RECEIVE 연산의 목적지 피연산자는 온-칩 누적되고, 그런 다음, 호스트 메모리의 파티션으로 스트리밍되며, 이는 (가속기가 SPL2 SVM을 구현하지 않는 한) 명령의 디스패치 전에 드라이버에 의해 피닝되어야 한다.
명령 디스패치 흐름
일 구현에서, 스택에 대한 명령 버퍼에 명령들을 삽입한 후에, 드라이버는 소비될 새로운 명령들의 스택을 통지하기 위해 CSR 기입을 생성할 것이다. 드라이버에 의한 CSR 기입은 가속기 스택의 중앙 제어 유닛에 의해 소비되는데, 이는, 제어 유닛으로 하여금, 드라이버에 의해 스택으로 디스패치된 명령을 판독하기 위해 명령 버퍼에 대한 일련의 판독들을 생성하게 한다. 가속기 스택이 명령을 완료할 때, 가속기 스택은 자신의 DSM에 상태 비트를 기입한다. AAL 드라이버는 이러한 상태 비트들을 폴링하거나 모니터링하여 명령의 완료를 결정한다. DSM에 대한 TRANSMIT 또는 MULTIPLY 연산을 위한 출력은 완료를 표시하는 상태 비트이다. RECEIVE 연산을 위해, DSM에 대한 출력은 호스트 메모리에 기입된 파티션들의 시퀀스 및 상태 비트이다. 드라이버는 가속기에 의해 기입될 메모리의 구역을 식별하는 것을 담당한다. 스택 상의 제어 유닛은 스택형 DRAM에 대한 판독 연산들의 시퀀스 및 호스트 메모리 내의 목적지 파티션들에 대한 대응하는 기입들을 생성하는 것을 담당한다.
소프트웨어 인에이블
일 구현에서, 사용자들은 가속기 상으로 데이터를 이동시키고, 희소 행렬 계산들을 수행하는 등을 위한 루틴들의 라이브러리를 호출함으로써 가속기(들)와 상호작용한다. 이러한 라이브러리에 대한 API는, 가속기(들)를 이용하기 위해 기존의 애플리케이션들을 수정하는 데 요구되는 노력의 양을 감소시키기 위해 기존의 희소 행렬 라이브러리들과 가능한 한 유사할 수 있다. 라이브러리 기반 인터페이스의 또 다른 이점은, 그러한 인터페이스가 가속기의 세부 사항들 및 그 데이터 포맷들을 숨겨 실행 시간에 올바른 버전의 라이브러리를 동적으로 링크함으로써 상이한 구현들을 프로그램들이 이용할 수 있게 한다는 것이다. 라이브러리들은 또한 스파크와 같은 분산형 컴퓨팅 환경들로부터 가속기들을 호출하도록 구현될 수 있다.
가속기 스택의 면적 및 전력 소비는 설계를 모듈들(메모리들, ALU들 등)로 분할하고 유사한 구조들의 14 nm 설계들로부터 데이터를 수집함으로써 추정될 수 있다. 10 nm 프로세스로 규모조정하기 위해, Cdyn에서의 25 % 감소 및 누설 전력에서의 20 % 감소와 함께 면적에서의 50 % 감소가 가정될 수 있다. 면적 추정들은 모든 온-칩 메모리들 및 ALU들을 포함한다. 와이어들은 논리/메모리들 위로 이어지는 것으로 가정된다. 전력 추정들은 ALU들 및 메모리들에 대한 활성 에너지, 메모리들에 대한 누설 전력, 및 주요 네트워크들에 대한 와이어 전력을 포함한다. 1 GHz의 기준 클록 비율이 가정되었고, 14 nm 및 10 nm 프로세스들 둘 모두에서 0.65 V의 공급 전압이 가정되었다. 위에 언급된 바와 같이, ALU들은 기준 클록 비율의 절반에서 실행될 수 있고, 이는 전력 투영들에서 고려되었다. KTI 링크들 및 스택 간 네트워크들은, 가속기가 계산들을 수행하고 있을 때 유휴이거나 거의 유휴일 것으로 예상되며, 따라서 전력 추정들에 포함되지 않았다. 일 구현은 이러한 네트워크들에 대한 활동을 추적하고 이들을 전력 추정들에 포함시킨다.
추정들은, 본원에서 설명되는 바와 같은 가속기가 14 nm 프로세스에서 칩 면적 중 17 mm2를 그리고 10 nm 프로세스에서 8.5 mm2를 점유할 것으로 예측하며, 대부분의 칩 면적은 메모리들에 의해 점유된다. 도 96은 64개의 내적 엔진들(8420), 8개의 벡터 캐시들(8415), 및 통합된 메모리 제어기(8410)를 포함하는, WIO3 DRAM 스택 아래에 놓이도록 의도된 가속기에 대한 잠재적 레이아웃을 도시한다. 도시된 DRAM 스택 I/O 범프들(9601, 9602)의 크기 및 배치는 WIO3 표준에 의해 특정되고, 가속기 논리는 그 범프들 사이의 공간에 맞다. 그러나, 어셈블리의 용이성을 위해, DRAM 스택 아래의 논리 다이는 적어도 DRAM 다이만큼 커야 한다. 따라서, 실제 가속기 칩은 대략적으로 8 mm - 10 mm일 것이지만, 대부분의 면적이 사용되지 않을 것이다. 일 구현에서, 이러한 미사용 면적은 상이한 유형들의 대역폭 제한된 애플리케이션들에 대한 가속기들에 사용될 수 있다.
스택형 DRAM들은, 그 명칭에서 연상되는 바와 같이, DDR4 DIMM들과 같은 종래의 DRAM 모듈들보다 더 높은 대역폭, 컴퓨팅 다이와의 더 엄격한 물리적 통합, 및 더 낮은 에너지/비트를 전달하기 위해 다수의 DRAM 다이를 수직으로 스태킹하는 메모리 기술이다. 도 97의 표는 다음의 7개의 DRAM 기술들을 비교한다: 비-스택형 DDR4 및 LPDDR4, 피코 모듈들, JEDEC-표준 고대역폭(HBM2) 및 와이드 I/O(WIO3) 스택들, 스택형 DRAM, 및 다이-통합형 RAM(DiRAM).
스택형 DRAM들은, 온-다이 및 다이-옆(beside-die)의 2가지 종류로 이루어진다. 도 98a에 예시된 바와 같이, 온-다이 스택들(8301-8304)은 규소 관통 비아들을 사용하여 논리 다이 또는 SoC(8305)에 직접 연결된다. 대조적으로, 도 98b에 도시된 다이-옆 스택들(8301-8304)은 규소 인터포저 또는 브릿지(9802) 상의 논리/SoC 다이(8305) 옆에 배치되며, DRAM과 논리 다이 사이의 연결부들이 인터포저(9802) 및 인터페이스 층(9801)을 통해 이어진다. 온-다이 DRAM 스택들은 이들이 다이-옆 스택들보다 더 작은 패키지들을 허용한다는 이점이 있지만, 하나 초과의 스택을 논리 다이에 부착하기 어렵다는 단점이 있어서, 이들이 다이당 제공할 수 있는 메모리의 양이 제한된다. 대조적으로, 규소 인터포저(9802)의 사용은, 비록 약간의 면적 비용이 있긴 하지만, 논리 다이가 다수의 다이-옆 스택들과 통신할 수 있게 한다.
DRAM의 2개의 중요한 특성은 스택당 대역폭과 비트당 에너지이며, 그 이유는, 이들이 패키지에 맞는 대역폭과 그 대역폭을 소비하는 데 요구되는 전력을 정의하기 때문이다. 이러한 특성들은, 피코 모듈들이 충분한 대역폭을 제공하지 않고 HBM2의 에너지/비트가 전력 소비를 상당히 증가시킬 수 있기 때문에, WIO3, ITRI, 및 DiRAM을 본원에서 설명된 바와 같은 가속기에 대한 가장 유망한 기술들이게 한다.
이들 3가지 기술들 중에서, DiRAM은 가장 높은 대역폭 및 용량뿐만 아니라 가장 낮은 레이턴시를 가지며, 이는 DiRAM을 극도로 매력적이게 한다. WIO3은 이것이 JEDEC 표준이 된다고 가정하면, 또 다른 유망한 옵션이며, 양호한 대역폭 및 용량을 제공한다. ITRI 메모리는 셋 중에 가장 낮은 에너지/비트를 가지므로, 더 많은 대역폭이 주어진 전력 예산에 맞을 수 있게 한다. ITRI 메모리는 또한 낮은 레이턴시를 갖고, 그의 SRAM형 인터페이스는 가속기의 메모리 제어기의 복잡도를 감소시킬 것이다. 그러나, ITRI RAM은, 그 설계가 성능을 위해 용량을 트레이드 오프함에 따라 셋 중에 가장 낮은 용량을 갖는다.
본원에서 설명된 가속기는 코어 희소 행렬 벡터 곱셈(SpMV) 프리미티브에 기반하여 구축된 데이터 분석 및 기계 학습 알고리즘들을 처리하도록 설계된다. SpMV는 종종 이러한 알고리즘들의 실행시간에 우세하지만, 이들을 구현하기 위해 다른 연산들이 또한 요구된다.
예로서, 도 99에 도시된 너비-우선 검색(BFS) 리스팅을 고려한다. 이러한 예에서, 작업의 대부분은 라인 4 상의 SpMV에 의해 수행되지만, 벡터-벡터 감산(라인 8), 내적 연산(라인 9), 및 데이터-병렬 맵 연산(라인 6)이 또한 존재한다. 벡터 감산 및 내적은 벡터 ISA들에서 일반적으로 지원되는 비교적 간단한 연산들이어서, 설명을 거의 필요로 하지 않는다.
대조적으로, 데이터-병렬 맵 연산은 훨씬 더 흥미로운데, 그 이유는, 그 연산이 개념적 구성요소별 연산에 프로그래밍가능성을 도입하기 때문이다. BFS 예는 일 구현의 맵 기능성에 의해 제공되는 프로그래밍가능성을 시연한다. 특히, BFS에서의 람다 함수(도 99의 라인 6 참조)는 정점이 처음 방문된 때를 파악하는 데 사용된다. 이는, 일 구현에서, 람다 함수에 2개의 어레이와 하나의 스칼라로 전달함으로써 행해진다. 람다 함수로 전달된 제1 어레이는 SpMV 연산의 출력이고, 어느 정점들이 현재 도달가능한지를 반영한다. 제2 어레이는 각각의 정점의 엔트리를 가지며, 그 엔트리의 값은 정점이 처음으로 보이는 반복 횟수이거나 정점이 아직 도달되지 않은 경우에는 0이다. 람다 함수로 전달되는 스칼라는 단순히 루프 반복 계수기이다. 일 구현에서, 람다 함수는, 출력 벡터를 생성하기 위해 입력 벡터의 각각의 요소에 대해 수행되는 스칼라 연산들의 시퀀스로 컴파일된다.
BFS에 대한 연산들의 시퀀스의 중간 표현(IR)이 도 99에 예시된다. BFS 람다 IR은 몇몇 흥미로운 특성들을 시연한다. 생성된 람다 코드는 단지 단일 기본 블록만을 갖도록 보장된다. 일 구현은, 람다 함수에서의 반복적인 구성들을 방지하고, 제어 흐름을 피하기 위해 if-변환을 수행한다. 이러한 제약은 일반적인 제어 흐름을 지원할 필요가 없으므로 람다를 실행하는 데 사용되는 계산 구조의 복잡도를 상당히 감소시킨다.
모든 메모리 연산들은 기본 블록의 시작에서 수행된다(도 99의 라인 2 내지 라인 4). 어셈블리로 변환될 때, 메모리 연산들은 코드렛(codelet)의 프리앰블로 호이스팅(hoist)된다(라인 2 내지 라인 5).
람다 함수들을 이용하는 가속기로 구현된 기준점들에 대한 통계 평가가 수행되었다. 명령어들의 수가 기록되고, 레지스터들의 총 수 및 로드들의 총 수가 기록되어 관심 있는 다양한 람다 함수들의 "복잡도"를 정량화하였다. 게다가, 임계 경로 길이는 각각의 람다 함수의 종속 명령어들의 가장 긴 체인을 반영한다. 명령어들의 수가 임계 경로보다 상당히 더 길 때, 명령어-레벨 병렬성 기법들이 성능을 증가시키기 위한 적용가능한 해결책이다. 일부 로드들은 주어진 맵 호출 또는 감소 호출에 대해 불변이다(람다 함수의 모든 실행들이 동일한 값을 로딩할 것임). 이러한 상황은 "람다 불변 로드"로 지칭되고, 이를 검출하기 위해 분석이 수행된다.
분석된 결과들에 기반하여, 비교적 작은 명령어 저장소가 필요하고, 람다 함수들의 실행을 지원하는 레지스터 파일이 필요하다. 동시성(다수의 람다 함수들의 인터리빙 실행)을 증가시키는 기법들은 레지스터 파일의 크기 및 복잡도를 증가시키지만, 기준선 설계는 16개만큼 적은 엔트리를 가질 수 있다. 더욱이, 비교 및 조건부 이동 연산들과 함께 사용하기 위해 단일 비트 술어 레지스터 파일이 또한 제공되는 경우, 모든 연산들에 대해 2R1W 레지스터 파일이 충분해야 한다.
아래에 설명되는 바와 같이, 람다 불변 로드들은 수집 엔진들에서 실행될 것이어서, 그러한 로드들은 람다 함수들의 호출당 한 번만 수행된다. 이러한 로드들에 의해 반환되는 값들은, 필요에 따라 람다 데이터 경로의 로컬 레지스터 파일 내로 판독될 수 있도록 처리 요소로 전달될 것이다.
일 구현에서, 람다 함수의 실행은, 각각의 유닛의 상이한 능력들을 활용하기 위해 수집 엔진들과 프로세서 요소(PE)들(예컨대, 위에 설명된 바와 같은 내적 엔진들) 사이에 분할된다. 람다 함수들은 상수들, 스칼라, 및 벡터의 3가지 유형의 인수들을 갖는다. 상수들은 컴파일 시간에 값이 결정될 수 있는 인수들이다. 스칼라 인수들은 위에 설명된 람다 불변 로드들에 대응하고, 람다 함수의 호출들 사이에서 값이 변하는 인수들이지만, 주어진 람다 함수가 연산하는 요소들 모두에 걸쳐 일정하게 유지된다. 벡터 인수들은 람다 함수가 처리하는 데이터의 어레이들이며, 함수 내의 명령어들이 벡터 인수들 내의 각각의 요소에 적용된다.
일 구현에서, 람다 함수는, 함수를 구현하는 코드, 함수가 참조하는 임의의 상수들, 및 그의 입력 및 출력 변수들에 대한 포인터들을 포함하는 기술어 데이터 구조에 의해 특정된다. 람다 함수를 실행하기 위해, 최상위 레벨 제어기는 하나 이상의 수집 엔진에 명령을 전송하고, 그 명령은, 람다 함수의 기술어, 및 수집 엔진과 그의 연관된 PE가 처리할 함수의 벡터 인수들의 부분들의 시작 및 끝 색인들을 특정한다.
수집 엔진이 람다 함수를 실행하라는 명령을 수신할 때, 수집 엔진은 함수의 기술어를 메모리로부터 페치하고, 함수의 스칼라 인수들의 어드레스들을 포함하는 기술어의 마지막 섹션에 도달할 때까지 자신의 연관된 PE에 기술어를 전달한다. 그런 다음, 수집 엔진은 메모리로부터 함수의 스칼라 인수들 각각을 페치하고, 기술어의 각각의 인수의 어드레스를 스칼라 인수의 값으로 대체하고, 수정된 기술어를 PE에 전달한다.
PE가 자신의 수집 엔진으로부터 함수 기술어의 시작을 수신할 때, PE는 함수의 벡터 입력들의 어드레스들을 제어 레지스터들로 복사하고, PE의 페치 하드웨어는 벡터 입력들의 페이지들을 PE의 로컬 버퍼들에 로딩하기 시작한다. 그런 다음, PE는 람다 함수를 구현하는 명령어들 각각을 디코딩하고, 그 결과들을 작은 디코딩된 명령어 버퍼에 저장한다. 그런 다음, PE는 함수의 스칼라 인수들의 값들이 자신의 수집 엔진으로부터 도달하기를 대기하고, 함수의 벡터 인수들 각각의 제1 번째 페이지가 메모리로부터 도달하기를 대기한다. 일단 함수의 인수들이 도달하면, PE는, 함수의 입력 벡터들의 범위 내의 각각의 요소에 람다 함수를 적용하기 시작하는데, 이는, 요구되는 경우 입력 데이터를 페이지들을 페치하고 출력 값들의 페이지들을 라이트백하기 위해 PE의 페치 및 라이트백 하드웨어에 의존한다. PE가 자신의 배정된 데이터 범위의 끝에 도달할 때, PE는, 자신이 완료되었고 다른 연산을 시작할 준비가 되었음을 최상위 레벨 제어기에 시그널링한다.
도 100은 일 구현에 따라 람다 함수들을 특정하는 데 사용되는 기술어들의 포맷을 도시한다. 특히, 도 100은 메모리(10001)에서의 람다 기술어 포맷 및 PE(10002)에 전달되는 람다 포맷 기술어를 도시한다. 명령어들을 제외한 기술어에서의 모든 필드들은 64 비트 값들이다. 명령어들은 32 비트 값들이고, 2개가 패킹되어 64 비트 워드가 된다. 기술어는, 스칼라 인수들이 마지막에 나타나도록 조직화되어, 수집 엔진이 메모리로부터 스칼라 인수들을 페치하기 전에 스칼라 인수들 이외의 모든 것을 PE에 전달할 수 있게 한다. 이는, PE가, 수집 엔진이 스칼라 인수들을 페치하기를 대기하면서 함수의 명령어들을 디코딩하여 함수의 벡터 인수들을 페치하기 시작하는 것을 가능하게 한다. 람다 함수의 기술어 및 스칼라 인수들은, 람다 함수가 다수의 수집 엔진/PE 쌍들에 걸쳐 분산될 때 중복 DRAM 액세스들을 제거하기 위해 벡터 캐시들을 통해 페치된다. 예시된 바와 같이, 메모리(10001)에서의 람다 기술어 포맷은 스칼라 인수에 대한 포인터(10003)를 포함할 수 있는 반면, 수집 엔진은 PE(10002)로 전달되는 람다 기술어 포맷에서 스칼라 인수의 값(10004)을 페치한다.
일 구현에서, 각각의 기술어의 제1 워드는 기술어 내의 각각의 워드의 의미를 특정하는 헤더이다. 도 101에 도시된 바와 같이, 헤더 워드의 하위 6 바이트는, 람다 함수에 대한 벡터 인수들의 수(10101), 상수 인수들의 수(10102), 벡터 및 스칼라 출력들의 수(10103-10104), 함수 내의 명령어들의 수(10105), 및 함수 내의 스칼라 인수들의 수(10106)(각각의 유형의 데이터가 기술어에서 나타나는 곳과 매칭하도록 순서화됨)를 특정한다. 헤더 워드의 제7 바이트는 함수의 코드 내의 루프 시작 명령어(즉, 하드웨어가 처음 이후 각각의 반복을 시작해야 하는 명령어)의 위치(10107)를 특정한다. 워드 내의 고차 바이트는 사용되지 않는다(10108). 나머지 워드들은 도면에 도시된 순서로, 함수의 명령어들, 상수들, 및 입력 및 출력 어드레스들을 포함한다.
람다 함수들을 지원하기 위해 수집 엔진 데이터 경로에 대해 어떠한 변경들도 요구되지 않는데, 그 이유는, 모든 필요한 연산들이 제어 논리를 수정함으로써 지원될 수 있기 때문이다. 수집 엔진이 메모리로부터 람다 기술어를 페치할 때, 수집 엔진은 기술어의 라인들을 벡터 요소 라인 버퍼들 및 열 기술어 버퍼 둘 모두에 복사할 것이다. 스칼라 인수들의 어드레스들을 포함하지 않는 기술어 라인들은 수정되지 않은 채 PE에 전달될 것인 반면, 스칼라 인수들의 어드레스들을 포함하는 기술어 라인들은, 스칼라 인수들의 값들이 메모리로부터 페치되어 그 어드레스들 대신 라인 버퍼들에 삽입될 때까지 버퍼들에 남아 있을 것이다. 기존의 수집 및 계류 응답 버퍼 하드웨어는 변경들 없이 이러한 연산을 지원할 수 있다.
람다 함수들을 지원하기 위한 처리 요소에 대한 변경들
일 구현에서, 람다 함수들을 지원하기 위해, 위에 설명된 행렬 값들의 버퍼(9105), 행렬 색인들의 버퍼(9103) 및 벡터 값들의 버퍼(9104)를 도시하는 도 102에 예시된 바와 같이, 별개의 데이터 경로가 PE에 부가된다. PE의 버퍼들이 동일하게 유지되지만, 그들의 명칭들은 입력 버퍼 1, 입력 버퍼 2, 및 입력 버퍼 3으로 변경되어 본 구현에서의 그들의 더 일반적인 사용들을 반영한다. SpMV 데이터 경로(9110)는 또한 기준 아키텍처로부터 변경되지 않은 채로 유지된다. 람다 함수로서 SpMV를 구현하는 것이 가능할 것이지만, 전용 하드웨어(10201)를 구축하는 것은 전력을 감소시키고 SpMV에 대한 성능을 향상시킨다. SpMV 데이터 경로(9110) 및 람다 데이터 경로(10201)로부터의 결과들은 출력 버퍼(10202)에 그리고 궁극적으로는 시스템 메모리에 전송된다.
도 103은 람다 데이터 경로의 일 구현의 세부사항들을 예시하며, 람다 데이터 경로는, 술어 레지스터 파일(10301), 레지스터 파일(10302), 디코딩 논리(10303), 디코딩된 명령어 버퍼(10305)를 포함하고, 로드-저장 ISA를 구현하는 순차적 실행 파이프라인(10304)을 중심으로 한다. 단일 송출 실행 파이프라인이 충분한 성능을 제공하는 데 실패하는 경우, 람다 연산들에 내재된 데이터 병렬성을 이용할 수 있고, 실행 파이프라인을 벡터화하여 다수의 벡터 요소들을 병렬로 처리할 수 있으며, 이는 개별 람다 함수들에서 ILP를 활용하는 것보다 병렬성을 개선하기 위해 더 에너지 효율적인 방식이어야 한다. 실행 파이프라인은 자신의 입력들을 16-32개의 엔트리 레지스터 파일(10302)로부터 판독하여 결과들을 다시 그 레지스터 파일에 기입하며, 레지스터당 64 비트를 갖는다. 하드웨어는 정수 레지스터와 부동 소수점 레지스터를 구별하지 않고, 임의의 레지스터가 임의의 유형의 데이터를 보유할 수 있다. 술어 레지스터 파일(10301)은 명령어 실행을 서술하는 데 사용되는 비교 연산들의 출력을 보유한다. 일 구현에서, 람다 데이터 경로(10304)는 브랜치 명령어들을 지원하지 않으므로, 임의의 조건부 실행은 서술식 명령어들을 통해 행해져야 한다.
각각의 람다 함수의 시작에서, 수집 엔진은 입력 버퍼 3(9104)(벡터 값들의 버퍼)에 함수의 명령어들을 배치한다. 그런 다음, 디코딩 논리(10303)는 각각의 명령어를 순차적으로 디코딩하여, 결과들을 32-엔트리 디코딩된 명령어 버퍼(10305)에 배치한다. 이는, 루프1의 매 반복마다 각각의 명령어를 반복적으로 디코딩하는 에너지 비용을 절감한다.
람다 데이터 경로는 4개의 특수 제어 레지스터(10306)를 포함한다. 색인 계수기 레지스터는, 람다 데이터 경로가 현재 처리 중인 벡터 요소들의 색인을 보유하고, 람다의 각각의 반복의 끝에서 자동으로 증분된다. 마지막 색인 레지스터는 PE가 처리할 것으로 예상되는 마지막 벡터 요소의 색인을 보유한다. 루프 시작 레지스터는 람다 함수의 반복되는 부분에서 제1 명령어의 디코딩된 명령어 버퍼에서의 위치를 보유하는 반면, 루프 끝 레지스터는 람다 함수의 마지막 명령어의 위치를 보유한다.
람다 함수의 실행은 디코딩된 명령어 버퍼 내의 제1 명령어로 시작하고, 루프 끝 레지스터가 가리키는 명령어에 파이프라인이 도달할 때까지 진행한다. 그 시점에서, 파이프라인은 색인 계수기 레지스터의 값을 마지막 색인 레지스터의 값과 비교하고, 색인 계수기가 마지막 색인보다 작은 경우에 루프 시작 레지스터가 가리키는 명령어로 다시 암시적 브랜치를 행한다. 색인 계수기 레지스터가 각각의 반복의 끝에서만 증분되므로, 이러한 검사는 파이프라인에서의 버블들을 회피하기 위해 미리 행해질 수 있다.
이러한 방식은 람다 함수의 제1 반복에서만 실행될 필요가 있는 "프리앰블" 명령어들만을 포함하는 것을 용이하게 한다. 예컨대, 2개의 스칼라 및 하나의 상수 입력을 갖는 람다 함수가 3개의 로드 명령어로 시작되어, 그 입력들의 값들을 레지스터 파일로 페치하고, 디코딩된 명령어 버퍼 내의 제4 명령어를 가리키도록 루프 시작 레지스터를 설정하여, 입력들이 함수의 각각의 반복마다가 아니라 한 번만 판독될 수 있다.
일 구현에서, 람다 데이터 경로는 많은 RISC 프로세서들과 유사한 로드-저장 ISA를 실행한다. 람다 데이터 경로 로드 및 저장 명령어들은 PE의 SRAM 버퍼들 내의 위치들을 참조한다. SRAM 버퍼들과 DRAM 사이에서의 모든 데이터 전송들은 PE의 페치 및 라이트백 하드웨어에 의해 관리된다. 람다 데이터 경로는, 스칼라 및 요소의 2가지 유형의 로드 명령어들을 지원한다. 스칼라 로드들은 SRAM 버퍼들 중 하나에서의 특정된 위치의 콘텐츠들을 페치하고 그것을 레지스터에 배치한다. 람다 함수의 스칼라 로드 명령어들의 대부분이 함수의 프리앰블에서 발생할 것으로 예상되지만, 레지스터 압력은 때때로 스칼라 로드들이 루프 본체들에 배치될 것을 요구할 수 있다.
요소 로드들은 람다 함수의 입력 벡터들의 요소들을 페치한다. PE는 각각의 버퍼에 대한 컴퓨팅 포인터를 유지할 것이며, 그 포인터는, 그 버퍼에 맵핑되는 제1 입력 벡터의 현재 요소를 가리킨다. 요소 로드들은 대상 버퍼 및 컴퓨팅 포인터로부터의 오프셋을 특정한다. 요소 명령어가 실행될 때, 하드웨어는 컴퓨팅 포인터의 값에 그 특정된 오프셋을 적절한 버퍼의 크기를 모듈로 가산하고, 그 위치로부터의 데이터를 레지스터에 로딩한다. 요소 저장 명령어들은 유사하지만, PE의 출력 버퍼(10202) 내의 적절한 어드레스에 데이터를 기입한다.
이러한 접근법은 다수의 입력 및 출력 벡터들이 PE의 기존의 페치 하드웨어로 지원될 수 있게 한다. 입력 벡터들은 람다 함수의 기술어에 의해 특정된 순서로 입력 버퍼 1(9105)과 입력 버퍼 2(9103) 사이에서 교번하고, 페치 하드웨어는 각각의 벡터의 전체 페이지들을 한 번에 버퍼들 내로 판독한다.
예로서, 3개의 입력 벡터 A, B, 및 C를 갖는 함수를 고려한다. 입력 벡터 A는 0의 오프셋으로 PE의 입력 버퍼 1(9105) 상에 맵핑될 것이다. 입력 B는 다시 0의 오프셋으로 입력 버퍼 2(9103) 상에 맵핑될 것이다. 입력 C는 (Tezzaron-방식의 256 바이트 페이지들을 가정하면) 256의 오프셋으로 입력 버퍼 1(9105) 상에 맵핑될 것이다. PE의 페치 하드웨어는 입력들 A 및 C의 페이지들을 입력 버퍼 1(9105)로 인터리빙할 것인 한편, 입력 버퍼 2(9103)는 입력 B의 페이지들로 채워질 것이다. 람다 함수의 각각의 반복은, 0의 오프셋으로 버퍼 1(9105)로부터 요소 로드를 실행함으로써 입력 A의 적절한 요소를 페치할 것이고, 0의 오프셋으로의 버퍼 2(9103)로부터의 요소 로드로 입력 B의 적절한 요소를 페치할 것이고, 256의 오프셋으로의 버퍼 1(9105)로부터의 요소 로드로 자신의 입력 C의 요소를 페치할 것이다. 각각의 반복의 끝에서, 하드웨어는 각각의 입력 벡터의 다음 요소로 넘어가도록 컴퓨팅 포인터를 증분할 것이다. 컴퓨팅 포인터가 페이지의 끝에 도달할 때, 하드웨어는, 버퍼의 제1 입력 벡터의 다음 페이지의 제1 요소로 컴퓨팅 포인터가 넘어가도록, (페이지 크기 * (페이지 상에 맵핑된 벡터 입력들의 수 - 1)) 바이트만큼 컴퓨팅 포인터를 증분시킬 것이다. 다수의 출력 벡터를 생성하는 람다 함수들을 처리하기 위해 유사한 방식이 사용될 것이다.
도 104에 예시된 바와 같이, 일 구현에서, 8 비트가 연산코드(10401)에 전용된다. 나머지 24 비트는 단일 목적지(10402)와 3개의 입력 피연산자(10403-10405) 사이에 분할되며, 이는, 6 비트 레지스터 특정자(specifier)들을 초래한다. 일 구현에서 제어 흐름 명령어들이 사용되지 않고 상수들이 보조 레지스터 파일로부터 소싱됨에 따라, 비트 할당 아크로바틱들은 명령어 워드에서의 큰 즉치(immediate)에 맞도록 요구되지 않는다. 일 구현에서, 모든 명령어들은 도 104에 제시된 명령어 인코딩에 적합하다. 하나의 특정 명령어 세트에 대한 인코딩들이 도 105에 예시된다.
일 구현에서, 비교 명령어들은 비교 술어를 사용한다. 예시적인 비교 술어들의 인코딩들이 도 106의 표에 열거된다.
위에 상세히 설명된 바와 같이, 일부 예시들에서, 주어진 태스크에 대해 가속기를 사용하는 것이 유리하다. 그러나, 실현가능하지 않고/거나 유리하지 않은 예시들이 존재할 수 있다. 예컨대, 가속기가 이용가능하지 않은 경우, 가속기로의 데이터의 이동이 너무 많은 불이익을 초래하는 경우, 가속기의 속도는 프로세서 코어보다 느린 경우 등이다. 그러므로, 일부 구현들에서, 부가적인 명령어들이 일부 태스크들에 대한 성능 및/또는 에너지 효율을 제공할 수 있다.
행렬 곱셈의 예가 도 109에 예시된다. 행렬 곱셈은 C[rowsA,colsB] += A[rowsA,comm]*B[comm,colsB]이다. MADD(곱셈 가산 명령어)에 관하여 본원에서 사용되는 바와 같이, colsB = 1을 설정함으로써 행렬*벡터 곱셈 명령어가 정의된다. 이러한 명령어는 행렬 입력 A, 벡터 입력 B를 취하여 벡터 출력 C를 생성한다. 512 비트 벡터들의 맥락에서, 배정밀도에 대해 rowsA=8이고 단정밀도(single-precision)에 대해 16이다.
대부분의 CPU들은 1차원 벡터들에 대해 동작하는 SIMD 명령어들을 통해 밀집 행렬 곱셈을 수행한다. 8*4, 8*8, 및 더 큰 크기의 2차원 행렬들(타일들)을 포함하도록 SIMD 접근법을 확장하는 명령어(및 기본 하드웨어)가 본원에서 상세히 설명된다. 이러한 명령어의 사용을 통해, 작은 행렬이 벡터와 곱해질 수 있고, 결과는 목적지 벡터에 가산된다. 모든 연산들이 하나의 명령어에서 수행되어, 많은 수의 곱셈-가산들에 걸쳐 명령어 및 데이터를 페치하는 에너지 비용들이 분할상환된다. 게다가, 일부 구현들은 이진 트리를 활용하여 합산(감소)을 수행하고/거나 입력 행렬을 레지스터들의 집합으로서 보유하기 위해 곱셈기 어레이에 내장된 레지스터 파일을 포함한다.
행렬 곱셈에 관하여, MADD 명령어의 실시예들의 실행은 다음을 컴퓨팅한다:
for (i=0; i<N; i++) // N= rowsA의 8개의 패킹된 데이터 요소 크기(예컨대, 벡터 길이)(예컨대, 8)
for (k=0; k<M; k++) // comm=M
C[i] += A[i,k]*B[k];
전형적으로, "A" 피연산자는 8개의 패킹된 데이터 레지스터들에 저장된다. "B" 피연산자는 하나의 패킹된 데이터 레지스터에 저장되거나 메모리로부터 판독될 수 있다. "C" 피연산자는 하나의 패킹된 데이터 레지스터에 저장된다.
이러한 명령어의 나머지 논의 전반에 걸쳐, "옥토MADD" 버전이 논의된다. 이러한 버전은, 8개의 패킹된 데이터 요소 소스(예컨대, 8개의 패킹된 데이터 레지스터)를 패킹된 데이터 요소 소스(예컨대, 단일 레지스터)와 곱한다. 내부 루프를 확장하는 것은 (옥토MADD 명령어의 경우) 순차적 구현을 위해 다음과 같은 실행을 제공한다:
for (i=0; i<8; i++) C[i] += A[i,0]*B[0] +
A[i,1]*B[1] +
A[i,2]*B[2] +
A[i,3]*B[3] +
A[i,4]*B[4] +
A[i,5]*B[5] +
A[i,6]*B[6] +
A[i,7]*B[7];
도시된 바와 같이, "A" 및 "B" 피연산자들의 대응하는 패킹된 데이터 요소 위치들로부터의 패킹된 데이터 요소의 각각의 곱셈 이후에 가산이 후속된다. 순차적 가산들은 최소의 임시 저장소를 이용하는 다수의 더 간단한 연산들로 분해된다.
일부 구현들에서, 이진 트리 접근법이 사용된다. 이진 트리는 2개의 서브-트리를 병렬로 합산한 다음 결과를 함께 가산함으로써 레이턴시를 최소화한다. 이는 전체 이진 트리에 재귀적으로 적용된다. 최종 결과는 "C" 목적지 피연산자에 가산된다.
내부 루프를 확장하는 것은 (옥토MADD 명령어의 경우) 이진 구현을 위해 다음과 같은 실행을 제공한다:
for (i=0; i<8; i++)
C[i] += ((A[i,0]*B[0] + A[i,1]*B[1]) +
(A[i,2]*B[2] + A[i,3]*B[3])) +
((A[i,4]*B[4] +A[i,5]*B[5]) +
(A[i,6]*B[6] +A[i,7]*B[7]));
도 110은 이진 트리 감소 네트워크를 이용한 옥토MADD 명령어 연산을 예시한다. 도면은 연산의 하나의 벡터 레인을 도시한다. 512 비트 벡터들을 이용하면, 배정밀도 옥토MADD는 8개의 레인을 갖는 반면, 단정밀도 옥토MADD는 16개의 레인을 갖는다.
예시된 바와 같이, 복수의 곱셈 회로들(11001-11015)은 각각, A[i,0]*B[0], A[i,1]*B[1], A[i,2]*B[2], A[i,3]*B[3], A[i,4]*B[4], A[i,5]*B[5], A[i,6]*B[6], 및 A[i,7]*B[7]의 곱셈들을 수행한다. 이러한 예에서, i는 A 레지스터이다. 전형적으로, 곱셈들은 병렬로 수행된다.
곱셈 회로들(11001-11015)에는, 곱셈 회로들(11001-11015)의 결과들을 가산하는 합산 회로들(11017-11023)이 결합된다. 예컨대, 합산 회로들은 A[i,0]*B[0] + A[i,1]*B[1], A[i,2]*B[2] + A[i,3]*B[3], A[i,4]*B[4] + A[i,5]*B[5], 및 A[i,6]*B[6] + A[i,7]*B[7]을 수행한다. 전형적으로, 합산들은 병렬로 수행된다.
초기 합산들의 결과들은 합산 회로(11025)를 사용하여 합산되고 함께 가산된다. 이러한 가산의 결과는 목적지에 저장될 새로운 값(11033)을 생성하기 위해 합산 회로(11027)에 의해 목적지로부터의 원래의(오래된) 값(11031)에 가산된다.
대부분의 구현들에서, 명령어는, 8개의 독립적인 소스 레지스터에 더하여 다른 소스 및 레지스터 목적지에 대한 레지스터 또는 메모리 피연산자를 특정할 수 없다. 따라서, 일부 예시들에서, 옥토MADD 명령어는 행렬 피연산자에 대한 8개의 레지스터들의 제한된 범위를 특정한다. 예컨대, 옥토MADD 행렬 피연산자는 레지스터들 0-7일 수 있다. 일부 실시예들에서, 제1 레지스터가 특정되고, 제1 레지스터에 대한 연속적인 레지스터들이 부가적인(예컨대, 7개) 레지스터들이다.
도 111은 곱셈 가산 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
11101에서, 명령어가 페치된다. 예컨대, 곱셈 가산 명령어가 페치된다. 곱셈 가산 명령어는 연산코드, 제1 패킹된 데이터 피연산자(메모리 또는 레지스터)에 대한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자에 대한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 포함한다. 일부 실시예들에서, 곱셈 가산 명령어는 기입마스크 피연산자를 포함한다. 일부 실시예들에서, 명령어는 명령어 캐시로부터 페치된다.
11103에서, 페치된 명령어가 디코딩된다. 예컨대, 페치된 곱셈 가산 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
11105에서, 디코딩된 명령어의 소스 피연산자들과 연관된 데이터 값들이 검색된다. 곱셈 가산 명령어들의 시퀀스를 실행할 때 주 레지스터 파일로부터 이러한 값들을 반복적으로 판독할 필요성을 피하기 위해, 이러한 레지스터들의 사본이 곱셈기-가산기 어레이 자체에 내장된다(아래에서 상세히 설명됨). 사본은 주 레지스터 파일의 캐시로서 유지된다.
11107에서, 디코딩된 명령어는 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 제2 내지 N개의 패킹된 데이터 소스 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 1) 그 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 목적지의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치에 저장한다. N은 전형적으로 연산코드 또는 프리픽스로 표시된다. 예컨대, 옥토MADD에 대해, N은 (A에 대해 8개의 레지스터가 존재하도록) 9이다. 곱셈들은 병렬로 수행될 수 있다.
11109에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
도 112는 곱셈 가산 명령어를 처리하기 위해 프로세서에 의해 수행되는 방법의 실시예를 예시한다.
11201에서, 명령어가 페치된다. 예컨대, 곱셈 가산 명령어가 페치된다. 융합된 곱셈 가산 명령어는 연산코드, 제1 패킹된 데이터 피연산자(메모리 또는 레지스터)에 대한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자에 대한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 포함한다. 일부 실시예들에서, 융합된 곱셈 가산 명령어는 기입마스크 피연산자를 포함한다. 일부 실시예들에서, 명령어는 명령어 캐시로부터 페치된다.
11203에서, 페치된 명령어가 디코딩된다. 예컨대, 페치된 곱셈 가산 명령어는 본원에서 상세히 설명된 것과 같은 디코딩 회로에 의해 디코딩된다.
11205에서, 디코딩된 명령어의 소스 피연산자들과 연관된 데이터 값들이 검색된다. 곱셈 가산 명령어들의 시퀀스를 실행할 때 주 레지스터 파일로부터 이러한 값들을 반복적으로 판독할 필요성을 피하기 위해, 이러한 레지스터들의 사본이 곱셈기-가산기 어레이 자체에 내장된다(아래에서 상세히 설명됨). 사본은 주 레지스터 파일의 캐시로서 유지된다.
11207에서, 디코딩된 명령어는 본원에서 상세히 설명된 것과 같은 실행 회로(하드웨어)에 의해 실행되어, 제2 내지 N개의 패킹된 데이터 소스 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 1) 그 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 쌍으로 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 목적지의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치에 저장한다. N은 전형적으로 연산코드 또는 프리픽스로 표시된다. 예컨대, 옥토MADD에 대해, N은 (A에 대해 8개의 레지스터가 존재하도록) 9이다. 곱셈들은 병렬로 수행될 수 있다.
11209에서, 일부 실시예들에서는, 명령어가 커밋되거나 퇴거된다.
일부 구현들에서, MADD 명령어에 처음 직면할 때, 재명명기(renamer)는, 주 레지스터들을 캐시에 복사하기 위해 마이크로-연산들을 도입함으로써 주 레지스터 파일과 캐싱된 사본을 동기화한다. 후속 MADD 명령어들은, 변경되지 않은 채로 유지되는 한 캐싱된 사본들을 계속 사용한다. 일부 구현들은 옥토MADD 명령어에 의한 제한된 범위의 레지스터들의 사용을 예측하고, 레지스터 값들이 생성될 때 주 레지스터 파일 및 캐싱된 사본 둘 모두에 기입들을 브로드캐스팅한다.
도 113a-c는 MADD 명령어를 수행하기 위한 예시적인 하드웨어를 예시한다. 도 113a는 MADD 명령어를 실행하는 구성요소들을 도시한다. 도 113b는 이러한 구성요소들의 하위 세트를 도시한다. 특히, 복수의 곱셈 회로들(11323)은, 소스 레지스터들의 패킹된 데이터 요소들을 곱하는 데 사용되며, 각각의 곱셈 회로(11323)는 합산 회로(11327)에 결합된다. 각각의 합산 회로는 체인 방식으로 합산 회로(11327)를 피딩한다. 선택기(11321)는 합산 회로의 피드백 또는 외부 입력 사이에서 선택하는 데 사용된다. 레지스터 파일은 레지스터 파일 및 판독 다중화기(11325)의 일부로서 다중 가산기 어레이 내에 내장된다. 특정 레지스터들은 곱셈기-가산기들의 각각의 열에 하드와이어링된다.
도 113b는 레지스터 파일 및 판독 다중화기(11325)를 도시한다. 레지스터 파일(11327)은 캐시로서 A를 저장하는 복수의 레지스터들(예컨대, 4개 또는 8개의 레지스터)이다. 올바른 레지스터는 판독 다중화기(11329)를 사용하여 선택된다.
옥토MADD 명령어의 예상되는 사용은 다음과 같다:
// C += A*B를 컴퓨팅함
//A는 REG0-7에서 8*8 타일로서 로딩됨
//B는 메모리로부터 1*8 타일로서 로딩됨
//C가 로딩되어 REG 8-31에 24*8 타일로서 저장됨
for (outer loop) {
load [24,8] tile of C matrix into REG 8-31 // 24회 로드들
for (middle loop) {
load [8,8] tile of A matrix into REG 0-7 // 8회 로드들
for (inner loop) {
// 24회 반복들
REG [8-31 from inner loop] += REG 0-7 * memory[inner loop];
// 1회 로드
}
}
store [24,8] tile of C matrix from REG8-31 // 24회 저장들
}
내부 루프는 24개의 옥토MADD 명령어를 포함한다. 각각은 메모리 및 합으로부터 하나의 "B" 피연산자를 판독하고 24개의 "C" 누산기들 중 하나에 합산한다. 중간 루프는 8개의 "A" 레지스터들을 새로운 타일로 로딩한다. 외부 루프는 24개의 "C" 누산기를 로딩하여 저장한다. 내부 루프가 언롤링되고 프리페치가 부가되어 옥토MADD 하드웨어의 높은 활용률(>90%)이 달성될 수 있다.
아래의 도면들은 위의 실시예들을 구현하기 위한 예시적인 아키텍처들 및 시스템들을 상세히 설명한다. 특히, (비-순차, 스칼라, SIMD와 같은) 위에 논의된 코어 유형들의 양상들(예컨대, 레지스터들, 파이프라인들 등)이 설명된다. 부가적으로, 시스템들 및 시스템-온-칩 구현들이 코프로세서들(예컨대, 가속기들, 코어들)을 포함하는 것으로 도시된다. 일부 실시예들에서, 위에서 설명된 하나 이상의 하드웨어 구성요소 및/또는 명령어는 아래에 상세히 설명되는 바와 같이 에뮬레이팅되거나 소프트웨어 모듈들로서 구현된다.
예시적인 레지스터 아키텍처
도 125는 본 발명의 일 실시예에 따른 레지스터 아키텍처(12500)의 블록도이다. 예시된 실시예에서, 512 비트 폭인 32개의 벡터 레지스터(12510)가 존재하며, 이러한 레지스터들은 zmm0 내지 zmm31로서 참조된다. 하위 16개의 zmm 레지스터들의 하위 차수 256 비트는 레지스터들(ymm0-16) 상에 중첩된다. 하위 16개의 zmm 레지스터들의 하위 차수 128 비트(ymm 레지스터들의 하위 차수 128 비트)는 레지스터들(xmm0-15) 상에 중첩된다. 특정 벡터 친화적 명령어 포맷 QAC00은 아래의 표에 예시된 바와 같이 이러한 중첩된 레지스터 파일에 대해 연산한다.
Figure 112020130859394-pat00051
다시 말해서, 벡터 길이 필드 QAB59B는 최대 길이와 하나 이상의 다른 보다 짧은 길이 사이에서 선택하고, 여기서, 각각의 그러한 보다 짧은 길이는 선행 길이의 절반이며, 벡터 길이 필드 QAB59B가 없는 명령어 템플릿들은 최대 벡터 길이에서 연산한다. 추가로, 일 실시예에서, 특정 벡터 친화적 명령어 포맷 QAC00의 부류 B 명령어 템플릿들은, 패킹된 또는 스칼라 단정밀도/배정밀도 부동 소수점 데이터 및 패킹된 또는 스칼라 정수 데이터에 대해 연산한다. 스칼라 연산들은 zmm/ymm/xmm 레지스터에서의 최하위 차수 데이터 요소 위치에 대해 수행되는 연산들이며, 상위 차수의 데이터 요소 위치들은, 실시예에 따라, 명령어 이전에 그들이 있는 것과 동일하게 남겨지거나 제로화된다.
기입 마스크 레지스터들(12515) - 예시된 실시예에서, 각각 64 비트 크기인 8개의 기입 마스크 레지스터(k0 내지 k7)가 존재한다. 대안적 실시예에서, 기입 마스크 레지스터들(12515)은 16 비트 크기이다. 앞서 설명된 바와 같이, 본 발명의 일 실시예에서, 벡터 마스크 레지스터 k0은 기입 마스크로서 사용될 수 없으며; 일반적으로 k0을 표시할 인코딩이 기입 마스크에 사용될 때, 0xFFFF의 하드와이어링된 기입 마스크가 선택되어, 그 명령어에 대한 기입 마스킹이 효과적으로 디스에이블된다.
범용 레지스터들(12525) - 예시된 실시예에서, 메모리 피연산자들을 어드레싱하기 위해 기존의 x86 어드레싱 모드들과 함께 사용되는 16개의 64 비트 범용 레지스터들이 존재한다. 이러한 레지스터들은 RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, 및 R8 내지 R15의 명칭들로 참조된다.
MMX 패킹된 정수 플랫 레지스터 파일(12550)이 에일리어싱되는 스칼라 부동 소수점 스택 레지스터 파일(x87 스택)(12545) - 예시된 실시예에서, x87 스택은 x87 명령어 세트 확장을 사용하여 32/64/80 비트 부동 소수점 데이터에 대해 스칼라 부동 소수점 연산들을 수행하는 데 사용되는 8-요소 스택인 한편; MMX 레지스터들은 64 비트 패킹된 정수 데이터에 대한 연산들을 수행할 뿐만 아니라 XMM 레지스터들과 MMX 사이에서 수행되는 일부 연산들에 대한 피연산자들을 보유하는 데 사용된다.
본 발명의 대안적인 실시예들은 더 넓거나 더 좁은 레지스터들을 사용할 수 있다. 부가적으로, 본 발명의 대안적인 실시예들은 더 많거나, 더 적거나 또는 상이한 레지스터 파일들 및 레지스터들을 사용할 수 있다.
예시적인 코어 아키텍처들, 프로세서들, 및 컴퓨터 아키텍처들
프로세서 코어들은 상이한 방식들로, 상이한 목적들을 위해, 그리고 상이한 프로세서들에서 구현될 수 있다. 예를 들면, 그러한 코어들의 구현들은: 1) 범용 컴퓨팅을 위해 의도된 범용 순차적 코어; 2) 범용 컴퓨팅을 위해 의도된 고성능 범용 비-순차적 코어; 3) 주로 그래픽 및/또는 과학(처리량) 컴퓨팅을 위해 의도된 특수 목적 코어를 포함할 수 있다. 상이한 프로세서들의 구현들은: 1) 범용 컴퓨팅을 위해 의도된 하나 이상의 범용 순차적 코어 및/또는 범용 컴퓨팅을 위해 의도된 하나 이상의 범용 비-순차적 코어를 포함하는 CPU; 및 2) 주로 그래픽 및/또는 과학(처리량)을 위해 의도된 하나 이상의 특수 목적 코어를 포함하는 코프로세서를 포함할 수 있다. 그러한 상이한 프로세서들은 상이한 컴퓨터 시스템 아키텍처들을 초래하는데, 그 아키텍처들은: 1) CPU와 별개의 칩 상의 코프로세서; 2) CPU와 동일한 패키지 내의 별개의 다이 상의 코프로세서; 3) CPU와 동일한 다이 상의 코프로세서(이 경우에, 그러한 코프로세서는 때때로 통합 그래픽 및/또는 과학(처리량) 논리와 같은 특수 목적 논리, 또는 특수 목적 코어들로 지칭됨); 및 4) 설명된 CPU(이는 때때로, 애플리케이션 코어(들) 또는 애플리케이션 프로세서(들)로 지칭됨), 위에 설명된 코프로세서, 및 부가적인 기능성을 동일한 다이 상에 포함할 수 있는 시스템-온-칩을 포함할 수 있다. 예시적인 코어 아키텍처들이 다음에 설명되고, 이어서, 예시적인 프로세서들 및 컴퓨터 아키텍처들의 설명들이 후속된다.
예시적인 코어 아키텍처들
순차적 및 비-순차적 코어 블록도
도 126a는 본 발명의 실시예들에 따른, 예시적인 순차적 파이프라인 및 예시적인 레지스터 재명명, 비-순차적 송출/실행 파이프라인 둘 모두를 예시하는 블록도이다. 도 126b는 본 발명의 실시예들에 따른 프로세서에 포함될 순차적 아키텍처 코어 및 예시적인 레지스터 재명명, 비-순차적 송출/실행 아키텍처 코어의 예시적인 실시예 둘 모두를 예시하는 블록도이다. 도 126a-b에서의 실선으로 된 박스들은 순차적 파이프라인 및 순차적 코어를 예시하는 반면, 파선으로 된 임의적인 부가 박스들은 레지스터 재명명, 비-순차적 송출/실행 파이프라인 및 코어를 예시한다. 순차적 양상이 비-순차적 양상의 하위 세트라는 것을 고려하여, 비-순차적 양상이 설명될 것이다.
도 126a에서, 프로세서 파이프라인(12600)은 페치 스테이지(12602), 길이 디코딩 스테이지(12604), 디코딩 스테이지(12606), 할당 스테이지(12608), 재명명 스테이지(12610), 스케줄링(디스패치 또는 송출로도 알려져 있음) 스테이지(12612), 레지스터 판독/메모리 판독 스테이지(12614), 실행 스테이지(12616), 라이트백/메모리 기입 스테이지(12618), 예외 처리 스테이지(12622), 및 커밋 스테이지(12624)를 포함한다.
도 126b는 실행 엔진 유닛(12650)에 결합된 전단 유닛(12630) ― 둘 모두가 메모리 유닛(12670)에 결합됨 ― 을 포함하는 프로세서 코어(12690)를 도시한다. 코어(12690)는 감소된 명령어 세트 컴퓨팅(RISC) 코어, 복잡한 명령어 세트 컴퓨팅(CISC) 코어, 매우 긴 명령어 워드(VLIW) 코어, 또는 혼성 또는 대안적 코어 유형일 수 있다. 또 다른 옵션으로서, 코어(12690)는, 예컨대, 네트워크 또는 통신 코어, 압축 엔진, 코프로세서 코어, 범용 컴퓨팅 그래픽 처리 유닛(GPGPU) 코어, 그래픽 코어 등과 같은 특수 목적 코어일 수 있다.
전단 유닛(12630)은 명령어 캐시 유닛(12634)에 결합되는 브랜치 예측 유닛(12632)을 포함하고, 명령어 캐시 유닛(12634)은 명령어 변환 색인 버퍼(TLB)(12636)에 결합되고, 명령어 TLB(12636)는 명령어 페치 유닛(12638)에 결합되고, 명령어 페치 유닛(12638)은 디코딩 유닛(12640)에 결합된다. 디코딩 유닛(12640)(또는 디코더)은 명령어들을 디코딩할 수 있으며, 원래의 명령어들로부터 디코딩되거나, 또는 그렇지 않으면 이들을 반영하거나, 또는 이들로부터 도출되는, 하나 이상의 마이크로-연산들, 마이크로-코드 엔트리 포인트들, 마이크로명령어들, 다른 명령어들 또는 다른 제어 신호들을 출력으로서 생성할 수 있다. 디코딩 유닛(12640)은 다양하고 상이한 메커니즘들을 사용하여 구현될 수 있다. 적절한 메커니즘들의 예들은, 탐색 테이블들, 하드웨어 구현들, 프로그래밍가능 논리 어레이(PLA)들, 마이크로코드 판독 전용 메모리(ROM)들 등을 포함하지만 이들로 제한되지 않는다. 일 실시예에서, 코어(12690)는 특정 매크로명령어들에 대한 마이크로코드를 저장하는 마이크로코드 ROM 또는 다른 매체를 (예컨대, 디코딩 유닛(12640)에 또는 그렇지 않은 경우에는 전단 유닛(12630) 내에) 포함한다. 디코딩 유닛(12640)은 실행 엔진 유닛(12650) 내의 재명명/할당기 유닛(12652)에 결합된다.
실행 엔진 유닛(12650)은 퇴거 유닛(12654) 및 하나 이상의 스케줄러 유닛(들)(12656)의 세트에 결합되는 재명명/할당기 유닛(12652)을 포함한다. 스케줄러 유닛(들)(12656)은, 예비 스테이션들, 중앙 명령어 윈도우 등을 포함하는 임의의 수의 상이한 스케줄러들을 표현한다. 스케줄러 유닛(들)(12656)은 물리적 레지스터 파일(들) 유닛(들)(12658)에 결합된다. 물리적 레지스터 파일(들) 유닛들(12658) 각각은 하나 이상의 물리적 레지스터 파일을 나타내고, 이들 중 상이한 것들은, 스칼라 정수, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점, 상태(예컨대, 실행될 다음 명령어의 어드레스인 명령어 포인터) 등과 같은, 하나 이상의 상이한 데이터 유형을 저장한다. 일 실시예에서, 물리적 레지스터 파일(들) 유닛(12658)은 벡터 레지스터 유닛, 기입 마스크 레지스터 유닛 및 스칼라 레지스터 유닛을 포함한다. 이러한 레지스터 유닛들은 아키텍처 벡터 레지스터들, 벡터 마스크 레지스터들 및 범용 레지스터들을 제공할 수 있다. 물리적 레지스터 파일(들) 유닛(들)(12658)은, 레지스터 재명명 및 비-순차적 실행이 구현될 수 있는 다양한 방식들(예컨대, 재순서화 버퍼(들) 및 퇴거 레지스터 파일(들)을 사용하는 것; 향후의 파일(들), 이력 버퍼(들), 및 퇴거 레지스터 파일(들)을 사용하는 것; 레지스터 맵들 및 레지스터들의 풀을 사용하는 것 등)을 예시하기 위해 퇴거 유닛(12654)과 겹쳐져 있다. 퇴거 유닛(12654) 및 물리적 레지스터 파일(들) 유닛(들)(12658)은 실행 클러스터(들)(12660)에 결합된다. 실행 클러스터(들)(12660)는 하나 이상의 실행 유닛(12662)의 세트 및 하나 이상의 메모리 액세스 유닛(12664)의 세트를 포함한다. 실행 유닛들(12662)은 다양한 유형들의 데이터(예컨대, 스칼라 부동 소수점, 패킹된 정수, 패킹된 부동 소수점, 벡터 정수, 벡터 부동 소수점)에 대해 다양한 연산들(예컨대, 시프트, 가산, 감산, 곱셈)을 수행할 수 있다. 일부 실시예들은 특정 기능들이나 기능들의 세트들에 전용인 다수의 실행 유닛들을 포함할 수 있지만, 다른 실시예들은 단 하나의 실행 유닛만을, 또는 모두가 모든 기능들을 수행하는 다수의 실행 유닛들을 포함할 수 있다. 스케줄러 유닛(들)(12656), 물리적 레지스터 파일(들) 유닛(들)(12658), 및 실행 클러스터(들)(12660)는 가능하게는 복수인 것으로 도시되는데, 그 이유는, 특정 실시예들이 특정 유형들의 데이터/연산들에 대해 별개의 파이프라인들(예컨대, 각각이 자신 고유의 스케줄러 유닛, 물리적 레지스터 파일(들) 유닛, 및/또는 실행 클러스터를 갖는 스칼라 정수 파이프라인, 스칼라 부동 소수점/패킹된 정수/패킹된 부동 소수점/벡터 정수/벡터 부동 소수점 파이프라인, 및/또는 메모리 액세스 파이프라인 - 및 별개의 메모리 액세스 파이프라인의 경우에, 이러한 파이프라인의 실행 클러스터만이 메모리 액세스 유닛(들)(12664)을 갖는 특정의 실시예들이 구현됨)을 생성하기 때문이다. 별개의 파이프라인들이 사용되는 경우, 이러한 파이프라인들 중 하나 이상은 비-순차적 송출/실행일 수 있고 나머지는 순차적일 수 있다는 것이 또한 이해되어야 한다.
메모리 액세스 유닛들(12664)의 세트는 메모리 유닛(12670)에 결합되며, 메모리 유닛(12670)은, 레벨 2(L2) 캐시 유닛(12676)에 결합된 데이터 캐시 유닛(12674)에 결합되는 데이터 TLB 유닛(12672)을 포함한다. 예시적인 일 실시예에서, 메모리 액세스 유닛들(12664)은 로드 유닛, 저장 어드레스 유닛 및 저장 데이터 유닛을 포함할 수 있으며, 이들 각각은 메모리 유닛(12670) 내의 데이터 TLB 유닛(12672)에 결합된다. 명령어 캐시 유닛(12634)은 메모리 유닛(12670) 내의 레벨 2(L2) 캐시 유닛(12676)에 추가로 결합된다. L2 캐시 유닛(12676)은 하나 이상의 다른 레벨들의 캐시에 그리고 궁극적으로는 주 메모리에 결합된다.
예로서, 예시적인 레지스터 재명명, 비-순차적 송출/실행 코어 아키텍처는 다음과 같이 파이프라인(12600)을 구현할 수 있다: 1) 명령어 페치(12638)가 페치 및 길이 디코딩 스테이지들(12602 및 12604)을 수행하고; 2) 디코딩 유닛(12640)이 디코딩 스테이지(12606)를 수행하고; 3) 재명명/할당기 유닛(12652)이 할당 스테이지(12608) 및 재명명 스테이지(12610)를 수행하고; 4) 스케줄러 유닛(들)(12656)이 스케줄링 스테이지(12612)를 수행하고; 5) 물리적 레지스터 파일(들) 유닛(들)(12658) 및 메모리 유닛(12670)이 레지스터 판독/메모리 판독 스테이지(12614)를 수행하고; 실행 클러스터(12660)가 실행 스테이지(12616)를 수행하고; 6) 메모리 유닛(12670) 및 물리적 레지스터 파일(들) 유닛(들)(12658)이 라이트백/메모리 기입 스테이지(12618)를 수행하고; 7) 다양한 유닛들이 예외 처리 스테이지(12622)에 수반되고; 8) 퇴거 유닛(12654) 및 물리적 레지스터 파일(들) 유닛(들)(12658)이 커밋 스테이지(12624)를 수행한다.
코어(12690)는 본원에 설명된 명령어(들)를 비롯하여 하나 이상의 명령어 세트(예컨대, (더 새로운 버전들에 부가된 일부 확장들을 갖는) x86 명령어 세트; 캘리포니아 주 서니베일 소재의 MIPS 테크놀로지스(MIPS Technologies)의 MIPS 명령어 세트; 캘리포니아주 서니베일 소재의 ARM 홀딩스의 (NEON과 같은 임의적인 부가적인 확장들을 갖는) ARM 명령어 세트)을 지원할 수 있다. 일 실시예에서, 코어(12690)는 패킹된 데이터 명령어 세트 확장(예컨대, AVX1, AVX2)을 지원하는 논리를 포함하고, 그에 의해, 많은 멀티미디어 애플리케이션들에 의해 사용되는 연산들이 패킹된 데이터를 사용하여 수행될 수 있게 한다.
코어가 (연산들 또는 스레드들의 2개 이상의 병렬 세트들을 실행하는) 다중스레딩을 지원할 수 있고, 시간 분할식 다중스레딩, 동시 다중스레딩(이러한 경우, 물리 코어가 동시에 다중스레딩하는 스레드들 각각에 대한 논리 코어를 단일 물리 코어가 제공함) 또는 이들의 조합(예컨대, 인텔® 하이퍼스레딩 기술에서와 같은, 시간 분할식 페치 및 디코딩과 그 이후의 동시 다중스레딩)을 포함하는 다양한 방식들로 지원할 수 있다는 것이 이해되어야 한다.
레지스터 재명명이 비-순차적 실행의 맥락에서 설명되지만, 레지스터 재명명은 순차적 아키텍처에 사용될 수도 있다는 것이 이해되어야 한다. 예시된 프로세서의 실시예는 또한 별개의 명령어 및 데이터 캐시 유닛들(12634/12674) 및 공유 L2 캐시 유닛(12676)을 포함하지만, 대안적인 실시예들은, 명령어들 및 데이터 둘 모두에 대한 단일 내부 캐시, 이를테면, 예컨대 레벨 1(L1) 내부 캐시, 또는 다수의 레벨들의 내부 캐시를 가질 수 있다. 일부 실시예들에서, 시스템은 코어 및/또는 프로세서의 외부에 있는 외부 캐시와 내부 캐시의 조합을 포함할 수 있다. 대안적으로, 모든 캐시가 코어 및/또는 프로세서 외부에 있을 수 있다.
특정 예시적인 순차적 코어 아키텍처
도 127a-b는, 코어가 칩 내의 수 개의 논리 블록들(동일한 유형 및/또는 상이한 유형들의 다른 코어들을 포함함) 중 하나의 논리 블록인 더 구체적인 예시적인 순차적 코어 아키텍처의 블록도를 예시한다. 논리 블록들은, 애플리케이션에 따라, 일부 고정된 기능 논리, 메모리 I/O 인터페이스들 및 다른 필요한 I/O 논리와 함께 고 대역폭 상호연결 네트워크(예컨대, 링 네트워크)를 통해 통신한다.
도 127a는 본 발명의 실시예들에 따른, 단일 프로세서 코어를, 온-다이 상호연결 네트워크(12702)로의 그의 연결 및 레벨 2(L2) 캐시의 그의 로컬 하위 세트(12704)와 함께 나타낸 블록도이다. 일 실시예에서, 명령어 디코더(12700)는 패킹된 데이터 명령어 세트 확장을 갖는 x86 명령어 세트를 지원한다. L1 캐시(12706)는 스칼라 및 벡터 유닛들로의 캐시 메모리에 대한 낮은 레이턴시 액세스들을 허용한다. 일 실시예에서는 (설계를 단순화하기 위해) 스칼라 유닛(12708) 및 벡터 유닛(12710)이 별개의 레지스터 세트들(각각, 스칼라 레지스터들(12712) 및 벡터 레지스터들(12714))을 사용하고 이들 간에 전송되는 데이터는 메모리에 기입된 다음 레벨 1(L1) 캐시(12706)로부터 다시 판독되지만, 본 발명의 대안적 실시예들은 상이한 접근방식을 사용할 수 있다(예컨대, 단일 레지스터 세트를 사용하거나, 또는 기입 및 다시 판독되지 않으면서 2개의 레지스터 파일들 사이에서 데이터가 전송될 수 있게 하는 통신 경로를 포함함).
L2 캐시(12704)의 로컬 하위 세트는 프로세서 코어당 하나씩 별개의 로컬 하위 세트들로 분할되는 전역 L2 캐시의 일부이다. 각각의 프로세서 코어는 L2 캐시의 자신 고유의 로컬 하위 세트(12704)로의 직접 액세스 경로를 갖는다. 프로세서 코어에 의해 판독되는 데이터는, 그 프로세서 코어의 L2 캐시 하위 세트(12704)에 저장되고, 자신 고유의 로컬 L2 캐시 하위 세트들에 액세스하는 다른 프로세서 코어들과 병렬로 신속하게 액세스될 수 있다. 프로세서 코어에 의해 기입된 데이터는 자신 고유의 L2 캐시 하위 세트(12704)에 저장되고, 필요한 경우, 다른 하위 세트들부터 플러싱된다. 링 네트워크는 공유 데이터에 대한 일관성을 보장한다. 링 네트워크는 프로세서 코어들, L2 캐시들 및 다른 논리 블록들과 같은 에이전트들이 칩 내에서 서로 통신할 수 있게 하기 위해 양방향성이다. 각각의 링 데이터 경로는 방향당 1012 비트의 폭을 갖는다.
도 127b는 본 발명의 실시예들에 따른 도 127a의 프로세서 코어의 부분 확대도이다. 도 127b는, L1 캐시(12704)의 L1 데이터 캐시(12706A) 부분뿐만 아니라, 벡터 유닛(12710) 및 벡터 레지스터들(12714)에 관한 더 많은 세부사항을 포함한다. 구체적으로, 벡터 유닛(12710)은 정수, 단정밀도 부동, 및 배정밀도 부동 명령어들 중 하나 이상을 실행하는 16-폭 벡터 처리 유닛(VPU)(16-폭 ALU(12728)를 참조)이다. VPU는 스위즐링(swizzle) 유닛(12720)을 이용한 레지스터 입력들의 스위즐링, 수치 변환 유닛들(12722A-B)을 이용한 수치 변환, 및 메모리 입력에 대한 복제 유닛(12724)을 이용한 복제를 지원한다. 기입 마스크 레지스터들(12726)은 결과적인 벡터 기입들을 서술하는 것을 허용한다.
도 128은 본 발명의 실시예들에 따른, 하나 초과의 코어를 가질 수 있고, 통합된 메모리 제어기를 가질 수 있고, 통합 그래픽들을 가질 수 있는 프로세서(12800)의 블록도이다. 도 128에서의 실선으로 된 박스들은 단일 코어(12802A), 시스템 에이전트(12810), 및 하나 이상의 버스 제어기 유닛(12816)의 세트를 갖는 프로세서(12800)를 예시하는 반면, 파선으로 된 임의적인 부가 박스들은 다수의 코어들(12802A-N), 시스템 에이전트 유닛(12810) 내의 하나 이상의 통합된 메모리 제어기 유닛(들)(12814)의 세트, 및 특수 목적 논리(12808)를 갖는 대안적인 프로세서(12800)를 예시한다.
따라서, 프로세서(12800)의 상이한 구현들은: 1) 특수 목적 논리(12808)가 (하나 이상의 코어를 포함할 수 있는) 통합 그래픽 및/또는 과학(처리량) 논리이고 코어들(12802A-N)이 하나 이상의 범용 코어(예컨대, 범용 순차적 코어들, 범용 비-순차적 코어들, 이 둘의 조합)인 CPU; 2) 코어들(12802A-N)이 주로 그래픽 및/또는 과학(처리량)을 위해 의도된 많은 수의 특수 목적 코어들인 코프로세서; 및 3) 코어들(12802A-N)이 많은 수의 범용 순차적 코어들인 코프로세서를 포함할 수 있다. 따라서, 프로세서(12800)는 범용 프로세서, 코프로세서, 또는, 예컨대, 네트워크 또는 통신 프로세서, 압축 엔진, 그래픽 프로세서, 범용 그래픽 처리 유닛(GPGPU), 고 처리량 다수 코어 통합식(MIC; many integrated core) 코프로세서(30개 이상의 코어들을 포함함), 내장형 프로세서 등과 같은 특수 목적 프로세서일 수 있다. 프로세서는 하나 이상의 칩 상에 구현될 수 있다. 프로세서(12800)는, 예컨대, BiCMOS, CMOS, 또는 NMOS와 같은 다수의 프로세스 기술들 중 임의의 기술을 사용하여 하나 이상의 기판의 일부가 될 수 있고/거나 이들 기판 상에 구현될 수 있다.
메모리 계층구조는 코어들 내의 하나 이상의 레벨들의 캐시, 세트 또는 하나 이상의 공유 캐시 유닛(12806), 및 통합된 메모리 제어기 유닛들(12814)의 세트에 결합되어 있는 외부 메모리(도시되지 않음)를 포함한다. 공유 캐시 유닛들(12806)의 세트는 하나 이상의 중간 레벨 캐시, 이를테면 레벨 2(L2), 레벨 3(L3), 레벨 4(L4) 또는 다른 레벨들의 캐시, 최종 레벨 캐시(LLC) 및/또는 이들의 조합들을 포함할 수 있다. 일 실시예에서, 링 기반 상호연결 유닛(12812)은 통합 그래픽 논리(12808)(통합 그래픽 논리(12808)는 특수 목적 논리의 예이고, 본원에서 특수 목적 논리로 또한 지칭됨), 공유 캐시 유닛들(12806)의 세트, 및 시스템 에이전트 유닛(12810)/통합된 메모리 제어기 유닛(들)(12814)을 상호연결하지만, 대안적인 실시예들은 그러한 유닛들을 상호연결하기 위해 임의의 수의 잘 알려진 기법들을 사용할 수 있다. 일 실시예에서, 하나 이상의 캐시 유닛(12806)과 코어들(12802A-N) 사이에 일관성이 유지된다.
일부 실시예들에서, 코어들(12802A-N) 중 하나 이상은 다중스레딩이 가능하다. 시스템 에이전트(12810)는 코어들(12802A-N)을 조정하고 동작시키는 그 구성요소들을 포함한다. 시스템 에이전트 유닛(12810)은 예컨대 전력 제어 유닛(PCU) 및 디스플레이 유닛을 포함할 수 있다. PCU는 코어들(12802A-N) 및 통합 그래픽 논리(12808)의 전력 상태를 조절하는 데 필요한 논리 및 구성요소들일 수 있거나 이들을 포함할 수 있다. 디스플레이 유닛은 하나 이상의 외부 연결 디스플레이들을 구동하기 위한 것이다.
코어들(12802A-N)은 아키텍처 명령어 세트의 관점에서 동종이거나 이종일 수 있는데, 즉, 코어들(12802A-N) 중 2개 이상이 동일한 명령어 세트를 실행할 수 있는 반면, 다른 코어들은 오직 그 명령어 세트의 하위 세트 또는 상이한 명령어 세트만을 실행하는 것이 가능할 수 있다.
예시적인 컴퓨터 아키텍처들
도 129-132는 예시적인 컴퓨터 아키텍처들의 블록도들이다. 랩톱들, 데스크톱들, 핸드헬드 PC들, 개인 휴대 정보 단말들, 엔지니어링 워크스테이션들, 서버들, 네트워크 디바이스들, 네트워크 허브들, 스위치들, 내장형 프로세서들, 디지털 신호 프로세서(DSP)들, 그래픽 디바이스들, 비디오 게임 디바이스들, 셋톱 박스들, 마이크로 제어기들, 셀 폰들, 휴대용 미디어 플레이어들, 핸드헬드 디바이스들, 및 다양한 다른 전자 디바이스들에 대해 관련 기술분야에 알려진 다른 시스템 설계들 및 구성들이 또한 적합하다. 일반적으로, 본원에 개시된 바와 같은 프로세서 및/또는 다른 실행 논리를 통합할 수 있는 매우 다양한 시스템들 또는 전자 디바이스들이 일반적으로 적합하다.
이제 도 129를 참조하면, 본 발명의 일 실시예에 따른 시스템(12900)의 블록도가 도시된다. 시스템(12900)은 하나 이상 프로세서(12910, 12915)를 포함할 수 있으며, 이들은 제어기 허브(12920)에 결합된다. 일 실시예에서, 제어기 허브(12920)는 그래픽 메모리 제어기 허브(GMCH)(12990) 및 입력/출력 허브(IOH)(12950)(별개의 칩들 상에 있을 수 있음)를 포함하고; GMCH(12990)는 메모리 및 그래픽 제어기들을 포함하며, 그래픽 제어기들에는 메모리(12940) 및 코프로세서(12945)가 결합되고; IOH(12950)는 입력/출력(I/O) 디바이스들(12960)을 GMCH(12990)에 결합시킨다. 대안적으로, 메모리 및 그래픽 제어기들 중 하나 또는 둘 모두는 (본원에서 설명된 바와 같이) 프로세서 내에 통합되고, 메모리(12940) 및 코프로세서(12945)는 프로세서(12910), 및 IOH(12950)를 갖는 단일 칩 내의 제어기 허브(12920)에 직접 결합된다.
부가적인 프로세서들(12915)의 임의적 속성이 도 129에서 파선들로 표기된다. 각각의 프로세서(12910, 12915)는 본원에서 설명된 처리 코어들 중 하나 이상을 포함할 수 있고, 프로세서(12800)의 일부 버전일 수 있다.
메모리(12940)는, 예컨대, 동적 무작위 액세스 메모리(DRAM), 상변화 메모리(PCM), 또는 이 둘의 조합일 수 있다. 적어도 일 실시예의 경우, 제어기 허브(12920)는 전면 버스(FSB)와 같은 멀티-드롭 버스(multi-drop bus), 퀵패스 인터커넥트(QPI; QuickPath Interconnect)와 같은 점대점 인터페이스, 또는 유사한 연결부(12995)를 통해 프로세서(들)(12910, 12915)와 통신한다.
일 실시예에서, 코프로세서(12945)는, 예컨대, 고 처리량 MIC 프로세서, 네트워크 또는 통신 프로세서, 압축 엔진, 그래픽 프로세서, GPGPU, 내장형 프로세서 등과 같은 특수 목적 프로세서이다. 일 실시예에서, 제어기 허브(12920)는 통합된 그래픽 가속기를 포함할 수 있다.
아키텍처, 마이크로아키텍처, 열적, 전력 소비 특성 등을 포함하는 넓은 계량적 장점들의 관점에서 물리적 리소스들(12910, 12915) 사이에는 다양한 차이가 존재할 수 있다.
일 실시예에서, 프로세서(12910)는 일반적인 유형의 데이터 처리 연산들을 제어하는 명령어들을 실행한다. 명령어들 내에는 코프로세서 명령어들이 내장될 수 있다. 프로세서(12910)는, 부착된 코프로세서(12945)에 의해 실행되어야 하는 유형을 갖는 것으로 이러한 코프로세서 명령어들을 인식한다. 따라서, 프로세서(12910)는 이러한 코프로세서 명령어들(또는 코프로세서 명령어들을 표현하는 제어 신호들)을 코프로세서 버스 또는 다른 상호연결부 상에서 코프로세서(12945)로 송출한다. 코프로세서(들)(12945)는 수신된 코프로세서 명령어들을 수용하고 실행한다.
이제 도 130을 참조하면, 본 발명의 실시예에 따른 더 특정한 예시적인 제1 시스템(13000)의 블록도가 도시된다. 도 130에 도시된 바와 같이, 다중프로세서 시스템(13000)은 점대점 상호연결 시스템이고, 점대점 상호연결부(13050)를 통해 결합되는 제1 프로세서(13070) 및 제2 프로세서(13080)를 포함한다. 프로세서들(13070 및 13080) 각각은 프로세서(12800)의 일부 버전일 수 있다. 본 발명의 일 실시예에서, 프로세서들(13070 및 13080)은 각각 프로세서들(12910 및 12915)이고, 코프로세서(13038)는 코프로세서(12945)이다. 다른 실시예에서, 프로세서들(13070 및 13080)은 각각 프로세서(12910) 및 코프로세서(12945)이다.
프로세서들(13070 및 13080)은 각각 통합된 메모리 제어기(IMC) 유닛들(13072 및 13082)을 포함하는 것으로 도시된다. 프로세서(13070)는 또한 자신의 버스 제어기 유닛들의 일부로서 점대점(P-P) 인터페이스들(13076 및 13078)을 포함하고; 유사하게, 제2 프로세서(13080)는 P-P 인터페이스들(13086 및 13088)을 포함한다. 프로세서들(13070, 13080)은 P-P 인터페이스 회로들(13078 및 13088)을 사용하여 점대점(P-P) 인터페이스(13050)를 통해 정보를 교환할 수 있다. 도 130에 도시된 바와 같이, IMC들(13072 및 13082)은 프로세서들을 개개의 메모리, 즉, 메모리(13032) 및 메모리(13034)에 결합시키며, 이 메모리들은, 개개의 프로세서에 국부적으로 부착되는, 주 메모리의 부분들일 수 있다.
프로세서들(13070, 13080)은 각각 점대점 인터페이스 회로들(13076, 13094, 13086, 13098)을 사용하여 개별적인 P-P 인터페이스들(13052, 13054)을 통해 칩셋(13090)과 정보를 교환할 수 있다. 칩셋(13090)은 고성능 인터페이스(13092)를 통해 코프로세서(13038)와 임의적으로 정보를 교환할 수 있다. 일 실시예에서, 코프로세서(13038)는, 예컨대, 고 처리량 MIC 프로세서, 네트워크 또는 통신 프로세서, 압축 엔진, 그래픽 프로세서, GPGPU, 내장형 프로세서 등과 같은 특수 목적 프로세서이다.
공유 캐시(도시되지 않음)가 어느 하나의 프로세서에 또는 두 프로세서들 모두의 외부에 포함될 수 있지만, P-P 상호연결을 통해 프로세서들과 연결되어, 프로세서가 저 전력 모드로 배치되는 경우, 어느 하나의 프로세서의 또는 두 프로세서들 모두의 로컬 캐시 정보가 공유 캐시에 저장될 수 있다.
칩셋(13090)은 인터페이스(13096)를 통해 제1 버스(13016)에 결합될 수 있다. 일 실시예에서, 제1 버스(13016)는 주변 구성요소 상호연결(PCI) 버스 또는 PCI 익스프레스 버스 또는 다른 3세대 I/O 상호연결 버스와 같은 버스일 수 있지만, 본 발명의 범위는 그렇게 제한되지 않는다.
도 130에 도시된 바와 같이, 제1 버스(13016)를 제2 버스(13020)에 결합시키는 버스 브릿지(13018)와 함께, 다양한 I/O 디바이스들(13014)이 제1 버스(13016)에 결합될 수 있다. 일 실시예에서, 코프로세서들, 고 처리량 MIC 프로세서들, GPGPU들, 가속기들(이를테면, 예컨대 그래픽 가속기들 또는 디지털 신호 처리(DSP) 유닛들), 필드 프로그래밍가능 게이트 어레이들, 또는 임의의 다른 프로세서와 같은 하나 이상의 부가적인 프로세서(들)(13015)이 제1 버스(13016)에 결합된다. 일 실시예에서, 제2 버스(13020)는 적은 핀 계수(LPC; Low Pin Count) 버스일 수 있다. 일 실시예에서, 예컨대, 키보드 및/또는 마우스(13022), 통신 디바이스들(13027), 그리고 명령어들/코드 및 데이터(13030)를 포함할 수 있는 디스크 드라이브 또는 다른 대용량 저장 디바이스와 같은 저장 유닛(13028)을 포함하는 다양한 디바이스들이 제2 버스(13020)에 결합될 수 있다. 추가로, 오디오 I/O(13024)가 제2 버스(13020)에 결합될 수 있다. 다른 아키텍처들이 가능하다는 것을 유의한다. 예컨대, 도 130의 점대점 아키텍처 대신, 시스템은 멀티-드롭 버스 또는 다른 그러한 아키텍처를 구현할 수 있다.
이제 도 131을 참조하면, 본 발명의 실시예에 따른 더 특정한 예시적인 제2 시스템(13100)의 블록도가 도시된다. 도 130 및 도 131의 동일한 요소들은 유사한 참조 번호들을 갖고, 도 130의 특정 양상들은 도 131의 다른 양상들을 불명료하게 하는 것을 피하기 위해 도 131에서 생략되었다.
도 131은 프로세서들(13070, 13080)이 각각, 통합된 메모리 및 I/O 제어 논리("CL")(13072, 13082)를 포함할 수 있다는 것을 예시한다. 따라서, CL(13072, 13082)은 통합된 메모리 제어기 유닛들 및 I/O 제어 논리를 포함한다. 도 131은 CL(13072, 13082)에 메모리들(13032, 13034)이 결합될 뿐만 아니라 I/O 디바이스들(13114)이 또한 제어 논리(13072, 13082)에 결합됨을 예시한다. 레거시 I/O 디바이스들(13115)은 칩셋(13090)에 결합된다.
이제 도 132를 참조하면, 본 발명의 실시예에 따른 SoC(13200)의 블록도가 도시된다. 도 128에 있는 유사한 요소들은 동일한 참조 번호들을 갖는다. 또한, 파선들로 된 박스들은 더 진보된 SoC들에 대한 임의적인 특징들이다. 도 132에서, 상호연결 유닛(들)(13202)은: 캐시 유닛들(12804A-N)을 포함하는 하나 이상의 코어(12802A-N)의 세트 및 공유 캐시 유닛(들)(12806)을 포함하는 애플리케이션 프로세서(13210); 시스템 에이전트 유닛(12810); 버스 제어기 유닛(들)(12816); 통합된 메모리 제어기 유닛(들)(12814); 통합 그래픽 논리, 이미지 프로세서, 오디오 프로세서, 및 비디오 프로세서를 포함할 수 있는 세트 또는 하나 이상의 코프로세서(13220); 정적 무작위 액세스 메모리(SRAM) 유닛(13230); 직접 메모리 액세스(DMA) 유닛(13232); 및 하나 이상의 외부 디스플레이에 결합하기 위한 디스플레이 유닛(13240)에 결합된다. 일 실시예에서, 코프로세서(들)(13220)는, 예컨대, 네트워크 또는 통신 프로세서, 압축 엔진, GPGPU, 고 처리량 MIC 프로세서, 내장형 프로세서 등과 같은 특수 목적 프로세서를 포함한다.
본원에 개시된 메커니즘들의 실시예들은 하드웨어, 소프트웨어, 펌웨어, 또는 그러한 구현 접근법들의 조합으로 구현될 수 있다. 본 발명의 실시예들은, 적어도 하나의 프로세서, 저장 시스템(휘발성 및 비-휘발성 메모리 및/또는 저장 요소들을 포함함), 적어도 하나의 입력 디바이스 및 적어도 하나의 출력 디바이스를 포함하는 프로그래밍가능 시스템들 상에서 실행되는 컴퓨터 프로그램들 또는 프로그램 코드로서 구현될 수 있다.
본원에서 설명된 기능들을 수행하기 위한 명령어들을 입력하고 출력 정보를 생성하기 위해 도 130에 예시된 코드(13030)와 같은 프로그램 코드가 적용될 수 있다. 공지된 방식으로, 하나 이상의 출력 디바이스에 출력 정보가 적용될 수 있다. 본 출원의 목적을 위해, 처리 시스템은, 예컨대, 디지털 신호 프로세서(DSP), 마이크로제어기, 주문형 집적 회로(ASIC), 또는 마이크로프로세서와 같은 프로세서를 갖는 임의의 시스템을 포함한다.
프로그램 코드는 처리 시스템과 통신하기 위해 고레벨 절차 또는 객체 지향 프로그래밍 언어로 구현될 수 있다. 프로그램 코드는 또한 원하는 경우, 어셈블리 또는 기계 언어로 구현될 수 있다. 사실, 본원에서 설명되는 메커니즘들은 임의의 특정 프로그래밍 언어로 범위가 제한되지 않는다. 임의의 경우에, 언어는 컴파일된 언어 또는 해석된 언어일 수 있다.
적어도 하나의 실시예의 하나 이상의 양상은, 기계에 의해 판독될 때 기계로 하여금 본원에서 설명된 기법들을 수행하기 위한 논리를 제조하게 하는, 프로세서 내의 다양한 논리를 표현하는 기계 판독가능 매체 상에 저장된 전형적인 명령어들에 의해 구현될 수 있다. "IP 코어들"로 알려진 이러한 표현들은 유형의 기계 판독가능 매체 상에 저장될 수 있고, 다양한 고객들 또는 제조 설비들에 공급되어 실제로 논리 또는 프로세서를 만드는 제조 기계들로 로딩될 수 있다.
그러한 기계 판독가능 저장 매체는, 하드 디스크들, 플로피 디스크들, 광학 디스크들, 콤팩트 디스크 판독 전용 메모리(CD-ROM)들, 재기입가능 콤택프 디스크(CD-RW)들 및 광자기 디스크들을 포함하는 임의의 다른 유형의 디스크, 판독 전용 메모리(ROM)들, 무작위 액세스 메모리(RAM)들, 이를테면 동적 무작위 액세스 메모리(DRAM)들, 정적 무작위 액세스 메모리(SRAM)들, 소거가능한 프로그래밍가능 판독 전용 메모리(EPROM)들, 플래시 메모리들, 전기적으로 소거가능한 프로그래밍가능 판독 전용 메모리(EEPROM)들, 상변화 메모리(PCM)와 같은 반도체 디바이스들, 자기 또는 광학 카드들, 또는 전자적 명령어들을 저장하기에 적합한 임의의 다른 유형의 매체와 같은 저장 매체를 비롯하여, 기계 또는 디바이스에 의해 제조되거나 형성되는 물품들의 비-일시적인 유형의 배열들을 포함할 수 있지만 이에 제한되지는 않는다.
따라서, 본 발명의 실시예들은, 명령어들을 포함하거나 또는 본원에서 설명된 구조들, 회로들, 장치들, 프로세서들 및/또는 시스템 특징들을 정의하는 하드웨어 기술 언어(HDL)와 같은 설계 데이터를 포함하는 비-일시적인 유형의 기계 판독가능 매체를 또한 포함한다. 그러한 실시예들은 또한 프로그램 제품들로 지칭될 수 있다.
에뮬레이션(이진 변환, 코드 모핑 등을 포함함)
일부 경우들에서, 소스 명령어 세트로부터 대상 명령어 세트로 명령어를 변환하기 위해 명령어 변환기가 사용될 수 있다. 예컨대, 명령어 변환기는, 코어에 의해 처리될 하나 이상의 다른 명령어들로 명령어를(예컨대, 정적 이진 변환, 동적 컴파일을 포함하는 동적 이진 변환을 사용하여) 변환하거나, 모핑하거나, 에뮬레이팅하거나, 또는 다른 방식으로 변환할 수 있다. 명령어 변환기는 소프트웨어, 하드웨어, 펌웨어, 또는 이들의 조합으로 구현될 수도 있다. 명령어 변환기는 온 프로세서(on processor)로, 오프-프로세서(off processor)로, 또는 일부는 온-프로세서로 그리고 일부는 오프-프로세서로 있을 수 있다.
도 133은 본 발명의 실시예들에 따른, 소스 명령어 세트에서의 이진 명령어들을 대상 명령어 세트에서의 이진 명령어들로 변환하기 위해 소프트웨어 명령어 변환기를 사용하는 것을 대조하는 블록도이다. 예시된 실시예에서, 명령어 변환기는 소프트웨어 명령어 변환기이지만, 대안적으로, 명령어 변환기는 소프트웨어, 펌웨어, 하드웨어 또는 이들의 다양한 조합들로 구현될 수 있다. 도 133은 적어도 하나의 x86 명령어 세트 코어를 갖는 프로세서(13316)에 의해 본연적으로 실행될 수 있는 x86 이진 코드(13306)를 생성하기 위해 고레벨 언어(13302)로 된 프로그램이 x86 컴파일러(13304)를 사용하여 컴파일될 수 있다는 것을 도시한다. 적어도 하나의 x86 명령어 세트 코어를 갖는 프로세서(13316)는, 적어도 하나의 x86 명령어 세트 코어를 갖는 인텔 프로세서와 실질적으로 동일한 결과들을 달성하기 위해, (1) 인텔 x86 명령어 세트 코어의 명령어 세트의 상당한 부분 또는 (2) 적어도 하나의 x86 명령어 세트 코어를 갖는 인텔 프로세서 상에서 실행되는 것을 목표로 하는 애플리케이션들 또는 다른 소프트웨어의 객체 코드 버전들을 호환가능하게 실행하거나 다른 방식으로 처리함으로써 적어도 하나의 x86 명령어 세트 코어를 갖는 인텔 프로세서와 실질적으로 동일한 기능들을 실행할 수 있는 임의의 프로세서를 표현한다. x86 컴파일러(13304)는 부가적인 링크 처리와 함께 또는 그러한 링크 처리 없이 적어도 하나의 x86 명령어 세트 코어를 갖는 프로세서(13316) 상에서 실행될 수 있는 x86 이진 코드(13306)(예컨대, 객체 코드)를 생성하도록 동작가능한 컴파일러를 표현한다. 유사하게, 도 133은, 고레벨 언어(13302)로 된 프로그램이 대안적인 명령어 세트 컴파일러(13308)를 사용하여 컴파일되어, 적어도 하나의 x86 명령어 세트 코어가 없는 프로세서(13314)(예컨대, 캘리포니아 주 서니베일 소재의 MIPS 테크놀로지스의 MIPS 명령어 세트를 실행하고/거나 캘리포니아 주 서니베일 소재의 ARM 홀딩스의 ARM 명령어 세트를 실행하는 코어들을 갖는 프로세서)에 의해 본연적으로 실행될 수 있는 대안적인 명령어 세트 이진 코드(13310)를 생성할 수 있음을 도시한다. 명령어 변환기(13312)는, x86 이진 코드(13306)를 x86 명령어 세트 코어가 없는 프로세서(13314)에 의해 본연적으로 실행될 수 있는 코드로 변환하는 데 사용된다. 이러한 변환된 코드는, 이것이 가능한 명령어 변환기를 제조하기가 어렵기 때문에 대안적인 명령어 세트 이진 코드(13310)와 동일할 가능성이 없지만, 변환된 코드는 일반적인 연산을 달성할 것이고, 대안적인 명령어 세트로부터의 명령어들로 구성될 수 있다. 따라서, 명령어 변환기(13312)는 에뮬레이션, 모의실험 또는 임의의 다른 프로세스를 통해, x86 명령어 세트 프로세서 또는 코어를 갖지 않는 프로세서 또는 다른 전자 디바이스가 x86 이진 코드(13306)를 실행할 수 있게 하는 소프트웨어, 펌웨어, 하드웨어, 또는 이들의 조합을 표현한다.
특징들 및 양상들의 예시적인 구현들, 실시예들, 및 특정 조합들이 아래에 상세히 설명된다. 이러한 예들은 제한적인 것이 아니라 유익한 것이다.
예 1. 시스템은: 복수의 이종 처리 요소들; 및 복수의 이종 처리 요소들 중 하나 이상 상에서의 실행을 위해 명령어들을 디스패치하기 위한 하드웨어 이종 스케줄러를 포함하며, 명령어들은 복수의 이종 처리 요소들 중 하나 이상에 의해 처리될 코드 조각에 대응하고, 명령어들이 복수의 이종 처리 요소들 중의 하나 이상의 이종 처리 요소 중 적어도 하나에 대한 고유 명령어들이도록 이루어진다.
예 2: 예 1의 시스템은, 복수의 이종 처리 요소들이 순차적 프로세서 코어, 비-순차적 프로세서 코어, 및 패킹된 데이터 프로세서 코어를 포함하도록 이루어진다.
예 3: 예 2의 시스템은, 복수의 이종 처리 요소들이 가속기를 더 포함하도록 이루어진다.
예 4: 예 1 내지 예 3 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가 코드 조각의 프로그램 페이즈를 검출하기 위한 프로그램 페이즈 검출기를 더 포함하도록 이루어지고; 복수의 이종 처리 요소들이 제1 마이크로아키텍처를 갖는 제1 처리 요소, 및 제1 마이크로아키텍처와 상이한 제2 마이크로아키텍처를 갖는 제2 처리 요소를 포함하도록 이루어지고; 프로그램 페이즈가 제1 페이즈 및 제2 페이즈를 포함하는 복수의 프로그램 페이즈들 중 하나이고, 명령어들의 디스패치가 검출된 프로그램 페이즈에 부분적으로 기반하도록 이루어지고; 제1 처리 요소에 의한 코드 조각의 처리가 제2 처리 요소에 의한 코드 조각의 처리와 비교하여 개선된 와트 당 성능 특성들을 생성하도록 이루어진다.
예 5: 예 1 내지 예 4 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 수신된 코드 조각을 실행하기 위한 복수의 처리 요소들의 처리 요소의 유형을 선택하고, 디스패치를 통해, 선택된 유형의 처리 요소들의 처리 요소 상에 코드 조각을 스케줄링하기 위한 선택기를 더 포함하도록 이루어진다.
예 6: 예 1의 시스템은, 코드 조각이 소프트웨어 스레드와 연관된 하나 이상의 명령어이도록 이루어진다.
예 7: 예 5 내지 예 6 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 단일 명령어 다중 데이터(SIMD) 명령어들을 실행하기 위한 처리 코어이도록 이루어진다.
예 8: 예 5 내지 예 7 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 밀집 산술 프리미티브들을 지원하기 위한 회로이도록 이루어진다.
예 9: 예 5 내지 예 7 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 가속기이도록 이루어진다.
예 10: 예 5 내지 예 9 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈가 동일한 제어 흐름을 사용하여 동시에 처리되는 데이터 요소들을 포함하도록 이루어진다.
예 11: 예 5 내지 예 10 중 임의의 예의 시스템은, 스레드 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 스칼라 처리 코어이도록 이루어진다.
예 12: 예 5 내지 예 11 중 임의의 예의 시스템은, 스레드 병렬 프로그램 페이즈가 고유 제어 흐름들을 사용하는 데이터 의존적 브랜치들을 포함하도록 이루어진다.
예 13: 예 2 내지 예 12 중 임의의 예의 시스템은, 직렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 비-순차적 코어이도록 이루어진다.
예 14: 예 2 내지 예 13 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 단일 명령어 다중 데이터(SIMD) 명령어들을 실행하기 위한 처리 코어이도록 이루어진다.
예 15: 예 1 내지 예 14 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 컴파일형, 내재성, 어셈블리, 라이브러리들, 중간형, 오프로드, 및 디바이스를 포함하는 다수의 코드 유형들을 지원하도록 이루어진다.
예 16: 예 5 내지 예 15 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 선택된 유형의 처리 요소가 코드 조각을 본연적으로 처리할 수 없을 때 기능성을 에뮬레이팅하도록 이루어진다.
예 17: 예 1 내지 예 15 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 이용가능한 하드웨어 스레드들의 수가 초과신청될 때 기능성을 에뮬레이팅하도록 이루어진다.
예 18: 예 5 내지 예 15 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 선택된 유형의 처리 요소가 코드 조각을 본연적으로 처리할 수 없을 때 기능성을 에뮬레이팅하도록 이루어진다.
예 19: 예 5 내지 예 18 중 임의의 예의 시스템은, 복수의 이종 처리 요소들의 처리 요소의 유형의 선택이 사용자에게 투명하도록 이루어진다.
예 20: 예 5 내지 예 19 중 임의의 예의 시스템은, 복수의 이종 처리 요소들의 처리 요소의 유형의 선택이 운영 체제에 투명하도록 이루어진다.
예 21: 예 1 내지 예 20 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 각각의 스레드를, 각각의 스레드가 스칼라 코어 상에서 실행되는 것처럼 프로그래머에게 보이게 하는 동종 다중프로세서 프로그래밍 모델을 제시하도록 이루어진다.
예 22: 예 21의 시스템은, 제시된 동종 다중프로세서 프로그래밍 모델이 전체 명령어 세트에 대한 지원의 외관을 제시하도록 이루어진다.
예 23: 예 1 내지 예 22 중 임의의 예의 시스템은, 복수의 이종 처리 요소들이 메모리 어드레스 공간을 공유하도록 이루어진다.
예 24: 예 1 내지 예 23 중 임의의 예의 시스템은, 하드웨어 이종 스케줄러가, 이종 처리 요소들 중 하나 상에서 실행될 이진 변환기를 포함하도록 이루어진다.
예 25: 예 5 내지 예 24 중 임의의 예의 시스템은, 복수의 이종 처리 요소들의 처리 요소의 유형의 기본 선택이 레이턴시 최적화된 코어이도록 이루어진다.
예 26: 예 1 내지 예 25 중 임의의 예의 시스템은, 이종 하드웨어 스케줄러가, 디스패치된 명령어들에 대한, 다중-프로토콜 인터페이스 상에서 사용하기 위한 프로토콜을 선택하도록 이루어진다.
예 27: 예 26의 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제1 프로토콜이, 시스템 메모리 어드레스 공간에 액세스하는 데 사용될 메모리 인터페이스 프로토콜을 포함하도록 이루어진다.
예 28: 예 26 내지 예 27 중 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제2 프로토콜이, 호스트 캐시 계층구조 및 시스템 메모리를 포함하는 호스트 프로세서의 메모리 서브시스템과 가속기의 로컬 메모리에 저장된 데이터 간에 일관성을 유지하기 위한 캐시 일관성 프로토콜을 포함하도록 이루어진다.
예 29: 예 26 내지 예 28 중 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제3 프로토콜이, 디바이스 발견, 레지스터 액세스, 구성, 초기화, 인터럽트들, 직접 메모리 액세스, 및 어드레스 변환 서비스들을 지원하는 직렬 링크 프로토콜을 포함하도록 이루어진다.
예 30: 예 29의 시스템은, 제3 프로토콜이 주변 구성요소 인터페이스 익스프레스(PCIe) 프로토콜을 포함하도록 이루어진다.
예 31: 시스템은: 가속기를 포함하는 이종 프로세서 내의 복수의 이종 처리 요소들; 및 이종 프로세서 내의 복수의 이종 처리 요소들 중 적어도 하나에 의해 실행가능한 프로그램 코드를 저장하기 위한 메모리를 포함하며, 프로그램 코드는, 복수의 이종 처리 요소들 중 하나 이상 상에서의 실행을 위해 명령어들을 디스패치하기 위한 이종 스케줄러를 포함하고, 명령어들은 복수의 이종 처리 요소들 중 하나 이상에 의해 처리될 코드 조각에 대응하고, 명령어들이 복수의 이종 처리 요소들 중의 하나 이상의 이종 처리 요소 중 적어도 하나에 대한 고유 명령어들이도록 이루어진다.
예 32: 예 31의 시스템은, 복수의 이종 처리 요소들이 순차적 프로세서 코어, 비-순차적 프로세서 코어, 및 패킹된 데이터 프로세서 코어를 포함하도록 이루어진다.
예 33: 예 32의 시스템은, 복수의 이종 처리 요소들이 가속기를 더 포함하도록 이루어진다.
예 34: 예 31 내지 예 33 중 임의의 예의 시스템은, 이종 스케줄러가 코드 조각의 프로그램 페이즈를 검출하기 위한 프로그램 페이즈 검출기를 더 포함하도록 이루어지고; 복수의 이종 처리 요소들이 제1 마이크로아키텍처를 갖는 제1 처리 요소, 및 제1 마이크로아키텍처와 상이한 제2 마이크로아키텍처를 갖는 제2 처리 요소를 포함하도록 이루어지고; 프로그램 페이즈가 제1 페이즈 및 제2 페이즈를 포함하는 복수의 프로그램 페이즈들 중 하나이고, 명령어들의 디스패치가 검출된 프로그램 페이즈에 부분적으로 기반하도록 이루어지고; 제1 처리 요소에 의한 코드 조각의 처리가 제2 처리 요소에 의한 코드 조각의 처리와 비교하여 개선된 와트 당 성능 특성들을 생성하도록 이루어진다.
예 35: 예 31 내지 예 34 중 임의의 예의 시스템은, 이종 스케줄러가, 수신된 코드 조각을 실행하기 위한 복수의 처리 요소들의 처리 요소의 유형을 선택하고, 디스패치를 통해, 선택된 유형의 처리 요소들의 처리 요소 상에 코드 조각을 스케줄링하기 위한 선택기를 더 포함하도록 이루어진다.
예 36: 예 31 내지 예 35 중 임의의 예의 시스템은, 코드 조각이 소프트웨어 스레드와 연관된 하나 이상의 명령어이도록 이루어진다.
예 37: 예 34 내지 예 36 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 단일 명령어 다중 데이터(SIMD) 명령어들을 실행하기 위한 처리 코어이도록 이루어진다.
예 38: 예 34 내지 예 37 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 밀집 산술 프리미티브들을 지원하기 위한 회로이도록 이루어진다.
예 39: 예 34 내지 예 38 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 가속기이도록 이루어진다.
예 40: 예 34 내지 예 39 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈가 동일한 제어 흐름을 사용하여 동시에 처리되는 데이터 요소들을 포함하도록 이루어진다.
예 41: 예 30 내지 예 35 중 임의의 예의 시스템은, 스레드 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 스칼라 처리 코어이도록 이루어진다.
예 42: 예 30 내지 예 36 중 임의의 예의 시스템은, 스레드 병렬 프로그램 페이즈가 고유 제어 흐름들을 사용하는 데이터 의존적 브랜치들을 포함하도록 이루어진다.
예 43: 예 30 내지 예 37 중 임의의 예의 시스템은, 직렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 비-순차적 코어이도록 이루어진다.
예 44: 예 30 내지 예 38 중 임의의 예의 시스템은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 단일 명령어 다중 데이터(SIMD) 명령어들을 실행하기 위한 처리 코어이도록 이루어진다.
예 45: 예 31 내지 예 44 중 임의의 예의 시스템은, 이종 스케줄러가, 컴파일형, 내재성, 어셈블리, 라이브러리들, 중간형, 오프로드, 및 디바이스를 포함하는 다수의 코드 유형들을 지원하도록 이루어진다.
예 46: 예 31 내지 예 45 중 임의의 예의 시스템은, 이종 스케줄러가, 선택된 유형의 처리 요소가 코드 조각을 본연적으로 처리할 수 없을 때 기능성을 에뮬레이팅하도록 이루어진다.
예 47: 예 31 내지 예 46 중 임의의 예의 시스템은, 이종 스케줄러가, 이용가능한 하드웨어 스레드들의 수가 초과신청될 때 기능성을 에뮬레이팅하도록 이루어진다.
예 48: 예 31 내지 예 47 중 임의의 예의 시스템은, 이종 스케줄러가, 선택된 유형의 처리 요소가 코드 조각을 본연적으로 처리할 수 없을 때 기능성을 에뮬레이팅하도록 이루어진다.
예 50: 예 31 내지 예 49 중 임의의 예의 시스템은, 복수의 이종 처리 요소의 처리 요소의 유형의 선택이 사용자에게 투명하도록 이루어진다.
예 51: 예 31 내지 예 50 중 임의의 예의 시스템은, 복수의 이종 처리 요소의 처리 요소의 유형의 선택이 운영 체제에 투명하도록 이루어진다.
예 52: 예 31 내지 예 51 중 임의의 예의 시스템은, 이종 스케줄러가, 각각의 스레드를, 각각의 스레드가 스칼라 코어 상에서 실행되는 것처럼 프로그래머에게 보이게 하는 동종 프로그래밍 모델을 제시하도록 이루어진다.
예 53: 예 52의 임의의 예의 시스템은, 제시된 동종 다중프로세서 프로그래밍 모델이 전체 명령어 세트에 대한 지원의 외관을 제시하도록 이루어진다.
예 54a: 예 31 내지 예 53 중 임의의 예의 시스템은, 복수의 이종 처리 요소들이 메모리 어드레스 공간을 공유하도록 이루어진다.
예 54b: 예 31 내지 예 53의 시스템은, 이종 스케줄러가, 이종 처리 요소들 중 하나 상에서 실행될 이진 변환기를 포함하도록 이루어진다.
예 55: 예 31 내지 예 54 중 임의의 예의 시스템은, 복수의 이종 처리 요소들의 처리 요소의 유형의 기본 선택이 레이턴시 최적화된 코어이도록 이루어진다.
예 56: 예 31 내지 예 55 중 임의의 예의 시스템은, 이종 소프트웨어 스케줄러가, 디스패치된 명령어들에 대한, 다중-프로토콜 인터페이스 상에서 사용하기 위한 프로토콜을 선택하도록 이루어진다.
예 57: 예 56의 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제1 프로토콜이, 시스템 메모리 어드레스 공간에 액세스하는 데 사용될 메모리 인터페이스 프로토콜을 포함하도록 이루어진다.
예 58: 예 56 내지 예 57 중 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제2 프로토콜이, 호스트 캐시 계층구조 및 시스템 메모리를 포함하는 호스트 프로세서의 메모리 서브시스템과 가속기의 로컬 메모리에 저장된 데이터 간에 일관성을 유지하기 위한 캐시 일관성 프로토콜을 포함하도록 이루어진다.
예 59: 예 56 내지 예 58 중 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제3 프로토콜이, 디바이스 발견, 레지스터 액세스, 구성, 초기화, 인터럽트들, 직접 메모리 액세스, 및 어드레스 변환 서비스들을 지원하는 직렬 링크 프로토콜을 포함하도록 이루어진다.
예 60: 예 59의 시스템은, 제3 프로토콜이 주변 구성요소 인터페이스 익스프레스(PCIe) 프로토콜을 포함하도록 이루어진다.
예 61: 방법은: 복수의 명령어들을 수신하는 단계; 복수의 이종 처리 요소들 중 하나 이상 상에서의 실행을 위해 수신된 복수의 명령어들을 디스패치하는 단계를 포함하며, 수신된 복수의 명령어들은 복수의 이종 처리 요소들 중 하나 이상에 의해 처리될 코드 조각에 대응하고, 복수의 명령어들이 복수의 이종 처리 요소들 중의 하나 이상의 이종 처리 요소 중 적어도 하나에 대한 고유 명령어들이도록 이루어진다.
예 62: 예 61의 방법은, 복수의 이종 처리 요소들이 순차적 프로세서 코어, 비-순차적 프로세서 코어, 및 패킹된 데이터 프로세서 코어를 포함하도록 이루어진다.
예 63: 예 62의 방법은, 복수의 이종 처리 요소들이 가속기를 더 포함하도록 이루어진다.
예 64: 예 61 내지 예 63 중 임의의 예의 방법은, 코드 조각의 프로그램 페이즈를 검출하는 단계를 더 포함하며; 복수의 이종 처리 요소들이 제1 마이크로아키텍처를 갖는 제1 처리 요소, 및 제1 마이크로아키텍처와 상이한 제2 마이크로아키텍처를 갖는 제2 처리 요소를 포함하도록 이루어지고; 프로그램 페이즈가 제1 페이즈 및 제2 페이즈를 포함하는 복수의 프로그램 페이즈들 중 하나이도록 이루어지고; 제1 처리 요소에 의한 코드 조각의 처리가 제2 처리 요소에 의한 코드 조각의 처리와 비교하여 개선된 와트 당 성능 특성들을 생성하도록 이루어진다.
예 65: 예 61 내지 예 64 중 임의의 예의 방법은, 수신된 코드 조각을 실행하기 위한 복수의 처리 요소들의 처리 요소의 유형을 선택하는 단계, 및 선택된 유형의 처리 요소들의 처리 요소 상에 코드 조각을 스케줄링하는 단계를 더 포함한다.
예 66: 예 61 내지 예 63 중 임의의 예의 방법은, 코드 조각이 소프트웨어 스레드와 연관된 하나 이상의 명령어이도록 이루어진다.
예 67: 예 64 내지 예 66 중 임의의 예의 방법은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 단일 명령어 다중 데이터(SIMD) 명령어들을 실행하기 위한 처리 코어이도록 이루어진다.
예 68: 예 64 내지 예 66 중 임의의 예의 방법은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 밀집 산술 프리미티브들을 지원하기 위한 회로이도록 이루어진다.
예 69: 예 64 내지 예 68 중 임의의 예의 방법은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 가속기이도록 이루어진다.
예 70: 예 64 내지 예 69 중 임의의 예의 방법은, 데이터 병렬 프로그램 페이즈가 동일한 제어 흐름을 사용하여 동시에 처리되는 데이터 요소들을 특징으로 하도록 이루어진다.
예 71: 예 64 내지 예 70 중 임의의 예의 방법은, 스레드 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 스칼라 처리 코어이도록 이루어진다.
예 72: 예 64 내지 예 71 중 임의의 예의 방법은, 스레드 병렬 프로그램 페이즈가 고유 제어 흐름들을 사용하는 데이터 의존적 브랜치들을 특징으로 하도록 이루어진다.
예 73: 예 64 내지 예 72 중 임의의 예의 방법은, 직렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 비-순차적 코어이도록 이루어진다.
예 74: 예 64 내지 예 73 중 임의의 예의 방법은, 데이터 병렬 프로그램 페이즈의 경우, 선택된 유형의 처리 요소가 단일 명령어 다중 데이터(SIMD) 명령어들을 실행하기 위한 처리 코어이도록 이루어진다.
예 75: 예 61 내지 예 74 중 임의의 예의 방법은, 선택된 유형의 처리 요소가 코드 조각을 본연적으로 처리할 수 없을 때 기능성을 에뮬레이팅하는 단계를 더 포함한다.
예 76: 예 61 내지 예 74 중 임의의 예의 방법은, 이용가능한 하드웨어 스레드들의 수가 초과신청될 때 기능성을 에뮬레이팅하는 단계를 더 포함한다.
예 77: 예 61 내지 예 76 중 임의의 예의 방법은, 복수의 이종 처리 요소의 처리 요소의 유형의 선택이 사용자에게 투명하도록 이루어진다.
예 78: 예 61 내지 예 77 중 임의의 예의 방법은, 복수의 이종 처리 요소들의 처리 요소의 유형의 선택이 운영 체제에 투명하도록 이루어진다.
예 79: 예 61 내지 예 74 중 임의의 예의 방법은, 각각의 스레드를, 각각의 스레드가 스칼라 코어 상에서 실행되는 것처럼 보이게 하는 동종 다중프로세서 프로그래밍 모델을 제시하는 단계를 더 포함한다.
예 80: 예 79의 방법은, 제시된 동종 다중프로세서 프로그래밍 모델이 전체 명령어 세트에 대한 지원의 외관을 제시하도록 이루어진다.
예 81: 예 61 내지 예 79 중 임의의 예의 방법은, 복수의 이종 처리 요소들이 메모리 어드레스 공간을 공유하도록 이루어진다.
예 82: 예 61 내지 예 81 중 임의의 예의 방법은, 이종 처리 요소들 중 하나 상에서 실행되도록 코드 조각을 이진 변환하는 단계를 더 포함한다.
예 83: 예 61 내지 예 82 중 임의의 예의 방법은, 복수의 이종 처리 요소들의 처리 요소의 유형의 기본 선택이 레이턴시 최적화된 코어이도록 이루어진다.
예 84: 비-일시적인 기계 판독가능 매체는, 하드웨어 프로세서에 의해 실행될 때, 예 51 내지 예 83 중 임의의 예의 방법을 수행하는 명령어들을 저장한다.
예 85: 방법은: 이종 스케줄러에서 코드 조각을 수신하는 단계; 코드 조각이 병렬 페이즈에 있는지를 결정하는 단계; 코드 조각이 병렬 페이즈에 있지 않을 때, 코드 조각을 실행하기 위해 레이턴시 민감 처리 요소를 선택하는 단계; 코드 조각이 병렬 페이즈에 있을 때, 병렬성의 유형을 결정하고, 스레드 병렬 코드 조각의 경우, 코드 조각을 실행하기 위해 스칼라 처리 요소를 선택하고, 데이터 병렬 코드 조각의 경우, 데이터 병렬 코드 조각의 데이터 레이아웃을 결정하며, 패킹된 데이터 레이아웃의 경우, 단일 명령어 다중 데이터(SIMD) 처리 요소 및 산술 프리미티브 처리 요소 중 하나를 선택하고, 무작위 데이터 레이아웃의 경우, 수집 명령어들을 사용하는 SIMD 처리 요소, 공간 계산 어레이, 또는 스칼라 코어들의 어레이로부터의 스칼라 코어 중 하나를 선택하는 단계; 및 실행을 위해 코드 조각을 처리 요소에 송신하는 단계를 포함한다.
예 86: 예 85의 방법은, 코드 조각이 병렬 페이즈에 있는지를 결정하기 전에 코드 조각이 가속기에 대한 오프로드의 대상인 때를 결정하는 단계; 코드 조각이 오프로드의 대상일 때, 가속기에 코드 조각을 송신하는 단계를 더 포함한다.
예 87: 예 85 내지 예 86 중 임의의 예의 방법은, 코드 조각이 병렬 페이즈에 있는지를 결정하는 단계가, 검출된 데이터 의존성들, 명령어 유형들, 및 제어 흐름 명령어들 중 하나 이상에 기반하도록 이루어진다.
예 88: 예 87의 방법은, 단일 명령어 다중 데이터 명령어 유형의 명령어들이 병렬 페이즈를 표시하도록 이루어진다.
예 89: 예 85 내지 예 88 중 임의의 예의 방법은, 이종 스케줄러에 의해 처리되는 각각의 운영 체제 스레드가 논리적 스레드 식별자를 배정받도록 이루어진다.
예 90: 예 89의 방법은, 이종 스케줄러가, 각각의 논리적 스레드 식별자가 처리 요소 유형, 처리 요소 식별자, 및 스레드 식별자의 투플에 맵핑되도록 논리적 스레드 식별자들의 스트라이프형 맵핑을 활용하도록 이루어진다.
예 91: 예 90의 방법은, 논리적 스레드 식별자로부터 처리 요소 식별자 및 스레드 식별자로의 맵핑이 나눗셈 및 모듈로를 통해 컴퓨팅되도록 이루어진다.
예 92: 예 91의 방법은, 논리적 스레드 식별자로부터 처리 요소 식별자 및 스레드 식별자로의 맵핑이 스레드 친화성을 보존하기 위해 고정되도록 이루어진다.
예 93: 예 90의 방법은, 논리적 스레드 식별자로부터 처리 요소 유형으로의 맵핑이 이종 스케줄러에 의해 수행되도록 이루어진다.
예 94: 예 93의 방법은, 논리적 스레드 식별자로부터 처리 요소 유형으로의 맵핑이 향후의 처리 요소 유형들을 수용하도록 유연하게 이루어진다.
예 95: 예 91의 방법은, 코어 그룹들 중 적어도 하나가 적어도 하나의 비-순차적 투플, 및 논리적 스레드 식별자들이 동일한 비-순차적 투플에 맵핑되는 스칼라 및 SIMD 투플들을 포함하도록 이종 스케줄러가 코어 그룹들을 활용하게 이루어진다.
예 96: 예 95의 방법은, 코어 그룹들 중 하나에 속하는 스레드들 중에서 고유 페이지 디렉토리 기준 레지스터 값을 갖는 스레드에 의해 비-병렬 페이즈가 결정되도록 이루어진다.
예 97: 예 96의 방법은, 프로세스에 속하는 스레드들이 동일한 어드레스 공간, 페이지 테이블, 및 페이지 디렉토리 기준 레지스터 값을 공유하도록 이루어진다.
예 98: 예 85 내지 예 97 중 임의의 예의 방법은, 이벤트를 검출하는 단계를 더 포함하며, 이는, 이벤트들이, 스레드 기상 명령; 페이지 디렉토리 기준 레지스터에 대한 기입; 휴면 명령; 스레드에서의 페이즈 변화; 및 상이한 코어로의 원하는 재할당을 표시하는 하나 이상의 명령어 중 하나이도록 이루어진다.
예 99: 예 98의 방법은, 이벤트가 스레드 기상 명령일 때: 코드 조각이 병렬 페이즈에 있는지를 결정하고, 기상한 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 수를 계수하는 단계; 계수된 처리 요소들의 수가 하나 초과인지 여부를 결정하는 단계를 더 포함하며, 기상한 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 수의 계수가 1일 때, 스레드는 직렬 페이즈에 있고; 기상한 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 수의 계수가 1이 아닐 때, 스레드는 병렬 페이즈에 있다.
예 100: 예 98의 방법은, 이벤트가 스레드 휴면 명령일 때: 스레드와 연관된 실행 플래그를 소거하고, 영향을 받는 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 스레드들의 수를 계수하고, 비-순차적 처리 요소가 유휴인지 여부를 결정하는 단계를 더 포함하며; 페이지 테이블 기준 포인터가 코어 그룹 내의 정확히 하나의 스레드와 공유될 때, 공유 스레드는 비-순차적 처리 요소로부터 이동되고, 페이지 테이블 기준 포인터가 하나 초과의 스레드와 공유될 때, 코어 그룹의 제1 실행 스레드는 비-순차적 처리 요소로 이전된다.
예 101: 예 100의 방법은, 스레드 휴면 명령이 중단, 대기 진입 및 타임아웃, 또는 일시정지 명령 중 하나이도록 이루어진다.
예 102: 예 98의 방법은, 이벤트가 페이즈 변화일 때: 스레드의 논리적 스레드 식별자가, 스레드가 스칼라 처리 요소 상에서 실행 중이고 SIMD 명령어들이 존재하다고 표시할 때, 스레드를 SIMD 처리 요소로 이전시키는 단계; 스레드의 논리적 스레드 식별자가, 스레드가 SIMD 처리 요소 상에서 실행 중이고 어떠한 SIMD 명령어들도 존재하지 않는다고 표시할 때, 스레드를 스칼라 처리 요소로 이전시키는 단계를 더 포함한다.
예 103: 예 85 내지 예 102 중 임의의 예의 방법은, 코드 조각을 송신하기 전에, 선택된 처리 요소에 더 잘 맞도록 코드 조각을 변환하는 단계를 더 포함한다.
예 104: 예 103의 방법은, 이종 스케줄러가 변환을 수행하기 위한 이진 변환기를 포함하도록 이루어진다.
예 105: 예 103 의 방법은, 이종 스케줄러가 변환을 수행하기 위한 적시 컴파일러를 포함하도록 이루어진다.
예 106: 예 85 내지 예 105 중 임의의 예의 방법은, 방법이, 예 61 내지 예 83의 방법 예들 중 임의의 예의 방법의 단계들을 더 포함하도록 이루어진다.
예 107: 시스템은: 복수의 이종 처리 요소들; 및 이종 스케줄러를 포함하며, 이종 스케줄러는, 코드 조각의 페이즈를 결정하고, 결정된 페이즈에 적어도 부분적으로 기반하여, 실행을 위해, 코드 조각을 복수의 이종 처리 요소들 중 하나에 송신한다.
예 108: 예 107의 시스템은, 이종 스케줄러가: 코드 조각이 병렬 페이즈에 있는지를 결정하고; 코드 조각이 병렬 페이즈에 있지 않을 때, 코드 조각을 실행하기 위해 레이턴시 민감 처리 요소를 선택하고; 코드 조각이 병렬 페이즈에 있을 때, 병렬성의 유형을 결정하고, 스레드 병렬 코드 조각의 경우, 코드 조각을 실행하기 위해 스칼라 처리 요소를 선택하고, 데이터 병렬 코드 조각의 경우, 데이터 병렬 코드 조각의 데이터 레이아웃을 결정하며, 패킹된 데이터 레이아웃의 경우, 단일 명령어 다중 데이터(SIMD) 처리 요소 및 산술 프리미티브 처리 요소 중 하나를 선택하고, 무작위 데이터 레이아웃의 경우, 수집 명령어들을 사용하는 SIMD 처리 요소, 공간 계산 어레이, 또는 스칼라 코어들의 어레이로부터의 스칼라 코어 중 하나를 선택하도록 이루어진다.
예 109: 예 108의 시스템은, 이종 스케줄러가 추가로, 코드 조각이 병렬 페이즈에 있는지를 결정하기 전에 코드 조각이 가속기에 대한 오프로드의 대상인 때를 결정하고; 코드 조각이 오프로드의 대상일 때, 가속기에 코드 조각을 송신하도록 이루어진다.
예 110: 예 108 내지 예 109 중 임의의 예의 시스템은, 이종 스케줄러가 추가로, 검출된 데이터 의존성들, 명령어 유형들, 및 제어 흐름 명령어들 중 하나 이상에 기반하여 코드 조각이 병렬 페이즈에 있는지를 결정하도록 이루어진다.
예 111: 예 110의 시스템은, 단일 명령어 다중 데이터 명령어 유형의 명령어들이 병렬 페이즈를 표시하도록 이루어진다.
예 112: 예 108 내지 예 111 중 임의의 예의 시스템은, 이종 스케줄러에 의해 처리되는 각각의 운영 체제 스레드가 논리적 스레드 식별자를 배정받도록 이루어진다.
예 113: 예 112의 시스템은, 이종 스케줄러가, 각각의 논리적 스레드 식별자가 처리 요소 유형, 처리 요소 식별자, 및 스레드 식별자의 투플에 맵핑되도록 논리적 스레드 식별자들의 스트라이프형 맵핑을 활용하도록 이루어진다.
예 114: 예 112의 시스템은, 논리적 스레드 식별자로부터 처리 요소 식별자 및 스레드 식별자로의 맵핑이 나눗셈 및 모듈로를 통해 컴퓨팅되도록 이루어진다.
예 115: 예 114의 시스템은, 논리적 스레드 식별자로부터 처리 요소 식별자 및 스레드 식별자로의 맵핑이 스레드 친화성을 보존하기 위해 고정되도록 이루어진다.
예 116: 예 115의 시스템은, 논리적 스레드 식별자로부터 처리 요소 유형으로의 맵핑이 이종 스케줄러에 의해 수행되도록 이루어진다.
예 117: 예 116의 시스템은, 논리적 스레드 식별자로부터 처리 요소 유형으로의 맵핑이 향후의 처리 요소 유형들을 수용하도록 유연하게 이루어진다.
예 118: 예 108 내지 예 117의 시스템은, 코어 그룹이 적어도 하나의 비-순차적 투플, 및 논리적 스레드 식별자들이 동일한 비-순차적 투플에 맵핑되는 스칼라 및 SIMD 투플들을 포함하도록 이종 스케줄러가 코어 그룹들을 활용하게 이루어진다.
예 119: 예 118의 시스템은, 코어 그룹들 중 하나에 속하는 스레드들 중에서 고유 페이지 디렉토리 기준 레지스터 값을 갖는 스레드에 의해 비-병렬 페이즈가 결정되도록 이루어진다.
예 120: 예 119의 시스템은, 프로세스에 속하는 스레드들이 동일한 어드레스 공간, 페이지 테이블, 및 페이지 디렉토리 기준 레지스터 값을 공유하도록 이루어진다.
예 121: 예 108 내지 예 120 중 임의의 예의 시스템은, 이종 스케줄러가 이벤트를 검출하도록 이루어지며, 이는, 이벤트들이, 스레드 기상 명령; 페이지 디렉토리 기준 레지스터에 대한 기입; 휴면 명령; 스레드에서의 페이즈 변화; 및 원하는 재할당을 표시하는 하나 이상의 명령어 중 하나이도록 이루어진다.
예 122: 예 121의 시스템은, 이종 스케줄러가, 이벤트가 스레드 기상 명령일 때: 코드 조각이 병렬 페이즈에 있는지를 결정하고, 기상한 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 수를 계수하고; 계수된 처리 요소들의 수가 하나 초과인지 여부를 결정하도록 이루어지며, 기상한 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 수의 계수가 1일 때, 스레드는 직렬 페이즈에 있고; 기상한 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 수의 계수가 1이 아닐 때, 스레드는 병렬 페이즈에 있다.
예 123: 예 121의 시스템은, 이종 스케줄러가, 이벤트가 스레드 휴면 명령일 때: 스레드와 연관된 실행 플래그를 소거하고, 영향을 받는 스레드와 동일한 페이지 테이블 기준 포인터를 공유하는 처리 요소들의 스레드들의 수를 계수하고, 비-순차적 처리 요소가 유휴인지 여부를 결정하도록 이루어지며, 페이지 테이블 기준 포인터가 코어 그룹 내의 정확히 하나의 스레드와 공유될 때, 공유 스레드는 비-순차적 처리 요소로부터 이동되고, 페이지 테이블 기준 포인터가 하나 초과의 스레드와 공유될 때, 그룹의 제1 실행 스레드는 비-순차적 처리 요소로 이전된다.
예 124: 예 123의 시스템은, 스레드 휴면 명령이 중단, 대기 진입 및 타임아웃, 또는 일시정지 명령 중 하나이도록 이루어진다.
예 125: 예 121의 시스템은, 이종 스케줄러가, 이벤트가 페이즈 변화일 때: 스레드의 논리적 스레드 식별자가, 스레드가 스칼라 처리 요소 상에서 실행 중이고 SIMD 명령어들이 존재한다고 표시할 때, 스레드를 SIMD 처리 요소로 이전시키고; 스레드의 논리적 스레드 식별자가, 스레드가 SIMD 처리 요소 상에서 실행 중이고, 어떠한 SIMD 명령어들도 존재하지 않는다고 표시할 때, 스레드를 스칼라 처리 요소로 이전시키도록 이루어진다.
예 126: 예 108 내지 예 125 중 임의의 예의 시스템은, 이종 스케줄러가, 코드 조각을 송신하기 전에, 선택된 처리 요소에 더 잘 맞게 코드 조각을 변환하도록 이루어진다.
예 127: 예 126의 시스템은, 이종 스케줄러가, 실행 시에 변환을 수행하기 위한, 비-일시적인 기계 판독가능 매체에 저장된 이진 변환기를 포함하도록 이루어진다.
예 128: 예 126의 시스템은, 이종 스케줄러가, 실행 시에 변환을 수행하기 위한, 비-일시적인 기계 판독가능 매체에 저장된 적시 컴파일러를 포함하도록 이루어진다.
예 129: 예 108 내지 예 128 중 임의의 예의 시스템은, 이종 스케줄러를 제공하기 위해 이종 프로세서 내의 복수의 이종 처리 요소들 중 적어도 하나에 의해 실행가능한 프로그램 코드를 저장하기 위한 메모리를 더 포함한다.
예 130: 예 108 내지 예 128 중 임의의 예의 시스템은, 이종 스케줄러가 회로를 포함하도록 이루어진다.
예 131: 프로세서는 프로세서 코어를 포함하며, 프로세서 코어는: 프로세서 코어에 고유한 적어도 하나의 명령어를 디코딩하기 위한 디코더, 적어도 하나의 디코딩된 명령어를 실행하기 위한 하나 이상의 실행 유닛을 포함하며, 적어도 하나의 디코딩된 명령어는 가속 시작 명령어에 대응하고, 가속 시작 명령어는 가속기로 오프로딩될 코드의 구역의 시작을 표시하기 위한 것이다.
예 132: 예 131의 프로세서는, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 133: 예 131의 프로세서는, 가속 시작 명령어에 대응하는 적어도 하나의 디코딩된 명령어의 실행에 대한 응답으로, 프로세서 코어가 제1 실행 모드로부터 제2 실행 모드로 전환하도록 이루어진다.
예 134: 예 133의 프로세서는, 제1 실행 모드에서, 프로세서 코어가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서 코어가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 135: 예 134의 프로세서는, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 136: 예 133 내지 예 135 중 임의의 하나의 예의 프로세서는, 제1 실행 모드에서, 메모리 순서화 요건들을 완화시킴으로써 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 137: 예 133 내지 예 136 중 임의의 하나의 예의 프로세서는, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 138: 방법은, 프로세서 코어에 고유한 명령어를 디코딩하는 단계; 및 가속 시작 명령어에 대응하는 디코딩된 명령어를 실행하는 단계를 포함하며, 가속 시작 명령어는 가속기에 오프로딩될 코드의 구역의 시작을 표시하기 위한 것이다.
예 139: 예 138의 방법은, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 140: 예 138의 방법은, 가속 시작 명령어에 대응하는 디코딩된 명령어의 실행에 대한 응답으로, 프로세서 코어가 제1 실행 모드로부터 제2 실행 모드로 전환하도록 이루어진다.
예 141: 예 140의 방법은, 제1 실행 모드에서, 프로세서 코어가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서 코어가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 142: 예 141의 방법은, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 143: 예 140 내지 예 142 중 임의의 하나의 예의 방법은, 제1 실행 모드에서, 메모리 순서화 요건들을 완화시킴으로써 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 144: 예 140 내지 예 143 중 임의의 하나의 예의 방법은, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 145: 비-일시적인 기계 판독가능 매체는 명령어를 저장하며, 명령어는, 프로세서에 의해 실행될 때 프로세서로 하여금 방법을 수행하게 하고, 방법은, 프로세서 코어에 고유한 명령어를 디코딩하는 단계; 및 가속 시작 명령어에 대응하는 디코딩된 명령어를 실행하는 단계를 포함하며, 가속 시작 명령어는 가속기에 오프로딩될 코드의 구역의 시작을 표시하기 위한 것이다.
예 146: 예 145의 방법은, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 147: 예 145의 방법은, 가속 시작 명령어에 대응하는 디코딩된 명령어의 실행에 대한 응답으로, 프로세서 코어가 제1 실행 모드로부터 제2 실행 모드로 전환하도록 이루어진다.
예 148: 예 147의 방법은, 제1 실행 모드에서, 프로세서 코어가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서 코어가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 149: 예 148의 방법은, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 150: 예 148 내지 예 149 중 임의의 하나의 예의 방법은, 제1 실행 모드에서, 메모리 순서화 요건들을 완화시킴으로써 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 151: 예 148 내지 예 150 중 임의의 하나의 예의 방법은, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 152: 시스템은 프로세서 코어를 포함하며, 프로세서 코어는: 프로세서 코어에 고유한 적어도 하나의 명령어를 디코딩하기 위한 디코더, 적어도 하나의 디코딩된 명령어를 실행하기 위한 하나 이상의 실행 유닛을 포함하며, 적어도 하나의 디코딩된 명령어는 가속 시작 명령어에 대응하고, 가속 시작 명령어는 가속기로 오프로딩될 코드의 구역의 시작을 표시하기 위한 것이다.
예 153: 예 152의 시스템은, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 154: 예 152의 시스템은, 가속 시작 명령어에 대응하는 적어도 하나의 디코딩된 명령어의 실행에 대한 응답으로, 프로세서 코어가 제1 실행 모드로부터 제2 실행 모드로 전환하도록 이루어진다.
예 155: 예 154의 시스템은, 제1 실행 모드에서, 프로세서 코어가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서 코어가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 156: 예 155의 시스템은, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 157: 예 152 내지 예 156 중 임의의 하나의 예의 프로세서는, 제1 실행 모드에서, 메모리 순서화 요건들을 완화시킴으로써 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 158: 예 152 내지 예 157 중 임의의 하나의 예의 프로세서는, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 159: 프로세서는 프로세서 코어를 포함하며, 프로세서 코어는: 프로세서 코어에 고유한 명령어를 디코딩하기 위한 디코더, 가속 종료 명령어에 대응하는 디코딩된 명령어를 실행하기 위한 하나 이상의 실행 유닛을 포함하며, 가속 종료 명령어는 가속기로 오프로딩될 코드의 구역의 종료를 표시하기 위한 것이다.
예 160: 예 159의 프로세서는, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 수신 및 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 161: 예 159의 프로세서는, 프로세서 코어를 제1 실행 모드로부터 제2 실행 모드로 전환하기 위한 가속 시작 명령어에 대응하는 디코딩된 명령어의 실행에 의해 코드의 구역이 기술되도록 이루어진다.
예 162: 예 161의 프로세서는, 제1 실행 모드에서, 프로세서가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 163: 예 162의 프로세서는, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 164: 예 161 내지 예 163 중 임의의 하나의 예의 프로세서는, 제1 실행 모드에서, 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 165: 예 161 내지 예 164 중 임의의 하나의 예의 프로세서는, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 166: 예 159 내지 예 165 중 임의의 하나의 예의 프로세서는, 가속기 시작 명령어의 실행이 가속기 종료 명령어가 실행될 때까지 프로세서 코어 상에서의 코드의 구역의 실행을 게이팅하도록 이루어진다.
예 167: 방법은, 프로세서 코어에 고유한 명령어를 디코딩하는 단계; 및 가속 종료 명령어에 대응하는 디코딩된 명령어를 실행하는 단계를 포함하며, 가속 종료 명령어는 가속기에 오프로딩될 코드의 구역의 종료를 표시하기 위한 것이다.
예 168: 예 167의 방법은, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 수신 및 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 169: 예 167의 방법은, 프로세서 코어를 제1 실행 모드로부터 제2 실행 모드로 전환하기 위한 가속 시작 명령어에 대응하는 디코딩된 명령어의 실행에 의해 코드의 구역이 기술되도록 이루어진다.
예 170: 예 169의 방법은, 제1 실행 모드에서, 프로세서가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 171: 예 170의 방법은, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 172: 예 169 내지 예 171 중 임의의 하나의 예의 방법은, 제1 실행 모드에서, 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 173: 예 169 내지 예 172 중 임의의 하나의 예의 방법은, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 174: 예 167 내지 예 173 중 임의의 하나의 예의 방법은, 가속기 시작 명령어의 실행이 가속기 종료 명령어가 실행될 때까지 프로세서 코어 상에서의 코드의 구역의 실행을 게이팅하도록 이루어진다.
예 175: 비-일시적인 기계 판독가능 매체는 명령어를 저장하며, 명령어는, 프로세서에 의해 실행될 때 프로세서로 하여금 방법을 수행하게 하고, 방법은, 프로세서 코어에 고유한 명령어를 디코딩하는 단계; 및 가속 종료 명령어에 대응하는 디코딩된 명령어를 실행하는 단계를 포함하며, 가속 종료 명령어는 가속기에 오프로딩될 코드의 구역의 종료를 표시하기 위한 것이다.
예 176: 예 175의 비-일시적인 기계 판독가능 매체는, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 수신 및 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 177: 예 175의 비-일시적인 기계 판독가능 매체는, 프로세서 코어를 제1 실행 모드로부터 제2 실행 모드로 전환하기 위한 가속 시작 명령어에 대응하는 디코딩된 명령어의 실행에 의해 코드의 구역이 기술되도록 이루어진다.
예 178: 예 177의 비-일시적인 기계 판독가능 매체는, 제1 실행 모드에서, 프로세서가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 179: 예 178의 비-일시적인 기계 판독가능 매체는, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 180: 예 177 내지 예 179 중 임의의 하나의 예의 비-일시적인 기계 판독가능 매체는, 제1 실행 모드에서, 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 181: 예 177 내지 예 180 중 임의의 하나의 예의 비-일시적인 기계 판독가능 매체는, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 182: 예 175 내지 예 181 중 임의의 하나의 예의 비-일시적인 기계 판독가능 매체는, 가속기 시작 명령어의 실행이 가속기 종료 명령어가 실행될 때까지 프로세서 코어 상에서의 코드의 구역의 실행을 게이팅하도록 이루어진다.
예 183: 시스템은 프로세서 코어를 포함하며, 프로세서 코어는: 프로세서 코어에 고유한 명령어를 디코딩하기 위한 디코더, 가속 종료 명령어에 대응하는 디코딩된 명령어를 실행하기 위한 하나 이상의 실행 유닛 ― 가속 종료 명령어는 가속기로 오프로딩될 코드의 구역의 종료를 표시하기 위한 것임 ―, 및 오프로딩된 명령어들을 실행하기 위한 가속기를 포함한다.
예 184: 예 183의 시스템은, 대상 가속기가 프로세서 코어에 결합되어 있고 코드의 구역을 처리하는 데 이용가능한지 여부에 기반하여 코드의 구역이 오프로딩되도록 이루어지고, 대상 가속기가 코드의 구역을 수신 및 처리하도록 프로세스 코어에 결합되어 있지 않을 때, 프로세서 코어에 의해 코드의 구역이 처리되도록 이루어진다.
예 185: 예 184의 시스템은, 프로세서 코어를 제1 실행 모드로부터 제2 실행 모드로 전환하기 위한 가속 시작 명령어에 대응하는 디코딩된 명령어의 실행에 의해 코드의 구역이 기술되도록 이루어진다.
예 186: 예 185의 시스템은, 제1 실행 모드에서, 프로세서가 자기-수정 코드를 검사하고, 제2 실행 모드에서, 프로세서가 자기-수정 코드에 대한 검사를 디스에이블하도록 이루어진다.
예 187: 예 186의 시스템은, 자기-수정 코드 검사를 디스에이블하기 위해, 자기-수정 코드 검출 회로가 디스에이블되도록 이루어진다.
예 188: 예 185 내지 예 187 중 임의의 하나의 예의 시스템은, 제1 실행 모드에서, 메모리 일관성 모델 제한들이 약화되도록 이루어진다.
예 189: 예 185 내지 예 188 중 임의의 하나의 예의 시스템은, 제1 실행 모드에서, 부동 소수점 제어 워드 레지스터를 설정함으로써 부동 소수점 시맨틱들이 변경되도록 이루어진다.
예 190: 예 183 내지 예 190 중 임의의 하나의 예의 시스템은, 가속기 시작 명령어의 실행이 가속기 종료 명령어가 실행될 때까지 프로세서 코어 상에서의 코드의 구역의 실행을 게이팅하도록 이루어진다.
예 191: 시스템은 스레드를 실행하기 위한 가속기; 프로세서 코어; 및 이종 스케줄러를 구현하기 위한 소프트웨어가 저장된 메모리를 포함하며, 이종 스케줄러는, 프로세서 코어에 의해 실행될 때, 가속기 상에서의 잠재적 실행에 적합한 스레드에서의 코드 시퀀스를 검출하고, 검출된 코드 시퀀스를 실행하기 위한 가속기를 선택하고, 선택된 가속기에 검출된 코드 시퀀스를 송신하도록 이루어진다.
예 192: 예 191의 시스템은, 가속기에 의한 실행에 적합하지 않은 스레드의 프로그램 페이즈들을 실행하기 위한 복수의 이종 처리 요소들을 더 포함한다.
예 193: 예 191 내지 예 192 중 임의의 예의 시스템은, 이종 스케줄러가, 코드 시퀀스를 미리 결정된 세트의 패턴들과 비교함으로써 코드 시퀀스를 인식하기 위한 패턴 매칭기를 더 포함하도록 이루어진다.
예 194: 예 193의 시스템은, 미리 결정된 세트의 패턴들이 메모리에 저장되도록 이루어진다.
예 195: 예 191 내지 예 194 중 임의의 예의 시스템은, 이종 스케줄러가, 성능 모니터링을 사용하여 패턴 매치를 갖지 코드를 인식하고, 다음의 것들: 자기 수정 코드를 무시하는 것, 메모리 일관성 모델 제한들을 약화시키는 것, 부동 소수점 시맨틱들을 변경하는 것, 성능 모니터링을 변경하는 것, 및 아키텍처 플래그 사용을 변경하는 것 중 하나 이상을 행하도록 프로세서 코어를 구성함으로써 스레드와 연관된 연산 모드를 조정하도록 이루어진다.
예 196: 예 191 내지 예 195 중 임의의 예의 시스템은, 이종 스케줄러가, 인식된 코드를 가속기가 실행하기 위한 가속기 코드로 변환하기 위한 변환 모듈을 더 포함하도록 이루어진다.
예 197: 예 191 내지 예 196 중 임의의 예의 시스템은, 프로세서 코어가, 저장된 패턴들을 사용하여 스레드에서의 코드 시퀀스들을 검출하기 위한 패턴 매칭 회로를 포함하도록 이루어진다.
예 198: 예 191 내지 예 197 중 임의의 예의 시스템은, 프로세서 코어가, 시스템에서 실행되는 각각의 스레드의 실행 상태들을 유지하도록 이루어진다.
예 199: 예 191 내지 예 197 중 임의의 예의 시스템은, 이종 스케줄러가, 시스템에서 실행되는 각각의 스레드의 상태들을 유지하도록 이루어진다.
예 200: 예 191 내지 예 199 중 임의의 예의 시스템은, 이종 스케줄러가, 프로세서 요소 정보, 추적된 스레드들, 및 검출된 코드 시퀀스들 중 하나 이상에 기반하여 가속기를 선택하도록 이루어진다.
예 201: 시스템은, 복수의 이종 처리 요소들; 및 복수의 처리 요소들에 결합되는 이종 스케줄러 회로를 포함하며, 이종 스케줄러 회로는, 각각의 스레드 실행 및 각각의 처리 요소의 실행 상태들을 유지하기 위한 스레드 및 실행 요소 추적기 테이블 및 선택기를 포함하고, 선택기는, 코드 조각을 처리할 복수의 이종 처리 요소들의 처리 요소의 유형을 선택하고, 스레드 및 처리 요소 추적기로부터의 상태 및 처리 요소 정보에 기반하여, 실행을 위해 복수의 이종 처리 요소들 중 하나의 이종 처리 요소 상에 코드 조각을 스케줄링하기 위한 것이다.
예 202: 예 201의 시스템은, 프로세서 코어에 의해 실행가능한 소프트웨어를 저장하기 위한 메모리를 더 포함하며, 소프트웨어는, 이종 스케줄러 회로에 결합된 복수의 이종 처리 요소들 중 하나인 가속기 상에서의 잠재적 실행을 위한 스레드에서의 코드 시퀀스를 검출하기 위한 것이다.
예 203: 예 202의 시스템은, 소프트웨어 패턴 매칭기가 저장된 패턴으로부터 코드 시퀀스를 인식하도록 이루어진다.
예 204: 예 201 내지 예 203 중 임의의 예의 시스템은, 이종 스케줄러가, 인식된 코드를 가속기 코드로 변환하도록 이루어진다.
예 205: 예 201 내지 예 204 중 임의의 예의 시스템은, 선택기가 이종 스케줄러 회로에 의해 실행되는 유한 상태 기계이도록 이루어진다.
예 206: 방법은, 스레드를 실행하는 단계; 실행되는 스레드에서 패턴을 검출하는 단계; 인식된 패턴을 가속기 코드로 변환하는 단계; 및 변환된 패턴을 실행을 위해 이용가능한 가속기로 전송하는 단계를 포함한다.
예 207: 예 206의 방법은, 패턴이 소프트웨어 패턴 매칭기를 사용하여 인식되도록 이루어진다.
예 208: 예 206의 방법은, 패턴이 하드웨어 패턴 매치 회로를 사용하여 인식되도록 이루어진다.
예 209: 방법은, 스레드를 실행하는 단계; 실행되는 스레드에서 패턴을 검출하는 단계; 패턴에 기반하여 완화된 요건들을 사용하기 위해 스레드와 연관된 연산 모드를 조정하는 단계를 포함한다.
예 210: 예 209의 방법은, 패턴이 소프트웨어 패턴 매칭기를 사용하여 인식되도록 이루어진다.
예 211: 예 209의 방법은, 패턴이 하드웨어 패턴 매치 회로를 사용하여 인식되도록 이루어진다.
예 212: 예 209의 방법은, 조정된 연산 모드에서, 다음의 것들: 자기 수정 코드가 무시되는 것, 메모리 일관성 모델 제한들이 약화되는 것, 부동 소수점 시맨틱들이 변경되는 것, 성능 모니터링이 변경되는 것, 및 아키텍처 플래그 사용이 변경되는 것 중 하나 이상이 적용되도록 이루어진다.
예 213: 시스템은, 프로세서 코어에 고유한 명령어를 디코딩하기 위한 디코더; 및 디코딩된 명령어를 실행하기 위한 하나 이상의 실행 유닛을 포함하며, 디코딩된 명령어들 중 하나 이상은 가속 시작 명령어에 대응하고, 가속 시작 명령어는, 동일한 스레드에서 가속 시작 명령어에 후속하는 명령어들에 대해 상이한 실행 모드로 진입하게 한다.
예 214: 예 213의 시스템은, 가속 시작 명령어가 메모리 데이터 블록에 대한 포인터를 특정하는 필드를 포함하도록 이루어지고, 메모리 데이터 블록의 포맷이 인터럽트 이전의 진행을 표시하기 위한 시퀀스 번호 필드를 포함하도록 이루어진다.
예 215: 예 213 내지 예 214 중 임의의 예의 시스템은, 가속 시작 명령어가, 메모리에 저장된 코드의 미리 정의된 변환들을 특정하기 위한 블록 부류 식별자 필드를 포함하도록 이루어진다.
예 216: 예 213 내지 예 215 중 임의의 예의 시스템은, 가속 시작 명령어가, 실행을 위해 사용하기 위한 하드웨어의 유형을 표시하기 위한 구현 식별자 필드를 포함하도록 이루어진다.
예 217: 예 213 내지 예 216 중 임의의 예의 시스템은, 가속 시작 명령어가, 가속 시작 명령어가 실행된 후에 수정될 레지스터들을 저장하기 위한 상태 저장 영역의 크기 및 포맷을 표시하기 위한 저장 상태 영역 크기 필드를 포함하도록 이루어진다.
예 218: 예 213 내지 예 217 중 임의의 예의 시스템은, 가속 시작 명령어가 로컬 저장 영역 크기에 대한 필드를 포함하도록 이루어지고, 로컬 저장 영역이 레지스터들을 넘어서는 저장을 제공하도록 이루어진다.
예 219: 예 218의 시스템은, 로컬 저장 영역 크기가 가속 시작 명령어의 즉시 피연산자에 의해 정의되도록 이루어진다.
예 220: 예 218의 시스템은, 로컬 저장 영역이 가속 시작 명령어에 후속하는 명령어들 외에는 액세스되지 않도록 이루어진다.
예 221: 예 213 내지 예 220 중 임의의 예의 시스템은, 상이한 실행 모드 내의 명령어들에 대해 메모리 의존성 유형이 정의가능하도록 이루어진다.
예 222: 예 221의 시스템은, 정의가능한 메모리 의존성 유형이: 저장-로드 및 저장-저장 의존성들이 존재하지 않는 것으로 보장되는 독립적 유형; 로컬 저장 영역에 대한 로드들 및 저장들은 서로에 대해 의존적일 수 있지만 다른 로드들 및 저장들로부터는 독립적인, 로컬 저장 영역에 대한 잠재적인 의존적 액세스 유형; 하드웨어가 명령어들 간의 의존성들을 동적으로 검사하고 강제할 잠재적인 의존적인 유형; 및 로드들 및 저장들이 그들 자신들 사이에서 의존적이고 메모리가 원자적으로 업데이트되는 원자적 유형 중 하나를 포함하도록 이루어진다.
예 223: 예 213 내지 예 222 중 임의의 예의 시스템은, 사용될 레지스터들, 업데이트될 플래그들, 및 구현 규격 정보를 포함하는 저장 상태; 및 레지스터들을 넘어서는, 실행 동안 사용될 로컬 저장소를 저장하기 위한 메모리를 더 포함한다.
예 224: 예 223의 시스템은, 병렬 실행의 각각의 인스턴스가 자신 고유의 로컬 저장소를 획득하도록 이루어진다.
예 225: 방법은, 스레드에 대해 상이한 완화된 실행 모드에 진입하는 단계; 저장 상태 영역에, 상이한 완화된 실행 모드 동안에 스레드의 실행 동안 사용될 레지스터들을 기입하는 단계; 상이한 완화된 실행 모드 동안에 스레드에서의 병렬 실행마다 사용될 로컬 저장소를 예비하는 단계; 상이한 완화된 실행 모드 내에서 스레드의 블록을 실행하고 명령어들을 추적하는 단계; 가속기 종료 명령어의 실행에 기반하여 상이한 실행 모드의 종료에 도달했는지를 결정하는 단계; 상이한 실행 모드의 종료에 도달했을 때, 저장 상태 영역으로부터 레지스터들 및 플래그들을 복원하는 단계 및 상이한 실행 모드의 종료에 도달하지 않았을 때, 중간 결과들로 로컬 저장소를 업데이트하는 단계를 포함한다.
예 226: 예 225의 방법은, 상이한 완화된 실행 모드 동안, 다음의 것들: 자기 수정 코드가 무시되는 것, 메모리 일관성 모델 제한들이 약화되는 것, 부동 소수점 시맨틱들이 변경되는 것, 성능 모니터링이 변경되는 것, 및 아키텍처 플래그 사용이 변경되는 것 중 하나 이상이 발생하도록 이루어진다.
예 227: 예 225 또는 예 226의 방법은, 가속기 시작 명령어의 실행에 기반하여 상이한 실행 모드에 진입되도록 이루어진다.
예 228: 예 225의 방법은, 결정된 패턴에 기반하여 상이한 실행 모드에 진입되도록 이루어진다.
예 229: 예 225 내지 예 228 중 임의의 예의 방법은, 가속기 시작 명령어가 실행된 후에 수정될 레지스터들을 저장하기 위한 상태 저장 영역의 크기 및 포맷이, 가속기 시작 명령어가 가리키는 메모리 블록에 정의되도록 이루어진다.
예 230: 예 225 내지 예 229 중 임의의 예의 방법은, 스레드 또는 스레드의 일부를 실행 전에 변환하는 단계를 더 포함한다.
예 231: 예 230의 방법은, 스레드 또는 스레드의 일부가 가속기 코드로 변환되도록 이루어진다.
예 232: 예 230 또는 예 231의 방법은, 변환된 스레드 또는 스레드의 변환된 부분이 가속기에 의해 실행되도록 이루어진다.
예 233: 예 213 내지 예 232 중 임의의 예의 방법은, 블록의 명령어가, 스레드의 상기 블록과 연관된 메모리 블록에서의 시퀀스 번호를 업데이트함으로써 추적되도록 이루어진다.
예 234: 예 223 내지 예 233 중 임의의 예의 방법은, 명령어가 성공적으로 실행되고 퇴거됨에 따라 스레드의 블록의 시퀀스 번호가 업데이트되도록 이루어진다.
예 235: 예 223 내지 예 234 중 임의의 예의 방법은, 가속기 종료 명령어가 실행되고 퇴거될 때 상이한 실행 모드의 종료에 도달하도록 이루어진다.
예 236: 예 223 내지 예 235 중 임의의 예의 방법은, 가속기 종료 명령어 실행에 의해 결정된 바와 같이 상이한 실행 모드의 종료에 도달하지 않았을 때, 블록의 부분들을 실행하려 시도하기 위해, 중간 결과들을 사용하려 시도하도록 이루어진다.
예 237: 예 236의 방법은, 비-가속기 처리 요소가 예외 또는 인터럽트 후에 중간 결과들로 실행되도록 사용되게 이루어진다.
예 238: 예 223 내지 예 237 중 임의의 예의 방법은, 상이한 실행 모드의 종료에 도달하지 않았을 때, 가속기 사용이 시작된 지점으로 실행을 롤백하도록 이루어진다.
예 239: 시스템은, 연산코드, 제1 패킹된 데이터 소스 피연산자를 위한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자를 위한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 위한 필드를 갖는 명령어를 디코딩하기 위한 디코더; 및 제2 내지 N개의 패킹된 데이터 소스 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 디코딩된 명령어를 실행하여, 1) 그 패킹된 데이터 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 패킹된 데이터 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치에 저장하기 위한 실행 회로를 포함한다.
예 240: 예 239의 시스템은, N이 연산코드에 의해 표시되도록 이루어진다.
예 241: 예 239 내지 예 240 중 임의의 예의 시스템은, 소스 피연산자들의 값들이 곱셈-가산기 어레이의 레지스터들로 복사되도록 이루어진다.
예 242: 예 239 내지 예 241 중 임의의 예의 시스템은, 실행 회로가 이진 트리 감소 네트워크를 포함하도록 이루어진다.
예 243: 예 242의 임의의 예의 시스템은, 실행 회로가 가속기의 일부이도록 이루어진다.
예 244: 예 242의 시스템은, 이진 트리 감소 네트워크가 쌍으로 된 제1 세트의 합산 회로들에 결합된 복수의 곱셈 회로들을 포함하도록 이루어지고, 제1 세트의 합산 회로들이 제2 세트의 합산 회로들에 결합되고, 제2 세트의 합산 회로들이 제3 세트의 합산 회로들에 결합되고, 제3 세트의 합산 회로들이 또한 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 결합되도록 이루어진다.
예 245: 예 244의 시스템은, 각각의 곱셈이 병렬로 처리되도록 이루어진다.
예 246: 예 239 내지 예 245 중 임의의 예의 시스템은, 패킹된 데이터 요소들이 하나 이상의 행렬들의 요소들에 대응하도록 이루어진다.
예 247: 방법은, 연산코드, 제1 패킹된 데이터 소스 피연산자를 위한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자를 위한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 위한 필드를 갖는 명령어를 디코딩하는 단계; 및 제2 내지 N개의 패킹된 데이터 소스 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 디코딩된 명령어를 실행하여, 1) 그 패킹된 데이터 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 패킹된 데이터 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치에 저장하는 단계를 포함한다.
예 248: 예 247의 방법은, N이 연산코드에 의해 표시되도록 이루어진다.
예 249: 예 247 내지 예 248 중 임의의 예의 방법은, 소스 피연산자들의 값들이 곱셈-가산기 어레이의 레지스터들로 복사되도록 이루어진다.
예 250: 예 247 내지 예 249 중 임의의 예의 방법은, 실행 회로가 이진 트리 감소 네트워크를 포함하도록 이루어진다.
예 251: 예 247의 방법은, 이진 트리 감소 네트워크가 쌍으로 된 제1 세트의 합산 회로들에 결합된 복수의 곱셈 회로들을 포함하도록 이루어지고, 제1 세트의 합산 회로들이 제2 세트의 합산 회로들에 결합되고, 제2 세트의 합산 회로들이 제3 세트의 합산 회로들에 결합되고, 제3 세트의 합산 회로들이 또한 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 결합되도록 이루어진다.
예 252: 예 251의 방법은, 각각의 패킹된 데이터 피연산자가 8개의 패킹된 데이터 요소들을 갖도록 이루어진다.
예 253: 예 251의 방법은, 각각의 곱셈이 병렬로 처리되도록 이루어진다.
예 254: 예 247 내지 예 253 중 임의의 예의 방법은, 패킹된 데이터 요소들이 하나 이상의 행렬들의 요소들에 대응하도록 이루어진다.
예 255: 비-일시적인 기계 판독가능 매체는 명령어를 저장하며, 명령어는, 프로세서에 의해 실행될 때 프로세서로 하여금 방법을 수행하게 하고, 방법은, 연산코드, 제1 패킹된 데이터 소스 피연산자를 위한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자를 위한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 위한 필드를 갖는 명령어를 디코딩하는 단계; 및 제2 내지 N개의 패킹된 데이터 소스 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 디코딩된 명령어를 실행하여, 1) 그 패킹된 데이터 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 패킹된 데이터 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치에 저장하는 단계를 포함한다.
예 256: 예 255의 비-일시적인 기계 판독가능 매체는, N이 연산코드에 의해 표시되도록 이루어진다.
예 257: 예 255 내지 예 256 중 임의의 예의 비-일시적인 기계 판독가능 매체는, 소스 피연산자들의 값들이 곱셈-가산기 어레이의 레지스터들로 복사되도록 이루어진다.
예 258: 예 255 내지 예 257 중 임의의 예의 비-일시적인 기계 판독가능 매체는, 실행 회로가 이진 트리 감소 네트워크를 포함하도록 이루어진다.
예 259: 예 258의 비-일시적인 기계 판독가능 매체는, 이진 트리 감소 네트워크가 쌍으로 된 제1 세트의 합산 회로들에 결합된 복수의 곱셈 회로들을 포함하도록 이루어지고, 제1 세트의 합산 회로들이 제2 세트의 합산 회로들에 결합되고, 제2 세트의 합산 회로들이 제3 세트의 합산 회로들에 결합되고, 제3 세트의 합산 회로들이 또한 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 결합되도록 이루어진다.
예 260: 예 259의 비-일시적인 기계 판독가능 매체는, 각각의 패킹된 데이터 피연산자가 8개의 패킹된 데이터 요소들을 갖도록 이루어진다.
예 261: 예 259의 비-일시적인 기계 판독가능 매체는, 각각의 곱셈이 병렬로 처리되도록 이루어진다.
예 262: 예 255 내지 예 261 중 임의의 예의 비-일시적인 기계 판독가능 매체는, 패킹된 데이터 요소들이 하나 이상의 행렬들의 요소들에 대응하도록 이루어진다.
예 263: 방법은, 연산코드, 제1 패킹된 데이터 소스 피연산자를 위한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자를 위한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 위한 필드를 갖는 명령어를 디코딩하는 단계; 및 제2 내지 N개의 패킹된 데이터 소스 레지스터 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 디코딩된 명령어를 실행하여, 1) 그 패킹된 데이터 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 패킹된 데이터 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 쌍으로 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 저장하는 단계를 포함한다.
예 264: 예 263의 방법은, N이 연산코드에 의해 표시되도록 이루어진다.
예 265: 예 263 내지 예 264 중 임의의 예의 방법은, 소스 피연산자들의 값들이 곱셈-가산기 어레이의 레지스터들로 복사되도록 이루어진다.
예 266: 예 265의 방법은, 실행 회로가 이진 트리 감소 네트워크이도록 이루어진다.
예 267: 예 266의 방법은, 이진 트리 감소 네트워크가 쌍으로 된 제1 세트의 합산 회로들에 결합된 복수의 곱셈 회로들을 포함하도록 이루어지고, 제1 세트의 합산 회로들이 제2 세트의 합산 회로들에 결합되고, 제2 세트의 합산 회로들이 제3 세트의 합산 회로들에 결합되고, 제3 세트의 합산 회로들이 또한 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 결합되도록 이루어진다.
예 268: 예 263 내지 예 267 중 임의의 예의 방법은, 각각의 패킹된 데이터 피연산자가 8개의 패킹된 데이터 요소들을 갖도록 이루어진다.
예 269: 예 268 내지 예 268 중 임의의 예의 방법은, 각각의 곱셈이 병렬로 처리되도록 이루어진다.
예 270: 비-일시적인 기계 판독가능 매체는 명령어를 저장하며, 명령어는, 프로세서에 의해 실행될 때 프로세서로 하여금 방법을 수행하게 하고, 방법은, 연산코드, 제1 패킹된 데이터 소스 피연산자를 위한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자를 위한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 위한 필드를 갖는 명령어를 디코딩하는 단계; 및 제2 내지 N개의 패킹된 데이터 소스 레지스터 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 디코딩된 명령어를 실행하여, 1) 그 패킹된 데이터 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 패킹된 데이터 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 쌍으로 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 저장하는 단계를 포함한다.
예 271: 예 270의 비-일시적인 기계 판독가능 매체는, N이 연산코드에 의해 표시되도록 이루어진다.
예 272: 예 270 내지 예 271 중 임의의 예의 비-일시적인 기계 판독가능 매체는, 소스 피연산자들의 값들이 곱셈-가산기 어레이의 레지스터들로 복사되도록 이루어진다.
예 273: 예 272의 비-일시적인 기계 판독가능 매체는, 실행 회로가 이진 트리 감소 네트워크이도록 이루어진다.
예 274: 예 272의 비-일시적인 기계 판독가능 매체는, 이진 트리 감소 네트워크가 쌍으로 된 제1 세트의 합산 회로들에 결합된 복수의 곱셈 회로들을 포함하도록 이루어지고, 제1 세트의 합산 회로들이 제2 세트의 합산 회로들에 결합되고, 제2 세트의 합산 회로들이 제3 세트의 합산 회로들에 결합되고, 제3 세트의 합산 회로들이 또한 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 결합되도록 이루어진다.
예 275: 예 270 내지 예 274 중 임의의 예의 비-일시적인 기계 판독가능 매체는, 각각의 패킹된 데이터 피연산자가 8개의 패킹된 데이터 요소들을 갖도록 이루어진다.
예 276: 예 270 내지 예 275 중 임의의 예의 비-일시적인 기계 판독가능 매체는, 각각의 곱셈이 병렬로 처리되도록 이루어진다.
예 277: 시스템은, 연산코드, 제1 패킹된 데이터 소스 피연산자를 위한 필드, 제2 내지 N개의 패킹된 데이터 소스 피연산자를 위한 하나 이상의 필드, 및 패킹된 데이터 목적지 피연산자를 위한 필드를 갖는 명령어를 디코딩하기 위한 디코더; 및 제2 내지 N개의 패킹된 데이터 소스 레지스터 피연산자의 각각의 패킹된 데이터 요소 위치에 대해, 디코딩된 명령어를 실행하여, 1) 그 패킹된 데이터 소스 피연산자의 그 패킹된 데이터 요소 위치의 데이터 요소를 제1 패킹된 데이터 소스 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소와 곱하여 임시 결과를 생성하고, 2) 임시 결과들을 쌍으로 합산하고, 3) 임시 결과들의 합을 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 가산하고, 4) 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 대한 임시 결과들의 합을 저장하기 위한 실행 회로를 포함한다.
예 278: 예 277의 시스템은, N이 연산코드에 의해 표시되도록 이루어진다.
예 279: 예 277 내지 예 278 중 임의의 예의 시스템은, 소스 피연산자들의 값들이 곱셈-가산기 어레이의 레지스터들로 복사되도록 이루어진다.
예 280: 예 279의 시스템은, 실행 회로가 이진 트리 감소 네트워크이도록 이루어진다.
예 281: 예 279의 시스템은, 이진 트리 감소 네트워크가 쌍으로 된 제1 세트의 합산 회로들에 결합된 복수의 곱셈 회로들을 포함하도록 이루어지고, 제1 세트의 합산 회로들이 제2 세트의 합산 회로들에 결합되고, 제2 세트의 합산 회로들이 제3 세트의 합산 회로들에 결합되고, 제3 세트의 합산 회로들이 또한 패킹된 데이터 목적지 피연산자의 대응하는 패킹된 데이터 요소 위치의 데이터 요소에 결합되도록 이루어진다.
예 282: 예 277 내지 예 281 중 임의의 예의 시스템은, 각각의 패킹된 데이터 피연산자가 8개의 패킹된 데이터 요소들을 갖도록 이루어진다.
예 283: 예 277 내지 예 282 중 임의의 예의 시스템은, 각각의 곱셈이 병렬로 처리되도록 이루어진다.
예 284: 시스템은, 가속기 ― 가속기는, 가속기를 호스트 프로세서에 결합시키기 위한 다중-프로토콜 버스 인터페이스를 포함하고, 명령들을 처리하기 위한 하나 이상의 처리 요소를 포함함 ―; 복수의 클라이언트들에 의해 제출된 작업 기술어들을 저장하기 위한 복수의 엔트리들을 포함하는 공유 작업 큐 ― 작업 기술어는, 작업 기술어를 제출한 클라이언트를 식별하기 위한 식별 코드, 하나 이상의 처리 요소에 의해 실행될 적어도 하나의 명령, 및 어드레싱 정보를 포함함 ―; 및 특정된 중재 정책에 따라, 공유 작업 큐로부터의 작업 기술어들을 하나 이상의 처리 요소로 디스패치하기 위한 중재기를 포함하며, 하나 이상의 처리 요소 각각은, 중재기로부터 디스패치된 작업 기술어들을 수신하고, 소스 및 목적지 어드레스 변환들을 수행하고, 소스 어드레스 변환들에 의해 식별된 소스 데이터를 판독하고, 적어도 하나의 명령을 실행하여 목적지 데이터를 생성하고, 목적지 어드레스 변환을 사용하여 목적지 데이터를 메모리에 기입하도록 이루어진다.
예 285: 예 284의 시스템은, 복수의 클라이언트들이, 직접 사용자 모드 입력/출력(IO) 요청들을 가속기에 제출한 사용자 모드 애플리케이션들; 가속기를 공유하는 가상 기계(VM)들에서 실행되는 커널 모드 드라이버들; 및/또는 다수의 컨테이너들에서 실행되는 소프트웨어 에이전트들 중 하나 이상을 포함하도록 이루어진다.
예 286: 예 285의 시스템은, 복수의 클라이언트들 중 적어도 하나의 클라이언트가 VM 내에서 실행되는 컨테이너 또는 사용자 모드 애플리케이션을 포함하도록 이루어진다.
예 287: 예 284 내지 예 286 중 임의의 예의 시스템은, 클라이언트들이 피어 입력/출력(IO) 에이전트들 및/또는 소프트웨어 연쇄 오프로드 요청들 중 하나 이상을 포함하도록 이루어진다.
예 288: 예 287의 시스템은, 피어 IO 에이전트들 중 적어도 하나가 네트워크 인터페이스 제어기(NIC)를 포함하도록 이루어진다.
예 289: 예 284 내지 예 288 중 임의의 예의 시스템은, 하나 이상의 처리 요소에 의해 사용가능한 가상-물리 어드레스 변환들을 저장하기 위한 어드레스 변환 캐시를 더 포함한다.
예 290: 예 284 내지 예 289 중 임의의 예의 시스템은, 특정된 중재 정책이 선입선출 정책을 포함하도록 이루어진다.
예 291: 예 284 내지 예 290 중 임의의 예의 시스템은, 특정된 중재 정책이 서비스 품질(QoS) 정책을 포함하도록 이루어지면, QoS 정책에서, 제1 클라이언트의 작업 기술어들에 제2 클라이언트에 대한 우선권이 주어진다.
예 292: 예 291의 시스템은, 제2 클라이언트의 작업 기술어가 제1 클라이언트의 작업 기술어보다 앞서 공유 작업 큐에서 수신된 경우라 하더라도, 제1 클라이언트의 작업 기술어가 제2 클라이언트의 작업 기술어보다 보다 앞서 하나 이상의 처리 요소로 디스패치되도록 이루어진다.
예 293: 예 284 내지 예 292 중 임의의 예의 시스템은, 식별 코드가, 클라이언트에 할당된 시스템 메모리 내의 어드레스 공간을 식별하기 위한 프로세스 어드레스 공간 식별자(PASID)를 포함하도록 이루어진다.
예 294: 예 284 내지 예 293 중 임의의 예의 시스템은, 하나 이상의 전용 워드 큐를 더 포함하며, 각각의 전용 작업 큐는, 전용 작업 큐와 연관된 단일 클라이언트에 의해 제출된 작업 기술어들을 저장하기 위한 복수의 엔트리들을 포함한다.
예 295: 예 294의 시스템은, 전용 작업 큐들 및/또는 공유 작업 큐들 중 2개 이상을 그룹으로 결합하도록 프로그래밍되는 그룹 구성 레지스터를 더 포함하며, 그룹은 처리 요소들 중 하나 이상과 연관된다.
예 296: 예 295의 시스템은, 하나 이상의 처리 요소가, 그룹 내의 전용 작업 큐들 및/또는 공유 작업 큐들로부터의 작업 기술어들을 처리하도록 이루어진다.
예 297: 예 284 내지 예 296의 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제1 프로토콜이, 시스템 메모리 어드레스 공간에 액세스하는 데 사용될 메모리 인터페이스 프로토콜을 포함하도록 이루어진다.
예 298: 예 284 내지 예 297 중 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제2 프로토콜이, 호스트 캐시 계층구조 및 시스템 메모리를 포함하는 호스트 프로세서의 메모리 서브시스템과 가속기의 로컬 메모리에 저장된 데이터 간에 일관성을 유지하기 위한 캐시 일관성 프로토콜을 포함하도록 이루어진다.
예 299: 예 284 내지 예 298 중 임의의 예의 시스템은, 다중-프로토콜 버스 인터페이스에 의해 지원되는 제3 프로토콜이, 디바이스 발견, 레지스터 액세스, 구성, 초기화, 인터럽트들, 직접 메모리 액세스, 및 어드레스 변환 서비스들을 지원하는 직렬 링크 프로토콜을 포함하도록 이루어진다.
예 300: 예 299의 시스템은, 제3 프로토콜이 주변 구성요소 인터페이스 익스프레스(PCIe) 프로토콜을 포함하도록 이루어진다.
예 301: 예 284 내지 예 300 중 임의의 예의 시스템은, 처리 요소들에 의해 처리될 소스 데이터를 저장하고 하나 이상의 처리 요소들에 의한 처리로부터 비롯되는 목적지 데이터를 저장하기 위한 가속기 메모리를 더 포함한다.
예 302: 예 301의 시스템은, 가속기 메모리가 고 대역폭 메모리(HBM)를 포함하도록 이루어진다.
예 303: 예 301의 시스템은, 가속기 메모리는 호스트 프로세서에 의해 사용되는 시스템 메모리 어드레스 공간의 제1 부분을 배정받도록 이루어진다.
예 304: 예 303의 시스템은, 시스템 메모리 어드레스 공간의 제2 부분을 배정받는 호스트 메모리를 더 포함한다.
예 305: 예 304의 시스템은, 시스템 메모리 어드레스 공간에 저장된 각각의 데이터 블록에 대해, 블록 내에 포함된 데이터가 가속기 쪽으로 바이어싱되는지 여부를 표시하기 위한 바이어스 회로 및/또는 논리를 더 포함한다.
예 306: 예 305의 시스템은, 각각의 데이터 블록이 메모리 페이지를 포함하도록 이루어진다.
예 307: 예 305의 시스템은, 호스트가, 가속기에 요청을 먼저 송신하지 않으면서 가속기 쪽으로 바이어싱된 데이터를 처리하는 것을 억제하도록 이루어진다.
예 308: 예 307의 시스템은, 바이어스 회로 및/또는 논리가, 가속기 쪽으로의 바이어스를 표시하도록 고정 크기 데이터 블록에 따라 설정될 하나의 비트를 포함하는 바이어스 테이블을 포함하도록 이루어진다.
예 309: 예 301 내지 예 308 중 임의의 예의 시스템은, 가속기가, 가속기 메모리에 저장된 데이터와 연관된 하나 이상의 데이터 일관성 트랜잭션을 수행하기 위해 호스트 프로세서의 일관성 제어기들과 통신하기 위한 메모리 제어기를 포함하도록 이루어진다.
예 310: 예 309의 시스템은, 메모리 제어기가, 가속기 쪽으로의 바이어스로 설정된 가속기 메모리에 저장된 데이터 블록들에 액세스하기 위해 디바이스 바이어스 모드에서 동작하도록 이루어지고, 디바이스 바이어스 모드에서, 메모리 제어기가, 호스트 프로세서의 캐시 일관성 제어기와 협의하지 않고도 가속기 메모리에 액세스하도록 이루어진다.
예 311: 예 309의 시스템은, 메모리 제어기가, 호스트 프로세서 쪽으로의 바이어스로 설정된 데이터 블록들에 액세스하기 위해 호스트 바이어스 모드에서 동작하도록 이루어지고, 호스트 바이어스 모드에서, 메모리 제어기가, 호스트 프로세서의 캐시 일관성 제어기를 통해 가속기 메모리에 모든 요청들을 전송하도록 이루어진다.
예 312: 예 284 내지 예 311 중 임의의 예의 시스템은, 공유 작업 큐가, 작업 기술어들의 배치를 식별하는 적어도 하나의 배치 기술어를 저장하도록 이루어진다.
예 313: 예 312의 시스템은, 메모리로부터 작업 기술어들의 배치를 판독함으로써 배치 기술어들을 처리하기 위한 배치 처리 회로를 더 포함한다.
예 314: 예 292의 시스템은, 호스트 프로세서가 제1 유형의 명령어를 실행하는 것에 대한 응답으로 작업 기술어가 전용 작업 큐에 부가되도록 이루어지고, 호스트 프로세서가 제2 유형의 명령어를 실행하는 것에 대한 응답으로 작업 기술어가 공유 작업 큐에 부가되도록 이루어진다.
예 315: 방법은, 디바이스 바이어스에 제1 세트의 메모리 페이지들을 배치하는 단계; 호스트 프로세서에 결합된 가속기 디바이스의 로컬 메모리부터 제1 세트의 메모리 페이지들을 할당하는 단계; 입력/출력 에이전트 또는 호스트 프로세서의 코어로부터 할당된 페이지들에 피연산자 데이터를 전송하는 단계; 결과들을 생성하기 위해 로컬 메모리를 사용하여 가속기 디바이스에 의해 피연산자들을 처리하는 단계; 및 디바이스 바이어스로부터의 제1 세트의 메모리 페이지들을 호스트 바이어스로 변환하는 단계를 포함한다.
예 316: 예 315의 방법은, 디바이스 바이어스에 제1 세트의 메모리 페이지들을 배치하는 것이, 페이지들이 가속기 디바이스 바이어스 있다는 것을 표시하기 위해 바이어스 테이블의 제1 세트의 메모리 페이지들을 업데이트하는 것을 포함하도록 이루어진다.
예 317: 예 315 내지 예 316 중 임의의 예의 방법은, 엔트리들을 업데이트 하는 것이, 제1 세트의 메모리 페이지들의 각각의 페이지와 연관된 비트를 설정하는 것을 포함하도록 이루어진다.
예 318: 예 315 내지 예 317 중 임의의 예의 방법은, 일단 디바이스 바이어스로 설정되면, 제1 세트의 메모리 페이지들이 호스트 캐시 메모리에 캐싱되지 않을 것이 보장되도록 이루어진다.
예 319: 예 315 내지 예 318 중 임의의 예의 방법은, 제1 세트의 메모리 페이지들을 할당하는 것이 드라이버 또는 애플리케이션 프로그래밍 인터페이스(API) 호출을 개시하는 것을 포함하도록 이루어진다.
예 320: 예 315 내지 예 319 중 임의의 예의 방법은, 피연산자들을 처리하기 위해, 가속기 디바이스가 명령들을 실행하고 자신의 로컬 메모리부터 직접 데이터를 처리하도록 이루어진다.
예 321: 예 315 내지 예 320 중 임의의 예의 방법은, 할당된 페이지들에 피연산자 데이터를 전송하는 것이, 하나 이상의 작업 기술어를 가속기 디바이스에 제출하는 것을 포함하도록 이루어지며, 작업 기술어들은 피연산자들을 식별하거나 포함한다.
예 322: 예 321의 방법은, 하나 이상의 작업 기술어들이, 명령에 따라, 할당된 페이지들이 호스트 프로세서 캐시로부터 플러싱되는 것을 야기할 수 있도록 이루어진다.
예 323: 예 315 내지 예 323 중 임의의 예의 방법은, 제1 세트의 메모리 페이지들이 호스트 바이어스로 설정될 때, 호스트 프로세서가, 결과들에 액세스하고, 결과들을 캐싱하고, 결과들을 공유하는 것이 허용되도록 이루어진다.

Claims (18)

  1. 장치로서,
    실리콘 인터포저;
    통신 패브릭;
    복수의 행렬 데이터 요소에 대해 동시에 연산을 수행하기 위한 복수의 컴퓨팅 요소를 포함하는 가속기 다이 - 상기 복수의 컴퓨팅 요소는 상기 통신 패브릭에 결합되고, 상기 복수의 컴퓨팅 요소는 복수의 내적(dot-product) 엔진을 포함하고, 상기 복수의 내적 엔진은 복수의 결과 행렬 데이터 요소를 생성하기 위해 상기 행렬 데이터 요소 상의 복수의 내적을 계산함 -;
    상기 복수의 행렬 데이터 요소를 저장하는 버퍼 또는 캐시;
    상기 통신 패브릭에 결합된 메모리 제어기; 및
    상기 가속기 다이에 결합된 상기 실리콘 인터포저 상에 복수의 DRAM 다이를 수직으로 적층한 적층식 DRAM
    을 포함하는 장치.
  2. 제1항에 있어서,
    상기 행렬 데이터 요소는 부동 소수점 데이터 요소들을 포함하는, 장치.
  3. 제1항에 있어서,
    내적 연산은 벡터의 데이터 요소들에 의해 곱해지는 상기 행렬 데이터 요소들을 포함하는, 장치.
  4. 제3항에 있어서,
    상기 행렬 데이터 요소들은 희소 행렬의 데이터 요소들이고, 상기 복수의 내적은 행 배향 희소 행렬 밀집 벡터(spMdV) 곱셈 연산을 포함하는, 장치.
  5. 제3항에 있어서,
    상기 행렬 데이터 요소들은 희소 행렬의 데이터 요소들이고, 상기 복수의 내적은 규모조정 및 업데이트 연산을 구현하는 것인, 장치.
  6. 제1항 내지 제5항 중 어느 한 항에 있어서,
    상이한 가상 기계들에 배정된 상이한 가상 기능들에 걸쳐 복수의 데이터 병렬 처리 회로를 분할하기 위한 I/O 가상화를 지원하는, 장치.
  7. 제6항에 있어서,
    상기 I/O 가상화는 각각의 가상 기능에 대해 독립적인 공유 작업 큐(SWQ)를 지원하며, 각각의 가상 기능은 자체 SWQ 레지스터를 갖는, 장치.
  8. 제1항에 있어서,
    상기 가속기 다이를 호스트 프로세서에 결합하는 다중-프로토콜 링크를 더 포함하는, 장치.
  9. 제8항에 있어서,
    공유 가상 메모리(SVM) 공간을 조합된 물리적 호스트 메모리에 맵핑하는 I/O 메모리 관리 유닛(IOMMU)을 더 포함하고,
    상기 SVM 공간은 상기 호스트 프로세서와 상기 가속기 다이에 의해 공유되는, 장치.
  10. 시스템으로서,
    시스템 메모리;
    상기 시스템 메모리에 통신가능하게 결합된 장치
    를 포함하며, 상기 장치는:
    실리콘 인터포저;
    통신 패브릭;
    복수의 행렬 데이터 요소에 대해 동시에 연산을 수행하기 위한 복수의 컴퓨팅 요소를 포함하는 가속기 다이 - 상기 복수의 컴퓨팅 요소는 상기 통신 패브릭에 결합되고, 상기 복수의 컴퓨팅 요소는 복수의 내적 엔진을 포함하고, 상기 복수의 내적 엔진은 복수의 결과 행렬 데이터 요소를 생성하기 위해 상기 행렬 데이터 요소 상의 복수의 내적을 계산함 -;
    상기 복수의 행렬 데이터 요소를 저장하는 버퍼 또는 캐시;
    상기 통신 패브릭에 결합된 메모리 제어기; 및
    상기 가속기 다이에 결합된 상기 실리콘 인터포저 상에 복수의 DRAM 다이를 수직으로 적층한 적층식 DRAM을 포함하는, 시스템.
  11. 제10항에 있어서,
    상기 행렬 데이터 요소는 부동 소수점 데이터 요소들을 포함하는, 시스템.
  12. 제10항에 있어서,
    내적 연산은 벡터의 데이터 요소들에 의해 곱해지는 상기 행렬 데이터 요소들을 포함하는, 시스템.
  13. 제12항에 있어서,
    상기 행렬 데이터 요소들은 희소 행렬의 데이터 요소들이고, 상기 복수의 내적은 행 배향 희소 행렬 밀집 벡터(spMdV) 곱셈 연산을 포함하는, 시스템.
  14. 제12항에 있어서,
    상기 행렬 데이터 요소들은 희소 행렬의 데이터 요소들이고, 상기 복수의 내적은 규모조정 및 업데이트 연산을 구현하는 것인, 시스템.
  15. 제10항 내지 제14항 중 어느 한 항에 있어서,
    상이한 가상 기계들에 배정된 상이한 가상 기능들에 걸쳐 복수의 데이터 병렬 처리 회로를 분할하기 위한 I/O 가상화를 지원하는, 시스템.
  16. 제15항에 있어서,
    상기 I/O 가상화는 각각의 가상 기능에 대해 독립적인 공유 작업 큐(SWQ)를 지원하며, 각각의 가상 기능은 자체 SWQ 레지스터를 갖는, 시스템.
  17. 제10항에 있어서,
    상기 가속기 다이를 호스트 프로세서에 결합하는 다중-프로토콜 링크를 더 포함하는, 시스템.
  18. 제17항에 있어서,
    공유 가상 메모리(SVM) 공간을 조합된 물리적 호스트 메모리에 맵핑하는 I/O 메모리 관리 유닛(IOMMU)를 더 포함하고,
    상기 SVM 공간은 상기 호스트 프로세서와 상기 가속기 다이에 의해 공유되는, 시스템.
KR1020207034869A 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들 KR102520017B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
KR1020197015660A KR20190093568A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
PCT/US2016/069640 WO2018125250A1 (en) 2016-12-31 2016-12-31 Systems, methods, and apparatuses for heterogeneous computing

Related Parent Applications (1)

Application Number Title Priority Date Filing Date
KR1020197015660A Division KR20190093568A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들

Publications (2)

Publication Number Publication Date
KR20200140395A KR20200140395A (ko) 2020-12-15
KR102520017B1 true KR102520017B1 (ko) 2023-04-11

Family

ID=62709975

Family Applications (4)

Application Number Title Priority Date Filing Date
KR1020237022753A KR20230106746A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
KR1020207034869A KR102520017B1 (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
KR1020197015660A KR20190093568A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
KR1020227020558A KR20220090588A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들

Family Applications Before (1)

Application Number Title Priority Date Filing Date
KR1020237022753A KR20230106746A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들

Family Applications After (2)

Application Number Title Priority Date Filing Date
KR1020197015660A KR20190093568A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
KR1020227020558A KR20220090588A (ko) 2016-12-31 2016-12-31 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들

Country Status (13)

Country Link
US (4) US11416281B2 (ko)
EP (4) EP3812900B1 (ko)
JP (1) JP6988040B2 (ko)
KR (4) KR20230106746A (ko)
CN (4) CN115454586A (ko)
BR (1) BR112019010679A2 (ko)
DE (1) DE112016007566T5 (ko)
DK (1) DK3812900T3 (ko)
ES (1) ES2933675T3 (ko)
FI (1) FI3812900T3 (ko)
PL (2) PL3812900T3 (ko)
TW (4) TWI810166B (ko)
WO (1) WO2018125250A1 (ko)

Families Citing this family (238)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
GB2538754B (en) * 2015-05-27 2018-08-29 Displaylink Uk Ltd Single-chip multi-processor communication
WO2017049594A1 (en) 2015-09-25 2017-03-30 Intel Corporation Efficient memory activation at runtime
US11455190B2 (en) 2016-02-05 2022-09-27 Sas Institute Inc. Implicit status in many task computing
JP6516025B2 (ja) * 2016-02-12 2019-05-22 ソニー株式会社 情報処理方法および情報処理装置
US10275243B2 (en) 2016-07-02 2019-04-30 Intel Corporation Interruptible and restartable matrix multiplication instructions, processors, methods, and systems
FR3060792B1 (fr) * 2016-12-19 2018-12-07 Safran Electronics & Defense Dispositif de chargement de donnees dans des unites informatiques de traitement depuis une source de donnees
US10884970B2 (en) * 2016-12-28 2021-01-05 Intel Corporation Techniques for coalescing doorbells in a request message
US11182315B2 (en) * 2017-02-10 2021-11-23 Intel Corporation Apparatuses, methods, and systems for hardware control of processor performance levels
WO2018152688A1 (en) 2017-02-22 2018-08-30 Intel Corporation Virtualization of process address space identifiers for scalable virtualization of input/output devices
WO2018174934A1 (en) 2017-03-20 2018-09-27 Intel Corporation Systems, methods, and apparatus for matrix move
WO2018176360A1 (en) 2017-03-31 2018-10-04 Intel Corporation Scalable interrupt virtualization for input/output devices
US20180329855A1 (en) * 2017-05-12 2018-11-15 Intel Corporation Alternate protocol negotiation in a high performance interconnect
TWI769810B (zh) * 2017-05-17 2022-07-01 美商谷歌有限責任公司 特殊用途神經網路訓練晶片
US11210133B1 (en) * 2017-06-12 2021-12-28 Pure Storage, Inc. Workload mobility between disparate execution environments
US11080131B2 (en) * 2017-06-19 2021-08-03 Yissum Research Development Company Of The Hebrew University Of Jerusalem Ltd. High performance method and system for performing fault tolerant matrix multiplication
WO2019009870A1 (en) 2017-07-01 2019-01-10 Intel Corporation SAVE BACKGROUND TO VARIABLE BACKUP STATUS SIZE
CN109213962B (zh) * 2017-07-07 2020-10-09 华为技术有限公司 运算加速器
US10489195B2 (en) 2017-07-20 2019-11-26 Cisco Technology, Inc. FPGA acceleration for serverless computing
US11005771B2 (en) 2017-10-16 2021-05-11 Mellanox Technologies, Ltd. Computational accelerator for packet payload operations
US11502948B2 (en) 2017-10-16 2022-11-15 Mellanox Technologies, Ltd. Computational accelerator for storage operations
CN107807843B (zh) * 2017-10-26 2019-05-24 北京百度网讯科技有限公司 虚拟机中的i/o请求处理方法、设备及计算机可读介质
US10698472B2 (en) * 2017-10-27 2020-06-30 Advanced Micro Devices, Inc. Instruction subset implementation for low power operation
US10708240B2 (en) 2017-12-14 2020-07-07 Mellanox Technologies, Ltd. Offloading communication security operations to a network interface controller
US11809869B2 (en) 2017-12-29 2023-11-07 Intel Corporation Systems and methods to store a tile register pair to memory
US11023235B2 (en) 2017-12-29 2021-06-01 Intel Corporation Systems and methods to zero a tile register pair
US11669326B2 (en) 2017-12-29 2023-06-06 Intel Corporation Systems, methods, and apparatuses for dot product operations
US11816483B2 (en) 2017-12-29 2023-11-14 Intel Corporation Systems, methods, and apparatuses for matrix operations
US11789729B2 (en) 2017-12-29 2023-10-17 Intel Corporation Systems and methods for computing dot products of nibbles in two tile operands
US11698866B2 (en) * 2017-12-29 2023-07-11 Intel Corporation Unified address translation for virtualization of input/output devices
US11093247B2 (en) 2017-12-29 2021-08-17 Intel Corporation Systems and methods to load a tile register pair
US10599596B2 (en) * 2018-01-08 2020-03-24 Intel Corporation Management of processor performance based on user interrupts
KR102228586B1 (ko) * 2018-01-19 2021-03-16 한국전자통신연구원 Gpu 기반의 적응적 blas 연산 가속화 장치 및 방법
US11231927B2 (en) * 2018-03-08 2022-01-25 Intel Corporation System, apparatus and method for providing a fabric for an accelerator
US10664287B2 (en) 2018-03-30 2020-05-26 Intel Corporation Systems and methods for implementing chained tile operations
US11429725B1 (en) * 2018-04-26 2022-08-30 Citicorp Credit Services, Inc. (Usa) Automated security risk assessment systems and methods
US10877766B2 (en) * 2018-05-24 2020-12-29 Xilinx, Inc. Embedded scheduling of hardware resources for hardware acceleration
US11144357B2 (en) * 2018-05-25 2021-10-12 International Business Machines Corporation Selecting hardware accelerators based on score
US11222138B2 (en) * 2018-05-29 2022-01-11 Visa International Service Association Privacy-preserving machine learning in the three-server model
US11294678B2 (en) 2018-05-29 2022-04-05 Advanced Micro Devices, Inc. Scheduler queue assignment
EP3794466B1 (en) * 2018-06-15 2023-07-19 Huawei Cloud Computing Technologies Co., Ltd. System for handling concurrent property graph queries
US11036645B2 (en) * 2018-06-26 2021-06-15 Red Hat, Inc. Secure userspace networking for guests
US11093605B2 (en) * 2018-06-28 2021-08-17 Cisco Technology, Inc. Monitoring real-time processor instruction stream execution
US11360809B2 (en) * 2018-06-29 2022-06-14 Intel Corporation Multithreaded processor core with hardware-assisted task scheduling
CN110825485A (zh) * 2018-08-07 2020-02-21 华为技术有限公司 数据处理的方法、设备和服务器
US10423558B1 (en) 2018-08-08 2019-09-24 Apple Inc. Systems and methods for controlling data on a bus using latency
US10970055B2 (en) * 2018-08-21 2021-04-06 International Business Machines Corporation Identifying software and hardware bottlenecks
US11093579B2 (en) 2018-09-05 2021-08-17 Intel Corporation FP16-S7E8 mixed precision for deep learning and other algorithms
US10782918B2 (en) * 2018-09-06 2020-09-22 Advanced Micro Devices, Inc. Near-memory data-dependent gather and packing
US10977198B2 (en) 2018-09-12 2021-04-13 Micron Technology, Inc. Hybrid memory system interface
US10970076B2 (en) 2018-09-14 2021-04-06 Intel Corporation Systems and methods for performing instructions specifying ternary tile logic operations
US11579883B2 (en) 2018-09-14 2023-02-14 Intel Corporation Systems and methods for performing horizontal tile operations
US10866786B2 (en) 2018-09-27 2020-12-15 Intel Corporation Systems and methods for performing instructions to transpose rectangular tiles
US10990396B2 (en) 2018-09-27 2021-04-27 Intel Corporation Systems for performing instructions to quickly convert and use tiles as 1D vectors
US10719323B2 (en) 2018-09-27 2020-07-21 Intel Corporation Systems and methods for performing matrix compress and decompress instructions
US10963256B2 (en) 2018-09-28 2021-03-30 Intel Corporation Systems and methods for performing instructions to transform matrices into row-interleaved format
US10896043B2 (en) 2018-09-28 2021-01-19 Intel Corporation Systems for performing instructions for fast element unpacking into 2-dimensional registers
US10929143B2 (en) 2018-09-28 2021-02-23 Intel Corporation Method and apparatus for efficient matrix alignment in a systolic array
US10949207B2 (en) 2018-09-29 2021-03-16 Intel Corporation Processor core supporting a heterogeneous system instruction set architecture
US10963246B2 (en) 2018-11-09 2021-03-30 Intel Corporation Systems and methods for performing 16-bit floating-point matrix dot product instructions
US10705993B2 (en) 2018-11-19 2020-07-07 Xilinx, Inc. Programming and controlling compute units in an integrated circuit
US10892944B2 (en) 2018-11-29 2021-01-12 International Business Machines Corporation Selecting and using a cloud-based hardware accelerator
CN109542832B (zh) * 2018-11-30 2020-09-01 青岛方寸微电子科技有限公司 一种无锁机制的异构多核cpu间通信系统及方法
US11340877B2 (en) * 2018-12-19 2022-05-24 Network Native, Inc. System and method for holistic application development and deployment in a distributed heterogeneous computing environment
US10929503B2 (en) 2018-12-21 2021-02-23 Intel Corporation Apparatus and method for a masked multiply instruction to support neural network pruning operations
US11294671B2 (en) 2018-12-26 2022-04-05 Intel Corporation Systems and methods for performing duplicate detection instructions on 2D data
US11886875B2 (en) 2018-12-26 2024-01-30 Intel Corporation Systems and methods for performing nibble-sized operations on matrix elements
US20200210517A1 (en) 2018-12-27 2020-07-02 Intel Corporation Systems and methods to accelerate multiplication of sparse matrices
US10942985B2 (en) 2018-12-29 2021-03-09 Intel Corporation Apparatuses, methods, and systems for fast fourier transform configuration and computation instructions
US10922077B2 (en) 2018-12-29 2021-02-16 Intel Corporation Apparatuses, methods, and systems for stencil configuration and computation instructions
TWI704460B (zh) * 2019-01-19 2020-09-11 神雲科技股份有限公司 叢集式系統中維持記憶體共享方法
US11385918B2 (en) * 2019-01-23 2022-07-12 Vmware, Inc. Dynamic discovery of internal kernel functions and global data
US11537504B2 (en) * 2019-01-28 2022-12-27 Xepic Corporation Limited Realization of functional verification debug station via cross-platform record-mapping-replay technology
TWI773959B (zh) 2019-01-31 2022-08-11 美商萬國商業機器公司 用於處理輸入輸出儲存指令之資料處理系統、方法及電腦程式產品
SG11202104428PA (en) 2019-01-31 2021-05-28 Ibm Handling an input/output store instruction
TWI767175B (zh) 2019-01-31 2022-06-11 美商萬國商業機器公司 用於處理輸入輸出儲存指令之資料處理系統、方法及電腦程式產品
WO2020157594A1 (en) 2019-01-31 2020-08-06 International Business Machines Corporation Handling an input/output store instruction
US11061728B2 (en) * 2019-02-12 2021-07-13 Western Digital Technologies, Inc. Systems and methods for heterogeneous address space allocation
US11934342B2 (en) 2019-03-15 2024-03-19 Intel Corporation Assistance for hardware prefetch in cache access
US20220179787A1 (en) 2019-03-15 2022-06-09 Intel Corporation Systems and methods for improving cache efficiency and utilization
JP7408671B2 (ja) 2019-03-15 2024-01-05 インテル コーポレイション シストリックアレイに対するブロックスパース演算のためのアーキテクチャ
US11762695B2 (en) * 2019-03-29 2023-09-19 Lenovo Enterprise Solutions (Singapore) Pte. Ltd. Transparent memory management for over-subscribed accelerators
US10942738B2 (en) * 2019-03-29 2021-03-09 Intel Corporation Accelerator systems and methods for matrix operations
US11269630B2 (en) 2019-03-29 2022-03-08 Intel Corporation Interleaved pipeline of floating-point adders
US11016731B2 (en) 2019-03-29 2021-05-25 Intel Corporation Using Fuzzy-Jbit location of floating-point multiply-accumulate results
US10990397B2 (en) 2019-03-30 2021-04-27 Intel Corporation Apparatuses, methods, and systems for transpose instructions of a matrix operations accelerator
US11175891B2 (en) 2019-03-30 2021-11-16 Intel Corporation Systems and methods to perform floating-point addition with selected rounding
US11184439B2 (en) * 2019-04-01 2021-11-23 Mellanox Technologies, Ltd. Communication with accelerator via RDMA-based network adapter
CN111831337B (zh) 2019-04-19 2022-11-29 安徽寒武纪信息科技有限公司 数据同步方法及装置以及相关产品
CN111782133A (zh) * 2019-04-04 2020-10-16 安徽寒武纪信息科技有限公司 数据处理方法及装置以及相关产品
CN111782577B (zh) 2019-04-04 2023-03-24 安徽寒武纪信息科技有限公司 数据处理装置及方法以及相关产品
US11036649B2 (en) * 2019-04-04 2021-06-15 Cisco Technology, Inc. Network interface card resource partitioning
EP3825846A1 (en) * 2019-04-04 2021-05-26 Cambricon Technologies Corporation Limited Data processing method and apparatus, and related product
US10963362B2 (en) * 2019-04-11 2021-03-30 Dell Products L.P. Method and system for identifying latency-sensitive computing workloads of information handling systems
US10970238B2 (en) 2019-04-19 2021-04-06 Intel Corporation Non-posted write transactions for a computer bus
CN111832736B (zh) * 2019-04-19 2024-04-12 伊姆西Ip控股有限责任公司 用于处理机器学习模型的方法、设备和计算机可读存储介质
US20220083345A1 (en) * 2019-04-30 2022-03-17 Hewlett-Packard Development Company, L.P. Booting processors
US11086672B2 (en) * 2019-05-07 2021-08-10 International Business Machines Corporation Low latency management of processor core wait state
CN110175164B (zh) * 2019-05-27 2023-04-07 浪潮软件股份有限公司 一种SparkSQL thriftserver查询及操作Hive的权限控制的方法
US11403097B2 (en) 2019-06-26 2022-08-02 Intel Corporation Systems and methods to skip inconsequential matrix operations
US11321144B2 (en) 2019-06-29 2022-05-03 Intel Corporation Method and apparatus for efficiently managing offload work between processing units
US11182208B2 (en) 2019-06-29 2021-11-23 Intel Corporation Core-to-core start “offload” instruction(s)
US11030000B2 (en) 2019-06-29 2021-06-08 Intel Corporation Core advertisement of availability
US10983796B2 (en) 2019-06-29 2021-04-20 Intel Corporation Core-to-core end “offload” instruction(s)
US11334647B2 (en) 2019-06-29 2022-05-17 Intel Corporation Apparatuses, methods, and systems for enhanced matrix multiplier architecture
US11372711B2 (en) 2019-06-29 2022-06-28 Intel Corporation Apparatus and method for fault handling of an offload transaction
US11016766B2 (en) 2019-06-29 2021-05-25 Intel Corporation Apparatus and method for compiler hints for inter-core offload
US10929129B2 (en) * 2019-06-29 2021-02-23 Intel Corporation Apparatus and method for modifying addresses, data, or program code associated with offloaded instructions
US11249786B2 (en) * 2019-07-03 2022-02-15 Vmware, Inc. Virtualizing hardware components that implement AI applications
US11301254B2 (en) * 2019-07-25 2022-04-12 International Business Machines Corporation Instruction streaming using state migration
US11061681B2 (en) * 2019-07-25 2021-07-13 International Business Machines Corporation Instruction streaming using copy select vector
US11169737B2 (en) 2019-08-13 2021-11-09 Micron Technology, Inc. Speculation in memory
US20220326988A1 (en) * 2019-08-16 2022-10-13 Google Llc Explicit scheduling of on-chip operations
US11294715B2 (en) 2019-08-28 2022-04-05 Marvell Asia Pte, Ltd. System and method for queuing work within a virtualized scheduler based on in-unit accounting of in-unit entries
US11221962B2 (en) 2019-09-04 2022-01-11 Apple Inc. Unified address translation
CN110750265B (zh) * 2019-09-06 2021-06-11 华中科技大学 一种面向图计算的高层次综合方法及系统
US11915041B1 (en) * 2019-09-12 2024-02-27 Neureality Ltd. Method and system for sequencing artificial intelligence (AI) jobs for execution at AI accelerators
US11144290B2 (en) * 2019-09-13 2021-10-12 Huawei Technologies Co., Ltd. Method and apparatus for enabling autonomous acceleration of dataflow AI applications
US11748174B2 (en) * 2019-10-02 2023-09-05 Intel Corporation Method for arbitration and access to hardware request ring structures in a concurrent environment
CN110865814B (zh) * 2019-10-30 2021-11-16 上海天数智芯半导体有限公司 一种支持异构计算核架构的编译器实现方法和系统
US11861761B2 (en) 2019-11-15 2024-01-02 Intel Corporation Graphics processing unit processing and caching improvements
CN112835510B (zh) * 2019-11-25 2022-08-26 北京灵汐科技有限公司 一种片上存储资源存储格式的控制方法及装置
US11086804B2 (en) * 2019-12-09 2021-08-10 Western Digital Technologies, Inc. Storage system and method for reducing read-retry duration
US11334384B2 (en) * 2019-12-10 2022-05-17 Advanced Micro Devices, Inc. Scheduler queue assignment burst mode
WO2021126272A1 (en) * 2019-12-20 2021-06-24 Hewlett-Packard Development Company, L.P. Machine learning workload orchestration in heterogeneous clusters
US11714875B2 (en) 2019-12-28 2023-08-01 Intel Corporation Apparatuses, methods, and systems for instructions of a matrix operations accelerator
CN111258923B (zh) * 2020-01-16 2023-03-14 重庆邮电大学 一种基于异构混合内存系统的页面分配方法
CN111262800B (zh) * 2020-01-19 2022-04-29 天津芯海创科技有限公司 一种以太网交换机的业务数据通信方法及系统
US11226816B2 (en) * 2020-02-12 2022-01-18 Samsung Electronics Co., Ltd. Systems and methods for data placement for in-memory-compute
US20210256092A1 (en) * 2020-02-19 2021-08-19 Nvidia Corporation Application programming interface to accelerate matrix operations
US11416581B2 (en) * 2020-03-09 2022-08-16 International Business Machines Corporation Multiplication of a matrix with an input vector
US11340942B2 (en) 2020-03-19 2022-05-24 Raytheon Company Cooperative work-stealing scheduler
WO2021195104A1 (en) 2020-03-23 2021-09-30 Mentium Technologies Inc. Digital-imc hybrid system architecture for neural network acceleration
US11080059B1 (en) * 2020-03-30 2021-08-03 Sandisk Technologies Llc Reducing firmware size and increasing firmware performance
US11188471B2 (en) 2020-04-03 2021-11-30 Alibaba Group Holding Limited Cache coherency for host-device systems
US11693795B2 (en) * 2020-04-17 2023-07-04 Texas Instruments Incorporated Methods and apparatus to extend local buffer of a hardware accelerator
US11775298B2 (en) * 2020-04-24 2023-10-03 Intel Corporation Frequency scaling for per-core accelerator assignments
US20200266995A1 (en) * 2020-05-04 2020-08-20 Vinodh Gopal Managing state in accelerators
CN111737176B (zh) * 2020-05-11 2022-07-15 瑞芯微电子股份有限公司 一种基于pcie数据的同步装置及驱动方法
US11789770B2 (en) 2020-05-19 2023-10-17 General Electric Company Systems and methods for creating surrogate models
JP2021189462A (ja) * 2020-05-25 2021-12-13 株式会社日立製作所 ストレージ装置
KR102418794B1 (ko) * 2020-06-02 2022-07-08 오픈엣지테크놀로지 주식회사 하드웨어 가속기를 위한 파라미터를 메모리로부터 액세스하는 방법 및 이를 이용한 장치
US11657007B2 (en) * 2020-06-15 2023-05-23 Rambus Inc. Remote memory selection
US11907744B2 (en) 2020-06-25 2024-02-20 Intel Corporation System, apparatus and method for enabling fine-grain quality of service or rate control for work submissions
US11461099B2 (en) * 2020-06-25 2022-10-04 Intel Corporation System, apparatus and method for fine-grain address space selection in a processor
US11669473B2 (en) * 2020-06-26 2023-06-06 Advanced Micro Devices, Inc. Allreduce enhanced direct memory access functionality
US11972230B2 (en) 2020-06-27 2024-04-30 Intel Corporation Matrix transpose and multiply
CN111752960B (zh) * 2020-06-28 2023-07-28 北京百度网讯科技有限公司 数据处理方法和装置
CN111784489A (zh) * 2020-06-28 2020-10-16 广东金宇恒软件科技有限公司 一种基于大数据的财政核算管理系统
CN113867798A (zh) * 2020-06-30 2021-12-31 上海寒武纪信息科技有限公司 集成计算装置、集成电路芯片、板卡和计算方法
CN115878824B (zh) * 2020-07-07 2023-10-20 华为技术有限公司 图像检索系统、方法和装置
IL276538B2 (en) 2020-08-05 2023-08-01 Mellanox Technologies Ltd A cryptographic device for data communication
CN114095153A (zh) 2020-08-05 2022-02-25 迈络思科技有限公司 密码数据通信装置
US11321238B2 (en) * 2020-08-11 2022-05-03 Micron Technology, Inc. User process identifier based address translation
US11947928B2 (en) 2020-09-10 2024-04-02 Hewlett Packard Enterprise Development Lp Multi-die dot-product engine to provision large scale machine learning inference applications
US11593356B2 (en) * 2020-09-11 2023-02-28 ForgeRock, Inc. Never stale caching of effective properties
US20210004338A1 (en) * 2020-09-21 2021-01-07 Pratik Marolia Pasid based routing extension for scalable iov systems
US11467992B1 (en) 2020-09-24 2022-10-11 Amazon Technologies, Inc. Memory access operation in distributed computing system
US11409685B1 (en) * 2020-09-24 2022-08-09 Amazon Technologies, Inc. Data synchronization operation at distributed computing system
US11714559B2 (en) * 2020-09-25 2023-08-01 Advanced Micro Devices, Inc. Efficient memory-semantic networking using scoped memory models
US20220101179A1 (en) * 2020-09-25 2022-03-31 Advanced Micro Devices, Inc. Direct-connected machine learning accelerator
US11941395B2 (en) 2020-09-26 2024-03-26 Intel Corporation Apparatuses, methods, and systems for instructions for 16-bit floating-point matrix dot product instructions
US20220101108A1 (en) * 2020-09-30 2022-03-31 International Business Machines Corporation Memory-mapped neural network accelerator for deployable inference systems
US11354258B1 (en) 2020-09-30 2022-06-07 Amazon Technologies, Inc. Control plane operation at distributed computing system
CN114326452B (zh) * 2020-10-10 2023-11-21 中国科学院沈阳自动化研究所 一种用于精密运动控制的异构计算加速方法
CN111966387B (zh) * 2020-10-22 2021-03-12 苏州浪潮智能科技有限公司 一种ntb卡的固件升级方法、装置、设备及存储介质
US11948000B2 (en) 2020-10-27 2024-04-02 Advanced Micro Devices, Inc. Gang scheduling for low-latency task synchronization
US11386034B2 (en) 2020-10-30 2022-07-12 Xilinx, Inc. High throughput circuit architecture for hardware acceleration
US20210240655A1 (en) * 2020-11-16 2021-08-05 Intel Corporation Source ordering in device interconnects
CN112506701B (zh) * 2020-12-02 2022-01-21 广东电网有限责任公司佛山供电局 一种基于三模lockstep的多处理器芯片错误恢复方法
US20220188606A1 (en) * 2020-12-14 2022-06-16 Micron Technology, Inc. Memory Configuration to Support Deep Learning Accelerator in an Integrated Circuit Device
US11836518B2 (en) * 2020-12-17 2023-12-05 Wave Computing, Inc. Processor graph execution using interrupt conservation
TWI792773B (zh) * 2020-12-18 2023-02-11 美商聖巴諾瓦系統公司 用於可重配置處理器即服務(RPaaS)的節點內基於緩衝器的串流
US20220197816A1 (en) * 2020-12-22 2022-06-23 Intel Corporation Compressed cache memory with parallel decompress on fault
TWI779444B (zh) * 2020-12-28 2022-10-01 瑞昱半導體股份有限公司 用於同步動態隨機存取記憶體之控制模組及其控制方法
US11960420B2 (en) * 2021-02-16 2024-04-16 Red Hat, Inc. Direct memory control operations on memory data structures
US11442858B1 (en) * 2021-03-10 2022-09-13 Micron Technology, Inc. Bias control for a memory device
CN113114733B (zh) * 2021-03-24 2022-07-08 重庆邮电大学 基于能量收集的分布式任务卸载和计算资源的管理方法
US11934333B2 (en) 2021-03-25 2024-03-19 Mellanox Technologies, Ltd. Storage protocol emulation in a peripheral device
US11934658B2 (en) 2021-03-25 2024-03-19 Mellanox Technologies, Ltd. Enhanced storage protocol emulation in a peripheral device
US11481343B1 (en) 2021-04-02 2022-10-25 Micron Technology, Inc. Transporting request types with different latencies
CN113191046A (zh) * 2021-04-20 2021-07-30 河海大学 一种基于ras对等式交互的有限元程序并行化方法
CN113076519A (zh) * 2021-04-21 2021-07-06 湖北九同方微电子有限公司 基于arm架构的大型矩阵求解方法
US11693779B2 (en) 2021-04-30 2023-07-04 International Business Machines Corporation Prefetch of random data using application tags
US11782865B1 (en) * 2021-06-02 2023-10-10 Amazon Technologies, Inc. Flexible data handling
CN113238853B (zh) * 2021-06-15 2021-11-12 上海交通大学 基于函数中间表达的无服务器计算调度系统及方法
US11675592B2 (en) * 2021-06-17 2023-06-13 International Business Machines Corporation Instruction to query for model-dependent information
US11899589B2 (en) 2021-06-22 2024-02-13 Samsung Electronics Co., Ltd. Systems, methods, and devices for bias mode management in memory systems
US11848838B2 (en) * 2021-06-24 2023-12-19 Hewlett Packard Enterprise Development Lp Communicating node events in network configuration
US11853231B2 (en) 2021-06-24 2023-12-26 Ati Technologies Ulc Transmission of address translation type packets
KR102593034B1 (ko) * 2021-07-02 2023-10-23 고려대학교 산학협력단 다차원 데이터베이스를 위한 스토리지내 데이터 재구성 가속기
US20230040226A1 (en) * 2021-07-27 2023-02-09 Intel Corporation Method and apparatus for dynamically adjusting pipeline depth to improve execution latency
US20230042934A1 (en) * 2021-07-27 2023-02-09 Intel Corporation Method and apparatus for high-performance page-fault handling for multi-tenant scalable accelerators
US11537313B1 (en) * 2021-08-11 2022-12-27 EMC IP Holding Company LLC Dual cast mirroring from host devices
US11829627B2 (en) * 2021-08-16 2023-11-28 Micron Technology, Inc. Data migration schedule prediction using machine learning
CN113901492A (zh) * 2021-09-06 2022-01-07 苏州国芯科技股份有限公司 数据传输的加解密方法、装置、系统及设备
CN113742267B (zh) * 2021-09-07 2023-10-27 中国科学院计算技术研究所 一种用于rdma通信设备的dma通信系统及方法
CN113780553B (zh) * 2021-09-09 2023-11-07 中山大学 一种基于高层次综合工具的深度学习模型优化方法及系统
CN113553191B (zh) * 2021-09-17 2022-01-04 深圳致星科技有限公司 用于联邦学习和隐私计算的异构处理系统
CN114048066A (zh) * 2021-10-21 2022-02-15 北京航天晨信科技有限责任公司 一种基于guid识别的板卡深度信息智能管理方法
CN114095958B (zh) * 2021-11-16 2023-09-12 新华三大数据技术有限公司 小区覆盖区域确定方法、装置、设备及存储介质
US20230161725A1 (en) * 2021-11-23 2023-05-25 Meta Platforms, Inc. Smart scalable design for a crossbar
TWI811862B (zh) * 2021-11-24 2023-08-11 宏碁股份有限公司 虛擬環境建立方法與電子裝置
WO2023092415A1 (zh) * 2021-11-25 2023-06-01 华为技术有限公司 一种消息处理方法及装置
JP7408025B2 (ja) * 2021-12-13 2024-01-04 三菱電機株式会社 情報処理装置、プログラム及び情報処理方法
CN114237712B (zh) * 2021-12-15 2022-12-27 北京百度网讯科技有限公司 指令执行方法、装置、电子设备及计算机存储介质
CN113987589B (zh) * 2021-12-27 2022-03-18 飞天诚信科技股份有限公司 一种处理数据的方法、装置、计算机可读存储介质及装置
CN113992687B (zh) * 2021-12-28 2022-04-08 浙江宇视科技有限公司 智能业务集群调度方法、装置、电子设备及存储介质
US11934310B2 (en) * 2022-01-21 2024-03-19 Centaur Technology, Inc. Zero bits in L3 tags
CN116701292A (zh) 2022-02-24 2023-09-05 平头哥(上海)半导体技术有限公司 用于芯片间通信的处理系统和通信方法
CN114580628A (zh) * 2022-03-14 2022-06-03 北京宏景智驾科技有限公司 一种神经网络卷积层的高效量化加速方法及硬件电路
US11635988B1 (en) 2022-03-15 2023-04-25 Sas Institute Inc. Optimal number of threads determination system
CN114328592B (zh) * 2022-03-16 2022-05-06 北京奥星贝斯科技有限公司 聚合计算方法和装置
US20230305846A1 (en) * 2022-03-24 2023-09-28 Intel Corporation Processor hardware and instructions for vectorized fused and-xor
CN114827048B (zh) * 2022-03-26 2023-10-20 西安电子科技大学 一种动态可配高性能队列调度方法、系统、处理器及协议
WO2023225049A1 (en) * 2022-05-17 2023-11-23 Schlumberger Technology Corporation Integrated customer delivery system
CN116264009B (zh) * 2022-06-21 2023-10-27 中兴通讯股份有限公司 光伏系统的数据处理方法、数据处理终端及存储介质
CN117349223A (zh) * 2022-06-29 2024-01-05 中科寒武纪科技股份有限公司 片上系统、指令系统、编译系统及相关产品
CN117348930A (zh) * 2022-06-29 2024-01-05 中科寒武纪科技股份有限公司 指令处理装置、指令执行方法、片上系统和板卡
US11930611B2 (en) * 2022-07-29 2024-03-12 Dell Products, L.P. Configurable chassis supporting replaceable hardware accelerator baseboards
CN115017095B (zh) * 2022-08-05 2022-11-08 微传智能科技(常州)有限公司 电流输出型ak协议轮速芯片通信系统及方法
GB2622581A (en) * 2022-09-14 2024-03-27 Advanced Risc Mach Ltd Multiple-outer-product instruction
CN115248701B (zh) * 2022-09-21 2022-12-20 进迭时空(杭州)科技有限公司 一种处理器寄存器堆之间的零拷贝数据传输装置及方法
US20240127107A1 (en) * 2022-10-14 2024-04-18 Microsoft Technology Licensing, Llc Program accelerators with multidimensional nested command structures
CN117910523A (zh) * 2022-10-19 2024-04-19 联发科技股份有限公司 将暂存存储器分配给异构设备的方法和系统
CN116257320B (zh) * 2022-12-23 2024-03-08 中科驭数(北京)科技有限公司 一种基于dpu虚拟化配置管理方法、装置、设备及介质
TWI826216B (zh) * 2022-12-29 2023-12-11 瑞昱半導體股份有限公司 記憶體控制系統與記憶體控制方法
CN115951841B (zh) * 2023-02-27 2023-06-20 浪潮电子信息产业股份有限公司 存储系统及创建方法、数据处理方法、装置、设备和介质
CN115952385B (zh) * 2023-03-10 2023-05-05 山东省计算中心(国家超级计算济南中心) 用于大规模稀疏方程组求解的并行超节点排序方法及系统
CN115982091B (zh) * 2023-03-21 2023-06-23 深圳云豹智能有限公司 基于rdma引擎的数据处理方法与系统、介质、设备
CN116149759B (zh) * 2023-04-20 2023-07-14 深圳市吉方工控有限公司 Uefi驱动卸载方法、装置、电子设备及可读存储介质
CN116821174A (zh) * 2023-07-17 2023-09-29 深圳计算科学研究院 一种基于逻辑数据块的数据查询方法及其装置
CN116627893B (zh) * 2023-07-18 2023-11-03 苏州浪潮智能科技有限公司 加速引擎配置方法、装置、并行数估计系统、设备及介质
CN117112596A (zh) * 2023-07-28 2023-11-24 中科驭数(北京)科技有限公司 数据处理方法、装置、设备及计算机可读存储介质
CN116700631B (zh) * 2023-08-03 2023-09-29 摩尔线程智能科技(北京)有限责任公司 任务管理装置、方法、图形处理器及电子设备
CN117331720B (zh) * 2023-11-08 2024-02-23 瀚博半导体(上海)有限公司 用于多核间通信的方法、寄存器组、芯片及计算机设备
CN117389625B (zh) * 2023-12-11 2024-03-12 沐曦集成电路(南京)有限公司 基于主动中断指令的进程同步方法、系统、设备及介质
CN117389693B (zh) * 2023-12-12 2024-04-05 麒麟软件有限公司 一种硬件虚拟化系统io层安全检测方法
CN117521061B (zh) * 2024-01-05 2024-03-15 南京南自华盾数字技术有限公司 一种基于二进制转换器的定时旁路攻击安全防护方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20120246657A1 (en) 2011-03-25 2012-09-27 Soft Machines, Inc. Executing instruction sequence code blocks by using virtual cores instantiated by partitionable engines
US20130160016A1 (en) 2011-12-16 2013-06-20 Advanced Micro Devices, Inc. Allocating Compute Kernels to Processors in a Heterogeneous System
WO2013101139A1 (en) 2011-12-30 2013-07-04 Intel Corporation Providing an asymmetric multicore processor system transparently to an operating system
KR101400577B1 (ko) 2013-03-11 2014-06-19 한양대학교 산학협력단 Gpu를 이용한 희소행렬 곱셈 방법
US20140223166A1 (en) 2011-03-11 2014-08-07 Intel Corporation Dynamic core selection for heterogeneous multi-core systems

Family Cites Families (60)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6839728B2 (en) 1998-10-09 2005-01-04 Pts Corporation Efficient complex multiplication and fast fourier transform (FFT) implementation on the manarray architecture
EP1236092A4 (en) 1999-09-01 2006-07-26 Intel Corp BRANCH COMMAND FOR A PROCESSOR
ATE534074T1 (de) 1999-09-01 2011-12-15 Intel Corp Kontextwechselbefehl für multithread-prozessor
US6738831B2 (en) * 2001-12-12 2004-05-18 Intel Corporation Command ordering
US20030120878A1 (en) 2001-12-21 2003-06-26 Andreassen Jens Kloster Resource sharing using a locking mechanism in a multiprocessor environment
US6697076B1 (en) * 2001-12-31 2004-02-24 Apple Computer, Inc. Method and apparatus for address re-mapping
US7068072B2 (en) * 2003-06-30 2006-06-27 Xilinx, Inc. Integrated circuit with interface tile for coupling to a stacked-die second integrated circuit
US7754539B2 (en) * 2003-10-08 2010-07-13 Sige Semiconductor Inc. Module integration integrated circuits
US7765543B1 (en) * 2003-12-17 2010-07-27 Vmware, Inc. Selective descheduling of idling guests running on a host computer system
US7109734B2 (en) * 2003-12-18 2006-09-19 Xilinx, Inc. Characterizing circuit performance by separating device and interconnect impact on signal delay
US7450959B2 (en) * 2003-12-31 2008-11-11 Qualcomm Incorporated Wireless multiprocessor system-on-chip with unified memory and fault inhibitor
US7366865B2 (en) * 2004-09-08 2008-04-29 Intel Corporation Enqueueing entries in a packet queue referencing packets
CN100531394C (zh) * 2004-12-30 2009-08-19 美国博通公司 微处理器中视频运动处理的方法和系统
US7447873B1 (en) * 2005-11-29 2008-11-04 Nvidia Corporation Multithreaded SIMD parallel processor with loading of groups of threads
US20070271325A1 (en) 2006-05-08 2007-11-22 Nvidia Corporation Matrix multiply with reduced bandwidth requirements
JP4784827B2 (ja) 2006-06-06 2011-10-05 学校法人早稲田大学 ヘテロジニアスマルチプロセッサ向けグローバルコンパイラ
US8345053B2 (en) 2006-09-21 2013-01-01 Qualcomm Incorporated Graphics processors with parallel scheduling and execution of threads
US8860741B1 (en) * 2006-12-08 2014-10-14 Nvidia Corporation Graphics processor with memory management unit and cache coherent link
CN101308461A (zh) 2007-05-18 2008-11-19 国际商业机器公司 处理器及其中处理锁事务的方法
US7783822B2 (en) * 2007-07-25 2010-08-24 Hewlett-Packard Development Company, L.P. Systems and methods for improving performance of a routable fabric
US8347005B2 (en) * 2007-07-31 2013-01-01 Hewlett-Packard Development Company, L.P. Memory controller with multi-protocol interface
US7921272B2 (en) 2007-10-05 2011-04-05 International Business Machines Corporation Monitoring patterns of processes accessing addresses in a storage device to determine access parameters to apply
US8055856B2 (en) 2008-03-24 2011-11-08 Nvidia Corporation Lock mechanism to enable atomic updates to shared memory
US7827336B2 (en) 2008-11-10 2010-11-02 Freescale Semiconductor, Inc. Technique for interconnecting integrated circuits
US8115511B2 (en) * 2009-04-14 2012-02-14 Monolithic 3D Inc. Method for fabrication of a semiconductor device and structure
US8843682B2 (en) 2010-05-18 2014-09-23 Lsi Corporation Hybrid address mutex mechanism for memory accesses in a network processor
JP5720577B2 (ja) 2009-12-04 2015-05-20 日本電気株式会社 サーバ及びフロー制御プログラム
US9268611B2 (en) 2010-09-25 2016-02-23 Intel Corporation Application scheduling in heterogeneous multiprocessor computing platform based on a ratio of predicted performance of processor cores
JP2012073741A (ja) * 2010-09-28 2012-04-12 Fuji Electric Co Ltd バス転送システム
US9019791B2 (en) * 2010-11-03 2015-04-28 Shine C. Chung Low-pin-count non-volatile memory interface for 3D IC
US9330430B2 (en) * 2011-03-21 2016-05-03 Apple Inc. Fast queries in a multithreaded queue of a graphics system
US8935683B2 (en) * 2011-04-20 2015-01-13 Qualcomm Incorporated Inline function linking
US9846673B2 (en) * 2011-11-04 2017-12-19 Waseda University Processor, accelerator, and direct memory access controller within a processor core that each reads/writes a local synchronization flag area for parallel execution
US9436512B2 (en) * 2011-12-22 2016-09-06 Board Of Supervisors Of Louisana State University And Agricultural And Mechanical College Energy efficient job scheduling in heterogeneous chip multiprocessors based on dynamic program behavior using prim model
US9136021B2 (en) 2011-12-23 2015-09-15 Intel Corporation Self-repair logic for stacked memory architecture
EP2842031A4 (en) * 2012-04-25 2015-12-30 Intel Corp METHOD AND SYSTEM FOR SAVING THE RELEASE CONSISTENCY IN A COMMON MEMORY PROGRAMMING
WO2013177765A1 (en) * 2012-05-30 2013-12-05 Intel Corporation Runtime dispatching among heterogeneous group of processors
US9065722B2 (en) 2012-12-23 2015-06-23 Advanced Micro Devices, Inc. Die-stacked device with partitioned multi-hop network
US8931108B2 (en) 2013-02-18 2015-01-06 Qualcomm Incorporated Hardware enforced content protection for graphics processing units
US9298658B2 (en) 2013-02-26 2016-03-29 Avago Technologies General Ip (Singapore) Pte. Ltd. Using PCI-E extended configuration space to send IOCTLS to a PCI-E adapter
US9679615B2 (en) * 2013-03-15 2017-06-13 Micron Technology, Inc. Flexible memory system with a controller and a stack of memory
US9525586B2 (en) * 2013-03-15 2016-12-20 Intel Corporation QoS based binary translation and application streaming
JP2014186618A (ja) 2013-03-25 2014-10-02 Toshiba Corp ロックトランザクションコントローラを備えた共有メモリ制御ユニット
US9170854B2 (en) * 2013-06-04 2015-10-27 Advanced Micro Devices, Inc. Thread assignment for power and performance efficiency using multiple power states
US20150007196A1 (en) * 2013-06-28 2015-01-01 Intel Corporation Processors having heterogeneous cores with different instructions and/or architecural features that are presented to software as homogeneous virtual cores
US9571363B2 (en) * 2013-07-15 2017-02-14 Centurylink Intellectual Property Llc Control groups for network testing
US9535488B2 (en) 2013-08-28 2017-01-03 Via Technologies, Inc. Multi-core microprocessor that dynamically designates one of its processing cores as the bootstrap processor
US20150109024A1 (en) 2013-10-22 2015-04-23 Vaughn Timothy Betz Field Programmable Gate-Array with Embedded Network-on-Chip Hardware and Design Flow
KR101925694B1 (ko) 2013-12-26 2018-12-05 인텔 코포레이션 멀티칩 패키지 링크
US9519324B2 (en) * 2014-03-26 2016-12-13 Intel Corporation Local power gate (LPG) interfaces for power-aware operations
US9703948B2 (en) * 2014-03-28 2017-07-11 Intel Corporation Return-target restrictive return from procedure instructions, processors, methods, and systems
WO2015150342A1 (en) * 2014-03-30 2015-10-08 Universiteit Gent Program execution on heterogeneous platform
US20160111406A1 (en) * 2014-10-17 2016-04-21 Globalfoundries Inc. Top-side interconnection substrate for die-to-die interconnection
US10417052B2 (en) * 2014-10-31 2019-09-17 Hewlett Packard Enterprise Development Lp Integrated heterogeneous processing units
US9921768B2 (en) * 2014-12-18 2018-03-20 Intel Corporation Low power entry in a shared memory link
US20160191420A1 (en) * 2014-12-27 2016-06-30 Intel Corporation Mitigating traffic steering inefficiencies in distributed uncore fabric
US10229468B2 (en) * 2015-06-03 2019-03-12 Intel Corporation Automated conversion of GPGPU workloads to 3D pipeline workloads
US9870339B2 (en) 2015-06-26 2018-01-16 Intel Corporation Hardware processors and methods for tightly-coupled heterogeneous computing
US10042673B1 (en) * 2016-05-02 2018-08-07 EMC IP Holdings Company LLC Enhanced application request based scheduling on heterogeneous elements of information technology infrastructure
US9761564B1 (en) 2016-06-30 2017-09-12 Micron Technology, Inc. Layout of transmission vias for memory device

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20140223166A1 (en) 2011-03-11 2014-08-07 Intel Corporation Dynamic core selection for heterogeneous multi-core systems
US20120246657A1 (en) 2011-03-25 2012-09-27 Soft Machines, Inc. Executing instruction sequence code blocks by using virtual cores instantiated by partitionable engines
US20130160016A1 (en) 2011-12-16 2013-06-20 Advanced Micro Devices, Inc. Allocating Compute Kernels to Processors in a Heterogeneous System
WO2013101139A1 (en) 2011-12-30 2013-07-04 Intel Corporation Providing an asymmetric multicore processor system transparently to an operating system
KR101400577B1 (ko) 2013-03-11 2014-06-19 한양대학교 산학협력단 Gpu를 이용한 희소행렬 곱셈 방법

Also Published As

Publication number Publication date
TW202240387A (zh) 2022-10-16
PL3812900T3 (pl) 2024-04-08
TW202347124A (zh) 2023-12-01
JP2020503593A (ja) 2020-01-30
KR20190093568A (ko) 2019-08-09
EP3563235A1 (en) 2019-11-06
FI3812900T3 (fi) 2024-02-09
CN115454586A (zh) 2022-12-09
CN110121698A (zh) 2019-08-13
US20200401440A1 (en) 2020-12-24
TWI742964B (zh) 2021-10-11
EP3812900B1 (en) 2023-11-29
DK3812900T3 (da) 2024-02-12
ES2933675T3 (es) 2023-02-13
EP4120070A1 (en) 2023-01-18
TWI810166B (zh) 2023-08-01
US20190347125A1 (en) 2019-11-14
DE112016007566T5 (de) 2019-09-26
EP3812900A1 (en) 2021-04-28
US11693691B2 (en) 2023-07-04
WO2018125250A1 (en) 2018-07-05
KR20200140395A (ko) 2020-12-15
CN112506568A (zh) 2021-03-16
TW202121169A (zh) 2021-06-01
CN116755778A (zh) 2023-09-15
US11416281B2 (en) 2022-08-16
US11093277B2 (en) 2021-08-17
TWI832298B (zh) 2024-02-11
EP3563235A4 (en) 2020-08-26
KR20230106746A (ko) 2023-07-13
US20230418655A1 (en) 2023-12-28
EP4120070B1 (en) 2024-05-01
EP4089531A1 (en) 2022-11-16
TW201826122A (zh) 2018-07-16
BR112019010679A2 (pt) 2019-09-17
US20220164218A1 (en) 2022-05-26
KR20220090588A (ko) 2022-06-29
EP3563235B1 (en) 2022-10-05
JP6988040B2 (ja) 2022-01-05
PL3563235T3 (pl) 2023-03-13

Similar Documents

Publication Publication Date Title
KR102520017B1 (ko) 이종 컴퓨팅을 위한 시스템들, 방법들, 및 장치들
US10360168B1 (en) Computing in parallel processing environments
Pellegrini et al. The arm neoverse n1 platform: Building blocks for the next-gen cloud-to-edge infrastructure soc
JP7164267B2 (ja) ヘテロジニアスコンピューティングのためのシステム、方法及び装置
US11188341B2 (en) System, apparatus and method for symbolic store address generation for data-parallel processor
Santos et al. Solving datapath issues on near-data accelerators

Legal Events

Date Code Title Description
A107 Divisional application of patent
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant