KR20230042498A - 데이터 전송 명령어를 위한 레지스터 어드레싱 정보 - Google Patents

데이터 전송 명령어를 위한 레지스터 어드레싱 정보 Download PDF

Info

Publication number
KR20230042498A
KR20230042498A KR1020237006640A KR20237006640A KR20230042498A KR 20230042498 A KR20230042498 A KR 20230042498A KR 1020237006640 A KR1020237006640 A KR 1020237006640A KR 20237006640 A KR20237006640 A KR 20237006640A KR 20230042498 A KR20230042498 A KR 20230042498A
Authority
KR
South Korea
Prior art keywords
register
array
instruction
data
data transfer
Prior art date
Application number
KR1020237006640A
Other languages
English (en)
Inventor
나이젤 존 스티븐스
옐레나 밀라노비치
데이비드 헤나 맨셀
Original Assignee
에이알엠 리미티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 에이알엠 리미티드 filed Critical 에이알엠 리미티드
Publication of KR20230042498A publication Critical patent/KR20230042498A/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/30145Instruction analysis, e.g. decoding, instruction word fields
    • G06F9/3016Decoding the operand specifier, e.g. specifier format
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3004Arrangements for executing specific machine instructions to perform operations on memory
    • G06F9/30043LOAD or STORE instructions; Clear instruction
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30105Register structure
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/3012Organisation of register space, e.g. banked or distributed register file

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Mathematical Physics (AREA)
  • Executing Machine-Instructions (AREA)
  • Complex Calculations (AREA)

Abstract

레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어가 제공된다. 데이터 전송 명령어에 응답하여, 명령어 디코딩 회로부(30)는 레지스터 저장소의 타깃 부분으로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하도록 프로세싱 회로부를 제어한다. 레지스터 어드레싱 정보는 적어도, 기준 값을 저장하기 위한 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하며, 즉시 값은 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 기준 값에 가산될 값을 표현한다. 이것은, 가변적인 데이터 구조 크기들에 대해 스케일링가능한 코드를 지원하고 루프 언롤링을 지원하는 명령어 세트 아키텍처를 제공하는 데 유용할 수 있다.

Description

