KR20230005393A - 행렬 처리를 위한 가변 위치 시프트 - Google Patents

행렬 처리를 위한 가변 위치 시프트 Download PDF

Info

Publication number
KR20230005393A
KR20230005393A KR1020227043451A KR20227043451A KR20230005393A KR 20230005393 A KR20230005393 A KR 20230005393A KR 1020227043451 A KR1020227043451 A KR 1020227043451A KR 20227043451 A KR20227043451 A KR 20227043451A KR 20230005393 A KR20230005393 A KR 20230005393A
Authority
KR
South Korea
Prior art keywords
matrix
row
column
circuitry
input
Prior art date
Application number
KR1020227043451A
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 KR20230005393A publication Critical patent/KR20230005393A/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/16Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30032Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F5/00Methods or arrangements for data conversion without changing the order or content of the data handled
    • G06F5/01Methods or arrangements for data conversion without changing the order or content of the data handled for shifting, e.g. justifying, scaling, normalising
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/76Arrangements for rearranging, permuting or selecting data according to predetermined rules, independently of the content of the data
    • G06F7/764Masking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/3001Arithmetic instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30018Bit or string instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • G06F9/30141Implementation provisions of register files, e.g. ports
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/383Operand prefetching

Abstract

장치는 2D 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 행렬 처리 회로부; 행렬 처리 회로부에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하는 피연산자 저장 회로부; 및 주어진 행렬 처리 연산 동안 피연산자 저장 회로부에 저장된 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 결과 행렬의 어느 행/열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하는 위치 시프팅 회로부를 갖는다. 가변 위치 시프트는 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하며, 각각의 대안적인 시프트 양은 상이한 수의 행들/열들만큼의 결과 행렬에 대한 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 위치 시프트에 대응한다. 이것은 2D 컨볼루션 연산들을 수행하는 데 유용하다.

Description

