KR102118836B1 - Simd 아키텍처에서 레인 셔플을 위한 셔플러 회로 - Google Patents

Simd 아키텍처에서 레인 셔플을 위한 셔플러 회로 Download PDF

Info

Publication number
KR102118836B1
KR102118836B1 KR1020197000601A KR20197000601A KR102118836B1 KR 102118836 B1 KR102118836 B1 KR 102118836B1 KR 1020197000601 A KR1020197000601 A KR 1020197000601A KR 20197000601 A KR20197000601 A KR 20197000601A KR 102118836 B1 KR102118836 B1 KR 102118836B1
Authority
KR
South Korea
Prior art keywords
data
processing
processing lanes
lanes
lane
Prior art date
Application number
KR1020197000601A
Other languages
English (en)
Other versions
KR20190028426A (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 KR20190028426A publication Critical patent/KR20190028426A/ko
Application granted granted Critical
Publication of KR102118836B1 publication Critical patent/KR102118836B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • G06F15/8007Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors single instruction multiple data [SIMD] multiprocessors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/38Information transfer, e.g. on bus
    • G06F13/40Bus structure
    • G06F13/4004Coupling between buses
    • G06F13/4009Coupling between buses with data restructuring
    • G06F13/4013Coupling between buses with data restructuring with data re-ordering, e.g. Endian conversion
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/80Architectures of general purpose stored program computers comprising an array of processing units with common control, e.g. single instruction multiple data processors
    • G06F15/8053Vector processors
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30032Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
    • 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/38Concurrent instruction execution, e.g. pipeline or look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline or look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Computing Systems (AREA)
  • Mathematical Physics (AREA)
  • Advance Control (AREA)
  • Image Processing (AREA)
  • Executing Machine-Instructions (AREA)
  • Time-Division Multiplex Systems (AREA)
  • Synchronisation In Digital Transmission Systems (AREA)

Abstract

셔플 연산을 수행하기 위한 기술들이 설명된다. 모든 레인 대 모든 레인 크로스 바를 이용하기 보다는, 더 작은 크로스 바를 갖는 셔플러 회로가 설명된다. 셔플러 회로는 프로세싱 레인들로부터 수신된 데이터를 재정렬하고 그 재정렬된 데이터를 출력하는 것에 의해 구분적으로 셔플 연산을 수행한다.

Description

SIMD 아키텍처에서 레인 셔플을 위한 셔플러 회로
본 개시는 단일 명령 다중 데이터 (SIMD) 구조에서의 데이터 프로세싱에 관한 것이다.
그래픽스 프로세싱 유닛 (GPU) 과 같은 다양한 유형의 프로세싱 유닛들은 단일 명령 다중 데이터 (SIMD) 구조로 설계된다. SIMD 구조에서, 각각의 프로세싱 레인이 동일한 명령을, 그러나 상이한 데이터로, 실행하는 복수의 프로세싱 레인들이 있다.
개요
본 개시는 SIMD 아키텍처를 갖는 프로세싱 유닛의 상이한 프로세싱 레인들 사이에서 데이터를 셔플링하는 예시적인 방법을 설명한다. 셔플을 수행하기 위해, 본 개시는 셔플러 회로 (shuffler circuit) 를 설명한다. 셔플러 회로는 프로세싱 레인들의 서브세트 (프로세싱 레인들의 소스 서브세트로 지칭됨) 로부터 데이터를 수신하고, 소스 레인들에 걸쳐 셔플 연산을 수행하고 (예를 들어, 데이터를 재정렬 (reorder) 하고), 재정렬된 데이터를 프로세싱 레인들에 출력한다. 모든 프로세싱 레인들에 셔플러 회로로부터 데이터가 전송되지만, 프로세싱 레인들의 서브세트 (프로세싱 레인들의 목적지 서브세트로 지칭됨) 만이 재정렬된 데이터를 저장을 위해 대응하는 레지스터에 쓰기할 수도 있고, 나머지는 재정렬된 데이터를 폐기할 수도 있다. 셔플러 회로는 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신하고, 수신된 데이터를 재정렬하며, 프로세싱 레인들의 연속적인 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터에 쓰기하는 것이 가능할 수도 있다.
이러한 방식으로, 셔플러 회로는 데이터의 서브세트에 대해 구분적으로 (piecewise) 데이터를 셔플링할 수도 있다. 본 개시에서 설명된 바와 같이, 데이터를 구분적으로 셔플링하는 셔플러 회로를 이용하는 것은, 데이터를 셔플링할 때 추가적인 회로 공간을 필요로 하고 전력 소비를 증가시키는, 각각의 프로세싱 레인 사이의 물리적 연결을 필요로 하지 않고서 데이터 셔플을 허용한다.
일례에서, 본 개시는 데이터를 프로세싱하기 위한 디바이스를 설명하며, 그 디바이스는 복수의 프로세싱 레인들을 포함하며, 상기 프로세싱 레인들의 각각은 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조 및 셔플러 회로에서 구성된다. 상기 셔플러 회로는 상기 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신하고, 상기 프로세싱 레인들 중 적어도 일부의 프로세싱 레인에게 프로세싱 레인들 중 다른 프로세싱 레인에 데이터를 출력하도록 명령하는 명령에 응답하여 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 데이터를 재정렬하고, 그 재정렬된 데이터를 프로세싱 레인들에 출력하도록 구성되고, 상기 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터들에 저장하고, 상기 프로세싱 레인들의 목적지 서브세트 외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기한다.
일례에서, 본 개시는 데이터를 프로세싱하는 방법을 설명하며, 그 방법은: 셔플러 회로로, 복수의 프로세싱 레인들 중 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신하는 단계로서, 상기 프로세싱 레인들의 각각은 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되는, 상기 데이터를 수신하는 단계, 상기 프로세싱 레인들 중 적어도 일부의 프로세싱 레인에게 프로세싱 레인들 중 다른 프로세싱 레인에 데이터를 출력하도록 명령하는 명령에 응답하여, 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 데이터를, 상기 셔플러 회로로, 재정렬하는 단계, 및 상기 프로세싱 레인들에 재정렬된 데이터를, 상기 셔플러 회로로, 출력하는 단계를 포함하고, 상기 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터들에 저장하고, 상기 프로세싱 레인들의 목적지 서브세트 외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기한다.
일례에서, 본 개시는 데이터를 프로세싱하기 위한 디바이스를 설명하며, 그 디바이스는: 복수의 프로세싱 레인들 중 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신하는 수단으로서, 상기 프로세싱 레인들의 각각은 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되는, 상기 데이터를 수신하는 수단, 상기 프로세싱 레인들 중 적어도 일부의 프로세싱 레인에게 프로세싱 레인들 중 다른 프로세싱 레인에 데이터를 출력하도록 명령하는 명령에 응답하여, 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 데이터를 재정렬하는 수단, 및 상기 재정렬된 데이터를 프로세싱 레인들에 출력하는 수단을 포함하고, 상기 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터들에 저장하고, 상기 프로세싱 레인들의 목적지 서브세트 외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기한다.
일례에서, 본 개시는 명령들을 포함하는 컴퓨터 판독가능 저장 매체로서, 상기 명령들은 실행될 때, 데이터를 프로세싱하기 위한 디바이스의 하나 이상의 회로들로 하여금, 복수의 프로세싱 레인들 중 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신하는 것으로서, 상기 프로세싱 레인들의 각각은 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되는, 상기 데이터를 수신하고, 상기 프로세싱 레인들 중 적어도 일부의 프로세싱 레인에게 프로세싱 레인들 중 다른 프로세싱 레인에 데이터를 출력하도록 명령하는 명령에 응답하여, 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 데이터를 재정렬하고, 그리고 상기 재정렬된 데이터를 프로세싱 레인들에 출력하게 하고, 상기 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터들에 저장하고, 상기 프로세싱 레인들의 목적지 서브세트 외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기하는, 컴퓨터 판독가능 저장 매체를 설명한다.
하나 이상의 예들의 상세는 첨부 도면 및 아래의 설명에 제시되어 있다. 다른 특징, 목적 및 이점들은 상세한 설명, 도면, 및 청구항들로부터 분명해질 것이다.
도 1은 본 개시에서 설명된 하나 이상의 예시적인 기법들을 수행하도록 구성된 이미지 프로세싱을 위한 디바이스의 블록도이다.
도 2는 도 1의 GPU 의 일례를 더 상세하게 나타내는 블록도이다.
도 3은 셔플 연산을 수행하기 위한 예시적 기법을 나타내는 개념도이다.
도 4a 내지 도 4r은 셔플 모드들의 다양한 예들을 나타내는 개념도이다.
도 5는 셔플 명령들과 함께 사용되는 연산들을 나타내는 개념도이다.
도 6은 데이터를 프로세싱하는 예시적인 방법을 나타내는 플로우차트이다.
상세한 설명
그래픽스 프로세싱 유닛 (GPU) 과 같은 단일 명령 다중 데이터 (SIMD) 아키텍처에는, 복수의 프로세싱 레인들이 존재한다. 각각의 프로세싱 레인은 동일한 명령의 연산들을, 그러나 상이한 데이터에 대해, 수행한다. 일부 경우에, 프로세싱 레인들은, 셔플 (shuffle) 이라고 하는 것에서, 또 다른 프로세싱 레인에 의해 소비될 데이터를 출력할 수도 있다. 셔플의 일례는 각각의 프로세싱 레인이 그의 좌측 이웃 프로세싱 레인으로부터 데이터를 수신한다는 것이다. 임의의 하나의 프로세싱 레인으로 하여금 임의의 다른 프로세싱 레인에 출력할 수 있게 하는 한 가지 방법은 전체 모든 레인 대 모든 레인 크로스바 (예 : 프로세싱 레인으로부터 모든 다른 프로세싱 레인들로의 전기 연결) 를 경유하는 것인데, 이는 칩 면적 및 전력 소비의 점에서 매우 비싸다. 또한, 프로세싱 레인들이 증가하므로, 그러한 전체 모든 레인 대 모든 레인 크로스바의 비용은 2차식으로 (quadratically) 증가한다.
본 개시는 전체 모든 레인 대 모든 레인 크로스바를 필요로 하지 않고서 레인 셔플을 구현하기 위한 예시적인 기술을 설명한다. SIMD 구조를 갖는 디바이스 (예 : GPU) 는 프로세싱 레인들의 전체 수보다 더 적은 수의 프로세싱 레인들로부터 데이터를 수신하는 셔플러 회로를 포함한다 (예 : 64개의 프로세싱 레인들이 있는 경우, 셔플러 회로는 일시에 8개의 프로세싱 레인들로부터 데이터를 수신한다). 이 셔플러 회로는 소스 프로세싱 레인들의 서브세트 (프로세싱 레인들의 전체 수보다 적음) 로부터 데이터를 수신하고, 데이터에 대한 셔플을 수행하고 (예 : 레인들 사이의 데이터를 재정렬하고), 재정렬된 데이터를 모든 프로세싱 레인들에 출력한다 . 그러나, 프로세싱 레인들의 서브세트만이 재정렬된 데이터를 저장을 위해 대응하는 레지스터에 쓰기할 수도 있고, 나머지 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기할 수도 있다. 셔플러 회로는 프로세싱 레인들의 연속적인 소스 서브세트 및 재정렬된 데이터를 각각의 대응하는 레지스터들에 쓰기 가능한 프로세싱 레인들의 연속적인 목적지 서브세트에 대해 이들 단계들을 반복한다.
예를 들어, 각각의 프로세싱 레인은 대응하는 레지스터에 데이터를 쓰기하고 대응하는 레지스터로부터 데이터를 수신할 수도 있다. 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터에 저장하는데, 이는 재정렬된 데이터가 대응하는 레지스터에 실제로 저장된다는 것을 의미한다. 프로세싱 레인들의 목적지 서브세트외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기하는데, 이는 프로세싱 레인들이 데이터를 그들의 대응하는 레지스터에서 시도 및 저장할 수도 있다는 것을 의미한다; 그러나, 대응하는 레지스터들은 실제로 데이터를 저장하지 않을 수도 있다.
본 개시에서, 프로세싱 레인들이 재정렬된 데이터를 대응하는 레지스터에 저장한다는 것은 프로세싱 레인들이 재정렬된 데이터를 대응하는 레지스터들에 성공적으로 저장할 수 있다는 것 또는 프로세싱 레인들이 재정렬된 데이터를 대응하는 레지스터에 저장하도록 구성된다는 것을 의미한다. 프로세싱 레인들이 재정렬된 데이터를 폐기한다는 것은 프로세싱 레인들이 재정렬된 데이터를 대응하는 레지스터에 저장하는데 성공하지 못했다는 것과 그 데이터에 대해 더 이상의 조치가 취해지지 않을 것이라는 것 또는 프로세싱 레인들이 재정렬된 데이터를 대응하는 레지스터들에 저장하지 않도록 구성된다는 것을 의미한다.
셔플러 회로는 셔플 연산을 완료하기 위해 다수의 반복들을 이용할 수도 있는데, 그 이유는 프로세싱 레인들의 서브세트만으로부터의 데이터가 각각의 주어진 시간 (즉, 각각의 반복) 에서 재정렬되고 있기 때문이다. 그러나, 각각의 프로세싱 레인이 다른 프로세싱 레인들의 각각에 커플링될 필요가 없기 때문에, GPU의 크기 및 전력 소모가 감소될 수도 있다.
비록 예시적인 기술들이 GPU 와 관련하여 설명되었지만, 그 기술들은 그렇게 한정되지 않는다. 이 기술들은 다양한 유형의 프로세싱 유닛들에 적용가능하고, 일반적으로 단일 명령 다중 데이터 (SIMD) 구조를 포함하는 프로세싱 유닛에 적용가능할 수도 있다.
도 1은 본 개시에서 설명된 하나 이상의 예시적인 기법들을 수행하도록 구성된 이미지 프로세싱을 위한 디바이스의 블록도이다. 디바이스 (10) 의 예들은 퍼스널 컴퓨터, 데스크톱 컴퓨터, 랩톱 컴퓨터, 컴퓨터 워크스테이션, 비디오 게임 플랫폼 또는 콘솔, 무선 통신 디바이스 (이를테면, 예를 들어, 이동 전화기, 셀룰러 전화기, 위성 전화기, 및/또는 이동 전화기 핸드셋), 유선 전화기 (landline telephone), 인터넷 전화기, 휴대 비디오 게임 디바이스 또는 PDA (personal digital assistant) 과 같은 핸드헬드 디바이스, 태블릿 컴퓨터, 퍼스널 뮤직 플레이어, 비디오 플레이어, 디스플레이 디바이스, 카메라 디바이스, 텔레비젼, 텔레비젼 셋톱 박스, 서버, 중간 네트워크 디바이스, 메인프레임 컴퓨터 또는 그래픽 데이터를 프로세싱 및/또는 디스플레이하는 임의의 다른 타입의 디바이스를 포함할 수도 있다.
도 1의 예에 나타낸 바와 같이, 디바이스 (10)는 중앙 프로세싱 유닛 (CPU) (16), 그래픽 프로세싱 유닛 (GPU) (12) 및 GPU (12) 의 로컬 메모리 (20), 사용자 인터페이스 (22), 시스템 메모리 (30) 에의 액세스를 제공하는 메모리 제어기 (24), 및 그래픽 데이터가 디스플레이 (28) 상에 디스플레이되게 하는 신호를 출력하는 디스플레이 인터페이스 (26) 를 포함한다. GPU (12) 는 셔플러 회로 (14) 를 포함하는 것으로 나타나있다. 이러한 더 많은 상세들에 설명되어 있는 바처럼, 셔플러 회로 (14) 는 GPU (12) 가 실행할 셔플 명령의 연산들을 수행하도록 구성될 수도 있다. 셔플러 회로 (14) 가 GPU (12) 내부에 있는 것으로 나타나 있지만, 일부 예에서, 셔플러 회로 (14) 는 GPU (12) 외부에 있을 수도 있다. 이 설명에서, 쉽게 하기 위해, 셔플러 회로 (14) 는 GPU (12) 내부에 있는 것으로 설명된다.
일부 예에서, 셔플러 회로 (14) 는 GPU (12) 의 코어와 GPU (12) 의 로드/저장 유닛 사이에 있을 수도 있다. GPU (12) 의 로드/저장 유닛은 로컬 메모리 (20) 와 시스템 버스 (32) 양자 모두에 연결된다. 이것은 셔플러 회로 (14) 가 아마도, 로컬/글로벌 메모리에 데이터를 저장하기 전에, 또는 이들로부터 데이터를 로딩한 후에, 데이터를 스위즐 (swizzle) 하는 것과 같은 다른 목적을 위해 재사용될 수 있게 한다. GPU (12) 의 코어와 GPU (12)의 로드/저장 유닛 사이의 셔플러 회로 (14) 의 위치는 단지 하나의 예로서 제공되며 제한적인 것으로 간주되어서는 안된다.
이해를 쉽게 하기 위해, 예시적인 기술들은 GPU (12) 와 관련하여 설명된다. 그러나, 예시적인 기술들은 GPU (12) 에 한정되지 않고 CPU (16) 또는 메모리 제어기 (24) 와 같은 다른 컴포넌트들에 적용 가능할 수도 있다. 일반적으로, 본 개시에 설명된 기술들은 2개 이상의 프로세싱 레인들을 포함하는 프로세싱 유닛들에 적용가능할 수도 있다. GPU (12) 는 GPU 가 다수의 프로세싱 레인들을 포함하는 경향이 있기 때문에 예시의 목적으로 사용된다. 그러나 GPU는 2개 이상의 프로세싱 레인들을 포함하는 유일한 타입의 프로세싱 유닛이 아니다.
또한, 다양한 컴포넌트들이 별개의 컴포넌트로 나타나 있지만, 일부 예에서, 컴포넌트들은 시스템 온 칩 (SoC) 을 형성하도록 결합될 수도 있다. 예로서, CPU (16), GPU (12) 및 디스플레이 인터페이스 (26) 는 공통 칩 상에 형성될 수도 있다. 일부 예에서, CPU (16), GPU (12) 및 디스플레이 인터페이스 (26) 중 하나 이상은 별개의 칩들에 있을 수도 있다.
도 1에 나타낸 다양한 컴포넌트들은 하나 이상의 마이크로프로세서, 주문형 집적 회로 (ASIC), 필드 프로그램 가능 게이트 어레이 (FPGA), 디지털 신호 프로세서 (DSP), 또는 기타 등가의 집적 또는 이산 논리 회로에서 형성될 수도 있다. 로컬 메모리 (20) 의 예들은 하나 이상의 휘발성 또는 비휘발성 메모리 또는 저장 디바이스들, 이를테면 (예를 들어, RAM (random access memory), SRAM (static RAM), DRAM (dynamic RAM), EPROM (erasable programmable ROM), EEPROM (electrically erasable programmable ROM), 플래시 메모리, 자기 데이터 매체 또는 광학 저장 매체) 를 포함한다.
도 1에 나타낸 다양한 유닛들은 버스 (32) 를 사용하여 서로 통신한다. 버스 (32) 는 제 3 세대 버스 (예를 들어, HyperTransport 버스 또는 InfiniBand 버스), 제 2 세대 버스 (예를 들어, Advanced Graphics Port 버스, PCI (Peripheral Component Interconnect) Express 버스, 또는 AXI (Advanced eXtensible Interface) 버스) 또는 다른 타입의 버스 또는 디바이스 인터커넥트와 같은 다양한 버스 구조들 중 임의의 것일 수도 있다. 도 1에 도시된 상이한 컴포넌트들간의 버스 및 통신 인터페이스의 특정 구성은 단지 예시적인 것이며, 동일하거나 상이한 컴포넌트들을 갖는 다른 구성들의 컴퓨팅 디바이스들 및/또는 다른 이미지 프로세싱 시스템들이 본 개시의 기술들을 구현하는데 사용될 수도 있다.
CPU (16) 는 디바이스 (10) 의 동작을 제어하는 범용 또는 특수 목적 프로세서를 포함할 수도 있다. 사용자는 CPU (16) 로 하여금 하나 이상의 소프트웨어 애플리케이션을 실행하게 하기 위해 컴퓨팅 디바이스 (10) 에 입력을 제공할 수도 있다. CPU (16) 상에서 실행되는 소프트웨어 애플리케이션은 예를 들어, 운영 시스템, 워드 프로세서 애플리케이션, 이메일 애플리케이션, 스프레드 시트 애플리케이션, 미디어 플레이어 애플리케이션, 비디오 게임 애플리케이션, 그래픽 사용자 인터페이스 애플리케이션 또는 다른 프로그램을 포함할 수도 있다. 사용자는 키보드, 마우스, 마이크로폰, 터치 패드 또는 사용자 인터페이스 (22) 를 통해 컴퓨팅 디바이스 (10) 에 커플링된 다른 입력 디바이스와 같은 하나 이상의 입력 디바이스들 (도시되지 않음) 을 통해 컴퓨팅 디바이스 (10) 에 입력을 제공할 수도 있다.
메모리 제어기 (24) 는 시스템 메모리 (30) 로 들어가고 나오는 데이터의 전송을 용이하게 한다. 예를 들어, 메모리 제어기 (24) 는 메모리 읽기 및 쓰기 커맨드를 수신하고, 메모리 (30) 에 대해 그러한 커맨드들을 서비스하여 컴퓨팅 디바이스 (10) 에서의 컴포넌트들에 메모리 서비스를 제공할 수도 있다. 메모리 제어기 (24) 는 시스템 메모리 (30) 에 통신 가능하게 커플링된다. 메모리 제어기 (34) 가 도 1의 예시적인 컴퓨팅 디바이스 (10) 에 CPU (16) 및 시스템 메모리 (30) 양자 모두로부터 분리된 프로세싱 모듈인 것으로 나타나 있지만, 다른 예들에서, 메모리 제어기 (24) 의 일부 또는 모든 기능은 CPU (16) 및 시스템 메모리 (30) 중 하나 또는 양자 모두 상에서 구현될 수도 있다.
시스템 메모리 (30) 는 CPU (16) 및 GPU (12)에 의해 액세스 가능한 프로그램 모듈 및/또는 명령 및/또는 데이터를 저장할 수도 있다. 예를 들어, 시스템 메모리 (30) 는 사용자 애플리케이션, GPU (12) 로부터의 결과 이미지 등을 저장할 수도 있다. 시스템 메모리 (30) 는 컴퓨팅 디바이스 (10) 의 다른 컴포넌트에 의한 사용을 위한 및/또는 컴퓨팅 디바이스 (10) 의 다른 컴포넌트들에 의해 생성되는 정보를 추가로 저장할 수도 있다. 예를 들어, 시스템 메모리 (30) 는 디바이스 (10) 를 위한 디바이스 메모리로서 동작할 수도 있다. 시스템 메모리 (30) 는 하나 이상의 휘발성 또는 비휘발성 메모리 또는 저장 디바이스들, 이를테면, 예를 들어, RAM (random access memory), SRAM (static RAM), DRAM (dynamic RAM), ROM (read-only memory), EPROM (erasable programmable ROM), EEPROM (electrically erasable programmable ROM), 플래시 메모리, 자기 데이터 매체 또는 광학 저장 매체를 포함할 수도 있다.
일부 양태들에서, 시스템 메모리 (30) 는 CPU (16), GPU (12) 및 디스플레이 인터페이스 (26) 로 하여금 본 개시에서 이들 컴포넌트들에 속하는 것을 생각되는 기능들을 수행하게 하는 명령들을 포함할 수도 있다. 따라서, 시스템 메모리 (30) 는, 실행될 때, 하나 이상의 프로세서들 (예를 들어, CPU (16), GPU (12), 및 디스플레이 인터페이스 (26)) 로 하여금 다양한 기능들을 수행하게 하는 명령들을 저장한 컴퓨터 판독가능 저장 매체일 수도 있다.
일부 예들에서, 시스템 메모리 (30) 는 비일시적 저장 매체이다. 용어 "비일시적" 은, 저장 매체가 캐리어 파 (carrier wave) 또는 전파되는 신호로 구현되지 않는다는 것을 나타낸다. 하지만, 용어 "비일시적" 은, 시스템 메모리 (30) 가 이동가능하지 않다는 것 또는 그의 콘텐츠가 정적이라는 것을 의미하는 것으로 해석되서는 안된다. 일 예로서, 시스템 메모리 (30) 는 디바이스 (10) 로부터 제거되고, 또 다른 디바이스로 이동될 수도 있다. 또 다른 예로서, 시스템 메모리 (30) 와 실질적으로 유사한, 메모리가 디바이스 (10) 내에 삽입될 수도 있다. 특정 예들에서, 비일시적 저장 매체는, (예를 들어, RAM 에), 경시적으로, 변화할 수 있는 데이터를 저장할 수도 있다.
CPU (16) 및 GPU (12) 는 시스템 메모리 (30) 내에 할당된 각각의 버퍼에 이미지 데이터 등을 저장할 수도 있다. 디스플레이 인터페이스 (26) 는 시스템 메모리 (30) 로부터 데이터를 취출하고 렌더링된 이미지 데이터에 의해 표현된 이미지를 디스플레이하도록 디스플레이 (28) 를 구성할 수도 있다. 일부 예에서, 디스플레이 인터페이스 (26) 는 시스템 메모리 (30) 로부터 취출된 디지털 값을 디스플레이 (28) 에 의해 소비 가능한 아날로그 신호로 변환하도록 구성된 디지털-아날로그 변환기 (DAC) 를 포함할 수도 있다. 다른 예들에서, 디스플레이 인터페이스 (26) 는 디스플레이 (28) 의 일부를 형성할 수도 있거나 또는 프로세싱을 위해 디지털 값을 디스플레이 (28) 에 직접 보낼 수도 있다.
디스플레이 (28) 는 모니터, 텔레비전, 프로젝션 디바이스, 액정 디스플레이 (LCD), 플라즈마 디스플레이 패널, 발광 다이오드 (LED) 어레이, CRT (cathode ray tube) 디스플레이, 전자 종이, SED (surface-conduction electron-emitted display), 레이저 텔레비전 디스플레이, 나노결정 디스플레이 또는 다른 타입의 디스플레이 유닛을 포함할 수도 있다. 디스플레이 (28) 는 컴퓨팅 디바이스 (10) 내에 통합될 수도 있다. 예를 들어, 디스플레이 (28) 는 이동 전화 핸드셋 또는 태블릿 컴퓨터의 스크린일 수도 있다. 대안적으로, 디스플레이 (28) 는 유선 또는 무선 통신 링크를 통해 컴퓨팅 디바이스 (10) 에 커플링된 독립형 디바이스 (stand alone device) 일 수도 있다. 예를 들어, 디스플레이 (28) 는 케이블 또는 무선 링크를 통해 퍼스널 컴퓨터에 연결된 컴퓨터 모니터 또는 평판 디스플레이일 수도 있다.
본 개시에 설명된 예시적인 기술에서, GPU (12) 는 그래픽스 연산, 그리고 일부 경우에, 비 그래픽스 연산 역시 수행하도록 구성된 특수 하드웨어 회로일 수도 있다. GPU (12) 는 단일 명령, 다중 데이터 (SIMD) 구조로 설계된다. SIMD 구조에서, GPU (12) 는 복수의 SIMD 프로세싱 레인들을 포함할 수도 있으며, 여기서 각각의 SIMD 프로세싱 레인은 동일한 프로그램의 명령들을, 그러나 상이한 데이터에 대해, 실행한다. 특정 SIMD 프로세싱 레인에서 실행되는 특정 명령은 스레드로 지칭된다. 주어진 스레드에 대한 데이터가 상이할 수도 있기 때문에 각 SIMD 프로세싱 레인은 상이한 스레드를 실행하는 것으로 고려될 수도 있지만, 프로세싱 레인 상에서 실행되는 스레드는 다른 프로세싱 레인들 상에서 실행되는 명령과 동일한 명령이다. 이러한 방식으로, SIMD 구조는 GPU 가 많은 태스크들을 동시에 수행할 수 있게 한다.
많은 그래픽스 연산은 동일한 프로세스가 병렬로 수행될 것을 요구한다 (예를 들어, 픽셀 렌더링). 따라서, 그래픽스 프로세싱을 위해, CPU (16) 는 GPU (12) 에 의해 수행되도록 GPU (12) 로 그러한 그래픽스 프로세싱 태스크들을 오프로딩한다. 일부 예에서, 그래픽스 프로세싱에 대한 것이 아닌 경우에도, 매트릭스 곱셈과 같은 비 그래픽스 연산은 GPU (12) 상의 실행으로부터 혜택을 받을 수도 있다. 따라서, 일부 예에서, CPU (16) 는 GPU (12) 가 이러한 연산을 수행하기에 더 적합할 수도 있기 때문에 GPU (12) 로의 특정 비 그래픽스 연산을 오프로딩할 수도 있다.
그래픽스 프로세싱의 예로서, 버텍스 프로세싱을 위해, GPU (12) 는 각 버텍스에 대해 동일한 태스크를 수행할 수도 있지만, 각 버텍스에 대한 버텍스 데이터는 상이할 수도 있다 (예를 들어, 상이한 좌표, 상이한 컬러 값 등). SIMD 구조는 GPU (12) 가 상이한 SIMD 프로세싱 레인들 상에서 버텍스 셰이더의 동일한 인스턴스를 실행함으로써 다수의 버텍스들을 병렬로 프로세싱할 수 있게 한다. 이 예에서, 각각의 SIMD 프로세싱 레인은 버텍스 셰이더의 스레드를 실행할 수도 있으며, 여기서 각각의 스레드는 버텍스 셰이더의 하나의 인스턴스를 위한 것이다.
SIMD 프로세싱 레인은 하나 이상의 산술 로직 유닛 (ALU) 을 포함하며, SIMD 프로세싱 레인은 그 결과를 하나 이상의 범용 레지스터 (GPR) 에 저장한다. 복수의 GPR 은 범용 레지스터 파일 (GPRF) 로 불린다. GPRF 는 하나 이상의 SIMD 프로세싱 레인들로부터 결과 데이터를 저장하기 위한 전용 레지스터를 포함한다. GPR 은 GPU (12) 의 로컬 캐시 또는 로컬 메모리 (20) 과는 분리되고 별개일 수도 있다.
모든 레인 공유 메모리에 액세스하는 것을 통해 데이터를 교환하는 대신, 레인 셔플로 지칭되는, 프로세싱 레인들이 서로 직접 데이터를 공유하고 교환하는 것은, (OpenCL 의 표준 내장 기능들인) 감소 및 스캔 (reduce and scan), 브로드캐스트, 트랜스포즈 (transpose), 비토닉 소트 (bitonic sort), 푸리에 변환 등과 같은 크로스 레인 데이터 통신을 필요로 하는 일부 병렬 알고리즘의 속도를 크게 높일 수 있다. 일례로서, 매트릭스를 트랜스포즈하기 위해서, 프로세싱 레인의 ALU 들은 프로세싱 레인이 연산하고 있는 값을 다른 프로세싱 레인의 ALU 들에 송신할 수도 있다. 다른 예로서, 특정 컬러의 얼마나 많은 픽셀이 존재하는지를 결정하기 위해, 프로세싱 레인들의 ALU 들은 각 프로세싱 레인이 연산하고 있는 픽셀의 컬러를 나타내는 정보를 다른 프로세싱 레인에 출력할 수도 있고, 반복 프로세스를 통해, 특정 컬러의 얼마나 많은 픽셀들이 있는지를 결정하는 것이 가능할 수도 있다. 레인 셔플이 유용한 이유에 대한 다른 예들이 있을 수도 있으며, 본 개시에서 설명된 기술들은 레인 셔플을 위한 이용 사례 (use case) 들 중 어느 것에도 한정되지 않는다.
레인 셔플을 구현하는 한 가지 방법은 스위칭 네트워크를 통해 각 프로세싱 레인을 모든 다른 프로세싱 레인과 선택적으로 상호 연결하는 것이다. 임의의 프로세싱 레인이 임의의 다른 프로세싱 레인과 커플링될 수 있게 하는 이러한 상호 연결은 전체 모든 레인 대 모든 레인 크로스 바 (full all-lane to all-lane cross bar) 라고 불린다. 전체 모든 레인 대 모든 레인 크로스 바는 칩 면적의 측면에서 매우 포괄적 (expansive) 이고 높은 전력 소비를 필요로 할 수도 있다. 또한, 칩 면적 및 전력 소비의 증가는 프로세싱 레인의 증가에 대해 2차식으로 증가한다.
모든 레인 대 모든 레인 크로스 바를 필요로 하지 않고 레인 셔플 (예를 들어, 대부분의 모든 타입의 레인 셔플들) 을 허용하기 위해, 본 개시는 셔플러 회로 (14) 를 설명한다. 일부 예에서, 셔플러 회로 (14) 는 고정 기능 (fixed-function) 을 수행하도록 구성되는 (예를 들어, 프로그래밍 가능하지 않은) 고정 기능 하드웨어 회로이다. 그러나, 예시적인 기술들은 한정되지 않는다. 일부 예에서, 셔플러 회로 (14) 는 본 개시에서 설명된 예시적인 기술들을 수행하는데 사용되는 소프트웨어/펌웨어가 실행되는 프로그램 가능한 회로에 의해 형성될 수도 있다. 이 예에서, 소프트웨어/펌웨어는 본 개시에서 설명된 예시적인 연산들을 수행하도록 셔플러 회로 (14) 를 구성할 수도 있다. 다른 예에서, 셔플러 회로 (14) 는 고정 기능 하드웨어 회로 및 프로그램 가능한 프로세싱 회로의 조합에 의해 형성될 수도 있다.
셔플러 회로 (14) 가 프로그램 가능한 회로인 예들에서, 시스템 메모리 (30) 는 셔플러 회로 (14) 로 하여금 본 개시에 설명된 예시적인 기술들을 수행하게 하는 명령들을 저장할 수도 있다. 그러한 예들에서, 셔플러 회로 (14) 는 GPU (12) 의 프로그램 가능한 코어의 일부일 수도 있고, 셔플러 회로 (14) 가 이 개시에서 설명된 예시적인 기술들을 수행할 때 CPU (16) 는 명령들을 실행하게 하도록 셔플러 회로 (14) 에 명령할 수도 있다. 예를 들어, CPU (16) 는 셔플러 회로 (14) 가 명령들을 취출하는 시스템 메모리 (30) 내의 메모리 로케이션을 식별하는 정보를 셔플러 회로 (14) 에 제공하고 그 명령을 실행하도록 셔플러 회로 (14) 에 커맨드들을 제공할 수도 있다. 어느 경우든, 설명을 쉽게 하기 위해, 본 개시는 고정 기능 회로로서 셔플러 회로 (14) 를 설명한다.
모든 프로세싱 레인들을 서로 상호 연결하기보다는, 셔플러 회로 (14) 는 프로세싱 레인들의 서브세트 (프로세싱 레인들의 소스 서브세트라 칭함) 로부터 데이터를 선택적으로 출력하는 것을 허용한다. 예를 들어, 셔플러 회로 (14) 는 M 개의 프로세싱 레인들로부터 데이터를 수신하고, M 개의 프로세싱 레인들로부터의 데이터를 재정렬하고, 재정렬된 데이터를 출력한다. 일부 예들에서, 셔플러 회로 (14) 는 재정렬된 데이터를 모든 프로세싱 레인들에 출력할 수도 있지만; 프로세싱 레인들의 서브세트만이 셔플러 회로 (14) 로부터의 대응하는 레지스터 (프로세싱 레인들의 목적지 서브세트로 지칭됨) 로 재정렬된 데이터를 저장가능할 수도 있다. 셔플러 회로 (14) 가 프로세싱 레인들의 서브세트로부터의 데이터를 재정렬하기 때문에, 셔플러 회로 (14) 는 프로세싱 레인들로부터 서로에게로의 데이터의 전송을 완료하기 위해 다수의 클록 사이클들을 이용할 수도 있다.
예를 들어, 셔플 연산은 각 프로세싱 레인이 일정 수의 레인들만큼 떨어져 있는 프로세싱 레인으로 데이터를 출력하게 하는 것일 수도 있다. 이 경우에, 셔플러 회로 (14) 는 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신하고 재정렬하여, 재정렬된 데이터를 아마도 모든 프로세싱 레인들에 출력할 수도 있다. 그러나, 프로세싱 레인들의 각각의 소스 서브세트로부터 특정 수의 레인들만큼 떨어져 있는 프로세싱 레인들의 목적지 서브세트만이 재정렬된 데이터를 셔플러 회로 (14) 로부터 대응하는 레지스터로 저장가능할 수도 있다. 그 다음, 셔플러 회로 (14) 는 프로세싱 레인들의 다음 소스 서브세트로 이들 연산들을 반복할 수도 있다. 프로세싱 레인들의 서브세트들로부터 데이터를 수신하고, 데이터를 재정렬하고, 데이터를 출력하는 이들 반복들의 각각은 다수의 클럭 사이클을 통해 프로세싱된다.
각 프로세싱 레인은 범용 레지스터 파일 (GPRF) 의 하나 이상의 레지스터에 대응한다. 프로세싱 레인들은 대응하는 레지스터로부터 데이터를 수신하고 대응하는 레지스터로 데이터를 출력한다. 본 개시에서 설명된 예시적인 기술에서, 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 그들의 대응하는 레지스터에 저장할 수도 있고, 다른 프로세싱 레인들은 재정렬된 데이터를 폐기할 수도 있다. 예를 들어, 프로세싱 레인들의 목적지 서브세트의 대응하는 레지스터들은 재정렬된 데이터를 저장하는 것이 허용될 수도 있는 반면, 다른 프로세싱 레인들의 대응하는 레지스터들은 재정렬된 데이터를 저장하는 것이 허용되지 않을 수도 있다. 멀티플렉서 (MUX) 는 레지스터들의 각각에 커플링될 수도 있고 프로세싱 레인들의 목적지 서브세트에 대응하는 레지스터들에 대한 MUX들은 재정렬된 데이터가 대응하는 레지스터들에 저장될 수 있게 하고, 프로세싱 레인들의 목적지 서브세트에 대응하지 않는 레지스터들에 대한 MUX들은 재정렬된 데이터가 대응하는 레지스터에 저장되는 것을 허용하지 않는다 (예를 들어, 그래서 프로세싱 레인들은 데이터를 폐기한다). 대응하는 레지스터들이 데이터를 저장하거나 또는 데이터를 저장하지 않게 할 수 있는, 이를테면 프로세싱 레인들이 데이터를 저장하거나 또는 저장하지 않도록 (예를 들어, 데이터를 폐기하도록) 프로세싱 레인들을 구성하는, 다른 방법들이 있을 수도 있다.
프로세싱 레인들이 재정렬된 데이터를 저장한다는 것은 단지 프로세싱 레인들이 재정렬된 데이터를 저장하려고 시도하는 것이 아니라 재정렬된 데이터가 대응하는 레지스터들에 실제로 저장된다는 것을 의미한다. 프로세싱 레인들이 재정렬된 데이터를 폐기한다는 것은 재정렬된 데이터가 대응하는 레지스터들에 저장되지 않았음을 의미한다. 일부 예에서, 레지스터들은 데이터를 저장하는 것이 허용되거나 데이터를 저장하는 것이 허용되지 않을 수도 있다. 일부 예에서, 프로세싱 레인은 데이터를 저장하도록 구성되거나 데이터를 저장하도록 구성되지 않을 수도 있다. 일부 예에서는, 그 양자의 조합이 가능하다. 프로세싱 레인들이 재정렬된 데이터를 저장한다는 것은 재정렬된 데이터를 저장하는 이들 기술들의 임의의 가능성을 지칭한다. 프로세싱 레인들이 재정렬된 데이터를 폐기한다는 것은 재정렬된 데이터를 저장하지 않는 이들 기술들의 임의의 가능성을 지칭한다.
이 개시에서, 소스 프로세싱 레인들 및 목적지 프로세싱 레인들은 모두 GPU (12) 의 프로세싱 레인들이다. 예를 들어, 각각의 프로세싱 레인이 이웃 프로세싱 레인에 데이터를 출력하는 경우, 프로세싱 레인 5는 프로세싱 레인 6을 위한 소스 프로세싱 레인이며, 프로세싱 레인 6 은 프로세싱 레인 5를 위한 목적지 프로세싱 레인이다. 또한, 프로세싱 레인 5는 프로세싱 레인 4를 위한 목적지 프로세싱 레인이고, 프로세싱 레인 4는 프로세싱 레인 5를 위한 소스 프로세싱 레인이다. 따라서, 셔플 연산을 위해, 각각의 프로세싱 레인은 하나의 프로세싱 레인을 위한 소스 프로세싱 레인일 수도 있고 다른 프로세싱 레인을 위한 목적지 프로세싱 레인일 수도 있다.
GPU (12) 의 프로세싱 레인들이 서로에 데이터를 출력할 때, CPU (16) 는 GPU (12) 에 "셔플 명령" 을 발행할 수도 있다. GPU (12) 의 많은 예들에서, GPU (12) 는 자기-반응적 (self-reactive) 이다. 이것은 CPU (16) 와 GPU (12) 가 명령별로 (instruction-by-instruction) 협력하지 않는다는 것을 의미한다. 오히려, CPU (16) 는 전체 프로그램을 GPU (12) 로 전송하여 실행한다. GPU (12) 는 그 자체로, 그 프로그램의 명령들의 그룹을 페치 (fetch)/디코드 (decode)/실행한다. CPU (16) 및 GPU (12) 는 시스템 메모리 (30) 를 통해 입력/결과 데이터를 교환한다. 본 개시에서, CPU (16) 가 GPU (12) 에 셔플 명령을 발행한다는 것은 CPU (16) 가 GPU (12) 에 실행하도록 명령한 프로그램에서 셔플 명령을 포함한다는 것을 의미한다. 그러나, CPU (16) 및 GPU (12) 가 명령별 기반으로 협력하는 예에서, CPU (16) 는 명령별 기반으로 셔플 명령을 GPU (12) 에 출력할 수도 있다.
셔플 명령은 셔플 모드 및 오프셋을 정의한다. 셔플 모드는 프로세싱 레인들이 어느 프로세싱 레인들에 출력하는 (예를 들어, 데이터를 좌측 또는 우측에 있는 프로세싱 레인에 또는 모든 프로세싱 레인들에 출력하는) 방향을 나타내고, 오프셋은 데이터를 수신하는 프로세싱 레인이 데이터를 출력하는 프로세싱 레인으로부터 얼마나 멀리 떨어져 있는지를 결정하는데 사용된다. 셔플 모드의 일례인, 브로드캐스트 모드의 경우, 소스 레인의 고유 인덱스가 각 레인에 대한 오프셋을 결정하는데 사용된다.
일부 예에서, 오프셋은 그의 소스 레인이 얼마나 멀리 떨어져 있는지를 나타낸다. 이것은 때때로 모든 레인들이 활성화되지는 않았거나 범위 내에 있지는 않고 (예 : 오프셋이 소스 레인이 모든 이용 가능한 레인들의 범위 밖에 있음을 나타냄), 유효한 소스 레인이 없는 일부 레인들은 오프셋이 소스 레인으로부터 기반으로 하지 않으면 미싱될 수도 있기 때문이다. 또한, 비활성 또는 경계밖 레인으로 데이터를 전송하는 것은 아무런 쓸모가 없을 수도 있다. 그 대신, 유효한 각 목적지 레인은 어느 것이 그의 소스 레인인지 나타내어 데이터를 수신하는데 유효한 목적지 레인들로만 데이터가 전송된다. 그러나, 소스 레인이 유효하지 않은 (예 : 비활성 또는 경계 밖인) 경우, 디폴트로 목적지 레인은 자신을 소스 레인으로 사용할 수도 있다 (예 : 목적지 레인이 그 자신의 데이터를 복사하는 자기 복사 (self-copy) 를 수행). 본 개시에서, 오프셋은 소스 레인 또는 목적지 레인 관점으로부터 고려될 수도 있으며, 일부 경우에, 목적지 레인은 오프셋에 기초하여 그의 소스 레인을 정의할 수도 있고, 일부 경우에, 소스 레인은 오프셋에 기초하여 목적지 레인을 정의할 수도 있는 것으로 이해된다.
GPU (12) 의 SIMD 구조 때문에, 셔플 명령은 각각의 프로세싱 레인에 적용될 수도 있다. 다시, 각각의 프로세싱 레인은 동일한 명령을 그러나 상이한 데이터로 실행할 수도 있으므로, 각각의 프로세싱 레인은 셔플 명령을 실행한다 (예를 들어, 각각의 프로세싱 레인은 하나의 다른 프로세싱 레인으로 데이터를 출력하는 것이다). 오프셋은 셔플 명령에 의해 정의되므로, 오프셋은 각각의 프로세싱 레인에 대해 동일할 수도 있다 (즉, 오프셋은 모든 프로세싱 레인들에 대해 균일하다). 본 개시는 각각의 프로세싱 레인이 동일한 셔플 명령을 실행할 수도 있다고 설명하지만, 일부 예에서, 적어도 일부는, 그러나 반드시 모두일 필요는 없는, 프로세싱 레인들이 동일한 셔플 명령을 실행하는 것이 가능할 수도 있다.
오프셋이 프로세싱 레인으로 하여금 경계밖의 프로세싱 레인에 출력하도록 하는 것인 경우, 오프셋은 프로세싱 레인으로 하여금 경계 내의 프로세싱 레인에 출력을 랩 어라운드 (wrap around) 하게 할 것이다. 예를 들어, 셔플 모드 및 오프셋은 각각의 프로세싱 레인이 바로 좌측에 있는 프로세싱 레인에 출력하도록 정의할 수도 있다 (예를 들어, 셔플 모드는 셔플 업이고 오프셋은 1과 같다). 이 경우, 가장 좌측의 프로세싱 레인은 그의 데이터를 가장 우측의 프로세싱 레인에 출력 (예를 들어, 랩 어라운드) 할 것이다.
출력의 랩 어라운드는 로테이트-업/로테이트-다운 모드로 불리는 셔플 모드에 대해 발생할 수도 있다. 그러나, 정상적인 업/다운 모드의 경우, 소스 프로세싱 레인들은 자기 복제를 수행할 수도 있다 (예를 들어, 소스 프로세싱 레인 및 목적지 프로세싱 레인이 동일하다). 일부 예에서, 각각의 목적지 레인은 MUX-2 에 커플링된다. 랩 어라운드가 없는 정상 업/다운 모드이면, 목적지 레인은 소스 레인이 유효한 경우 셔플러 회로 (14) 로부터 데이터를 수신하도록 MUX 를 구성하고, 랩 어라운드가 없기 때문에 소스 레인이 유효하지 않은 경우 자신으로부터 데이터를 수신하도록 MUX를 구성한다.
본 개시에서, 셔플러 회로 (14) 가 재정렬된 데이터를 프로세싱 레인들에 출력한다는 것은 셔플러 회로 (14) 가 각각의 재정렬된 데이터를 각각의 프로세싱 레인들에 출력한다는 것을 의미하는 것으로 이해해야 한다. 가령, 셔플 명령 및 오프셋은 각각의 프로세싱 레인이 좌측에 있는 프로세싱 레인 20 레인들에 출력하도록 정의할 수도 있다 (예를 들어, 셔플 모드는 셔플 업이고 오프셋은 20과 같다). 이 예에서, 셔플러 회로 (14) 는 8 개의 입력 및 8 개의 출력을 포함한다고 가정한다. 셔플러 회로 (14) 는 레인 0-7로부터의 데이터를 수신할 수도 있으며, 여기서 셔플러 회로 (14) 의 제 1 입력은 프로세싱 레인 0으로부터 데이터를 수신하고, 셔플러 회로 (14) 의 제 2 입력은 프로세싱 레인 1로부터 데이터를 수신하는 등이다. 후술하는 이유로, 셔플러 회로 (14) 는, 셔플러 회로 (14) 의 제 1 출력이 프로세싱 레인 4 으로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 2 출력이 프로세싱 레인 5 로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 3 출력이 프로세싱 레인 6 으로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 4 출력이 프로세싱 레인 7 로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 5 출력이 프로세싱 레인 0 으로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 6 출력이 프로세싱 레인 1로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 7 출력이 프로세싱 레인 2 로부터 수신된 데이터를 출력하고, 셔플러 회로 (14) 의 제 8 출력이 프로세싱 레인 3 으로부터 수신된 데이터를 출력하도록 수신된 데이터를 재정렬할 수도 있다.
다른 측면에서 보았을 때, 셔플러 회로 (14) 의 제 1 내지 제 8 입력은 프로세싱 레인들 0-7 로부터 데이터를 각각 수신한다. 다음으로, 셔플러 회로 (14) 는, 후술하는 이유로, 셔플러 회로 (14) 의 대응하는 제 1 내지 제 8 출력이 프로세싱 레인들 4, 5, 6, 7, 0, 1, 2, 및 3 으로부터 수신된 데이터를 각각 출력하도록, 데이터를 재정렬한다. 본 개시에서, 셔플러 회로 (14) 가 프로세싱 레인들로부터 데이터를 수신하거나 또는 재정렬된 데이터를 프로세싱 레인들에 출력하는 것으로 설명될 때, 본 개시는 셔플러 회로 (14) 가 각각의 프로세싱 레인들로부터 데이터를 수신하고 각각의 데이터를 각각의 프로세싱 레인들에 출력하는 것을 지칭한다.
또한, 본 개시는 프로세싱 레인들로부터의 데이터가 수신되거나 출력되는 특정 시간 순서가 있음을 의미하는 것으로 해석되어서는 안된다. 예를 들어, 셔플러 회로 (14) 의 제 1 내지 제 8 입력은 제 1 입력이 첫번째로 데이터를 수신하고, 제 2 입력이 두번째로 데이터를 수신하는 것 등을 의미하는 것으로 해석되어서는 안된다. 이러한 순차적인 데이터 수신이 가능하지만, 예시적인 기술들은 그렇게 한정되지 않으며, 셔플러 회로 (14) 의 제 1 내지 제 8 입력은 병렬로 (예를 들어, 동시에) 또는 일부 조합으로 데이터를 수신할 수도 있다. 유사하게, 셔플러 회로 (14) 의 제 1 내지 제 8 출력은 제 1 출력이 첫번째로 데이터를 출력하고, 제 2 출력이 두번째로 데이터를 출력하는 것 등을 의미하는 것으로 해석되어서는 안된다. 이러한 순차적인 데이터 송신이 가능하지만, 예시적인 기술들은 그렇게 한정되지 않으며, 셔플러 회로 (14) 의 제 1 내지 제 8 출력은 병렬로 (예를 들어, 동시에) 또는 일부 조합으로 데이터를 출력할 수도 있다. 또한, 셔플러 회로 (14) 는 8 개보다 많거나 적은 입력 및 출력을 포함할 수도 있다.
이 개시에서 설명된 예시적인 기술에서, 프로세싱 레인들은 각각의 뱅크가 하나 이상의 프로세싱 레인들을 포함하는 복수의 뱅크들로서 형성될 수도 있다. 예를 들어, 64개의 프로세싱 레인들이 있는 경우, 8 개의 뱅크가 있을 수도 있으며, 각각의 뱅크는 8 개의 프로세싱 레인들을 포함한다. 프로세싱 레인들의 소스 서브세트는 하나의 뱅크의 프로세싱 레인들일 수도 있다. 이들 예들에 대해, 셔플러 회로 (14) 가 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신한다는 것은 셔플러 회로 (14) 가 복수의 뱅크들 중 하나의 뱅크로부터 데이터를 수신하는 것과 실질적으로 동일한 것으로 고려될 수도 있다.
일부 예에서, 셔플러 회로 (14) 는 일시에 하나의 뱅크로부터 데이터를 수신 가능하기만 할 수도 있다. 프로세싱 레인들과 셔플러 회로 (14) 의 입력들 사이의 상호 연결은 셔플러 회로 (14) 의 제 1 입력이 각 뱅크의 각각의 제 1 프로세싱 레인들로부터의 입력만을 수신할 수도 있고, 셔플러 회로 (14) 의 제 2 입력이 각 뱅크의 각각의 제 2 프로세싱 레인들로부터의 입력만을 수신할 수도 있는 등이 되도록 하는 것일 수도 있다. 셔플러 회로 (14) 가 제 1 뱅크로부터 데이터를 수신하면 (예를 들어, 셔플러 회로 (14) 의 각각의 입력이 제 1 뱅크의 각각의 프로세싱 레인들로부터 데이터를 수신함), 셔플 연산을 수행하기 위한 또 다른 프로세싱 반복으로, 셔플러 회로 (14) 는 제 2 뱅크로부터 데이터를 수신한다 (예를 들어, 셔플러 회로 (14) 의 각각의 입력은 제 2 뱅크의 각각의 프로세싱 레인들로부터 데이터를 수신한다). 셔플러 회로 (14) 로 하여금 동일한 반복 동안 상이한 뱅크들에서 프로세싱 레인들로부터 데이터를 수신할 수 있게 하는 상호 연결이 없을 수도 있다.
데이터를 재정렬한 후, 셔플러 회로 (14) 는 재정렬된 데이터를 프로세싱 레인들에 출력할 수도 있고, 일부 예에서 재정렬된 데이터를 각 뱅크에 출력할 수도 있다. 각각의 뱅크와 셔플러 회로 (14) 의 출력 사이에 상호 연결이 있을 수도 있다 (예를 들어, 각각의 뱅크의 각각의 프로세싱 레인은 셔플러 회로 (14) 의 하나의, 그리고 가능하게는 단 하나의 출력으로부터 데이터를 수신할 수 있다). 예를 들어, 각 개별 뱅크의 제 1 프로세싱 레인들은 셔플러 회로 (14) 의 제 1 출력으로부터 데이터를 수신하도록 구성될 수도 있고, 각 개별 뱅크의 제 2 프로세싱 레인들은 셔플러 회로 (14) 의 제 2 출력으로부터 데이터를 수신하도록 구성될 수도 있는 등이다.
셔플러 회로 (14) 가 데이터를 출력할 때, 데이터는 모든 프로세싱 레인들로 브로드캐스트된다. 예를 들어, 각각의 뱅크에서의 제 1 프로세싱 레인들 각각은 셔플러 회로 (14) 의 제 1 출력을 수신하고, 각각의 뱅크에서의 제 2 프로세싱 레인들 각각은 셔플러 회로 (14) 의 제 2 출력을 수신하는 등이다.
셔플러 회로 (14) 의 출력이 각 뱅크에 브로드캐스트되기 때문에, 셔플러 회로 (14) 는 수신된 데이터를 재정렬한다. 예를 들어, 각각의 프로세싱 레인이 10 개 레인들만큼 떨어져 있는 프로세싱 레인으로 데이터를 출력한다고 가정한다. 또한, 쉽게 하기 위해, 셔플러 회로 (14) 가 8개의 입력 및 8 개의 출력을 포함하고, 각 뱅크가 8개의 프로세싱 레인들을 포함한다고 가정한다. 이 예에서, 프로세싱 레인들의 소스 서브세트는 제 1 뱅크의 그러한 것들 (예를 들어, 프로세싱 레인들 7-0) 를 포함한다. 이 예에서는 제 1 입력이 프로세싱 레인 0으로부터 데이터를 수신한다고 가정한다. 이 경우에, 프로세싱 레인 0 으로부터의 데이터는 프로세싱 레인 10 에 출력될 것이다.
그러나, 셔플러 회로 (14) 의 제 1 출력은 프로세싱 레인 10 으로 연결되지 않고 연결가능하지 않을 수도 있다. 오히려, 셔플러 회로 (14) 의 제 1 출력은 각각의 뱅크의 각각의 제 1 프로세싱 레인들에 연결된다. 가령, 프로세싱 레인 10 은 프로세싱 레인 8-15 을 포함하는 제 2 뱅크에 있을 수도 있다. 이 경우, 셔플러 회로 (14) 의 제 1 출력은 프로세싱 레인 8 에 커플링된다. 따라서, 셔플러 회로 (14) 가 입력 데이터를 재정렬하지 않았으면, 셔플러 회로 (14) 의 제 1 출력은 프로세싱 레인 10 이 아니라 프로세싱 레인 8 에 출력한다.
따라서, 셔플러 회로 (14) 는 출력 데이터가 브로드캐스트될 때, 올바른 프로세싱 레인이 데이터를 수신하도록 입력 데이터를 재정렬할 수도 있다. 이러한 맥락에서, 재정렬 (reorder) 이란, 셔플러 회로 (14) 가 입력 데이터를 시프트하여, 셔플러 회로 (14) 의 각각이 출력들이 출력하는 데이터가 셔플러 회로 (14) 의 대응하는 입력 상의 데이터와는 상이하도록 하는 것을 의미한다. 예를 들어, 셔플러 회로 (14) 의 제 1 출력은 셔플러 회로 (14) 의 제 1 입력 상의 데이터를 출력하지 않으며, 셔플러 회로 (14) 의 제 2 출력은 셔플러 회로 (14) 의 제 2 입력 상의 데이터를 출력하지 않는 것 등이다. 그 대신, 셔플러 회로 (14) 는 브로드캐스트되는 각각의 출력이 올바른 목적지 프로세싱 레인들에 의해 수신되도록 데이터를 재정렬한다. 목적지 프로세싱 레인들은 데이터가 출력되는 프로세싱 레인들이다 (예를 들어, 프로세싱 레인 10 이 목적지 프로세싱 레인이고 프로세싱 레인 0 이 소스 프로세싱 레인인 경우, 프로세싱 레인 0 의 데이터를 프로세싱 레인 10 에 출력한다).
셔플러 회로 (14)는 모듈로 함수 (modulo function) 에 기초하여 입력 데이터를 재정렬할 수도 있다. 예를 들어, 셔플러 회로 (14) 내의 프로세싱 회로 또는 GPU (12) 의 제어기 회로 또는 기타 회로는 오프셋을 셔플러 회로 (14) 의 입력/출력의 수로 나누고 그 나누기의 나머지 (remainder) 를 결정할 수도 있다. 셔플러 회로 (14) 는 그 나머지에 기초하여 랩 어라운드로 각 입력을 좌측 또는 우측으로 시프트할 수도 있다. 셔플러 회로 (14) 의 출력은 이러한 시프트된 랩어라운드 데이터 (예를 들면, 재정렬된 데이터) 를 출력할 수도 있다.
GPU (12) 에서 모든 프로세싱 레인들 사이에 상호 연결이 존재하지 않을 수도 있지만 (예를 들어, 모든 레인 대 모든 레인 크로스 바 없음), 셔플러 회로 (14) 의 각 입력은 셔플러 회로 (14) 의 출력들 중 어느 것에 선택적으로 커플링될 수도 있다. 예를 들어, 셔플러 회로 (14) 는 임의의 입력이 임의의 출력에 연결될 수 있게 하는 복수의 스위치들을 포함할 수도 있다. 셔플러 회로 (14) 내의 프로세싱 회로 또는 다른 회로 (예컨대, GPU (12) 의 제어기 회로) 로부터의 제어 신호는 데이터를 재정렬하기 위해 셔플러 회로 (14) 의 의도된 입력 및 출력을 커플링하도록 스위치들을 선택적으로 폐쇄 및 개방 토글할 수도 있다.
나머지가 재정렬하기 위해 입력 상의 데이터를 얼마나 많이 시프트해야 하는지를 식별하는 방법의 일례로서, 상기와 같이, 각 프로세싱 레인이 10 개 레인들만큼 떨어져 있는 프로세싱 레인에 출력되는 것 (예를 들어, 오프셋은 10과 같음) 으로 가정한다. 셔플러 회로 (14) 의 입력/출력의 수는 8이고, 10/8 은 나머지가 2 인 1과 같다. 이 예에서, 셔플러 회로 (14) 는 각각의 입력이 랩 어라운드로 2만큼 그의 좌측으로 시프트되도록 그 내부 스위치들을 토글할 수도 있다. 예를 들어, 셔플러 회로 (14) 에의 입력이 뱅크 0의 프로세싱 레인들 0-7 인 경우, 셔플러 회로 (14) 의 제 1 내지 제 8 입력은 각각 프로세싱 레인들 0-7 로부터의 데이터이다.
셔플러 회로 (14) 는, 셔플러 회로 (14) 의 제 3 출력은 셔플러 회로 (14) 의 제 1 입력 상의 데이터를 출력하고, 셔플러 회로 (14) 의 제 4 출력은 셔플러 회로 (14) 의 제 2 입력 상의 데이터를 출력하는 등이 되도록 나머지 2에 기초하여 입력 데이터를 시프트한다. 랩어라운드에 기인하여, 셔플러 회로 (14) 의 제 1 출력은 셔플러 회로 (14) 의 제 7 입력 상의 데이터를 출력하며, 셔플러 회로 (14) 의 제 2 출력은 셔플러 회로 (14) 의 제 8 입력 상의 데이터를 출력한다.
이 예에서, 입력 데이터의 순서 (예를 들어, 제 1 내지 제 8 입력 상의 데이터) 는 각각 프로세싱 레인들 0-7 로부터의 데이터이다. 재정렬 후에, 출력 데이터의 순서 (예를 들어, 제 1 내지 제 8 출력 상의 데이터) 는 각각 프로세싱 레인들 6, 7, 0, 1, 2, 3, 4, 및 5 로부터의 데이터이다.
상술한 바와 같이, 프로세싱 레인 10 은 오프셋이 10 이므로 프로세싱 레인 0 의 데이터를 수신할 것이다. 프로세싱 레인 10 은 프로세싱 레인들 8-15 를 포함하는 뱅크 1에 있다. 셔플러 회로 (14) 의 출력이 각각의 뱅크로 브로드캐스트되고 각각의 뱅크에 있는 각각의 프로세싱 레인은 셔플러 회로 (14) 의 각각의 출력에 커플링되기 때문에, 뱅크 1 의 제 1 프로세싱 레인은 셔플러 회로 (14) 의 제 1 출력으로부터 데이터를 수신하고, 뱅크 1 의 제 2 프로세싱 레인은 셔플러 회로 (14) 의 제 2 출력으로부터 데이터를 수신하는 등이다. 이 예에서, 셔플러 회로 (14) 의 제 1 출력은 뱅크 1의 제 1 프로세싱 레인 (예컨대, 프로세싱 레인 8) 이 수신하는 프로세싱 레인 6 의 데이터를 출력한다. 셔플러 회로 (14) 의 제 2 출력은 뱅크 1의 제 2 프로세싱 레인 (예컨대, 프로세싱 레인 9) 이 수신하는 프로세싱 레인 7 의 데이터를 출력한다.
다음으로, 셔플러 회로 (14) 의 제 3 출력은 뱅크 1의 제 3 프로세싱 레인 (예컨대, 프로세싱 레인 10) 이 수신하는 프로세싱 레인 0 의 데이터를 출력한다. 알 수 있는 바와 같이, 이 예에서, 프로세싱 레인 10 은 데이터의 재정렬로 인해 프로세싱 레인 0 으로부터 데이터를 수신했다. 이 패턴은 뱅크 1의 나머지 레인들에 대해 유지된다 (예를 들어, 프로세싱 레인 11 은 프로세싱 레인 1 으로부터 데이터를 수신하고, 프로세싱 레인 12 는 프로세싱 레인 2 으로부터 데이터를 수신하고, 그리고 계속해서 프로세싱 레인 15 은 프로세싱 레인 5 으로부터 데이터를 수신한다). 지금까지, 프로세싱 레인들 10-15 는 프로세싱 레인들 0-5 으로부터 데이터를 수신했다.
그러나, 프로세싱 레인들 16 및 17 이 또한 프로세싱 레인들 6 및 7 으로부터 데이터를 각각 수신할 것이다. 프로세싱 레인들 16 및 17 은 프로세싱 레인들 16-23을 포함하는 뱅크 2에 속한다. 프로세싱 레인 16은 뱅크 2에 있는 제 1 프로세싱 레인이고 프로세싱 레인 17은 뱅크 2에 있는 제 2 프로세싱 레인이다. 전술한 바와 같이, 셔플러 회로 (14) 의 출력은 각 뱅크에 브로드캐스트된다. 따라서, 프로세싱 레인 16 은 셔플러 회로 (14) 의 제 1 출력을 수신하고 프로세싱 레인 17은 셔플러 회로 (14) 의 제 2 출력을 수신한다. 이 예에서, 셔플러 회로 (14) 의 제 1 출력은 프로세싱 레인 6 의 데이터이고, 셔플러 회로 (14) 의 제 2 출력은 프로세싱 레인 7 의 데이터이다. 입력 상의 데이터를 시프트하고 랩 어라운드 (예를 들면, 데이터를 재정렬) 함으로써, 프로세싱 레인 6 의 데이터는 10개 프로세싱 레인들만큼 떨어져 있는 프로세싱 레인 (예를 들어, 프로세싱 레인 16) 에 출력되고, 프로세싱 레인 7 이 프로세싱 레인 17 에 출력되는 것에 대해서도 동일하게 유지된다.
위의 예에서, 프로세싱 레인들 0-7 로부터의 데이터는 프로세싱 레인들 10-17 에 출력되었을 것이다. 그러나, 재정렬 후에, 프로세싱 레인들 10-17 이 프로세싱 레인들 0-7로부터 데이터를 각각 올바르게 수신한 동안, 다양한 프로세싱 레인들이 10개 레인들만큼 떨어져 있지 않은 프로세싱 레인들로부터 데이터를 수신했다. 예를 들어, 위의 예에서, 프로세싱 레인 8 은 프로세싱 레인 6으로부터 데이터를 수신했고, 프로세싱 레인 6은 10개 프로세싱 레인들만큼 떨어져 있지 않다.
이 문제를 해결하기 위해, 프로세싱 레인들의 목적지 서브세트 (예를 들어, 데이터를 수신하는 것들) 만이 수신된 재정렬된 데이터를 저장할 수도 있다. 예를 들어, GPU (12) 의 제어기 회로는 프로세싱 레인들 0-7 이 입력 레인들일 때 프로세싱 레인들 10-17의 GPR 들이 데이터를 저장하는 것을 허용할 수도 있다 (에를 들어, GPR 이 데이터를 저장하는 것을 허용하도록 프로세싱 레인들 10-17에 대응하는 GPR들에 커플링된 MUX 를 구성한다). 나머지 프로세싱 레인들의 GPR들은 데이터를 저장하는 것이 허용되지 않을 수도 있고 (예를 들어, GPR이 데이터를 저장하는 것을 허용하지 않도록 나머지 프로세싱 레인들에 대응하는 GPR에 커플링된 MUX 를 구성하고), 이에 의해 데이터를 폐기할 수도 있다. 따라서 데이터가 브로드캐스트된 경우에도, 데이터는 의도하지 않은 프로세싱 레인들 중 어느 것의 GPR에 쓰기되지 않는다.
그 후, 셔플러 회로 (14) 는 다음의 연속적인 뱅크 (예를 들어, 프로세싱 레인들 8-15 을 포함하는 뱅크 0) 의 입력을 수신할 수도 있다. 셔플러 회로 (14) 는 그 나머지에 기초하여 데이터를 유사하게 재정렬하고 (예를 들어, 2 를 시프트하고 랩 어라운드하여 출력 순서가 14, 15, 8, 9, 10, 11, 12, 및 13 이 되도록 한다), 그 출력을 프로세싱 레인들에 (예를 들어, 각 뱅크에) 브로드캐스트한다. 제어기 회로는 프로세싱 레인들 18-25 의 GPR이 데이터를 저장하는 것을 허용하고 다른 프로세싱 레인들의 GPR 이 데이터를 저장하는 것을 허용하지 않을 수도 있다. 셔플러 회로 (14) 및 제어기 회로는 모든 소스 프로세싱 레인들이 그들의 출력을 각각의 목적지 프로세싱 레인들에 쓰기할 때까지 이러한 연산들을 반복할 수도 있다.
위의 예에서, 제어기 회로는, 대응하는 GPR 이 프로세싱 레인들의 목적지 서브세트가 데이터를 저장하거나 데이터를 폐기하는 하나의 방법으로서 데이터를 저장할 수 있도록 허용하거나 허용하지 않는 것으로 설명된다. 일부 예들에서, 제어기 회로는 프로세싱 레인들이 데이터를 저장하거나 데이터를 폐기하는 방법으로서 프로세싱 레인들이 데이터를 저장하거나 데이터를 저장하지 않는 것이 허용될 수도 있다. 이들 기술들의 조합이 또한 가능하다.
따라서, 도 1은 디바이스가 GPU (12) 를 포함하는 데이터 프로세싱을 위한 디바이스의 일례를 제공한다. GPU (12) 는 복수의 프로세싱 레인들을 포함하고, 여기서 각각의 프로세싱 레인들은 데이터를 프로세싱하기 위한 회로 (예를 들어, ALU) 를 포함하고 그 프로세싱 레인들은 SIMD 구조에서 구성된다. 또한, GPU (12) 는 프로세싱 레인들의 소스 서브세트로부터 (예를 들어, 뱅크의 프로세싱 레인들로부터) 데이터를 수신하는 셔플러 회로 (14) 를 포함한다. 셔플러 회로 (14) 는 프로세싱 레인들의 각각에게 프로세싱 레인들의 또 다른 하나에 데이터를 출력하도록 명령하는 (예를 들어, CPU (16) 로부터의) 명령에 기초하여 프로세싱 레인들의 소스 서브세트로부터 수신된 데이터를 재정렬한다. 셔플러 회로 (14) 는 재정렬된 데이터를 프로세싱 레인들에 출력한다 (예를 들어, 출력은 뱅크로 브로드캐스트된다). 일부 예에서, 프로세싱 레인들의 목적지 서브세트는 수신된 재정렬된 데이터를 대응하는 레지스터에 저장하고, 프로세싱 레인들의 목적지 서브세트 외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기한다.
상기 예에서, 셔플러 회로 (14) 가 수신하는 데이터는 프로세싱 레인들의 소스 서브세트의 각 프로세싱 레인에 대한 전체 스칼라 또는 벡터 값일 수도 있다. 가령, 셔플러 회로 (14) 가 수신하고 있는 데이터는 전체 데이터의 서브 바이트 (sub-byte) 가 아니라, 오히려 전체 스칼라 또는 벡터 값일 수도 있다. 또한, 셔플러 회로 (14) 는 프로세싱 레인들의 소스 서브세트의 각 프로세싱 레인으로부터 수신된 전체 스칼라 또는 벡터 값을 재정렬하도록 구성될 수도 있고, 재정렬된 데이터의 전체 스칼라 또는 벡터 값을 프로세싱 레인들에 출력할 수도 있다.
또한, 위에는 셔플 연산에서, 하나의 프로세싱 레인이 그의 데이터를 또 다른 프로세싱 레인에 출력하는 것으로 기재되어 있다. 일부 예에서, 프로세싱 레인이 또 다른 프로세싱 레인에 출력한 데이터는 여전히 프로세싱 레인과 함께 유지된다. 각 프로세싱 레인은 그 자체 데이터를 유지하고 또 다른 프로세싱 레인으로부터 데이터를 수신한다. 일부 예에서, 프로세싱 레인 자체에 의해 생성된 데이터는 삭제될 수도 있고, 또 다른 프로세싱 레인으로부터 수신된 데이터만이 유지될 수도 있다.
도 2는 도 1의 GPU 의 일례를 더 상세하게 나타내는 블록도이다. 가령, 도 2는 GPU (12) 의 프로세싱 회로의 일례를 나타낸다. GPU (12) 는 제어기 회로 (38), 셔플러 회로 (14) 및 범용 레지스터 파일 (GPRF) (56) 을 포함한다. 또한 나타낸 바와 같이, GPU (12) 는 복수의 뱅크들 46A-46X 을 포함한다. 복수의 뱅크들 46A-46X 의 각각은 복수의 프로세싱 레인 (PL) 들을 포함한다. 예를 들어, 뱅크 46A 는 프로세싱 레인들 42A,A 내지 42M,A 을 포함하고, 뱅크 46X 는 프로세싱 레인들 42A,X 내지 42M,X 을 포함한다. 따라서, 도 2에서, 프로세싱 레인들 (예를 들어, 42A,A 내지 42M,A 또는 42A,X 내지 42M,X) 는 복수의 뱅크들 46A-46X 로 그룹화되고, 복수의 뱅크들 46A-46X 의 각각의 뱅크는 복수의 프로세싱 레인들 중 하나 이상의 프로세싱 레인들을 포함한다.
일례로서, 총 64개의 프로세싱 레인들이 있다고 가정한다. 이 예에서는, 8개의 뱅크가 있으며 각 뱅크는 8개의 프로세싱 레인들을 포함한다. 따라서, 뱅크들 46A-46X 은 8개의 뱅크들을 나타내고, PL 42A,42A 내지 42M,A 은 뱅크 46A 의 8 개의 프로세싱 레인들을 나타내고, PL 42A,X 내지 42M,X 는 뱅크 46X 의 8 개의 프로세싱 레인들을 나타낸다.
각각의 프로세싱 레인들 42A,A 내지 42M,X 은 각각 하나 이상의 ALU들 44A,A 내지 44M,X 을 포함한다. ALU들 44A,A 내지 44M,X 은 프로세싱 레인들 42A,A 내지 42M,X 각각의 프로세싱 레인에 할당된 프로세싱 태스크들을 수행하도록 구성될 수도 있다. 본 개시에서, ALU들 44A,A 내지 44M,X 는 GPU (12) 의 프로세싱 코어 (셰이더 코어라고도 함) 의 일부일 수도 있다. 예를 들어, GPU (12) 는 셰이더 프로그램 (예컨대, 버텍스 셰이더, 픽셀 셰이더, 기하학적 셰이더 또는 비 그래픽스 애플리케이션에 사용되는 컴퓨트 셰이더) 의 명령들을 실행하도록 구성될 수도 있다. 프로세싱 레인들 42A,A 내지 42M,X 의 각각은 쉐이더 프로그램의 명령을 병렬로 실행할 수도 있지만, 데이터는 상이할 수도 있다 (예를 들어, 셰이더 프로그램의 다수의 인스턴스 생성 (instantiation) 들이 있다). ALU들 44A,A 내지 44M,X 은 명령에 의해 정의된 연산들을 수행하는 하드웨어 회로일 수도 있다.
본 개시에 각각의 프로세싱 레인이 동일한 명령을 실행할 수도 있다고 기재되어 있지만, 일부 예에서, 적어도 일부는, 그러나 반드시 모두일 필요는 없는, 프로세싱 레인들이 그 셔플 명령을 실행하는 것이 가능할 수도 있다. 가령, 프로세싱 레인들 42A,A 내지 42M,X 의 서브세트는 동일한 명령을 병렬로 실행할 수도 있고, 다른 것들은 그렇지 않을 수도 있다. 그러한 예들에서, 프로세싱 레인들 42A,A 내지 42M,X 중 적어도 일부는 셔플 명령을 병렬로 실행하고 다른 것들은 그렇지 않은 것이 가능할 수도 있다.
GPRF (56) 는 국부적으로 생성된 데이터를 저장하기 위해 프로세싱 레인들 42A,A 내지 42M,X 에 대해 할당된 메모리이다. 예를 들어, GPRF (56) 는 프로세싱 레인들 42A,A 내지 42M,X 에 배정되는 복수의 범용 레지스터 (GPR) 들을 포함한다. ALU 44A,A 내지 44M,X 중 각각의 ALU 는 프로세싱을 위해 각각의 배정된 GPR 로부터 데이터 (예를 들어, 프로세싱을 위한 피연산자 데이터) 를 취출하고, 프로세싱되는 셰이더 프로그램의 명령에 기초하여 데이터에 대해 수학적 연산을 수행하고, 그 결과 데이터를 다시 각각의 배정된 GPR 에 출력한다.
일부 예들에서, 셔플러 회로 (14) 는 프로세싱 레인들 42A,A 내지 42M,X 의 GPR에 커플링되고, 일부 예에서는 선택적으로 커플링된다. 이러한 방식으로, 셔플러 회로 (14) 는 그 소스 프로세싱 레인의 GPR을 통해 소스 프로세싱 레인으로부터 데이터를 수신하고 그 목적지 프로세싱 레인의 GPR에 데이터를 출력함으로써 목적지 프로세싱 레인에 데이터를 출력한다. 따라서, 셔플 연산은 소스 프로세싱 레인들의 GPR로부터 데이터를 수신하고 목적지 프로세싱 레인들의 GPR로 데이터를 출력하는 셔플러 회로 (14) 로 수행될 수도 있다.
기본적인 예로서, 명령이 변수 A 및 B에 의해 표현된 값들을 가산하는 것이라면, 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인이 이 가산 명령을 수신한다. ALU들 44A,A 내지 44M,X 는 GPRF (56) 내의 각각의 GPR들로부터 변수 A에 대한 값을 취출하고 GPRF (56) 내의 각각의 GPR들로부터 변수 B에 대한 값을 취출한다. 이 예에서, 변수 A 및 B의 값은 프로세싱 레인들 42A,A 내지 42M,X 에 대해 상이할 수도 있지만, A 및 B를 가산하는 명령은 동일하다. 각각의 ALU들 44A,A 내지 44M,X 는 가산의 수학적 연산을 수행하여 변수 C에 의해 표현된 각각의 결과 데이터를 생성할 수도 있고 GPRF (56) 내의 각각의 GPR 들에 C의 값을 저장할 수도 있다. 그런 다음, 변수 C가 피연산자인 추가 연산이 필요한 경우, 각각의 ALU들 44A,A, 내지 44M,X 는 프로세싱을 위해 GPRF (56) 의 각각의 GPR로부터 데이터를 취출한다.
제어기 회로 (38) 는 GPU (12) 의 기능을 제어할 수도 있다. 제어기 회로 (38) 는 하드웨어 컴포넌트로서 설명되어 있지만, 또한 소프트웨어가 실행되는 컴포넌트일 수도 있다. 따라서, 제어기 회로 (38) 는 고정 기능 및 프로그램 가능 회로 양자 모두를 지칭한다.
이 개시에서 설명된 예들에서, 제어기 회로 (38) 는 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인이 처리할 명령을 출력하도록 구성될 수도 있다. 예를 들어, CPU (16) 는 특정 셰이더 프로그램을 실행하기 위한 커맨드를 GPU (12) 에 출력할 수도 있다. 이에 응답하여, 제어기 회로 (38) 는 시스템 메모리 (30) 로부터 셰이더 프로그램의 명령들을 취출하고 셰이더 프로그램의 명령들을 실행하도록 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인을 스케줄링하도록 구성될 수도 있다.
본 개시에서 설명된 예시적인 기술에서, 제어기 회로 (38) 는 프로세싱 레인들 42A,A 내지 42M,X 중 각각의 프로세싱 레인이 그의 데이터를 프로세싱 레인들 42A,A 내지 42M,X 중 다른 프로세싱 레인에 출력하도록 명령하는 명령을 수신할 수도 있다 (예를 들어, 제어기 회로 (38) 는 셔플 명령을 수신한다). 셔플 명령은 셔플 모드 (예를 들어, 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인이 그의 데이터를 출력하는 방향) 및 오프셋 (예를 들어, 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인이 그의 데이터를 출력하는 떨어져 있는 프로세싱 레인들의 수) 를 정의할 수도 있다. 예를 들어, 명령은 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인이 그의 데이터를 좌측에 위치한 프로세싱 레인에 출력하는 셔플 로테이트-업 (셔플 레프트라고도 불림) 으로서 셔플 모드를 정의할 수도 있다. 오프셋은 10 일 수도 있으며, 이는 프로세싱 레인들 42A,A 내지 42M,X 의 각각의 프로세싱 레인이 10 레인들만큼 그 좌측에 있는 레인으로 데이터를 출력하는 것을 의미한다. 10 레인들만큼 좌측에 있는 레인이 없으면, 오프셋은 랩 어라운드한다.
본 개시에서, 하나의 레인이 다른 레인의 좌측 또는 우측에 있다는 것은 GPU (12) 의 SIMD 아키텍처 내에서 레인들이 물리적으로 좌측 또는 우측에 위치한다는 것을 의미할 수도 있다. 그러나, 일부 예들에서, 하나의 레인이 다른 레인의 좌측 또는 우측에 있다는 것은 논리적인 표시 (logical designation) 일 수도 있다. 가령, 현재 레인보다 더 작은 어드레스를 갖는 레인들은 우측에 있는 것으로 고려될 수도 있고, 현재 레인보다 더 큰 어드레스를 갖는 레인들은 좌측에 있는 것으로 고려될 수도 있다. 그러므로, 좌측과 우측이라는 용어는 레인들의 물리적 위치를 제한하는 것으로 간주되는 것이 아니라, 일부 예에서, 좌측과 우측은 GPU (12) 의 SIMD 아키텍처 내의 레인들의 문언적 위치를 나타낼 수도 있다.
전술한 바와 같이, 셔플러 회로 (14) 는 프로세싱 레인들 42A,A 내지 42M,이 그들 각각의 셔플 연산을 수행할 수 있도록 데이터를 재정렬하도록 구성된다. 셔플 연산을 수행하기 위해, 셔플러 회로 (14) 는 프로세싱 레인들 42A,A 내지 42M,X 의 소스 서브세트로부터 데이터를 수신한다. 예를 들어, 셔플러 회로 (14) 는 하나의 뱅크의 프로세싱 레인들로부터 데이터를 수신할 수도 있고, 하나보다 많은 뱅크에 걸쳐있는 프로세싱 레인들로부터는 데이터를 수신하지 못할 수도 있다 (예를 들어, 뱅크 46A 의 프로세싱 레인들 42A,A 내지 42M,A 로부터 데이터를 수신한다).
셔플러 회로 (14) 로 하여금 하나의 뱅크로부터의 프로세싱 레인들로부터 데이터를 수신할 수 있도록 하기 위해, 셔플러 회로 (14) 는 멀티플렉서 (MUX) (48) 에 커플링될 수도 있고, MUX (48) 는 뱅크들 46A-46X 의 각각에 커플링될 수도 있다. 예를 들어, MUX (48) 는 뱅크 46A 의 프로세싱 레인들 42A,A 내지 42M,A 로부터 데이터를 수신하기 위한 제 1 입력 그룹, 그 다음 뱅크의 프로세싱 레인들로부터 데이터를 수신하기 위한 제 2 입력 그룹 등을 포함하며, 뱅크 46X 의 프로세싱 레인들 42A,X 내지 42M,X 로부터 데이터를 수신하기 위한 입력 그룹을 포함한다. 제어기 회로 (38) 는 MUX (48) 로 하여금 입력 그룹들 중 하나 (예를 들어, 뱅크들 46A-46X 중 하나) 를 선택하고 선택된 입력 그룹으로부터 데이터를 출력하도록 (예를 들어, 뱅크들 46A-46X 중 하나의 뱅크의 프로세싱 레인들로부터 데이터를 출력하도록) 명령하는 커맨드를 MUX (48) 에 출력할 수도 있다.
셔플러 회로 (14) 는, 뱅크들 46A-46X 중 하나의 뱅크의 프로세싱 레인들로부터의 데이터일 수도 있는 MUX (48) 의 출력을 수신하는 입력 인터페이스 (50) 를 포함한다. 입력 인터페이스 (50) 가 데이터를 수신하고 있는 프로세싱 레인들은 프로세싱 레인들의 소스 서브세트로 지칭된다. 입력 인터페이스 (50) 는 복수의 입력 포트들을 포함한다. 예를 들어, 뱅크들 46A-46X 중 각각의 뱅크가 8 개의 프로세싱 레인들을 포함하면, 입력 인터페이스 (50) 는 8 개의 입력 포트들을 포함하며, 각각의 포트는 뱅크들 46A-46X 중 선택된 하나의 뱅크의 프로세싱 레인들 중 하나로부터 데이터를 수신하도록 구성된다.
셔플 명령에서 셔플 모드 및 오프셋에 기초하여, 제어기 회로 (38) 는 수신된 데이터를 재정렬하기 위해 각각의 입력 포트들을 각각의 출력 포트들에 커플링하도록 셔플러 회로 (14) 내의 스위치들을 선택적으로 토글 (즉, 폐쇄 및 개방) 하기 위한 커맨드를 셔플러 회로 (14) 에 출력할 수도 있다. 나타낸 바와 같이, 셔플러 회로 (14) 는 복수의 출력 포트들을 포함하는 출력 인터페이스 (52) 를 포함한다. 출력 포트들 중 각각의 출력 포트는 입력 포트들 중 각각의 입력 포트에 대응한다 (예를 들어, 입력 인터페이스 (50) 의 제 1 입력 포트는 출력 인터페이스 (52) 의 제 1 출력 포트에 대응하는 등이다). 이 개시에서 설명된 예시적인 기술들에서, 제어기 회로 (38) 는 입력 포트로부터의 데이터가 대응하는 출력 포트에 출력되는 것이 아니라, 그 대신 출력 포트 중 다른 하나에 출력되도록 셔플러 회로 (14) 의 스위치들이 폐쇄되게 할 수도 있다. 선택적으로 입력 및 출력 포트들을 함께 커플링함으로써, 셔플러 회로 (14) 는 입력 인터페이스 (50) 상에서 수신된 데이터를 재정렬할 수도 있다.
출력 인터페이스 (52) 는 재정렬된 데이터를 디멀티플렉서 (DEMUX) (54) 에 출력한다. 상술한 바와 같이, 재정렬된 데이터는 뱅크들 46A-46X 의 각각으로 브로드캐스트된다. 나타낸 예에서, DEMUX (54) 는 출력 인터페이스 (52) 가 뱅크들 46A-46N 에 출력하는 데이터를 브로드캐스트할 수도 있다. 예를 들어, DEMUX (54) 는 뱅크 46A 의 프로세싱 레인들 42A,A 내지 42M,A 로 데이터를 출력하는 제 1 출력 그룹, 그 다음 뱅크의 프로세싱 레인들에 데이터를 출력하는 제 2 출력 그룹 등을 포함하며, 뱅크 46X 의 프로세싱 레인들 42A,X 내지 42M,X 에 데이터를 출력하는 출력 그룹을 포함한다. 일부 예에서, DEMUX (54) 의 출력 그룹들 중 각각의 그룹의 제 1 출력은 뱅크들 46A-46X 중 각각의 뱅크의 제 1 프로세싱 레인에 커플링되고, DEMUX (54) 의 출력 그룹들 중 각각의 그룹의 제 2 출력은 뱅크들 46A-46X 중 각각의 뱅크의 제 2 프로세싱 레인에 커플링되는 등이다. 이러한 방식으로, 뱅크들 46A-46X 중 각각의 뱅크는 셔플러 회로 (14) 의 출력을 수신한다.
그러나, 일부 경우에, 모든 프로세싱 레인들이 실제로 수신된 데이터를 프로세싱하는 것은 아니다. 따라서, 제어기 회로 (38) 는 프로세싱 레인들의 서브세트만이 셔플러 회로 (14) 로부터의 출력을 대응하는 GPR 에 저장하는 것을 허용할 수도 있다. 재정렬된 데이터를 대응하는 GPR에 저장하는 프로세싱 레인들은 프로세싱 레인들의 목적지 서브세트라고 지칭된다. 다른 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기할 수도 있다.
본 개시에서 설명된 예시적인 기술에서, 셔플러 회로 (14) 는 구분적으로 셔플을 수행한다. 예를 들어, 셔플러 회로 (14) 는 먼저, 오프셋에 기초하여 셔플러 회로 (14) 의 입력 상의 데이터를 재정렬함으로써 그리고 선택적으로 프로세싱 레인들의 목적지 서브세트가 데이터를 수신하는 것을 가능하게 함으로써 뱅크 46A 의 프로세싱 레인들 42A,A 내지 42M,A (예를 들어, 프로세싱 레인들의 소스 서브세트) 로부터 데이터를 올바른 프로세싱 레인들 (예를 들어, 프로세싱 레인들의 목적지 서브세트) 에 출력할 수도 있다. 전술한 바와 같이, 입력 상의 데이터를 재정렬하는 하나의 예시적인 방법은 오프셋을 셔플러 회로 (14)의 입력 또는 출력 포트의 수로 나눈 것의 나머지에 기초하여 입력 상의 데이터를 시프트 및 랩 어라운드하는 것이다. 다음으로, 셔플러 회로 (14) 는 이들 연산을 다음 뱅크 (예를 들어, 뱅크 46B) 에 반복하고 뱅크 46X 까지 그렇게 계속할 수도 있다.
따라서, 셔플러 회로 (14) 는 전체 셔플 연산을 수행하기 위해 다수의 클럭 사이클 (N 클럭 사이클) 을 이용할 수도 있다. N 은 프로세싱 레인들의 총 수를 셔플러 회로 (14) 의 입력 또는 출력 포트의 수로 나눈 것과 동일하다. W 는 프로세싱 레인들의 총 수와 동일하고 M 은 셔플러 회로 (14) 의 입력 또는 출력 포트의 수와 동일하다. 이 경우 N 은 W/M 과 같다.
일부 경우에, 셔플러 회로 (14) 를 설계할 때, 셔플러 회로 (14) 는 셔플러 연산을 수행함에 있어서 원하는 레이턴시에 기초하여 일정 수의 입력 및 출력 포트들을 포함하도록 설계될 수도 있다. 예를 들어, 다단 (multi-stage) 파이프라인 구현 셔플 (이를테면, 본 개시에서 설명된 예들) 에서, N 은 병목단의 레이턴시와 동일해야 한다. 셔플러 회로 (14) 는 4 개의 사이클을 사용하여 프로세싱 레인들로부터 모든 피연산자 (예를 들어, 데이터) 를 판독한 다음, N개 사이클을 이용하여 레인들 사이에 셔플을 수행한 다음, 8개 사이클을 사용하여 결과를 라이트-백 (write-back) 할 수도 있다. 이 예에서, 라이트-백이 병목이므로, N은 8이어야 한다. 셔플 연산을 수행하는데 얼마나 많은 사이클이 필요한지에 기초하여, 셔플러 회로 (14) 의 입력 및 출력 포트 수는 셔플 연산을 수행하는데 필요한 사이클의 수로 프로세싱 레인들의 총 수를 나눔으로써 계산될 수도 있다 (예를 들어, M 은 W/N 과 같다).
읽기를 위해 4개의 사이클들이 필요하고 쓰기를 위해 8개의 사이클들이 반드시 필요한 것은 아니라는 것이 이해되야 한다. 일반적으로, 읽기 및 쓰기에 필요한 사이클 수는 버스 폭에 의해 결정된다. 32 레인 * 32 비트 데이터를 포워드하기 위해, 넓은 버스 (예를 들어, 1024 비트) 는 1개의 사이클을 사용할 수도 있거나, 또는 좁은 버스 (예컨대, 256 비트) 는 4개의 사이클들을 사용할 수도 있다. 또한, 수신 측에서, 로직은 처리 폭 (handling width) 을 가질 수 있다. 처리 폭이 훨씬 더 좁은 것 (예 : 128 비트/사이클) 으로 가정한다. 이 예에서, 8개 사이클들은 모든 데이터를 GPR에 쓰기에 충분하다. 더 넓은 하드웨어는 항상 더 포괄적이다; 그래서 이들 수치는 성능/비용 트레이드 오프의 결과이다. 이 읽기-셔플-쓰기 파이프라인에서, 쓰기단이 8개 사이클들을 사용하면, 셔플러 회로 (14) 는 비용을 줄이기 위해 가능한한 좁아야하지만, 프로세싱이 8개 사이클들에서 완료할 수 없을 정도로 좁아서는 안된다.
본 개시에서, 좁은 (narrow) 이란 말은 병렬 프로세싱 레인들의 수를 나타내는 상대적인 용어이다. 예를 들어, 셔플러 회로 (14) 는 GPU (12) 에서의 프로세싱 레인들 수에 비해 좁은 하드웨어이다 (예를 들어, GPU (12) 내의 레인들의 수보다 적은 수의 레인들에 대해 데이터를 셔플한다). 좁은 하드웨어를 사용함으로써, 셔플러 회로 (14) 는 완료하는데 더 많은 사이클들을 사용하지만 더 적은 전력이 소요된다.
일례로서, 128개의 프로세싱 레인들이 있는 것으로 (예를 들어, W는 128과 같은 것으로) 가정한다. 이 예에서, 셔플러 회로 (14) 는 단지 16개의 입력 포트 및 16개의 출력 포트 (예를 들어, 셔플러 회로 (14) 는 16 레인 폭 크로스 바이다) 를, 셔플 연산이 8개 사이클들 (예를 들어, 128/16 은 8과 같다) 에서 완료될 수 있도록, 포함할 필요가 있을 수도 있다.
모든 레인 대 모든 레인 크로스 바가 사용되는 예에서도, 병목은 프로세싱 레인들에의 데이터의 쓰기일 수도 있다. 따라서, 병목의 클록 사이클들 내에서 셔플 연산을 수행하는 것이 가능하도록 셔플러 회로 (14) 를 설계함으로써, 예시적인 기술들은 모든 레인 대 모든 레인 크로스 바를 사용하는 예들에 비해 전체 시스템에 많은 레이턴시를 부가하지 않을 수도 있다. 가령, 모든 레인 대 모든 레인 크로스 바에서, 셔플 연산은 하나의 클럭 사이클을 필요로 할 수도 있고 라이트 백은 8개 클럭 사이클들을 필요로 할 수도 있다. 상기 예에서, 셔플러 회로 (14) 는 셔플 연산을 완료하기 위해 8 개의 클록 사이클들을 필요로 할 수도 있고 라이트 백을 완료하기 위해 8개의 클록 사이클을 필요로 할 수도 있다. 그러나, 셔플러 회로 (14) 는 라이트 백이 일어나는 동안 셔플 연산을 수행하기 때문에, 클록 사이클들의 총 수는 8개 클록 사이클들로 제한될 수도 있고, 이는 모든 레인 대 모든 레인 크로스 바 예에 필요한 클럭 사이클들의 총 수와 동일하다.
모든 레인 대 모든 레인 크로스 바가 사용되는 예와 비교할 때, 본 개시에서 설명된 예시적인 기술로는 레이턴시가 많이 증가하지 않을 수도 있다. 그러나, 예시의 기술들은 칩 면적의 감소를 제공할 수도 있다. 예를 들어, 64 레인 모든 레인 대 모든 레인 크로스 바와 비교하면, 예시의 기술들은 (64/16)2 면적을 세이브할 수도 있다 (예를 들어, 셔플러 면적의 16 배를 세이브한다).
도 3은 셔플 연산을 수행하기 위한 예시적 기법을 나타내는 개념도이다. 도 3은 복수의 소스 프로세싱 레인들 및 복수의 목적지 프로세싱 레인들을 나타낸다. 소스 프로세싱 레인들 및 목적지 프로세싱 레인들은 동일한 세트의 레인들이다. 예를 들어, 하나의 레인은 다른 레인을 위한 소스 레인이고 다른 레인을 위한 목적지 레인이다 (예를 들어, 하나의 레인은 동시에 소스 레인 및 목적지 레인일 수 있다).
나타낸 예에서, 총 64 개의 프로세싱 레인들 (예를 들어, 프로세싱 레인들 0-63) 이 있다. 8개의 뱅크들 (뱅크 0 내지 뱅크 7) 이 있고, 각각은 복수의 프로세싱 레인들을 포함한다. 즉, 64 개의 프로세싱 레인들은 복수의 뱅크들로 그룹화되고, 복수의 뱅크들의 각각의 뱅크는 하나 이상의 프로세싱 레인들을 포함한다. 예를 들어, 뱅크 0은 프로세싱 레인들 0-7 을 포함하고, 뱅크 1은 프로세싱 레인들 8-15 를 포함하는 등이다. 또한, 나타낸 예에서, 셔플러 회로 (14) 는 8 개의 입력 포트 및 8 개의 출력 포트를 포함한다.
이 예에서, CPU (16) 는 35의 오프셋으로 셔플 로테이트 업을 수행하도록 GPU (12) 에 명령했다고 가정한다 (예를 들어, 프로세싱 레인 0 이 프로세싱 레인 35 에 출력하고, 프로세싱 레인 1 은 프로세싱 레인 36 에 출력하는 등이고, 여기서 프로세싱 레인 28 은 프로세싱 레인 63 에 출력한다). 프로세싱 레인 29 에 대해, 오프셋은 프로세싱 레인 29 으로 하여금 프로세싱 레인 64 에 출력하게 하는데, 이는 존재하지 않는다. 그러나, 오프셋은 랩 어라운드되고, 프로세싱 레인 29 은 프로세싱 레인 0 에 출력하고, 프로세싱 레인 30 은 프로세싱 레인 1 에 출력하며, 그렇게 계속하여 프로세싱 레인 63 은 프로세싱 레인 34 에 출력한다.
이 예에서, 전술한 바와 같이, 셔플러 회로 (14) 는 프로세싱 레인들의 소스 서브세트로부터 출력을 수신할 수도 있다. 프로세싱 레인들은 하나의 뱅크의 그러한 것들 (예컨대, 뱅크 0의 프로세싱 레인들 7-0) 일 수도 있다. 셔플러 회로 (14) 는 MUX (48) 를 통해 뱅크 0의 프로세싱 레인들 7-0 로부터 데이터를 수신할 수도 있다. 도 3에 나타낸 바와 같이, 셔플러 회로 (14) 의 입력 포트들의 각각은 프로세싱 레인들 7-0 중 하나로부터 데이터를 수신한다. 가령, 셔플러 회로 (14) 의 제 1 입력 포트는 프로세싱 레인 0으로부터 데이터를 수신하고, 셔플러 회로 (14) 의 제 2 입력 포트는 프로세싱 레인 1로부터 데이터를 수신하는 것 등이다.
프로세싱 레인 0 으로부터의 데이터는 프로세싱 레인 35 에 출력될 것이다. 프로세싱 레인 0 으로부터의 데이터가 프로세싱 레인 35 에 출력되도록 보장하기 위해, 제어기 회로 (38) 는 셔플러 회로 (14) 의 어느 출력 포트가 DEMUX (54) 를 통해 프로세싱 레인 35 에 커플링되는지를 결정할 수도 있다. 전술한 바와 같이, DEMUX (54) 는 각각의 뱅크의 제 1 프로세싱 레인을 셔플러 회로 (14) 의 제 1 출력 포트에 커플링하고, 각각의 뱅크의 제 2 프로세싱 레인을 셔플러 회로 (14) 의 제 2 출력 포트에 커플링하는 것 등이다. 도 3에 나타낸 예에서, 프로세싱 레인 0-7 은 DEMUX (54) 를 통해 셔플러 회로 (14) 의 제 1 내지 제 8 출력 포트에 각각 커플링되고, 프로세싱 레인 8-15 은 DEMUX (54) 를 통해 셔플러 회로 (14) 의 제 1 내지 제 8 출력 포트에 각각 커플링되는 것 등이다.
셔플러 회로 (14) 의 어느 출력 포트가 프로세싱 레인 35 에 커플링되는지를 결정하기 위해, 제어기 회로 (38) 는 셔플러 회로 (14) 의 입력/출력 포트들의 수로 오프셋을 나눌 수도 있다 (예를 들어, 35 나누기 8 ). 그 나누기의 몫은 프로세싱 레인 35 이 위치하는 뱅크를 나타내고 그 나머지는 프로세싱 레인 35 에서 얼마나 많은 레인들이 뱅크에 있는지를 나타낸다. 가령, 35 나누기 8 의 몫은 4 이고 나머지는 3 이다. 따라서, 제어기 회로 (38) 는 프로세싱 레인 35 이 뱅크 4 에 있고, 뱅크 4 내로 3번째 레인임을 결정할 수도 있다. 나타낸 바와 같이, 뱅크 4는 프로세싱 레인들 32-39 을 포함하고, 따라서, 프로세싱 레인 35 은 뱅크 4 내로 3번째 레인이다.
이 예에서, 제어기 회로 (38) 는, 프로세싱 레인 35 에 커플링되는 셔플러 회로 (14) 의 출력 포트가 프로세싱 레인 0 으로부터 데이터를 수신하도록 셔플러 회로 (14) 의 각각의 입력 포트들 상의 데이터가 랩어라운드로 3 개의 포트들만큼 시프트되어야 한다고 결정할 수도 있다. 예를 들어, 셔플러 회로 (14) 의 제 1 내지 제 8 출력 포트들은 프로세싱 레인들 32-39 에 각각 커플링된다. 이것은 셔플러 회로 (14) 의 제 4 출력 포트가 프로세싱 레인 35 에 커플링되는 것을 의미한다. 따라서, 셔플러 회로 (14) 의 제 1 입력 포트 상에 있는 데이터를 셔플러 회로 (14) 의 제 4 출력 포트에 출력함으로써, 프로세싱 레인 35 은 프로세싱 레인 0 으로부터 데이터를 수신할 것이다.
이 경우, 제어기 회로 (38) 는 셔플러 회로 (14) 가 제 1 입력 포트를 제 4 출력 포트에 상호 연결시켜 프로세싱 레인 0 으로부터의 데이터가 프로세싱 레인 35 에 출력되게 하고, 제 2 입력 포트를 제 5 출력 포트에 상호 연결시켜 프로세싱 레인 0 으로부터의 데이터가 프로세싱 레인 36 에 출력되게 하는 것 등일 수도 있다. 제 6 입력 포트에 대해, 랩어라운드 때문에, 제어기 회로 (38) 는 셔플러 회로 (14) 가 제 6 입력 포트를 제 1 출력 포트에 상호 연결하게 하고, 제 7 입력 포트를 제 2 출력 포트에 상호 연결하게 하고, 제 8 입력 포트를 제 3 출력 포트에 상호 연결하게 하는 것일 수도 있다.
도 3에 나타낸 바와 같이, 제 4 출력 포트는 제 1 입력 포트의 데이터를 수신하고 (예를 들어, 제 4 출력 포트는 프로세싱 레인 0 으로부터 데이터를 출력하고), 제 5 출력 포트는 제 2 입력 포트로부터 데이터를 수신하고 (예를 들어, 제 5 출력 포트는 프로세싱 레인 1로부터 데이터를 출력하고), 기타 등등이다. 따라서, 셔플러 회로 (14) 는 오프셋에 기초하여 수신된 데이터를 재정렬할 수도 있다. 나타낸 바와 같이, 셔플러 회로 (14) 의 제 1 출력 포트는 프로세싱 레인 5로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 2 출력 포트는 프로세싱 레인 6 으로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 3 출력 포트는 프로세싱 레인 7 로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 4 출력 포트는 프로세싱 레인 0 으로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 5 출력 포트는 프로세싱 레인 1 로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 6 출력 포트는 프로세싱 레인 2 로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 7 출력 포트는 프로세싱 레인 3로부터 데이터를 출력하고, 셔플러 회로 (14) 의 제 8 출력 포트는 프로세싱 레인 4 로부터 데이터를 출력한다.
DEMUX (54) 는 셔플러 회로 (14) 의 출력을 뱅크들의 각각에 브로드캐스트한다. 나타낸 바처럼, 뱅크 4의 프로세싱 레인들 32-34 이 프로세싱 레인들 5-7 로부터 데이터를 각각 수신한다. 뱅크 4의 프로세싱 레인들 35-39 이 프로세싱 레인들 0-4 로부터 데이터를 각각 수신한다. 셔플러 회로 (14) 의 출력의 브로드캐스트 때문에, 뱅크 5 의 프로세싱 레인들 40-47 은 셔플러 회로 (14) 로부터 데이터를 수신한다. 예를 들어, 프로세싱 레인들 40-42 는 프로세싱 레인들 5-7 으로부터 데이터를 각각 수신한다. 프로세싱 레인들 43-47 는 프로세싱 레인들 0-4 으로부터 데이터를 각각 수신한다.
이 경우에, 프로세싱 레인들 35-39 은 프로세싱 레인들 0-4 로부터 데이터를 올바르게 수신했다 (예를 들어, 오프셋이 35 이므로, 프로세싱 레인들 35-39 은 프로세싱 레인들 0-4 로부터 데이터를 수신한다). 그러나, 프로세싱 레인들 32-34 은 프로세싱 레인들 5-7 로부터 데이터를 수신했지만, 프로세싱 레인들 32-34 는 (랩 어라운드로 인해) 프로세싱 레인들 61-63 으로부터 데이터를 수신한다. 유사하게, 프로세싱 레인들 40-42 은 프로세싱 레인들 5-7 로부터 데이터를 올바르게 수신했다 (예를 들어, 오프셋이 35 이므로, 프로세싱 레인들 40-42 은 프로세싱 레인들 5-7 로부터 데이터를 수신한다). 그러나, 프로세싱 레인들 43-47 은 프로세싱 레인들 0-4 로부터 데이터를 수신했지만, 프로세싱 레인들 43-47 은 프로세싱 레인들 8-12 으로부터 데이터를 수신한다. 이 예에서 뱅크들 0-3, 6 및 7 중 어느 것도 올바른 프로세싱 레인들로부터 데이터를 수신하지 않았다.
이 개시에서 설명된 기술들에서, 프로세싱 레인이 데이터를 수신할 수도 있지만, 프로세싱 레인은 데이터를 취하고 그것을 GPR 에 라이트 백하도록 활성화되지 않을 수도 있다. 제어기 회로 (38) 는 재정렬된 데이터를 수신하는 프로세싱 레인들의 목적지 서브세트를 활성화하도록 구성될 수도 있다. 예를 들어, 전술한 바와 같이, 프로세싱 레인들 40-42 및 35-39 는 35 의 오프셋을 갖는 셔플을 구현하기 위해 올바른 프로세싱 레인들로부터 데이터를 수신하였고 프로세싱 레인들 43-47 및 32-34 는 35 의 오프셋을 갖는 셔플을 구현하기 위해 올바른 프로세싱 레인들로부터 데이터를 수신하지 못했다. 이 예에서, 제어기 회로 (38) 는 프로세싱 레인들 40-42 및 35-39 만을 활성화하여 이들 프로세싱 레인들만이 대응하는 GPR에 데이터를 저장하도록 할 수도 있다. 나머지 프로세싱 레인들은 대응하는 GPR에 데이터를 저장하는 것이 아니라, 오히려 데이터를 폐기할 수도 있다 (즉, 데이터는 여전히 나머지 프로세싱 레인들로 브로드캐스트되지만, 나머지 프로세싱 레인들은 대응하는 GPR에 데이터를 저장할 수 없고, 그래서 데이터는 폐기된다). 프로세싱 레인들은 GPR 이 데이터를 수신하는 것이 허용되지 않기 때문에 또는 프로세싱 레인들이 데이터를 저장하지 않도록 구성 되기 때문에 대응하는 GPR에 데이터를 저장하는 것이 가능하지 않을 수도 있다.
제어기 회로 (38) 는 셔플러 회로 (14) 의 출력 포트들의 수 및 오프셋에 기초하여 어느 프로세싱 레인들이 활성화될지 (예를 들어, 그들의 데이터를 저장하도록 허용되는지) 를 결정할 수도 있다. 예를 들어, 제어기 회로 (38) 는 35 나누기 8 로부터 3의 나머지에 기초하여 프로세싱 레인 35 가 프로세싱 레인 0 으로부터 데이터를 수신하는 것으로 결정했다. 이 예에서, 제어기 회로 (38) 는 프로세싱 레인 35 및 후속하는 7 개의 프로세싱 레인들로 하여금 그들의 대응하는 GPR에 데이터를 저장하도록 허용할 수도 있다. 이 예에서, 프로세싱 레인들 35-42 은 프로세싱 레인들의 목적지 서브세트이다. 프로세싱 레인들의 나머지에 대한 데이터는 폐기될 수도 있다.
제어기 회로 (38) 가 프로세싱 레인들로 하여금 데이터를 저장하게 하거나 데이터를 저장하지 못하게 할 수도 있는 다양한 방법이 있을 수도 있다. 제어기 회로 (38) 는 GPR 로 하여금 그의 대응하는 프로세싱 레인으로부터 데이터를 저장할 수 있게 하거나 GPR 로 하여금 그의 대응하는 프로세싱 레인으로부터 데이터를 저장할 수 없게 하도록 GPR 에 커플링된 MUX 를 제어할 수도 있다. 제어기 회로 (38) 는 프로세싱 레인들로 하여금 대응하는 GPR에 데이터를 저장할 수 있게 하거나 대응하는 GPR에 데이터를 저장하지 못하게 하도록 프로세싱 레인들을 제어할 수도 있다. 이들 예시의 기술외의 기술들뿐만 아니라 일부 조합도 가능하다. 이들 경우들 중 어느 것에서, 프로세싱 레인들의 목적지 서브세트는 재정렬된 데이터를 대응하는 레지스터에 저장하고, 프로세싱 레인들의 목적지 서브세트 외의 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기한다.
예를 들어, 제어기 회로 (38) 는 어느 GPR이 셔플 회로 (14) 에 커플링되는지 제어할 수도 있다. 예를 들어, 제어기 회로 (38) 는 어느 8개의 목적지 레인들의 목적지 GPR 이 이 사이클에서 라이트 백에 연결되어야 하는지를 결정할 수도 있다. 이러한 방식으로, 제어기 회로 (38) 는 프로세싱 레인들을 (예를 들어, 그러한 프로세싱 레인들을 위한 GPR들에 데이터를 제공함으로써) 활성화시킬 수도 있다.
이 예에서, 셔플러 회로 (14) 는 레인들 0-7 로부터 프로세싱 레인들의 올바른 목적지 서브세트로 데이터를 출력하는 것을 완료했다; 하지만, 나머지 프로세싱 레인들이 남는다 (예를 들어, 셔플러 회로 (14) 는 나머지 레인들 8-63 로부터 데이터를 수신 및 출력하지 않았다). 따라서, 셔플러 회로 (14) 및 제어기 회로 (38) 는 셔플 연산이 완료될 때까지 이들 단계를 반복할 수도 있다. 예를 들어, 셔플러 회로 (14) 는 레인들 8-15 로부터 데이터를 수신하고 데이터를 재정렬하여, 제 1 출력 포트가 13인 프로세싱 레인으로부터 데이터를 출력하고, 제 2 출력 포트가 프로세싱 레인 14 로부터 데이터를 출력하고, 제 3 출력 포트가 프로세싱 레인 15 로부터의 데이터를 출력하고, 제 4 출력 포트가 프로세싱 레인 8 로부터 데이터를 출력하고, 제 5 출력 포트가 프로세싱 레인 9 로부터 데이터를 출력하고, 제 6 출력 포트가 프로세싱 레인 10 으로부터 데이터를 출력하고, 제 7 출력 포트가 프로세싱 레인 11 로부터 데이터를 출력하고, 제 8 출력 포트가 프로세싱 레인 12 로부터 데이터를 출력하도록 한다. 이 재정렬된 데이터는 모든 뱅크들로 브로드캐스트되지만, 레인들 43-50 만이 수신된 재정렬된 데이터를 대응하는 GPR에 저장한다. 이 예에서, 레인들 48-55 를 포함하는 뱅크 6 은 레인들 13, 14, 15, 8, 9, 10, 11 및 12 로부터 데이터를 각각 수신한다. 뱅크 6의 레인들 48-50만이 데이터를 저장하기 때문에, 레인들 48-50은 레인들 13-15 로부터 데이터를 수신한다. 레인들 40-47 을 포함하는 뱅크 4 는 레인들 13, 14, 15, 8, 9, 10, 11 및 12 로부터 데이터를 각각 수신한다. 레인들 43-47 만이 데이터를 저장하기 때문에, 레인들 43-47 은 레인들 8-12 로부터 데이터를 각각 수신한다.
그러므로, 이 반복 이후, 레인들 35-42의 ALU 들은 레인들 0-7 로부터 데이터를 각각 수신하였고, 레인들 43-50 의 ALU 들은 레인들 8-15 로부터 데이터를 각각 수신한다. 따라서, 레인들 0-15 로부터의 데이터는 35 개 레인들만큼 좌측으로 셔플 (셔플 업이라고도 함) 되었다. 셔플러 회로 (14) 및 제어기 회로 (38) 는 셔플 연산을 완료하기 위해 연속적인 뱅크들에 대해 이들을 반복할 수도 있다.
도 3의 예에서, GPU (12) 를 포함하는 디바이스 (10) 와 같은 데이터를 프로세싱하기 위한 디바이스, GPU (12) 자체 또는 SIMD 구조를 갖는 기타 디바이스에서, 복수의 프로세싱 레인들 0-63 이 있으며, 프로세싱 레인들의 각각은 데이터를 프로세싱하기 위한 회로 (예를 들어, ALU들 44A,A 내지 44M,X) 를 포함한다. 전술한 바와 같이, 프로세싱 레인들은 SIMD 구조에서 구성된다.
셔플러 회로 (14) 는 MUX (48) 를 통해 셔플러 회로 (14) 의 입력 포트들 상에서 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신 (예를 들어, 프로세싱 레인들 0-7 로부터 데이터를 수신) 하도록 구성될 수도 있다. 일부 예에서, 소스 서브세트로부터 데이터를 수신하기 위해, 셔플러 회로 (14) 는 단 하나의 뱅크로부터 데이터를 수신할 수도 있다. 셔플러 회로 (14) 는 프로세싱 레인들의 각각에 프로세싱 레인들 중 다른 프로세싱 레인에 데이터를 출력하도록 명령하는 명령에 응답하여 프로세싱 레인들의 소스 서브세트로부터 수신된 데이터를 재정렬할 수도 있다 (예를 들어, 셔플러 회로 (14) 는 셔플 명령에 응답하여 데이터를 재정렬할 수도 있다). 셔플러 회로 (14) 는 재정렬된 데이터를 프로세싱 레인들에 출력할 수도 있다. 가령, DEMUX (54) 는 재정렬된 데이터를 프로세싱 레인들에 브로드캐스트할 수도 있다. 이러한 방식으로, 셔플러 회로 (14) 가 출력하는 재정렬된 데이터는 각각의 뱅크에 출력된다. 모든 프로세싱 레인들이 셔플러 회로 (14)의 출력들 중 하나로부터 데이터를 수신할 수도 있지만, 제어기 회로 (38) 는 프로세싱 레인들의 목적지 서브세트만이 재정렬된 데이터를 대응하는 레지스터에 저장하는 것을 허용할 수도 있다. 다른 프로세싱 레인들은 수신된 재정렬된 데이터를 폐기할 수도 있다.
셔플러 회로 (14) 및 제어기 회로 (38) 는 프로세싱 레인들의 연속적인 소스 및 목적지 서브세트들에 대해 상기 예시적인 연산들을 수행하도록 구성될 수도 있다. 예를 들어, 셔플러 회로 (14) 는 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신하고, 프로세싱 레인들의 연속적인 소스 서브세트로부터 수신된 데이터를 재정렬하고, 재정렬된 데이터를 프로세싱 레인들에 출력할 수도 있고, 여기서 프로세싱 레인들의 연속적인 목적지 서브세트들은 수신된 재정렬된 데이터를 대응하는 레지스터에 저장한다.
도 2 및 도 3에 나타낸 바와 같이, 프로세싱 레인들은 복수의 뱅크들로 그룹화된다. 제어기 회로 (38) 는 복수의 뱅크들 0-7 중 하나에 대한 뱅크 식별 (예를 들어, 도 3의 예에서는 bank ID 4) 을 결정할 수도 있고, 오프셋에 기초하여 결정된 뱅크 식별을 갖는 뱅크 4 내의 프로세싱 레인 (예를 들어, 프로세싱 레인 35) 의 레인 식별 (예를 들어, 도 3의 예에서 lane ID 3) 을 결정할 수도 있다. 이 예에서, 제어기 회로 (38) 는 프로세싱 레인들의 목적지 서브세트의 대응하는 GPR 로 하여금 결정된 뱅크 식별 및 레인 식별에 기초하여 재정렬된 데이터를 저장할 수 있게 하도록 구성된다 (예를 들어, 뱅크 4의 프로세싱 레인들 35-39 및 뱅크 5 의 프로세싱 레인들 40-42 에 대응하는 GPR들이 데이터를 저장하도록 허용된다).
일반적으로, 셔플러 회로 (14) 가 수신할 수 있는 프로세싱 레인의 수가 M이고, 프로세싱 레인들의 W 수가 있는 경우, 셔플러 회로 (14) 는 전술된 바와 같이 N개 사이클들에서 셔플 연산을 수행할 수도 있고, 여기서 N = W/M 이다 . 예시의 기술들이 모든 레인 대 모든 레인 크로스바에 비교할 때 더 많은 사이클들을 이용할 수도 있지만, 본 개시에 설명된 기술들은, 전력 및 크기의 현저한 감소를 제공하면서, 이용 사례들의 대부분 (예를 들어, 90 % 초과) 에 대해 큰 레이턴시 없이 기능해야 한다. 다른 10 %의 이용 사례에 대해, 소프트웨어가 셔플 연산을 수행하는 데 사용될 수도 있는데, 이는 더 열악한 성능을 초래하지만, 오직 제한된 사례들에 대해서만 그렇다.
위의 예에서, 셔플 연산은 모든 프로세싱 레인들에 대해 일어났다. 그러나, 일부 예들에서, 셔플 명령은 특정 폭에 대해 (예를 들어, 모든 프로세싱 레인들이 아닌 그룹에 대해) 셔플 연산을 정의할 수도 있다. 그러한 예들에서, 제어기 회로 (38) 는 셔플 연산들이 일어나지 않는 프로세싱 레인들의 ALU들을 디스에이블할 수도 있다. 일반적으로, 프로세싱 레인들의 수는 감소되는 것으로 고려될 수도 있다. 이러한 레인들의 감소는 소수의 프로세싱 레인들 상에서 셔플 업 또는 다운하는 것과 같은 특정 연산들에 유용할 수도 있고 빠른 매트릭스 전치 (matrix transposition) 를 구현할 수도 있다.
도 4a 내지 도 4r은 셔플 모드들의 다양한 예들을 나타내는 개념도이다. 도 4a 내지 도 4r 에서, 이해를 쉽게 위해 4개의 프로세싱 레인들이 나타나 있다. 이러한 예들은 임의의 수의 프로세싱 레인들로 확장될 수 있다. 도 4a 내지 도 4r 의 각각에서, 상단 행은 소스 프로세싱 레인들 (예를 들어, 소스 프로세싱 레인들을 위한 소스 레지스터) 이고 하단 행은 목적지 프로세싱 레인들 (예를 들어, 목적지 프로세싱 레인들을 위한 목적지 레지스터) 이다. 또한, 셔플러 회로 (14) 는 쉽게 하기 위해 나타내지 않았다.
도 4a 내지 도 4c는 셔플 로테이트-다운 (셔플 라이트 (shuffle right) 또는 셔플 다운 (shuffle down) 이라고도 함) 의 예들을 나타낸다. 도 4a에 나타낸 예에서, 오프셋은 1이므로, 각각의 프로세싱 레인은 그 우측에 있는 프로세싱 레인에 출력한다. 제 1 프로세싱 레인의 경우, 우측에는 프로세싱 레인이 없으므로 제 1 프로세싱 레인은 마지막 프로세싱 레인에 출력한다. 이 경우에, 셔플러 회로 (14) 가 사용된다면, 제어기 회로 (38) 는 각 입력 포트 상의 데이터가 랩어라운드로 1 만큼 우측으로 시프트하게 한다. 도 4b에 나타낸 예에서, 오프셋은 2이므로, 각 프로세싱 레인은 그 우측으로 두번째에 있는 프로세싱 레인에 출력한다. 제 1 및 제 2 프로세싱 레인들의 경우, 그들의 우측으로 두번째 프로세싱 레인들이 없으므로 제 1 프로세싱 레인은 끝에서 두번째 프로세싱 레인에 출력하고 제 2 프로세싱 레인은 마지막 프로세싱 레인에 출력한다. 이 경우에, 셔플러 회로 (14) 가 사용된다면, 제어기 회로 (38) 는 각 입력 포트 상의 데이터가 랩어라운드로 2 만큼 우측으로 시프트하게 한다. 도 4c에 나타낸 예에서, 오프셋은 3이므로, 각 프로세싱 레인은 그 우측으로 세번째에 있는 프로세싱 레인에 출력한다. 첫번째 3개 프로세싱 레인들에 대해, 그들의 우측으로 세번째의 프로세싱 레인이 없으므로 첫번째 3개 프로세싱 레인들은 마지막 3개 프로세싱 레인들에 출력한다. 이 경우에, 셔플러 회로 (14) 가 사용된다면, 제어기 회로 (38) 는 각 입력 포트 상의 데이터가 랩어라운드로 3 만큼 우측으로 시프트하게 한다.
도 4a 내지 도 4c에 나타낸 예에서, 셔플러 회로 (14) 는 셔플 모드 및 오프셋에 기초하여 데이터를 재정렬할 수도 있다. 예를 들어, 셔플 로테이트-다운의 셔플 모드는 셔플러 회로 (14) 가 입력 포트상의 데이터를 오른쪽으로 쉬프트할 것이고 (예를 들어, 오프셋과 셔플러 회로 (14) 의 포트들의 수의 나누기의 나머지에 기초하여) 그 오프셋은 얼마나 많이 셔플러 회로 (14) 가 데이터를 오른쪽으로 시프트할 것인지를 나타낸다.
도 4d 내지 도 4f는 셔플 로테이트-업 (셔플 레프트 (shuffle left) 또는 셔플 업 (shuffle up) 이라고도 함) 의 예들을 나타낸다. 도 4d에 나타낸 예에서, 오프셋은 1이므로, 각 프로세싱 레인은 그 좌측에 있는 프로세싱 레인에 출력한다. 마지막 프로세싱 레인의 경우, 그 좌측에 프로세싱 레인이 없으므로 마지막 프로세싱 레인은 제 1 프로세싱 레인에 출력한다. 이 경우에, 셔플러 회로 (14) 가 사용된다면, 제어기 회로 (38) 는 각 입력 포트 상의 데이터가 랩어라운드로 1 만큼 좌측으로 시프트하게 한다. 도 4e에 나타낸 예에서, 오프셋은 2이므로, 각 프로세싱 레인은 그 좌측으로 두번째에 있는 프로세싱 레인에 출력한다. 마지막 2개 프로세싱 레인들에 대해, 그들의 좌측으로 두번째의 프로세싱 레인이 없으므로 마지막 2개 프로세싱 레인들은 첫번째 2개 프로세싱 레인들에 출력한다. 이 경우에, 셔플러 회로 (14) 가 사용된다면, 제어기 회로 (38) 는 각 입력 포트 상의 데이터가 랩어라운드로 2 만큼 좌측으로 시프트하게 한다. 도 4f 에 나타낸 예에서, 오프셋은 3이므로, 각 프로세싱 레인은 그 좌측으로 세번째에 있는 프로세싱 레인에 출력한다. 마지막 3개 프로세싱 레인들에 대해, 그들의 좌측으로 세번째의 프로세싱 레인이 없으므로 마지막 3개 프로세싱 레인들은 첫번째 3개 프로세싱 레인들에 출력한다. 이 경우에, 셔플러 회로 (14) 가 사용된다면, 제어기 회로 (38) 는 각 입력 포트 상의 데이터가 랩어라운드로 3 만큼 좌측으로 시프트하게 한다.
도 4d 내지 도 4f에 나타낸 예에서, 셔플러 회로 (14) 는 셔플 모드 및 오프셋에 기초하여 데이터를 재정렬할 수도 있다. 예를 들어, 셔플 로테이트-업의 셔플 모드는 셔플러 회로 (14) 가 입력 포트상의 데이터를 왼쪽으로 쉬프트할 것이라는 것을 나타내고 (예를 들어, 오프셋과 셔플러 회로 (14) 의 포트들의 수의 나누기의 나머지에 기초하여) 그 오프셋은 얼마나 많이 셔플러 회로 (14) 가 데이터를 왼쪽으로 시프트할 것인지를 나타낸다.
도 4g 내지 도 4i는 브로드캐스트 셔플 모드를 나타낸다. 이들 예에서, 오프셋은 어느 프로세싱 레인으로부터 브로드캐스트를 시작할지를 나타낸다 (즉, 오프셋은 어느 프로세싱 레인이 브로드캐스트를 시작할지를 나타내는 인덱스이다). 일부 예들에서, 브로드캐스트 셔플 모드에 대해, 오프셋이 존재하지 않을 수도 있고, 그 대신 프로세싱 레인 인덱스가 사용될 수도 있다. 그러나, 대신에 프로세싱 레인 인덱스로서 오프셋을 사용하는 것이 가능할 수도 있다. 예를 들어, 도 4g에서, 오프셋은 1이고, 따라서 제 2 프로세싱 레인으로부터의 데이터는 모든 다른 프로세싱 레인들로 브로드캐스트된다. 도 4i 에서, 오프셋은 2이고, 따라서 제 3 프로세싱 레인으로부터의 데이터는 모든 다른 프로세싱 레인들로 브로드캐스트된다. 도 4h 에서, 오프셋은 3이고, 따라서 제 4 프로세싱 레인으로부터의 데이터는 모든 다른 프로세싱 레인들로 브로드캐스트된다. 이 예들의 각각에서, 셔플러 회로 (14) 는 연속적으로 상이한 뱅크들로부터보다는 동일한 뱅크로부터 데이터를 수신할 수도 있고, 출력을 오른쪽 또는 왼쪽으로 시프트할 수도 있으며, 그리고 각 반복에 대해 출력이 오른쪽 또는 왼쪽으로 시프트되는 양을 증가시킨다 (랩 어라운드로 인해, 셔플러 회로 (14) 가 데이터를, 오른쪽 또는 왼쪽으로, 어느 방향으로 시프트하는 것은 중요하지 않을 수도 있다). 예를 들어, 셔플러 회로 (14) 는 제 1 반복에서 데이터를 오른쪽으로 1 만큼 시프트할 수도 있고, 그러한 목적지 레인들은 대응하는 GPR에 데이터를 저장할 수도 있다. 그 후 다음 반복에서, 셔플러 회로 (14) 는 데이터를 오른쪽으로 2 만큼 시프트할 수도 있고, 그러한 목적지 레인들은 대응하는 GPR 에 데이터를 저장할 수도 있는 것 등이다.
도 4j 내지 도 4l 은 셔플 XOR의 예를 나타낸다. 셔플 XOR (버터플라이 셔플이라고도 함) 에서, 셔플러 회로 (14) 는 디자인에 기초하여 오프셋 값 및 소스 프로세싱 레인 또는 목적지 프로세싱 레인의 값에 비트 단위로 (bit-by-bit) XOR 함수를 적용한다. 이 예에서, 설명은 소스 레인을 식별하는 목적지 레인에 기초한다. 예를 들어, 도 4j에서, 오프셋 값은 1이고, 이는 이진수로 01이다. 목적지 레인 0 (즉, 00) 에 대해, 목적지 레인의 값 (00) 과 01 (오프셋) 의 XOR 은 01이다. 가령, 목적지 레인과 오프셋 양자 모두에 대한 제 1 이진 값은 0이고 0 과 0의 XOR 은 0이다. 목적지 레인에 대한 제 2 이진 값은 0 이고 오프셋에 대한 제 2 이진 값은 1이며 0 과 1의 XOR 은 1 이다. 따라서, 결과는 01 이다. 값 01 은 1 과 같고, 목적지 레인 0 은 소스 레인 1 로부터 데이터를 수신한다.
도 4j 에서, 목적지 레인 1 (즉, 01) 에 대해, 01의 오프셋 값 및 01의 XOR 은 00 (즉, 0) 이고, 목적지 레인 1은 소스 레인 0 으로부터 데이터를 수신한다. 목적지 레인 2 (즉, 10) 에 대해, 01의 오프셋 값 및 10 의 XOR 은 11 (즉, 3) 이고, 목적지 레인 2 는 소스 레인 3 으로부터 데이터를 수신한다. 목적지 레인 3 (즉, 11) 에 대해, 01의 오프셋 값 및 11 의 XOR 은 10 (즉, 2) 이고, 목적지 레인 3 는 소스 레인 2 으로부터 데이터를 수신한다.
도 4k 에서, 오프셋 값은 2 (즉, 이진수로 10) 이다. 도 4k 에서, 목적지 레인 0 (즉, 00) 에 대해, 10 의 오프셋 값 및 00 의 XOR 은 10 (즉, 2) 이고, 목적지 레인 0 은 소스 레인 2 으로부터 데이터를 수신한다. 목적지 레인 1 (즉, 01) 에 대해, 10 의 오프셋 값 및 01 의 XOR 은 11 (즉, 3) 이고, 목적지 레인 1 은 소스 레인 3 으로부터 데이터를 수신한다. 목적지 레인 2 (즉, 10) 에 대해, 10 의 오프셋 값 및 10 의 XOR 은 00 (즉, 0) 이고, 목적지 레인 2 은 소스 레인 0 으로부터 데이터를 수신한다. 목적지 레인 3 (즉, 11) 에 대해, 10 의 오프셋 값 및 11 의 XOR 은 01 (즉, 1) 이고, 목적지 레인 3 은 소스 레인 1 으로부터 데이터를 수신한다.
도 4l 에서, 오프셋 값은 3 (즉, 이진수로 11) 이다. 도 4l 에서, 목적지 레인 0 (즉, 00) 에 대해, 11 의 오프셋 값 및 00 의 XOR 은 11 (즉, 3) 이고, 목적지 레인 0 은 소스 레인 3 으로부터 데이터를 수신한다. 목적지 레인 1 (즉, 01) 에 대해, 11 의 오프셋 값 및 01 의 XOR 은 10 (즉, 2) 이고, 목적지 레인 1 은 소스 레인 2 로부터 데이터를 수신한다. 목적지 레인 2 (즉, 10) 에 대해, 11 의 오프셋 값 및 10 의 XOR 은 01 (즉, 1) 이고, 목적지 레인 2 는 소스 레인 1 로부터 데이터를 수신한다. 목적지 레인 3 (즉, 11) 에 대해, 11 의 오프셋 값 및 11 의 XOR 은 00 (즉, 0) 이고, 목적지 레인 3 는 소스 레인 0 로부터 데이터를 수신한다.
도 4m 내지 도 4o 는 셔플 다운 모드를 나타낸다. 셔플 다운 모드는 도 4a 내지 도 4c의 셔플 로테이트 다운-모드와 유사하다. 그러나 셔플 다운 모드에서는, 랩어라운드가 없다. 예를 들어, 도 4m 에서, 오프셋은 1이고, 따라서 각각의 목적지 레인은 그의 좌측으로 첫번째의 소스 레인으로부터 데이터를 수신한다. 목적지 레인 3에 대해, 그의 좌측으로 첫번째의 소스 레인이 없다. 랩어라운드가 없기 때문에, 목적지 레인 3은 자기 복사를 수행하고 자신으로부터 데이터를 수신한다 (예를 들어, 목적지 레인 3 을 위한 소스 레인은 소스 레인 3이다). 도 3에 나타내지는 않았지만, 각 목적지 레인은 MUX 를 포함할 수도 있으며, 여기서, 목적지 레인이 자기 복사를 수행하는 경우, MUX 는 소스 레인으로부터 수신된 데이터를 출력하지 않고, 목적지 레인이 소스 레인으로부터 데이터를 수신하는 경우, MUX는 소스 레인으로부터의 데이터를 출력한다.
도 4n 에서, 오프셋은 2 이고, 따라서 각각의 목적지 레인은 그의 좌측으로 두번째의 소스 레인으로부터 데이터를 수신한다. 목적지 레인들 3 및 2에 대해, 그들의 좌측으로 두번째의 소스 레인들이 없다. 랩어라운드가 없기 때문에, 목적지 레인들 3 및 2는 자기 복사를 수행하고 그들 자신으로부터 데이터를 수신한다 (예를 들어, 목적지 레인 3을 위한 소스 레인은 소스 레인 3이고, 목적지 레인 2 을 위한 소스 레인은 소스 레인 2이다). 도 4o 에서, 오프셋은 3 이고, 따라서 각각의 목적지 레인은 그의 좌측으로 세번째의 소스 레인으로부터 데이터를 수신한다. 목적지 레인들 3, 2 및 1에 대해, 그들의 좌측으로 세번째의 소스 레인들이 없다. 랩어라운드가 없기 때문에, 목적지 레인들 3, 2 및 1 은 자기 복사를 수행하고 그들 자신으로부터 데이터를 수신한다 (예를 들어, 목적지 레인 3 을 위한 소스 레인은 소스 레인 3이고, 목적지 레인 2 을 위한 소스 레인은 소스 레인 2이고, 목적지 레인 1 을 위한 소스 레인은 소스 레인 1 이다).
도 4p 내지 도 4r 은 셔플 업 모드를 나타낸다. 셔플 업 모드는 도 4d 내지 도 4f의 셔플 로테이트 다운 모드와 유사하다. 그러나, 셔플 업 모드에서는, 랩어라운드가 없다. 예를 들어, 도 4p 에서, 오프셋은 1이고, 따라서 각각의 목적지 레인은 그의 우측으로 첫번째의 소스 레인으로부터 데이터를 수신한다. 목적지 레인 0에 대해, 그의 우측으로 첫번째의 소스 레인이 없다. 랩어라운드가 없기 때문에, 목적지 레인 0 은 자기 복사를 수행하고 자신으로부터 데이터를 수신한다 (예를 들어, 목적지 레인 0 을 위한 소스 레인은 소스 레인 0 이다). 전술한 바와 같이, 목적지 레인들의 각각은 그러한 자기 복사를 허용하기 위한 MUX를 포함할 수도 있다.
도 4q 에서, 오프셋은 2 이고, 따라서 각각의 목적지 레인은 그의 우측으로 두번째의 소스 레인으로부터 데이터를 수신한다. 목적지 레인들 0 및 1에 대해, 그들의 우측으로 두번째의 소스 레인들이 없다. 랩어라운드가 없기 때문에, 목적지 레인들 0 및 1 은 자기 복사를 수행하고 그들 자신으로부터 데이터를 수신한다 (예를 들어, 목적지 레인 0 을 위한 소스 레인은 소스 레인 0이고, 목적지 레인 1 을 위한 소스 레인은 소스 레인 1이다). 도 4r 에서, 오프셋은 3 이고, 따라서 각각의 목적지 레인은 그의 우측으로 세번째의 소스 레인으로부터 데이터를 수신한다. 목적지 레인들 0, 1 및 2 에 대해, 그들의 우측으로 세번째의 소스 레인들이 없다. 랩어라운드가 없기 때문에, 목적지 레인들 0, 1 및 2 는 자기 복사를 수행하고 그들 자신으로부터 데이터를 수신한다 (예를 들어, 목적지 레인 0 을 위한 소스 레인은 소스 레인 0이고, 목적지 레인 1을 위한 소스 레인은 소스 레인 1이고, 목적지 레인 2 를 위한 소스 레인은 소스 레인 2 이다).
비록 도 4m 내지 도 4r 에서는, 랩어라운드가 없지만, 셔플 연산이 완료될 수 있게 하기 위해 필요에 따라 셔플러 회로 (14) 가 내부적으로 데이터를 랩어라운드할 수도 있음을 이해해야 한다. 셔플 업/다운을 위해, 랩어라운드는 없지만, 대신에 소스 레인이 유효하지 않은 (예를 들어, 경계 밖 (out-of-boundary) 레인인) 경우, 자기 복사가 있다. shuffle.xor (XOR 모드) 및 shuffle.idx (인덱스 또는 브로드캐스팅 모드) 에 대해 경계 밖 사례는 없다. 그러나, XOR 모드에 대한 비활성 레인이 있다면, 셔플러 회로 (14) 는 자기 복사를 수행한다. 브로드캐스트 및 XOR 셔플 모드들에 대해, 랩어라운드가 없다. 셔플 로테이트-다운/업의 경우, 경계 밖 사례에 대한 랩어라운드가 있다.
이하는 도 4a 내지 도 4r 에 나타낸 예들을 구현하기 위한 의사 코드이다. 의사 코드는, 본 개시에 설명된 기술들의 일부 예들을 수행하기 위해 GPU (12) 또는 셔플러 회로 (14) 에 의해 실행가능할 수도 있는 코드를 나타낸다. 일례로서, 의사 코드는 셔플러 회로 (14) 가 수행할 셔플 연산을 호출하는 GPU (12) 상에서 실행되는 셰이더 애플리케이션의 일부일 수도 있다. 의사 코드에서의 신택스는 shfl.md[.w][.dt] dst, src0, src1 이다. 또한, 이하에서는 프로세싱 레인과 동의어인 "파이버" (fiber) 라는 용어가 사용된다.
웨이브 내의 파이버들간에 데이터를 교환한다. 파이버를 실행함에 있어서 소스 파이버에 있는 src0 GPR 로부터 dst GPR 로 데이터가 복사된다. 소스 파이버는 셔플 모드 (md) 에 따라 소스 파이버 오프셋 (src1) 으로부터 계산된다.
Figure 112019002170576-pct00001
Figure 112019002170576-pct00002
Figure 112019002170576-pct00003
도 5는 셔플 명령들과 함께 사용되는 연산들을 나타내는 개념도이다. 셔플 명령은 OpenGL API와 같은 특정 API를 따를 수도 있다. 셔플 명령의 일례는: shuffle.mode.datatype rDest rSrc laneOffset 이다. 이 예에서 shuffle.mode.datatype 은 셔플 업, 셔플 다운, 셔플 브로드캐스트, 또는 셔플 XOR 이 수행되는지를 나타내고, datatype (datawidth 라고도 함) 은 데이터가 16 비트 또는 32 비트임을 나타낸다. 셔플러 회로 (14)는 작은 바이트보다는 각 프로세싱 레인의 전체 스칼라 값 또는 벡터 값을 수신, 재정렬 및 출력할 수도 있다. rDest는 데이터가 저장될 대응하는 프로세싱 레인의 목적지 레지스터를 나타내고 rSrc 는 데이터가 취출되는 대응하는 프로세싱 레인의 소스 레지스터를 나타낸다. laneOffset 는 오프셋을 나타낸다.
일례로서, 프로그램 내의 셔플 명령이 GPU (12) 에 의해 실행되는 것에 응답하여, GPU (12) 는 shfl.bfly.b32 Ry, Rx, 0x4 와 같은 셔플 명령의 연산을 수행할 수도 있다. 이 예에서 프로세싱 레인들은 XOR 셔플을 수행할 것이고 여기서 소스 프로세싱 레인의 Rx 레지스터로부터의 값들은 4 와 같은 오프셋으로 목적지 프로세싱 레인의 Ry 레지스터에 저장된다. 이 연산은 셔플 XOR 오프셋 = 4 로 도 5에 나타나 있다. 굵게 표시된 대각선 화살표는 프로세스를 강조하는데 사용된 화살표이고, 점선 표시된 대각선 화살표는 프로세스가 다른 프로세싱 레인에서도 일어나고 있음을 나타내기 위해 사용된다. 이 예에서 소스 프로세싱 레인들의 Rx 레지스터들로부터의 값들은 목적지 프로세싱 레인들의 Ry 레지스터에 출력된다. 이것은, 직선 화살표가 아래쪽을 향한 상태로 도 5에 나타낸 바와 같이, 각 프로세싱 레인에 대한 Rx 레지스터에 저장된 값들이 여전히 이용 가능하다는 것을 의미한다. 굵게 표시된 직선 화살표는 프로세스를 강조하고, 점선 표시된 직선 화살표는 프로세싱이 다른 프로세싱 레인에서도 일어나고 있음을 나타내기 위해 사용된다.
다음으로, 프로세싱 레인들의 ALU 들은 하기 연산: add.f32 Rx, Ry, Rx 을 수행할 수도 있다. 이 예에서, 프로세싱 레인들의 ALU 들은 각각의 Rx 레지스터에서의 값을 각각의 Ry 레지스터로부터의 값들과 각각 가산하고 그 결과를 각각의 Rx 레지스터에 저장한다. Ry 레지스터에서의 값은 다른 프로세싱 레인의 Rx 레지스터에서 나온 것이기 때문에, 가산 연산은 각각의 ALU 가 두 개의 프로세싱 레인들로부터의 데이터 값들을 가산하는 것으로 고려될 수도 있다.
다음으로, 각각의 프로세싱 레인은 하기 연산: shfl.bfly.b32 Ry, Rx, 0x2 을 수행할 수도 있다. 위와 유사하게, 이 예에서, 프로세싱 레인들은 XOR 셔플을 수행할 것이고 여기서 소스 프로세싱 레인의 Rx 레지스터로부터의 값들은 목적지 프로세싱 레인의 Ry 레지스터에, 그러나 2 와 같은 오프셋으로, 저장된다. 이 연산은 셔플 XOR 오프셋 = 2 로 도 5에 나타나 있다. 다음으로, 프로세싱 레인들의 ALU 들은 하기 연산: add.f32 Rx, Ry, Rx 을 수행할 수도 있다. 이 예에서, 프로세싱 레인들의 ALU 들은 각각의 Rx 레지스터에서의 값을 각각의 Ry 레지스터로부터의 값들과 각각 가산하고 그 결과를 각각의 Rx 레지스터에 저장한다. 이 예에서, Ry 레지스터는 두 개의 프로세싱 레인들 합의 값을 저장하고, Rx 레지스터는, 연산 실행 전에, 두 개의 프로세싱 레인들의 합의 값을 저장한다. 따라서, 합산 명령의 실행 후에, 각각의 Rx 레지스터에 저장된 결과 값은 4 개의 프로세싱 레인들의 합이다 (다시, 이 프로세스는 각각의 프로세싱 레인에서 일어난다).
다음으로, 각각의 프로세싱 레인은 하기 연산: shfl.bfly.b32 Ry, Rx, 0x1 을 수행할 수도 있다. 위와 유사하게, 이 예에서, 프로세싱 레인들은 XOR 셔플을 수행할 것이고 여기서 소스 프로세싱 레인의 Rx 레지스터로부터의 값들은 목적지 프로세싱 레인의 Ry 레지스터에, 그러나 1 와 같은 오프셋으로, 저장된다. 이 연산은 셔플 XOR 오프셋 = 1 로 도 5에 나타나 있다. 다음으로, 프로세싱 레인들의 ALU 들은 하기 연산: add.f32 Rx, Ry, Rx 을 수행할 수도 있다. 이 예에서, 프로세싱 레인들의 ALU 들은 각각의 Rx 레지스터에서의 값을 각각의 Ry 레지스터로부터의 값들과 각각 가산하고 그 결과를 각각의 Rx 레지스터에 저장한다. 이 예에서, Ry 레지스터는 4개의 프로세싱 레인들 합의 값을 저장하고, Rx 레지스터는, 연산 실행 전에, 4개의 프로세싱 레인들의 합의 값을 저장한다. 따라서, 합산 명령의 실행 후에, 각각의 Rx 레지스터에 저장된 결과 값은 8 개의 프로세싱 레인들의 합이다 (다시, 이 프로세스는 각각의 프로세싱 레인에서 일어난다).
결국, 각 프로세싱 레인의 Rx 레지스터 각각은 각 프로세싱 레인으로부터의 데이터의 합을 나타내는 동일한 값을 저장할 수도 있다. 이 예에서, 셔플 연산은 모든 프로세싱 레인들에 걸친 데이터의 합을 허용할 수도 있다. 이 개시에서 설명된 기술에 따르면, 셔플러 회로 (14) 는 이 셔플로 하여금 값비싼 모든 레인 대 모든 레인 크로스바를 필요로 하지 않고, 그러나 셔플러 회로 (14) 내의 훨씬 더 작은 크로스 바 (예를 들어, 8x8 크로스 바) 로 이 합산을 가능하게 하는 것을 용이하게 할 수도 있다.
이하는 도 5 에 나타낸 예들을 수행하기 위한 의사 코드이다.
Figure 112019002170576-pct00004
도 6은 데이터를 프로세싱하는 예시적인 방법을 나타내는 플로우차트이다. 예를 들어, 도 6은 셔플 연산을 수행하기 위한 일례를 나타낸다. 제어기 회로 (38) 는 셔플러 회로 (14) 의 입력 포트들을 뱅크의 각 프로세싱 레인들에 커플링하도록 MUX (48) 를 구성한다 (60). 이러한 방식으로, 셔플러 회로 (14) 는 일례로서 프로세싱 레인들의 소스 서브세트로부터 데이터를 수신할 수도 있다 (62). 예를 들어, 셔플러 회로 (14) 는 단 하나의 뱅크로부터 데이터를 수신할 수도 있다.
셔플러 회로 (14) 는 프로세싱 레인들 중 적어도 일부 (예를 들어, 프로세싱 레인들의 각각 또는 프로세싱 레인들의 서브세트) 에게 프로세싱 레인들의 또 다른 프로세싱 레인에 데이터를 출력하게 명령하는 명령에 응답하여 (예를 들어, 셔플 명령에 응답하여) 뱅크의 프로세싱 레인들로부터 수신된 데이터를 재정렬할 수도 있다 (64). 예를 들어, 제어기 회로 (38) 는 복수의 뱅크들 중 하나에 대한 뱅크 식별 및 오프셋에 기초하여 결정된 뱅크 식별을 갖는 뱅크로 프로세싱 레인의 레인 식별을 결정할 수도 있다. 제어기 회로 (38) 는 셔플러 회로 (14) 의 제 1 입력 포트가 결정 뱅크에서 결정된 레인 식별을 갖는 프로세싱 레인에 출력하는 셔플러 회로 (14) 의 출력 포트에 출력하도록 셔플러 회로 (14) 의 스위치들이 상호 연결되게 할 수도 있다. 제어기 회로 (38) 는 오프셋을 셔플러 회로 (14) 내의 입력 또는 출력 포트들의 수로 나눌 수도 있다. 그 나머지 및 셔플 모드는 제어기 회로 (38) 에 입력 포트들 상의 데이터를 어떻게 우측 또는 좌측으로 시프트할지를 표시할 수도 있다. 제어기 회로 (38) 는 셔플러 회로 (14) 의 스위치들로 하여금 나머지 수의 포트만큼 떨어져 있는 출력 포트들로 입력 포트들을 상호 연결하게 한다 (예를 들어, 나머지가 3인 경우, 제 1 입력 포트는 제 4 출력 포트에 출력한다).
DEMUX (54) 는 재정렬된 출력을 셔플러 회로 (14) 로부터 뱅크들의 각각으로 브로드캐스트한다 (66). 이런 방식으로, 셔플러 회로 (14) 는 재정렬된 데이터를 프로세싱 레인들에 출력한다. 그러나, 모든 프로세싱 레인들이 수신된 데이터를 저장할 수 있는 것은 아닐 수도 있다. 예를 들어, 프로세싱 레인들의 목적지 서브세트 (예를 들어, 전부의 프로세싱 레인들보다 적음) 는 재정렬된 데이터를 대응하는 레지스터에 저장할 수도 있다. 일부 예에서, 제어기 회로 (38) 는 프로세싱 레인들의 목적지 서브세트들의 대응하는 레지스터들이 재정렬된 데이터를 저장할 수 있게 할 수도 있다. 제어기 회로 (38) 는 프로세싱 레인들의 어느 대응하는 GPR들이 셔플러 회로 (14) 의 제 1 입력 포트로부터의 출력을 수신하는 프로세싱 레인의 레인 식별 및 오프셋에 기초하여 저장을 허용할지를 결정할 수도 있다.
제어기 회로 (38) 및 셔플러 회로 (14) 는 셔플 연산이 완료될 때까지 이들 연산들을 반복할 수도 있다. 예를 들어, 셔플러 회로 (14) 는 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신할 수도 있다 (예를 들어, MUX (48) 는 연속적인 뱅크의 프로세싱 레인들을 셔플러 회로 (14) 의 입력에 커플링할 수도 있다). 셔플러 회로 (14) 는 연속적인 소스 서브세트들로부터 수신된 데이터를 재정렬할 수도 있다 (예를 들어, 오프셋과 셔플러 회로 (14) 의 포트들의 수의 나누기의 나머지에 기초하여 출력 포트들로 입력 포트들 상의 데이터를 시프트한다). 셔플러 회로 (14) 는 재정렬된 데이터를 프로세싱 레인들에 출력할 수도 있으며, 프로세싱 레인들의 연속적인 목적지 서브세트는 수신된 재정렬된 데이터를 대응하는 레지스터들에 저장한다.
하나 이상의 예들에서, 설명된 기능들은 하드웨어, 소프트웨어, 펌웨어, 또는 이들의 임의의 조합으로 구현될 수도 있다. 소프트웨어로 구현되면, 그 기능들은 컴퓨터 판독가능 매체 상에 하나 이상의 명령들 또는 코드로서 저장될 수도 있고 하드웨어 기반 프로세싱 유닛에 의해 실행될 수도 있다. 컴퓨터 판독가능 매체는, 데이터 저장 매체와 같은 유형의 매체에 대응하는, 컴퓨터 판독가능 저장 매체를 포함할 수도 있다. 이러한 방식으로, 컴퓨터 판독 가능 매체는 일반적으로 비일시적인 유형의 컴퓨터 판독 가능 저장 매체에 대응할 수도 있다. 데이터 저장 매체는, 본 개시에서 설명된 기법들의 구현을 위해 명령들, 코드 및/또는 데이터 구조들을 취출하기 위하여 하나 이상의 컴퓨터들 또는 하나 이상의 프로세서들에 의해 액세스될 수 있는 임의의 가용 매체일 수도 있다. 컴퓨터 프로그램 제품은 컴퓨터 판독가능 매체를 포함할 수도 있다.
예로서, 그리고 비제한적으로, 이러한 컴퓨터 판독 가능 저장 매체들은 RAM, ROM, EEPROM, CD-ROM 또는 다른 광학 디스크 저장, 자기 디스크 저장, 또는 다른 자기 저장 디바이스들, 플래시 메모리, 또는 명령들 또는 데이터 구조들의 형태로 희망하는 프로그램 코드를 저장하기 위해 이용될 수 있으며 컴퓨터에 의해 액세스될 수 있는 임의의 다른 매체를 포함할 수 있다. 컴퓨터 판독가능 저장 매체 및 데이터 저장 매체는, 캐리어 파, 신호 또는 다른 일시적 매체를 포함하는 것이 아니라, 대신에 비일시적, 유형의 저장 매체에 관한 것이라는 것이 이해되야 한다. 여기에 사용된, 디스크 (disk) 및 디스크 (disc) 는 CD (compact disc), 레이저 디스크 (laser disc), 광 디스크 (optical disc), DVD (digital versatile disc), 플로피 디스크 (floppy disk) 및 블루레이 디스크 (Blu-ray disc) 를 포함하며, 여기서, 디스크 (disk) 는 보통 데이터를 자기적으로 재생하지만, 디스크 (disc) 는 레이저를 이용하여 광학적으로 데이터를 재생한다. 또한, 상기의 조합은 컴퓨터 판독 가능 매체의 범위 내에 포함되어야 한다.
명령들은 하나 이상의 프로세서, 이를테면 하나 이상의 DSP (digital signal processor), 범용 마이크로프로세서, ASIC (application specific integrated circuit), FPGA (field programmable logic array), 또는 다른 등가 집적 또는 이산 로직 회로에 의해 실행될 수도 있다. 따라서, 본원에 사용된 용어 "프로세서" 는 전술한 구조 중 임의의 것 또는 본원에 설명된 기법들의 구현에 적합한 임의의 다른 구조를 지칭할 수도 있다. 추가로, 일부 양태들에서, 여기서 설명된 기능은 인코딩 및 디코딩을 위해 구성된 전용 하드웨어 및/또는 소프트웨어 모듈들 내에 제공되거나 또는 결합된 코덱에 포함될 수도 있다. 또한, 그 기법들은 하나 이상의 회로 또는 로직 엘리먼트들에서 완전히 구현될 수 있다.
본 개시의 기법들은 무선 핸드셋, 집적 회로 (IC) 또는 IC 들의 세트 (예를 들면, 칩 세트) 를 포함하여, 광범위하게 다양한 디바이스들 또는 장치들에서 구현될 수도 있다. 다양한 컴포넌트들, 모듈들 또는 유닛들이, 개시된 기술들을 수행하도록 구성된 디바이스들의 기능적인 양태들을 강조하기 위하여 본 개시에 설명되었지만, 상이한 하드웨어 유닛들에 의한 실현을 반드시 필요로 하는 것은 아니다. 오히려, 상술된 바처럼, 다양한 유닛들이 코덱 하드웨어 유닛에 결합될 수도 있거나, 또는 적합한 소프트웨어 및/또는 펌웨어와 함께, 상술된 하나 이상의 프로세서들을 포함하는 연동적인 (interoperative) 하드웨어 유닛들의 집합에 의해 제공될 수도 있다.
다양한 예들이 설명되었다. 이들 및 다른 예들은 다음의 청구항들의 범위 내에 있다.

Claims (29)

  1. 데이터를 프로세싱하기 위한 디바이스로서,
    복수의 프로세싱 레인들로서, 상기 프로세싱 레인들의 각각은 상기 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되고, 상기 프로세싱 레인들은 복수의 뱅크들로 그룹화되며, 상기 복수의 뱅크들의 각각의 뱅크는 상기 복수의 프로세싱 레인들 중 하나 이상의 프로세싱 레인들을 포함하는, 상기 복수의 프로세싱 레인들; 및
    복수의 입력 포트들 및 복수의 출력 포트들을 포함하는 셔플러 회로로서, 상기 복수의 출력 포트들의 각각의 출력 포트는 상기 복수의 뱅크들의 각각의 뱅크에서 단 하나의 프로세싱 레인으로 출력하도록 구성되는, 상기 셔플러 회로를 포함하고,
    상기 셔플러 회로는:
    제 1 반복에서, 상기 프로세싱 레인들의 소스 서브세트만의 각각의 프로세싱 레인으로부터 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 상기 입력 포트들 상에서 수신하는 것으로서, 상기 프로세싱 레인들의 소스 서브세트는 상기 복수의 프로세싱 레인들보다 더 적은 프로세싱 레인들이고, 상기 프로세싱 레인들의 소스 서브세트의 제 1 프로세싱 레인은 제 1 데이터와 연관되고 상기 프로세싱 레인들의 소스 서브세트의 제 2 프로세싱 레인은 제 2 데이터와 연관되고, 데이터의 순서는 상기 데이터의 순서에서 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르도록 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인을 포함하는 상기 복수의 뱅크들 중의 뱅크에서 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인의 상대적 위치들에 기초하는, 상기 데이터를 상기 입력 포트들 상에서 수신하고;
    상기 제 1 반복에서, 상기 제 1 및 제 2 프로세싱 레인들의 상대적 위치들에 기초하여 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하는 것으로서, 상기 명령은 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르지 않고 상기 제 2 데이터가 재정렬된 데이터에 있도록 상기 프로세싱 레인들의 각각이 데이터를 어느 프로세싱 레인들에 출력해야 하는지를 명령하는, 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하고; 그리고
    상기 제 1 반복에서, 상기 전체 스칼라 또는 벡터 값들을 포함하는 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하는 것으로서, 상기 프로세싱 레인들의 목적지 서브세트는 대응하는 레지스터들에 상기 재정렬된 데이터를 저장하고, 상기 프로세싱 레인들의 목적지 서브세트는 상기 복수의 프로세싱 레인들보다 더 적고, 상기 프로세싱 레인들의 목적지 서브세트 이외의 프로세싱 레인들은 상기 프로세싱 레인들의 목적지 서브세트 이외의 상기 프로세싱 레인들에 의해 수신되는 상기 재정렬된 데이터를 폐기하고, 상기 재정렬된 데이터를 출력하기 위해, 상기 셔플러 회로는 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하도록 구성되고, 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하기 위해, 상기 복수의 출력 포트들의 각각의 출력 포트는 상기 복수의 뱅크들의 각각의 뱅크의 개별적인 프로세싱 레인들에만 출력하는, 상기 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하도록 구성되고,
    상기 셔플러 회로는 또한:
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 오직 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신하고;
    상기 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여 연속적인 재정렬된 데이터를 생성하기 위해 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 수신된 데이터를 재정렬하고; 그리고
    상기 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 모두에 상기 연속적인 재정렬된 데이터를 출력하는 것으로서, 상기 프로세싱 레인들의 연속적인 목적지 서브세트들은 대응하는 레지스터들에 상기 연속적인 재정렬된 데이터를 저장하도록 구성되는, 상기 연속적인 재정렬된 데이터를 출력하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  2. 제 1 항에 있어서,
    상기 프로세싱 레인들의 목적지 서브세트의 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하도록 구성된 제어기 회로를 더 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  3. 제 2 항에 있어서,
    상기 제어기 회로는 상기 복수의 뱅크들 중 하나에 대한 뱅크 식별 및 오프셋에 기초하여 결정된 상기 뱅크 식별을 갖는 상기 뱅크들 중 하나 내의 프로세싱 레인의 레인 식별을 결정하도록 구성되고, 상기 제어기 회로는 결정된 상기 뱅크 식별 및 레인 식별에 기초하여 상기 프로세싱 레인들의 목적지 서브세트의 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  4. 제 1 항에 있어서,
    상기 소스 서브세트로부터 데이터를 수신하기 위해, 상기 셔플러 회로는 단 하나의 뱅크로부터 데이터를 수신하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  5. 제 1 항에 있어서,
    상기 셔플러 회로는 상기 명령에 의해 정의된 오프셋에 기초하여 상기 데이터를 재정렬하도록 구성되는, 데이터를 프로세싱하기 위한 디바이스.
  6. 제 1 항에 있어서,
    상기 뱅크들의 각각에 그리고 상기 셔플러 회로의 입력 인터페이스에 커플링된 멀티플렉서;
    상기 프로세싱 레인들의 소스 서브세트를 포함하는, 상기 복수의 뱅크들 중의 뱅크를 상기 멀티플렉서를 통해 상기 셔플러 회로에 선택적으로 커플링하도록 구성된 제어기 회로; 및
    상기 뱅크들의 각각에 그리고 상기 셔플러 회로의 출력 인터페이스에 커플링된 디멀티플렉서로서, 상기 디멀티플렉서는 상기 재정렬된 데이터를 상기 뱅크들에 브로드캐스트하도록 구성되고, 상기 디멀티플렉서의 각각의 출력은 상기 복수의 뱅크들의 각각의 뱅크에서 단 하나의 프로세싱 레인으로 출력하는, 상기 디멀티플렉서를 더 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  7. 제 1 항에 있어서,
    그래픽스 프로세싱 유닛 (GPU) 을 더 포함하고,
    상기 GPU 는 상기 복수의 프로세싱 레인들을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  8. 제 1 항에 있어서,
    상기 디바이스는:
    집적 회로;
    마이크로프로세서; 또는
    무선 통신 디바이스
    중 하나를 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  9. 데이터를 프로세싱하는 방법으로서,
    제 1 반복에서, 셔플러 회로의 입력 포트들로, 복수의 프로세싱 레인들 중 프로세싱 레인들의 소스 서브세트만의 각각의 프로세싱 레인으로부터 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 수신하는 단계로서, 상기 프로세싱 레인들의 각각은 상기 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되고, 상기 프로세싱 레인들은 복수의 뱅크들로 그룹화되며, 상기 복수의 뱅크들의 각각의 뱅크는 상기 복수의 프로세싱 레인들 중의 하나 이상의 프로세싱 레인들을 포함하고, 상기 프로세싱 레인들의 소스 서브세트는 상기 복수의 프로세싱 레인들보다 더 적은 프로세싱 레인들이고, 상기 프로세싱 레인들의 소스 서브세트의 제 1 프로세싱 레인은 제 1 데이터와 연관되고 상기 프로세싱 레인들의 소스 서브세트의 제 2 프로세싱 레인은 제 2 데이터와 연관되고, 데이터의 순서는 상기 데이터의 순서에서 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르도록 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인을 포함하는 상기 복수의 뱅크들 중의 뱅크에서 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인의 상대적 위치들에 기초하는, 상기 데이터를 수신하는 단계;
    상기 제 1 반복에서, 상기 셔플러 회로로, 상기 제 1 및 제 2 프로세싱 레인들의 상대적 위치들에 기초하여 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여, 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하는 단계로서, 상기 명령은 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르지 않고 상기 제 2 데이터가 재정렬된 데이터에 있도록 상기 프로세싱 레인들의 각각이 데이터를 어느 프로세싱 레인들에 출력해야 하는지를 명령하는, 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하는 단계; 및
    상기 제 1 반복에서, 상기 셔플러 회로의 복수의 출력 포트들로, 상기 전체 스칼라 또는 벡터 값들을 포함하는 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하는 단계로서, 상기 복수의 출력 포트들의 각각의 출력 포트는 상기 복수의 뱅크들의 각각의 뱅크에서의 단 하나의 프로세싱 레인으로 출력하도록 구성되고, 상기 프로세싱 레인들의 목적지 서브세트는 대응하는 레지스터들에 상기 재정렬된 데이터를 저장하고, 상기 프로세싱 레인들의 목적지 서브세트는 상기 복수의 프로세싱 레인들보다 더 적고, 상기 프로세싱 레인들의 목적지 서브세트 이외의 프로세싱 레인들은 상기 프로세싱 레인들의 목적지 서브세트 이외의 상기 프로세싱 레인들에 의해 수신되는 상기 재정렬된 데이터를 폐기하고, 상기 재정렬된 데이터를 출력하는 단계는, 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하는 단계를 포함하고, 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하는 단계는 상기 복수의 출력 포트들의 각각의 출력 포트가 상기 복수의 뱅크들의 각각의 뱅크의 개별적인 프로세싱 레인들에만 출력하는 단계를 포함하는, 상기 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하는 단계를 포함하고,
    상기 방법은:
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 오직 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신하는 단계;
    상기 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여 연속적인 재정렬된 데이터를 생성하기 위해 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 수신된 데이터를 재정렬하는 단계; 및
    상기 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 모두에 상기 연속적인 재정렬된 데이터를 출력하는 단계로서, 상기 프로세싱 레인들의 연속적인 목적지 서브세트들은 대응하는 레지스터들에 상기 연속적인 재정렬된 데이터를 저장하는, 상기 연속적인 재정렬된 데이터를 출력하는 단계를 더 포함하는, 데이터를 프로세싱하는 방법.
  10. 제 9 항에 있어서,
    제어기 회로로, 상기 프로세싱 레인들의 목적지 서브세트의 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하는 단계를 더 포함하는, 데이터를 프로세싱하는 방법.
  11. 제 10 항에 있어서,
    상기 제어기 회로로, 상기 복수의 뱅크들 중 하나에 대한 뱅크 식별 및 오프셋에 기초하여 결정된 상기 뱅크 식별을 갖는 상기 뱅크들 중 하나 내의 프로세싱 레인의 레인 식별을 결정하는 단계를 더 포함하고,
    상기 대응하는 레지스터들이 저장할 수 있게 하는 단계는 결정된 상기 뱅크 식별 및 레인 식별에 기초하여 상기 프로세싱 레인들의 목적지 서브세트의 상기 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하는 단계를 포함하는, 데이터를 프로세싱하는 방법.
  12. 제 9 항에 있어서,
    상기 소스 서브세트로부터 데이터를 수신하는 단계는 단 하나의 뱅크로부터 데이터를 수신하는 단계를 포함하는, 데이터를 프로세싱하는 방법.
  13. 제 9 항에 있어서,
    재정렬하는 단계는 상기 명령에 의해 정의된 오프셋에 기초하여 상기 데이터를 재정렬하는 단계를 포함하는, 데이터를 프로세싱하는 방법.
  14. 제 9 항에 있어서,
    상기 프로세싱 레인들의 소스 서브세트를 포함하는, 상기 복수의 뱅크들 중의 뱅크를 멀티플렉서를 통해 상기 셔플러 회로에 선택적으로 커플링하는 단계; 및
    상기 재정렬된 데이터를 디멀티플렉서를 통해 상기 뱅크들에 브로드캐스트하는 단계를 더 포함하고,
    상기 디멀티플렉서의 각각의 출력은 상기 복수의 뱅크들의 각각의 뱅크에서 단 하나의 프로세싱 레인으로 출력하는, 데이터를 프로세싱하는 방법.
  15. 데이터를 프로세싱하기 위한 디바이스로서,
    제 1 반복에서, 입력 포트들을 통하여, 복수의 프로세싱 레인들 중 프로세싱 레인들의 소스 서브세트만의 각각의 프로세싱 레인으로부터 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 수신하는 수단으로서, 상기 프로세싱 레인들의 각각은 상기 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되고, 상기 프로세싱 레인들은 복수의 뱅크들로 그룹화되며, 상기 복수의 뱅크들의 각각의 뱅크는 상기 복수의 프로세싱 레인들 중의 하나 이상의 프로세싱 레인들을 포함하고, 프로세싱 레인들의 소스 서브세트는 상기 복수의 프로세싱 레인들보다 더 적은 프로세싱 레인들이고, 상기 프로세싱 레인들의 소스 서브세트의 제 1 프로세싱 레인은 제 1 데이터와 연관되고 상기 프로세싱 레인들의 소스 서브세트의 제 2 프로세싱 레인은 제 2 데이터와 연관되고, 데이터의 순서는 상기 데이터의 순서에서 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르도록 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인을 포함하는 상기 복수의 뱅크들 중의 뱅크에서 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인의 상대적 위치들에 기초하는, 상기 데이터를 수신하는 수단;
    상기 제 1 반복에서, 상기 제 1 및 제 2 프로세싱 레인들의 상대적 위치들에 기초하여 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여, 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하는 수단으로서, 상기 명령은 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르지 않고 상기 제 2 데이터가 재정렬된 데이터에 있도록 상기 프로세싱 레인들의 각각이 데이터를 어느 프로세싱 레인들에 출력해야 하는지를 명령하는, 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하는 수단; 및
    상기 제 1 반복에서, 복수의 포트들로, 상기 전체 스칼라 또는 벡터 값들을 포함하는 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하는 수단으로서, 상기 복수의 출력 포트들의 각각의 출력 포트는 상기 복수의 뱅크들의 각각의 뱅크에서의 단 하나의 프로세싱 레인으로 출력하도록 구성되고, 상기 프로세싱 레인들의 목적지 서브세트는 대응하는 레지스터들에 상기 재정렬된 데이터를 저장하고, 상기 프로세싱 레인들의 목적지 서브세트는 상기 복수의 프로세싱 레인들보다 더 적고, 상기 프로세싱 레인들의 목적지 서브세트 이외의 프로세싱 레인들은 상기 프로세싱 레인들의 목적지 서브세트 이외의 상기 프로세싱 레인들에 의해 수신되는 상기 재정렬된 데이터를 폐기하고, 상기 재정렬된 데이터를 출력하는 수단은, 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하는 수단을 포함하고, 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하는 수단은 상기 복수의 출력 포트들의 각각의 출력 포트가 상기 복수의 뱅크들의 각각의 뱅크의 개별적인 프로세싱 레인들에만 출력하는 수단을 포함하는, 상기 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하는 수단을 포함하고,
    상기 디바이스는:
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 오직 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신하는 수단;
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여 연속적인 재정렬된 데이터를 생성하기 위해 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 수신된 데이터를 재정렬하는 수단; 및
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 모두에 상기 연속적인 재정렬된 데이터를 출력하는 수단으로서, 상기 프로세싱 레인들의 연속적인 목적지 서브세트들은 대응하는 레지스터들에 상기 연속적인 재정렬된 데이터를 저장하는, 상기 연속적인 재정렬된 데이터를 출력하는 수단을 더 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  16. 제 15 항에 있어서,
    상기 프로세싱 레인들의 목적지 서브세트의 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하는 수단을 더 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  17. 제 16 항에 있어서,
    상기 복수의 뱅크들 중 하나에 대한 뱅크 식별 및 오프셋에 기초하여 결정된 상기 뱅크 식별을 갖는 상기 뱅크들 중 하나 내의 프로세싱 레인의 레인 식별을 결정하는 수단을 더 포함하고,
    상기 대응하는 레지스터들이 저장할 수 있게 하는 수단은 결정된 상기 뱅크 식별 및 레인 식별에 기초하여 상기 프로세싱 레인들의 목적지 서브세트의 상기 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하는 수단을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  18. 제 15 항에 있어서,
    상기 소스 서브세트로부터 데이터를 수신하는 수단은 단 하나의 뱅크로부터 데이터를 수신하는 수단을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  19. 제 15 항에 있어서,
    상기 재정렬하는 수단은 상기 명령에 의해 정의된 오프셋에 기초하여 상기 데이터를 재정렬하는 수단을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  20. 제 15 항에 있어서,
    그래픽스 프로세싱 유닛 (GPU) 을 더 포함하고,
    상기 GPU 는 상기 복수의 프로세싱 레인들을 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  21. 제 15 항에 있어서,
    상기 디바이스는:
    집적 회로;
    마이크로프로세서; 또는
    무선 통신 디바이스
    중 하나를 포함하는, 데이터를 프로세싱하기 위한 디바이스.
  22. 명령들을 포함하는 컴퓨터 판독가능 저장 매체로서,
    상기 명령들은 실행될 때, 데이터를 프로세싱하기 위한 디바이스의 셔플러 회로로 하여금:
    제 1 반복에서, 상기 셔플러 회로의 입력 포트들로, 복수의 프로세싱 레인들 중 프로세싱 레인들의 소스 서브세트만의 각각의 프로세싱 레인으로부터 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 수신하게 하는 것으로서, 상기 프로세싱 레인들의 각각은 상기 데이터를 프로세싱하기 위한 회로를 포함하고, 상기 프로세싱 레인들은 단일 명령 다중 데이터 (SIMD) 구조에서 구성되고, 상기 프로세싱 레인들은 복수의 뱅크들로 그룹화되며, 상기 복수의 뱅크들의 각각의 뱅크는 상기 복수의 프로세싱 레인들 중의 하나 이상의 프로세싱 레인들을 포함하고, 상기 프로세싱 레인들의 소스 서브세트는 상기 복수의 프로세싱 레인들보다 더 적은 프로세싱 레인들이고, 상기 프로세싱 레인들의 소스 서브세트의 제 1 프로세싱 레인은 제 1 데이터와 연관되고 상기 프로세싱 레인들의 소스 서브세트의 제 2 프로세싱 레인은 제 2 데이터와 연관되고, 데이터의 순서는 상기 데이터의 순서에서 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르도록 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인을 포함하는 상기 복수의 뱅크들 중의 뱅크에서 상기 제 1 프로세싱 레인 및 상기 제 2 프로세싱 레인의 상대적 위치들에 기초하는, 상기 데이터를 수신하게 하고;
    상기 제 1 반복에서, 상기 제 1 및 제 2 프로세싱 레인들의 상대적 위치들에 기초하여 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여, 상기 프로세싱 레인들의 소스 서브세트로부터 수신된 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하게 하는 것으로서, 상기 명령은 상기 제 2 데이터가 상기 제 1 데이터를 뒤따르지 않고 상기 제 2 데이터가 재정렬된 데이터에 있도록 상기 프로세싱 레인들의 각각이 데이터를 어느 프로세싱 레인들에 출력해야 하는지를 명령하는, 상기 전체 스칼라 또는 벡터 값들을 포함하는 데이터를 재정렬하게 하고; 그리고
    상기 제 1 반복에서, 상기 셔플러 회로의 복수의 출력 포트들로, 상기 전체 스칼라 또는 벡터 값들을 포함하는 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하게 하는 것으로서, 상기 복수의 출력 포트들의 각각의 출력 포트는 상기 복수의 뱅크들의 각각의 뱅크에서의 단 하나의 프로세싱 레인으로 출력하도록 구성되고, 상기 프로세싱 레인들의 목적지 서브세트는 대응하는 레지스터들에 상기 재정렬된 데이터를 저장하고, 상기 프로세싱 레인들의 목적지 서브세트는 상기 복수의 프로세싱 레인들보다 더 적고, 상기 프로세싱 레인들의 목적지 서브세트 이외의 프로세싱 레인들은 상기 프로세싱 레인들의 목적지 서브세트 이외의 상기 프로세싱 레인들에 의해 수신되는 상기 재정렬된 데이터를 폐기하고, 상기 셔플러 회로로 하여금 상기 재정렬된 데이터를 출력하게 하는 명령들이, 상기 셔플러 회로로 하여금 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하게 하는 명령들을 포함하고, 상기 셔플러 회로로 하여금 상기 복수의 뱅크들의 각각에 상기 재정렬된 데이터를 출력하게 하는 명령들이, 상기 복수의 출력 포트들의 각각의 출력 포트로 하여금 상기 복수의 뱅크들의 각각의 뱅크의 개별적인 프로세싱 레인들에만 출력하게 하는 명령들을 포함하는, 상기 재정렬된 데이터를 상기 프로세싱 레인들의 모두에 각각 출력하게 하고,
    상기 명령들은 상기 셔플러 회로로 하여금:
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 오직 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 데이터를 수신하게 하는 명령들;
    상기 제 1 반복에 이어지는 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 다른 하나에 데이터를 출력하도록 상기 프로세싱 레인들의 각각에 명령하는 명령에 응답하여 연속적인 재정렬된 데이터를 생성하기 위해 상기 프로세싱 레인들의 연속적인 소스 서브세트로부터 수신된 데이터를 재정렬하게 하는 명령들; 및
    상기 다수의 반복들의 각각의 반복에서, 상기 프로세싱 레인들의 모두에 상기 연속적인 재정렬된 데이터를 출력하게 하는 명령들로서, 상기 프로세싱 레인들의 연속적인 목적지 서브세트들은 대응하는 레지스터들에 상기 연속적인 재정렬된 데이터를 저장하는, 상기 연속적인 재정렬된 데이터를 출력하게 하는 명령들을 더 포함하는, 컴퓨터 판독가능 저장 매체.
  23. 제 22 항에 있어서,
    상기 셔플러 회로로 하여금:
    상기 프로세싱 레인들의 목적지 서브세트의 대응하는 레지스터들이 상기 재정렬된 데이터를 저장할 수 있게 하는 명령들을 더 포함하는, 컴퓨터 판독가능 저장 매체.
  24. 삭제
  25. 삭제
  26. 삭제
  27. 삭제
  28. 삭제
  29. 삭제
KR1020197000601A 2016-07-13 2017-05-19 Simd 아키텍처에서 레인 셔플을 위한 셔플러 회로 KR102118836B1 (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
US15/209,057 US10592468B2 (en) 2016-07-13 2016-07-13 Shuffler circuit for lane shuffle in SIMD architecture
US15/209,057 2016-07-13
PCT/US2017/033663 WO2018013219A1 (en) 2016-07-13 2017-05-19 Shuffler circuit for lane shuffle in simd architecture

Publications (2)

Publication Number Publication Date
KR20190028426A KR20190028426A (ko) 2019-03-18
KR102118836B1 true KR102118836B1 (ko) 2020-06-03

Family

ID=58779363

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020197000601A KR102118836B1 (ko) 2016-07-13 2017-05-19 Simd 아키텍처에서 레인 셔플을 위한 셔플러 회로

Country Status (7)

Country Link
US (1) US10592468B2 (ko)
EP (1) EP3485385B1 (ko)
JP (1) JP2019521445A (ko)
KR (1) KR102118836B1 (ko)
CN (1) CN109478175B (ko)
BR (1) BR112019000120A8 (ko)
WO (1) WO2018013219A1 (ko)

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10957095B2 (en) * 2018-08-06 2021-03-23 Intel Corporation Programmable ray tracing with hardware acceleration on a graphics processor
US10963300B2 (en) * 2018-12-06 2021-03-30 Raytheon Company Accelerating dataflow signal processing applications across heterogeneous CPU/GPU systems
US11397624B2 (en) * 2019-01-22 2022-07-26 Arm Limited Execution of cross-lane operations in data processing systems
US11294672B2 (en) 2019-08-22 2022-04-05 Apple Inc. Routing circuitry for permutation of single-instruction multiple-data operands
US11256518B2 (en) 2019-10-09 2022-02-22 Apple Inc. Datapath circuitry for math operations using SIMD pipelines
US20210349717A1 (en) * 2020-05-05 2021-11-11 Intel Corporation Compaction of diverged lanes for efficient use of alus
US20220197649A1 (en) * 2020-12-22 2022-06-23 Advanced Micro Devices, Inc. General purpose register hierarchy system and method
CN115061731B (zh) * 2022-06-23 2023-05-23 摩尔线程智能科技(北京)有限责任公司 混洗电路和方法、以及芯片和集成电路装置

Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040054877A1 (en) 2001-10-29 2004-03-18 Macy William W. Method and apparatus for shuffling data
US20130339664A1 (en) 2011-12-23 2013-12-19 Elmoustapha Ould-Ahmed-Vall Instruction execution unit that broadcasts data values at different levels of granularity
US20140059323A1 (en) 2012-08-23 2014-02-27 Qualcomm Incorporated Systems and methods of data extraction in a vector processor
US20140208067A1 (en) 2013-01-23 2014-07-24 International Business Machines Corporation Vector element rotate and insert under mask instruction

Family Cites Families (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CA2078912A1 (en) * 1992-01-07 1993-07-08 Robert Edward Cypher Hierarchical interconnection networks for parallel processing
US7343389B2 (en) 2002-05-02 2008-03-11 Intel Corporation Apparatus and method for SIMD modular multiplication
US9557994B2 (en) * 2004-07-13 2017-01-31 Arm Limited Data processing apparatus and method for performing N-way interleaving and de-interleaving operations where N is an odd plural number
US7761694B2 (en) * 2006-06-30 2010-07-20 Intel Corporation Execution unit for performing shuffle and other operations
GB2444744B (en) 2006-12-12 2011-05-25 Advanced Risc Mach Ltd Apparatus and method for performing re-arrangement operations on data
US8078836B2 (en) 2007-12-30 2011-12-13 Intel Corporation Vector shuffle instructions operating on multiple lanes each having a plurality of data elements using a common set of per-lane control bits
WO2013089749A1 (en) * 2011-12-15 2013-06-20 Intel Corporation Methods to optimize a program loop via vector instructions using a shuffle table and a mask store table
US9218182B2 (en) 2012-06-29 2015-12-22 Intel Corporation Systems, apparatuses, and methods for performing a shuffle and operation (shuffle-op)
US20140149480A1 (en) 2012-11-28 2014-05-29 Nvidia Corporation System, method, and computer program product for transposing a matrix
US9405539B2 (en) 2013-07-31 2016-08-02 Intel Corporation Providing vector sub-byte decompression functionality

Patent Citations (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20040054877A1 (en) 2001-10-29 2004-03-18 Macy William W. Method and apparatus for shuffling data
US20130339664A1 (en) 2011-12-23 2013-12-19 Elmoustapha Ould-Ahmed-Vall Instruction execution unit that broadcasts data values at different levels of granularity
US20140059323A1 (en) 2012-08-23 2014-02-27 Qualcomm Incorporated Systems and methods of data extraction in a vector processor
US20140208067A1 (en) 2013-01-23 2014-07-24 International Business Machines Corporation Vector element rotate and insert under mask instruction

Also Published As

Publication number Publication date
US10592468B2 (en) 2020-03-17
US20180018299A1 (en) 2018-01-18
JP2019521445A (ja) 2019-07-25
BR112019000120A8 (pt) 2023-01-31
BR112019000120A2 (pt) 2019-04-09
EP3485385B1 (en) 2020-04-22
WO2018013219A1 (en) 2018-01-18
CN109478175B (zh) 2022-07-12
EP3485385A1 (en) 2019-05-22
CN109478175A (zh) 2019-03-15
KR20190028426A (ko) 2019-03-18

Similar Documents

Publication Publication Date Title
KR102118836B1 (ko) Simd 아키텍처에서 레인 셔플을 위한 셔플러 회로
US8984043B2 (en) Multiplying and adding matrices
US8049760B2 (en) System and method for vector computations in arithmetic logic units (ALUs)
CA2693344C (en) Scheme for varying packing and linking in graphics systems
US10678541B2 (en) Processors having fully-connected interconnects shared by vector conflict instructions and permute instructions
US9513908B2 (en) Streaming memory transpose operations
KR20100122493A (ko) 프로세서
CN107533460B (zh) 紧缩有限冲激响应(fir)滤波处理器、方法、系统和指令
US9632783B2 (en) Operand conflict resolution for reduced port general purpose register
US20080244238A1 (en) Stream processing accelerator
US9350584B2 (en) Element selection unit and a method therein
US9569210B2 (en) Apparatus and method of execution unit for calculating multiple rounds of a skein hashing algorithm
JP2000322235A (ja) 情報処理装置
JP2010117806A (ja) 半導体装置、および、半導体装置によるデータ処理方法
JP2009282744A (ja) 演算器及び半導体集積回路装置
KR101863483B1 (ko) 중간 스토리지로서 파이프라인 레지스터들의 활용
JP2012128790A (ja) 演算処理装置
JP7507304B2 (ja) レジスタデータの消去
US20130086366A1 (en) Register File with Embedded Shift and Parallel Write Capability
US9916108B2 (en) Efficient loading and storing of data between memory and registers using a data structure for load and store addressing
JP2023533795A (ja) レジスタデータの消去
CN118057308A (zh) 指令处理优化方法及相关装置
US20110289339A1 (en) Semiconductor device
CN101615111A (zh) 一条指令完成一次反量化的微处理器实现方法

Legal Events

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