데이터 전송 명령어를 위한 레지스터 어드레싱 정보
본 발명은 데이터 프로세싱의 분야에 관한 것이다.
데이터 전송 명령어들은 데이터 프로세싱에서 레지스터 저장소로의 또는 레지스터 저장소로부터의 데이터의 전송을 제어하기 위해 사용될 수 있다.
적어도 일부 예들은 장치를 제공하고, 상기 장치는, 명령어들을 디코딩하기 위한 명령어 디코딩 회로부; 데이터를 저장하기 위한 레지스터 저장소; 및 레지스터 저장소의 적어도 하나의 레지스터에 기입될 프로세싱 결과를 생성하기 위해, 명령어 디코딩 회로부에 의해 디코딩된 명령어에 응답하여, 데이터 프로세싱을 수행하기 위한 프로세싱 회로부를 포함하고, 여기서, 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어에 응답하여, 명령어 디코딩 회로부는 레지스터 저장소의 타깃 부분으로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하기 위해 프로세싱 회로부를 제어하도록 구성되고, 레지스터 어드레싱 정보는 적어도, 기준 값을 저장하기 위한 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하고, 즉시 값은 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 기준 값에 가산될 값을 표현한다.
적어도 일부 예들은 방법을 제공하고, 상기 방법은, 명령어를 디코딩하는 단계; 및 디코딩된 명령어에 응답하여, 레지스터 저장소의 적어도 하나의 레지스터에 기입될 프로세싱 결과를 생성하기 위해 데이터 프로세싱을 수행하도록 프로세싱 회로부를 제어하는 단계를 포함하고, 여기서, 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어에 응답하여, 프로세싱 회로부는 레지스터 저장소의 타깃 부분으로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하도록 제어되고, 레지스터 어드레싱 정보는 적어도, 기준 값을 저장하기 위한 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하며, 즉시 값은 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 기준 값에 가산될 값을 표현한다.
타깃 코드의 명령어들의 실행을 위한 명령어 실행 환경을 제공하도록 호스트 데이터 프로세싱 장치를 제어하기 위한 컴퓨터 프로그램으로서, 상기 컴퓨터 프로그램은, 디코딩된 명령어들에 대응하는 프로세싱 동작들을 수행하도록 호스트 데이터 프로세싱 장치를 제어하기 위해 타깃 코드의 명령어들을 디코딩하기 위한 명령어 디코딩 프로그램 로직; 및 타깃 코드와 연관된 타깃 명령어 세트 아키텍처의 레지스터 저장소를 에뮬레이팅하기 위해 호스트 데이터 프로세싱 장치의 호스트 저장소에 레지스터 에뮬레이팅 데이터 구조를 유지하기 위한 레지스터 에뮬레이팅 프로그램 로직을 포함하고, 여기서, 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어에 응답하여, 명령어 디코딩 프로그램 로직은 레지스터 저장소의 타깃 부분에 대응하는 레지스터 에뮬레이팅 데이터 구조의 위치들로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하기 위해 호스트 데이터 프로세싱 장치를 제어하도록 구성되고, 레지스터 어드레싱 정보는 적어도, 기준 값을 저장하기 위한 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하며, 즉시 값은 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 기준 값에 가산될 값을 표현한다.
적어도 일부 예들은 전술한 컴퓨터 프로그램을 저장하는 저장 매체를 제공한다. 저장 매체는 일시적 저장 매체 또는 비일시적 저장 매체일 수 있다.
본 기법의 추가의 태양들, 특징들 및 이점들은 첨부 도면과 관련하여 읽혀질 예들의 하기의 설명으로부터 명백해질 것이다.
도 1은 행렬 프로세싱을 지원하는 데이터 프로세싱 장치의 제1 예를 개략적으로 예시한다.
도 2a 내지 도 2d는 행렬 프로세싱을 지원하는 데이터 프로세싱 장치의 제2 예를 도시한다.
도 3은 행렬 곱셈 연산이 등가의 결과를 생성하기 위해 어떻게 외적 연산(outer product operation)들로 분할될 수 있는지를 예시한다.
도 4는 결과로서 데이터의 2차원(2D) 어레이를 생성하기 위해 한 쌍의 벡터 피연산자들에 대해 외적 연산을 수행하기 위한 외적 엔진의 예를 도시한다.
도 5는 벡터 피연산자들을 저장하기 위한 벡터 레지스터들 및 2D 어레이의 데이터들을 저장하기 위한 어레이 레지스터들을 포함하는, 프로세싱 장치의 아키텍처적 레지스터(architectural register)들의 예를 도시한다.
도 6은 어레이 레지스터들의 물리적 구현예의 일례를 도시한다.
도 7 내지 도 11은 어레이 레지스터들의 물리적 저장 용량이 가변적인 수의 아키텍처적 어레이 레지스터들로 어떻게 논리적으로 파티셔닝될 수 있는지를 예시한다.
도 12는 어레이 레지스터 저장소와 메모리 사이에서 2D 어레이의 데이터의 일부를 전송하기 위한 로드/저장 데이터 전송 명령어의 인코딩의 예를 예시한다.
도 13은 데이터 전송 명령어의 명령어 인코딩의 결합 필드를 사용하여 어레이 식별자 및 즉시 값을 인코딩하는 예를 예시한다.
도 14는 도 12의 데이터 전송 명령어를 사용하는 프로그램 코드의 예를 도시한다.
도 15는 어레이 레지스터와 벡터 레지스터 사이에서 2D 어레이의 데이터의 일부를 전송하기 위한, 레지스터 이동 데이터 전송 명령어의 예를 예시한다.
도 16은 명령어들을 프로세싱하는 방법을 도시하는 흐름도이다.
도 17은 사용될 수 있는 시뮬레이터의 예를 도시한다.
데이터 프로세싱 장치는 명령어들을 디코딩하기 위한 명령어 디코딩 회로부 및 디코딩된 명령어들에 응답하여 데이터 프로세싱을 수행하기 위한 프로세싱 회로부를 가질 수 있다. 데이터를 저장하기 위해 레지스터 저장소가 제공될 수 있다. 레지스터 저장소는 프로세싱 회로부에 의해 프로세싱하기 위한 피연산자들을 제공하는 데 사용될 수 있다. 프로세싱 회로부가 명령어에 응답하여 프로세싱 결과를 생성할 때, 프로세싱 결과는 레지스터 저장소의 적어도 하나의 레지스터에 기입될 수 있다.
레지스터 저장소로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 명령어가 제공된다. 데이터 전송 명령어에 응답하여, 명령어 디코딩 회로부는 데이터 전송 동작을 수행하도록 프로세싱 회로부를 제어한다. 데이터 전송 동작은 레지스터 저장소의 타깃 부분으로 또는 그로부터 데이터를 전송하는 것을 포함한다. 데이터 전송 명령어는 레지스터 저장소의 타깃 부분을 식별하는 레지스터 어드레싱 정보를 특정한다.
전형적인 데이터 전송 명령어들에서, 레지스터 저장소의 타깃 부분으로서 사용할 레지스터는 명령어 인코딩 내의 레지스터 필드에 의해 식별될 수 있으며, 여기서 레지스터 필드 내의 값은 그에/그로부터 데이터가 전송될 아키텍처적 레지스터를 직접 특정하는 식별자이다.
그러나, 아래에서 논의되는 예들에서, 레지스터 어드레싱 정보는 적어도 기준 레지스터 식별자 및 즉시 값을 포함한다. 기준 레지스터 식별자는 기준 값을 저장하기 위한 레지스터 저장소의 기준 레지스터를 식별하고, 즉시 값은 데이터 전송 명령어의 인코딩 시에 직접 특정되고, 메모리로 데이터가 전송될 그리고 메모리로부터의 데이터가 전송될 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 기준 값에 가산될 값을 표현한다.
기준 레지스터 및 즉시 값을 사용하여 레지스터 어드레싱 정보를 정의하는 이러한 접근법이 명령어 세트 아키텍처 설계 분야의 당업자에게는 반직관적인 것으로 보일 것이다. 기준 레지스터 및 즉시 값 기반 어드레싱이 메모리 어드레싱을 위해서는 알려져 있을 수 있지만, 레지스터 어드레싱을 위해서는 불필요한 것으로 보일 것인데, 그 이유는, 데이터 전송 시에 액세스될 특정 레지스터들이 실행될 프로그램 코드의 컴파일러에 의해 직접 선택될 수 있고 그에 따라 기준 레지스터에 대한 간접적인 참조를 사용할 필요가 없다고 예상될 것이기 때문이다. 그러나, 본 발명자들은, 레지스터 저장소의 타깃 부분을 선택하기 위한 색인을 생성하기 위해 기준 값을 제공하는 데 기준 레지스터를 사용하는 레지스터 어드레싱 정보가, 컴파일러들이 스케일링가능한 데이터 저장소 크기들에 동적으로 적응할 수 있는 코드를 생성할 수 있게 하는 데 유용할 수 있다는 것을 인식했다.
또한, 색인 값을 생성할 때 기준 값에 가산될 오프셋을 제공하는 데 즉시 값을 사용하는 것은 컴파일러들이 프로그램 루프들의 반복을 제어하는 오버헤드를 감소시키는 것을 도울 수 있는 루프 언롤링(loop unrolling)이라고 불리는 기법을 사용할 수 있게 하는 데 유용할 수 있다. 루프의 각각의 반복은 루프 카운터 또는 데이터 전송 명령어의 기준 레지스터 내의 기준 값과 같은 다른 변수들을 증분시키기 위한 명령어들과 같은 루프 제어 명령어들을 실행시키는 데 있어서 그리고 루프 종료 조건이 충족되는지를 테스트하는 데 있어서 수행 비용을 초래할 수 있다. 루프 언롤링을 수행함으로써, 컴파일러는 프로그래머에 의해 작성된 고레벨 코드에 포함된 2회 이상의 루프 반복들의 그룹을 고레벨 코드 루프 내의 2회 이상의 반복들과 동일한 연산들을 수행하는 컴파일링된 코드 내의 단일 루프 반복에 맵핑될 수 있다. 이것은 고레벨 코드 내의 주어진 수의 루프 반복들을 위해 루프 제어 명령어들이 실행될 필요가 있는 횟수를 감소시키고, 더 큰 명령어 레벨 병렬성을 가능하게 하는데, 그 이유는, 고레벨 코드의 후속 루프 반복에서부터의 일부 명령어들이 이전 반복의 명령어들과 병렬로 실행될 수 있기(그들이 독립적인 경우) 때문이며, 반면에, 루프가 컴파일링된 코드 내의 루프 반복당 단일의 고레벨 루프 반복을 구현하는 코드로 컴파일링된 경우에는, 고레벨 루프의 후속 반복에 대한 명령어들이 이전 반복에서부터의 명령어들에 종속적일 수 있으므로, 가능한 병렬성의 양이 감소될 수 있다. 기준 레지스터 및 즉시 값을 사용하여 레지스터 어드레싱 정보를 정의하는 것은 루프 언롤링을 지원하는 데 유용하며, 그 이유는, 컴파일링된 코드 내의 단일 루프 반복으로 결합된 고레벨 코드 루프의 언롤링되는 버전들의 개별 반복들에 대응하는 상이한 데이터 전송 명령어들에 대한 상이한 오프셋들을 기준 레지스터 내의 값에 가산하는 데 즉시 값을 사용할 수 있기 때문이다.
따라서, 요약하면, 전술된 바와 같이 기준 레지스터 식별자 및 즉시 값을 사용하여 정의된 레지스터 어드레싱 정보를 갖는 데이터 전송 명령어는, 상이한 데이터 저장 크기들로 스케일링할 수 있고 컴파일러들이 루프 언롤링을 수행할 수 있게 할 수 있는 스케일링가능한 코드를 지원하는 데 특히 유용할 수 있다.
즉시 값은 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 기준 값에 가산될 값을 표현한다. 명령어의 일부 구현예들에서, 기준 값에 가산될 값은 즉시 값으로 특정된 정확한 값일 수 있다. 다른 예들에서, 즉시 값은 가산될 값을 직접 특정하지 않는 인코딩을 가질 수 있다. 예를 들어, 즉시 값은 주어진 상수 Z의 배수로서 가산될 값을 특정할 수 있으며, 이에 따라, Z와 즉시 값의 적(product)이 기준 값에 가산되게 할 수 있다.
또한, 일부 예들에서, 색인 값은 기준 값과 즉시 값으로 표현된 값의 합과 같을 수 있다. 다른 예들에서, 색인 값은 기준 값과 즉시 값으로 표현된 값의 가산에 따를 수 있지만, 기준 값과 즉시 값으로 표현된 값의 합과 정확히 같지는 않을 수 있다. 예를 들어, 기준 값의 범위를 벗어난 값들을 처리하기 위해, 일부 경우에, 색인 값은, 기준 값과 즉시 값으로 표현된 값의 합을 결과 색인이 요구되는 범위 내에 있음을 보장하기 위해 선택된 주어진 값으로 나눈 후의 나머지 값에 대응할 수 있다(즉, 색인 값은 합을 주어진 값으로 나눈 후의 나머지임).
기준 레지스터 식별자 및 즉시 값을 사용하는 레지스터 어드레싱 정보의 인코딩은, 데이터 전송 시에 액세스될 정수 레지스터, 부동 소수점 레지스터, 벡터 레지스터, 또는 다른 유형의 레지스터 저장소를 선택하는 데 색인 값을 사용하는 데이터 전송 명령어들을 포함하는, 임의의 형태의 데이터 전송 명령어에 적용될 수 있다.
그러나, 하나의 예에서, 레지스터 저장소는 적어도 하나의 2차원(2D) 어레이의 데이터를 저장하기 위한 2D 어레이 레지스터 저장소를 포함하고, 레지스터 저장소의 타깃 부분은 2D 어레이 레지스터 저장소의 타깃 부분을 포함한다. 따라서, 이러한 예에서, 데이터 전송 명령어는 어레이 레지스터 저장소로 또는 그로부터 2D 어레이의 데이터의 적어도 일부를 전송하기 위한 어레이 데이터 전송 명령어일 수 있다. 행렬들과 같은 2D 어레이들은 광범위한 프로세싱 응용들에 유용하다. 하나의 예는 기계 학습 분야에 있으며, 여기서 행렬 곱셈이 많은 유형들의 기계 학습 모델들에 대한 추론 및 훈련 알고리즘들의 근간일 수 있지만, 다른 응용예들은 또한 증강 현실, 가상 현실, 컴퓨터 비전(computer vision), 컴퓨터를 이용한 사진기법(computational photography), 과학 시뮬레이션, 디지털 신호 프로세싱 등의 분야에서와 같이 행렬 산술연산을 사용할 수 있다. 따라서, 행렬 산술연산에 대한 지원은 앞으로 프로세싱 응용예들의 중요한 특징이 될 가능성이 있으며, 따라서 2D 어레이들의 데이터를 저장하기 위해 설계된 2D 어레이 레지스터 저장소를 제공함으로써, 이것은 그러한 응용예들을 지원하는 데 유용할 수 있다. 용어 "타일"은 아래의 일부 인스턴스(instance)에서 2D 어레이의 데이터를 지칭하기 위해 사용된다.
기준 레지스터 식별자 및 즉시 값을 포함하는 레지스터 어드레싱 정보를 갖는 데이터 전송 명령어는 2D 어레이 레지스터 저장소를 지원하는 시스템들에 특히 유용할 수 있는데, 그 이유는, 2D 어레이들의 데이터를 프로세싱하는 것을 수반하는 응용예들이 어레이 구조의 2차원 내에서 어레이 크기들이 바뀌는 것을 처리하기 위해 스케일링가능해질 필요가 있을 수 있기 때문이다. 기준 레지스터 식별자 및 즉시 값을 사용하여 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정함으로써, 가변적인 어레이 치수에 따라 어느 레지스터들이 액세스되는지를 바꿀 수 있는 프로그램 루프들을 정의하는 것이 가능하며, 이는 2D 어레이들의 데이터를 프로세싱하는 데 유용할 수 있다.
하나의 예에서, 데이터 전송 명령어에 응답하여 수행되는 데이터 전송 동작은 2D 어레이 레지스터 저장소의 타깃 부분으로 또는 그로부터 타깃 2D 어레이의 하위 부분을 전송하는 것을 포함할 수 있으며, 여기서 기준 값 및 즉시 값으로부터 생성된 색인 값은 타깃 2D 어레이 중 어느 특정 하위 부분이 전송될 것인지를 식별할 수 있다. 예를 들어, 기준 값 및 즉시 값은 타깃 2D 어레이의 각각의 하위 부분들에 대해 반복하는 프로그램 루프들을 정의하는 데 사용될 수 있다.
예를 들어, 색인 값은, 하위 부분으로서, 타깃 2D 어레이 내에서 동일한 수직 포지션을 공유하는 단일 수평 그룹의 요소들 또는 타깃 2D 어레이 내에서 동일한 수평 포지션을 공유하는 단일 수직 그룹의 요소들을 식별할 수 있다. 다른 구현예들은 단일 데이터 전송 명령어가 타깃 2D 어레이의 다수의 수평 그룹들의 요소들 또는 다수의 수직 그룹들의 요소들을 전송할 수 있게 할 수 있다. 어느 방식으로든, 기준 레지스터 및 즉시 값을 사용하여 타깃 2D 어레이의 어느 하위 부분이 전송될지를 선택함으로써, 이것은 소프트웨어가 상이한 어레이 치수들(상이한 수의 행들 또는 열들)로 더 쉽게 스케일링가능해지게 한다.
본 출원에서, 용어 "수평" 및 "수직"은 2D 어레이 레지스터 저장소의 관점에서 보여지는 바와 같은 2D 어레이의 "행" 및 "열" 방향들을 지칭하는 데 사용된다. 더 정확히 말하자면, 계산(computation) 명령어들 또는 메모리로/로부터 2D 어레이를 전송하기 위한 명령어들이 2D 어레이 내의 각각의 요소들의 논리적 포지션을 고려한다는 의미에서, "수평" 및 "수직" 방향들은 2D 어레이 내의 요소들의 논리적 배열을 지칭한다. 그러나, 레지스터 저장소의 물리적 레이아웃은 저장 요소들의 2D 그리드에 반드시 배열되지 않을 수 있다는 것을 이해할 것이다. 집적 회로 레이아웃 내에서 편리한 임의의 포지션에 저장 요소들을 물리적으로 배치하는 것이 가능하다.
2D 어레이 레지스터 저장소에 저장된 것과 같은 2D 어레이와 연관된 "수평" 및 "수직" 방향들은 메모리에 저장된 행렬 데이터 구조들의 동일한 행/열 레이아웃에 반드시 대응하지는 않을 수 있다. 행 우선 순서(row-major order) 또는 열 우선 순서(column-major order)와 같은 상이한 레이아웃들로 메모리에 행렬 데이터를 저장하는 것이 가능하다. 행 우선 순서에서, 행렬 행의 인접한 요소들은 메모리 내에서 연속적인 어드레스들에 저장되지만, 행렬 열의 인접한 요소들은 메모리 내에서 스트라이드 값(stride value)만큼 오프셋된다. 반대로, 열 우선 순서에서, 행렬 열의 인접한 요소들은 메모리 내에서 연속적인 어드레스들에 저장되지만, 행렬 행의 인접한 요소들은 메모리 내에서 스트라이드 값만큼 오프셋된다.
따라서, 데이터가 메모리로부터 판독될 때, 그것은 행 우선 순서(이에 따라 레지스터 저장소로 판독되는 연속적인 메모리 요소들은 메모리 내의 기본 행렬 구조의 행 또는 행의 일부를 표현함) 또는 열 우선 순서(이에 따라 판독되는 연속적인 메모리 요소들은 열 또는 열의 일부를 표현함)일 수 있지만, 어느 방식이든, 요소들을 2D 어레이 레지스터 저장소의 수평 그룹의 요소들 또는 수직 그룹의 요소들에 기입하는 것이 가능하다.
따라서, 2D 어레이 레지스터 저장소 내의 수평 그룹의 요소들은 메모리 내의 행렬 구조로부터의 요소들의 행 또는 열(또는 메모리 내의 행렬 구조 내의 요소들의 행 또는 열에 후속적으로 라이트백(write back)될 수 있는 새롭게 계산된 요소들의 세트)을 표현할 수 있다는 것을 이해할 것이다. 유사하게, 2D 어레이 레지스터 저장소 내의 수직 그룹의 요소들은 메모리 내에 저장된 기본 행렬 구조로부터의 요소들의 행 또는 열을 표현할 수 있다(또는 그러한 행 또는 열에 라이트백될 새롭게 계산된 값들을 표현할 수 있음). 혼란을 회피하기 위해, 용어 "행" 및 "열"은 메모리 내의 행렬 요소들의 배열을 지칭하는 데 사용될 것이고, "수평 그룹" 및 "수직 그룹"은 2D 어레이 레지스터 저장소에 저장된 2D 어레이 내의 요소들의 배열을 지칭하는 데 사용될 수 있다.
일부 구현예들에서, 데이터 전송 명령어는 수평/수직 방향들 중 하나로 2D 어레이 레지스터 저장소로/로부터 데이터를 전송하는 것만을 지원할 수 있다. 예를 들어, 일부 구현예들은 수평 방향으로 2D 어레이 레지스터 저장소에 액세스하는 것만을 지원할 수 있다. 이것은 2D 어레이 레지스터 저장소에 액세스하기 위한 회로 로직을 단순화할 수 있다.
그러나, 다른 예들에서, 명령어 세트 아키텍처(instruction set architecture, ISA)는 수평 및 수직 방향들 둘 모두로 2D 어레이 레지스터 저장소를 판독/기입하는 것을 지원할 수 있다. 따라서, 데이터 전송 명령어는 수평 방향 및 수직 방향 중 하나를 식별하는 어레이 방향 식별자를 특정할 수 있다. 어레이 방향 식별자가 수평 방향을 식별할 때, 타깃 2D 어레이의 하위 부분은 색인 값에 의해 식별된 타깃 2D 어레이의 적어도 하나의 수평 그룹의 요소들을 포함하고, 각각의 수평 그룹의 요소들은 타깃 2D 어레이 내에서 동일한 수직 포지션을 공유하는 요소들을 포함한다. 어레이 방향 식별자가 수직 방향을 식별할 때, 타깃 2D 어레이의 하위 부분은 색인 값에 의해 식별된 타깃 2D 어레이의 적어도 하나의 수직 그룹의 요소들을 포함하고, 각각의 수직 그룹의 요소들은 타깃 2D 어레이 내에서 동일한 수평 포지션을 공유하는 요소들을 포함한다. 이것은 데이터를 메모리로부터 2D 어레이 레지스터 저장소로 전송하는 포인트에서 또는 데이터를 2D 어레이 레지스터 저장소로부터 메모리로 다시 전송할 때 행렬의 즉각적인 전위(on-the-fly transposition)를 가능하게 하는 데 유용할 수 있으며, 이는 행렬 메모리 레이아웃들이 계산의 요건들에 부합하지(compatible) 않는 응용예들에 대한 성능을 개선시키는 것을 돕는데, 그 이유는, 그러한 즉각적인 전위가 메모리와 레지스터 저장소 사이에서 행렬 데이터를 전송할 때 요소들의 위치를 이리저리 바꾸기 위해 많은 수의 로드/저장 명령어들 또는 벡터 치환 명령어들을 실행하는 것보다 훨씬 더 빠를 수 있기 때문이다.
데이터 전송 명령어는 소정의 고정 데이터 요소 크기로 정의된 2D 어레이들을 핸들링하는 실시예들에서 사용될 수 있으며, 여기서 요소 크기는 2D 어레이의 하나의 단일 요소의 비트 수를 지칭한다.
그러나, 데이터 전송 명령어가 상이한 정밀도 레벨들의 데이터 값들을 사용하여 정의된 행렬들을 프로세싱할 수 있는 응용예들에 사용될 수 있도록, 가변적인 데이터 요소 크기들을 지원하는 것이 유용할 수 있다. 따라서, 데이터 전송 명령어는 프로세싱 회로부에 의해 지원되는 둘 이상의 데이터 요소 크기들 중에서 데이터 전송 명령어에 대해 특정된 현재 데이터 요소 크기 E와 연관될 수 있다.
현재 데이터 요소 크기 E는 데이터 전송 명령어에 대해 다양한 방식으로 특정될 수 있다. 일부 경우에, 데이터 전송 명령어 자체의 파라미터가 현재 데이터 요소 크기 E를 특정할 수 있다. 예를 들어, 데이터 전송 명령어의 명령어 인코딩의 일부가 현재 데이터 요소 크기 E를 특정할 수 있다. 다른 옵션은, 제어 레지스터 또는 다른 저장 위치에 저장된 제어 정보가 현재 데이터 요소 크기 E를 정의할 수 있는 것이다. 이러한 경우, 데이터 전송 명령어 자체의 인코딩은 현재 데이터 요소 크기 E를 식별하는 어떠한 비트도 포함할 필요가 없다. 데이터 전송 명령어의 실행 전에 실행된 명령어를 사용하여, 후속 데이터 전송 명령어들에 사용될 현재 데이터 요소 크기 E를 설정하기 위한 값을 제어 저장 위치 내에 설정할 수 있다. 일부 접근법들은 또한 모드 접근법을 사용할 수 있으며, 여기서 사용되는 현재 데이터 요소 크기는, 프로세싱 회로부가 데이터 전송 명령어를 실행하고 있을 때 동작 중인 동작 모드에 종속한다. 따라서, 주어진 데이터 전송 명령어에 대한 현재 데이터 요소 크기 E가 식별될 수 있는 다양한 방식들이 있다는 것이 이해될 것이다.
가변적인 데이터 요소 크기를 지원하는 구현예들에서, 레지스터 어드레싱 정보의 즉시 값은 데이터 전송 명령어의 명령어 인코딩 중 소정 비트 수 Nimm을 사용하여 인코딩될 수 있으며, 여기서 Nimm은 현재 데이터 요소 크기 E에 따라 가변적이며, 이때, Nimm은 E가 감소함에 따라 증가한다. 이러한 접근법은, 데이터 전송 명령어에 응답하여 수행되는 데이터 전송 시에 타깃 2D 어레이의 어느 하위 부분이 전송될지를 식별하는 색인을 생성하는 데 즉시 값을 사용하는 경우에 특히 유용할 수 있다. 데이터 요소 크기가 감소함에 따라, 이것은, 더 많은 수의 데이터 요소들이 주어진 크기의 레지스터 내에 피팅(fit)할 수 있고, 이는 수평/수직 방향들 중 레지스터의 폭에 대응하는 제1 방향으로 더 큰 치수를 갖는 2D 어레이를 지원한다는 것을 의미한다. 요소 크기가 감소함에 따라 즉시 값의 크기를 증가시킴으로써, 이것은 타깃 2D 어레이의 더 많은 수의 하위 부분들이 선택될 수 있게 하여, 반대 수직/수평 방향의 2D 어레이의 제2 차원이 제1 방향으로의 스케일링과 비슷한 방식으로 스케일링될 수 있게 한다. 데이터 요소 크기가 더 작을 때보다 데이터 요소 크기가 더 클 때 더 적은 비트 수를 사용하여 즉시 값이 인코딩되도록 가변적인 길이를 갖는 즉시 값의 인코딩을 사용함으로써, 더 큰 요소 크기들에서, 이것은 다른 파라미터들을 인코딩하는 데 사용될 수 있는 일부 여분의 비트들을 확보(free up)할 수 있다.
하나의 예에서, 2D 어레이 레지스터 저장소는 소정 수 NR의 벡터 레지스터들을 포함할 수 있으며, 이때, 각각의 벡터 레지스터는 소정 비트 수 MVL(MVL은 단일 벡터 레지스터의 "벡터 길이"를 나타냄)을 포함한다. 2D 어레이 레지스터 저장소를 한 그룹의 벡터 레지스터들로서 구현함으로써, 이것은 프로세서의 마이크로 아키텍처의 구현을 단순화시킬 수 있는데, 그 이유는, 1D 어레이들의 데이터를 벡터들로서 저장하는 데 사용되는 벡터 레지스터들을 제공하기 위한 기법들이 2D 어레이 레지스터 저장소를 구현하는 데 재사용될 수 있기 때문이다. 예를 들어, 단일 2D 어레이의 데이터는 한 그룹의 벡터 레지스터들 내에 표현될 수 있고, 이때, 그룹 내의 각각의 벡터 레지스터는 2D 어레이의 상이한 수평 (또는 수직) 그룹의 요소들을 저장하고, 그 그룹의 벡터 레지스터들은 전체적으로 다수의 그러한 그룹들의 요소들을 저장하여 2D 어레이를 형성한다.
일부 구현예들에서, 프로세싱 회로부 및 명령어 디코딩 회로부에 의해 지원되는 ISA는 2D 어레이 레지스터 저장소의 벡터 레지스터들에 대한 가변적인 벡터 길이 MVL를 지원할 수 있다. 이것은, 마이크로 아키텍처적 설계자들이, 더 높은 성능을 우선순위화할지 또는 더 높은 에너지 효율을 우선순위화할지와 같은 설계 선호도들에 따라, 주어진 마이크로 아키텍처적 프로세서 구현예에 대해 사용되는 레지스터들의 크기를 바꿀 수 있게 한다. 예를 들어, ISA는 최소 벡터 길이 MVLmin에서부터 최대 벡터 길이 MVLmax까지 확장되는 벡터 길이들의 범위를 지원할 수 있다.
소프트웨어 개발을 단순화하기 위해, 프로그램 코드가 상이한 벡터 길이들 MVL를 사용하여 일정 범위의 프로세서들에 대해 올바르게 동작할 수 있도록, 벡터 길이의 그러한 차이들을 고려하기 위해서 프로그램 코드의 어떠한 수정도 요구하지 않으면서, ISA를 설계하는 것이 유용할 수 있다. 이러한 특성은 프로그램 코드가 벡터 길이 애그노스틱(agnostic)하다는 것으로 지칭될 수 있다. 예를 들어, ISA는 주어진 구현예에 대해서는 정적일 수 있지만 프로세서 구현예들 사이에서는 다양할 수 있는, 현재 플랫폼 상에 구현된 벡터 길이를 나타내는 레지스터를 지원할 수 있고, 프로그램 코드는, 구현된 벡터 길이 MVL에 따라 루프 반복당 얼마나 많은 데이터가 프로세싱되는지를 바꾸도록 프로그램 코드 루프들을 제어할 때, 그 레지스터를 참조할 수 있다. 따라서, 주어진 양의 프로세싱할 데이터를 갖는 프로그램은 더 짧은 길이를 구현하는 마이크로 아키텍처 상에서보다 더 긴 벡터 길이를 구현하는 마이크로 아키텍처 상에서 더 적은 루프 반복들을 사용하여 그 데이터를 프로세싱할 수 있지만, 두 경우 모두에서, (성능 레벨들은 상이하지만) 동일한 기능적 프로세싱 연산을 수행하여 동일한 계산 결과들을 생성한다.
즉시 값은 2D 어레이의 어느 하위 부분이 전송될 것인지를 표현할 수 있다. 벡터 길이 MVL이 증가함에 따라 벡터 레지스터 내에 피팅할 수 있는 요소들의 수가 증가하므로, (2D 어레이의 다른 차원이 유사하게 스케일링될 수 있게 하기 위해) 최대 벡터 길이 MVLmax가 구현될 때, 하나의 벡터 레지스터 내에 피팅할 수 있는 요소들의 수에 대응하는 벡터 레지스터들의 수를 구별할 수 있게 하는 데 충분한 비트 수로 즉시 값이 제공되어야 한다고 고려될 수 있다.
그러나, 본 발명자들은, 실제로, 즉시 값에 대한 별개의 인코딩들의 수가 MVLmin /E(ISA에 의해 지원되는 최소 벡터 길이 MVLmin의 벡터 레지스터 내의 요소들의 수)보다 더 큰 경우, 이것은 프로그램 코드가 벡터 길이 애그노스틱하지 않을 것임을 의미할 것인데, 그 이유는, MVLmin /E보다 더 큰 색인을 특정하는 명령어들이 최소 벡터 길이 MVLmin을 구현하는 마이크로 아키텍처 상에서는 올바르게 동작할 수 없기 때문이라는 것을 인식했다. 따라서, 벡터 길이 애그노스티시즘을 위해 설계된 ISA들에서, 더 큰 즉시 값들을 제공하기 위해 명령어 인코딩의 추가적인 비트들을 확장할 필요는 없다. 별개의 인코딩들의 수가 MVLmin/E 이하가 되도록 즉시 값 인코딩의 비트 수를 제한함으로써, 이것은 다른 파라미터들을 위한 인코딩 비트 공간을 확보하고, 벡터 길이 애그노스티시즘에 대한 지원을 개선시킨다.
물론, 전술한 데이터 전송 명령어가 벡터 길이 애그노스티시즘이 우선순위가 아닌 ISA에서 구현되는 경우, 더 큰 값들의 즉시 값을 지원하는 것이 여전히 가능할 것이다.
일부 예들에서, 레지스터 어드레싱 정보의 기준 값 및 즉시 값에 기초하여 생성된 색인 값은 데이터 전송이 수행될 레지스터 저장소의 타깃 부분을 선택하는 데 사용되는 레지스터 식별 정보의 유일한 항목일 수 있다. 예를 들어, 색인 값은 전술한 2D 어레이 레지스터 저장소 내의 개별 벡터 레지스터의 레지스터 식별자를 특정할 수 있다. 이러한 접근법에서, 한 그룹의 벡터 레지스터들이 전체적으로 행렬과 같은 2D 어레이의 데이터를 형성하는 것으로 간주될 수 있지만, 명령어들은 그 그룹의 요소들을 저장하는 데 사용되는 벡터 레지스터의 특정 레지스터 식별자를 특정함으로써 어레이의 개별 수평/수직 그룹들의 요소들을 참조할 수 있다.
그러나, 소정의 프로그래밍 기법들은 개별 수평/수직 그룹들의 요소들보다는 다수의 2D 어레이들의 프로세싱을 요구한다. 따라서, 다른 접근법은 2D 어레이 레지스터 저장소가 적어도 2개의 어레이 저장 영역들로 논리적으로 파티셔닝될 수 있는 것일 수 있으며, 이때, 각각의 어레이 저장 영역들은 각각의 2D 어레이를 저장한다. 레지스터 어드레싱 정보는, 색인 값 이외에, 2D 어레이 레지스터 저장소의 선택된 어레이 저장 영역을 식별하는 어레이 식별자를 또한 포함할 수 있다. 이러한 경우, 색인 값은 선택된 어레이 저장 영역의 어느 하위 부분이 레지스터 저장소의 타깃 부분인지를 식별할 수 있다. 따라서, 데이터 전송 명령어는 데이터 전송을 위해 액세스될 어레이의 어레이 ID를 특정할 수 있고, 기준 레지스터 및 즉시 값을 사용하여 정의된 색인 값은 그 어레이로부터 개별 수평/수직 그룹의 요소들을 선택하는 데 사용될 수 있다. 이러한 접근법은, 소프트웨어가, 레지스터 저장소로/로부터 2D 어레이를 전송하기 위해 어레이 내의 각각의 수평/수직 그룹의 요소들에 걸쳐 루핑(looping)하는 프로그램 루프들을 정의하는 것을 더 단순화할 수 있다.
일부 구현예들에서, 2D 어레이 레지스터 저장소를 어레이 저장 영역들로 파티셔닝하는 것은 고정될 수 있으며, 이에 따라, 주어진 어레이 식별자가 항상 2D 어레이 레지스터 저장소의 소정의 고정된 부분에 대응하게 된다. 예를 들어, 2D 어레이 레지스터 저장소가 위에서 논의된 바와 같은 한 세트의 벡터 레지스터들을 사용하여 구현될 때, 각각의 어레이 저장 영역은 고정된 블록의 벡터 레지스터들에 대응할 수 있다.
그러나, 위에서 논의된 바와 같은 가변적인 데이터 요소 크기들을 지원하는 구현예들에서는, 현재 데이터 요소 크기에 종속하는 가변적인 맵핑을 사용하도록 2D 어레이 레지스터 저장소를 어레이 저장 영역들로 파티셔닝하는 것이 유용할 수 있다. 프로세싱 회로부는, 데이터 전송 동작에 대해 특정된 현재 데이터 요소 크기 E에 종속하는 가변적인 맵핑에 기초하여, 2D 어레이 레지스터 저장소의 어느 부분이 주어진 값의 어레이 식별자에 대응하는 어레이 저장 영역인지를 식별할 수 있다. 이것은 하드웨어로 구현된 이용가능 레지스터 용량의 이용 효율을 개선함으로써 성능을 개선하는 것을 도울 수 있다.
전술한 바와 같이, 데이터 요소 크기 E가 가변적일 때, 이것은, 단일 레지스터가 가변적인 수의 데이터 요소들을 저장할 수 있다는 것을 의미하지만, 어레이의 제2 차원도 유사한 방식으로 스케일링되는 것이 바람직할 수 있으므로, 더 많은 수의 요소들이 하나의 벡터 레지스터(수평 또는 수직 방향을 표현함) 내에 피팅할 경우, 어레이는 또한 더 많은 수의 벡터 레지스터들(수평/수직 방향 중 다른 방향의 어레이의 차원을 표현함)에 걸쳐있게 된다. 단일 2D 어레이 구조를 표현하기 위해 더 많은 수의 벡터 레지스터들이 할당되는 경우, 이것은, 2D 어레이 레지스터 저장소 전체의 이용가능 레지스터 저장 용량 내에 전체적으로 더 적은 수의 2D 어레이들이 수용될 수 있음을 의미한다. 한편, 데이터 요소 크기가 더 커질 때, 각각의 벡터 레지스터는 어레이의 제1 차원에 더 적은 데이터 요소들을 저장할 수 있고, 따라서 더 적은 벡터 레지스터들이 어레이의 다른 차원을 수용할 필요가 있어져서, 이용가능 하드웨어 저장 용량 내에 더 많은 수의 별개의 2D 어레이들이 피팅할 수 있게 된다. 어레이 식별자들과 어레이 저장 영역들 사이에 고정된 맵핑이 사용된 경우, 각각의 저장 영역은 최소 데이터 요소 크기에서 2D 어레이를 저장하기 위해 충분히 커야 할 것이며, 이는 더 큰 요소 크기가 사용된 경우에는 저장 용량을 낭비할 것이다. 전술한 바와 같이 어레이 식별자와 어레이 저장 영역들 사이에 가변적인 맵핑을 사용함으로써, 이용가능 레지스터 용량을 완전히 사용하도록 파티셔닝이 조정될 수 있으며, 이는 더 많은 어레이들이 레지스터 저장소 내에 피팅할 수 있을 때, 계산 명령어당 실행되는 (더 느린) 로드/저장 명령어들의 수가 감소될 수 있기 때문에, 성능을 개선하는 것을 도울 수 있다.
하나의 예에서, 2D 어레이 레지스터 저장소는 소정 수 NA개의 어레이 저장 영역들로 논리적으로 파티셔닝될 수 있으며, NA는 현재 데이터 요소 크기 E에 따라 바뀔 수 있고, 이때, NA는 E가 증가함에 따라 증가한다. 이러한 관계는, 보통 (벡터 프로세싱을 이용하여) 데이터 요소 크기가 증가함에 따라 파티션들의 수가 감소할 것으로 예상될 것이기 때문에, 반직관적인 것으로 보일 수 있다. 그러나, 2D 어레이 프로세싱을 이용하면, 제1 차원에서 단일 레지스터 내에 피팅하는 요소들의 수는 요소 크기 E가 증가함에 따라 감소하지만, 요소들이 벡터 레지스트들에 걸쳐 스트라이핑(stripping)되는 제2 차원에서는, 각각의 요소가 그것의 요소 크기에 관계없이 단일 벡터 레지스터를 요구하며, 이에 따라, 제2 차원들에서 단일 2D 어레이에 사용되는 벡터 레지스터들의 수는 요소 크기가 증가함에 따라 실제로 감소한다. 따라서, 소정량의 물리적 저장소 내에 피팅할 수 있는 어레이 저장 영역들의 총 수(NA)는 요소 크기가 증가함에 따라 증가할 수 있다.
더 큰 요소 크기보다 더 작은 요소 크기에서 구별할 어레이 저장 영역들이 더 적으므로, 데이터 전송 명령어에 의해 인코딩되는 어레이 식별자는 현재 데이터 요소 크기 E에 종속하는 가변적인 비트 수를 또한 가질 수 있다. 그러나, 어레이 식별자에 필요한 비트 수는 앞서 논의된 바와 같이 즉시 값에 대한 관계에 비해, 현재 데이터 요소 크기 E와 반대의 관계를 가질 수 있다. 어레이 식별자는 더 작은 데이터 요소 크기들에서보다 더 큰 데이터 요소 크기들에서 더 큰 비트 수를 가질 수 있는 반면, 즉시 값은 더 큰 데이터 요소 크기들에서보다 더 작은 데이터 요소 크기들에서 더 큰 비트 수를 가질 수 있다.
따라서, 데이터 전송 명령어의 일부 구현예들은 명령어 인코딩 내의 2개의 별개의 공유되지 않는 필드들을 이용하여 어레이 식별자 및 즉시 값을 인코딩할 수 있지만, 하나의 특히 효율적인 인코딩은 어레이 식별자 및 즉시 값이 데이터 전송 명령어의 명령어 인코딩의 비트들의 공유되는 부분들을 사용하여 인코딩되는 것일 수 있다. 그 공유되는 부분 내의 주어진 비트에 대해, 명령어 디코딩 회로부는, 데이터 전송 명령어에 대해 특정된 현재 데이터 요소 크기 E에 따라, 주어진 비트가 어레이 식별자의 부분을 나타내는 것으로 해석되는지 또는 즉시 값의 부분을 나타내는 것으로 해석되는지 여부가 바뀐다. 이것은 어레이 식별자 및 즉시 값 둘 모두를 표현하는 데 필요한 총 비트 수를 감소시키는 것을 도울 수 있어, 다른 목적을 위해 명령어 인코딩의 다른 비트들을 확보한다. 이것은 ISA 설계에서 매우 가치가 있을 수 있는데, 그 이유는, 인코딩 공간이 전형적으로 매우 중요하기 때문이다.
일부 예들에서, 어레이 식별자 및 즉시 값을 인코딩하기 위해 사용되는 데이터 전송 명령어의 명령어 인코딩의 총 비트 수는 현재 데이터 요소 크기 E에 관계없이 일정할 수 있다.
일부 예들에서, 데이터 전송 명령어는 레지스터 어드레싱 정보 및 메모리의 타깃 부분을 식별하기 위한 메모리 어드레싱 정보를 특정하는 로드/저장 명령어일 수 있으며, 이 경우, 데이터 전송 동작은 레지스터 저장소의 타깃 부분과 메모리의 타깃 부분 사이에서 데이터를 전송하는 것을 포함한다. 이러한 경우, 메모리 어드레싱 정보는 임의의 알려진 메모리 어드레싱 모드에 따라 (예를 들어, 액세스될 메모리 어드레스(들)를 정의하기 위해 기준 레지스터 및 오프셋 레지스터, 또는 기준 레지스터 및 즉시 값을 사용하여) 정의될 수 있다.
또한, 데이터 전송 명령어는 레지스터 어드레싱 정보 및 레지스터 저장소의 추가의 부분을 식별하기 위한 추가의 레지스터 어드레싱 정보를 특정하는 레지스터 이동 명령어일 수 있으며, 데이터 전송 동작은 레지스터 저장소의 타깃 부분과 레지스터 저장소의 추가의 부분 사이에서 데이터를 전송하는 것을 포함할 수 있다. 이러한 경우, 레지스터 저장소의 타깃 부분은 전술한 바와 같이 기준 레지스터 식별자를 사용하여 식별될 수 있지만, 추가의 어드레싱 정보는 기준 레지스터 식별자를 포함할 필요가 없다. 예를 들어, 추가의 어드레싱 정보는 단순히 레지스터 저장소의 추가의 부분으로서 액세스될 레지스터를 직접 특정하는 레지스터 식별자일 수 있다. 예를 들어, 레지스터 저장소의 타깃 부분이 앞서 언급된 2D 어레이 레지스터 저장소의 일부인 예들에서, 레지스터 저장소의 추가의 부분은 벡터 레지스터일 수 있다.
따라서, 데이터 전송 명령어는 레지스터 저장소와 메모리 사이에서 데이터를 전송하거나, 또는 레지스터 저장소의 각각의 부분들 사이에서 데이터를 전송하는 데 사용될 수 있다. 일부 ISA들은 레지스터 어드레싱 정보의 일부로서 기준 레지스터 식별자 및 즉시 값을 사용하는 로드/저장 명령어 및 레지스터 이동 명령어 중 하나만을 지원할 수 있다(이때, 다른 유형의 명령어는 기준 레지스터 식별자 및 즉시 값 기반 어드레싱을 사용하지 않음). 다른 ISA들은 기준 레지스터 식별자 및 즉시 값을 포함하는 레지스터 어드레싱 정보를 사용하는 로드/저장 명령어 및 레지스터 이동 명령어 둘 모두를 지원할 수 있다.
기준 레지스터 식별자 및 즉시 값을 포함하는 레지스터 어드레싱 정보를 포함하는 데이터 전송 명령어는 명령어 디코딩 회로부 및 프로세싱 회로부에 의해 구현되는 ISA에서 지원되는 유일한 유형의 데이터 전송 명령어가 아닐 수 있다는 것이 이해될 것이다. 또한, 데이터 전송에서 액세스할 레지스터 저장소의 일부를 선택하는 데 사용되는 색인을 정의하기 위해 기준 레지스터 식별자 및 즉시 값을 사용하지 않는 다른 유형들의 데이터 전송 명령어들이 있을 수 있다.
레지스터 어드레싱 정보를 위해 식별되는 기준 레지스터는 스칼라 레지스터일 수 있다. 스칼라 레지스터는 (각각의 데이터 요소가 별개의 데이터 값을 표현하는 다수의 독립적인 데이터 요소들로 파티셔닝될 수 있는 벡터 레지스터와는 대조적으로) 단일 데이터 값을 저장하도록 의도된 레지스터이다.
일부 구현예들에서, 스칼라 레지스터들은 명령어들에 의한 선택을 위해 이용가능한 스칼라 레지스터들의 소정 풀(pool) 중에서 선택될 수 있다. 예를 들어, 스칼라 계산 명령어들은, 명령어에 대한 피연산자 또는 명령어의 결과를 저장할 특정 스칼라 레지스터를, 명령어의 소스 또는 목적지 레지스터로서, 특정하기 위한 K 비트 스칼라 레지스터 필드를 가질 수 있다. K 비트 스칼라 레지스터 필드들을 이용하여, 이것은 시스템이 2K개의 상이한 스칼라 레지스터들을 지원할 수 있게 할 수 있다.
일부 구현예들에서, ISA에서 지원되는 별개의 스칼라 레지스터들의 수가 2K인 경우, 레지스터 어드레싱 정보의 기준 레지스터 필드에 사용되는 비트 수가 K 비트일 수 있으며, 이에 따라, 지원된 스칼라 레지스터들 중 임의의 것이 기준 레지스터로서 선택될 수 있게 된다.
그러나, 다른 예들에서, 데이터 전송 명령어는 L 비트 스칼라 레지스터 필드를 사용하여 기준 레지스터를 특정할 수 있으며, 여기서 L < K이고, 이에 따라, 적어도 하나의 스칼라 계산 명령어에 대한 소스 또는 목적지 레지스터로서 특정가능한 적어도 하나의 스칼라 레지스터가 데이터 전송 명령어에 대한 레지스터 어드레싱 정보의 기준 레지스터로서 특정될 수 없다. 즉, 기준 레지스터 필드는 아키텍처에서 지원되는 임의의 스칼라 레지스터를 선택할 수 있게 하는 데 필요로 될 비트 수보다 더 짧은 압축 필드이다. 이것은 다른 목적들을 위해 명령어 인코딩의 비트들을 확보하는 데 도움이 될 수 있다. 실제로, 기준 레지스터를 스칼라 레지스터들의 제한된 서브세트로부터 선택되도록 제한하는 것은 행렬 프로세싱과 같은 응용예들에 대해 예상되는 사용 사례들을 처리하기에 충분할 수 있다.
명령어 디코딩 회로부는, 명령어 디코딩 회로부가 2D 어레이 레지스터 저장소에 기입될 2D 어레이의 결과 값들을 생성하기 위해 계산 연산을 수행하도록 프로세싱 회로부를 제어하는 것에 응답하여, 2D 어레이 생성 계산 명령어를 지원할 수 있다. 2D 어레이의 결과 값들은 2D 어레이 생성 계산 명령어의 단일 인스턴스에 응답하여 생성될 수 있다. 단일 명령어에 응답하여 2D 어레이의 값들을 생성하는 것을 지원할 수 있는 시스템들에서, 프로세싱 처리량은 벡터 프로세싱을 사용하여 한 번에 단일 1D 어레이의 데이터를 프로세싱하는 구현예들보다 훨씬 더 클 수 있다. 이것은 앞서 논의된 바와 같이 기계 학습 및 신호 프로세싱 등과 같은 응용예들에 대해 특히 유용할 수 있다. 예를 들어, 계산 연산은, 계산에 대한 입력 피연산자들이 2D 어레이들의 데이터이고 결과가 2D 어레이 피연산자들에 의해 표현되는 행렬들을 곱한 결과를 표현하는 2D 어레이인 행렬 곱셈 연산일 수 있다. 그러나, 다른 예들에서, 계산 연산은 2D 어레이의 결과 값들을 생성하기 위해 제1 및 제2 벡터 피연산자들에 대해 수행되는 외적 연산을 포함할 수 있다. 외적 연산을 구현하는 것은 하드웨어에서 전체 행렬 곱셈보다 더 간단할 수 있다. 외적 연산들의 시퀀스의 누산 결과들은 행렬 곱셈과 등가의 결과를 생성할 수 있다. 따라서, 계산 명령어는, 2개의 벡터들의 외적을 생성할뿐만 아니라 결과 요소들을 누산기 2D 어레이의 요소들(예를 들어, 위에서 언급된 레지스터 저장소의 2D 어레이 저장 영역들 중 하나에 저장됨)에 가산하는 외적 및 누산(outer-product-and-accumulate) 명령어일 수 있다. 위에서 논의된 유형의 데이터 전송 명령어는 그러한 2D 어레이 생성 계산 명령어들을 지원하는 시스템들에 특히 유용한데, 그 이유는, 그것이 2D 어레이 레지스터의 개별 수평/수직 그룹들의 요소들에 효율적으로 액세스할 수 있게 하기 때문이다. 데이터 전송 명령어의 인코딩은, 스케일링가능한 어레이 크기에 여전히 동적으로 적응할 수 있으면서, 그러한 액세스들이 컴파일러들에 의해 언롤링되고 스케줄링되는 것을 허용한다.
위에서 논의된 기법들은 위에서 논의된 프로세싱 회로부 및 명령어 디코더를 구현하기 위해 제공된 하드웨어 회로부를 갖는 데이터 프로세싱 장치 내에서 구현될 수 있다.
그러나, 동일한 기법이 또한, 타깃 코드의 실행을 위한 명령어 실행 환경을 제공하도록 호스트 데이터 프로세싱 장치 상에서 실행되는 컴퓨터 프로그램 내에서 구현될 수 있다. 그러한 컴퓨터 프로그램은 소정 ISA에 따라 타깃 코드를 실제로 지원하는 타깃 데이터 프로세싱 장치에 제공될 아키텍처적 환경을 시뮬레이션하도록 호스트 데이터 프로세싱 장치를 제어할 수 있는데, 이는, 호스트 데이터 프로세싱 장치 자체가 그 아키텍처를 지원하지 않더라도 그러하다. 그러한 시뮬레이션 프로그램들은, 예를 들어, 하나의 ISA에 대해 작성된 레거시 코드가 상이한 ISA를 지원하는 호스트 프로세서 상에서 실행되고 있을 때 유용하다. 또한, 시뮬레이션은 새로운 버전의 ISA에 대한 소프트웨어 개발이 그 새로운 아키텍처 버전을 지원하는 프로세싱 하드웨어가 준비되기 전에 시작될 수 있게 할 수 있는데, 그 이유는, 시뮬레이션된 실행 환경 상에서의 소프트웨어의 실행이 새로운 아키텍처를 지원하는 하드웨어 디바이스들의 진행 중인 개발과 동시에 소프트웨어의 테스트를 가능하게 할 수 있기 때문이다. 시뮬레이션 프로그램은 비일시적 저장 매체일 수 있는 저장 매체에 저장될 수 있다.
따라서, 컴퓨터 프로그램은, 프로그램 명령어들에 응답하여 데이터 프로세싱을 수행하도록 호스트 데이터 프로세싱 장치를 제어하기 위해 타깃 코드의 프로그램 명령어들을 디코딩하는(예를 들어, 타깃 코드의 각각의 명령어를 등가의 기능을 구현하는 호스트의 네이티브 명령어 세트 내의 하나 이상의 명령어들의 시퀀스에 맵핑함) 명령어 디코딩 프로그램 로직을 포함할 수 있다. 또한, 컴퓨터 프로그램은, 타깃 ISA를 실제로 지원하는 프로세서에서 하드웨어로 제공될 것으로 예상될, 시뮬레이션되고 있는 타깃 ISA의 레지스터 저장소를 에뮬레이팅하기 위해 호스트 데이터 프로세싱 장치의 호스트 저장소 내에(예를 들어, 호스트의 메모리 또는 레지스터들 내에) 데이터 구조를 유지하는 레지스터 에뮬레이팅 프로그램 로직을 가질 수 있다.
그러한 구현예에서, 명령어 디코딩 프로그램 로직은 위에서 논의된 것과 동일한 레지스터 어드레싱 정보를 갖는 데이터 전송 명령어를 지원할 수 있지만, 이러한 경우에, 레지스터 어드레싱 정보에 기초한 레지스터 저장소에 대한 참조들은 레지스터 에뮬레이팅 데이터 구조에 의해 호스트 저장소에 저장된 레지스터 에뮬레이팅 데이터 구조의 대응하는 위치들에 맵핑된다. 따라서, 기준 레지스터 식별자 및 즉시 값을 사용하여, 타깃 프로세싱 장치 상에서의 실행이 호스트 장치 상에서 시뮬레이션되고 있는 데이터 전송 명령어에 대한 데이터 전송 시에 에뮬레이팅된 레지스터들 중 어느 부분이 액세스될지를 식별할 수 있다.
도 1은 데이터 프로세싱 장치(20)의 예를 개략적으로 예시한다. 데이터 프로세싱 장치는 다수의 파이프라인 스테이지들을 포함하는 프로세싱 파이프라인(24)을 갖는다. 이러한 예에서, 파이프라인 스테이지들은 명령어 캐시(28)로부터 명령어들을 페치하기 위한 페치 스테이지(26); 파이프라인의 나머지 스테이지들에 의해 프로세싱될 마이크로 연산들을 생성하기 위해 페치된 프로그램 명령어들을 디코딩하기 위한 디코드 스테이지(30)(명령어 디코딩 회로부); 마이크로 연산들을 위해 요구되는 피연산자들이 레지스터 파일(34)에서 이용가능한지를 확인하고, 일단 주어진 마이크로 연산을 위해 요구되는 피연산자들이 이용가능하면 실행할 마이크로 연산들을 발행하기 위한 발행 스테이지(32); 결과 값들을 생성하기 위해 레지스터 파일(34)로부터 판독된 피연산자들을 프로세싱함으로써, 마이크로 연산들에 대응하는 데이터 프로세싱 연산들을 실행하기 위한 실행 스테이지(36)(프로세싱 회로부); 및 프로세싱의 결과들을 레지스터 파일(34)에 라이트백하기 위한 라이트백 스테이지(38)를 포함한다. 이것은 단지 가능한 파이프라인 아키텍처의 하나의 예일 뿐이고, 다른 시스템들은 추가적인 스테이지들 또는 스테이지들의 상이한 구성을 가질 수 있다는 것이 이해될 것이다. 예를 들어, 비순차적 프로세서에서, 프로그램 명령어들 또는 마이크로 연산들에 의해 특정된 아키텍처적 레지스터들을 레지스터 파일(34)에서 물리적 레지스터들을 식별하는 물리적 레지스터 특정자들에 맵핑하기 위한 레지스터 재명명 스테이지가 포함될 수 있다.
실행 스테이지(36)는 상이한 부류들의 프로세싱 연산을 실행하기 위한 다수의 프로세싱 유닛들을 포함한다. 예를 들어, 실행 유닛들은 레지스터들(34)로부터 판독된 스칼라 피연산자들에 대해 산술 또는 논리 연산들을 수행하기 위한 스칼라 산술/로직 유닛(ALU)(40); 부동 소수점 값들에 대해 연산들을 수행하기 위한 부동 소수점 유닛(42); 분기 연산들의 결과를 평가하고 그에 맞춰 현재 실행 포인트를 나타내는 프로그램 카운터를 조정하기 위한 분기 유닛(44); (아래에서 더 상세히 논의될) 행렬 프로세싱을 위한 행렬 프로세싱 유닛(46); 및 메모리 시스템(50, 52, 54) 내의 데이터에 액세스하기 위해 로드/저장 동작들을 수행하기 위한 로드/저장 유닛(48)을 포함할 수 있다.
이러한 예에서, 메모리 시스템은 레벨 1 데이터 캐시(50), 공유 레벨 2 캐시(52) 및 메인 시스템 메모리(54)를 포함한다. 이것은 가능한 메모리 계층구조의 하나의 예일 뿐이며, 캐시들의 다른 배열들이 제공될 수 있다는 것이 이해될 것이다. 실행 스테이지(36)에 도시된 특정 유형의 프로세싱 유닛(40 내지 48)은 하나의 예일 뿐이며, 다른 구현예들은 상이한 세트의 프로세싱 유닛들을 가질 수 있거나, 동일 유형의 다수의 마이크로 연산들이 병렬로 핸들링될 수 있도록 동일 유형의 프로세싱 유닛의 다수의 인스턴스를 포함할 수 있다. 도 1은 가능한 프로세서 파이프라인 아키텍처의 몇몇 컴포넌트들의 단순화된 표현일 뿐이며, 프로세서는 간결함을 위해 예시되지 않은 많은 다른 요소들을 포함할 수 있다는 것이 이해될 것이다.
일부 구현예들에서, 데이터 프로세싱 장치(20)는 도 1의 CPU들(중앙 프로세싱 유닛들, 또는 프로세서 코어들)(60) 중 하나에 대해 도시된 것과 유사한 프로세싱 파이프라인(24)을 각각 갖는 다수의 CPU들(60)을 포함하는 멀티 프로세서 장치일 수 있다. 또한, 장치(20)는 적어도 하나의 그래픽 프로세싱 유닛(GPU)(62), 및/또는 서로 그리고 메모리(54)에 액세스하는 데 사용되는 상호접속부(66)를 통해 CPU들과 통신할 수 있는 다른 마스터 디바이스들(64)을 포함할 수 있다.
행렬 프로세싱 연산들을 지원하기 위한 하나의 접근법은 주어진 행렬 프로세싱 연산의 개별 곱셈들을 주어진 CPU(60)의 프로세싱 파이프라인(24) 상에서 프로세싱될 수 있는 개별 스칼라 정수 또는 부동 소수점 명령어들로 분해하는 것일 수 있다. 그러나, 이것은 비교적 느릴 수 있다.
행렬 프로세싱을 가속화하기 위한 다른 접근법은, 상호접속부(66)에 접속된 디바이스들(64) 중 하나로서, 행렬 연산들을 핸들링하도록 설계된 전용 하드웨어를 갖는 하드웨어 가속기를 제공하는 것일 수 있다. 그러한 하드웨어 가속기와 상호작용하기 위해, CPU(24)는, 하드웨어 가속기에 의해 메모리로부터 판독될 행렬 피연산자들을 정의하고 피연산자들에 적용될 프로세싱 연산들을 정의하는 구성 데이터를 메모리(54)(또는 하드웨어 가속기 내의 메모리 맵핑된 레지스터들)에 기입하기 위해, 로드/저장 유닛(48)을 사용하여 로드/저장 명령어들을 실행할 것이다. 일단 하드웨어 가속기가 행렬 프로세싱을 수행했으면, CPU(60)는 하드웨어 가속기 내의 레지스터들에 맵핑되는 어드레스를 특정하는 로드 명령어를 사용하여 다시 하드웨어 가속기로부터 행렬 프로세싱의 결과들을 판독할 수 있다. 이러한 접근법은 파이프라인 내의 정수 연산들을 사용하는 것보다 더 빠를 수 있지만, 그럼에도 불구하고, 범용 프로세서(60)와 하드웨어 가속기(64) 간에 정보를 전송하기 위해 로드/저장 메커니즘을 사용하는 것과 연관된 오버헤드가 있을 수 있고, 또한 하드웨어 가속기 접근법은 동일 프로세싱 시스템 상에서 실행되는 상이한 가상 기계들이 하드웨어 가속기에 대한 액세스를 공유할 필요가 있을 때 난제들을 야기할 수 있다. 따라서, 이러한 접근법은 다수의 가상 기계들을 갖는 가상화된 구현예에서 잘 스케일링되지 않을 수 있다.
따라서, 도 1에 도시된 바와 같이, (ALU(40) 또는 부동 소수점 유닛(42)을 사용하여 정규 정수 또는 부동 소수점 산술 연산들을 제어하는 것과 유사하게) 파이프라인의 디코드 스테이지(30)에 의해 디코딩되는 계산 프로그램 명령어들에 응답하여 행렬 프로세싱을 수행하도록 제어될 수 있는 주어진 CPU(60)의 정규 프로세싱 파이프라인(24) 내에 행렬 프로세싱 회로부(46)를 제공하는 것이 가능하다. 이것은 CPU(60)와 하드웨어 가속기 간에 데이터를 역방향으로 그리고 순방향으로 전송할 필요를 회피하고, 다수의 상이한 가상 기계들이 행렬 연산들을 수행할 수 있게 하는 것을 훨씬 더 간단하게 만든다.
도 1이 여러 CPU들(60)을 갖는 멀티 프로세서 장치(20)를 도시하고 있지만, 이것이 필수는 아니며, 행렬 프로세싱 회로부(46)는 또한 단일 코어 시스템으로 구현될 수 있다.
도 1의 예에서, 행렬 프로세싱 기능은 CPU(60) 자체 내에 제공된다.
도 2a 내지 도 2d는, 각각의 CPU(60)가 자체적으로 행렬 프로세싱 기능을 갖지는 않지만, 행렬 프로세싱이 상호접속부(66)를 통해 CPU들(60)에 접속된 코프로세서(co-processor)(70)에서 지원되는, 데이터 프로세싱 장치의 제2 예를 도시한다. 이러한 접근법은, 코프로세서(70)에서 행렬 프로세싱을 지원하는 데 사용되는 하드웨어 자원들이 CPU들(60) 사이에서 공유될 수 있기 때문에, 행렬 프로세싱 기능을 구현하는 하드웨어 비용을 감소시키는 데 유용할 수 있다. 코프로세서(70)가 CPU(60) 자체에 의해 사용되는 어드레스 변환 데이터에 대한 대응하는 어드레스 변환 데이터를 사용하여 메모리에 액세스할 수 있게 하기 위해, 메모리 관리 유닛(memory management unit, MMU)(72)이 도 2a에 도시된 바와 같이 CPU들(60)과 코프로세서(70) 사이에 공유된 별개의 블록으로서 제공되거나, 또는 도 2b에 도시된 바와 같이 각각의 CPU(60) 및 코프로세서(70)가 메모리 내의 공통 세트의 페이지 테이블들로부터 어드레스 변환 데이터가 로드될 수 있는 그 자신의 MMU(72)를 가지며 제공될 수 있다. 간결성을 위해 도 1에 도시되어 있지 않지만, 그 예에서, CPU(60)가 내부 MMU(72)를 갖는 것이 또한 가능하다는 것에 유의한다. 또한, 일부 예들에서, 코프로세서 로드/저장 동작들에 사용되는 어드레스들의 변환들이 CPU(60) 내의 MMU에 의해 수행되는 것이 가능할 것이고, 생성된 물리적 어드레스는 로드/저장 명령어와 함께 코프로세서(70)에 전달된다. MMU(72)는 프로그램 명령어들에 의해 특정된 메모리 어드레싱 정보에 기초하여 식별된 가상 어드레스들을 메모리(54) 내에 액세스할 위치들을 식별하는 물리적 어드레스들로 변환한다. MMU(72)는 또한, 프로그램 코드가 주어진 메모리 어드레스에 액세스하도록 허용되는지를 확인하기 위한 허가 확인들을 구현할 수 있다.
도 2c는 도 2a/도 2b의 예에서의 CPU(60)를 도시한다. 도 1에서와 동일한 요소들은 동일한 참조 번호로 표시된다. 이러한 예에서, 도 1에 도시된 스칼라 실행 유닛들(40, 42, 44)은 스칼라 레지스터들(80)에 저장된 스칼라 피연산자들에 대해 연산들을 수행하는 스칼라 프로세싱 회로부로 총칭된다. 실행 스테이지(36)는 또한, 벡터 레지스터들(82)에 저장된 벡터 피연산자들에 대해 벡터 프로세싱 연산들을 수행하기 위한 벡터 프로세싱 회로부(76)를 포함한다. 벡터 프로세싱 회로부(76) 및 벡터 레지스터들(82)이 도 1에 도시되지 않았지만, 그들은 또한 그 예에서 제공될 수 있다.
도 2a 내지 도 2d의 예에서, 프로세싱 장치는 비-행렬 프로세싱 모드 또는 행렬 프로세싱 모드에서 프로그램의 프로세싱을 지원한다. 비-행렬 프로세싱 모드에서 프로세싱되는 명령어들은 실행 스테이지(36)에서의 프로세싱 유닛들에 의한 실행을 위해, CPU(60)의 발행 스테이지(32)의 발행 회로부(85)에 의해 발행된다.
그러나, 행렬 프로세싱 모드에서 프로세싱되는 명령어들은 CPU(60)의 발행 스테이지(32)의 코프로세서 인터페이스(87)에 의해 코프로세서(70) 내의 큐 관리자(84)에 포워딩된다(도 2d에 도시된 바와 같음). 큐 관리자(84)는 CPU(60)와 유사하게 명령어 디코딩 회로부(30), 발행 회로부(32), 실행 스테이지(36), 및 라이트백 회로부(38)를 포함하는 코프로세서(70) 내의 파이프라인에 명령어들을 전달하지만, 코프로세서(70) 내의 파이프라인은 CPU(60)에 비해 ISA의 명령어들의 상이한 서브세트를 지원할 수 있다. 예를 들어, 코프로세서(70)는, 행렬 프로세싱에 유용할 것으로 예상되는 연산들을 지원하면서 코프로세서의 복잡도를 제한하기 위해, CPU(60)보다 더 제한된 세트의 명령어들을 지원할 수 있다.
이러한 예에서 CPU(60)는 어떠한 행렬 프로세싱 계산 명령어들도 지원하지 않으며, 이는 대신, 코프로세서(70) 내의 행렬 프로세싱 실행 유닛(86)에 의해 지원된다. 프로그램이 현재 행렬 프로세싱 모드에서 실행되고 있는지 또는 비-행렬 프로세싱 모드에서 실행되고 있는지의 선택은 행렬 프로세싱 모드를 인에이블(enable)/디스에이블(disable)화하는 소정의 모드 제어 명령어들에 기초하여 이루어질 수 있다.
행렬 프로세싱을 지원하기 위해, 코프로세서(70)는 2D 어레이(행렬)들의 데이터를 저장하도록 지정된 행렬 레지스터(2D 어레이 레지스터)들(88)을 갖는다. 행렬 레지스터들(88)과 메모리(54) 사이에서 또는 행렬 레지스터들(88)과 다른 유형들의 레지스터(예컨대, 벡터 레지스터들(82)) 사이에서 행렬들의 일부들을 전송하는 데이터 전송 명령어들은 행렬 프로세싱 모드에서 실행되도록 제한된다. 도 1에 도시되어 있지는 않지만, CPU 자체가 행렬 프로세싱을 지원하는 실시예에서, CPU(60)는 유사하게 그것의 레지스터들(34) 내에 행렬 레지스터들(88)을 가질 수 있다.
코프로세서(70) 내의 벡터 레지스터들(82)의 벡터 길이는 CPU(60) 내의 벡터 레지스터들(82)과 동일하지 않을 수 있다. 행렬 프로세싱 연산들은 (더 큰 데이터 처리량을 가능하게 하기 위해) 더 큰 벡터 길이들에서 더 효율적일 수 있으므로, 일부 경우에, 프로세서 설계자는 벡터 레지스터들(82)(및 코프로세서의 행렬 레지스터들(88)을 제공하는 데 사용되는 벡터 레지스터들)에 대해, CPU(60) 내의 벡터 레지스터들(82)에 사용되는 벡터 길이 VL1보다 더 긴 벡터 길이 VL2를 선택하기를 원할 수 있다. 그럼에도 불구하고, ISA는 비-행렬 프로세싱 및 행렬 프로세싱 모드들에 대해 가변적인 벡터 길이들 VL1, VL2를 지원할 수 있으며, 이들 둘 모두는 ISA에 의해 지원되는 벡터 길이들의 범위 중에서 주어진 하드웨어 구현예에 대해 선택될 수 있다(일부 경우에, VL1로서 선택을 위해 이용가능한 범위는 VL2로서 선택을 위해 이용가능한 범위와 동일하지 않을 수 있지만, 범위들은 중첩될 수 있으며, 이에 따라, 특정 구현예가 VL1=VL2를 선택하는 것이 가능할 수 있음). 비-행렬 프로세싱 및 행렬 프로세싱 모드들에서 각각 사용되는 각각의 벡터 길이들 VL1, VL2를 나타내기 위해 벡터 제어 레지스터들(ZCR, ZCR')(81, 81')이 CPU(60)에 제공될 수 있다.
ISA에 따라 정의된 프로그램 코드는 하드웨어 구현예들 둘 모두(도 1의 행렬 프로세싱이 내부에 구현된 CPU(60) 또는 도 2a 내지 도 2d의 코프로세서 예) 상에서 등가의 방식으로 기능할 수 있다. 도 1에 도시된 바와 같은 구현예 상에서 실행되는 경우, 모드 선택 명령어들은 무연산 명령어(no-operation instruction)들로서 취급될 수 있고, 임의의 벡터 레지스터들에 대해 구현된 벡터 길이는 (두 모드들 모두에서 동일한 레지스터들이 사용되므로) 두 모드들 모두에서 동일할 수 있을 수 있다. 도 2a 내지 도 2d에 도시된 바와 같은 구현예 상에서 실행되는 경우, 모드 선택 명령어들은 명령어들이 실행을 위해 코프로세서에 포워딩되어야 한다는 것을 시그널링할 수 있고, 2개의 모드들에서 상이한 벡터 길이들 VL1, VL2를 지원하는 것이 유용할 수 있다. 어느 방식으로든, 소프트웨어 개발자의 관점에서, 행렬 프로세싱은 레지스터들에 저장된 피연산자들에 대해 작용하고 레지스터에 라이트백되는 결과들을 생성하는 레지스터-대-레지스터 연산들을 정의하는 일반 CPU 명령어(계산/산술 명령어)들에 응답하여 행렬 프로세싱 로직(46, 86)에 의해 수행되며, 이는 행렬 프로세싱을 수행하기 위해 로드/저장 명령어들에 기초하여 제어되는 하드웨어 프로세서를 사용하는 구현예들에서보다 행렬 프로세싱의 제어를 훨씬 더 간단하게 만들며, 이는 특화된 소프트웨어 드라이버들이 행렬 프로세싱을 구현하도록 요구할 수 있다. 물론, 심지어 행렬 프로세싱을 구현하는 레지스터-대-레지스터 계산 명령어들에 대한 ISA 지원을 갖는 CPU(60) 또는 코프로세서를 포함하는 시스템에서도, ISA의 레지스터-대-레지스터 계산 명령어들에 지원되지 않는 행렬 프로세싱의 형태들에 대한 추가적인 지원을 제공하기 위해, 로드/저장 명령어들을 사용하여 상호연결부(66)를 통해 액세스가능한 디바이스(64)로서 전용 하드웨어 가속기를 제공하는 것이 여전히 가능할 수 있다. 그러나, 그러한 하드웨어 가속기가 필수는 아니다.
도 3은 결과 행렬 C를 생성하기 위한 제1 행렬 A와 제2 행렬 B 사이의 행렬 곱셈의 예를 도시한다. 이러한 예에서, 행렬들은 모두, 특정 예의 경우 치수 4 x 4의, 정사각형 행렬들이지만, 이것이 필수는 아니다. 행렬 곱셈 연산 C=AB에 대해, A는 m × n 행렬이고 B는 n × p 행렬인 경우, C는 m × p 행렬이며, 여기서 C의 포지션(i, j)에서의 주어진 요소는 행렬 A의 i 번째 행과 행렬 B의 j 번째 열의 요소들의 쌍별적(pair wise product)들을 가산한 결과에 대응하며, 이에 따라, 결과 행렬의 주어진 요소 cij
Figure pct00001
에 대응한다.
도 3의 우측에 도시된 바와 같이, 일련의 외적 연산들을 수행함으로써 등가의 결과를 생성하는 것이 가능할 수 있다. 외적 연산은 제1 벡터 피연산자 u = (u1, u2, …, um) 및 제2 벡터 피연산자 v = (v1, v2, …, vn) - 이들 각각은 요소들의 1차원 어레이를 포함함 - 를 취하고, 이들을 결합하여 2차원 결과 행렬 W를 형성하는데, 여기서
Figure pct00002
이다. 따라서, 외적 결과 행렬의 각각의 요소는 입력 벡터 피연산자의 하나의 요소와 제2 벡터 피연산자의 하나의 요소의 단일 곱셈으로부터 도출된다. 도 3에 도시된 바와 같이, 행렬 A의 요소들이 (전술한 행렬 곱셈에 대해서와 같이 행들이 아닌) 열들에서 판독되고 제2 행렬 B의 요소들이 (행렬 곱셈에 대해 행해질 바와 같이 열들이 아닌) 행들에서 판독되는 경우, 행렬 A의 i 번째 열과 행렬 B의 i 번째 행에 대한 외적 연산을 수행하고 i = 1 내지 n에 대한 결과들을 누산함으로써, 결과는 행렬 곱셈 연산의 결과와 등가가 된다. 행렬 곱셈 연산을 개별 외적 연산들로 분할하는 것은 단일 프로그램 명령어에 응답하여 계산(calculate)될 필요가 있는 곱셈들 및 가산들의 수를 감소시키는 데 유용할 수 있다. 이것은 더 빠른 연산이고, 프로세서 내의 다른 연산들의 파이프라인 타이밍에 피팅하는 타이밍들을 갖는 회로 로직을 설계하는 동안 하드웨어로 설계하기에 더 간단할 수 있다. 어느 경우든, 외적은 또한 소정 알고리즘들에 대해 그 자체로 중요한 연산이며, 따라서 행렬 곱셈을 구현하는 것 이외의 목적으로 사용될 수 있다.
따라서, 일부 예들에서, (도 1 및 도 2a 내지 도 2d의 예들 중 어느 하나에서의) 프로세싱 회로부의 행렬 프로세싱 유닛(46, 88)은 외적 연산들을 수행하기 위한 도 4에 도시된 바와 같은 외적 엔진을 포함할 수 있다. 외적 엔진은 제1 근거 값 Pa와 연관된 제1 벡터 피연산자 opa와, 제2 근거 값 Pb와 연관된 제2 벡터 피연산자 opb를 입력들로서 취한다. 외적 엔진에 의해 출력된 결과는 2D 어레이(행렬) C'이다. 결과 행렬은 2D 어레이들을 저장하기 위해 제공되는 2D 어레이 레지스터 저장소(예를 들어, 도 2d에 도시된 행렬 레지스터들(88), 이는 도 1의 예에서는 레지스터들(34) 내에 또한 제공될 것임)에 저장될 수 있다. 결과 어레이 저장소 C의 각각의 요소에 저장된 이전 값은 또한, 주어진 요소 C'[i, j]가 도 4에 도시된 방정식에 따라 생성되는 외적 및 누산 연산을 수행하기 위해 연산에 대한 입력으로서 역할을 할 수 있으며, 여기서 Pa[i].opa[i]는 opa의 요소 i가 Pa의 요소 i에 근거한다는 것을 나타내고, Pb[j].opb[j]는 opb의 요소 j가 Pa의 요소 j에 근거한다는 것을 나타낸다. 병합 근거화(merging predication)를 구현하는 외적 명령어의 경우, 근거 요소 Pa[i] 또는 Pb[j]가 비활성이라고 표시될 때, 대응하는 요소 C'[i, j]는 그것의 이전 값을 유지할 것이다. 비활성 근거 요소 Pa[i] 또는 Pb[j]에 대응하는 결과 행렬의 요소들 C'[i, j]가 0으로 설정되어, 그 요소 포지션에 대한 이전 값 C[i, j]를 겹쳐쓰기하는 제로잉 근거화(zeroing predication)를 구현하는 것이 또한 가능하다. 근거화는, 행렬 프로세싱이 행렬 구조의 가장자리에 도달하고, 프로세싱할 요소들의 수가, 예를 들어, 하드웨어에서 지원되는 전체 행렬을 채우기에 충분하지 않을 때, 유용할 수 있다. 도 4에 도시된 바와 같은 외적 및 누산 연산들은 그들이 행렬 곱셈 연산들에 대한 하드웨어 지원의 구현을 단순화하기 때문에 유용하며, 누산은 각각의 외적 결과를 개별적으로 저장하고 이어서 최종 단계로서 그들을 가산할 필요가 없음을 의미한다. 그러나, 도 4에 도시된 외적 엔진은 단지 하나의 예일 뿐이고, 행렬 프로세싱 엔진(46, 88)의 다른 구현예들에서, 하나의 명령어로 전체 행렬 프로세싱 연산을 수행하기 위한 지원을 제공하는 것이 가능할 것이다. 그러나, 앞서 논의된 바와 같이, 외적 연산들은 실제로 구현하기에 더 용이할 수 있다.
도 5는 행렬 연산들을 지원하기 위한 CPU(60) 또는 코프로세서의 아키텍처적 레지스터들(34)의 예를 도시한다. (ISA에 정의된 바와 같은) 아키텍처적 레지스터들은 ALU(40)에 의해 수행되는 ALU 연산들 또는 파이프라인에서 프로세싱되는 다른 명령어들에 대한 범용 레지스터들로서 작용하는 한 세트의 스칼라 정수 레지스터들을 포함할 수 있다. 예를 들어, 소정 수의 제공되는 범용 레지스터들, 예를 들어, 이러한 예에서는 31개의 레지스터들(X0 내지 X30)이 있을 수 있다(스칼라 레지스터 필드의 32번째 인코딩은 하드웨어로 제공되는 레지스터에 대응하지 않을 수 있는데, 그 이유는, 그것이 기본적으로, 예를 들어, 0의 값을 나타내는 것으로 고려될 수 있거나, 또는 범용 레지스터가 아닌 전용 유형의 레지스터를 나타내는 데 사용될 수 있기 때문임). 동일한 물리적 저장소에 맵핑되는 상이한 크기들의 스칼라 레지스터들에 액세스하는 것이 가능할 수 있다. 예를 들어, 레지스터 라벨들 X0 내지 X30은 64 비트 레지스터들을 지칭할 수 있지만, 동일한 레지스터들이 또한 32 비트 레지스터들로서 액세스될 수 있는데(예를 들어, 하드웨어로 제공된 각각의 64 비트 레지스터 중 하위 32 비트를 사용하여 액세스됨), 이 경우, 레지스터 라벨들 W0 내지 W30은 어셈블러 코드에서 동일한 레지스터들을 참조하는 데 사용될 수 있다.
또한, 디코더(30)에 의해 지원되는 ISA에서 프로그램 명령어들에 의한 선택을 위해 이용가능한 아키텍처적 레지스터들은 소정 수의 벡터 레지스터들(82)(이러한 예에서 Z0 내지 Z31로 라벨링됨)을 포함할 수 있다. 물론, 도 5에 도시된 수의 스칼라/벡터 레지스터들을 제공하는 것이 필수는 아니며, 다른 예들은 프로그램 명령어들에 의해 특정가능한 상이한 수의 레지스터들을 제공할 수 있다. 각각의 벡터 레지스터는 가변적인 수의 데이터 요소들을 포함하는 벡터 피연산자를 저장할 수 있으며, 여기서 각각의 데이터 요소는 독립적인 데이터 값을 표현할 수 있다. 벡터 프로세싱(SIMD) 명령어들에 응답하여, 프로세싱 회로부는 레지스터들에 저장된 벡터 피연산자들에 대해 벡터 프로세싱을 수행하여 결과들을 생성할 수 있다. 예를 들어, 벡터 프로세싱은, 대응하는 연산이 하나 이상의 피연산자 벡터들 내의 각각의 레인의 요소들에 대해 수행되어 결과 벡터의 요소들에 대한 대응하는 결과들을 생성하는, 레인별(lane-by-lane) 연산을 포함할 수 있다. 벡터 또는 SIMD 프로세싱을 수행할 때, 각각의 벡터 레지스터는 소정의 벡터 길이 VL을 가질 수 있으며, 여기서, 벡터 길이는 주어진 벡터 레지스터 내의 비트 수를 지칭한다(예를 들어, 벡터 명령어들에 대한 벡터 길이 VL은 도 2a 내지 도 2d와 관련하여 앞서 언급된 제1 벡터 길이 VL1일 수 있음). 벡터 프로세싱 모드에서 사용되는 벡터 길이 VL은 주어진 하드웨어 구현예에 대해 고정될 수 있거나 가변적일 수 있다. CPU(60)에 의해 지원되는 ISA는 상이한 프로세서 구현예들이 상이한 크기의 벡터 레지스터들을 구현하도록 선택할 수 있게 가변적인 벡터 길이들을 지원할 수 있지만, ISA는 코드가 그 프로그램을 실행하는 주어진 CPU 상에서 구현되는 특정 벡터 길이에 관계없이 올바르게 기능할 수 있도록 명령어들이 설계되게 벡터 길이 애그노스틱할 수 있다. 예를 들어, 벡터 프로세싱 명령어들에 사용되는 특정 벡터 길이 VL을 나타내는 값을 저장하는 제어 레지스터(예를 들어, ZCR(81))가 있을 수 있다. 이러한 레지스터는 소프트웨어에 의해 판독되어, 소정의 수의 요소들의 프로세싱에 걸쳐 반복하는 루프들을, 더 긴 벡터 길이를 갖는 구현예들이 더 짧은 벡터 길이를 갖는 구현예들보다 더 적은 루프 반복들로 주어진 수의 요소들을 프로세싱할 수 있도록 제어할 수 있다.
벡터 레지스터들 Z0 내지 Z31은 또한, 도 4와 관련하여 위에서 논의된 바와 같은 외적 엔진(48, 86)에 의해 수행되는 외적 연산에 대한 입력들을 제공하는 벡터 피연산자들을 저장하기 위한 피연산자 레지스터들로서 역할을 할 수 있다. 벡터 레지스터들이 외적 연산 또는 다른 행렬 연산에 대한 입력들을 제공하기 위해 사용될 때, 벡터 레지스터들은, 벡터 연산들에 사용되는 벡터 길이 VL과 동일할 수 있거나 또는 상이한 벡터 길이(예를 들어, VL1 대신 VL2, 코프로세서(70)를 사용하는 실시예에서 모드 기능에 대해 위에서 논의된 바와 같음)일 수 있는, 행렬 벡터 길이 MVL을 갖는다. SIMD 연산들 및 행렬 연산들에 대해 상이한 벡터 길이들을 지원하기 위한 아키텍처적 지원을 ISA 레벨에서 제공함으로써, 이것은 위에서 논의된 바와 같이 코프로세서(70)를 사용하여 행렬 연산들을 구현하는 옵션을 포함하여, 프로세서 마이크로 아키텍처가 상이한 물리적 구현예들을 선택하기 위한 더 많은 유연성을 제공할 수 있다. ISA는 프로세서가 행렬 프로세싱 모드에서 동작하고 있는지 또는 비-행렬 프로세싱 모드에서 동작하고 있는지를 선택할 수 있는 모드 선택 명령어들을 지원할 수 있고, 이것은 구현되는 경우 코프로세서에 프로세싱을 오프로드(offload)하도록 CPU를 구성하는 데 유용할 수 있다. 이러한 경우, 모드 선택 명령어들은 또한, 다른 기능들 중에서도, 구현된 현재 벡터 길이의 스위칭을 트리거하여 현재 모드에 따라 VL 및 MVL 중 하나를 선택할 수 있다. 벡터 제어 레지스터들(81, 81')은 각각의 모드에 대해 VL 및 MVL로서 사용되는 특정 벡터 길이들을 나타내기 위해 제공될 수 있다.
따라서, 대체적으로, 후속 예들에 대해 논의되는 벡터 길이 MVL은 행렬 프로세싱 모드에서 사용되는 벡터 길이이며, 이는, 다른 모드들에서 사용되는 벡터 길이 VL과 동일할 수 있거나 동일하지 않을 수 있다. 제어 레지스터는 어떤 행렬 벡터 길이 MVL이 현재 프로세서 구현예에 대한 것인지를 나타내는 값을 저장할 수 있으며, 이는 프로그램 루프들을 제어하도록 소프트웨어에 이용가능해질 수 있다.
도 5에 도시된 바와 같이, 아키텍처적 레지스터들은 소정 수 NA의 어레이 레지스터들(88), ZA0 내지 ZA(NA-1)을 또한 포함한다. 각각의 어레이 레지스터는 단일 2D 어레이의 데이터, 예를 들어, 위에서 논의된 바와 같은 외적 연산의 결과를 저장하기 위한 한 세트의 레지스터 저장소로서 보여질 수 있다. 그러나, 외적 연산들이 어레이 레지스터들을 사용할 수 있는 유일한 연산들은 아닐 수 있다. 어레이 레지스터들은 또한, 메모리 내에서의 행렬 구조의 행/열 방향의 전위를 수행하는 동안 어레이들을 저장하기 위해 사용될 수 있다. 프로그램 명령어가 어레이 레지스터들(88) 중 하나를 참조할 때, 그것은 어레이 식별자 ZAi를 사용하여 단일 엔티티로서 참조되지만, 일부 유형들의 명령어(예를 들어, 데이터 전송 명령어)들은 또한 어레이의 일부(예를 들어, 하나의 수평/수직 그룹의 요소들)를 선택하는 색인 값을 정의함으로써 어레이의 하위 부분을 선택할 수 있다 .
도 5는 소프트웨어에 의해 보이는 바와 같은 어레이 레지스터들의 아키텍처적 뷰를 도시한다. 그러나, 도 6에 도시된 바와 같이, 실제로, 어레이 레지스터들에 대응하는 레지스터 저장소의 물리적 구현예는 소정 수 NR의 벡터 레지스터들, ZAR0 내지 ZAR(NR-1)을 포함할 수 있다. 어레이 레지스터 저장소(88)를 형성하는 벡터 레지스터들 ZAR은 행렬 프로세싱에 대한 벡터 입력들 및 SIMD 프로세싱에 사용되는 벡터 레지스터들 Z0 내지 Z31과는 별개의 세트의 레지스터들일 수 있다. 벡터 레지스터들 ZAR 각각은 행렬 벡터 길이 MVL를 가질 수 있으며, 이에 따라, 각각의 벡터 레지스터 ZAR은 가변적인 수의 데이터 요소들로 논리적으로 파티셔닝될 수 있는 길이 MVL의 1D 벡터를 저장할 수 있다. 예를 들어, MVL이 512 비트인 경우, 이것은, 예를 들어, 64개의 8 비트 요소들, 32개의 16 비트 요소들, 16개의 32 비트 요소들, 8개의 64 비트 요소들 또는 4개의 128 비트 요소들의 세트일 수 있다. 주어진 구현예에서 이들 옵션들 모두가 지원될 필요가 없을 것임이 이해될 것이다. 가변적인 요소 크기를 지원함으로써, 이것은 상이한 정밀도의 데이터 구조들을 수반하는 계산들을 핸들링하기 위한 유연성을 제공한다. 2D 어레이의 데이터를 표현하기 위해, 한 그룹의 벡터 레지스터들 ZAR0 내지 ZAR(NR-1)은 어레이 레지스터 식별자들 ZA0 내지 ZA(NA-1) 중 주어진 하나가 할당된 단일 엔티티로서 논리적으로 고려될 수 있으며, 이에 따라, 2D 어레이는 어레이의 하나의 차원에 대응하는 단일 벡터 레지스터 내에서 확장하는 요소들 및 다수의 벡터 레지스터들에 걸쳐 스트라이핑된 어레이의 다른 차원 내의 요소들로 형성된다.
어레이 레지스터들 ZA가, 수평 방향의 요소들의 수가 수직 방향의 요소들의 수와 같은, 정사각형 어레이들의 데이터를 저장하도록 행렬 프로세싱 회로부(46, 86)를 구현하는 것이 필수는 아니지만 유용할 수 있다. 이것은, 수평 방향으로 또는 수직 방향으로 어레이 레지스터들(88)을 판독/기입하기 위한 지원을 제공함으로써, 메모리 내의 행렬 구조의 행/열 차원들이 어레이 레지스터들(88)과 메모리(54) 사이에서 행렬을 전송할 시에 스위칭될 수 있는 행렬들의 즉각적인 전위를 지원하는 것을 도울 수 있다. 기계 학습 알고리즘들 및 행렬 데이터를 프로세싱하는 다른 응용예들이 메모리에 저장된 데이터를 위에서 논의된 바와 같이 행 우선 포맷 또는 열 우선 포맷으로 표현하는 것이 일반적이며, 일부 알고리즘들은 포맷들을 혼합하여 데이터를 프로세싱할 필요가 있을 수 있다. 이전 기법들에서, 일부 프로세싱이 입력 데이터가 메모리 내의 그것의 레이아웃과는 상이한 포맷이도록 요구하는 경우, 이것은, 포맷의 일관성을 보장하기 위해, 데이터가 행렬 프로세싱 연산들에서 프로세싱될 수 있기 전에, 다수의 로드/저장 명령어들 또는 벡터 치환 명령어들을 사용하여 메모리에 저장된 데이터의 일부 재배열을 요구할 수 있다. 이들 동작들은 느릴 수 있다. 2D 어레이 레지스터로부터의 데이터를 수평 방향 또는 수직 방향으로 기입/판독하기 위한 지원을 제공함으로써, 이것은, 메모리로부터 하나의 방향으로(예를 들어, 행별로) 로드된 데이터가, 메모리와 벡터 레지스터들 사이에서 데이터를 전송하기 위해 다수의 수집/분산 로드/저장 또는 치환 동작들을 사용하여 가능할 것보다 더 빠르게, 메모리로 반대 방향으로(예를 들어, 열별로) 라이트백될 수 있게 할 수 있다.
따라서, 어레이 레지스터들 ZA(88)가 대응하는 2D 어레이의 하나의 수평/수직 요소 그룹을 각각 저장하는 한 세트의 벡터 레지스터들 ZAR로서 구현될 때, 정사각형 행렬 제약이 만족되는 것을 보장하기 위해, 어레이는 하나의 벡터 레지스터 내에 피팅하는 데이터 요소들의 수와 같은 다수의 벡터 레지스터들에 걸쳐 있는 것이 바람직할 수 있다. 위에서 논의된 바와 같은 가변적인 데이터 요소 크기들을 지원할 때, 하나의 벡터 레지스터 내에 피팅할 수 있는 데이터 요소들의 수는 가변적이므로, 단일 어레이 레지스터 ZA를 형성하기 위해 함께 그룹화되는 벡터 레지스터들의 수도 또한 가변적일 수 있다.
하나의 접근법은, 각각의 어레이 레지스터 ZA(명령어 내에 어레이 레지스터 ID를 특정함으로써 아키텍처적 레지스터로서 액세스가능함)가 지원되는 최소 데이터 요소 크기에서 하나의 벡터 레지스터 내에 피팅할 수 있는 데이터 요소들의 최대 수에 대응하는 소정 수의 벡터 레지스터들에 대응할 수 있다는 것일 수 있다. 그러나, 이러한 경우, 어레이 레지스터들이 물리적 벡터 레지스터 저장소에 고정적으로 맵핑되면, 데이터 요소 크기가 더 커서 더 적은 데이터 요소들이 하나의 벡터 레지스터 내에 피팅할 때, 특정 어레이 레지스터 식별자에 맵핑된 고정된 세트의 벡터 레지스터들의 일부는 어레이 치수가 수축됨에 따라 사실상 낭비될 것이다.
따라서, 더 효율적인 구현예는, 어레이 레지스터들의 수 NA가 데이터 요소 크기 E에 따라 가변적이어서, 어레이 레지스터들 ZA를 구현하는 데 사용되는 물리적 레지스터 저장소 ZAR0 내지 ZAR(NR-1)이, 데이터 요소 크기에 관계없이 이용가능 물리적 저장소 전체를 사용하기 위해 데이터 요소 크기 E에 따라 상이한 크기 그룹들로 논리적으로 파티셔닝될 수 있다는 것일 수 있다. 이것은, 주어진 어레이 레지스터 식별자 ZA0 내지 ZA(NA-1)에 의해 참조되는 실제 물리적 저장 영역이 항상 동일하지는 않지만, 주어진 동작에 사용되는 현재 데이터 요소 크기 E에 따라 바뀐다는 것을 의미한다.
도 7 내지 도 11은 물리적 저장소가 파티셔닝되고 어레이 레지스터들에 대한 아키텍처적 레지스터 식별자들 ZA0 내지 ZA(NA-1)을 사용하여 참조될 수 있는 상이한 방식들을 도시한다. 도 7 내지 도 11의 예들에서, 행렬 벡터 길이 MVL이 512 비트라고 가정되지만, 다른 구현예들이 상이한 행렬 벡터 길이를 사용할 수 있으며, 이러한 경우에, 지원되는 특정 수의 어레이 레지스터들 ZA 또는 주어진 어레이 레지스터에 맵핑되는 특정 그룹들의 벡터 레지스터들 ZAR이 변경될 수 있다는 것이 이해될 것이다. 또한, 이러한 예는, 어레이 (행렬) 레지스터들(88)에 제공되는 벡터 레지스터들 ZAR의 총 수는 64이지만, 다시 이것은 ISA의 다른 구현예들에서 변경될 수 있다고 가정한다.
도 7은 현재 데이터 요소 크기 E가 32 비트일 때 어레이 레지스터 저장소의 파티셔닝을 도시한다. 이러한 경우, 512 비트 벡터 레지스터들을 이용하여, 각각의 크기가 32 비트인 16개의 요소들을 단일 벡터 레지스터 내에 피팅하는 것이 가능하다. 따라서, 정사각형 2D 어레이를 표현하기 위해, 16개의 벡터 레지스터들이 함께 그룹화되어 어레이 레지스터 식별자 ZA0 내지 ZA(NA-1)의 주어진 값에 의해 식별되는 단일의 16 x 16 2D 어레이를 표현할 수 있다. 예를 들어, 어레이 레지스터 ID ZA0에 대해, 이것은, 어레이 ZA0의 제0 내지 제15 수평 그룹들의 요소들을 각각 저장할 수 있고 제i 수직 그룹의 요소들이 벡터 레지스터들 ZAR0 내지 ZAR15 각각 내의 포지션 i에서의 요소들의 세트에 걸쳐 스트라이핑되는 벡터 레지스터들 ZAR0 내지 ZAR15에 맵핑한다(대안적으로, 다른 구현예들은 단일 벡터 레지스터 ZAR 내에 수직 그룹의 요소들을 배열하고, 다수의 벡터 레지스터들 ZAR의 대응하는 요소 포지션들에 걸쳐 수평 그룹의 요소들을 스트라이핑할 수 있음).
16개의 벡터 레지스터들 ZR이 32 비트 요소들의 16 x 16 타일을 표현하기에 충분하고 총 64개의 벡터 레지스터들이 있으므로, 이것은 4개의 개별 16 x 16 어레이들이 이용가능한 64개의 벡터 레지스터들 내에 저장될 수 있으며, 따라서 32 비트 요소 크기의 경우, 지원되는 어레이 레지스터들의 수 NA는 4라는 것을 의미한다. 즉, 물리적 저장소는 어레이 식별자들 ZA0 내지 ZA3으로 라벨링된 4개의 그룹들의 16개의 벡터 레지스터들로 나뉘며, 이는 어레이 저장 레지스터들과 메모리 사이에서 데이터를 전송하는 데이터 전송 명령어들에 의해 식별될 수 있다.
도 7의 좌측에 도시된 바와 같이, 4개의 개별 2D 어레이들 ZA0 내지 ZA3을 어레이 레지스터들(88)에 동시에 저장하는 것이 가능하므로, 이것은 주어진 양의 행렬 데이터를 프로세싱하는 것과 연관된 로드/저장 오버헤드의 일부 상각(amortisation)을 가능하게 한다. 예를 들어, 4개의 별개의 출력 타일들 ZA0 내지 ZA3은 4개의 벡터 피연산자들의 상이한 결합들(예를 들어, 도 7에 도시된 바와 같은 opa0, opb0의 외적에 기초한 ZA0, opa0, opb1의 외적에 기초한 ZA1, opa1, opb0의 외적에 기초한 ZA2, 및 opa1, opb1의 외적에 기초한 ZA3)로부터 생성될 수 있다. 이것은, 행렬 프로세싱 알고리즘들이 동일한 입력 벡터를, 많은 다른 입력 벡터들과 결합하여 재사용할 수 있기 때문에 유용할 수 있으며, 이에 따라, 다수의 외적 결과들이 벡터 레지스터(Z0 내지 Z31 중 하나)에 저장된 입력 벡터의 동일한 인스턴스로부터 계산되어, 더 많은 수의 계산 연산들 중에서 벡터들을 로드하는 것과 연관된 로드 오버헤드가 공유되고, 로드당 달성되는 유효 곱셈 수가 증가될 수 있게 하며, 이는 생성된 각각의 개별 결과 타일 ZA에 대해 개별적으로 한 쌍의 입력 피연산자들 opa, opb을 로드하는 것에 비해 성능을 개선하는 것을 도울 수 있다.
도 8은 현재 데이터 요소 크기 E가 16 비트일 때의 물리적 레지스터 저장소의 대안적인 파티셔닝을 도시하고 있으며, 이는, 32개의 요소들이 1개의 512 비트 벡터 레지스터(이러한 예에 대해서 MVL 크기) 내에 피팅되므로, 2개의 그룹들의 32개의 벡터 레지스터들 ZAR0 내지 ZAR31 및 ZAR32 내지 ZAR63이 16 비트 요소들의 32 x 32 타일을 각각 표현하는 어레이 식별자들 ZA0, ZA1에 맵핑된다는 것을 의미한다. 이러한 접근법으로, 어레이 저장소는 벡터 레지스터들 내의 단일 세트의 로드된 벡터 피연산자들 opa, opb0, opb1에 기초하여 2개의 개별 외적 연산들을 수행하여, opa와 opb0의 외적 및 opa와 opb1의 외적에 각각 기초하여 2개의 32 x 32 타일들 ZA0, ZA1을 생성하는 것을 지원할 수 있다. 따라서, 도 7에 비해, 개별 타일 내의 요소들의 수가 더 많지만(16 x 16개 대신 32 x 32개), 주어진 세트의 로드들에 대해 더 적은 타일들이 프로세싱될 수 있다.
도 9는 데이터 요소 크기가 8 비트이고, 따라서 64개의 요소들이 하나의 벡터 레지스터 내에 피팅하는 다른 구성을 도시하며, 이는, 모든 64개의 벡터 레지스터들 ZAR0 내지 ZAR63이 함께 그룹화되어 단일 2D 어레이 ZA0을 형성하는 것을 의미한다. 도 9는, 벡터들 opa, opb에 대해 단일 외적 연산을 수행하여 8 비트 요소들의 64 x 64 어레이 ZA0을 생성하는 것을 도시한다. 그러나, 일부 구현예들에서, 8 비트 요소 결과는 계산 연산들에 대해서는 지원되지 않을 수 있지만, 메모리 내의 데이터 구조에 대해 행/열 방향들을 바꾸는 데 사용하기 위해, 어레이 레지스터와 메모리 또는 벡터 레지스터 사이에서 데이터를 전송하는 어레이 로드/저장 데이터 전송 또는 레지스터 이동 데이터 전송 명령어들에서 사용되도록 제한될 수 있다.
유사하게, 도 10 및 도 11은 각각 64 비트 및 128 비트의 데이터 요소 크기들에 대한 어레이 저장소의 파티셔닝을 도시한다.
유사한 파티셔닝이 어레이 저장소(88) 내에 제공된 다른 행렬 벡터 길이들 MVL 또는 다른 수들 NR의 벡터 레지스터들에 대해 수행될 수 있음을 이해할 것이다.
외적 연산을 수행하도록 프로세싱 회로부를 제어하는 외적 명령어들은, 어느 벡터 레지스터들 Z0 내지 Z31이 외적 연산을 위한 2개의 벡터 피연산자들을 저장하는지를 식별하는 벡터 레지스터 식별자들을 특정할 수 있고, 외적 연산의 결과로 업데이트될 타일을 식별하는 목적지 어레이 레지스터 식별자 ZA0 내지 ZA(NA-1)을 특정할 수 있다. 프로세서의 행렬 프로세싱 하드웨어(48, 86)는, 위에서 논의된 가변적인 맵핑에 따라, 현재 데이터 요소 크기 E 및 특정된 어레이 레지스터 식별자 ZAi에 기초하여, 어느 물리적 벡터 레지스터들 ZAR이 외적 결과에 기초해 업데이트될지를 결정할 수 있다.
ISA는 또한, 2D 어레이의 일부를 선택된 어레이 레지스터 ZAi로 또는 그로부터 전송하기 위한 어레이 데이터 전송 명령어들을 정의할 수 있다. 하드웨어 회로 로직의 구현을 단순화하고 임의의 개별 명령어에 대해 전송될 필요가 있는 데이터의 양을 감소시키기 위해서는, 주어진 데이터 전송 명령어가, 하나의 명령어에서 전체 2D 어레이를 전송하기보다는, 선택된 어레이 레지스터 ZAi 내의 단일 수평/수직 그룹의 요소들에 대해 작용하는 것이 더 간단할 수 있다. 이는, 명령어가 데이터 전송 명령어의 파라미터에 따라, 판독/기입을 수평 방향으로 할지 또는 수직 방향으로 할지를 선택할 수 있기 때문에, 이전에 논의된 즉각적인 전위 기능을 지원하는 것을 또한 돕는다. 따라서, 선택된 어레이 레지스터 이외에, 데이터 전송 명령어는 어느 수평/수직 그룹의 요소들이 전송될지를 식별하는 색인을 또한 식별할 수 있다.
도 12는 어레이 데이터 전송 명령어의 예시적인 인코딩을 도시한다. 이러한 예에서, 명령어는 2D 어레이 레지스터 저장소 ZA(88)로부터 메모리(54)로 데이터를 전송하기 위한 저장 명령어이다. 메모리(54)로부터 어레이 레지스터 저장소(88)로 데이터를 로드하기 위한 로드 명령어인 어레이 데이터 전송 명령어를 제공하는 것이 또한 가능한데, 이는 도 12의 저장 명령어에 대해 도시된 것과 동일한 방식으로 그것의 메모리 어드레싱 정보 및 레지스터 어드레싱 정보를 특정한다.
도 12의 상부는 어셈블리 코드로 작성될 때의 어레이 데이터 전송 명령어의 예시적인 신택스를 도시하는 반면, 도 12의 하부는 어셈블러 표현에서 특정된 상이한 파라미터들을 표현하기 위해 할당된 다양한 비트 필드들을 갖는 명령어의 이진 인코딩을 도시한다.
도 12의 상부에 도시된 바와 같이, 데이터 전송 명령어는 다음을 포함하는 다수의 파라미터들을 특정한다:
Figure pct00003
데이터 전송에 사용될 어레이 레지스터 저장소(88)의 부분을 식별하기 위한 레지스터 어드레싱 정보(피연산자들),
Figure pct00004
데이터가 로드되거나 데이터가 저장될 메모리의 타깃 영역을 식별하기 위한 메모리 어드레싱 정보(피연산자들).
Figure pct00005
근거들에 의해 표시된 비활성 요소에 대응하는 요소 포지션에 대해 메모리가 업데이트되는 것(저장 명령어의 경우) 또는 레지스터 저장소가 업데이트되는 것(로드 명령어의 경우)을 방지하기 위해 어레이의 일부 데이터 요소들이 디스에이블화될 수 있도록 데이터 전송을 제어하기 위한 근거 값들을 제공하는 근거 피연산자들. 어레이 내의 수평 및 수직 그룹들의 요소들에 각각 대응하는 2개의 근거 값들 Ph, Pv가 있다.
메모리 어드레싱 피연산자들은 임의의 알려진 어드레싱 스킴(scheme)에 따라 메모리에서 업데이트될 어드레스들을 식별할 수 있다. 예를 들어, 메모리 어드레싱 피연산자들은 로드/저장 동작에 대한 어드레스를 도출하는 데 사용되는 스칼라 레지스터들의 하나 이상의 레지스터 식별자들 및 0개, 1개, 또는 그 이상의 즉시 값들을 포함할 수 있다. 예를 들어, 제1 스칼라 레지스터는 기준 어드레스를 제공할 수 있다. 오프셋 값은 제2 스칼라 레지스터에 저장된 값에 의해, 또는 명령어 인코딩에 직접 인코딩된 즉시 값에 의해 표현될 수 있으며, 여기서 오프셋이 기준 어드레스 레지스터 내의 값에 가산되어 데이터 전송을 위한 어드레스가 생성된다. 일부 경우에, 메모리 어드레싱 피연산자들은 또한, 어드레싱 모드에 관한 다른 정보를 특정하기 위한 추가의 피연산자들, 예를 들어, 기준 어드레스 레지스터 내의 값을 현재 로드/저장 명령어에 대한 어드레스를 계산하기 전에 증분할지 또는 어드레스를 계산한 후에 증분할지를 나타내는 피연산자를 포함할 수 있다. 피연산자들은 또한, 제2 레지스터에 의해 표현되는 오프셋 또는 즉시 값에 적용될 시프트 양을, 그것이 기준 레지스터 값에 가산되기 전에, 특정하는 파라미터를 포함할 수 있다. 대체적으로, 매우 다양한 메모리 어드레싱 모드들이 본 분야에 알려져 있으며, 임의의 그러한 알려진 어드레싱 모드는 어레이 데이터 전송 명령어에 대한 메모리 어드레싱 피연산자들을 정의하는 데 사용될 수 있다.
어레이 데이터 전송 명령어의 레지스터 어드레싱 피연산자들은, 저장 명령어의 경우, 어레이 레지스터 저장소(88)의 어느 부분이 메모리로 전송되어야 하는지를 식별하는 데 사용된다(로드 명령어의 경우, 레지스터 어드레싱 피연산자들은 어레이 레지스터 저장소(88)의 어느 부분이 로드된 데이터로 업데이트될 것인지를 식별할 것임). 레지스터 어드레싱 피연산자들은 어레이 식별자(ID) ZAi(또는 소프트웨어에 의해 사용되는 어셈블러 표현에서는 "zai")를 포함하며, 여기서 i는 현재 로드/저장 명령어를 위해 선택된 특정 아키텍처적 어레이 레지스터 ZA0 내지 ZA(NA-1)의 번호를 표현한다. 레지스터 어드레싱 피연산자들은 또한, 식별된 어레이 레지스터 ZAi가 수평 방향으로 액세스되어야 하는지 또는 수직 방향으로 액세스되어야 하는지를 나타내는 방향 식별자 d를 포함한다. 레지스터 어드레싱 피연산자들은 또한, 앞서 논의된 바와 같이 다수의 상이한 요소 크기들로부터 선택될 수 있는, 현재 연산에 대한 현재 요소 크기인 요소 크기 E의 표시를 포함한다. 또한, 레지스터 어드레싱 피연산자들은 데이터가 전송될, 선택된 어레이 레지스터 ZAi 내의 수평/수직 그룹의 요소들의 포지션을 나타내는 행/열 색인 J를 생성하기 위한 기준 레지스터 Wx 및 즉시 값 #y를 포함한다. 기준 레지스터 식별자 Wx는 색인 J를 생성하기 위해, 데이터 전송 명령어의 명령어 인코딩 내에 직접 인코딩된 즉시 값 #y에 의해 표현되는 오프셋에 가산될 기준 값을 제공하는 스칼라 레지스터를 식별한다. 이러한 예에서, 색인 J가 주어진 벡터 길이 MVL 및 요소 크기 E에 대해 지원되는 요소 포지션들의 범위 내에 있음을 보장하기 위해, 색인 값 J는 (Wx 내의 값 + #y) MODULO (MVL/E)로 설정된다. 모듈로(modulo) 연산은 (Wx 내의 값 + #y)을 (MVL/E)로 나눌 때 나머지를 결정하는 것을 지칭하지만, 실제로는 MVL 및 E가 2의 거듭제곱이므로, 모듈로 연산은 합계의 하위 비트들을 반환함으로써 간단히 구현될 수 있는데, 그 이유는, dim=MVL/E인 경우, J가 (Wx 내의 값 + #y)의 최하위 log2(dim) 비트이기 때문이다. 기준 레지스터 및 즉시 값의 결합을 사용하여 행/열 색인을 표현함으로써, 이것은 아래에서 더 논의될 바와 같이 행렬 구조의 상이한 치수들에 대해 스케일링할 수 있고 루프 언롤링을 지원하는 소프트웨어 코드를 지원하는 데 유용하다.
이러한 예에서, 색인 값 J는 어레이 레지스터 ZAi에 대해 선택된 액세스 방향이 수평 방향인지 또는 수직 방향인지에 관계없이 동일한 방식으로 표현된다. 방향 식별자 d는 선택된 어레이 레지스터 ZAi에 대응하는 벡터 레지스터들 ZAR의 그룹 내의 어느 특정 요소들이 판독/기입되는지를 선택한다. 예를 들어, 방향 식별자가 수평 방향을 선택하는 경우, 전송되는 요소들은 ZAi에 대응하는 그룹 내의 J번째 벡터 레지스터 ZAR로부터 판독되고(또는 로드 명령어의 경우, 그것에 기입됨), 방향 식별자가 수직 방향을 선택하는 경우, 전송되는 요소들은 ZAi에 대응하는 그룹 내의 벡터 레지스터들 ZAR 각각 내의 J번째 요소로부터 판독된다(또는 로드 명령어의 경우, 그것에 기입됨)(또는 수직/수평 방향들이 벡터 레지스터들 ZAR의 레이아웃에 대해 방향이 바꿔진 경우, 그 역도 성립함).
도 12의 하부에 도시된 바와 같이, 명령어의 이진 인코딩은 이러한 명령어가 어레이 로드/저장 데이터 전송 명령어임을 식별하는 연산코드(opcode)뿐만 아니라, 전술한 바와 같은 명령어의 어셈블러 표현에 특정된 다양한 파라미터들에 대응하는 다수의 필드들을 포함할 수 있다. 예를 들어, 명령어 인코딩의 필드들은 방향 식별자 D, 현재 데이터 요소 크기 E, 레지스터 어드레싱 피연산자들의 행/열 색인을 생성하기 위해 기준 레지스터를 식별하는 기준 레지스터 식별자 Wx, 수평 및 수직 근거 값들을 제공하기 위한 근거 레지스터들 Ph 및 Pv, 및 다양한 메모리 어드레싱 피연산자들을 표현하도록 할당될 수 있다.
이러한 예에서, 레지스터 어드레싱 피연산자들의 기준 레지스터를 식별하기 위한 스칼라 레지스터 필드 Wx는 디코더(30) 및 프로세서에 의해 지원되는 적어도 하나의 다른 명령어 내의 스칼라 레지스터 필드들에 사용되는 비트 수 K보다 더 작은 소정의 비트 수 L을 갖는다(예를 들어, 정수 ALU 명령어들은 그들의 소스/목적지 레지스터들에 대해 K 비트 레지스터 필드들을 특정할 수 있음). 예를 들어, 도 5의 예에서 K = 5이다. 그러나, 어레이 로드/저장 데이터 전송 명령어 내의 기준 레지스터 필드의 크기를 감소시키기 위해, 도 12에 도시된 바와 같이, Wx 필드는 L 비트를 가질 수 있으며(L < K), 이에 따라, 어레이 데이터 전송 명령어에 대한 행/열 색인을 생성하기 위한 기준 레지스터로서 특정될 수 없는 일부 스칼라 레지스터들이 존재한다. 예를 들어, L = 2인 경우, 데이터 전송 명령어는 4개의 스칼라 레지스터들(예를 들어, W12 내지 W15)의 제한된 서브세트로부터 선택하는 것으로 제한될 수 있다. 이것은, 명령어가 특정될 많은 수의 파라미터들을 이미 갖고 있으며, 행렬 프로세싱의 루프들을 제어하는 데 있어서 예상되는 사용 사례들의 경우, 단일 프로그램 루프 내에서 레지스터 어드레싱을 위해 단지 몇 개의 상이한 기준 레지스터들만을 정의하는 것이면 충분할 수 있고, 이에 따라, 색인 J를 생성하기 위해 기준 레지스터를 식별하기 위한 스칼라 레지스터 필드의 크기를 제한함으로써, 이것은 명령어 코딩을 더 효율적으로 만들고 다른 파라미터들을 표현하기 위한 다른 비트 공간을 확보한다는 것을 인식한다. 물론, 이것은 필수가 아니며, 다른 구현예들은 레지스터 어드레싱 피연산자들에 대한 기준 레지스터로서 식별되고 있는 임의의 스칼라 레지스터를 지원하는 스칼라 레지스터 필드 Wx를 제공할 수 있다.
도 12가, 현재 데이터 요소 크기 E가 소정 비트 필드를 사용하여 명령어의 인코딩 내에 직접 인코딩되는 예를 도시하고 있지만, 다른 옵션은, 현재 데이터 요소 크기가, 이전 명령어들에 의해 설정되고, 어레이 데이터 전송 명령어를 프로세싱할 때, 현재 데이터 요소 크기를 식별하기 위해 참조될 수 있는 제어 레지스터에 저장될 수 있다는 것일 수 있으며, 이에 따라, 현재 데이터 요소 크기 E를 명령어 인코딩 자체 내에 표현하는 것이 필수가 아닐 수 있다.
이러한 예에서, 레지스터 어드레싱 정보의 행/열 색인을 생성하기 위한 어레이 ID i 및 즉시 값 #y는 데이터 전송 명령어의 명령어 인코딩 내의 결합 필드에 의해 표현된다. 이것은 도 13에 더 상세히 도시되어 있다. 이러한 결합 인코딩은, 가변적인 데이터 요소 크기 E에 대해, 데이터 요소 크기가 증가함에 따라, 이용가능 물리적 어레이 저장소 내에 피팅할 수 있는 별개의 2D 어레이들의 수가 증가하는 한편, 개별 어레이의 치수들은 감소한다는 사실을 이용한다. 따라서, 어레이 ID 및 즉시 값 둘 모두는 데이터 요소 크기에 종속하지만, 역 스케일링 관계들을 이용하며, 이것은, 일정한 비트 수의 결합 필드가 일부 데이터 요소 크기들에 대한 어레이 ID의 부분으로서 그리고 다른 데이터 요소 크기들에 대한 즉시 값의 부분으로서 가변적으로 맵핑되어 결합 필드 내에 2개의 파라미터들을 표현하는 것이 효율적일 수 있다는 것을 의미한다.
또한, 행렬 벡터 길이 MVL에 대해 상이한 크기들을 구현할 수 있는 프로세서 구현예들의 범위에서 올바르게 동작할 수 있는 벡터 길이 애그노스틱 코드를 지원하기 위해, 레지스터 어드레싱 피연산자들에 대해 특정된 특정 즉시 값들은 구현된 특정 행렬 벡터 길이 MVL에 관계없이 코드에 의해 동일한 값들로 설정되어야 한다는 것이 바람직하다고 인식된다. 실제로, 이것은, 지원되는 최소 행렬 벡터 길이 MVLmin에서 동작하는 프로세서 구현예에서 단일 벡터 레지스터 ZAR 내에 피팅할 수 있는 데이터 요소들의 최대 수보다 더 많은, #y에 대한 다수의 인코딩들을 지원하기 위한 인코딩 공간을 제공하는 데 있어서 이점이 없음을 의미한다. 이것은, 최소치보다 더 큰 벡터 길이를 갖는 구현예들에서는, 벡터 레지스터당 더 많은 수의 요소들을 참조하는 것이 가능할 것이라 하더라도, 코드가 즉시 값 #y에서 그러한 추가적인 데이터 요소들을 직접 참조할 수 없을 것이기 때문인데, 그 이유는, 그렇지 않으면, 코드가, 최소 벡터 길이 MVLmin을 구현하는 구현예 상에서 올바르게 기능하지 않을 것이므로, 더 이상 벡터 길이 애그노스틱하지 않을 것이기 때문이다. 이것은, 즉시 값 #y에 대해 지원되는 상이한 값들의 수가 MVLmin/E 이하가 되도록, 결합된 어레이 ID/즉시 값 필드의 크기가 선택될 수 있다는 것을 의미한다(다시 말해, N 비트 즉시 값의 경우, 2N ≤ MVLmin/E임). 예를 들어, ISA에 의해 지원되는 최소 벡터 길이 MVLmin이 128 비트인 경우, 현재 데이터 요소 크기 E가 8일 때, 128/8 = 16(이는 4 비트로 표현될 수 있음)(즉, 0 내지 15)이기 때문에, 4 비트면 즉시 값을 표현하기에 충분할 것이다.
따라서, 도 13의 예에 도시된 바와 같이, 데이터 전송 명령어의 4 비트 결합 필드는 수평/수직 색인 J를 생성하기 위한, 어레이 ID i(어느 어레이 레지스터 ZAi가 액세스되는지를 정의함) 및 즉시 값 #y 둘 모두를 표현할 수 있다. 지원되는 최소 데이터 요소 크기(예를 들어, 8 비트)에서, 결합 필드의 4 비트 모두가 즉시 값 #y의 비트들을 표현하기 위해 할당될 수 있는데, 그 이유는, 이러한 요소 크기에서는, 도 9에 도시된 바와 같이, 어레이 레지스터들에 대응하는 전체 물리적 레지스터 저장소 ZAR0 내지 ZAR63이 단일 2D 어레이 ZA0에 맵핑되므로, 어레이 ID를 특정할 필요가 전혀 없기 때문이다. 이러한 경우에, 수평/수직 방향들로 64개의 상이한 요소 포지션들이 존재하지만, 즉시 값 #y는 MVL = MVLmin = 128 비트인 구현예들을 지원하기 위해 0 내지 15의 범위 내에서만 스케일링되며, 여기서는 16개의 8 비트 요소들만이 단일 벡터 레지스터 내에 피팅할 수 있다. 16 내지 63의 범위 내의 요소 포지션들에 액세스하는 것은 소프트웨어 코드가 레지스터 Wx의 기준 값을 0 이외의 값으로 특정하는 것을 요구할 것이다.
한편, 더 큰 데이터 요소 크기들에서는, 지원되는 최소 벡터 길이의 벡터 레지스터 내에 피팅할 수 있는 그 크기의 데이터 요소들의 수가 감소함에 따라, 즉시 값을 위해 더 적은 비트들이 필요로 되지만, 이어서, 이들 예들에서는, 어레이 ID i를 표현하기 위해 결합 필드의 추가적인 비트들이 할당된다.
도 14는 위에서 논의된 어레이 데이터 전송 명령어를 사용할 수 있는 프로그램 코드의 예를 도시한다. 도 14의 좌측은 2개의 행렬들 A[N×K] 및 B[K×M]를 곱하여 결과 C[N×M]를 제공하기 위한, 고레벨 프로그래밍 언어로 프로그래머에 의해 작성된 고레벨 프로그램 코드를 도시한다. 프로그래머는, 메모리에 저장된 2개의 행렬 구조들의 각각의 행들/열들을 단계별로 실행하고, 프로세싱할 행들/열들을 로드하고, 행렬들 중 하나의 행렬의 행과 다른 행렬의 열에 대응하는 벡터들의 쌍들에 대해 다수의 외적 연산들을 수행하고, 다수의 외적 결과들을 누산한 생성된 결과를 메모리로 라이트백하도록 의도된 프로그램 루프를 작성할 수 있다.
예를 들어, 도 14에서, 고레벨 코드는, 각각의 반복에서, 행렬 A의 2개의 열들과 행렬 B의 2개의 행들이 외적 연산들을 위한 입력 벡터들로서 로드되는 루프를 도시한다. 4개의 외적 연산들이 각각의 열들 및 행들의 쌍들에 대해 수행되어(도 7에 도시된 예와 유사함) 4개의 개별 2D 어레이들의 출력 데이터가 생성된다. 로드/계산 루프는 메모리 내의 행렬 구조들의 상이한 행/열 포지션들에 걸쳐 반복되며, 이에 따라, ZA0 내지 ZA3이 행렬 A로부터의 타일들과 행렬 B로부터의 타일들을 곱한 결과들을 누산하게 된다. 후속 저장 루프는 결과 타일들 ZA0 내지 ZA3의 각각의 행들/열들을 다시 메모리 내의 결과 행렬 구조 C에 저장한다. 외부 루프는 행렬들 A 및 B의 타일들의 다른 결합들에 걸쳐 반복하도록 로드/계산 루프 및 저장 루프 둘 모두에 걸쳐 반복한다.
도 14의 우측은 도 14의 좌측의 고레벨 코드의 컴파일링된 어셈블러 표현을 도시한다. 내부 루프(로드/계산 루프) 내에는, 메모리 내의 행렬들 A/B의 각각의 열들 또는 행들을 갖는 벡터 레지스터들 Z4 내지 Z7을 로드하는 일부 벡터 로드 명령어들, 및 벡터 레지스터들 Z4 내지 Z7 내의 각각의 벡터 피연산자들의 쌍들로부터, 어레이 레지스터들 ZA0 내지 ZA3에 기입되는 외적 결과들을 생성하는 외적 명령어들 FMOPA가 존재한다. 이러한 예에서, 요소 크기는 32 비트이며, 이에 따라, 내부 루프의 단일 반복 내에서 생성될 수 있는 4개의 타일들이 존재한다(도 7의 예가 주어짐). 이러한 예에서, E = 32 비트의 데이터 요소 크기는 다양한 로드/저장 및 외적 명령어들의 어셈블러 표현 내에 요소 크기 식별자 .s를 가짐으로써 표현된다. 외적 명령어들은 외적 및 누산 명령어들이며, 이에 따라, 예를 들어, 명령어 "fmopa za0.s…"는 어레이 레지스터 ZA0의 각각의 요소의 이전 콘텐츠들을, 벡터 레지스터들 Z4 및 Z6 내의 벡터 피연산자들에 대해 수행된 외적 연산에서 생성된 요소에 가산시킨다.
도 14의 어셈블러 코드의 하단에서의 루프는, 어레이 레지스터들 ZA0 내지 ZA3으로부터의 생성된 2D 어레이들을 메모리로 전송하는 데 사용되는 어레이 저장 데이터 전송 명령어들 "st1w"를 포함한다. 이들은 도 12와 관련하여 논의된 인코딩을 갖는다. 이러한 예에서, 방향 식별자 d는 (어셈블러 표현에서 zaih.s에 의해 나타낸 바와 같이) 수평 방향을 특정하며, 이에 따라, 도 14의 예에 도시된 기준 레지스터 W12 및 즉시 값 #0은 대응하는 저장 명령어에 응답하여 메모리로 전송될, 선택된 어레이 레지스터 ZAi(ZA0 내지 ZA3 중 하나)의 특정 수평 그룹의 요소들을 식별하는 색인 값 J를 생성하는 데 사용된다. 생성된 어레이들 ZA0 내지 ZA3 각각의 모든 요소들이 메모리에 저장될 때까지, 저장 명령어들이 생성된 2D 어레이들의 각각의 수평 그룹의 요소들을 단계별로 실행하도록, 기준 레지스터 W12의 값이 각각의 루프 반복에 대해 증분되면서 반복하는 루프가 구성된다. 저장 루프의 하단에 있는 "add" 명령어들은 메모리 어드레싱 정보 및 레지스터 어드레싱 정보를 위해 사용되는 기준 레지스터들 x17, w12를 각각 증분시키고, 비교 명령어 "cmp"는 분기 명령어 "blt"가 루프를 종료할지 여부를 결정할 수 있게 하기 위해 w12(이는 이러한 예에서 루프 카운터로서 또한 기능함) 내의 값을 비교한다.
도 14는 코드의 하부에서의 저장 루프를 생성할 때 컴파일러가 루프 언롤링을 사용하지 않은 어셈블러 코드의 예를 도시한다. 이러한 예에서, 4개의 저장 명령어들 각각에 대한 즉시 값은 #0이며, 이에 따라, 주어진 2D 어레이 ZA0 내지 ZA3으로부터 저장될 특정 행/열을 선택하는 데 사용되는 색인 값은 기준 레지스터 W12에 저장된 값에 의해 간단히 식별된다.
그러나, 그러한 코드 구현예에 있어서, 저장 루프의 각각의 루프 반복에서, w12를 증분하기 위한 "add" 명령어 및 루프를 종료할지 여부를 결정하는 데 사용되는 비교 및 분기 명령어들 "cmp", "blt"에 소정량의 오버헤드가 존재한다. 이러한 루프 제어 명령어들과 연관된 오버헤드는 루프 언롤링을 수행함으로써 감소될 수 있으며, 여기서 다수의 루프 반복들은 원래 루프 내에서 다수의 반복들에 대응했을 명시적인 명령어들을 포함한 더 큰 루프의 단일 반복으로 언롤링된다. 예를 들어, 도 14에 도시된 저장 루프는 하기와 같은 코드로 대체될 수 있다:
mov w12, #0
1: st1w { za0h.s[w12, #0] }, p0, p4, [x17, xzr, lsl #2]
st1w { za1h.s[w12, #0] }, p0, p5, [x17, x2, lsl #2]
st1w { za2h.s[w12, #0] }, p1, p4, [x17, x3, lsl #2]
st1w { za3h.s[w12, #0] }, p1, p5, [x17. x4, lsl #2]
st1w { za0h.s[w12, #1] }, p0, p4, [x18, xzr, lsl #2]
st1w { za1h.s[w12, #1] }, p0, p5, [x18, x2, lsl #2]
st1w { za2h.s[w12, #1] }, p1, p4, [x18, x3, lsl #2]
st1w { za3h.s[w12, #1] }, p1, p5, [x18. x4, lsl #2]
st1w { za0h.s[w12, #2] }, p0, p4, [x19, xzr, lsl #2]
st1w { za1h.s[w12, #2] }, p0, p5, [x19, x2, lsl #2]
st1w { za2h.s[w12, #2] }, p1, p4, [x19, x3, lsl #2]
st1w { za3h.s[w12, #2] }, p1, p5, [x19. x4, lsl #2]
st1w { za0h.s[w12, #3] }, p0, p4, [x20, xzr, lsl #2]
st1w { za1h.s[w12, #3] }, p0, p5, [x20, x2, lsl #2]
st1w { za2h.s[w12, #3] }, p1, p4, [x20, x3, lsl #2]
st1w { za3h.s[w12, #3] }, p1, p5, [x20. x4, lsl #2]
add x17, x17, x2, lsl #3 // x17 += 2*dim
add x18, x18, x2, lsl #3 // x18 += 2*dim
add x19, x19, x2, lsl #3 // x19 += 2*dim
add x20, x20, x2, lsl #3 // x20 += 2*dim
add w12, w12, #4
cmp w12, dim
blt 1b
[…]
mstop
이러한 예에서, 원래 루프의 4개의 개별 반복들은 새로운 루프의 단일 반복으로 언롤링될 수 있으며, 이는 w12를 증분시키기 위한 "add" 명령어와 비교 및 분기 명령어들이 실행되는 횟수를 감소시킨다. 메모리 어드레스를 생성하기 위한 메모리 어드레싱 정보가, 추가적인 즉시 오프셋이 타깃 메모리 어드레스를 생성하기 위해 기준 값에 가산되는 요소 크기의 배수를 나타내면서, 기준 + 즉시 어드레싱 모드를 사용하는 경우에 추가의 성능 개선이 달성될 수 있는데, 그 이유는, 이러한 경우에, 상이한 저장 명령어들이, 각각의 루프 반복에서 레지스터들 x18 내지 x20을 증분하기 위한 3개의 가산 명령어들을 추가로 제거하기 위해, 단일 레지스터 x17에 기초하여, 언롤링된 루프 반복들에 대해 상이한 어드레스들을 타깃화할 수 있기 때문이다.
위의 코드는 단지 하나의 예일 뿐이지만, 레지스터 어드레싱 정보 내에서 기준 레지스터 및 즉시 값을 사용하여 수평/수직 포지션 색인 J를 표현하는 것이, 상이한 치수(반복당 계산될 ZA 행렬 타일의 치수를 표현하는 도 14에 도시된 변수 dim을 참조)들의 데이터 구조들을 이용하여 연산할 수 있는 스케일링가능한 코드를 지원하는 것뿐만 아니라, 컴파일러에 의한 루프 언롤링을 지원하는 데 유용할 수 있는 이유를 예시하는 것을 돕는다는 것이 이해될 것이다.
도 12의 예는 로드/저장 명령어인 어레이 데이터 전송 명령어를 도시하며, 여기서 데이터는 메모리(54)와 어레이 레지스터 저장소(88)의 타깃 부분 사이에서 전송된다.
레지스터 어드레싱 정보를 사용하여 어레이 레지스터들(88)에 액세스하는 데이터 전송 명령어의 다른 예가 도 15에 도시되어 있다. 도 15는 어레이 레지스터들(88)과 벡터 레지스터들(82) 사이에서 데이터를 전송하기 위한 레지스터 이동 명령어를 도시한다. 연산코드는 도 12의 로드/저장 어레이 데이터 전송 명령어의 연산코드와는 상이한 값을 갖는다. 레지스터 이동 명령어의 레지스터 어드레싱 정보는 도 12의 예에서와 동일한 방식으로 인코딩된다. 그러나, 메모리의 타깃 영역을 식별하는 메모리 어드레싱 정보를 제공하는 대신, 레지스터 이동 명령어는 선택된 벡터 레지스터(82)를 특정하는 벡터 레지스터 식별자 Zk를 특정한다. 레지스터 이동 명령어의 상이한 변형들(상이한 연산코드들로 표현됨)이 제공될 수 있다. 요소들의 벡터를 벡터 레지스터 Zk로부터 (예를 들어, 도 12의 예에 대해 위에서 논의한 바와 동일한 방식으로, 방향 식별자 d, 어레이 레지스터 ID i, 요소 크기 E, 기준 레지스터 Wx 및 즉시 값 #y를 포함하는 어레이 레지스터 어드레싱 정보에 기초하여 식별된 바와 같이) 선택된 어레이 레지스터 ZAi의 수평/수직 그룹의 요소들 J로 전송하도록 프로세싱 회로부를 제어하는 벡터-대-어레이 레지스터 이동 변형이 있을 수 있다. 유사하게, 데이터를 선택된 어레이 레지스터 ZAi의 수평/수직 그룹의 요소들 J로부터 벡터 레지스터 Zk로 이동시키도록 프로세싱 회로부를 제어하는 어레이-대-벡터 레지스터 이동 변형이 있을 수 있다. 두 형태 모두의 명령어는 소정의 행렬 프로세싱 알고리즘들을 지원하는데 유용할 수 있으며, 여기서 때때로, 행렬에 대해 2D 연산을 전체적으로 수행하기 전 또는 후에, 행렬의 단일 행/열 내의 요소들에 일부 조작들을 수행할 필요가 있을 수 있다. 레지스터 이동 명령어들은 그러한 단일 행/열 조작들이 수행될 수 있게 하기 위해 벡터 레지스터들로/로부터 요소들을 전송하는 것을 지원할 수 있다.
도 16은 전술한 어레이 데이터 전송 명령어와 같은 데이터 전송 명령어의 프로세싱을 예시하는 흐름도를 도시한다. 단계(S200)에서, 프로세싱을 기다리고 있는 다음 명령어가 명령어 디코더(30)에 의해 디코딩되고, 단계(S202)에서, 명령어 디코더(30)는 디코딩된 명령어의 유형을 식별한다. 명령어가 어레이 데이터 전송 명령어가 아닌 경우, 단계(S204)에서, 명령어에 의해 표현되는 동작이 명령어 디코더(30)의 제어 하에서 프로세싱 회로부에 의해 수행되고, 방법은 다음 명령어를 디코딩하기 위해 단계(S200)로 복귀한다.
명령어 디코더(30)에 의해 디코딩된 명령어가 어레이 데이터 전송 명령어라고 식별되는 경우, 단계(S206)에서, CPU(60) 또는 코프로세서(70)의 명령어 디코더(30) 및/또는 실행 스테이지(36)는 데이터 전송 동작에 사용할 레지스터 저장소의 타깃 부분을 식별하며, 이때, 레지스터 저장소의 타깃 부분은 데이터 전송 명령어의 레지스터 어드레싱 정보에 기초하여 식별된다. 레지스터 어드레싱 정보는 기준 레지스터 식별자 및 즉시 값을 포함한다. 프로세싱 회로부는 기준 레지스터 식별자에 의해 식별된 기준 레지스터에 보유된 값과 즉시 값에 의해 표현되는 값의 가산에 기초하여 색인 값 J를 생성한다. 색인 값 J를 사용하여 데이터 전송의 영향을 받는 레지스터 저장소의 타깃 부분을 선택한다.
단계(S208)에서, 프로세싱 회로부는 (명령어 디코더의 제어 하에서) 디코딩된 어레이 데이터 전송 명령어의 유형을 식별한다. 단계(S208)가 간결성을 위해 단계(S206) 이후에 도시되어 있지만, 다른 예들에서, 그것은 또한 단계(S206) 이전에 수행될 수 있으며, 그 경우, 단계(S206)는 단계(S208) 이후의 두 가지 대안적인 분기들 모두의 프로세싱 상에 나타난다.
데이터 전송 명령어가 도 12의 예와 유사한 로드/저장 명령어인 경우, 단계(S210)에서, 프로세싱 회로부는 명령어에 의해 특정된 메모리 어드레싱 정보에 기초하여, 데이터 전송에 사용될 메모리의 타깃 부분을 결정한다. 이것은 임의의 알려진 어드레싱 모드에 따라 행해질 수 있고, 명령어에 의해 식별된 레지스터들 또는 명령어 인코딩에 의해 식별된 즉시 값들에 기초할 수 있다.
단계(S212)에서, 이어서 프로세싱 회로부는, 레지스터 저장소의 타깃 부분과 메모리의 타깃 부분 사이에서 데이터를 전송하기 위한 데이터 전송 동작을 수행하도록 명령어 디코더(30)에 의해 제어된다. 명령어가 로드 명령어인 경우, 데이터 전송 동작은 메모리의 타깃 부분으로부터 데이터를 로드하는 것 및 그것을 레지스터 저장소의 타깃 부분에 저장하는 것을 포함한다. 명령어가 저장 명령어인 경우, 데이터 전송은 레지스터 저장소의 타깃 부분으로부터 메모리의 타깃 부분으로 데이터를 저장하는 것을 포함한다. 이어서, 방법은 단계(S200)로 복귀하여 다음 명령어를 디코딩한다.
단계(S208)에서, 어레이 데이터 전송 명령어가 레지스터 이동 명령어라고 결정되는 경우(도 15와 유사함), 단계(S214)에서, 추가의 레지스터 어드레싱 정보에 기초하여(예를 들어, 어느 레지스터가 레지스터 저장소의 추가의 부분인지를 식별하는 명령어 인코딩 내의 레지스터 필드 Zk에 기초하여) 레지스터 저장소의 추가의 부분이 식별된다. 단계(S216)에서, (실행되는 특정 명령어 유형에 따라 어느 방향으로든) 기준 레지스터 Wx 및 즉시 값 #y에 기초하여 식별된 레지스터 저장소의 타깃 부분과 레지스터 저장소의 추가의 부분 사이에서 데이터를 전송하도록 데이터 전송 동작이 수행된다. 다시, 방법은 단계(S200)로 복귀하여 다음 명령어를 디코딩한다.
도 12 및 도 15의 예는 기준 레지스터 및 즉시 값을 사용하여 데이터 전송에 사용할 어레이 레지스터 저장소(88)의 타깃 부분을 선택하는 데 사용되는 색인 값을 표현하는 레지스터 어드레싱 정보를 포함하는 어레이 데이터 전송 명령어들을 도시한다. 그러나, 레지스터 어드레싱 정보의 그러한 인코딩은 또한, 2D 어레이들의 데이터를 저장하기 위한 어레이 레지스터들(88) 이외의 유형들의 레지스터들에 액세스하는 다른 유형들의 명령어에 사용될 수 있다. 보다 대체적으로, 이러한 방식의 레지스터 어드레싱 정보의 인코딩은 루프 언롤링을 지원하면서 가변적인 치수들을 가질 수 있는 데이터의 부분들을 프로세싱하도록 의도된 명령어들에 유용할 수 있다.
도 17은 사용될 수 있는 시뮬레이터 구현예를 예시한다. 전술된 실시예들은 관심 기법들을 지원하는 특정 프로세싱 하드웨어를 동작시키기 위한 장치 및 방법들과 관련하여 본 발명을 구현하지만, 컴퓨터 프로그램의 사용을 통해 구현되는 본 명세서에서 기술되는 실시예들에 따라 명령어 실행 환경을 제공하는 것이 또한 가능하다. 그러한 컴퓨터 프로그램들은, 그들이 하드웨어 아키텍처의 소프트웨어 기반 구현예를 제공하는 한, 종종 시뮬레이터들로 지칭된다. 다양한 시뮬레이터 컴퓨터 프로그램들은 에뮬레이터들, 가상 기계들, 모델들, 및 동적 이진 변환기(dynamic binary translator)들을 포함한 이진 변환기들을 포함한다. 전형적으로, 시뮬레이터 구현예는 호스트 프로세서(330) 상에서 실행되어, 호스트 운영 체제(320)를 선택적으로 실행하여, 시뮬레이터 프로그램(310)을 지원할 수 있다. 일부 배열들에서, 하드웨어와 제공된 명령어 실행 환경 사이에 다수의 시뮬레이션 계층들이 있을 수 있고/있거나, 동일한 호스트 프로세서 상에 제공된 다수의 별개의 명령어 실행 환경들이 있을 수 있다. 이력상, 강력한 프로세서들이 합리적인 속도로 실행되는 시뮬레이터 구현예들을 제공하는 데 요구되었지만, 그러한 접근법은 호환성 또는 재사용 이유들을 위해 다른 프로세서에 고유한 코드를 실행하려는 요구가 있을 때와 같은 소정 상황들에서 정당화될 수 있다. 예를 들어, 시뮬레이터 구현예는 호스트 프로세서 하드웨어에 의해 지원되지 않는 추가적인 기능을 명령어 실행 환경에 제공할 수 있거나, 또는 상이한 하드웨어 아키텍처와 전형적으로 연관된 명령어 실행 환경을 제공할 수 있다. 시뮬레이션의 개요가 문헌["Some Efficient Architecture Simulation Techniques", Robert Bedichek, Winter 1990 USENIX Conference, Pages 53 - 63]에서 주어진다.
실시예들이 특정 하드웨어 구성물들 또는 특징부들을 참조하여 전술되었음을 고려한 결과로, 시뮬레이션된 실시예에서, 등가의 기능이 적합한 소프트웨어 구성물들 또는 특징부들에 의해 제공될 수 있다. 예를 들어, 특정 회로부는 시뮬레이션된 실시예에서 컴퓨터 프로그램 로직으로서 구현될 수 있다. 유사하게, 레지스터 또는 캐시와 같은 메모리 하드웨어가 시뮬레이션된 실시예에서 소프트웨어 데이터 구조로서 구현될 수 있다. 전술된 실시예들에서 언급된 하드웨어 요소들 중 하나 이상의 하드웨어 요소들이 호스트 하드웨어(예를 들어, 호스트 프로세서(330)) 상에 존재하는 배열들에서, 일부 시뮬레이션된 실시예들은, 적합한 경우, 호스트 하드웨어를 사용할 수 있다.
시뮬레이터 프로그램(310)은 컴퓨터 판독가능 저장 매체(이는 비일시적 매체일 수 있음) 상에 저장될 수 있고, 타깃 코드(300)(이는 애플리케이션들, 운영 체제들, 및 하이퍼바이저를 포함할 수 있음)에 프로그램 인터페이스(명령어 실행 환경)를 제공하는데, 이는 시뮬레이터 프로그램(310)에 의해 모델링되는 하드웨어 아키텍처의 인터페이스와 동일하다. 따라서, 전술된 혼합 요소 크기 명령어들을 포함하는, 타깃 코드(300)의 프로그램 명령어들은 시뮬레이터 프로그램(310)을 사용하여 명령어 실행 환경 내로부터 실행될 수 있어서, 위에서 논의된 장치의 하드웨어 특징부들을 실제로 갖지 않는 호스트 컴퓨터(330)가 이들 특징부들을 에뮬레이팅할 수 있게 할 수 있다.
따라서, 하나의 예는, 호스트 데이터 프로세싱 장치 상에서 실행될 때, 타깃 코드의 명령어들의 실행을 위한 명령어 실행 환경을 제공하도록 호스트 데이터 프로세싱 장치를 제어하는 시뮬레이터 컴퓨터 프로그램(310)을 제공하며; 컴퓨터 프로그램은, 프로그램 명령어들에 응답하여 데이터 프로세싱을 수행하도록 호스트 데이터 프로세싱 장치를 제어하기 위해 프로그램 명령어들을 디코딩하기 위한 명령어 디코딩 프로그램 로직(312); 및 타깃 코드에 의해 지원되는 시뮬레이션된 ISA에 정의된 아키텍처적 레지스터들(80, 82, 88)을 에뮬레이팅하기 위해, 호스트 하드웨어(330)의 호스트 저장소에 데이터 구조를 유지하기 위한 레지스터 에뮬레이팅 프로그램 로직(314)을 포함한다. 컴퓨터 프로그램은 컴퓨터 판독가능 기록 매체 상에 저장될 수 있다. 기록 매체는 비일시적 기록 매체일 수 있다.
예를 들어, 명령어 디코딩 프로그램 로직(312)은, 타깃 코드의 프로그램 명령어들의 명령어 인코딩을 확인하고, 각각의 유형의 명령어를, 디코딩된 명령어에 의해 표현되는 것에 대응하는 기능을 구현하는 호스트 하드웨어(330)에 의해 지원되는 네이티브(native) 명령어 세트 내의 대응하는 세트의 하나 이상의 프로그램 명령어들에 맵핑하는 명령어들을 포함할 수 있다. 레지스터 에뮬레이팅 프로그램 로직(314)은 호스트 데이터 프로세싱 장치(330)의 가상 어드레스 공간 및/또는 호스트 장치(330)의 레지스터들 내에 데이터 구조를 유지하는 명령어 세트를 포함할 수 있으며, 여기서 레지스터 에뮬레이팅 데이터 구조는 타깃 코드가 하드웨어에 제공될 것으로 예상되지만 실제로는 호스트 장치(330)의 하드웨어에 제공되지 않을 수 있는 레지스터들(80, 82, 88)의 레지스터 콘텐츠들을 표현한다. 시뮬레이션된 명령어 세트 아키텍처에서 소정의 레지스터들을 참조하는, 타깃 코드(300) 내의 명령어들은, 레지스터 에뮬레이팅 프로그램 로직(314)으로 하여금, 호스트(330)의 레지스터들에 액세스하게 하거나, 호스트 장치의 네이티브 명령어 세트에 로드/저장 명령어들을 생성하여, 대응하는 시뮬레이션된 레지스터 상태의 판독/기입을 요청하게 할 수 있다.
명령어 디코딩 프로그램 로직(312)은 하드웨어 실시예들에 대해 위에서 논의된 것과 동일한 방식으로, 기준 레지스터 및 즉시 값을 사용하여 정의된 레지스터 어드레싱 정보를 사용하는 데이터 전송 명령어들을 지원할 수 있다. 도 17의 시뮬레이터 예의 경우, 타깃 코드에서 프로세싱되는 명령어가 로드/저장 형태의 데이터 전송 명령어일 때, 이어서, 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보 및 시뮬레이션된 메모리의 타깃 부분을 식별하기 위한 메모리 어드레싱 정보를 특정하는 로드/저장 데이터 전송 명령어에 응답하여, 명령어 디코딩 프로그램 로직(312)은 레지스터 저장소의 타깃 부분에 맵핑되는 레지스터 에뮬레이팅 데이터 구조의 위치들과 시뮬레이션된 메모리의 타깃 부분에 맵핑되는 호스트 데이터 프로세싱 장치의 호스트 저장소 내의 위치들 사이에서 데이터를 전송하기 위한 데이터 전송 동작을 수행하도록 호스트(330)를 제어한다.
본 출원에서, "...하도록 구성된"이라는 말은 장치의 요소가 정의된 동작을 수행할 수 있는 구성을 갖는다는 것을 의미하는 데 사용된다. 이러한 문맥에서, "구성"은 하드웨어 또는 소프트웨어의 상호접속의 배열 또는 방식을 의미한다. 예를 들어, 장치는 정의된 동작을 제공하는 전용 하드웨어를 가질 수 있거나, 프로세서 또는 다른 프로세싱 디바이스가 기능을 수행하도록 프로그래밍될 수 있다. "하도록 구성된"은, 장치 요소가, 정의된 동작을 제공하기 위해 어떤 방식으로든 변경될 필요가 있음을 암시하지는 않는다.
본 발명의 예시적인 실시예들이 첨부 도면들을 참조하여 본 명세서에 상세히 설명되었지만, 본 발명은 그러한 정확한 실시예들로 제한되지 않는다는 것 그리고 첨부된 청구범위에 의해 정의되는 바와 같은 본 발명의 범주 및 사상으로부터 벗어나지 않으면서 당업자에 의해 다양한 변경들, 및 수정들이 이루어질 수 있다는 것이 이해될 것이다.

Claims (20)

  1. 장치로서,
    명령어들을 디코딩하기 위한 명령어 디코딩 회로부;
    데이터를 저장하기 위한 레지스터 저장소; 및
    상기 레지스터 저장소의 적어도 하나의 레지스터에 기입될 프로세싱 결과를 생성하기 위해, 상기 명령어 디코딩 회로부에 의해 디코딩된 명령어에 응답하여, 데이터 프로세싱을 수행하기 위한 프로세싱 회로부를 포함하고,
    상기 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어에 응답하여, 상기 명령어 디코딩 회로부는 상기 레지스터 저장소의 타깃 부분으로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하기 위해 상기 프로세싱 회로부를 제어하도록 구성되고,
    상기 레지스터 어드레싱 정보는 적어도,
    기준 값을 저장하기 위한 상기 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및
    상기 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하고, 상기 즉시 값은 상기 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 상기 기준 값에 가산될 값을 표현하는, 장치.
  2. 제1항에 있어서, 상기 레지스터 저장소는 적어도 하나의 2차원(2D) 어레이의 데이터를 저장하기 위한 2D 어레이 레지스터 저장소를 포함하고,
    상기 레지스터 저장소의 타깃 부분은 상기 2D 어레이 레지스터 저장소의 타깃 부분을 포함하는, 장치.
  3. 제2항에 있어서, 상기 데이터 전송 동작은 상기 2D 어레이 레지스터 저장소의 타깃 부분으로 또는 그로부터 타깃 2D 어레이의 하위 부분을 전송하는 것을 포함하고, 상기 색인 값은 상기 타깃 2D 어레이 중 어느 하위 부분이 전송될 것인지를 식별하는, 장치.
  4. 제3항에 있어서, 상기 하위 부분은 상기 타깃 2D 어레이 내에서 동일한 수직 포지션을 공유하는 단일 수평 그룹의 요소들 또는 상기 타깃 2D 어레이 내에서 동일한 수평 포지션을 공유하는 단일 수직 그룹의 요소들을 포함하는, 장치.
  5. 제3항 또는 제4항에 있어서, 상기 데이터 전송 명령어는 수평 방향 및 수직 방향 중 하나를 식별하는 어레이 방향 식별자를 특정하고,
    상기 어레이 방향 식별자가 상기 수평 방향을 식별할 때, 상기 타깃 2D 어레이의 하위 부분은 상기 색인 값에 의해 식별된 상기 타깃 2D 어레이의 적어도 하나의 수평 그룹의 요소들을 포함하고, 각각의 수평 그룹의 요소들은 상기 타깃 2D 어레이 내에서 동일한 수직 포지션을 공유하는 요소들을 포함하고,
    상기 어레이 방향 식별자가 상기 수직 방향을 식별할 때, 상기 타깃 2D 어레이의 하위 부분은 상기 색인 값에 의해 식별된 상기 타깃 2D 어레이의 적어도 하나의 수직 그룹의 요소들을 포함하고, 각각의 수직 그룹의 요소들은 상기 타깃 2D 어레이 내에서 동일한 수평 포지션을 공유하는 요소들을 포함하는, 장치.
  6. 제3항 내지 제5항 중 어느 한 항에 있어서, 상기 데이터 전송 명령어는 상기 프로세싱 회로부에 의해 지원되는 복수의 데이터 요소 크기들 중에서 상기 데이터 전송 명령어에 대해 특정된 현재 데이터 요소 크기 E와 연관되고, 상기 현재 데이터 요소 크기 E는 상기 타깃 2D 어레이의 각각의 요소와 연관된 데이터 요소 크기를 식별하는, 장치.
  7. 제6항에 있어서, 상기 즉시 값은 상기 데이터 전송 명령어의 명령어 인코딩 중 Nimm 비트를 사용하여 인코딩되고, Nimm은 상기 현재 데이터 요소 크기 E에 따라 가변적이며, Nimm은 E가 감소함에 따라 증가하는, 장치.
  8. 제3항 내지 제7항 중 어느 한 항에 있어서, 상기 2D 어레이 레지스터 저장소는 각각이 MVL 비트를 포함하는 NR개의 벡터 레지스터들을 포함하고,
    상기 명령어 디코딩 회로부는 상기 2D 어레이 레지스터 저장소의 NR개의 벡터 레지스터들에 대한 가변적인 벡터 길이 MVL을 지원하는 명령어 세트 아키텍처에 따라 명령어들을 디코딩하도록 구성되고, 상기 명령어 세트 아키텍처에 의해 지원되는 최소 벡터 길이는 MVLmin이고,
    상기 타깃 2D 어레이의 요소들이 데이터 요소 크기 E를 갖는 상기 데이터 전송 명령어에 대해, 상기 데이터 전송 명령어의 명령어 인코딩에서 상기 즉시 값으로서 인코딩될 수 있는 다수의 상이한 수치 값들은 MVLmin /E 미만인, 장치.
  9. 제2항 내지 제8항 중 어느 한 항에 있어서, 상기 2D 어레이 레지스터 저장소는 적어도 2개의 어레이 저장 영역들로 논리적으로 파티셔닝될 수 있고, 각각의 어레이 저장 영역은 각각의 2D 어레이를 저장하기 위한 것이고,
    상기 레지스터 어드레싱 정보는 상기 2D 어레이 레지스터 저장소의 선택된 어레이 저장 영역을 식별하는 어레이 식별자를 또한 포함하고, 상기 색인 값은 상기 선택된 어레이 저장 영역의 어느 하위 부분이 상기 레지스터 저장소의 타깃 부분인지를 식별하는, 장치.
  10. 제9항에 있어서, 상기 프로세싱 회로부는, 상기 데이터 전송 동작에 대해 특정된 현재 데이터 요소 크기 E에 종속하는 가변적인 맵핑에 기초하여, 상기 2D 어레이 레지스터 저장소의 어느 부분이 주어진 값의 어레이 식별자에 대응하는 어레이 저장 영역인지를 식별하도록 구성되는, 장치.
  11. 제10항에 있어서, 상기 2D 어레이 레지스터 저장소는 NA개의 어레이 저장 영역들로 논리적으로 파티셔닝되고, NA는 상기 현재 데이터 요소 크기 E에 따라 바뀌고, NA는 E가 증가함에 따라 증가하는, 장치.
  12. 제9항 내지 제11항 중 어느 한 항에 있어서, 상기 어레이 식별자 및 상기 즉시 값은 상기 데이터 전송 명령어의 명령어 인코딩의 비트들의 공유되는 부분을 사용하여 인코딩되고,
    상기 공유되는 부분의 주어진 비트에 대해, 상기 명령어 디코딩 회로부는, 상기 데이터 전송 명령어에 대해 특정된 현재 데이터 요소 크기 E에 따라, 상기 주어진 비트가 상기 어레이 식별자의 부분을 나타내는 것으로 해석되는지 또는 상기 즉시 값의 부분을 나타내는 것으로 해석되는지를 바꾸도록 구성되는, 장치.
  13. 제12항에 있어서, 상기 어레이 식별자 및 상기 즉시 값을 인코딩하기 위해 사용되는 상기 데이터 전송 명령어의 명령어 인코딩의 총 비트 수는 상기 현재 데이터 요소 크기 E에 관계없이 일정한, 장치.
  14. 제1항 내지 제13항 중 어느 한 항에 있어서, 상기 데이터 전송 명령어가 상기 레지스터 어드레싱 정보 및 메모리의 타깃 부분을 식별하기 위한 메모리 어드레싱 정보를 특정하는 로드/저장 명령어일 때, 상기 데이터 전송 동작은 상기 레지스터 저장소의 타깃 부분과 상기 메모리의 타깃 부분 사이에서 데이터를 전송하는 것을 포함하는, 장치.
  15. 제1항 내지 제14항 중 어느 한 항에 있어서, 상기 데이터 전송 명령어가 상기 레지스터 어드레싱 정보 및 상기 레지스터 저장소의 추가의 부분을 식별하기 위한 추가의 레지스터 어드레싱 정보를 특정하는 레지스터 이동 명령어일 때, 상기 데이터 전송 동작은 상기 레지스터 저장소의 타깃 부분과 상기 레지스터 저장소의 추가의 부분 사이에서 데이터를 전송하는 것을 포함하는, 장치.
  16. 제1항 내지 제15항 중 어느 한 항에 있어서, 상기 기준 레지스터는 스칼라 레지스터인, 장치.
  17. 제1항 내지 제16항 중 어느 한 항에 있어서, 상기 명령어 디코더는 소스 또는 목적지 레지스터를 특정하기 위한 K 비트 스칼라 레지스터 필드를 갖는 적어도 하나의 스칼라 계산 명령어를 지원하도록 구성되고,
    상기 데이터 전송 명령어는 L 비트 스칼라 레지스터 필드를 사용하여 상기 기준 레지스터를 특정하고, L < K이며, 이에 따라, 상기 적어도 하나의 스칼라 계산 명령어에 대한 상기 소스 또는 목적지 레지스터로서 특정가능한 적어도 하나의 스칼라 레지스터가 상기 데이터 전송 명령어에 대한 상기 레지스터 어드레싱 정보의 기준 레지스터로서 특정될 수 없는, 장치.
  18. 방법으로서,
    명령어를 디코딩하는 단계; 및
    상기 디코딩된 명령어에 응답하여, 레지스터 저장소의 적어도 하나의 레지스터에 기입될 프로세싱 결과를 생성하기 위해 데이터 프로세싱을 수행하도록 프로세싱 회로부를 제어하는 단계를 포함하고,
    상기 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어에 응답하여, 상기 프로세싱 회로부는 상기 레지스터 저장소의 타깃 부분으로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하도록 제어되고,
    상기 레지스터 어드레싱 정보는 적어도,
    기준 값을 저장하기 위한 상기 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및
    상기 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하고, 상기 즉시 값은 상기 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 상기 기준 값에 가산될 값을 표현하는, 방법.
  19. 타깃 코드의 명령어들의 실행을 위한 명령어 실행 환경을 제공하도록 호스트 데이터 프로세싱 장치를 제어하기 위한 컴퓨터 프로그램으로서,
    상기 디코딩된 명령어들에 대응하는 프로세싱 동작들을 수행하도록 상기 호스트 데이터 프로세싱 장치를 제어하기 위해 상기 타깃 코드의 명령어들을 디코딩하기 위한 명령어 디코딩 프로그램 로직; 및
    상기 타깃 코드와 연관된 타깃 명령어 세트 아키텍처의 레지스터 저장소를 에뮬레이팅하기 위해 상기 호스트 데이터 프로세싱 장치의 호스트 저장소에 레지스터 에뮬레이팅 데이터 구조를 유지하기 위한 레지스터 에뮬레이팅 프로그램 로직을 포함하고,
    상기 레지스터 저장소의 타깃 부분을 식별하기 위한 레지스터 어드레싱 정보를 특정하는 데이터 전송 명령어에 응답하여, 상기 명령어 디코딩 프로그램 로직은 상기 레지스터 저장소의 타깃 부분에 대응하는 상기 레지스터 에뮬레이팅 데이터 구조의 위치들로 또는 그로부터 데이터를 전송하기 위한 데이터 전송 동작을 수행하기 위해 상기 호스트 데이터 프로세싱 장치를 제어하도록 구성되고,
    상기 레지스터 어드레싱 정보는 적어도,
    기준 값을 저장하기 위한 상기 레지스터 저장소의 기준 레지스터를 식별하는 기준 레지스터 식별자; 및
    상기 데이터 전송 명령어의 인코딩에 특정되는 즉시 값을 포함하고, 상기 즉시 값은 상기 레지스터 저장소의 타깃 부분을 선택하기 위한 색인 값을 제공하기 위해 상기 기준 값에 가산될 값을 표현하는, 컴퓨터 프로그램.
  20. 제19항의 컴퓨터 프로그램을 저장하는 저장 매체.
KR1020237006640A 2020-07-30 2021-07-05 데이터 전송 명령어를 위한 레지스터 어드레싱 정보 KR20230042498A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB2011874.1 2020-07-30
GB2011874.1A GB2597709A (en) 2020-07-30 2020-07-30 Register addressing information for data transfer instruction
PCT/GB2021/051704 WO2022023701A1 (en) 2020-07-30 2021-07-05 Register addressing information for data transfer instruction

Publications (1)

Publication Number Publication Date
KR20230042498A true KR20230042498A (ko) 2023-03-28

Family

ID=72356205

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020237006640A KR20230042498A (ko) 2020-07-30 2021-07-05 데이터 전송 명령어를 위한 레지스터 어드레싱 정보

Country Status (9)

Country Link
US (1) US20230289186A1 (ko)
EP (1) EP4189537A1 (ko)
JP (1) JP2023539414A (ko)
KR (1) KR20230042498A (ko)
CN (1) CN115956233A (ko)
GB (1) GB2597709A (ko)
IL (1) IL299582A (ko)
TW (1) TW202205086A (ko)
WO (1) WO2022023701A1 (ko)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2023230255A1 (en) * 2022-05-26 2023-11-30 Google Llc Instruction set architecture for matrix operations
GB2619911A (en) * 2022-06-13 2023-12-27 Advanced Risc Mach Ltd Technique for performing outer product operations
CN116861149B (zh) * 2023-09-05 2024-01-09 之江实验室 卷积运算的优化方法、装置及处理器

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6175892B1 (en) * 1998-06-19 2001-01-16 Hitachi America. Ltd. Registers and methods for accessing registers for use in a single instruction multiple data system
JP5633122B2 (ja) * 2009-06-16 2014-12-03 富士通セミコンダクター株式会社 プロセッサ及び情報処理システム
US8635431B2 (en) * 2010-12-08 2014-01-21 International Business Machines Corporation Vector gather buffer for multiple address vector loads

Also Published As

Publication number Publication date
GB202011874D0 (en) 2020-09-16
US20230289186A1 (en) 2023-09-14
TW202205086A (zh) 2022-02-01
IL299582A (en) 2023-03-01
CN115956233A (zh) 2023-04-11
JP2023539414A (ja) 2023-09-14
GB2597709A (en) 2022-02-09
WO2022023701A1 (en) 2022-02-03
EP4189537A1 (en) 2023-06-07

Similar Documents

Publication Publication Date Title
US10656944B2 (en) Hardware apparatus and methods to prefetch a multidimensional block of elements from a multidimensional array
KR20230042498A (ko) 데이터 전송 명령어를 위한 레지스터 어드레싱 정보
US20100115233A1 (en) Dynamically-selectable vector register partitioning
CN108205448B (zh) 具有在每个维度上可选择的多维循环寻址的流引擎
JP6708334B2 (ja) モートン座標調整プロセッサ、方法、システム、及び命令
JP2021057004A (ja) 行列演算アクセラレータの命令のための装置、方法、及びシステム
KR20180066146A (ko) 벡터 데이터 전송 명령어
KR20190114745A (ko) 체인화된 타일 연산들을 구현하기 위한 시스템들 및 방법들
CN109213525B (zh) 具有快捷起始指令的流式传输引擎
KR20180067582A (ko) 벡터 로드 명령어
JP2023525811A (ja) 行列処理のための可変位置シフト
CN114327362A (zh) 大规模矩阵重构和矩阵-标量操作
WO2021250392A1 (en) Mixed-element-size instruction
CN115809468A (zh) 条件模数减法指令
CN114675888A (zh) 用于加载矩阵操作加速器瓦片的指令的装置、方法和系统
TW202223633A (zh) 用於實施16位元浮點矩陣點積指令的裝置、方法及系統
JP2023525812A (ja) 行列処理のための行又は列の位置のマスキング
US11099868B2 (en) System and method for translating a guest instruction of a guest architecture into at least one host instruction of a host architecture
US20230140257A1 (en) Modular addition instruction
WO2023148467A1 (en) Technique for performing memory access operations
WO2023242531A1 (en) Technique for performing outer product operations
GB2616601A (en) Sub-vector-supporting instruction for scalable vector instruction set architecture
WO2023199015A1 (en) Technique for handling data elements stored in an array storage
GB2617828A (en) Technique for handling data elements stored in an array storage
JP2024503638A (ja) メモリコピーサイズ判定命令及びデータ転送命令

Legal Events

Date Code Title Description
A201 Request for examination