행렬 처리를 위한 가변 위치 시프트
본 기술은 데이터 처리의 분야에 관한 것이다. 보다 구체적으로 본 기술은 행렬 처리에 관한 것이다.
결과 행렬로서 2차원 행렬을 생성하는 행렬 처리 연산들은 몇몇 데이터 처리의 분야들에서, 예를 들어 기계 학습 또는 이미지 처리에서 중요한 연산일 수 있다.
적어도 몇몇 예들은 장치로서, 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 행렬 처리 회로부 - 결과 행렬은 2차원 행렬임 -; 행렬 처리 회로부에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하는 피연산자 저장 회로부; 및 주어진 행렬 처리 연산 동안 피연산자 저장 회로부에 저장된 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하는 위치 시프팅 회로부 - 가변 위치 시프트는 주어진 행렬 처리 연산에 대해 선택 가능한 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하고, 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 결과 행렬에 대한 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 위치 시프트에 대응함 - 를 포함하는, 장치를 제공한다.
적어도 몇몇 예들은 장치로서, 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하기 위한 수단 - 결과 행렬은 2차원 행렬임 -; 수행하기 위한 수단에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하기 위한 수단; 및 주어진 행렬 처리 연산 동안 저장하기 위한 수단에 저장된 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하기 위한 수단 - 가변 위치 시프트는 주어진 행렬 처리 연산에 대해 선택 가능한 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하고, 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 결과 행렬에 대한 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 위치 시프트에 대응함 - 을 포함하는, 장치를 제공한다.
적어도 몇몇 예들은 데이터 처리 방법으로서, 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 단계 - 결과 행렬은 2차원 행렬이고, 제1 및 제2 입력 피연산자들은 피연산자 저장 회로부에 저장된 정보에 의존함 -; 및 주어진 행렬 처리 연산 동안, 피연산자 저장 회로부에 저장된 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하는 단계 - 가변 위치 시프트는 주어진 행렬 처리 연산에 대해 선택 가능한 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하고, 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 결과 행렬에 대한 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 위치 시프트에 대응함 - 를 포함하는, 데이터 처리 방법을 제공한다.
본 기술의 추가의 태양들, 특징들 및 이점들이 첨부 도면과 관련하여 읽혀질, 예들의 하기 설명으로부터 명백해질 것이다.
도 1은 패딩되지 않은 2차원(2D) 컨볼루션의 예를 예시한다.
도 2는 패딩된 2D 컨볼루션의 예를 도시한다.
도 3은 다수의 채널을 포함하는 출력 데이터를 생성하기 위해, 2D 컨볼루션이 다수의 채널을 포함하는 입력 데이터에 적용되는 예를 도시한다.
도 4는 입력 데이터에 대한 데이터를 메모리에 저장하기 위한 메모리 레이아웃의 예를 도시한다.
도 5는, 비교를 위해, 리매핑된 행들에 적용되는 후속 2D 컨볼루션 처리를 단순화하기 위해, 메모리에 저장된 입력 채널 데이터가 메모리에 저장된 데이터의 다수의 행을 생성하도록 재배열되는 접근법을 도시한다.
도 6은 2D 컨볼루션 연산이 다수의 1x1 컨볼루션으로 분할되는 상이한 접근법을 도시한다.
도 7은 메모리에서 데이터를 재배열하는 단계를 필요로 함이 없이 피연산자 행렬의 선택된 행들 또는 열들의 마스킹이 어떻게 2D 컨볼루션이 일련의 1x1 컨볼루션들에 의해 구현될 수 있게 하는지를 도시한다.
도 8은 주어진 행렬 연산의 입력과 출력 사이에 가변 위치 시프트를 적용하는 것이 어떻게 메모리로부터 로딩된 입력 채널 데이터의 동일한 세트가 상이한 커널 위치들에 대해 다수의 상이한 1x1 컨볼루션 연산에 걸쳐 재사용될 수 있게 하는지를 예시한다.
도 9는 행렬 처리 회로부를 갖는 데이터 처리 장치를 개략적으로 예시한다.
도 10은 행렬 처리 회로부의 부분 및 행렬 처리 회로부에 의해 사용되는 레지스터들을 개략적으로 예시한다.
도 11 내지 도 13은 행렬 처리 연산을 위한 어드레싱 정보 및 마스킹 상태 정보를 나타내는 상이한 방식들을 예시한다.
도 14는 행렬 처리 연산이 외적 정보이고 장치가 가변 위치 시프트를 적용하는 위치 시프팅 회로부를 갖는 예를 도시한다.
도 15는 행렬 처리 연산을 위한 타겟 행 또는 열을 로딩하기 위해 로드 명령어를 처리하는 예를 도시한다.
도 16은 행렬 처리 명령어를 처리하는 방법을 도시한다.
도 17은 행렬 처리 명령어를 처리하는 제2 예를 도시한다.
행렬 처리 연산들을 위한 행 또는 열 마스킹
2차원(2D) 컨볼루션 연산들은, 특히 신경망들을 위한, 기계 학습의 분야에서 인기 있는 연산이다. 2D 컨볼루션들은 또한 이미지들에 필터들을 적용하는 것과 같은 다른 목적들을 위해 사용될 수 있다. 2D 컨볼루션 연산에서, 적용될 필터 또는 다른 연산을 정의하기 위해 커널이 제공된다. 커널은 전형적으로 커널보다 더 큰 크기의 행렬을 각각 포함하는 하나 이상의 입력 채널에 적용된다. 2D 컨볼루션 연산에서, 출력 행렬 내의 주어진 출력 요소 위치에 대해, 주어진 출력 요소 위치에 대한 값은 커널 값들 및 입력 채널 값들의 각자의 쌍들의 곱들의 합에 의존한다. 각각의 출력 행렬 위치에 대해, 대응하는 커널 값들과 곱할 입력 채널 값들의 선택은 상이하다. 주어진 출력 요소 위치에 대해, 대응하는 입력 행렬 요소들과 곱해지는 커널 값들은, 중심 커널 요소가 주어진 출력 요소 위치에 위치상 대응하는 입력 행렬의 요소 위에 있도록 커널이 논리적으로 위치될 때 위치상 정렬되는 것들이다. 2D 컨볼루션의 예들이 아래에서 추가로 설명된다.
2D 컨볼루션 연산들이 데이터 처리에서 구현하기가 비교적 복잡한 하나의 이유는, 그들이 메모리 어드레스 공간 내의 인접한 어드레스들에 저장되지 않을 수 있는 입력 행렬 요소들을 수반하는 곱들을 더하는 것을 포함하여, 커널 값들과 입력 요소들의 많은 상이한 조합들에 대해 커널 및 입력 요소들의 다수의 쌍들의 곱들의 합들의 계산을 요구할 수 있다는 점이다. 따라서, 2D 컨볼루션들을 수행하기 위한 전형적인 접근법은, 커널의 각자의 커널 위치 각각에 대해 연산될 값들에 대응하는 다수의 맞춤형 데이터 구조들을 생성하기 위해, (곱의 합 계산들 자체에 앞서) 몇몇 리매핑(재배열) 연산들을 수행하여 메모리에서 입력 행렬에 대해 저장된 데이터를 리매핑하는 것이다. 그러나, 이러한 리매핑은 하나의 메모리 위치로부터 다른 메모리 위치로 데이터를 복사하는 많은 인스턴스들을 수반하며, 이는 추가 레이턴시를 초래하고 메모리 공간을 낭비한다. 따라서, 그러한 리매핑을 필요로 함이 없이 요구되는 연산들이 메모리 공간 내의 입력 채널 데이터의 레이아웃에 기초하여 직접 적용될 수 있도록 2D 컨볼루션을 구현하는 방법을 발견하는 것이 바람직할 수 있다.
아래의 예들에서, 장치는 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 행렬 처리 회로부를 가지며, 여기서 결과 행렬은 2차원 행렬이다. 제1 및 제2 입력 피연산자들은 그 자체가 2차원일 필요가 없고 몇몇 예들에서 1차원 벡터들일 수 있지만, 다른 예들은 행렬 처리 연산을 2차원 입력 피연산자들에 적용할 수 있다. 피연산자 저장 회로부가 행렬 처리 회로부에 대한 제1 및 제2 입력 피연산자들을 형성하는 정보를 저장하기 위해 제공된다. 마스킹 회로부는 마스킹 값을 나타내는 것으로서 취급될 하나 이상의 마스킹된 행 또는 열 위치들을 나타내는 마스킹 상태 데이터에 기초하여 피연산자 저장 회로부에 저장된 정보 또는 행렬 처리 연산의 적어도 일부를 마스킹하는 마스킹 연산을 수행한다. 마스킹 상태 데이터는 행렬 처리 회로부에게 행렬 처리 연산을 수행하라고 명령하는 행렬 처리 명령어의 피연산자로서 정의될 수 있거나, 개별적으로 구성되고 행렬 처리 명령어에 의해 명시적으로 참조되지 않는 어떤 저장된 상태 데이터일 수 있다.
마스킹된 행/열 위치들을 나타내는 마스킹 상태 데이터에 기초한 마스킹을 제공함으로써, 이것은 행렬 처리가 입력 데이터의 소정 행들 또는 열들을 스킵할 수 있게 하며, 이는 2D 컨볼루션 연산들에 특히 유용할 수 있다. 마스킹 회로부는 피연산자들을 피연산자 저장 회로부에 로딩할 때, 또는 행렬 처리 연산 자체를 수행할 때, 또는 피연산자 저장 회로부에 로딩할 때 및 행렬 처리 연산을 수행할 때 둘 모두에서 마스킹 연산을 수행할 수 있다.
이러한 접근법은 더 효율적인 2D 컨볼루션 연산들을 지원하는 것을 돕는다. 예를 들어, 2D 컨볼루션 연산은 더 큰 커널 행렬 내의 단일 커널 위치로부터의 커널 값(들)을 주어진 입력 채널의 다수의 입력 행렬 요소에 적용하고, 결과에 기초하여 출력 행렬 내의 각자의 요소들을 업데이트하는 다수의 별개의 1x1 컨볼루션 연산으로 (소프트웨어에 의해) 분할될 수 있다(몇몇 경우들에서, 그러한 1x1 컨볼루션 처리의 다수의 채널은 병렬로 행해질 수 있다). 그러한 1x1 컨볼루션들은 메모리에서의 구조의 리매핑을 필요로 함이 없이 주어진 커널 위치에 대한 연산이 적용될 수 있게 할 것이고, 이때 상이한 커널 위치들에 대한 1x1 컨볼루션들의 연속적인 결과들은 함께 누산되며(이때 출력 행렬 요소들의 적절한 시프트가 어느 커널 위치가 적용되고 있는지를 고려하기 위해 그러한 출력들을 계산하는 데 사용되는 입력 행렬 요소들에 대해 업데이트됨), 따라서 각각의 커널 위치에 대해 1x1 컨볼루션들을 수행한 후에 결과는 2D 컨볼루션의 결과와 동등하다.
이것을 지원하기 위해, 대응하는 입력 채널들의 몇몇 행들/열들로부터의 데이터가 그것이 메모리에 저장된 실제 데이터 대신에 마스킹 값을 나타내는 것처럼 취급될 수 있도록 주어진 행 또는 열 위치를 마스킹하도록, 마스킹 상태 데이터에 기초하여, 제어될 수 있는 마스킹 회로부를 제공하는 것이 유용할 수 있다. 이것은, 2D 컨볼루션이 연속적인 1x1 컨볼루션들로 분할될 때, 대부분의 출력 요소 위치들에 대해, 주어진 1x1 컨볼루션에 대한 올바른 결과가 대응하는 입력 행렬 요소를 판독하고, 그 요소를 대응하는 커널 값과 곱하고, 결과를 대응하는 출력 행렬 요소에 기입함으로써(입력 행렬 내의 입력 행렬 요소의 상대적 위치와 출력 행렬 내의 대응하는 출력 행렬 요소의 상대적 위치 사이의 위치에 있어서의 시프트를 갖고서, 그리고 그 시프트는 주어진 커널 위치에 대해 수행되는 곱셈들 각각에 대해 동일한 수의 요소 위치들만큼임) 달성될 수 있기 때문이다. 그러나, 행렬의 에지들에서, 예를 들어, 출력 행렬의 하나의 에지 상의 요소가 입력 행렬의 반대편 에지에 있는 요소에 기초하여 업데이트되는 것으로 인해, 이러한 접근법이 잘못된 결과를 제공할 몇몇 요소들이 존재하여, '랩어라운드(wraparound)' 에러로 아래에서 지칭되는 에러를 야기한다. 마스킹 연산을 제공함으로써, 이것은 출력에 영향을 미치지 않아야 하는 입력 데이터의 행들 또는 열들이 마스킹될 수 있게 한다. 따라서, 행들/열들의 마스킹에 대한 지원을 제공함으로써, 이것은 신경망 성능에 중요할 수 있는 2D 컨볼루션 연산들에 대한 개선된 성능을 가능하게 할 수 있다.
행렬의 특정 행들/열들이 마스킹되는 제어는 소프트웨어에 의해 제어되며, 따라서 특정 프로세서 구현의 특징은 아니라는 것이 인식될 것이다. 장치는 소프트웨어가 마스킹될 행들/열들을 선택할 수 있게 하는 특징들을 제공한다.
주어진 피연산자 행렬의 주어진 행 또는 열이 마스킹 상태 데이터에 의해 마스킹되는 것으로 표시될 때, 그 행/열 위치에 대해 사용될 마스킹 값을 선택하기 위한 상이한 옵션들이 있을 수 있다. 많은 실제 응용들에서, 마스킹 값이 0인 것이 유용할 수 있다. 이것은 입력 행렬의 하나의 에지 상의 행들/열들이 반대편 에지 상의 출력 행렬 요소들의 계산에 영향을 미치는 것이 방지되어야 하는 전술된 '랩어라운드' 문제를 다루기 위해 행들을 스킵하는 것을 지원하는 데 도움을 줄 수 있다. 또한, 0의 마스킹 값은 패딩된 2D 컨볼루션 연산이 적용되고 커널이 입력 행렬의 에지 부근에 중심을 둔 위치에 있을 때 패딩 값들이 입력 행렬의 경계들 밖에 위치된 커널 요소들과 곱해지도록 공급될 수 있게 하는 데 유용할 수 있다. 따라서, 몇몇 하드웨어 구현들에서, 마스킹 회로부가 임의의 마스킹된 행/열 위치들에 대해 사용될 고정된 마스킹 값, 예를 들어 0의 마스킹 값만을 지원하는 것으로 충분할 수 있다.
그러나, 2D 컨볼루션들을 사용하는 몇몇 응용에서, (예를 들어, 각각의 값이 그의 진정한 값으로부터 소정 수만큼 오프셋되어, "0 포인트"가 0 이외의 숫자 값에 의해 표현되는 양자화 스킴을 사용하여 행렬들이 표현되는 경우) 0 이외의 패딩 값들을 사용하는 것이 요구될 수 있다. 그러한 연산들을 지원하기 위해, 0이 아닌 값을 마스킹 값으로서 선택하는 능력을 제공하는 것이 유용할 수 있다. 따라서, 몇몇 구현들에서, 마스킹 연산에서, 마스킹 값은, 마스킹 연산이 수행되게 하는 명령어(예를 들어, 피연산자 저장 회로부에 정보를 로딩하기 위한 로드 명령어, 또는 행렬 처리 연산을 수행하도록 행렬 처리 회로부를 제어하기 위한 행렬 처리 명령어)에 의해 지정된 마스킹 값 선택 파라미터; 제어 레지스터에 저장된 제어 값; 및 마스킹된 행/열의 복수의 요소에 대한 별개의 마스킹 값들을 지정하는 마스킹 벡터 중 적어도 하나에 기초하여, 복수의 마스킹 값(예를 들어, 0 또는 다른 사전 구성된 값) 중에서 선택될 수 있다. 마지막 옵션으로, 마스킹 벡터는 벡터 레지스터로부터 판독될 수 있다.
마스킹 상태 데이터는, 요소들의 2차원 어레이 내에서, 마스킹 값을 나타내는 것으로서 취급될 요소들을 식별하는 인코딩을 가질 수 있다. 따라서, 마스킹 상태 데이터는 2개의 차원에 걸쳐 마스킹된 요소들의 위치들을 (완전히 또는 부분적으로) 식별할 수 있다. 2개의 차원에서 마스킹을 적용할 수 있는 상태 데이터를 제공하는 것은, 위에서 논의된 "랩어라운드" 에러 문제, 즉 루프의 꼬리에서, 처리될 데이터 구조의 끝을 넘어 확장되는 미사용된 다수의 "경계 외부(out of bounds)" 요소들이 존재할 수 있다는 사실을 포함하여, 2D 컨볼루션 처리에 수반되는 다수의 문제들을 다루는 데, 그리고 아래에서 더 상세히 설명되는 "위치 시프팅" 특징에 대한 지원을 제공하는 데 유용할 수 있다.
예를 들어, 마스킹 상태 데이터는 하나 이상의 마스킹된 행 또는 열 위치 - 마스킹된 행 또는 열 위치 내의 모든 요소는 마스킹 값을 나타내는 것으로서 취급될 것임 - 를 나타내는 제1 마스킹 상태 데이터, 및 주어진 행 또는 열 내의 개별 요소 위치들이 마스킹되어야 하는지 여부를 나타내는 제2 마스킹 상태 데이터를 지정할 수 있다. 제1 마스킹 상태 데이터를 사용하는 전체 행들 또는 열들의 마스킹은 제1 차원에서의 "랩어라운드" 에러 및/또는 "경계 외부" 행들/열들을 처리하는 데 유용할 수 있고, 완전히 마스킹되지는 않은 행 또는 열 내의 특정의 요소들의 개별 마스킹은 제2 차원에서의 "경계 외부" 열들/행들 및/또는 아래에서 설명되는 위치 시프팅 특징을 지원하는 데(또는 더 일반적인 요소별 프레디케이션(per-element predication)에) 유용할 수 있다. 제1 마스킹 상태 데이터는 하나의 차원(행 또는 열)에서의 마스킹된/마스킹되지 않은 행/열 위치들을 식별하는 요소들의 세트를 포함할 수 있는 반면, 제2 마스킹 상태 데이터는 직교 차원(열 또는 행)에서의 마스킹된/마스킹되지 않은 위치들을 식별하는 요소들의 세트를 포함할 수 있다. 몇몇 경우들에서, 제2 마스킹 상태 데이터는 단일 행/열에 대해서만 마스킹된/마스킹되지 않은 요소들의 개별 표시들을 지정할 수 있는데, 그 이유는 동일한 세트의 제2 마스킹 상태 데이터가 행들/열들에 걸쳐 공유될 수 있기 때문이다(또는 상이한 행들/열들에 대해 마스킹된/마스킹되지 않은 요소들의 상이한 패턴들이 필요한 경우, 제2 마스킹 상태 데이터는 하나의 행/열의 처리와 다음 행/열의 처리 사이에서 조정될 수 있다).
마스킹 상태 데이터는, 마스킹된 행 또는 열 위치들로서, 적어도 하나의 마스킹되지 않은 행 또는 열 위치에 의해 분리된 적어도 2개의 인접하지 않은 행 또는 열 위치를 나타낼 수 있는 인코딩을 가질 수 있다. 이것은, 2D 컨볼루션이 다수의 1x1 컨볼루션들로 분할되는 경우, 입력 행렬의 하나의 에지 상의 입력 값들이 출력 행렬의 반대편 에지에 있는 출력 값들에 영향을 미치는 것을 방지하기 위해 마스킹될 필요가 있는 다수의 인접하지 않은 행 또는 열 위치들이 있을 수 있다는 것을 인식한다. 또한, 패딩된 2D 컨볼루션들에 대해 패딩될 위치들은 메모리 내의 인접한 어드레스들에 대응하지 않을 수 있다.
마스킹 상태 데이터는 다수의 상이한 방식으로 표현될 수 있다. 일반적으로, 마스킹 상태 데이터는 행렬 구조 내의 어느 행/열 위치들이 마스킹되어야 하는지를 나타낼 수 있는 임의의 정보 세트일 수 있다. 하나의 접근법은 마스킹 상태 데이터(예를 들어, 전술된 제1 마스킹 상태 정보)가, 주어진 피연산자 행렬의 각자의 행 또는 열 위치에 각각 대응하고 대응하는 행 또는 열 위치가 마스킹된 행 또는 열 위치인지를 나타내는 다수의 마스킹 상태 표시자를 포함하는 것일 수 있다. 예를 들어, 마스킹 상태 데이터는, 각각의 비트가 주어진 행 또는 열 위치에 대응하고 그 행 또는 열 위치가 마스킹되어야 하는 경우 하나의 값으로 설정되고 그 행 또는 열 위치가 마스킹되지 않은 채로 있어야 하는 경우 다른 값으로 설정되는 비트맵을 포함할 수 있다. 유사하게, 제2 마스킹 정보는 특정 행/열 내의 마스킹된 행/요소 위치들을 나타내는 제2 비트맵을 포함할 수 있다.
마스킹 상태 데이터가 그것이 주어진 피연산자 행렬의 각자의 행들을 참조하는지 또는 주어진 피연산자 행렬의 각자의 열들을 참조하는지를 구별하는 것은 필요하지 않다. 상이한 소프트웨어 애플리케이션들은 메모리 내의 행렬에 대해 상이한 레이아웃들(예를 들어, 행 우선(row-major) 또는 열 우선(column major))을 선택할 수 있지만, 마스킹 상태 데이터의 포맷은 그럼에도 불구하고 동일할 수 있다.
피연산자 저장 회로부는 상이한 방식들로 구현될 수 있다. 몇몇 예들에서, 피연산자 저장 회로부는 주어진 행렬 처리 연산을 수행할 때 제1 및 제2 피연산자들이 그로부터 판독될 수 있는 입력 레지스터들의 세트를 포함할 수 있다.
그러나, 피연산자 저장 회로부의 일부로서, 주어진 피연산자 행렬의 각자의 행렬 요소들을 저장하는 다수의 저장 유닛들을 포함하는 행렬 전치 회로부를 제공하는 것이 유용할 수 있다. 행렬 전치 회로부의 저장 유닛들은 주어진 피연산자 행렬의 행들에 대응하는 행 그룹들에서 판독 가능할 수 있고, 또한 주어진 피연산자 행렬의 열들에 대응하는 열 그룹들에서 판독 가능할 수 있다. 그러한 행렬 전치 회로부를 제공하는 것은 상이한 기계 학습 알고리즘들이 메모리 내에 입력 채널 데이터를 저장하기 위해 상이한 레이아웃들을 사용할 수 있다는 사실을 다루는 데 매우 도움이 될 수 있다. 예를 들어, 몇몇 알고리즘들은 행렬의 동일한 행의 인접한 요소들의 메모리 어드레스들 사이의 오프셋이 주어진 피연산자 행렬의 동일한 열 내의 인접한 요소들 중의 요소들의 메모리 어드레스들 사이의 오프셋보다 작은 메모리 내의 행 우선 레이아웃을 사용할 수 있다. 다른 알고리즘들은 동일한 열 내의 인접한 요소들의 어드레스들 사이의 오프셋이 동일한 행 내의 인접한 요소들 사이의 오프셋보다 작은 열 우선 레이아웃을 사용할 수 있다. 행렬 전치 회로부는 행 우선 포맷이 사용되는지 또는 열 우선 포맷이 사용되는지의 온 더 플라이 리매핑(on the fly remapping)을 가능하게 하는데, 그 이유는, 주어진 피연산자 행렬이 행 그룹들에서 행렬 전치 회로부에 기입되는 경우, 그것이 열 그룹들에서 행렬 전치 회로부로부터 판독될 수 있거나, 그 반대도 마찬가지이며, 따라서 후속 행렬 처리 연산들이 메모리에 저장된 입력 행렬에 대한 데이터가 행 우선인지 또는 열 우선인지에 관계없이 일관된 포맷을 취할 수 있는 것이 가능하기 때문이다. 이것은 코드 개발을 단순화할 수 있으며, 메모리 저장소 자체 내에서의 데이터의 리매핑 또는 재배열에 대한 필요성을 회피한다.
행렬 전치 회로부의 저장 유닛들은 행들 및 열들로 물리적으로 배열될 필요가 없다는 점에 유의한다. 행렬 전치 회로부의 저장 유닛들은 행들에 대응하는 저장 요소들의 그룹들에서 또는 열들에 대응하는 그룹들에서 논리적으로 판독 가능한 것으로 충분하다. 예를 들어, 행렬 전치 회로부는 레지스터들의 부분들이 상이한 조합들로 어드레싱될 수 있도록 다수의 판독/기입 포트들을 갖는 레지스터들의 세트로서 구현될 수 있다. 예를 들어, 각각의 레지스터가 행 그룹을 저장하는 경우, 열 그룹은 데이터의 부분들의 세트(세트는 각각의 레지스터 내의 대응하는 위치들에서, 레지스터당 하나의 부분을 포함함)에 의해 형성되는 것으로 간주될 수 있다. 대안적으로, 각각의 열 그룹이 하나의 레지스터에 매핑되고 행 그룹이 각각의 레지스터 내의 대응하는 위치들 내의 데이터의 부분들의 스트라이프인 경우 반대 매핑이 사용될 수 있다. 또한, 메모리에 저장된 행렬의 "행들"이 행렬 전치 회로부의 "행 그룹들"에 기입되는 것이 - 이것이 가능하지만 - 필수적이지는 않고, 그러한 행렬의 "행들"은 행렬 전치 회로부의 "열 그룹들"에 동등하게 잘 기입될 수 있다는 점에 유의한다. 따라서, 행렬 전치 회로부 내의 저장 유닛들의 "행 그룹들" 및 "열 그룹들"은 행렬 전치 회로부의 저장 유닛들이 그에 의해 판독될 수 있는 직교 그루핑들을 지칭하지만, 메모리 내의 행렬들과 동일한 행/열 방향을 따를 필요는 없다. 실제로, 행렬 전치 회로부에 대한 판독들/기입들의 파이프라이닝을 개선하기 위해, 입력 행렬의 라인들(행들 또는 열들)의 연속적인 그룹들이 행 그룹들에서 또는 열 그룹들에서 행렬 전치 회로부에 기입되는지의 선택을 교대시키는 것이 때때로 유용할 수 있다.
따라서, 행렬 전치 회로부에 데이터를 로딩할 때, 로드 회로부는 메모리 내의 행렬 데이터 구조의 부분에 기초하여 행렬 전치 회로부의 저장 유닛들의 적어도 하나의 행 그룹을 또는 적어도 하나의 열 그룹을 로딩할지를 선택할 수 있다. 적어도 하나의 행 그룹을 또는 적어도 하나의 열 그룹을 로딩할지의 선택은 로드 명령어에 의해 지정된 행/열 방향 선택 정보; 및 행/열 방향 전환 명령어에 응답하여 업데이트 가능한 제어 레지스터에 저장된 행/열 방향 선택 정보 중 하나 또는 둘 모두에 기초할 수 있다. 몇몇 구현들은 행 그룹을 또는 열 그룹을 로딩할지를 결정하기 위해 이러한 옵션들 중 하나(로드 명령어에 의해 지정된 정보, 또는 제어 레지스터에서 지정된 정보)만을 사용할 수 있다. 대안적으로, 구현은 이들 정보 둘 모두를 조합할 수 있다. 예를 들어, 제어 레지스터 비트는 행 모드 또는 열 모드를 나타낼 수 있지만, 로드 명령어 내의 비트는 저장된 비트의 의미가 반전되어야 하는지 여부를 나타낼 수 있다(따라서, "반전된" 비트 세트를 갖는 로드 명령어들에 대해, 명령어는 저장된 비트가 열을 나타낼 때 행을 로딩할 것이고 저장된 비트가 행을 나타낼 때 열을 로딩할 것이다). 유사하게, 행렬 처리 연산을 위한 피연산자를 공급하기 위해(또는 행렬 처리 연산을 위해 피연산자들이 그로부터 후속하여 획득될 수 있는 피연산자 레지스터들에 정보를 전송하기 위해) 행렬 전치 회로부로부터 데이터를 판독할 때, 행/열 방향 선택 정보는 행렬 전치 회로부의 행 그룹을 또는 열 그룹을 판독할지를 지정할 수 있다(다시, 그러한 선택 정보는, 전술된 바와 같은 로드 명령어들과 유사한 저장 명령어들을 위해 레지스터 내의 행/열 방향 비트와 명령어 내의 "반전된" 비트를 둘 모두를 조합하는 것을 사용하기 위한 옵션과 함께, 명령어에 의해 그리고/또는 제어 레지스터에서 지정될 수 있다).
마스킹 상태 데이터에 기초한 마스킹 연산은 행렬 처리를 위한 피연산자의 로딩 및 행렬 처리 연산들 자체의 처리에 대해 상이한 시간들에서 수행될 수 있다.
몇몇 구현들에서, 행렬 처리 회로부는 마스킹 회로부를 포함할 수 있다. 행렬 처리 회로부의 마스킹 회로부는 마스킹 정보에 응답하여 제1 및 제2 피연산자들 중 하나의 피연산자의 부분이 피연산자 저장 회로부에 저장된 상기 제1 및 제2 피연산자들 중 상기 하나의 피연산자의 부분의 실제 값 대신에 마스킹 값을 나타내는 것으로서 취급되는 하나 이상의 마스킹된 행 또는 열 위치들에 대응하는 상태로 행렬 처리 연산을 수행할 수 있다. 따라서, 입력 채널들로부터의 실제 데이터가 정상적으로 메모리로부터 피연산자 저장 회로부로 로딩될 수 있을지라도, 패딩을 제공하기 위해 또는 전술된 랩어라운드 에러들을 회피하기 위해 그러한 입력 데이터를 마스킹 값으로 대체하는 것은 행렬 처리 회로부에 대한 입력에 대해 피연산자 저장 회로부로부터 판독된 데이터를 마스킹함으로써 제어될 수 있다. 이러한 접근법은 아래에 추가로 논의되는 바와 같이 가변 위치 시프팅을 적용하는 옵션을 또한 지원하는 구현들에 특히 유용할 수 있다.
몇몇 구현들에서, 마스킹 회로부는 메모리에 저장된 행렬 데이터 구조의 부분에 기초하여 주어진 피연산자 행렬의 타겟 행 또는 열에 대응하는 정보를 피연산자 저장 회로부에 로딩하기 위한 로드 명령어에 응답하는 로드 회로부에 의해 구성될 수 있다. 이 경우에, 타겟 행 또는 열이 마스킹 상태 데이터에 의해 표시되는 마스킹된 행 또는 열 위치에 대응할 때, 로드 회로부는 메모리에 저장된 행렬 데이터 구조의 부분에 기초한 데이터 대신에 마스킹 값을 갖는 데이터를 타겟 행 또는 열에 대응하는 상기 피연산자 저장 회로부의 부분에 로딩할 수 있다. 이러한 접근법에서, 마스킹은 피연산자들을 메모리로부터 로딩하는 포인트에서 적용될 수 있으며, 이는 어쨌든 마스킹될 행렬 요소들의 불필요한 로딩을 회피한다. (처리될 데이터의 양이 하나의 반복에서 처리될 수 있는 데이터의 양의 정확한 배수에 대응하지 않는 것으로 인해 루프의 최종 반복에서 로드 명령어에 의해 참조되는 처리될 데이터 구조의 끝을 넘어서는 어드레스들에 대응하는) 경계 외부 데이터가 또한 마스킹 회로부를 사용하여 마스킹될 수 있어, 그들이 로딩되는 것을 방지하고 따라서 무효일 수 있는 어드레스들에 대한 액세스들에 의해 어드레스 장애들이 야기되는 것을 방지할 수 있다.
몇몇 하드웨어 구현들은 둘 모두의 유형의 마스킹을 지원할 수 있으며, 이는, 예를 들어, 경계 외부 데이터의 패딩 및 마스킹이 로딩의 포인트에서 마스킹에 의해 더 효율적으로 핸들링될 수 있기 때문에 유용할 수 있지만, 가변 위치 시프팅이 지원되는 경우, 위에서 논의된 유형의 "랩어라운드" 에러들을 다루는 것은 입력 데이터의 동일한 세트를 판독하는 상이한 인스턴스들에 대해 상이한 입력 행들/열들에서의 마스킹을 요구할 수 있으며, 이 경우에 특정 행렬 처리 연산을 수행하기 위해 피연산자 저장 회로부를 판독하는 포인트에서 마스킹을 적용하는 것이 더 효과적일 수 있다. 따라서, 가장 큰 유연성을 제공하기 위해, 몇몇 구현들은 둘 모두의 유형의 마스킹을 지원할 수 있다.
메모리로부터 피연산자 데이터를 로딩하는 포인트에서 마스킹을 적용하는 마스킹 회로부를 포함하는 로드 회로부를 제공하는 그러한 구현들에 대해, 타겟 행 또는 열에 대응하는 마스킹 상태 데이터가 타겟 행 또는 열이 마스킹된 행 또는 열 위치에 대응한다는 것을 나타낼 때, 로드 회로부는 타겟 행 또는 열의 2개 이상의 행렬 요소들 사이에서 공유되는 마스킹 상태 데이터의 공유 항목에 기초하여, 타겟 행 또는 열의 행렬 요소들 각각이 마스킹되어야 하는지를 결정할 수 있다. 따라서, 타겟 행 또는 열 내의 각각의 개별 요소에 대한 개별 마스킹 상태를 제공하는 것은 필요하지 않다(하지만 이것은, 2D 마스킹을 제공하는 제2 마스킹 상태 데이터의 예와 함께 전술된 바와 같이, 원하는 경우 가능할 것이다). 2D 컨볼루션들을 핸들링하는 것에 대한 "1x1 컨볼루션들로의 분할" 접근법을 지원하는 목적을 위해, 입력 채널 데이터에 대한 공통 메모리 레이아웃은 인접한 메모리의 블록에서 다수의 입력 채널에 대해 동일한 x-y 위치에 있는 입력 요소들을 함께 그룹화하는 것이며, 이 경우에 마스킹은 그러한 입력 채널들 각각에 대한 입력 데이터를 정의하는 입력 행렬 구조의 전체 행 또는 열에 적용될 수 있을지도 모른다. 이것은 처리되고 있는 피연산자 행렬의 전체 행 또는 열 사이에서 마스킹 상태 데이터의 항목을 공유하는 것으로 충분할 수 있다는 것을 의미한다.
로드 마스킹 예에 대해, 마스킹 상태 데이터는 위에서 논의된 바와 같이 마스킹 상태 표시자들의 세트(예를 들어, 비트맵)를 사용하여 표현될 수 있다.
그러나, 다른 접근법은 마스킹 상태 데이터가, 주어진 피연산자 행렬의 각자의 행 또는 열 위치에 각각 대응하고 베이스 어드레스에 대한 메모리 내의 행렬 데이터 구조의 대응하는 부분의 어드레스의 오프셋을 나타내는 다수의 오프셋 값을 포함하는 것일 수 있다. 이 경우에, 마스킹된 행 또는 열 위치는 미리 결정된 예약된 오프셋 값을 갖는 마스킹된 행 또는 열 위치에 대한 오프셋 값에 의해 표시될 수 있다. 이러한 접근법은 유용할 수 있는데, 그 이유는 그것이 마스킹 상태 데이터가 메모리 내의 행렬 데이터 구조의 부분들이 그로부터 로딩되어야 하는 메모리 어드레스들을 식별하는 데 사용되는 어드레싱 정보의 일부를 사용하여 표현될 수 있다는 것을 의미하기 때문이다. 따라서, 각자의 행 또는 열 위치 각각에 대해, 그 행 또는 열 위치에 대한 베이스 어드레스 및 대응하는 오프셋 값은 오프셋 값이 미리 결정된 예약된 오프셋 값을 갖지 않을 때 행렬 데이터 구조의 부분이 그로부터 로딩되어야 하는 메모리 내의 어드레스들을 식별하는 데 사용될 수 있다. 그러나, 주어진 행 또는 열 위치에 대한 오프셋 값이 미리 결정된 예약된 오프셋 값을 갖는 경우, 메모리 내의 행렬 데이터 구조의 대응하는 부분에 로딩하는 대신에, 마스킹 값은 그 행 또는 열에 대한 행렬의 부분을 달리 저장할 피연산자 저장 회로부의 부분에 기입될 수 있다. 따라서, 이러한 접근법은 메모리 내의 행렬 데이터 구조의 어드레싱에 사용되는 상태 데이터 이외에 별개의 마스킹 상태 데이터를 제공할 필요성을 회피한다. 미리 결정된 예약된 오프셋 값은 -1(예를 들어, 부호 있는 이진 표현에서, 모든 오프셋 비트가 1인 값)과 같은 실제 오프셋 값들에 대해 사용되도록 허용되지 않는 것으로 지정되는 임의의 예약된 값일 수 있다.
일례에서, 마스킹 상태 데이터는 처리 장치 내에 제공된 적어도 하나의 마스킹 상태 레지스터 내에 저장될 수 있다. 예를 들어, 마스킹 상태 데이터의 제어 하에서 피연산자 행렬의 부분들을 로딩하기 위한 로드 명령어들을 실행하기 전에, 마스킹 상태 레지스터(들)에 마스킹 상태 데이터를 기입하기 위한 소정 명령어들이 있을 수 있다.
마스킹 상태 레지스터는 행렬 처리를 수행하고/하거나 행렬 처리를 위한 피연산자들을 로딩할 때 마스킹을 제어하기 위해 특별히 제공되는 전용 레지스터일 수 있다.
다른 예들에서, 적어도 하나의 마스킹 상태 레지스터는 적어도 하나의 프레디케이트 레지스터(predicate register)를 포함할 수 있다. 요소들의 1차원 어레이를 포함하는 하나 이상의 벡터 피연산자를 사용하여 벡터 처리를 수행하도록 처리 회로부를 제어하기 위한 벡터 명령어(또는 단일 명령어 다중 데이터 명령어)에 응답하여, 벡터 프레디케이트 레지스터가 판독되어, 벡터 처리의 각자의 레인들이 마스킹되는지를 제어하는 프레디케이트 값을 제공할 수 있다. 따라서, 동일한 레지스터(들)가 벡터 연산들에 대한 벡터 프레디케이트들을 나타내는 것과 행렬 연산들에 대한 마스킹 상태 데이터를 나타내는 것 사이에서 공유될 수 있다.
적어도 하나의 마스킹 상태 어드레싱 레지스터가 마스킹 상태 데이터가 그로부터 획득될 수 있는 메모리 내의 위치들을 식별하는 마스킹 상태 어드레싱 정보를 저장하기 위해 제공될 수 있다. 예를 들어, 마스킹 상태 데이터가 위에서 논의된 바와 같이 오프셋 값들의 세트를 사용하여 표현될 때, 오프셋 값들의 세트는 메모리에 저장될 수 있고, 마스킹 상태 어드레싱 레지스터 내의 마스킹 상태 어드레싱 정보는 그 어레이가 메모리에 저장되는 곳을 식별할 수 있다. 이러한 접근법은 행렬 처리를 지원하기 위해 제공되도록 아키텍처적으로 요구되는 레지스터의 수를 감소시킬 수 있으며, 이는 몇몇 저전력 마이크로아키텍처 구현들에 대해 바람직할 수 있다.
그럼에도 불구하고, 마스킹 상태 정보 자체를 저장하기 위한 레지스터들을 제공하는 것이 아키텍처적으로 요구되지 않을지라도(이 정보를 저장하기 위한 전용 하드웨어를 제공하기를 원하지 않는 그러한 마이크로아키텍처들이 메모리로부터 요구될 때 그것을 대신 로딩할 수 있기 때문에), 몇몇 마이크로아키텍처 설계자들은 그럼에도 불구하고 메모리로부터 획득된 마스킹 상태 데이터를 캐싱하기 위한 마스킹 상태 캐시를 제공하는 것을 선택하여, 그것이 미래의 액세스들을 위해 더 빠르게 액세스될 수 있게 하여서, 성능을 개선하는 것을 도울 수 있다. 이것은 유용할 수 있는데, 그 이유는 마스킹된/마스킹되지 않은 행들/열들의 패턴이 다수의 행렬 연산에 대해 동일할 수 있고, 따라서 캐싱이 상당한 수의 메모리 액세스들을 절약할 수 있을지도 모르기 때문이다.
마스킹 상태 데이터의 형태에 관계없이, 로드 회로부는 다양한 방식으로 정의될 수 있는 어드레싱 정보에 기초하여 메모리 내의 행렬 데이터 구조의 부분의 타겟 어드레스를 결정할 수 있다. 어드레싱 정보는 로드가 수행되게 하는 명령어에 의해 명시적으로 참조되는 레지스터로부터 획득될 수 있거나, 로드 명령어에 대해 암시적으로 참조되는 디폴트 레지스터로부터 획득될 수 있다.
일례에서, 어드레싱 정보는 어드레스 포인터들의 세트를 포함할 수 있으며, 여기서 각각의 어드레스 포인터는 주어진 피연산자 행렬의 각자의 행 또는 열 위치에 대응하는 행렬 데이터 구조의 부분의 어드레스를 나타낸다.
다른 예에서, 어드레싱 정보는 메모리에 저장된 행렬 데이터 구조의 베이스 어드레스, 및 베이스 어드레스에 대한 주어진 피연산자 행렬의 주어진 행 또는 열에 대응하는 행렬 데이터 구조의 부분의 어드레스를 결정하기 위한 오프셋 정보를 포함할 수 있다. 몇몇 예들에서 이러한 오프셋 정보는 마스킹 상태 데이터에 대해 사용되는 것과 동일한 오프셋 값들의 세트를 사용하여 표현될 수 있지만, 이것은 필수적인 것은 아니며 다른 예들에서 오프셋 정보는 마스킹 상태 데이터와는 별개일 수 있다. 오프셋 정보는 상이한 방식들로, 예를 들어, 주어진 피연산자 행렬의 하나의 행 또는 열에 대응하는 행렬 데이터 구조의 부분의 어드레스와 주어진 피연산자 행렬의 다음 행 또는 열에 대응하는 행렬 데이터 구조의 부분의 어드레스 사이의 차이를 나타내는 스트라이드 값(stride value)을 사용하여, 또는 앞서 설명된 바와 같이 오프셋 데이터 구조에서 다수의 행/열에 대한 오프셋을 명시적으로 기록하는 것에 의해 표현될 수 있다. 스트라이드 값의 사용은 각자의 행들에 대한 각각의 별개의 오프셋 값을 명시적으로 인코딩할 필요성을 회피하지만, 더 명시적인 오프셋 데이터 구조의 사용은 마스킹 상태가 오프셋들과 동일한 구조로 표현될 수 있게 하며, 각자의 행들/열들에 대한 메모리 액세스들의 불규칙적인 패턴을 갖는 행렬의 처리를 허용할 것이다. 어느 쪽이든, 베이스 어드레스에 대한 오프셋 정보를 사용하여 어드레스들을 표현하는 것은 어드레싱 정보가 주어진 피연산자 행렬의 각각의 행/열 위치에 대응하는 절대 어드레스들을 나타내는 경우보다 더 적은 비트를 사용하여 표현될 수 있게 할 수 있다.
몇몇 예들에서, 어드레싱 정보는 또한 주어진 타겟 행 또는 열을 로딩할 때 어드레싱 정보에 기초하여 식별된 메모리 내의 행렬 데이터 구조의 부분의 어느 하위 부분이 피연산자 저장 회로부에 로딩되어야 하는지를 선택하기 위해 하위 부분 선택 정보를 제공하는 추가 정보를 포함할 수 있다. 이것은, 하드웨어에서 처리될 수 있는 행렬들의 최대 크기에 대한 제한들이 주어지면, 더 큰 크기의 입력 행렬들을 처리할 때, 연산이 입력 행렬의 더 작은 부분에 각각 작용하는 다수의 하위 연산들로 분할될 필요가 있을 수 있다는 것을 인식한다. 메모리 내의 행렬 데이터의 레이아웃이 주어진 행렬 처리 명령어들의 세트에 의해 연산될 행렬 데이터의 블록보다 더 큰 크기의 행들 또는 열들을 포함할 수 있기 때문에, 하위 부분 선택 정보는 주어진 연산을 위해 행 또는 열의 어느 하위 부분이 처리되어야 하는지를 좁히는 데 사용될 수 있다.
따라서, 주어진 타겟 행 또는 열이 로딩될 메모리 내의 위치를 식별하는 어드레싱 정보를 표현하기 위한 다수의 옵션이 존재한다. 적어도 하나의 어드레싱 레지스터가 어드레싱 정보를 저장하기 위해 제공될 수 있다. 로드 명령어들 또는 행렬 처리 명령어들을 실행하기 전에, 실행되고 있는 프로그램은 처리될 행렬 데이터 구조의 부분을 선택하기 위한 적절한 어드레싱 정보를 적어도 하나의 어드레싱 레지스터에 로딩할 수 있다.
몇몇 구현들에서, 적어도 하나의 어드레싱 레지스터에 저장된 어드레싱 정보에 따라 메모리로부터 주어진 피연산자 행렬의 부분들을 프리페치(prefetch)하기 위한 프리페치 요청들을 생성하기 위해 프리페치 회로부가 제공될 수 있다. 예를 들어, 어드레싱 정보가 오프셋 값들의 어레이를 포함하는 경우, 더 이른 행들 또는 열들에 대한 주어진 피연산자 행렬의 행들 또는 열들을 로딩하는 동안, 프리페치 회로부는 더 늦은 행들/열들에 대한 오프셋들에 기초하여 데이터를 미리 보고 프리페치하기 시작할 수 있으며, 따라서 성능이 개선된다. 대안적으로, 다른 마이크로아키텍처들은 전력 및 회로 면적을 절약하기 위해 프리페치 회로부를 제공하지 않는 것을 선호할 수 있다.
몇몇 구현들에 대해, 행렬 처리 연산에 대한 제1 및 제2 입력 피연산자들은 2차원 행렬 피연산자들일 수 있다. 예를 들어, 행렬 처리 회로부는 단일 명령어에서 수행되는 전체 행렬 곱셈 연산을 지원할 수 있으며, 이는 성능에 유익할 수 있다. 그러나, 이러한 접근법은 전력 소비 및 회로 면적의 면에서 더 비쌀 수 있다.
따라서, 다른 구현들은 2차원 결과 행렬을 생성하기 위해 1차원 벡터 피연산자들에 대해 행렬 처리 연산을 수행하는 것을 지원하는 행렬 처리 회로부를 제공하는 것을 선호할 수 있다. 예를 들어, 행렬 처리 연산은 2D 결과 행렬을 생성하기 위해 1D 벡터 피연산자들에 적용되는 외적 연산을 포함할 수 있다. 이것은 실제로 2D 결과 행렬을 생성하기 위해 2개의 2D 행렬 피연산자들에 적용되는 행렬 곱셈 연산이 입력 행렬 피연산자들의 개별 행들/열들의 각자의 조합들에 적용되는 다수의 별개의 외적 연산들로 분해될 수 있고, 이때 외적 연산들의 결과들은 2D 행렬 곱셈 결과와 등가인 최종 결과를 생성하기 위해 함께 누산된다는 것을 인식한다. 따라서, 외적 연산이 외적 및 누산 연산을 포함하는 것이 특히 유용할 수 있으며, 이에 대해 결과 행렬은 누산기 행렬의 각자의 요소들에 대한 업데이트된 값들을 포함하며, 여기서 누산기 행렬의 주어진 요소에 대한 업데이트된 값은 1차원 벡터들로서 표현되는 제1 및 제2 입력 피연산자들에 대해 외적 연산을 수행한 결과에 대응하는 외적 결과 행렬의 대응하는 요소에 누산기 행렬의 그 주어진 요소의 이전 값을 더한 결과에 대응한다. 이러한 연산은 위에서 논의된 2D 컨볼루션 연산들을 지원하는 데 유용할 수 있다.
행렬 처리 회로부는, 단일 명령어에 응답하여, 제1 및 제2 입력 피연산자들에 기초하여 결과 행렬을 2차원 행렬로서 생성할 수 있다. 따라서, 행렬 곱셈 연산이 별개의 외적 연산들 - 각각의 외적 연산은 1차원 벡터 피연산자들에 작용함 - 을 수행하는 다수의 명령어로 분할될지라도, 각각의 개별 외적 연산은 그럼에도 불구하고 2차원 결과 행렬을 생성할 수 있다. 이것은 벡터 처리 회로부를 사용하여 행렬 연산과 등가인 일련의 벡터 연산들을 수행하는 접근법들과 비교해 개선된 성능을 제공할 수 있으며, 여기서 각각의 벡터 연산은 1D 벡터 피연산자들을 처리하여 1D 벡터 결과를 생성한다.
행렬 처리를 위한 위치 시프팅
예시적인 장치는 결과 행렬을 생성하기 위해 제1 및 제2 피연산자들에 대해 행렬 처리 연산을 수행하는 행렬 처리 회로부를 가지며, 여기서 결과 행렬은 2D 행렬이다. 피연산자 저장 회로부가 행렬 처리 회로부에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장한다. 위치 시프팅 회로부는 주어진 행렬 처리 연산 동안 피연산자 저장 회로부에 저장된 제1 및 제2 입력 피연산자들 중 하나의 주어진 요소에 기초하여 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하도록 가변 위치 시프트를 적용하기 위해 제공된다. 가변 위치 시프트는 주어진 행렬 처리 연산에 대해 선택 가능한 다수의 대안적인 시프트 양들 중 하나에 기초한다. 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 결과 행렬에 대한 제1 및 제2 입력 피연산자들 중 하나의 위치 시프트에 대응한다.
위치 시프팅 회로부는 2D 컨볼루션 연산들이 결과 행렬로 누산되는 다수의 별개의 1x1 컨볼루션들로 분해되는 접근법을 지원하는 데 유용하다. 본 발명자는 그러한 일련의 1x1 컨볼루션들에서, 다수의 인접한 커널 위치들에 대응하는 1x1 컨볼루션 연산들이 매우 유사한 입력 데이터, 그러나 각자의 커널 위치들에 대한 입력들 사이의 하나 이상의 행/열 위치의 상대적 시프트를 갖는 입력 데이터를 요구한다는 것을 인식하였다. 따라서, 입력의 가변 행/열 위치 시프트를 출력에 대한 주어진 행렬 처리 연산에 적용하는 회로부를 제공함으로써, 이것은 메모리로부터 로딩된 동일한 피연산자 데이터가 일련의 1x1 컨볼루션들이 2D 컨볼루션 연산을 구현하는 동안 다수의 상이한 커널 위치들에 대해 행렬 처리 연산들에 대한 입력들로서 작용할 수 있다는 것을 의미하며, 이는 주어진 2D 컨볼루션 연산을 수행하기 위해 메모리로부터 데이터를 로딩하는 데 필요한 로드 연산들의 수를 감소시킬 수 있다.
위에서 논의된 바와 같이, 몇몇 구현들이 전체 행렬 곱셈 연산들을 구현할 수 있지만, 하드웨어 비용들을 제한하기 위해, 다른 구현들은 2차원 결과 행렬을 생성하기 위해, 제1 및 제2 입력 피연산자들로서 1차원 벡터 피연산자들에 적용되는 외적 연산으로서 행렬 처리 연산을 구현할 수 있다. 따라서, 이 경우에, 가변 위치 시프트는 제1 및 제2 입력 벡터 피연산자들 중 하나 내의 주어진 요소에 기초하여 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경할 수 있다. 다시, 위에서 논의된 것들과 유사한 이유들로, 행렬 처리 연산이 외적 및 누산 연산인 것이 특히 유용할 수 있으며, 여기서 결과 행렬은 누산기 행렬에 대한 이전 값 및 외적 결과에 대해 생성된 대응하는 요소들에 기초하여 형성된, 누산기 행렬의 각자의 요소들에 대한 업데이트된 값들을 포함한다. 이러한 연산은 2D 컨볼루션들을 핸들링하는 1x1 컨볼루션 접근법을 지원하는 데 유용할 수 있다.
위치 시프팅 회로부는 행렬 처리 연산을 수행하도록 행렬 처리 회로부를 제어하기 위한 행렬 처리 명령어에 의해 지정되는 파라미터에 기초하여 각자의 대안적인 시프트 양들 사이에서 선택할 수 있다. 몇몇 구현들에서, 시프트 양을 식별하는 파라미터는 행렬 처리 명령어의 연산 코드의 일부일 수 있으며, 따라서 다수의 상이한 연산 코드들이 (상이한 시프트 양을 갖는 것이 아니라) 동일한 유형의 행렬 처리 연산에 각각 대응하는, 각자의 시프트 양들에 대해 할당될 수 있다. 대안적으로, 명령어 인코딩에서의 별개의 파라미터, 예를 들어, 수행될 특정 행렬 처리 연산을 식별하는 연산 코드와는 별개인 시프트 양 선택 필드가 정의될 수 있다. 시프트 양을 선택하기 위한 파라미터는 명령어 인코딩 내의 즉치 값으로서 표현될 수 있거나, 행렬 처리 명령어에 의해 지정되는 레지스터 내에서 식별될 수 있다.
대안적으로, 몇몇 구현들에서, 시프트 양 선택 파라미터를 저장하기 위한 소정의 전용 레지스터가 제공될 수 있으며, 따라서 시프트 양 선택 파라미터를 획득하기 위해 행렬 처리 명령어에 응답하여 판독되는 레지스터는 암시적이고, 따라서 명령어 인코딩에서 명시적 인코딩을 필요로 하지 않는다.
행렬 처리 회로부는 또한 결과 행렬 내의 소정 행들 또는 열들이 행렬 처리 회로부가 액세스 가능한 프레디케이트 정보에 의해 식별되는 바와 같은 활성 또는 비활성 행 또는 열 위치들로서 식별될 수 있는 프레디케이션을 지원할 수 있다. 따라서, 결과 행렬의 주어진 행 또는 열이 프레디케이트 정보에 의해 표시되는 활성 행 또는 열 위치에 대응할 때, 행렬 처리 회로부는 제1 및 제2 입력 피연산자들 중 하나의 대응하는 행 또는 열에 의존하는 값들을 갖는 결과 행렬의 주어진 행 또는 열의 요소들을 생성할 수 있다(어느 행 또는 열이 대응하는 행 또는 열인지는 그 특정 행렬 처리 연산에 대해 선택된 대안적인 시프트 양들 중 하나에 의존한다). 결과 행렬의 주어진 행 또는 열이 프레디케이트 정보에 의해 표시되는 비활성 행 또는 열 위치에 대응할 때, 제1 및 제2 입력 피연산자들 중 하나의 대응하는 행 또는 열과는 무관한 값들을 갖는 결과 행렬의 주어진 행 또는 열의 요소들이 생성된다. 예를 들어, 결과 행렬의 주어진 행 또는 열이 비활성일 때, 대응하는 요소들은 입력 피연산자의 대응하는 행 또는 열에 기초하여 업데이트됨이 없이 그들의 이전 값들을 보유할 수 있다. 입력 피연산자들의 소정 행들 또는 열들이 출력에 영향을 미치는 것을 방지하는 능력을 제공함으로써, 이것은 위에서 논의된 '랩어라운드' 문제를 다루는 데 도움이 된다. 이러한 프레디케이션은 앞서 설명된 마스킹 연산의 일례일 수 있다.
다시, 위에서 논의된 마스킹 예들에 관하여, 피연산자 저장 회로부는 행 그룹들에서 또는 열 그룹들에서 행렬 전치 회로부의 저장 유닛들의 판독 및 기입을 가능하게 하는 행렬 전치 회로부를 포함할 수 있다. 이것은 행 우선 또는 열 우선 형태로 표현된 메모리에 저장된 행렬 데이터 구조들의 더 효율적인 핸들링을 지원하는 것을 돕는다. 행렬 전치 회로부에 대한 위에서 논의된 특징들 모두가 또한 위치 시프팅 예가 사용될 때 제공될 수 있다.
행렬 전치 회로부가 제공될 때, 피연산자 저장 회로부는 또한 행렬 전치 회로부 자체와는 별개인, 행렬 처리 연산을 위한 제1 및 제2 입력 피연산자들을 저장하기 위한 피연산자 레지스터들을 포함할 수 있다. 피연산자 레지스터들은 행렬 처리 분리를 수행하도록 처리 회로부를 제어하기 위한 행렬 처리 명령어들에 응답하여 주어진 처리 연산을 위한 피연산자들이 그로부터 판독되는 저장 회로부일 수 있다.
행렬 전치 회로부로부터 주어진 피연산자 행렬의 적어도 하나의 행 또는 열을 판독하고 적어도 하나의 행 또는 열을 피연산자 레지스터들에 기입하도록 피연산자 이동 회로부를 제어하기 위해 전용 이동 명령어가 제공될 수 있다. 이것은 행렬 처리 명령어의 인코딩을 단순화할 수 있는데, 그 이유는 행렬 전치 회로부로부터 열이 또는 행이 판독되어야 하는지를 선택하기 위한(또는 어느 특정 행이 또는 열이 판독되어야 하는지를 선택하기 위한) 임의의 추가적인 파라미터들이 이동 명령어에서 인코딩될 수 있고, 따라서 행렬 처리 명령어 내의 더 적은 인코딩 공간이 그러한 파라미터들에 대해 소비될 필요가 있기 때문이다.
그러나, 다른 접근법은 피연산자들이 행렬 처리 명령어에 응답하여 행렬 전치 회로부로부터 판독될 수 있고, 피연산자 레지스터들의 세트를 통해 갈 필요 없이 행렬 처리 연산을 수행하기 위해 회로 로직에 직접 제공될 수 있는 것일 것이다.
이동 명령어에 응답하는 그러한 피연산자 이동 회로부, 또는 행렬 전치 회로부로부터 피연산자들을 직접 판독하는 능력은 마스킹을 사용하는 예에 대해 위에서 명시적으로 설명되지 않았지만, 이러한 특징들은 또한 그 예에서 제공될 수 있다.
또한, 이전 섹션에서 설명된 마스킹 기능은 전술된 위치 시프팅 기능과 결합될 수 있다. 따라서, 위치 시프팅 예에서도, 전술된 바와 같은 마스킹 상태 데이터에 기초하여 마스킹 연산을 수행하는 마스킹 회로부를 제공하는 것이 또한 가능하다.
실제로, 로드들에 대한 마스킹 기능과 위치 시프팅(행렬 처리 연산에 대한 입력에서 적용되는 프레디케이션을 포함함) 둘 모두를 결합하는 것이 특히 유용할 수 있다. 로드들에 대한 마스킹이 지원되는 경우에 프레디케이션은 단지 중복적일 것으로 예상할 수 있지만, 실제로는 둘 모두의 기능을 제공하는 것이 유용할 수 있다. 이것은, 행렬 처리 연산에 대한 입력에서 적용되는 프레디케이션이 그때 (위에서 논의된 랩어라운드 문제를 다루기 위해) 소정 행들이 출력에 영향을 미치는 것을 방지하기 위한 추가 마스킹일지라도, 패딩된 2D 컨볼루션을 지원하는 패딩 값들을 삽입하기 위해 로드들에 대한 마스킹이 사용될 수 있기 때문이다. 이것은, 랩어라운드 문제에 의해 영향을 받는 행들의 위치가 커널 위치마다 상이할 수 있고, 따라서 위치 시프팅 기능이 단일 커널 위치에 대해 로딩된 데이터의 세트에 기초하여 다수의 커널 위치들이 계산될 수 있게 하는 데 사용될 때, 프레디케이트 값에 기초한 프레디케이션이 각각의 개별 커널 위치에 대해 억제될 개별 행들을 선택하는 데 사용될 수 있으며, 이는 그러한 랩어라운드들이 메모리로부터 데이터를 로딩하는 포인트에서만 다루어지는 경우 핸들링하기 어려울 것이기 때문이다. 그럼에도 불구하고, 마스킹 접근법은 패딩 값들을 공급하는 데 유용할 수 있다.
그럼에도 불구하고, 앞서 설명된 예들에서, 위치 시프팅이 지원되지 않는 경우, 로드 연산을 수행하는 포인트에서의 마스킹은 각각의 커널 위치에 대해 별개의 로드를 수행하는 경우 랩어라운드 문제를 다루기에 충분할 수 있거나, 대안적으로 로드들에 대한 마스킹이 전혀 지원되지 않을 수 있고 대신에 행렬 처리 연산을 수행할 때 마스킹/프레디케이션이 적용될 수 있다.
다시, 마스킹 예에 관해서, 행렬 처리 연산에 대해 생성되는 결과 행렬은 단일 명령어에 응답하여 제1 및 제2 입력 피연산자들로부터 생성되는 2차원 결과 행렬일 수 있고, 따라서 1차원 벡터 결과를 각각 생성하는 개별 벡터 명령어들의 별개의 처리를 요구하지 않는다.
2D 컨볼루션
도 1은 출력 행렬을 생성하기 위해 입력 행렬 및 커널 행렬에 대해 수행되는 2D 컨볼루션 연산의 예를 도시한다. 이 예에서, 입력 행렬은 4x4 행렬이고, 커널은 3x3 행렬이고, 출력은 2x2 행렬이다. 수반되는 행렬들이 행들 및 열들의 수들에 대해 동일한 차원들을 갖는 정사각형 행렬들인 것은 필수적인 것은 아니며, 도 1에 도시된 행렬 크기들의 특정 세트는 일례일 뿐이라는 것이 인식될 것이다.
2D 컨볼루션 연산에서, 출력 행렬 내의 각각의 출력 요소에 대해, 커널은 생성되는 출력 요소에 대한 대응하는 위치에 있는 입력 행렬의 요소에 중심을 두고, 출력 요소는 중심 커널에 대한 대응하는 위치들에 있는 각자의 커널 요소들 및 입력 행렬 요소들의 곱들의 합에 대응하는 값으로 생성된다. 예를 들어, 입력 요소 F에 위치상 대응하는 출력 행렬 요소 F'에 대해, F'에 대한 값은 중심 커널 요소 K5가 출력 위치 F'에 대응하는 입력 요소 F 위에 위치된다고 가정하여 대응하는 위치들에 있는 입력 및 커널 요소들의 각자의 쌍들을 곱함으로써 생성된다. 따라서, F' = A * K1 + B * K2 + C * K3 + E * K4 + F * K5 + G * K6 + I * K7 + J * K8 + K * K9이다.
유사하게, 출력 행렬 내의 각각의 다른 행렬 요소에 대해, 요소는 곱들의 합에 기초하여 생성되지만, 입력 행렬의 상이한 요소 위의 커널을 갖는다. 예를 들어, 출력 요소 G'에 대해, 커널 행렬은 입력 행렬 요소 G 위의 그의 중심 요소 K5를 가지며, 이는 곱들의 합이 G' = B * K1 + C * K2 + D * K3 + F * K4 + G * K5 + H * K6 + J * K7 + K * K8 + L * K9임을 의미한다. 출력 요소들 J' 및 K'을 생성하기 위해 유사한 연산들이 수행된다.
도 1은 패딩되지 않은 2D 컨볼루션 연산을 도시하며, 이는 출력 요소들 F', G', J', K'이 그러한 입력 위치들 F, G, J, K에 대해서만 생성된다는 것을 의미하며, 여기서 커널 행렬의 어떠한 커널 요소도 입력 행렬의 경계 밖으로 확장됨이 없이 커널의 중심을 그 입력 위치에 두는 것이 가능하다. 예를 들어, 입력 요소들 A, B, C, D, E, H, I, L, N, M, O, P는 출력 행렬 내의 대응하는 요소들을 갖지 않는데, 그 이유는 이것은 커널의 일부가 입력 행렬의 경계 밖으로 확장될 것을 요구할 것이기 때문이다. 따라서, 패딩되지 않은 2D 컨볼루션에 대해, 출력은 일반적으로 입력보다 작을 수 있다.
도 2에 도시된 바와 같이, 입력 행렬의 에지들 부근의 위치들에 중심을 둔 커널을 적용하기 위해 필요할 입력 행렬의 경계들 밖의 요소 위치들에 대한 패딩 값들(PV)을 공급함으로써, 출력 행렬이 입력 행렬과 동일한 차원들을 갖고서 생성되는 패딩된 2D 컨볼루션을 수행하는 것이 또한 가능하다. 도 2의 예에서, 입력 행렬 및 커널은 도 1에서와 동일할 수 있지만, 이번에는 출력 행렬이 또한, 도 1과 동일한 방식으로 계산되는 요소들 F', G', J' 및 K'에 더하여, 출력 행렬을 입력 행렬과 동일한 쪽으로 가져오기 위한 주변 요소들 A' 내지 P'을 또한 포함하는 4x4 행렬이다.
커널이 이러한 외측 요소 위치들 중 하나에 중심을 둘 때의 계산들에 대해, 입력 행렬 밖에 위치할 커널 요소들은 패딩 값들(PV)과 곱해진다. 예를 들어, 출력 요소 A'을 생성하기 위한 계산에 대해, 이것은 중심 커널 위치 K5가 입력 행렬의 요소 A 위에 위치할 것을 요구할 것이며, 따라서 커널 요소들 K5, K6, K8, K9에 대응하는 입력 행렬 내의 위치들 A, B, E, F에 대한 유효 입력 값들이 존재하는 동안, 출력 행렬 A'에 대한 새로운 값을 생성하기 위해 곱들의 합을 생성할 때 다른 커널 요소들 K1, K2, K3, K4, K7이 패딩 값들과 곱해진다.
유사하게, 출력 행렬의 경계 주위의 다른 요소들에 대해, 패딩 값들은, 그 커널이 오버랩되는 입력 행렬의 에지에 따라, 커널에 대해 상이한 위치들에 있을 것이다. 예를 들어, 출력 위치 L'에 대해, 패딩 값들은 커널 K3, K6, K9의 우측 열에 대해 필요할 것인데, 그 이유는 이들이 커널이 위치 L 위에 중심을 둘 때 입력 행렬 밖으로 확장될 위치들이기 때문이다. 유사하게, 출력 요소 N'에 대해, 커널 위치 K5는 위치 N에 중심을 둘 것이고, 따라서 이것은 커널 위치들 K7, K8, K9의 하단 행이 입력 행렬 밖으로 확장되고 따라서 패딩을 요구한다는 것을 의미한다.
일례에서, 패딩 값은 단순히 0일 수 있다. 그러나, 몇몇 2D 컨볼루션 연산들은 다른 유형의 패딩 값들을 요구할 수 있다. 예를 들어, 몇몇 경우들에서, '0'이 실제로 0이 아닌 숫자 값을 사용하여 표현될 수 있도록, 각각의 행렬 요소에 대해 저장된 숫자 값들을 생성할 때 행렬의 진정한 값들에 오프셋이 적용되는 양자화 스킴이 사용될 수 있다. 이 경우에, 패딩 값은 0 포인트를 나타내는 0이 아닌 값일 수 있다. 패딩 값들은 입력 행렬 내의 다른 요소들의 평균화에 기초하여 설정될 수 있다. 패딩 값들을 설정하기 위한 정확한 규칙들은 수행되는 특정 응용에 의존할 수 있다. 따라서, (예를 들어, 제어 레지스터 및/또는 행렬 처리 명령어에 의해 지정된 파라미터에 기초하여) 패딩 값의 대안적인 유형들의 수 사이에서 선택하는 능력을 지원하는 것이 유용할 수 있다.
도 1 및 도 2의 예에 도시되지 않았지만, 커널 값들이, 주어진 입력 요소에 중심을 둘 때, 상수 스트라이드의 간격들에 의해 중심 입력 요소로부터 분리된 이웃한 입력 요소들에 적용되는 스트라이드된 컨볼루션들을 행하는 것이 또한 가능하다(스트라이드가 1인 도 1 및 도 2와 대조적으로, 다른 예들은 2 이상의 스트라이드를 가질 수 있다).
패딩되지 않은 2D 컨볼루션 연산 및 패딩된 2D 컨볼루션 연산들이 다양한 처리 응용들에 유용할 수 있다. 예를 들어, 2D 컨볼루션들은, 예를 들어 블러링(blurring), 샤프닝(sharpening), 에지 검출 등을 위해, 이미지들에 필터들을 적용하는 데 유용할 수 있다. 적용되는 커널은 원하는 필터의 유형에 기초하여 선택될 수 있고, 에지들과 같은 몇몇 특징들을 가져올 커널 요소들에 대한 특정 값들을 가질 수 있다. 사실상, 커널은 각각의 연속적인 이미지 픽셀 위에서 슬라이딩하고, 커널에 의해 정의된 관계를 사용하여 그 픽셀 및 주변 픽셀들의 수에 기초하여 출력 픽셀에 대한 새로운 값을 생성하기 위한 연산을 적용할 수 있다.
2D 컨볼루션들을 포함할 수 있는 다른 유형의 처리는, 예를 들어 신경망들을 구현함에 있어서의, 기계 학습의 분야에 있다. 예를 들어, 이미지 데이터 내의 특징들을 검출하도록 훈련된 신경망은 2D 컨볼루션 연산들에서 이미지 데이터에 적용되는 커널들의 세트를 사용하여 구현될 수 있다. 보다 일반적으로, 처리될 몇몇 데이터를 나타내는 특징 맵들이 데이터에 관한 추론들을 행하기 위해 커널들로 처리될 수 있다.
도 3에 도시된 바와 같이, 기계 학습 알고리즘들에 대해, 다수의 상이한 추론들이 데이터의 세트로부터 도출될 수 있게 하기 위해, 입력 및 출력 데이터의 다수의 채널들 및 커널 가중치들의 다수의 세트들을 지원하는 것이 유용할 수 있다. 각각의 입력/출력 채널은 요소들의 2차원 행렬을 포함할 수 있다. 예를 들어, 입력 채널들의 수는 IC일 수 있고, 각각의 입력 채널의 높이 및 폭은 IH(입력 높이) 및 IW(입력 폭)일 수 있다. 출력 채널들의 수는 OC이고, 각각의 출력 채널의 높이 및 폭은 OH(출력 높이) 및 OW(출력 폭)일 수 있다. 커널 가중치들의 OC 세트들이 제공되며, 여기서 OC는 출력 채널들의 수와 매칭된다. 커널 가중치들의 각각의 세트는 KH*KW*IC 가중치들을 포함한다(여기서, KH 및 KW는 커널 높이 KH 및 커널 폭 KW이고, IC는 입력 채널들의 수이다). 주어진 출력 채널은 도 1 또는 도 2에 도시된 유형의 기본 2D 컨볼루션 연산의 IC 인스턴스들을 수행하고 - 각각의 인스턴스는 단일 입력 채널 IC를 KH*KW 커널 가중치들의 대응하는 서브세트와 결합함 -, 각각의 입력 채널에 대한 기본 2D 컨볼루션들의 결과들을 함께 누산하여 대응하는 출력 채널을 생성함으로써(또는, 나중에 설명될 바와 같이, 동일한 결과를 제공하는 연산들의 다른 시퀀스들을 수행함으로써) 생성된다. 다른 출력 채널들은 유사한 연산들을 사용하여, 그러나 각각의 출력 채널에 대해 KH*KW*IC 커널 가중치들의 상이한 세트를 사용하여 계산된다. OH 및 OW가 입력 높이 IH 및 입력 폭 IW와 동일한지 또는 그보다 작은지는 패딩된 2D 컨볼루션이 또는 패딩되지 않은 2D 컨볼루션들이 수행되고 있는지에 의존할 수 있다.
이 예에서, 출력 채널들의 수 OC는 입력 채널들의 수 IC와 동일하지만, 이것은 필수적인 것은 아니다. 다른 예들은 IC 및 OC에 대해 상이한 수들을 가질 수 있다. 또한, 도 3에 도시된 2D 컨볼루션은 2D 컨볼루션들의 트리에서 단지 하나의 단계일 수 있으며, 따라서 입력 채널들은 그 자체가 이전 컨볼루션들로부터의 출력으로서 형성될 수 있고, 도 3에서의 출력 채널은 그 자체가 추가 컨볼루션들에 의해 처리될 수 있다.
2D 컨볼루션들이 다수의 입력 채널들에 적용되어야 할 때, 메모리 내에 입력 채널들의 데이터를 저장하는 데 사용되는 레이아웃에 대한 다수의 선택들이 있을 수 있다. 도 4는 NHWC 메모리 레이아웃으로 지칭되는 하나의 가능한 메모리 레이아웃을 도시하며, 여기서 C는 입력 채널들을 지칭하고, W는 폭을 지칭하고, H는 높이를 지칭하고, N은 IC 입력 채널들의 개별 세트들에 의해 표현되는 별개의 객체들의 수를 지칭한다. NHWC 표기법은, 메모리 내의 데이터 구조 내의 연속적인 어드레스들로부터 데이터를 판독할 때, 입력 채널 식별 변수 C가 가장 빠르게 변하는 변수이고 객체 식별 변수 N이 가장 느리게 변하는 변수라는 것을 나타낸다. 따라서, NHWC 레이아웃에서, 메모리 내의 데이터 구조 내의 연속적으로 증가하는 어드레스들을 통해 트래버스할 때, 먼저 IC 입력 채널들 각각에 대한 주어진 x-y 행렬 위치에 대한 입력 행렬 요소들이 메모리 내의 연속적인 어드레스들의 블록에 저장되고, 이어서 제1 행렬 요소들과 동일한 행 내의 다음 위치에 대한 각각의 입력 채널 내의 요소들이 레이아웃되며, 각각의 다른 x-y 위치에 대해 등등이다. 즉, 요소들은 먼저 하나의 요소 위치에 대한 모든 입력 채널들을 통해 순환하고, 이어서 동일한 행 내의 다음 요소로 이동하고(폭 W가 채널 ID 후에 다음으로 가장 빠르게 변하는 변수이기 때문에), 이어서 일단 모든 채널들에 대해 동일한 행 내의 모든 위치들(동일한 y 행렬 좌표를 갖는 요소들)이 저장되면, 저장된 다음 요소가 다음 최고 y 위치에서의 다음 행에 대한 것일 것이다.
따라서, 도 3을 참조하면, 도 4에 도시된 메모리 레이아웃의 제1 행은 각각의 입력 채널 내의 위치 A에 대응하는 크로스 해칭된 박스들 내의 요소들에 대응할 수 있고, 이어서 다음 행은 각각의 입력 채널 내의 위치 B에 대응하는 점으로 된 음영으로 도시된 요소에 대응할 수 있고, 그 제1 행 내의 요소들 C, D의 나머지에 대해 등등이다. 일단 행의 끝에 도달하면, 각각의 입력 채널 내의 위치 E에 있는 요소들에서 시작하여 다음 행에 대해 동일한 것이 행해진다. 처리될 다수의 객체들(예를 들어, 다수의 별개의 이미지들)이 각각 IC 입력 채널들의 별개의 세트를 사용하여 표현되는 경우, 하나의 객체(N=0)에 대한 모든 데이터는 다음 객체(N=1)에 대한 데이터 전에 메모리에 저장된다.
이해의 용이함을 위해, 도 4는 어드레스 공간의 하나의 "행"에 있는 모든 채널들에서의 주어진 입력 행렬 위치에 대한 요소들을 도시하고 이어서 요소들을 다음 입력 위치 B에 저장하기 위해 도 4의 2D 표현의 다음 "행"으로 이동하지만, 실제로는 어드레스 공간은 단지 단조 증가하는 일련의 어드레스들이고 도 4에 도시된 바와 같이 어드레스들의 2D 배열이 없다는 것이 인식될 것이다. 도 4에 도시된 2D 표현은 정보를 페이지에 맞추기 위해 간결함을 위해 사용되는 그래픽 표현이다. 그럼에도 불구하고, 메모리에 저장된 정보는 행렬들의 다수의 채널들을 나타내며, 여기서 그러한 행렬들은 행들 및 열들로 논리적으로 배열된 2차원 구조들이다.
도 4에 도시된 NHWC 메모리 레이아웃은 하나의 가능한 레이아웃이지만, 다른 구현들은 행렬 구조를 상이한 레이아웃으로 저장할 수 있다. 예를 들어, NCHW 메모리 레이아웃이 사용되는 경우, 레이아웃은 채널 0에 대한 모든 X/Y 값들을 제공할 수 있고, 이어서 채널 1에 대한 모든 X/Y 값들을 제공할 수 있고, 등등이다.
주어진 응용에 대해 선택된 특정 메모리 레이아웃에 관계없이, 2D 컨볼루션 접근법에 관한 하나의 문제점은 출력 행렬 내에 주어진 출력 요소를 생성하기 위해 커널 요소들과 결합하는 데 필요한 요소들이 메모리 어드레스 공간 내의 인접한 메모리 어드레스들 내에 있지 않을 수 있다는 것이다. 예를 들어, 도 2의 패딩된 2D 컨볼루션에서 좌측 상단 출력 위치 A'을 계산하기 위해, 이것은 위치들 A, B, E, F에 대한 입력 요소들이 메모리로부터 획득될 것을 요구할 수 있지만, 도 4에 도시된 바와 같이, NHWC 메모리 레이아웃으로 저장될 때, 이들은 어드레스 공간의 인접한 부분들 내에 있지 않은데, 그 이유는 그들이 입력 위치들 C 및 D에 대한 요소들에 의해 분리되기 때문이다. 각각의 커널 위치는 요소들의 상이한 맞춤형 서브세트가 메모리에서 입력 행렬을 정의하는 데이터 구조로부터 추출될 것을 요구할 수 있다.
도 5는 이 문제를 다루기 위한, im2row로 불리는, 하나의 접근법을 도시한다. im2row에서, 2D 컨볼루션 연산들 자체를 수행하기 전에, 입력 채널들을 나타내는 입력 행렬 구조는 먼저 원래의 입력 데이터 구조와는 상이한 어드레스 공간 부분에 저장된 데이터의 다수의 행 2를 생성하도록 재배열되며, 여기서 각각의 행 2는 출력 행렬에서의 특정 출력 요소 위치에 대해 커널 행렬에 의해 연산될 데이터에 대응한다. 예를 들어, 출력 위치 A'에 대해, 각자의 입력 채널들의 요구되는 요소들 A, B, E, F가 함께 수집되고, 그들이 커널 요소들 K1 내지 K9의 순서에 대응하는 올바른 위치들에 있도록 적절한 패딩과 결합될 수 있다. 이것은 후속 행렬 처리 연산이 단순히 다수의 커널 채널들의 각각의 커널 요소를 행 2 내의 매칭 위치에 있는 대응하는 데이터와 곱하고, 결과적인 곱들을 더하여 그 출력 위치에 대한 데이터를 생성할 수 있다는 것을 의미한다. 주어진 행 2는 서로 인접하게 위치된 입력 채널들 IC 각각에 대한 각자의 입력 값들을 가지며, 이들은 상이한 커널 채널들 내의 동일한 커널 위치에 대한 각자의 커널 값들에 의해 연산될 것이라는 점에 유의한다.
유사하게, 출력 행렬 내의 각각의 다른 출력 위치에 대해, 그 출력 위치를 생성하는 데 필요한 각자의 입력 요소들을 함께 수집하는 것에 의해 상이한 행 2가 생성된다. 따라서, 이것은 추가적인 데이터의 OH * OW 행 2가 생성될 것을 요구하며, 여기서 각각의 행은 KH * KW * IC 요소들을 포함한다. 이것은 메모리에 저장된 데이터로부터 요소들의 각자의 서브세트들을 추출하고 그들을 행들을 생성하기 위해 메모리 내의 다른 곳에 복사함에 있어서 많은 오버헤드를 생성할 수 있지만, 이것은 후속 2D 컨볼루션 연산을 크게 단순화할 수 있고, 이는 이어서 대응하는 출력 행렬을 생성하기 위해 행렬 처리 연산에서 커널 값들을 인접한 메모리의 블록에 직접 간단히 적용할 수 있다.
그러나, 이러한 접근법은 몇 가지 문제를 갖는다. 하나의 문제는 주어진 데이터 처리 시스템에서 구현되는 행렬 처리 연산들에 대해 점점 더 성능이 개선되고 있다는 것이다. 행렬 처리 성능이 개선됨에 따라, 암달의 법칙(Amdahl's Law)은 행렬 처리 연산들 자체와 함께 수행되는 다른 연산들이 전체 성능에 점점 더 중요한 영향을 미친다는 것을 의미한다. 행렬 처리 연산들 자체가 성능에 있어서 계속 개선될 수 있을지라도, 도 5에 도시된 im2row 연산과 같은 다른 연산들이 행렬 처리 연산들과 유사한 성능 개선을 보여줄 수 없다면(im2row 연산은 메모리 대역폭 한계이기 때문에), 행렬 처리에 있어서의 성능 개선들의 완전한 이익이 실현될 수 없다. 따라서, 도 5에 도시된 바와 같은 im2row를 수행하는 오버헤드는 몇몇 처리 응용들에 대해 점점 더 용인 가능하지 않다. 다른 문제는 이러한 리매핑 연산들이 많은 메모리를 소비한다는 것이다. 예를 들어, 위치 F에 대한 입력 행렬 요소들은 도 5의 예에서 다수의 행 2 내에 도시된다는 점에 유의한다. 따라서, 이것은 또한 단지 커널 행렬들에 대한 입력 행렬들의 적절한 상대적 위치 결정을 제공하기 위해 입력 값들의 복제로 인해 메모리 어드레스 공간을 낭비한다. 예를 들어, im2row는 몇몇 기계 학습 알고리즘들에 대해 원래의 입력 데이터 구조보다 8배 내지 9배만큼 많은 메모리를 요구할 수 있다.
다른 유형의 컨볼루션 연산은 1x1 컨볼루션 연산이며, 이는 전술된 2D 컨볼루션과 유사하지만, 2차원 범위를 갖는 대신에 1x1 행렬인 커널을 갖는다. 1x1 커널에 의해, 1x1 컨볼루션 연산의 결과는 단순히 각각의 요소가 입력 행렬의 대응하는 요소를 동일한 커널 요소와 곱한 결과에 대응하는 출력 행렬이다. 도 6에 도시된 바와 같이, 일련의 1x1 컨볼루션들을 사용함으로써, 주어진 1x1 컨볼루션 연산의 결과가 이전의 1x1 컨볼루션 연산들로부터의 결과들에 더해지는 위치의 상대적 시프트와 함께 다수의 1x1 컨볼루션들의 결과들을 누산하는 것에 의해, 2D 컨볼루션과 동일한 결과를 생성하는 것이 가능하다.
위에서 제시된 2D 컨볼루션들의 예들에서, 곱들의 합의 계산은 출력 행렬의 각각의 위치에 대해 개별적으로 제시되었으며, 이때 곱들의 각각의 그룹은 입력/커널 위치들의 상이한 쌍들, 그러나 동일한 출력 위치에 대한 것이다.
그러나, 단일 커널 위치와 연관된 곱셈들의 세트를 그룹으로 간주하여, 곱셈들을 상이한 그루핑으로 파티셔닝하는 것이 또한 가능하며, 이때 곱셈들의 그 그룹은 각각의 출력 위치에 대해 합산될 곱들 중 하나를 생성한다. 도 2의 예를 고려하면, 이를테면, 단일 커널 위치, 예를 들어, 위치 K1을 고려할 때, 그 커널 값 K1은 출력 값 A'을 생성할 때 패딩 값과 곱해지고, 출력 값 L'을 생성할 때 입력 값 G와 곱해지고, 출력 요소 N'을 생성할 때 입력 값 I와 곱해질 필요가 있다. 따라서, 도 6의 상단 부분은 출력 행렬에서 대응하는 출력 요소들 A' 내지 P' 각각에 대해 합에 사용되는 하나의 부분 곱을 형성하기 위해 K1과 곱해질 입력 요소들 사이의 관계를 도시한다.
유사하게, 각각의 다른 커널 위치 K2-K9에 대해, 출력 위치들 각각에 대해 합산된 곱들 중 다른 것을 생성하기 위해 어느 입력 요소(또는 패딩 값)가 그 커널 요소와 곱해져야 하는지가 결정될 수 있다. 주어진 입력 행렬 요소는 각각의 커널 위치에 대한 출력 행렬의 상이한 요소에 기여한다는 점에 유의한다. 예를 들어, 입력 요소 F를 고려할 때, 이것은 커널 요소 K1과 곱해질 때 출력 요소 K'에 기여할 것이고, 커널 요소 K2와 곱해질 때 출력 요소 J'에 기여할 것이고, 커널 요소 K3과 곱해질 때 출력 요소 I'에 기여할 것이고, 등등이다 - F가 커널 요소 K9와 곱해질 때 출력 요소 A'에 기여할 때까지 -.
따라서, 각자의 커널 요소 위치들 사이에서, 출력 행렬 내의 주어진 출력 요소의 위치와, 그 특정 커널 요소 위치에 대한 그 주어진 출력 요소에 기여하는 대응하는 입력 요소의 위치 사이에 상대적 시프트가 존재한다. 예를 들어, K1 곱셈과 K2 곱셈 사이의 유효 입력 행렬의 시프트는 하나의 열 위치만큼 남겨진 시프트이다.
이것은, 일련의 1x1 컨볼루션들을 수행하고 각각의 1x1 컨볼루션의 결과들을 출력 행렬에 대한 누계들을 나타내는 누산기 행렬로 누산함으로써, 결과가 1x1보다 큰 커널 크기에 걸쳐 수행되는 2D 컨볼루션 연산의 결과와 등가일 수 있다는 것을 의미한다. 예를 들어, 도시된 K2 곱셈들 각각의 결과가 K1 곱셈들로부터 기인하는 누산기 행렬의 대응하는 요소들에 더해질 수 있고(이때, 이를테면, K2*B의 결과가 K1 1x1 컨볼루션에서 K1*A에 기초하여 설정된 위치 F'에서의 누산기 행렬 요소에 더해짐), 이어서 K3 곱셈들 각각의 결과가 K1 및 K2 곱셈들로부터 기인하는 누산기 행렬의 대응하는 요소들에 더해질 수 있다(이때 K3*C의 결과가 출력 요소 F'에 대한 누산된 값에 더해지고, 따라서 F'은 이제 K1*A + K2*B + K3*C와 동일함). 이것은 각각의 연속적인 커널 위치에 대해 계속되고, 따라서 9번째 1x1 컨볼루션 연산의 종료에 의해, 출력 행렬은 2D 컨볼루션 연산이 3x3 커널 행렬로 수행된 경우와 동일한 결과를 갖는다. 도 6에 도시된 순서 K1, K2, K3, ..., K9로 1x1 컨볼루션들을 계산하는 것은 필수적인 것은 아니며, 커널 포인트들의 임의의 순서가 사용될 수 있다는 것이 인식될 것이다. 그러나, 위치 시프팅 예가 아래에 설명되는 바와 같이 사용되는 경우, 이웃한 커널 위치들을 연속하여 계산하는 것은 성능을 개선하는 데 도움이 될 수 있는데, 왜냐하면 연속적인 1x1 컨볼루션들에 대한 주어진 출력 위치를 계산하는 데 사용되는 입력 위치들 사이의 시프트들이 더 작을 것이며 따라서 이것은 도 8과 관련하여 아래에서 설명되는 가변 위치 시프팅 기법이 사용될 때 다수의 1x1 컨볼루션들에 걸쳐 메모리로부터 로딩되는 데이터의 더 빈번한 재사용을 용이하게 할 수 있기 때문이다.
도 7에 도시된 바와 같이, 도 6에 도시된 분할된 1x1 컨볼루션 접근법을 사용하는 것의 이점은, 이것이 주어진 커널 위치 Kn에 대해 요구되는 곱셈들이 단일의 인접한 메모리의 블록이거나 규칙적인 스트라이드 간격들로 분리된 여러 개의 그러한 인접한 블록들인 메모리의 블록으로부터 로딩된 데이터에 적용될 수 있다는 것을 의미한다는 것이며, 이는 1x1 컨볼루션 연산들이 메모리 내의 데이터 구조들과 유사한 포맷으로 데이터에 직접 적용될 수 있고, 도 5에 도시된 성능 집약적이고 메모리를 많이 사용하는(memory-hungry) im2row 기술이 필요하지 않다는 것을 의미한다.
도 7은 이전의 예들과 유사하게 다수의 입력 및 출력 채널들을 핸들링하기 위해 1x1 컨볼루션들이 어떻게 확장될 수 있는지를 도시한다. 도 7은 x-y 차원에서의 단일 커널 위치, 예를 들어 도 7의 예에서 커널 위치 K1에 대응하는 곱들의 세트를 계산하기 위한 행렬 곱셈 연산을 도시한다. 즉, 도 7은 오직 도 6의 상단 부분에 대한, 그러나 다수의 입력/출력 채널들을 핸들링하기 위해 확장된 곱들의 계산을 도시한다. 이어서 유사한 연산들이 각각의 다른 커널 위치에 대해 수행될 수 있다는 것이 인식될 것이다.
도 7은 각각의 출력 채널을 생성하기 위해 입력 채널들 사이에 크로스오버가 있는 2D 컨볼루션 연산의 일부를 구현하기 위한 예를 도시한다(즉, 주어진 출력 채널에 대한 행렬을 제공하기 위해 커널/입력 채널들의 각각의 쌍에 적용되는 2D 컨볼루션의 결과들이 더해질 것이다). 이것은 주어진 커널 포인트 K1에 대응하는 1x1 컨볼루션에 대해, 주어진 출력 채널에서의 주어진 위치 F'에서의 값이 곱들의 합
Figure pct00001
에 대응한다는 것을 의미하며, 여기서 i는 모든 입력 채널들에 걸쳐 증분되고, K1i는 각각의 커널 채널 내의 대응하는 위치에서의 커널 값이고, Ai는 각각의 입력 채널 내의 대응하는 위치에서의 입력 요소이다. 다수의 출력 채널들을 생성하기 위해, 대응하는 연산이 다수의 상이한 세트들의 커널 채널들에 대해 병렬로 수행될 수 있다(다수의 특징들이 병렬로 검출될 수 있게 하기 위해).
따라서, 도 7에 도시된 바와 같이, 다수의 입력/출력 채널들에 걸쳐 평가될 때 주어진 커널 위치 K1에 대한 1x1 컨볼루션은, IC 입력 채널들 각각에 대한 Z개의 입력 요소 값들의 세트 A 내지 K를 제공하는 ZxIC 입력 행렬(10)을, 각자의 출력 채널들에 대응하는 별개의 커널 채널들의 OC 세트들 각각 내의 각각의 IC 입력 채널에 대한 커널 위치 K1에 대한 커널 값들의 세트를 제공하는 ICxOC 커널 행렬(11)과 곱하는 행렬 곱셈 연산이도록 확장될 수 있다. 이어서 행렬 곱셈의 결과는 각각의 출력 채널 OC에 대해 Z개의 출력 요소들의 세트 F' 내지 P'을 제공하는 ZxOC 출력 행렬(12)이다. K1에 대해 필요한 패딩되지 않은 요소 위치들의 범위는 A부터 K까지 연장되지만, 상이한 요소 위치(예를 들어, K2)에 대해 패딩되지 않은 요소 위치들의 범위는 더 클 수 있기 때문에(예를 들어, A부터 L까지 연장됨), 입력/출력 행렬들(10, 12)에 대한 Z 차원은 어느 커널 위치 Kn이 처리되고 있는지에 따라 달라질 것임에 유의한다. 또한, 0이 아닌 패딩 값이 사용되고 있는 경우, 0이 아닌 패딩을 수용하기 위해 입력/출력 행렬들에서 추가적인 행렬 행들이 필요할 수 있다.
입력 행렬(10)은 도 4에 도시된 바와 같이 레이아웃된 데이터 구조로부터 직접 메모리로부터 로딩될 수 있는데, 그 이유는 입력 행렬(10)의 각각의 행이 IC 입력 채널들 각각에 걸쳐 입력 행렬 내의 단일 x-y 위치에 대한 요소들의 세트를 포함하기 때문이다. 예를 들어, 입력 행렬(10)의 상단 행은 상이한 입력 채널들 각각에 대해 "A" 요소들(예를 들어, x=0, y=0)을 제공하고, 이어서 입력 행렬(10)의 다음 행은 모든 "B" 요소들(x=0, y=1)을 제공하고, 등등이다. 따라서, 데이터가 도 4에 도시된 바와 같이 NHWC 레이아웃으로 메모리에 레이아웃되는 경우, 이러한 입력 행렬(10)은 단순히 메모리에 저장된 데이터의 포맷에 정확히 대응하고, 따라서 단일의 인접한 메모리의 블록으로서 로딩될 수 있다. 대안적으로, 처리 하드웨어에 의해 하나의 연산에서 처리될 수 있는 입력 채널들의 수 IC가 메모리에 저장된 행렬 구조에 사용되는 채널들의 실제 수 Cmax보다 작은 경우, 입력 행렬(10)은 일정한 스트라이드의 간격들로 분리된 다수의 인접하지 않은 청크들에 대응할 수 있으며, 이는 im2row 예에 도시된 바와 같이 메모리 액세스들의 다수의 불규칙적인 패턴들을 요구할 도 2에 도시된 방식으로 2D 컨볼루션들이 수행된 경우보다 메모리로부터 로딩하기에 훨씬 더 간단하다. 따라서, 1x1 컨볼루션 접근법은 1x1 컨볼루션을 계산하기 위한 곱셈들을 수행하기 전에 메모리에 저장된 행렬 구조의 리매핑이 필요하지 않다는 것을 의미한다.
유사하게, 출력 행렬(12)은 입력 행렬(10)에 대한 대응하는 레이아웃을 가지며, 따라서 일단 2D 컨볼루션에 대한 모든 1x1 컨볼루션들이 함께 누산되면, 결과는 도 4에서와 같이 레이아웃된 메모리 내의 행렬 데이터 구조에 직접 후기입될 수 있다.
도 6의 상단 부분에 도시된 바와 같이, 좌측 상단 커널 가중치 K1을 고려할 때, 입력 위치들과 출력 위치들 사이의 상대적 시프트는, 입력 행렬의 행 A가 출력 행렬의 행 F에 대한 출력들을 생성하기 위해 커널 가중치 K1과 곱해져야 하고, 입력 행렬의 행 B가 출력 행렬의 행 G에 기여하고, 등등이게 한다. 이것은 일반적으로 대부분의 행들에 대해 작용하는데, 왜냐하면 K1 가중치 예에 대해 입력 행렬과 출력 행렬 사이에서 아래쪽으로 5개 행의 위치의 일정한 시프트가 있기 때문이다. 그러나, 이러한 행들을 커널 가중치들과 곱하고 결과들을 출력 행렬의 대응하는 시프트된 위치들 I', M'으로 누산하는 것이 잘못된 결과들을 제공할 입력 행렬의 몇몇 행들 D, H가 존재하는데, 그 이유는, 도 6에 도시된 바와 같이, 이것은 출력 행렬의 먼 좌측에 있는 요소가 2D 컨볼루션에 대해 부정확한, 입력 행렬의 반대 우측 에지 상의 요소를 사용하는 곱셈들에 기초하여 업데이트될 것임을 의미할 것이기 때문이다. 이러한 문제는 "랩어라운드" 문제로 지칭될 수 있다. 도 7에 도시된 행렬들(10 및 11) 사이의 행렬 곱셈을 오직 행들 A-C(또는 E-G 또는 I-K)의 블록 - 그러한 행들 모두가 출력 행렬에 기여할 필요가 있음 - 을 포함하는 입력 행렬(10)의 청크에 각각 대응하는 다수의 별개의 연산들로 분할함으로써 랩어라운드 문제가 회피될 수 있지만, 이것은 추가적인 명령어들이 실행될 것을 요구할 것이고 성능을 감소시킬 것이다.
따라서, 랩어라운드 문제에 직면하는 선택된 행들이 있을지라도 더 많은 수의 행들에 걸쳐 1x1 컨볼루션들이 적용될 수 있게 하기 위해, 출력을 생성할 때 입력의 소정 행들이 스킵될 수 있도록 허용하는 마스킹 연산을 지원하는 것이 유용할 수 있다. 이것은 입력 행들 D, H와 출력 행들 I', M' 사이의 경로 상에 마킹된 "X"에 의해 도시된다. 마스킹 연산은 마스킹된 행들(또는 행렬들이 대신에 주어진 입력 채널 위치에 대한 입력 요소들이 동일한 열 내에서 연장되는 상태로 배열되는 경우, 마스킹된 열들)의 위치들을 정의하는 마스킹 상태 데이터에 의해 제어될 수 있다. 마스킹 상태 데이터를 인코딩하는 예들이 아래에서 설명된다. 마스킹 연산은 메모리로부터 레지스터들로 데이터를 로딩할 때 구현될 수 있다(따라서 메모리로부터 실제 데이터 요소들을 로딩하는 대신에, 마스킹 값이 대신에 입력 채널 행렬(10)을 형성하기 위한 정보를 저장하기 위한 피연산자 저장소의 대응하는 부분들에 로딩된다). 대안적으로, 마스킹 연산은 행렬 처리 연산 자체를 수행할 때 수행될 수 있으며, 따라서 행렬 처리 회로부가 처리를 위한 피연산자들을 판독할 때, 요소들의 판독 행을 마스킹하고 행렬 처리 회로부가 마치 그들이 피연산자 저장소에 저장된 실제 값 대신에 마스킹 값을 나타내는 것처럼 그러한 요소들을 취급하는 것을 보장하기 위해 프레디케이션이 적용된다. 마스킹 값은 0일 수 있거나, 0 포인트가 0이 아닌 값을 사용하여 표현되는 경우 0이 아닐 수 있다. 어느 쪽이든, 이것은 랩어라운드 문제가 에러들을 야기하는 것이 방지된다는 것을 의미하고, 이것은 1x1 컨볼루션이 더 적은 명령어들로 수행되는 것을 가능하게 하는데, 왜냐하면 1x1 컨볼루션이 랩어라운드 문제에 직면하지 않는 인접한 행들의 블록보다 더 큰 행렬 크기에 적용될 수 있기 때문이다.
다른 커널 가중치 위치들 K2-K9에 대해, K1에 대해 도 7에 도시된 것과 유사한 행렬 곱셈 연산들이 수행될 수 있으며, 이때 결과들은 함께 누산된다.
도 8은 일련의 커널 가중치 위치들에 대해 1x1 컨볼루션들을 수행하기 위해 메모리 내의 행렬 데이터 구조로부터 데이터가 로딩될 필요가 있는 횟수를 감소시킴으로써 성능을 개선하는 데 사용될 수 있는 추가의 관찰을 도시한다. 도 6으로부터, 동일한 행 내의 상이한 커널 위치들에 대해 각자의 1x1 컨볼루션들을 평가할 때, 그러한 커널 위치들 각각에 대해 필요한 입력 행렬이 매우 유사하다는 것이 관찰된다. 예를 들어, 도 8은 중심-좌측, 중심 및 중심-우측 커널 위치들 K4, K5, K6에 대한 입력 행렬들(10)을 각각 도시한다. 중심 커널 가중치 K5에 대해, 입력 행렬은, 커널 가중치 K5가 출력 A를 생성할 때 위치 A와 곱해지고, 출력 B를 생성할 때 위치 B와 곱해지고, 입력/출력 행렬들(10, 12) 내의 다른 위치들 각각에 대해 등등이기 때문에 출력 행렬과 정확히 정렬될 것이다.
중심-좌측 커널 위치 K4에 대해, K4는 출력 요소 B를 생성할 때 입력 행렬의 요소 A와 곱해질 필요가 있다(왜냐하면 커널 K5의 중심 위치가 요소 B 위에 있을 때 K4는 A와 곱해질 것이기 때문에). 유사하게, 입력/출력 행렬들(10, 12) 내의 다른 위치들 각각에 대해 입력 요소들과 출력 요소들 사이에 1 위치 시프트가 존재한다.
유사하게, 중심-우측 커널 위치에 대해, K6은 출력 요소 A를 생성하기 위해 입력 요소 B와 곱해질 필요가 있고, 출력 요소 B를 생성하기 위해 입력 요소 C와 곱해질 필요가 있고, 등등이다.
도 8에 도시된 바와 같이, 중심-좌측 및 중심-우측 위치들에 대해, 도 7과 관련하여 설명된 랩어라운드 문제로 인해 스킵될 몇몇 행들이 존재하고, 스킵된 행들의 특정 위치들은 커널 가중치 위치에 따라 달라진다(예를 들어, 스킵된 입력 행들은 K4에 대해 행들 D, H, L이지만 K6에 대해서는 행들 E, I, M이고, K5에 대해서는 스킵된 입력 행들이 없다).
그러나, 일반적으로 입력 행렬(10)의 행들 A-P에 대한 입력 데이터는, 중심 위치 K5에 비해, 중심-좌측 위치 K4에 대해 입력 행렬(10)이 출력에 대해 1 행 위치 아래로 시프트되고, 따라서 입력 행 A가 중심 위치 K5에서와 같이 행 A를 생성하는 대신에 출력 행 B를 생성하는 데 사용된다는 점을 제외하고는, 3개의 커널 가중치 위치 K4, K5, K6 각각에 대해 본질적으로 동일하다는 것을 알 수 있다. 유사하게, 중심-우측 위치에 대해 입력 행렬(10)은 입력 행 B가 출력 행 A 내로 공급되도록 출력 행렬(12)에 대해 1 행 위로 시프트된다.
따라서, 출력 행렬의 어느 행이 입력 행렬의 특정 행에 기초하여 업데이트되는지가 조정될 수 있도록, 출력들에 대한 입력들의 가변 위치 시프트를 수행하고, 선택될 수 있는 다수의 상이한 대안적인 시프트 양들을 지원하는 회로부를 제공하는 것에 의해, 이것은 메모리로부터 로딩된 행렬 데이터의 블록이 다수의 상이한 커널 위치들에 대한 1x1 컨볼루션들에 대해 재사용되는 것을 가능하게 한다는 것이 관찰된다. 이것은 입력 행들 A-P를 로딩하기 위한 로드들과 연관된 메모리 대역폭이 다수의 상이한 행렬 처리 연산들에 걸쳐 분할 상환될 수 있다는 것을 의미하며, 이는 성능을 크게 개선한다. 이러한 위치 시프팅이 사용되는 경우, 랩어라운드 문제를 다루기 위한 마스킹된 행들의 위치들이 커널 위치마다 다르기 때문에, 레지스터들 또는 행렬 전치 박스로부터 이전에 로딩된 피연산자들을 판독하는 포인트에서 마스킹이 필요할 것이다.
행렬 처리를 지원하는 데이터 처리 장치
도 9는 데이터 처리 장치(20)의 예를 개략적으로 예시한다. 데이터 처리 장치는 다수의 파이프라인 스테이지를 포함하는 처리 파이프라인(24)을 갖는다. 이 예에서, 파이프라인 스테이지들은 명령어 캐시(28)로부터 명령어들을 페치하기 위한 페치 스테이지(26); 파이프라인의 나머지 스테이지들에 의해 처리될 마이크로 연산들을 생성하기 위해 페치된 프로그램 명령어들을 디코딩하기 위한 디코드 스테이지(30); 마이크로 연산들을 위해 요구되는 피연산자들이 레지스터 파일(34)에서 이용 가능한지를 체크하고, 일단 주어진 마이크로 연산을 위한 요구되는 피연산자들이 이용 가능하면 실행을 위한 마이크로 연산들을 발행하기 위한 발행 스테이지(32); 레지스터 파일(34)로부터 판독된 피연산자들을 처리하여 결과 값들을 생성함으로써, 마이크로 연산들에 대응하는 데이터 처리 연산들을 실행하기 위한 실행 스테이지(36); 및 처리의 결과들을 레지스터 파일(34)에 후기입하기 위한 후기입 스테이지(38)를 포함한다. 이것은 단지 가능한 파이프라인 아키텍처의 일례일 뿐이고, 다른 시스템들은 추가적인 스테이지들 또는 스테이지들의 상이한 구성을 가질 수 있다는 것이 인식될 것이다. 예를 들어, 비순차적 프로세서에서, 프로그램 명령어들 또는 마이크로 연산들에 의해 지정된 아키텍처 레지스터들을 레지스터 파일(34)에서 물리적 레지스터들을 식별하는 물리적 레지스터 지정자들에 매핑하기 위한 레지스터 재명명 스테이지가 포함될 수 있다.
실행 스테이지(36)는 상이한 부류들의 처리 연산을 실행하기 위한 다수의 처리 유닛을 포함한다. 예를 들어, 실행 유닛들은 레지스터들(34)로부터 판독된 스칼라 피연산자들에 대해 산술 또는 논리 연산들을 수행하기 위한 스칼라 산술/로직 유닛(ALU)(40); 부동 소수점 값들에 대해 연산들을 수행하기 위한 부동 소수점 유닛(42); 분기 연산들의 결과를 평가하고 그에 맞춰 현재 실행 포인트를 나타내는 프로그램 카운터를 조정하기 위한 분기 유닛(44); (아래에서 더 상세히 논의될) 행렬 처리를 위한 행렬 처리 유닛(46); 및 메모리 시스템(28, 50, 52, 54) 내의 데이터에 액세스하기 위해 로드/저장 연산들을 수행하기 위한 로드/저장 유닛(48)을 포함할 수 있다.
이 예에서, 메모리 시스템은 레벨 1 데이터 캐시(50), 레벨 1 명령어 캐시(28), 공유 레벨 2 캐시(52) 및 메인 시스템 메모리(54)를 포함한다. 이것은 가능한 메모리 계층 구조의 일례일 뿐이며, 캐시들의 다른 배열들이 제공될 수 있다는 것이 인식될 것이다. 실행 스테이지(36)에 도시된 특정 유형의 처리 유닛(40 내지 48)은 일례일 뿐이며, 다른 구현들은 상이한 세트의 처리 유닛들을 가질 수 있거나, 동일 유형의 다수의 마이크로 연산이 병렬로 핸들링될 수 있도록 동일 유형의 처리 유닛의 다수의 인스턴스를 포함할 수 있다. 도 1은 가능한 프로세서 파이프라인 아키텍처의 몇몇 컴포넌트들의 단순화된 표현일 뿐이며, 프로세서는 간결함을 위해 예시되지 않은 많은 다른 요소를 포함할 수 있다는 것이 인식될 것이다.
몇몇 구현들에서, 데이터 처리 장치(20)는 도 9의 CPU들(중앙 처리 유닛들, 또는 프로세서 코어들)(60) 중 하나에 대해 도시된 것과 유사한 처리 파이프라인(24)을 각각 갖는 다수의 CPU(60)를 포함하는 멀티 프로세서 장치일 수 있다. 또한, 장치(20)는 적어도 하나의 그래픽 처리 유닛(GPU)(62), 및/또는 서로 그리고 메모리(54)에 액세스하는 데 사용되는 인터커넥트(66)를 통해 CPU들과 통신할 수 있는 다른 마스터 디바이스들(64)을 포함할 수 있다.
행렬 처리 연산들을 지원하기 위한 하나의 접근법은 주어진 행렬 처리 연산의 개별 곱셈들을 주어진 CPU(60)의 처리 파이프라인(24) 상에서 처리될 수 있는 별개의 정수 또는 벡터 명령어들로 분해하는 것일 수 있다. 그러나, 이것은 비교적 느릴 수 있다.
행렬 처리를 가속화하기 위한 다른 접근법은, 인터커넥트(66)에 접속된 디바이스들(64) 중 하나로서, 행렬 연산들을 핸들링하도록 설계된 전용 하드웨어를 갖는 하드웨어 가속기를 제공하는 것일 수 있다. 그러한 하드웨어 가속기와 상호작용하기 위해, CPU(24)는, 하드웨어 가속기에 의해 메모리로부터 판독될 행렬 피연산자들을 정의하고 피연산자들에 적용될 처리 연산들을 정의하는 구성 데이터를 하드웨어 가속기에 기입하기 위해, 로드/저장 유닛(48)을 사용하여 로드/저장 명령어들을 실행할 것이다. 이어서 CPU는 하드웨어 가속기 내의 레지스터들에 매핑되는 어드레스를 지정하는 로드 명령어를 사용하여 다시 하드웨어 가속기로부터 행렬 처리의 결과들을 판독할 수 있다. 이러한 접근법은 파이프라인 내의 정수 연산들을 사용하는 것보다 더 빠를 수 있지만, 그럼에도 불구하고 범용 프로세서(60)와 하드웨어 가속기(64) 간에 정보를 전송하기 위해 로드/저장 메커니즘을 사용하는 것과 연관된 오버헤드가 있을 수 있고, 또한 하드웨어 가속기 접근법은 동일 처리 시스템 상에서 실행되는 상이한 가상 기계들이 하드웨어 가속기에 대한 액세스를 공유할 필요가 있을 때 난제들을 야기할 수 있다. 따라서, 이러한 접근법은 다수의 가상 기계들을 갖는 가상화된 구현에서 잘 스케일링되지 않을 수 있다.
따라서, 도 9에 도시된 바와 같이, (ALU(40) 또는 부동 소수점 유닛(42)을 사용하여 정규 정수 또는 부동 소수점 산술 연산들을 제어하는 것과 유사하게) 파이프라인의 디코드 스테이지(30)에 의해 디코딩되는 행렬 산술 프로그램 명령어들에 응답하여 행렬 처리를 수행하도록 제어될 수 있는 주어진 CPU(60)의 정규 처리 파이프라인(24) 내의 행렬 처리 회로부(46)를 제공하는 것이 가능하다. 이것은 CPU(60)와 하드웨어 가속기 간에 데이터를 역방향으로 그리고 순방향으로 전송할 필요를 회피하고, 다수의 상이한 가상 기계들이 행렬 연산들을 수행할 수 있게 하는 것을 훨씬 더 간단하게 만든다.
도 9는 여러 CPU들(60)을 갖는 멀티 프로세서 장치(20)를 도시하지만, 이것은 필수적인 것은 아니며, 행렬 처리 회로부(46)는 또한 단일 코어 시스템으로 구현될 수 있다.
도 10은 행렬 처리 회로부(46)의 부분 및 행렬 처리를 지원하기 위한 관련 레지스터들을 더 상세히 도시한다. 행렬 처리 회로부(46)는 입력 피연산자 레지스터들(70)의 세트들, 출력 행렬 레지스터들(72)의 세트들, 및 행렬 전치 회로부(74)(이하에서, 행렬 전치 박스로 지칭됨)를 포함하는 피연산자 저장 회로부를 포함할 수 있다. 또한, 행렬 처리 회로부는 메모리 내의 행렬 구조들로부터 피연산자 저장 회로부(70, 74)로의 데이터의 로딩을 핸들링하기 위한 행렬 로드 회로부(80), 행렬 전치 박스(74)와 입력 피연산자 레지스터들(70) 사이에서 피연산자 데이터를 이동시키기 위한 피연산자 이동 회로부(82), 및 출력 행렬 레지스터들(72)에 저장되는 2차원 결과 행렬들을 생성하기 위해 입력 피연산자 레지스터들(70)에 저장된 입력 피연산자들에 대해 행렬 처리 연산들 자체를 수행하기 위한 행렬 처리 로직 회로부(84)를 포함한다.
행렬 전치 박스(74)는, 각각이 주어진 피연산자 (입력) 행렬의 상이한 행렬 요소를 저장하기 위한 다수의 저장 요소들(88)을 포함한다. 저장 요소들(88)은 그들이 행 그룹(90)으로서 - 여기서 입력 행렬의 동일한 행에 대응하는 저장 요소들(88) 모두가 판독 가능함/기입 가능함 -, 또는 열 그룹(92)으로서 - 여기서 입력 행렬의 동일한 열에 대응하는 저장 요소들(88) 모두가 판독 가능함/기입 가능함 - 액세스 가능하도록 행들 및 열들로 논리적으로 배열된다. 집적 회로 상의 저장 요소들(88)의 물리적 배열들은 행들 및 열들로의 논리적 배열을 따를 필요는 없으며, 임의의 물리적 배열을 취할 수 있다. 행 그룹들(90) 및 열 그룹들(92) 내의 요소들(88)을 판독하거나 기입하는 능력은, 주어진 행 또는 주어진 열에 대응하는 관련 요소들이, 칩 내의 그들의 물리적 위치에 관계없이, 판독될 수 있도록 판독/기입 포트들 및 멀티플렉싱 회로부를 제공함으로써 대신 제공된다.
이것은, 메모리 내의 행렬 데이터 구조로부터 데이터를 로딩할 때, 행렬 로드 회로부(80)가 어드레싱 정보(94)에 기초하여 선택된 메모리 내의 행렬 구조의 부분으로부터의 데이터를 행렬 전치 박스(74)의 개별 행 그룹(90)에 또는 개별 열 그룹(92)에 로딩할지를 (행/열 방향 선택 파라미터(89)에 응답하여) 선택할 수 있다는 것을 의미한다. 행렬 로드 회로부(80)를 제어하기 위해 명령어 디코더(30)에 의해 디코딩된 로드 명령어(98)가 어느 특정 행 또는 열이 로딩될지를 식별하는 행/열 ID(99)를 지정할 수 있다. 명령어는 행/열 ID(99)를 즉시 파라미터로서 직접적으로, 또는 행/열 ID(99)를 포함하는 레지스터를 지정함으로써 간접적으로 지정할 수 있다.
행/열 선택 파라미터(89)는, 행렬 전치 박스(74)의 행 그룹(90)이 또는 열 그룹(92)이 메모리로부터의 데이터로 로딩되는지를 선택하는 명령어 인코딩 내의 필드를 사용하여, 로드 명령어(98)에 명시적으로 인코딩될 수 있다. 대안적으로, 행/열 방향 선택 파라미터는 암시적으로 인코딩될 수 있다. 예를 들어, 행렬 로드 명령어들(98)이 행렬 전치 박스(74)의 행들이 로딩되어야 하는 것을 또는 열들이 로딩되어야 하는 것을 현재 선택해야 하는지를 지정하는, 제어 레지스터에 저장된 제어 파라미터가 있을 수 있다. 제어 레지스터 내의 제어 파라미터는 행/열 방향 전환 명령어가 실행될 때 상태들을 전환할 수 있다. 이것은 모든 행렬 로드 명령어가 명시적인 행/열 방향 선택 파라미터를 지정할 필요성을 회피한다. 또한, 명령어 인코딩에서 지정된 파라미터 및 제어 레지스터에 저장된 파라미터 둘 모두를, 제어 레지스터 비트와 행/열 방향들 중 어느 것이 사용되는지를 선택하는 명령어 인코딩 내의 행/열 선택 비트의 조합과 함께, 사용하는 것이 가능하다. 예를 들어, 제어 레지스터 비트는 행들/열들이 선택되는지를 표시할 수 있지만, 명령어 인코딩 내의 비트는 제어 레지스터 내의 비트가 반전되는지 여부를 선택할 수 있으며, 예를 들어 다음과 같다:
Figure pct00002
물론, 다른 인코딩들이 대신 사용될 수 있다 - 이것은 단지 하나의 예일 뿐이다.
또한, 로드 회로부(80)는 마스킹 상태 정보(96, 97)에 응답하여 행렬 전치 박스(74)에 로딩된 값들을 메모리로부터 로딩된 값들 대신에 마스킹 값들로 대체할지 여부를 선택한다. 이 예에서, 마스킹 상태 정보는 제1 마스킹 상태 정보(96) 및 제2 마스킹 상태 정보(97)를 포함한다.
제1 마스킹 상태 정보(96)는 행렬 전치 박스(74)의 대응하는 행/열 그룹이 메모리의 대응하는 값들에 기초하여 업데이트되는 것을 방지하기 위해 소정 행/열 위치의 마스킹을 제어하는 데 사용된다. 행렬 전치 박스(74)에서의 각각의 행/열 위치에 대해, 제1 마스킹 상태 정보(96)는 그 행/열 위치가 마스킹된 행/열 위치인지 또는 마스킹되지 않은 행/열 위치인지를 식별한다. 즉, 행/열 선택 파라미터(들)(89)가 요소들이 행들에 기입되어야 한다는 것을 표시하는 경우, 제1 마스킹 상태 정보의 마스킹 표시들은 상이한 행 위치들에 대응한다. 행/열 선택 파라미터(들)(89)가 요소들이 열들로 행렬 전치 박스(74)에 기입되어야 한다는 것을 표시하는 경우, 제1 마스킹 상태 정보의 마스킹 표시들은 상이한 열 위치들에 대응한다.
제1 마스킹 상태 정보(96)가 로딩될 타겟 행/열이 마스킹되지 않은 행/열임을 지정하는 경우, 제2 마스킹 상태 정보(98)는 타겟 행/열 내의 어느 개별 요소 위치들이 마스킹되는지를 식별하는 데 사용될 수 있고, 행렬 로드 회로부(80)는 메모리에 저장된 행렬 구조로부터 대응하는 데이터를 획득하고 타겟 행/열의 마스킹되지 않은 요소들을 행렬 전치 박스(74)의 선택된 행/열 그룹의 대응하는 요소들(88)에 기입한다(이때 선택된 행/열 그룹 내의 임의의 마스킹된 요소들은 대신에 마스킹 값으로 설정됨). 따라서, 제2 마스킹 상태 정보(98)는 마스킹 표시들의 세트를 제공할 수 있으며, 여기서 각각의 마스킹 표시는 제1 마스킹 상태 정보의 마스킹 표시들과 연관된 위치들에 반대 차원으로 확장되는 상이한 위치에 대응한다. 즉, 행/열 선택 파라미터(들)(89)가 요소들이 행들에 기입되어야 한다는 것을 표시하는 경우, 제2 마스킹 상태 정보의 마스킹 표시들은 상이한 열 위치들에 대응한다. 행/열 선택 파라미터(들)(89)가 요소들이 열들로 행렬 전치 박스(74)에 기입되어야 한다는 것을 표시하는 경우, 제1 마스킹 상태 정보의 마스킹 표시들은 상이한 행 위치들에 대응한다.
제1 및 제2 마스킹 상태 정보(96, 97)는 함께 2차원 마스킹 상태 정보를 나타내는데, 그 이유는 그들이 행렬 전치 박스(74)에 로딩될 행렬의 2개의 차원에 걸친 마스킹된 요소들의 위치들을 표시하기 때문이다. 그러나, 각각의 개별 명령어는 단일 타겟 행/열에 대응하는 제1 마스킹 상태 정보의 부분만을 사용한다(다른 행들/열들에 관한 제1 마스킹 상태 정보의 부분들은 무시된다). 그럼에도 불구하고, 제1 및 제2 마스킹 상태 정보(96, 97)는 함께 2D 행렬 전치 박스 전체에 걸친 마스킹된 위치들을 정의할 수 있으며, 따라서 하나의 행/열의 로딩과 다음 행/열의 로딩 사이에서 마스킹 상태 데이터를 변경하는 것이 필요하지 않다.
반면에, 선택된 행/열 위치가 제1 마스킹 상태 정보(96)에 의해 마스킹된 행/열 위치로 표시되는 경우, 메모리로부터 로딩된 데이터를 공급하는 대신에, 선택된 행/열 내의 행렬 요소들(88) 각각에 마스킹 값이 기입된다. 여기서, 선택된 행/열 내의 요소들 각각은 선택된 행/열 내의 모든 요소들을 마스킹된 것으로 식별하거나 선택된 행/열 내의 모든 행렬 요소들(88)을 마스킹되지 않은 것으로 식별하는 제1 마스킹 상태 데이터(96)의 동일한 항목을 공유할 수 있다. 로드 명령어가 마스킹된 행/열을 지정할 때, 마스킹 상태 정보(96)에 응답하여, 행렬 로드 회로부(80)는 대신 마스킹된 행/열 내의 요소들 각각에 마스킹 값을 기입한다.
마스킹 값이 제1 마스킹 상태 데이터(96)에 기초한 전체 행의 마스킹으로 인해 또는 제2 마스킹 상태 데이터(97)에 기초한 개별 요소의 마스킹으로 인해 행렬 전치 박스(74)의 특정 요소(88)에 공급되는지에 관계없이, 마스킹 값은 0과 같은 미리 결정된 값일 수 있거나, 레지스터에 또는 로드 명령어에 의해 명시적으로 지정된 파라미터 내에 저장될 수 있는 마스킹 선택 정보에 기초하여 선택 가능한 다수의 대안적인 마스킹 값들 중 하나일 수 있다.
어드레싱 정보(94)는 일반적인 정수 피연산자들에 대해 또한 사용되는 CPU의 범용 레지스터들(34) 내에 저장될 수 있거나, 몇몇 예들에서 메모리로부터 로딩될 행렬 구조의 부분의 식별에 고유한 정보를 저장하는 몇몇 전용 행렬 어드레싱 정보 레지스터들 내에 저장될 수 있다.
도 11 내지 도 13은 마스킹 상태 정보 및 어드레싱 정보(94)가 인코딩될 수 있는 방식들의 몇몇 예들을 도시한다. 도 11의 예에서, 어드레싱 정보(94)는 정수 피연산자들에 대해 또한 사용되는 범용 레지스터들(34)에서 지정된다. 이 경우에, 행렬 로드 명령어(98)를 실행하기 전에, 이전의 명령어들은 참조된 범용 레지스터들이 행렬의 요구되는 행 또는 열의 어드레스를 표현하기 위한 적절한 어드레스 피연산자들을 포함하는 것을 보장할 필요가 있을 수 있고, 입력 행렬의 상이한 행들을 타겟으로 하는 연속적인 로드 명령어들(98)을 실행하는 것 사이에서, 이러한 어드레스 피연산자들은 다음 행 또는 열을 가리키도록 업데이트될 필요가 있을 것이다.
또한 도 11의 예에서, 제1 마스킹 상태 정보(마스크1)(96)는 행렬 전치 박스(74) 내의 주어진 행/열 위치에 각각 대응하는 다수의 비트 플래그 표시자들(100)을 포함하는 비트맵으로서 표현된다. 로드 명령어(98)에 의해 지정된 행/열 번호(99)는 마스킹 비트맵(96)의 비트 플래그 표시자들(100) 중 어느 것이 판독되는지를 선택하는 데 사용되고, 판독 비트 플래그(100)의 값에 따라, 이것은 그 대응하는 행이 마스킹되어야 하는지 여부를 제어한다(예를 들어, 1의 비트 플래그는 마스킹되지 않은 행/열을 나타낼 수 있고 0의 비트 플래그는 마스킹된 행/열을 나타낼 수 있거나, 그 반대도 마찬가지이다).
유사하게, 제2 마스킹 상태 정보(마스크2)(97)는 열/행 위치(마스크1 비트맵(96) 내의 각각의 비트 플래그 표시자(100)에 의해 표시된 위치들에 반대 차원)에 각각 대응하는 다수의 비트 플래그 표시자들(101)을 포함하는 비트맵으로서 표현되며, 따라서 마스크2는 전술된 바와 같이 로드 명령어(98)에 의해 지정된 행/열 번호(99)를 갖는 타겟 행/열 내의 개개의 마스킹된 요소들의 위치들을 표시한다.
제1/제2 마스킹 상태 정보(96, 97)를 저장하는 레지스터들은 행렬 피연산자들/처리의 마스킹을 위한 마스킹 상태 정보를 저장하기 위한(그리고 어떠한 다른 목적에도 기여하지 않는) 전용 레지스터들일 수 있거나, 행렬 처리 관련 명령어들 이외의 명령어들을 처리할 때 동일한 레지스터들이 또한 다른 정보에 대해 사용될 수 있도록 이중 기능을 제공할 수 있다. 예를 들어, 마스킹 상태 정보(96, 97)는 벡터 명령어가 실행될 때 벡터 처리의 레인들의 마스킹을 제어하는 벡터 프레디케이트들을 저장하는 데 또한 사용될 수 있는, 프레디케이트 레지스터들로부터 판독될 수 있다.
도 12는 다시 제1/제2 마스킹 상태 정보(96, 97)가 도 11에서와 동일하게 비트맵으로서 표현되는 다른 예를 도시한다. 그러나, 이 경우에 행렬 처리 회로부는, 적어도 베이스 어드레스(104) 및 스트라이드 값(106)을 지정하고, 선택적으로 인트라-행/열 오프셋(하위 부분 선택 정보)(108)을 지정하는 행렬 어드레싱 레지스터들(102)의 세트에 대한 액세스를 갖는다. 이러한 접근법에서, 어드레싱 정보 레지스터들(102)은 주어진 입력 행렬의 행들 또는 열들 모두를 로딩하기 위해 로드들의 그룹을 수행하기 전에 설정될 수 있고, 동일한 입력 행렬 내의 상이한 행들 또는 열들에 대한 개별 로드들 사이에서 어드레싱 정보(102)를 변경할 필요가 없는데, 그 이유는 행렬 로드 회로부(80)가 어드레싱 정보(102) 및 로드 명령어(98)에 의해 지정되는 행/열 선택 번호(99)에 기초하여 개별 행/열의 어드레스를 계산할 수 있기 때문이다. 비교를 위해 도 4에 도시된 메모리 레이아웃을 참조하면, 베이스 어드레스(104)는 처리될 행렬의 부분에 대응하는 메모리의 영역의 시작을 가리키도록 설정될 수 있고, 스트라이드 값(106)은 행렬 데이터 구조의 하나의 행의 시작을 마킹하는 어드레스와 다음 행의 시작을 마킹하는 어드레스(또는 열 우선 레이아웃이 대신 사용되고 있는 경우 열) 사이의 오프셋을 참조하도록 설정될 수 있다. 인트라-행/열 오프셋(108)은 메모리에 저장된 전체 행렬 구조의 하나의 행 내의 개별 부분을 선택하는 데 사용될 수 있으며, 이는 메모리 내의 전체 행렬 구조가 전치 박스(74) 및 행렬 처리 로직(84) 내의 하드웨어에서 지원되는 최대 행/열 길이보다 큰 경우들에서 유용할 수 있다. 이것은 메모리 내의 큰 데이터 구조의 처리가 하드웨어에 의해 다수의 패스들에서 처리될 수 있는 더 작은 청크들로 분해될 수 있게 한다. 따라서, 인트라-행/열 오프셋은 메모리에 저장된 '행' 내의 개별 부분을 선택할 수 있다. 인트라-행/열 오프셋 값(108)을 지원하는 것은 필수적인 것은 아닌데, 그 이유는 주어진 행의 하나의 청크를 처리하는 것과 다음 청크를 처리하는 것 사이에서, 인트라-행/열 오프셋 값(108)을 업데이트하는 대신에, 베이스 어드레스(104)가 다음 청크의 위치를 가리키도록 업데이트될 수 있는 대안이 있을 것이기 때문이다. 또한, 오프셋 값(108)은 대신에 로드 명령어에 의해 소스 레지스터로서 참조되는 범용 레지스터 내에 제공될 수 있다.
이러한 접근법에서, 개별 로드 명령어(98)를 처리할 때, 행렬 로드 회로부(80)는, 베이스 어드레스를 명령어에 의해 지정된, 선택적으로 필요한 경우 인트라-행/열 오프셋 값(108)에 의해 오프셋된 행/열 번호(99)와 스트라이드 값(106)의 곱에 더하는 것에 의해, 행렬 전치 박스(74)의 선택된 행 또는 열에 로딩될 데이터의 부분의 어드레스를 계산할 수 있다.
도 13은 어드레싱 정보(94) 및 마스킹 상태 정보(96, 97)를 나타내는 다른 예를 도시한다. 이 예에서, 어드레싱 정보(94)는 다시 베이스 어드레스(104)를 포함하지만, 이번에는 어드레싱 정보는 또한 오프셋 구조 베이스 어드레스(112)에 의해 식별된 위치에서 메모리에 저장되는 오프셋 데이터 구조(110)를 포함한다. 여기서, 메모리에 저장된 오프셋 데이터 구조(110)는 어드레싱 정보(94)의 일부 및 또한 제1 마스킹 상태 정보(96) 둘 모두로서 기능한다. 제2 마스킹 상태 정보(97)가 도 11 및 도 12의 예와 유사하게 별개의 마스크 레지스터 "마스크2"로서 여전히 제공될 수 있다.
오프셋 데이터 구조(110)는 오프셋 값들의 어레이를 정의하며, 여기서 각각의 오프셋(114)은 개별 행렬 로드 명령어(98)에 의해 선택될 수 있는 특정 행/열 번호에 대응한다. 로드 명령어가 주어진 행/열 번호(예를 들어, 도 10에 도시된 예에서와 같이 열 2)를 지정하는 경우, 그 열에 대한 대응하는 오프셋 값(114-2)이 선택될 것이고, 메모리에 저장된 행렬 구조 내의 데이터의 대응하는 행/열의 어드레스는 그 선택된 오프셋 값을 베이스 어드레스 레지스터(104)에 저장된 베이스 어드레스에 더하는 것에 의해 도출될 수 있다. 선택된 행/열이 마스킹되지 않은 행 또는 열로서 표시되는 경우들의 대부분에서, 로드는 정상적으로 진행한다.
그러나, 소정의 오프셋 값들은 그들이 유효 오프셋들에 대해 사용될 수 없지만 대신에 마스킹된 행/열의 위치를 표시하도록 예약된다. 예를 들어, 예약된 오프셋 값은 -1(즉, 1의 최상위 비트 및 보수 표현을 위해 0으로 설정된 모든 다른 비트들을 갖는 이진 값)일 수 있다. 따라서, 개별 로드 명령어에 대한 어드레스를 계산할 때, 선택된 행/열 번호에 대한 선택된 오프셋 값(114-2)이 예약된 값을 갖는 것으로 결정되는 경우, 이것은 마스킹된 행 또는 열 위치로서 해석되고, 그에 따라 메모리에 저장된 행렬 데이터 구조의 부분으로부터 실제 로드를 수행하는 대신에, 대신 행렬 전치 박스(74)의 관련 행 또는 열 그룹(90, 92)이 마스킹 값, 예를 들어 0을 갖는 그 행 내의 요소들(88) 각각으로 채워진다.
따라서, 이러한 접근법에서, 입력 행렬의 각자의 행들 또는 열들이 그로부터 행렬 전치 박스 내에 로딩될 메모리 내의 위치들을 정의하는 오프셋들은 또한 마스킹 상태 정보로서의 역할을 하며, 이는 마스킹 상태 값들을 위한 별개의 레지스터에 대한 필요성을 회피한다.
어드레싱 정보의 일부로서 오프셋 값들(114)의 어레이(110)를 사용하는 것의 이점은, 메모리 내의 행렬 데이터의 각자의 행들/열들의 어드레스들을 표시하는 절대 어드레스들의 테이블을 저장하는 대안적인 접근법에 비해, 이것은 훨씬 더 적은 저장 용량을 요구한다는 것이며, 이는 오프셋들이 공통 베이스 어드레스에 대해 표시될 수 있고 따라서 더 적은 비트를 사용하여 표현될 수 있기 때문이다. 그럼에도 불구하고, 다른 구현들은 도 13의 예에서 베이스 레지스터(104)를 생략할 수 있으며, 따라서 각각의 오프셋은 사실상 0에 대한 오프셋이지만, 이것은 각각의 오프셋 값(114)에 대해 더 많은 비트를 요구할 것이다.
또한, 마스킹된 행/열 위치들을 나타내기 위해 오프셋 필드(110)의 특별한 예약된 값을 사용하는 것은, 대신에 메모리 자체에 패딩 값을 저장하고 패딩 값이 저장되는 메모리 내의 실제 위치를 가리키는 오프셋 값을 마스킹된 행/열들에 대응하는 오프셋 어레이(110)의 필드에서 지정함으로써 마스킹된 행들/열들을 나타내는 것에 의해 패딩이 지원되는 경우보다 더 효율적일 수 있다. 특별한 예약된 값 접근법에서, 패딩 값을 획득하기 위해 메모리에 대한 실제 로드를 수행할 필요가 없는데, 그 이유는 패딩 값은 대신에 예약된 오프셋 값을 검출하는 것에 기초하여 로드 회로부(80)에 의해 온 더 플라이 방식으로 생성될 수 있기 때문이다.
도 13은 오프셋 구조(110)가 오프셋 구조 베이스 어드레스(112)로부터 도출된 어드레스들에서 메모리 시스템에 저장되는 예를 도시하지만, 몇몇 마이크로 아키텍처 설계들은 행렬 로드 회로부(80)에 의한 더 빠른 액세스를 위해 오프셋 구조의 값들을 캐싱하여, 미래에 다시 메모리로부터 그들을 페치할 필요를 회피할 수 있는 하드웨어의 오프셋 캐시(116)를 제공하는 것을 선택할 수 있다. 이것은 종종 적용될 오프셋들의 패턴이 행렬 내의 다수의 상이한 위치들에 대해 동일할 수 있으며, 따라서 동일한 오프셋 구조가 재사용될 수 있기 때문에 그것을 보유하는 것이 효율적이라는 것을 인식한다. 그러나, 다른 구현들은 오프셋 구조(110)를 저장하기 위해 아키텍처적으로 요구되는 오프셋 레지스터들을 제공할 수 있으며, 따라서 오프셋 구조(110)를 위해 메모리에 공간을 할당할 필요가 전혀 없다.
특정한 마스킹 상태 정보(96, 97) 및 어드레싱 정보(94)가 어떻게 표현되는지에 관계없이, 이 기능은 메모리에 저장된 행렬의 요구되는 부분들이 행렬 전치 박스(74) 내에 로딩되는 것을 가능하게 하여, 이전에 설명된 연산들의 1x1 컨볼루션이 행렬의 그 부분에 적용되는 것을 가능하게 한다. 마스킹은 랩어라운드 문제를 다루기 위해 도 7에 도시된 바와 같이 입력의 소정 라인들이 스킵되는 것을 가능하게 한다. 또한, 인트라-행렬의 소정 행들 또는 열들이 마스킹되는 것을 가능하게 함으로써, 이것은 도 2에 도시된 유형의 패딩된 컨볼루션들을 다루기 위해 패딩 값들을 공급하는 데 유용할 수 있다. 또한, 몇몇 경우들에서 2D 컨볼루션 연산은 하드웨어에서 지원되는 최대 폭 또는 높이보다 작은 폭 또는 높이를 갖는 행렬에 적용되고 있을 수 있으며, 따라서 마스킹 상태는 행렬의 끝에서 미사용 행들 또는 열들을 마스킹하는 데 사용될 수 있다.
주어진 피연산자 행렬의 행들 또는 열들을 행렬 전치 박스(74)에 기입하면, 데이터는 피연산자 이동 회로부(82)에 의해 행 또는 열 그룹들에서 판독되고 행렬 처리를 위해 준비된 입력 피연산자 레지스터(70)에 전송될 수 있다. 피연산자 이동 회로부(82)는 데이터가 행렬 로드 회로부(80)에 의해 로딩된 방향과 동일한 행/열 방향으로 행렬 전치 박스(74)로부터 데이터를 판독하는 것으로 제한되지 않는다. 실제로, 입력 피연산자들에 대한 메모리에 저장된 데이터 구조가 출력 데이터 구조와 비교하여 상이한 행/열 우선 포맷으로 저장되는 경우, 피연산자 이동 회로부(82)가 로딩 시에 사용된 것과 반대의 행/열 방향으로 데이터를 판독하는 것이 유용할 수 있다. 행렬들이 행렬 전치 박스(74)에 로딩되고 처리를 위해 판독될 때의 행렬들의 이러한 온 더 플라이 전치는 메모리 내의 데이터 레이아웃들을 리매핑하는 것으로부터 가능할 것보다 훨씬 더 효율적으로 하드웨어에서 수행될 수 있다. 따라서, 이것은 잠재적으로 상이한 메모리 레이아웃들의 입력 행렬들을 다루는 것에 관한 성능을 크게 개선할 수 있다.
메모리에 저장된 행렬 구조에 대한 임의의 주어진 메모리 레이아웃에 대해, 그 동일한 레이아웃을 열별로 또는 행별로 행렬 전치 박스(74)에 로딩하는 것이 가능하며, 따라서 행/열 선택 파라미터(89)가 행 방향을 지정하는지 또는 열 방향을 지정하는지는 메모리 내의 기반 행렬 구조에서 사용되는 실제 레이아웃과는 완전히 무관하게 선택될 수 있다는 점에 유의한다. 이것은, 행렬 전치 박스를 사용하여 행렬의 방향을 전치하기 위해, 데이터가 열별로 로딩되고 행별로 판독되는지 또는 그것이 행별로 로딩되고 열별로 판독되는지는, 이들 둘 모두가 동일한 결과들을 달성하므로, 무관하기 때문이다. 실제로, 그러한 온 더 플라이 전치들을 수행할 때, 처리를 위한 행렬의 앞선 행들 또는 열들의 판독 및 행렬의 나중 행들 또는 열들의 로딩의 더 나은 파이프라이닝을 달성하기 위해, 행렬 데이터를 행별로 로딩하는 것과 그들을 열별로 로딩하는 것 사이에서 교대하는 것이 유용할 수 있다.
예를 들어, 메모리 내의 행렬 구조의 일련의 행들이 행렬 전치 박스(74)의 행들 0 내지 7 내에 로딩되지만, 이어서 그들이 그와 결합되고 있는 출력 데이터 구조가 반대 메모리 레이아웃을 갖기 때문에 열별로 판독되는 일련의 연산들을 상상해보자. 이 경우에, 최종 행 7을 행렬 전치 박스 내에 로딩하면, 이어서 피연산자 이동 회로부(82)는 열 0으로 시작하여 열 7로 끝내서 열들을 하나씩 판독하기 시작할 수 있다. 그러나, 열 0에 대한 데이터가 판독되자마자, 이어서 피연산자 이동 회로부(82)가 행렬 처리 객체(84)에 의한 처리를 위해 연속적인 열들 1-7을 계속 판독하는 동안, 행렬 로드 회로부(80)는 처리될 행렬의 다음 청크에 대해 행렬 구조의 추가 행들을 메모리로부터 로딩하기 시작할 수 있다. 열들 1-7이 여전히 행렬 처리 로직(84)에 대해 필요할 수 있기 때문에, 그러므로 행렬 열의 그러한 추가 행들을 각자의 열들 0, 1, 2 등에 로딩하기 시작하는 것이 더 효율적인데, 왜냐하면 그러한 열들은 처리를 위해 피연산자 이동 회로부가 그들을 판독하는 것으로 인해 연속적으로 자유롭게 되기 때문이다. 따라서, 행렬들의 나중 부분들에 대한 로드들은 앞선 열 위치들 0, 1에서 행렬 전치 박스(74)의 각자의 열들 내에 로딩될 수 있는 반면, 행렬의 이전 청크와 연관된 나중 열들에 대한 판독은 여전히 진행 중이다. 예를 들어, 일단 행렬이 소정 열, 이를테면 열 2에서 데이터를 판독한 피연산자 이동 회로부(82)에 의해 이동하면, 이어서 다음 패스를 위해 그 열 내로의 로드가 시작될 수 있고 따라서 이것은 파이프라이닝에 의한 몇몇 성능 개선들을 가능하게 한다. 이어서, 일단 열들 모두가 처리될 메모리 내의 행렬의 다음 청크에 대해 로딩되면, 피연산자 이동 회로부(82)에 의해 수행되는 피연산자 이동 연산들의 다음 세트는 로드들이 피연산자 이동 회로부(82)에 의해 방금 판독된 행렬 전치 박스의 행 그룹들(90)을 채우기 위해 바로 뒤에 진행되는 동안 행별로 수행될 수 있다. 따라서, (온 더 플라이 전치가 사용될 때), 어느 방향이 로드들의 세트에 대해 사용되는지를 교대함으로써, 이것은 동일한 행/열 방향이 행렬 전체에 걸쳐 사용된 경우보다 더 양호한 성능을 제공할 수 있다는 것을 알 수 있다.
대안적으로, (예를 들어, 출력 데이터 구조가 입력 데이터 구조와 동일한 레이아웃을 메모리에서 갖기 때문에) 행렬 레이아웃의 온 더 플라이 전치에 대한 필요가 없는 특정 세트의 연산들이 수행되고 있는 경우, 행/열 방향들 중 고정된 방향이 행렬 로드 연산들 및 피연산자 이동 연산들 둘 모두에 대해 선택될 수 있다. 그럼에도 불구하고, 로드들이 다른 행들/열들로 수행되고 있는 동안 처리를 위해 피연산자들이 소정 행들/열들로부터 판독될 수 있도록 파이프라이닝이 여전히 있을 수 있다.
도 10의 예에서, 행렬 처리 로직(84)의 하드웨어 복잡도 및 개별 명령어와 연관된 레이턴시를 제한하기 위해, 행렬 처리 로직(84)은 하나의 명령어에서의 2개의 2차원 행렬 피연산자에 대해 완전한 행렬 곱셈 연산을 수행하는 것을 지원하지 않지만, 대신에 그러한 2D 행렬 곱셈 연산은 1차원 벡터 피연산자들의 쌍에 대해 각각 수행되는 다수의 별개의 외적-및-누산 연산들로 분해될 수 있다. 도 7의 예는 외적 연산들을 설명하는 데 사용된다. 도 7의 예에서, 입력 행렬(10) 및 커널 행렬(11)로부터 출력 행렬(12)을 생성하기 위해, 도 7의 예는 11x4 출력 행렬(12)을 제공하기 위해 11x4 입력 행렬(10)과 4x4 커널 행렬(11)의 행렬 곱셈을 요구한다. 전체 행렬 곱셈 연산은 출력 행렬(12)의 주어진 출력 요소(예를 들어, 도 7에서 위치 F'에 마킹된 요소(200))가 입력 행렬(10)의 대응하는 행(202) 내의 각자의 요소들과 커널 행렬(11)의 대응하는 열(204) 내의 대응하는 요소들의 쌍별 곱들의 합에 기초하여 생성되어야 하는 것을 요구할 것이다. 행렬 곱셈이 더 큰 2D 컨볼루션의 등가물을 생성하기 위해 누산되고 있는 일련의 1x1 컨볼루션들의 일부로서 수행되고 있기 때문에, 행(202)과 열(204)의 쌍별 곱들을 더한 결과는 요소 F'에 대한 출력 행렬(12)의 이전 값에 더해져, 요소 F'에 대한 업데이트된 값을 생성한다.
그러나, 그러한 행렬 곱셈 연산은, 출력 행렬(12)의 각각의 출력 요소 위치에 대해, 4개의 별개의 곱이 계산되는 것, 및 이어서 5개의 항(4개의 곱 및 출력 요소의 이전 값)을 더하는 것을 요구할 것이다. 이것은 구현이 느리고 다른 연산들의 파이프라인 타이밍들과 맞추기 어려울 수 있다.
대조적으로, 외적 연산은 제1 벡터 피연산자 u = (u1, u2, …, um) 및 제2 벡터 피연산자 v = (v1, v2, …, vn) - 이들 각각은 요소들의 1차원 어레이를 포함함 - 을 취하고 이들을 결합하여 2차원 결과 행렬 W를 형성하며, 여기서
Figure pct00003
이다. 따라서, 결과 행렬의 각각의 요소는 입력 벡터 피연산자의 단일 요소와 제2 벡터 피연산자의 단일 요소의 단일 곱으로부터 도출된다.
외적-및-누산 연산에 대해, 업데이트된 결과 행렬 W'의 각각의 요소는 또한 결과 행렬 W의 이전 값에서의 대응하는 요소에 의존한다:
Figure pct00004
따라서, 외적-및-누산 연산에 대해서도, 각각의 요소는 하나의 추가적인 항에 더해지는 단일 곱의 계산만을 요구한다. 이것은 더 낮은 하드웨어 비용으로 훨씬 더 빠르게 수행될 수 있다.
전체 행렬 곱셈 연산은 개별 외적 연산들로 분해될 수 있다. 예를 들어, 11x4 입력 행렬의 하나의 열에 대응하는 도 7에 도시된 바와 같은 벡터 피연산자(206) 및 커널 행렬(11)의 하나의 행에 대응하는 제2 벡터 피연산자(208)를 취할 때, 열 및 행 위치들의 각각의 쌍에 대해 제1 벡터 피연산자(206)의 각각의 요소를 제2 벡터 피연산자(208)의 대응하는 요소들과 곱하는 것은 중간 결과들의 2D 어레이를 제공하며, 여기서 예를 들어 도 7에서 식별된 요소(200)는 열(206)에 A로 마킹된 요소와 커널 행렬(11)로부터 추출된 행(208)에서의 좌측 상단 K1 커널 웨이트(wait)의 곱으로부터 기인한다. 입력 행렬(10) 내의 열 위치와 커널 행렬(11) 내의 행 위치의 각자의 조합 각각에 대해 외적-및-누산 연산들의 반복들을 수행함으로써, 입력 열 및 커널 행의 각각의 조합이 처리된 후에, 결과는 전체 행렬 곱셈 연산이 수행된 경우와 동일할 것이지만, 하드웨어 비용은 더 낮다.
따라서, 행렬 처리 로직(84)에 의해 수행되는 외적-및-누산 연산을 지원하기 위해, 입력 피연산자 레지스터들(70)은 1차원 벡터 피연산자들을 저장하고, 피연산자 이동 회로부(82)는 행렬 전치 박스(74) 내의 입력 행렬의 부분들을 한 번에 한 행씩 또는 한 열씩 판독한다. 따라서, 연산들이 수행되고 있는 기본적인 주어진 피연산자 행렬이 2차원 행렬 구조일지라도, 행렬 처리 연산을 적용하는 포인트에서, 그것은 일련의 1차원 벡터 피연산자들로서 취급되지만, 그럼에도 불구하고 행렬 처리 로직(84)은 한 쌍의 벡터 피연산자들에 외적/누산 연산을 적용한 결과에 대응하는 결과 행렬을 하나의 명령어에서 2차원 행렬 구조로서 생성할 수 있다. 이것은 한 번에 결과 행렬의 단일 행/열만을 각각 생성할 수 있는 개별 벡터 처리 명령어들이 처리된 경우보다 연산이 여전히 더 빠르다는 것을 의미한다.
도 10의 예에서, 행렬 처리 로직(84)에 대한 입력 레지스터들(70)은 제1 벡터 피연산자를 저장하기 위한 2개의 입력 레지스터 A0, A1 및 제2 벡터 피연산자를 저장하기 위한 2개의 입력 레지스터 B0, B1을 각각 포함한다. 또한, 4개의 결과 행렬 레지스터 C0 내지 C3(72)이 제공되며, 이들 각각은 2차원 범위의 결과 행렬을 저장할 수 있다(도 10은 차원 NxN의 정사각형 행렬을 도시하지만, 다른 예들은 결과 행렬들에 대한 상이한 높이/폭을 지원할 수 있다). 몇몇 구현들에서, 행렬 처리 로직은 주어진 결과 행렬 레지스터(72)에 배치될 결과 행렬을 생성하는 동안 입력 레지스터들의 어느 조합이 사용되는지에 관해 하드와이어링될 수 있다. 예를 들어, 결과 행렬 레지스터들 C0 내지 C3은 입력 피연산자들의 쌍들 A0*B0; A0*B1; A1*B0; 및 A1*B1에 각각 기초하여 생성될 수 있다. 이것은 종종 행렬들의 처리를 수행할 때, 하나의 입력 행렬의 행들 및 열들의 동일한 세트 및 제2 입력 행렬의 행들 또는 열들의 대응하는 세트를 상이한 조합들로 처리하는 것이 필요할 수 있다는 것을 인식한다. 예를 들어, 도 7의 1x1 조합 예에서, 입력 행렬(10)의 열(206)은 제1 외적 연산에 대해 커널 행렬(11)의 행(208) 내의 요소들과 곱해질 뿐만 아니라, 후속 외적 연산에 대해 커널 행렬(11)의 다음 행 내의 각자의 요소들과 곱해질 필요가 있을 것이며, 행들의 나머지에 대해서 등등이다. 유사하게, 커널 행들(208)은 입력 행렬 내의 다수의 상이한 열(206)과 곱해질 필요가 있을 수 있다. 한꺼번에 다수의 행 또는 열을 저장하기에 충분한 입력 레지스터 저장소(70)를 제공함으로써, 이어서 피연산자 A에 대한 행들 또는 열들과 피연산자 B에 대한 행들 또는 열들의 상이한 조합들이 단일 세트의 피연산자 로드/이동 연산들로 구현되어 레지스터들(70)을 채울 수 있고, 이어서 피연산자들의 다수의 상이한 조합들에 대한 다수의 상이한 행렬 처리 연산들이 각각의 개별 행렬 처리 연산에 대해 로드/이동을 반복할 필요 없이 그러한 피연산자들에 적용될 수 있다. 따라서, 4개의 출력 행렬 레지스터를 사용하는 도 10에 도시된 접근법은 행렬 로드 명령어마다 처리되는 행렬 처리 명령어들의 수가 증가되는 것을 가능하게 한다. 다른 예들은 추가의 입력/출력 레지스터들(70, 72)을 제공할 수 있지만, 선택된 레지스터들의 정확한 수는 하드웨어 비용과 성능 간의 트레이드-오프일 수 있다.
대안적으로, 다른 접근법들은 단일 벡터 피연산자 쌍에 대한 충분한 입력 피연산자 레지스터 저장소(70)만을 제공할 수 있으며, 이 경우에 그 벡터 레지스터들의 단일 쌍은 곱해지는 각자의 입력 행렬들의 행/열의 각각의 상이한 조합에 대해 새로운 값으로 로딩될 필요가 있을 것이다.
또한, 2개의 피연산자 A, B에 대한 별개의 레지스터 뱅크들을 제공하는 것은 필수적인 것은 아니다. 다른 예에서, 피연산자들 A 및 B 둘 모두는 단일의 결합된 레지스터 파일 내의 각자의 레지스터들로부터 선택될 수 있다.
도 10에 도시된 바와 같이, 개별 행렬 처리 명령어(240)는 주어진 결과 목적지 레지스터(72), 연산에 대한 소스 피연산자들을 제공하는 한 쌍의 입력 벡터 레지스터(70), 및 프레디케이트(마스킹 상태) 정보(242) 및 시프트 선택 정보(244)를 포함하는 제어 정보를 지정할 수 있다. 위에서 설명된 바와 같이, 몇몇 구현들에서, 주어진 연산에 대해 사용될 결과 행렬 레지스터(72)의 선택은 선택된 소스 레지스터들(70)의 조합으로부터 암시적일 수 있고, 따라서 이 경우에 명령어는 별개의 목적지 레지스터 식별자를 지정할 필요가 없을 수 있지만, 목적지들의 더 임의적인 선택이 허용되는 경우, 추가적인 목적지 레지스터 지정자를 제공하는 것이 유용할 수 있다.
도 14는 프레디케이트 정보(242) 및 시프트 선택 정보(244)의 사용을 포함하여, 행렬 처리 로직(84)을 더 상세히 예시한다. 도 14는 피연산자 저장소의 "A" 입력 벡터 레지스터들(70) 중 주어진 하나의 "A" 입력 벡터 레지스터에 저장된 제1 벡터 피연산자(250) 및 "B" 입력 벡터 레지스터들 중 주어진 하나의 "B" 입력 벡터 레지스터에 저장된 제2 벡터 피연산자(252)에 적용되는 벡터 외적 연산을 도시한다. 예를 들어, "A" 레지스터들은 입력 행렬(10)에 대해 사용될 수 있고, B 레지스터들은 위에서 논의된 컨볼루션 예들에서 커널 가중치들(11)에 대해 사용될 수 있다.
행렬 처리 로직(84)은 입력 피연산자들(250) 중 하나의 요소들과, 행렬 처리 명령어(240)에 응답하여 생성되는 출력 행렬(270) 내의 대응하는 요소 위치들 사이에 가변 위치 시프트를 적용하기 위한 위치 시프팅 회로부(260)를 포함한다. 시프트 정보(244)는 행렬 처리 명령어(240) 내의 명시적 파라미터로서 표현될 수 있거나, 제어 레지스터에 저장되는 제어 파라미터에 의해 표현될 수 있다. 시프트 파라미터(244)는 다수의 가변 시프트 양들 중 하나를 지정한다. 선택된 시프트 양에 기초하여, 위치 시프팅 회로부는 제1 벡터 피연산자(250)로부터의 입력 요소들 중 어느 것이 시프트된 입력 피연산자(272) 내의 각각의 요소 위치에 공급되는지를 선택하기 위해 다수의 멀티플렉서들을 활성화한다. 예를 들어, 0의 가변 시프트 양이 선택되는 경우, 입력 벡터(250)의 각각의 요소는 시프트된 입력 벡터(272)에서의 대응하여 위치된 요소로 통과되는 반면, 1의 가변 시프트 양이 선택되는 경우, 시프트된 입력 벡터(272) 내의 주어진 요소 위치에서의 요소는 원래의 입력 벡터(250) 내의 다음의 가장 높은 요소 위치에서의 요소의 값으로 설정된다. 시프트된 입력 벡터(272) 내의 가장 높은 요소 위치에서의 요소들에 대해, 패딩 값(274)이 공급될 수 있는데, 왜냐하면 0보다 큰 가변 시프트 양이 선택되는 경우 주입할 원래의 입력 벡터 내의 더 높은 요소 위치가 존재하지 않기 때문이다. 유사하게, 시프트 양의 더 높은 값들에 대해, 입력 벡터(250)의 어느 위치가 시프트된 입력 벡터(272)에서의 시프트된 위치들에 공급되는지를 조정하기 위해 위치의 더 큰 시프트가 적용될 수 있다. 단순히 그의 원래 위치에서 사용되는 제2 벡터 피연산자(252)에는 어떠한 시프트도 적용되지 않는다.
이어서 행렬 처리 로직(84)은 각각의 요소 C'[i,j]가 식
Figure pct00005
에 따라 생성되도록 외적 연산을 수행하며, 여기서 i는 결과 행렬 C'[i, j]의 모든 행에 걸쳐 반복되고, j는 결과 행렬 C'[i, j]의 모든 열에 걸쳐 반복된다. 여기서, 결과 행렬에서의 주어진 행 위치 i에 대응하는 프레디케이트 비트 P[i]는 그 행이 마스킹되는지(비활성) 또는 마스킹되지 않는지(활성)를 지정한다. 이 예에서, 출력 행렬(270)의 비활성 행들은 0과 동일한 프레디케이트 비트들에 의해 표시되는 반면 활성 행들은 1의 프레디케이트 비트들에 의해 표시되지만, 다른 예들은 비활성 행들이 1의 프레디케이트 비트들을 사용하여 식별될 수 있고 활성 행들이 0의 프레디케이트 비트들에 의해 식별될 수 있도록 프레디케이트 값의 반대 매핑을 취할 수 있다는 것이 인식될 것이다. 비활성 행들에 대해, 이 예에서, 시프트된 입력 벡터(272)의 대응하는 요소들은 0의 마스킹 값으로 대체되는 것으로 가정되지만, 다른 예들은 0이 아닌 마스킹 값을 사용할 수 있다.
따라서, 이러한 접근법에서, 위치 시프팅 회로부(260)에 의해 제공되는 가변 위치 시프트는 도 8에 도시된 접근법을 지원하는 데 도움을 주며, 여기서, 입력 피연산자 레지스터(70)에 입력 행렬의 주어진 행 또는 열을 나타내는 특정 벡터(250)를 로딩하면, 도 8에 도시된 바와 같이 상이한 커널 위치들에 대한 커널 가중치를 적용하는 데 필요한 입력 벡터(250)와 출력 행렬(270) 사이의 상대적 위치 시프트들을 고려하기 위해, 가변 시프트 양(244)의 상이한 값들을 지정하는 다수의 행렬 처리 명령어들이 실행되어, 레지스터(70) 내의 입력 벡터(250)의 정확히 동일한 내용들에 작용할 수 있다. 이것은 모든 커널 위치에 대해 벡터 피연산자 레지스터(250)를 리로딩할 필요를 회피한다. 또한, 프레디케이트 값(242)을 사용하는 프레디케이션 기능의 제공은 도 7과 관련하여 논의된 랩어라운드 문제를 고려하기 위해 도 8에 도시된 바와 같이 소정 행들을 스킵할 필요를 다루는 것을 돕는다. 프레디케이션은 또한 하드웨어에서 지원되는 전체 벡터를 가득 채우기에 불충분한 수의 행들 또는 열들이 존재하는 경우들을 다루는 것을 도울 수 있다.
도 14는 위치 시프팅 회로부(260)가 주어진 입력 레지스터(70)로부터 입력 벡터 피연산자(250)를 판독하는 것과 외적/누산 연산을 수행하기 위해 시프트된 피연산자를 행렬 처리 로직(84)에 공급하는 것 사이에 제공되는 것을 도시하지만, 행렬 처리 로직(84)이 외적/누산 연산의 결과를 생성하는 것과 결과를 결과 행렬 레지스터(72)에 후기입하는 것 사이에 위치 시프트를 적용하는 것이 또한 가능할 것이지만, 이러한 접근법은 약간 더 복잡할 것인데, 그 이유는 누산 연산이 수행되고 있는 경우, 이것은 또한 외적/누산 연산에 대한 입력들(즉, 위에서 설명된 식에서의 C[i,j])로서 판독되는 출력의 행렬들의 이전 값들의 부분의 시프트를 요구할 것이기 때문이다.
따라서, 도 10 내지 도 14와 관련하여 위에서 논의된 특징들을 제공하는 것은, 처리 파이프라인 내의 행렬 처리 기능이 기계 학습의 분야에서 매우 일반적인 2D 컨볼루션 연산들을 더 효율적으로 핸들링하는 것을 돕는다. 프로그래머들은 동일한 기능들에 대한 다른 용도들을 찾을 수 있고, 따라서 이들은 전적으로 그러한 2D 컨볼루션 연산들에 대해 사용될 필요는 없다는 것이 인식될 것이다.
도 10은 메모리 내의 행렬 구조들의 상이한 레이아웃들이 그들의 저장된 레이아웃에 관계없이 동일한 세트의 명령어들을 사용하여 처리될 수 있게 하는 데 유용한 행렬 전치 박스(74)를 도시하지만, 행렬 전치 박스(74)는 필수적인 것은 아니며, 몇몇 구현들은 그것을 생략할 수 있고, 이 예에서 입력 및 출력 행렬들에 대한 메모리 레이아웃들 사이에 차이가 존재하는 경우, 임의의 전치는 임의의 행렬 처리 연산들을 적용하기 전에 로드/저장 명령어들을 사용하여 메모리에 저장된 데이터를 리매핑함으로써, 또는 출력을 생성하고 이어서 그것을 출력에 대응하는 메모리 내의 데이터 구조에 후기입하기 전에 그의 포맷을 변환함으로써 개별적으로 핸들링될 필요가 있을 것이다. 행렬 전치 박스(74)가 제공되지 않는 경우, 행렬 로드 회로부(80)는 대신에 행렬 처리 연산들을 수행할 때 메모리 내의 행렬 구조의 행들 또는 열들을 행렬 처리 로직에 의해 판독 가능한 입력 레지스터들(70)에 직접 로딩할 수 있다.
또한, 몇몇 구현들에서, 입력 피연산자 레지스터들(70)을 제공하는 것은 조금도 필수적인 것은 아닐 수 있는데, 왜냐하면 행렬 전치 박스(74)가 제공되는 경우, 다른 접근법은 행렬 처리 로직(84)이 행렬 전치 박스(74)의 저장 요소들(88)로부터 직접 그의 피연산자들을 판독하는 것일 수 있기 때문이다. 따라서, 일반적으로 어떤 피연산자 저장 회로부가 행렬 로드 회로부(80)에 의해 행렬의 행들 또는 열들로 로딩되도록 제공될 수 있고 그로부터 피연산자들이 행렬 처리 로직(84)에 의해 획득될 수 있지만, 행렬 전치 박스(74) 및 입력 피연산자 레지스터(70) 둘 모두를 제공하는 것은 필요하지 않고, 어느 하나가 단독으로 제공될 수 있거나, 둘 모두가 도 10의 예에서와 같이 조합하여 제공될 수 있다.
도 10은 행렬들 내의 행들 및 열들의 수가 동일한 정사각형 행렬들에 적용되는 예를 도시하지만, 이것은 필수적인 것은 아니며, 다른 예들은 행들 및 열들의 비대칭 수들을 지원할 수 있다.
전술된 행/열 마스킹 기능 및 위치 시프팅 기능 둘 모두가 제공되는 경우 성능이 최대한으로 개선될 수 있지만, 이것은 필수적인 것은 아니며, 몇몇 구현들은 이러한 기능들 중 하나 또는 다른 것만을 제공할 수 있다.
도 15는 로드 연산을 수행하는 포인트에서 마스킹이 적용되는 예에서, 행렬 로드 명령어를 처리하는 방법을 도시하는 흐름도이다. 그러한 명령어를 단계(300)에서 만날 때, 단계(302)에서 명령어 디코더(30)는 로드 명령어를 디코딩하여, CPU(60) 내의(예를 들어, 레지스터 뱅크(34) 내의 또는 행렬 로드 회로부(80)와 연관된 내부 레지스터들 내의) 내부 레지스터들로부터, 메모리 내의 데이터 구조(110)로부터, 또는 오프셋 캐시(116)로부터 제1 마스킹 상태 데이터(96)를 획득하도록 행렬 로드 회로부(80)를 제어하는 제어 신호들을 생성한다. 제1 마스킹 상태 데이터(96)는 전체 행/열이 마스킹되는지 여부를 나타내는 "전체 행/열" 마스킹 상태 데이터이다. 전체 제1 마스킹 상태 데이터(96)가 행렬 로드 회로부(80)에 의해 획득되는 것은 필수적인 것은 아니다 - 로딩될 타겟 행/열의 행/열 번호(99)에 대응하는 마스킹 표시(100 또는 114)를 참조하는 것만으로 충분할 수 있다. 따라서, 단계(304)에서, 행렬 로드 회로부는, 획득된 제1 마스킹 상태 데이터(96)에 기초하여, 행렬 로드 명령어에 의해 지정된 행/열 번호(99)가 처리되고 있는 입력 행렬 내의 마스킹된 행 또는 열 위치에 대응하는지를 결정한다. 지정된 행/열이 마스킹된 행/열인 경우, 단계(306)에서, 타겟 행/열에 대응하는 피연산자 저장 회로부(74, 70)의 대응하는 부분은, 메모리에 저장된 행렬 데이터 구조의 대응하는 부분에 대해 메모리에 대한 로드를 실제로 수행하는 대신에, 마스킹 값을 갖는 데이터로 로딩된다. 마스킹 값은 로드 명령어에 의해 인코딩되거나 제어 레지스터 내의 다른 곳에서 지정된 선택 파라미터에 기초하여 다수의 옵션 중에서 선택될 수 있다. 대안적으로, 몇몇 구현들은 0과 같은, 디폴트로 고정된 마스킹 값을 항상 사용할 수 있다.
반면에, 타겟 행 또는 열 위치가 마스킹된 행 또는 열 위치가 아닌 경우, 단계(308)에서, 행렬 로드 회로부(80)는 타겟 행/열 내의 임의의 개개의 마스킹된 열/행 위치들 중의 위치들을 나타내는 요소별 마스킹 상태 데이터인, 제2 마스킹 상태 데이터(97)를 획득한다. 단계(310)에서, 행렬 로드 회로부는 타겟 행/열 내에 임의의 활성 요소들이 있는지를 결정한다(제1 마스킹 상태 데이터(96)가 타겟 행/열이 마스킹되지 않았다는 것을 나타냈을지라도, 제2 마스킹 상태 데이터(97)가 타겟 행/열 내의 모든 요소들을 비활성이도록 설정했을 수도 있는 것이 가능하다). 타겟 행/열에 적어도 하나의 활성 요소가 있는 경우, 단계(312)에서, 행렬 로드 회로부(80)는 타겟 행 또는 열에 대응하는 행렬 데이터 구조의 부분을 메모리로부터 판독하기 위해 로드 연산을 트리거한다. 데이터가 그로부터 로딩되는 어드레스는, 예를 들어, 도 12의 예에서 행/열 번호와 지정된 스트라이드(106)의 배수에 베이스 어드레스(104)를 더하는 것에 의해, 어드레싱 정보(94)로부터 도출될 수 있다. 이어서 메모리로부터 데이터의 관련 청크를 획득하면, 그 행 또는 열 내의 임의의 활성 요소들에 대해, 로딩된 데이터는 행렬 전치 박스(74)의 대응하는 저장 요소들(88)에 기입되거나, 선택된 입력 피연산자 레지스터(70)의 대응하는 부분에 직접 로딩된다. 대조적으로, 제2 마스킹 상태 데이터(97)에 의해 표시되는 타겟 행/열의 임의의 비활성 요소들에 대해, 대응하는 저장 요소들(88) 또는 선택된 입력 피연산자 레지스터(70)의 부분들은 마스킹 값으로 채워지며, 마스킹 값은 다시 0이거나 0이 아닐 수 있고, 고정되거나 프로그래밍 방식으로 제어될 수 있다.
단계(310)에서 행렬 로드 회로부(80)가 타겟 행/열 내의 모든 요소들이 제2 마스킹 상태 데이터(97)에 의해 비활성으로서 표시된다고 결정하는 경우, 단계(314)에서 로드 연산이 발생하는 것이 방지되고, 피연산자 저장 회로부 내의 타겟 행/열의 각각의 요소(즉, 행렬 전치 박스(74)의 저장 요소들(88) 또는 입력 피연산자 레지스터(70))는 메모리로부터의 임의의 로드를 수행할 필요가 전혀 없이 마스킹 값으로 채워진다.
도 15는 제1 및 제2 마스킹 상태 데이터(96, 97)를 획득하기 위한 2개의 별개의 단계들(302, 308)을 도시하지만, 다른 예들은 타겟 행/열이 제1 마스킹 상태 데이터(96)에 의해 마스킹되는지를 체크하기 전에 단계(302)에서 둘 모두의 마스킹 상태 데이터(96, 97)를 획득할 수 있다.
도 16은 행렬 처리의 포인트에서 적용되는 마스킹을 지원하는 실시예에서 행렬 처리 명령어(240)를 처리하는 제1 예를 도시한다. 단계(320)에서, 파이프라인의 명령어 디코더(30)는 처리될 명령어가 행렬 처리 명령어인 것을 식별하고, 그 명령어를 처리하도록 행렬 처리 회로부(46)를 제어하는 제어 신호들을 생성한다. 이러한 제어 신호들에 응답하여, 단계(322)에서 행렬 처리 로직(84)은 피연산자 저장 회로부(70, 74)에 저장된 정보에 의존하는 제1 및 제2 피연산자들을 획득한다. 앞서 논의된 바와 같이, 이러한 피연산자들은 행렬 전치 박스(74)로부터 직접 획득될 수 있거나 입력 피연산자 레지스터들(70)로부터 획득될 수 있다. 또한, 행렬 처리 회로부는 입력 값들이 그들이 마스킹 값을 나타낸 것처럼 취급되어야 하는 마스킹된 행/열 위치들을 나타내는, 마스킹 상태 데이터(96)(예를 들어, 도 14에 도시된 바와 같은 프레디케이트 벡터(242))를 획득한다. 단계(324)에서, 행렬 처리 회로부(46)는 제1 및 제2 피연산자들에 대해 행렬 처리 연산을 수행하여 2차원 결과 행렬을 생성하고, 2차원 결과 행렬은 이어서 결과 행렬 레지스터들(72) 중 하나에 후기입될 수 있다. 예를 들어, 이러한 연산들은 제1 및 제2 피연산자들이 벡터 피연산자들인 위에서 논의된 바와 같은 외적 및 누산 연산일 수 있다. 마스킹 상태 데이터(96)에 의해 마스킹된 것으로서 표시된 임의의 비활성 행들/열들에 대해, 결과 행렬의 대응하는 요소들은 그들의 이전 값들을 보유할 수 있거나, 대안적으로 대응하는 입력 값들이 마스킹 값으로 설정된 경우 생성되었을 값들로 설정될 수 있다.
도 17은 도 8 및 도 14와 관련하여 설명된 가변 위치 시프팅 특징을 지원하는 실시예에서, 행렬 처리 명령어를 처리하는 제2 예를 도시한다. 단계들(320, 322 및 324)은 도 16의 대응하는 단계들과 유사하다(도 17에서 마스킹 특징이 명시적으로 도시되지 않지만, 몇몇 실시예들에서 여전히 제공될 수 있다). 그러나, 도 17에서, 도 14에 도시된 위치 시프팅 기능이 또한 지원된다. 단계(326)에서, 행렬 처리 명령어에 의해 지정된 가변 시프트 양(244)에 따라 다수의 대안적인 시프트 양들 중 하나가 행렬 처리 회로부(46)에 의해 선택된다. 도 14는 도 8에 도시된 3개의 옵션과 대응하는 3개의 상이한 가능한 시프트 양을 갖는 예를 도시하지만, 더 큰 커널 크기들을 지원하는 다른 구현들은 선택될 수 있는 3개 초과의 상이한 시프트 양을 요구할 수 있다는 것이 인식될 것이다. 대안적으로, 위치 시프팅 회로부(260)의 복잡도를 제한하기 위해, 더 큰 커널 크기들이 지원될지라도, 위치 시프트는 소정의 최대 크기로 제한될 수 있고, 더 큰 커널 크기들을 지원하기 위해 추가 로드들이 있을 필요가 있는 경우, 이것은 여전히 가능하다.
따라서, 단계(328)에서, 2D 결과 행렬(270)의 어느 행 또는 열이 입력 피연산자들(250) 중 하나의 주어진 요소에 기초하여 업데이트되는지가 변경되도록, 가변 위치 시프트가 단계(326)에서 선택된 시프트 양에 기초하여 위치 시프팅 회로부(260)에 의해 적용된다. 도 17의 단계(324)에서, 이어서 행렬 처리 연산이 가변 위치 시프트에 기초하여 적용되어 결과 행렬(270)을 생성한다.
따라서, 요컨대, 이러한 아이디어들은 기계 학습 및 이미지 처리의 분야에서 일반적인 연산인 2D 컨볼루션 연산들의 처리를 지원하는 더 효율적인 하드웨어를 지원하는 것을 돕는다.
추가 예들이 하기 항목들에서 제시된다:
(1) 장치로서, 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 행렬 처리 회로부 - 결과 행렬은 2차원 행렬임 -; 행렬 처리 회로부에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하는 피연산자 저장 회로부; 및 마스킹 값을 나타내는 것으로서 취급될 하나 이상의 마스킹된 행 또는 열 위치들을 나타내는 마스킹 상태 데이터에 기초하여 피연산자 저장 회로부에 저장된 정보 또는 행렬 처리 연산의 적어도 일부를 마스킹하는 마스킹 연산을 수행하는 마스킹 회로부를 포함하는, 장치.
(2) 항목 (1)에 있어서, 마스킹 값은 0인, 장치.
(3) 항목 (1) 또는 항목 (2)에 있어서, 마스킹 값은, 마스킹 연산이 수행되게 하는 명령어에 의해 지정된 마스킹 값 선택 파라미터; 제어 레지스터에 저장된 제어 값; 및 마스킹된 행/열의 복수의 요소들에 대한 별개의 마스킹 값들을 지정하는 마스킹 벡터 중 적어도 하나에 따라 복수의 마스킹 값들로부터 선택되는, 장치.
(4) 항목 (1) 내지 항목 (3) 중 어느 한 항목에 있어서, 마스킹 상태 데이터는, 요소들의 2차원 어레이 내에서, 마스킹 값을 나타내는 것으로서 취급될 요소들을 식별하는 인코딩을 갖는, 장치.
(5) 항목 (4)에 있어서, 마스킹 상태 데이터는,
하나 이상의 마스킹된 행 또는 열 위치들 - 마스킹된 행 또는 열 위치 내의 모든 요소들은 마스킹 값을 나타내는 것으로서 취급될 것임 - 을 나타내는 제1 마스킹 상태 데이터; 및
주어진 행 또는 열 내의 개별 요소 위치들이 마스킹되어야 하는지 여부를 나타내는 제2 마스킹 상태 데이터를 지정하는, 장치.
(6) 항목 (1) 내지 항목 (5) 중 어느 한 항목에 있어서, 마스킹 상태 데이터는, 마스킹된 행 또는 열 위치들로서, 적어도 하나의 마스킹되지 않은 행 또는 열 위치에 의해 분리된 적어도 2개의 인접하지 않은 행 또는 열 위치들을 나타낼 수 있는 인코딩을 갖는, 장치.
(7) 항목 (1) 내지 항목 (6) 중 어느 한 항목에 있어서, 피연산자 저장 회로부는 주어진 피연산자 행렬의 각자의 행렬 요소들을 저장하는 복수의 저장 유닛들을 포함하는 행렬 전치 회로부를 포함하고, 행렬 전치 회로부의 저장 유닛들은 주어진 피연산자 행렬의 행들에 대응하는 행 그룹들에서 판독 가능하고, 또한 주어진 피연산자 행렬의 열들에 대응하는 열 그룹들에서 판독 가능한, 장치.
(8) 항목 (7)에 있어서, 주어진 피연산자 행렬이 행 그룹들에서 행렬 전치 회로부에 기입될 때, 행렬 전치 회로부는 열 그룹들에서 행렬 전치 회로부로부터 주어진 피연산자 행렬을 판독하는 것을 지원하도록 구성되고; 주어진 피연산자 행렬이 열 그룹들에서 행렬 전치 회로부에 기입될 때, 행렬 전치 회로부는 행 그룹들에서 행렬 전치 회로부로부터 주어진 피연산자 행렬을 판독하는 것을 지원하도록 구성되는, 장치.
(9) 항목 (1) 내지 항목 (8) 중 어느 한 항목에 있어서, 행렬 처리 회로부는 마스킹 회로부를 포함하고, 상기 마스킹 정보에 응답하여 상기 제1 및 제2 피연산자들 중 하나의 피연산자의 부분이 피연산자 저장 회로부에 저장된 상기 제1 및 제2 피연산자들 중 상기 하나의 피연산자의 상기 부분의 실제 값 대신에 마스킹 값을 나타내는 것으로서 취급되는 상기 하나 이상의 마스킹된 행 또는 열 위치들에 대응하는 상태로 상기 행렬 처리 연산을 수행하는, 장치.
(10) 항목 (1) 내지 항목 (9) 중 어느 한 항목에 있어서, 메모리에 저장된 행렬 데이터 구조의 부분에 기초하여 주어진 피연산자 행렬의 타겟 행 또는 열에 대응하는 정보를 피연산자 저장 회로부에 로딩하기 위한 로드 명령어에 응답하는 로드 회로부를 포함하고; 로드 회로부는 마스킹 회로부를 포함하고, 타겟 행 또는 열이 마스킹 상태 데이터에 의해 표시되는 마스킹된 행 또는 열 위치에 대응할 때, 로드 회로부는 메모리에 저장된 행렬 데이터 구조의 부분에 기초한 데이터 대신에 마스킹 값을 갖는 데이터를 타겟 행 또는 열에 대응하는 상기 피연산자 저장 회로부의 부분에 로딩하도록 구성되는, 장치.
(11) 항목 (10)에 있어서, 로드 명령어에 응답하여, 타겟 행 또는 열에 대응하는 마스킹 상태 데이터가 타겟 행 또는 열이 마스킹된 행 또는 열 위치에 대응한다는 것을 나타낼 때, 로드 회로부는 타겟 행 또는 열의 복수의 행렬 요소들 각각이 마스킹되어야 하는지를, 타겟 행 또는 열의 복수의 행렬 요소들 사이에서 공유되는 마스킹 상태 데이터의 공유 항목에 기초하여 결정하도록 구성되는, 장치.
(12) 항목 (10) 또는 항목 (11)에 있어서, 마스킹 상태 데이터는, 각각이 주어진 피연산자 행렬의 각자의 행 또는 열 위치에 대응하고 베이스 어드레스에 대한 메모리 내의 행렬 데이터 구조의 대응하는 부분의 어드레스의 오프셋을 나타내는 복수의 오프셋 값들을 포함하고; 마스킹된 행 또는 열 위치는 미리 결정된 예약된 오프셋 값을 갖는 마스킹된 행 또는 열 위치에 대한 오프셋 값에 의해 표시되는, 장치.
(13) 항목 (10) 내지 항목 (12) 중 어느 한 항목에 있어서, 로드 회로부는, 적어도 하나의 마스킹 상태 어드레싱 레지스터에 저장된 마스킹 상태 어드레싱 정보에 기초하여, 메모리로부터 마스킹 상태 데이터를 획득하도록 구성되는, 장치.
(14) 항목 (11) 내지 항목 (13) 중 어느 한 항목에 있어서, 로드 회로부는 어드레싱 정보에 기초하여 메모리 내의 행렬 데이터 구조의 부분의 타겟 어드레스를 결정하도록 구성되는, 장치.
(15) 항목 (14)에 있어서, 어드레싱 정보는 복수의 어드레스 포인터들을 포함하며, 각각의 어드레스 포인터는 주어진 피연산자 행렬의 각자의 행 또는 열 위치에 대응하는 행렬 데이터 구조의 부분의 어드레스를 나타내는, 장치.
(16) 항목 (14)에 있어서, 어드레싱 정보는, 행렬 데이터 구조의 베이스 어드레스; 및 주어진 피연산자 행렬의 하나의 행 또는 열에 대응하는 행렬 데이터 구조의 부분의 어드레스와 주어진 피연산자 행렬의 다음 행 또는 열에 대응하는 행렬 데이터 구조의 부분의 어드레스 사이의 차이를 나타내는 스트라이드 값을 포함하는, 장치.
(17) 항목 (14)에 있어서, 어드레싱 정보는, 행렬 데이터 구조의 베이스 어드레스; 및 각각이 주어진 피연산자 행렬의 각자의 행 또는 열 위치에 대응하고 베이스 어드레스에 대한 메모리 내의 행렬 데이터 구조의 대응하는 부분의 어드레스의 오프셋을 나타내는 복수의 오프셋 값들; 및 상기 복수의 오프셋 값들을 제공하는 메모리 내의 데이터 구조의 어드레스를 나타내는 오프셋 데이터 구조 어드레스 중 하나를 포함하는 오프셋 정보를 포함하는, 장치.
(18) 항목 (14) 내지 항목 (17) 중 어느 한 항목에 있어서, 어드레싱 정보는 어드레싱 정보에 기초하여 식별된 메모리 내의 행렬 데이터 구조의 부분의 어느 하위 부분이 피연산자 저장 회로부에 로딩되어야 하는지를 선택하기 위한 하위 부분 선택 정보를 추가로 포함하는, 장치.
(19) 항목 (14) 내지 항목 (18) 중 어느 한 항목에 있어서, 어드레싱 정보를 저장하는 적어도 하나의 어드레싱 레지스터; 및 적어도 하나의 어드레싱 레지스터에 저장된 어드레싱 정보에 따라 메모리로부터 주어진 피연산자 행렬의 부분들을 프리페치하기 위한 프리페치 요청들을 생성하는 프리페치 회로부를 포함하는, 장치.
(20) 항목 (1) 내지 항목 (19) 중 어느 한 항목에 있어서, 제1 및 제2 입력 피연산자들은 1차원 벡터 피연산자들인, 장치.
(21) 항목 (1) 내지 항목 (20) 중 어느 한 항목에 있어서, 행렬 처리 연산은 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 적용되는 외적 연산을 포함하는, 장치.
(22) 항목 (21)에 있어서, 외적 연산은 결과 행렬이 누산기 행렬의 각자의 요소들에 대한 업데이트된 값들을 포함하는 외적-및-누산 연산을 포함하고, 누산기 행렬의 주어진 요소에 대한 업데이트된 값은 누산기 행렬의 상기 주어진 요소의 이전 값을 제1 및 제2 입력 피연산자들에 대해 외적 연산을 수행한 결과에 대응하는 외적 결과 행렬의 대응하는 요소에 더한 결과에 대응하는, 장치.
(23) 항목 (1) 내지 항목 (22) 중 어느 한 항목에 있어서, 행렬 처리 회로부는 단일 명령어에 응답하여 제1 및 제2 입력 피연산자들로부터 결과 행렬을 생성하도록 구성되는, 장치.
(24) 장치로서, 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하기 위한 수단 - 결과 행렬은 2차원 행렬임 -; 수행하기 위한 수단에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하기 위한 수단; 및 마스킹 값을 나타내는 것으로서 취급될 하나 이상의 마스킹된 행 또는 열 위치들을 나타내는 마스킹 상태 데이터에 기초하여 피연산자 저장 회로부에 저장된 정보 또는 행렬 처리 연산의 적어도 일부를 마스킹하는 마스킹 연산을 수행하기 위한 수단을 포함하는, 장치.
(25) 데이터 처리 방법으로서, 피연산자 저장 회로부에, 행렬 처리 연산에 대한 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하는 단계; 및 결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 단계 - 결과 행렬은 2차원 행렬임 -; 및 마스킹 값을 나타내는 것으로서 취급될 하나 이상의 마스킹된 행 또는 열 위치들을 나타내는 마스킹 상태 데이터에 기초하여 피연산자 저장 회로부에 저장된 정보 또는 행렬 처리 연산의 적어도 일부를 마스킹하는 마스킹 연산을 수행하는 단계를 포함하는, 데이터 처리 방법.
본 출원에서, 단어들 "... 하도록 구성된"은 장치의 요소가 정의된 동작을 수행할 수 있는 구성을 갖는다는 것을 의미하는 데 사용된다. 이러한 맥락에서, "구성"은 하드웨어 또는 소프트웨어의 상호 접속의 배열 또는 방식을 의미한다. 예를 들어, 장치는 정의된 동작을 제공하는 전용 하드웨어를 가질 수 있거나, 프로세서 또는 다른 처리 디바이스가 그 기능을 수행하도록 프로그래밍될 수 있다. "하도록 구성된"은 장치 요소가 정의된 동작을 제공하기 위해 임의의 방식으로 변경될 필요가 있다는 것을 암시하지는 않는다.
본 발명의 예시적인 실시예들이 첨부 도면들을 참조하여 본 명세서에서 상세히 설명되었지만, 본 발명은 그러한 정확한 실시예들로 제한되지 않으며, 첨부된 청구항들에 의해 한정된 바와 같은 본 발명의 범위로부터 벗어남이 없이 실시예들에서 다양한 변경들 및 수정들이 당업자에 의해 이루어질 수 있다는 것이 이해되어야 한다.

Claims (14)

  1. 장치로서,
    결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 행렬 처리 회로부 - 상기 결과 행렬은 2차원 행렬임 -;
    상기 행렬 처리 회로부에 대한 상기 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하는 피연산자 저장 회로부; 및
    주어진 행렬 처리 연산 동안 상기 피연산자 저장 회로부에 저장된 상기 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 상기 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하는 위치 시프팅 회로부 - 상기 가변 위치 시프트는 상기 주어진 행렬 처리 연산에 대해 선택 가능한 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하고, 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 상기 결과 행렬에 대한 상기 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 위치 시프트에 대응함 - 를 포함하는, 장치.
  2. 제1항에 있어서, 상기 제1 및 제2 입력 피연산자들은 1차원 벡터 피연산자들을 포함하는, 장치.
  3. 제2항에 있어서, 상기 행렬 처리 연산은 상기 결과 행렬을 생성하기 위해 상기 제1 및 제2 입력 피연산자들에 적용되는 외적 연산을 포함하는, 장치.
  4. 제3항에 있어서, 상기 외적 연산은 상기 결과 행렬이 누산기 행렬의 각자의 요소들에 대한 업데이트된 값들을 포함하는 외적-및-누산 연산을 포함하고, 상기 누산기 행렬의 주어진 요소에 대한 상기 업데이트된 값은 상기 누산기 행렬의 상기 주어진 요소의 이전 값을 상기 제1 및 제2 입력 피연산자들에 대해 상기 외적 연산을 수행한 결과에 대응하는 외적 결과 행렬의 대응하는 요소에 더한 결과에 대응하는, 장치.
  5. 제1항 내지 제4항 중 어느 한 항에 있어서, 상기 위치 시프팅 회로부는 상기 행렬 처리 연산을 수행하도록 상기 행렬 처리 회로부를 제어하기 위한 행렬 처리 명령어에 의해 지정된 파라미터에 기초하여 상기 복수의 대안적인 시프트 양들 중 상기 하나의 대안적인 시프트 양을 선택하도록 구성되는, 장치.
  6. 제1항 내지 제5항 중 어느 한 항에 있어서,
    상기 결과 행렬의 주어진 행 또는 열이 상기 행렬 처리 회로부가 액세스 가능한 프레디케이트 정보(predicate information)에 의해 표시되는 활성 행 또는 열 위치에 대응할 때, 상기 행렬 처리 회로부는 상기 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 대응하는 행 또는 열에 의존하는 값들을 갖는 상기 결과 행렬의 상기 주어진 행 또는 열의 요소들을 생성하도록 구성되고, 상기 대응하는 행 또는 열은 상기 주어진 행렬 처리 연산에 대해 선택된 상기 복수의 대안적인 시프트 양들 중 상기 하나의 대안적인 시프트 양에 의존하여 선택되고,
    상기 주어진 행 또는 열이 상기 프레디케이트 정보에 의해 표시되는 비활성 행 또는 열 위치에 대응할 때, 상기 행렬 처리 회로부는 상기 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 상기 대응하는 행 또는 열과는 무관한 값들을 갖는 상기 결과 행렬 값들의 상기 주어진 행 또는 열의 상기 요소들을 생성하도록 구성되는, 장치.
  7. 제1항 내지 제6항 중 어느 한 항에 있어서, 상기 피연산자 저장 회로부는 주어진 피연산자 행렬에 대한 각자의 행렬 요소들을 저장하는 복수의 저장 유닛들을 포함하는 행렬 전치 회로부를 포함하고, 상기 행렬 전치 회로부의 상기 저장 유닛들은 상기 주어진 피연산자 행렬의 행들에 대응하는 행 그룹들에서 판독 가능하고, 또한 상기 주어진 피연산자 행렬의 열들에 대응하는 열 그룹들에서 판독 가능한, 장치.
  8. 제7항에 있어서,
    상기 주어진 피연산자 행렬이 행 그룹들에서 상기 행렬 전치 회로부에 기입될 때, 상기 행렬 전치 회로부는 열 그룹들에서 상기 행렬 전치 회로부로부터 상기 주어진 피연산자 행렬을 판독하는 것을 지원하도록 구성되고,
    상기 주어진 피연산자 행렬이 열 그룹들에서 상기 행렬 전치 회로부에 기입될 때, 상기 행렬 전치 회로부는 행 그룹들에서 상기 행렬 전치 회로부로부터 상기 주어진 피연산자 행렬을 판독하는 것을 지원하도록 구성되는, 장치.
  9. 제7항 또는 제8항에 있어서, 상기 피연산자 저장 회로부는 상기 행렬 처리 연산에 대한 상기 제1 및 제2 입력 피연산자들을 저장하는 피연산자 레지스터들을 포함하고,
    상기 장치는 이동 명령어에 응답하여 상기 행렬 전치 회로부로부터 상기 주어진 피연산자 행렬의 적어도 하나의 행 또는 열을 판독하고 상기 적어도 하나의 행 또는 열을 상기 피연산자 레지스터들에 기입하는 피연산자 이동 회로부를 포함하는, 장치.
  10. 제7항 내지 제9항 중 어느 한 항에 있어서, 상기 장치는 행렬 처리 명령어에 응답하여 상기 행렬 전치 회로부로부터 상기 주어진 피연산자 행렬의 적어도 하나의 행 또는 열을 판독하고 상기 적어도 하나의 행 또는 열을 상기 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자로서 상기 행렬 처리 회로부에 제공하는 피연산자 이동 회로부를 포함하는, 장치.
  11. 제1항 내지 제10중 어느 한 항에 있어서, 메모리에 저장된 행렬 데이터 구조의 부분에 기초하여 주어진 피연산자 행렬의 타겟 행 또는 열에 대응하는 정보를 상기 피연산자 저장 회로부에 로딩하기 위한 로드 명령어에 응답하는 로드 회로부를 포함하고,
    상기 로드 명령어에 응답하여, 상기 로드 회로부는 상기 주어진 피연산자 행렬 내의 하나 이상의 마스킹된 행 또는 열 위치들을 표시하기 위한 마스킹 상태 데이터를 획득하도록 구성되고, 상기 타겟 행 또는 열이 상기 마스킹 상태 데이터에 의해 표시되는 마스킹된 행 또는 열 위치에 대응할 때, 상기 로드 회로부는 메모리에 저장된 상기 행렬 데이터 구조의 상기 부분에 기초한 데이터 대신에 마스킹 값을 갖는 데이터를 상기 타겟 행 또는 열에 대응하는 상기 피연산자 저장 회로부의 부분에 로딩하도록 구성되는, 장치.
  12. 제1항 내지 제11항 중 어느 한 항에 있어서, 상기 행렬 처리 회로부는 단일 명령어에 응답하여 상기 제1 및 제2 입력 피연산자들로부터 상기 결과 행렬을 생성하도록 구성되는, 장치.
  13. 장치로서,
    결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하기 위한 수단 - 상기 결과 행렬은 2차원 행렬임 -;
    상기 수행하기 위한 수단에 대한 상기 제1 및 제2 입력 피연산자들을 형성하기 위한 정보를 저장하기 위한 수단; 및
    주어진 행렬 처리 연산 동안 상기 저장하기 위한 수단에 저장된 상기 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 상기 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하기 위한 수단 - 상기 가변 위치 시프트는 상기 주어진 행렬 처리 연산에 대해 선택 가능한 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하고, 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 상기 결과 행렬에 대한 상기 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 위치 시프트에 대응함 - 을 포함하는, 장치.
  14. 데이터 처리 방법으로서,
    결과 행렬을 생성하기 위해 제1 및 제2 입력 피연산자들에 대해 행렬 처리 연산을 수행하는 단계 - 상기 결과 행렬은 2차원 행렬이고, 상기 제1 및 제2 입력 피연산자들은 피연산자 저장 회로부에 저장된 정보에 의존함 -; 및
    주어진 행렬 처리 연산 동안, 상기 피연산자 저장 회로부에 저장된 상기 제1 및 제2 입력 피연산자들 중 하나의 입력 피연산자의 주어진 요소에 기초하여 상기 결과 행렬의 어느 행 또는 열이 업데이트되는지를 변경하기 위해 가변 위치 시프트를 적용하는 단계 - 상기 가변 위치 시프트는 상기 주어진 행렬 처리 연산에 대해 선택 가능한 복수의 대안적인 시프트 양들 중 하나의 대안적인 시프트 양에 기초하고, 각각의 대안적인 시프트 양은 상이한 수의 행들 또는 열들만큼의 상기 결과 행렬에 대한 상기 제1 및 제2 입력 피연산자들 중 상기 하나의 입력 피연산자의 위치 시프트에 대응함 - 를 포함하는, 데이터 처리 방법.
KR1020227043451A 2020-05-13 2021-05-13 행렬 처리를 위한 가변 위치 시프트 KR20230005393A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
GB2007068.6A GB2594971B (en) 2020-05-13 2020-05-13 Variable position shift for matrix processing
GB2007068.6 2020-05-13
PCT/GB2021/051153 WO2021229232A1 (en) 2020-05-13 2021-05-13 Variable position shift for matrix processing

Publications (1)

Publication Number Publication Date
KR20230005393A true KR20230005393A (ko) 2023-01-09

Family

ID=71134967

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020227043451A KR20230005393A (ko) 2020-05-13 2021-05-13 행렬 처리를 위한 가변 위치 시프트

Country Status (7)

Country Link
US (1) US20230229730A1 (ko)
EP (1) EP4150447A1 (ko)
JP (1) JP2023525811A (ko)
KR (1) KR20230005393A (ko)
CN (1) CN115552371A (ko)
GB (1) GB2594971B (ko)
WO (1) WO2021229232A1 (ko)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102548283B1 (ko) * 2021-12-22 2023-06-27 (주)뉴로컴즈 콘볼루션 신경망 컴퓨팅 장치
GB2614886A (en) * 2022-01-19 2023-07-26 Advanced Risc Mach Ltd Data processing
GB2622581A (en) * 2022-09-14 2024-03-27 Advanced Risc Mach Ltd Multiple-outer-product instruction

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
EP3561736A4 (en) * 2016-12-20 2020-09-09 Shanghai Cambricon Information Technology Co., Ltd MULTIPLICATION AND ADDITION DEVICE FOR MATRICES, COMPUTER DEVICE WITH NEURONAL NETWORK AND PROCESS
JP6767660B2 (ja) * 2017-01-27 2020-10-14 富士通株式会社 プロセッサ、情報処理装置及びプロセッサの動作方法
US10810281B2 (en) * 2017-02-24 2020-10-20 Texas Instruments Incorporated Outer product multipler system and method
CN109997132B (zh) * 2017-05-17 2023-05-23 谷歌有限责任公司 低时延矩阵乘法部件
US10902087B2 (en) * 2018-10-31 2021-01-26 Advanced Micro Devices, Inc. Device and method for accelerating matrix multiply operations as a sum of outer products

Also Published As

Publication number Publication date
CN115552371A (zh) 2022-12-30
GB202007068D0 (en) 2020-06-24
GB2594971A (en) 2021-11-17
JP2023525811A (ja) 2023-06-19
US20230229730A1 (en) 2023-07-20
WO2021229232A1 (en) 2021-11-18
EP4150447A1 (en) 2023-03-22
GB2594971B (en) 2022-10-05

Similar Documents

Publication Publication Date Title
KR20230005393A (ko) 행렬 처리를 위한 가변 위치 시프트
US20220197637A1 (en) Exposing valid byte lanes as vector predicates to cpu
CN108205448B (zh) 具有在每个维度上可选择的多维循环寻址的流引擎
CN110073331B (zh) 复制元素指令
US9965275B2 (en) Element size increasing instruction
KR20220038581A (ko) 데이터 구조 프로세싱
JP7084882B2 (ja) 並べ替え動作を実行するための装置および方法
US20200050573A1 (en) Superimposing butterfly network controls for pattern combinations
CN109213525B (zh) 具有快捷起始指令的流式传输引擎
KR20230005389A (ko) 행렬 처리를 위한 행 또는 열 위치들의 마스킹
TWI759373B (zh) 複製元件指令
WO2023199015A1 (en) Technique for handling data elements stored in an array storage
WO2023242531A1 (en) Technique for performing outer product operations
GB2617828A (en) Technique for handling data elements stored in an array storage
WO2023148467A1 (en) Technique for performing memory access operations