KR100996888B1 - 앨리어싱 데이터 처리 레지스터 - Google Patents

앨리어싱 데이터 처리 레지스터 Download PDF

Info

Publication number
KR100996888B1
KR100996888B1 KR1020067011129A KR20067011129A KR100996888B1 KR 100996888 B1 KR100996888 B1 KR 100996888B1 KR 1020067011129 A KR1020067011129 A KR 1020067011129A KR 20067011129 A KR20067011129 A KR 20067011129A KR 100996888 B1 KR100996888 B1 KR 100996888B1
Authority
KR
South Korea
Prior art keywords
register
data
size
registers
different
Prior art date
Application number
KR1020067011129A
Other languages
English (en)
Other versions
KR20070001903A (ko
Inventor
사이먼 포드
데이빗 제임스 씨일
Original Assignee
에이알엠 리미티드
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 에이알엠 리미티드 filed Critical 에이알엠 리미티드
Publication of KR20070001903A publication Critical patent/KR20070001903A/ko
Application granted granted Critical
Publication of KR100996888B1 publication Critical patent/KR100996888B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3885Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units
    • G06F9/3887Concurrent instruction execution, e.g. pipeline, look ahead using a plurality of independent parallel functional units controlled by a single instruction for multiple data lanes [SIMD]
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30032Movement instructions, e.g. MOVE, SHIFT, ROTATE, SHUFFLE
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30036Instructions to perform operations on packed data, e.g. vector, tile or matrix operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30098Register arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/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/30105Register structure
    • G06F9/30109Register structure having multiple operands in a single register
    • 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
    • G06F9/30112Register structure comprising data of variable length
    • 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
    • G06F9/30123Organisation of register space, e.g. banked or distributed register file according to context, e.g. thread buffers
    • 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
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30181Instruction operation extension or modification
    • G06F9/30192Instruction operation extension or modification according to data descriptor, e.g. dynamic data typing
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/38Concurrent instruction execution, e.g. pipeline, look ahead
    • G06F9/3824Operand accessing
    • G06F9/3834Maintaining memory consistency
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F15/00Digital computers in general; Data processing equipment in general
    • G06F15/76Architectures of general purpose stored program computers
    • G06F15/82Architectures of general purpose stored program computers data or demand driven

Abstract

레지스터 데이터 저장소(20)가 데이터 처리 시스템(2) 내에 제공된다. 레지스터 데이터 저장소(20)는 레지스터를 통해 액세스될 수 있으며, 이를 위해 데이터 처리 명령어는, 레지스터 크기(Q, D), 및 상기 데이터 처리 명령어에 의해 조종될 다수의 SIMD 데이터 요소에 대한 데이터 요소 크기(S16, S8)를 지정한다. 소정의 데이터 처리 요소는, 레지스터 데이터 저장소(20) 내의 소정의 위치에 대한 데이터 요소 크기, 레지스터 크기, 및 레지스터 지정자 사이의 맵핑에 따라 상이한 레지스터를 통해 액세스될 수 있다.
레지스터 데이터 저장소, 데이터 요소, 액세스 로직.

Description

앨리어싱 데이터 처리 레지스터{ALIASING DATA PROCESSING REGISTERS}
본 발명은 데이터 처리 시스템 분야에 관한 것이다. 특히, 본 발명은, 레지스터를 사용하여 액세스가 이루어지는 레지스터 데이터 저장소를 포함하는 데이터 처리 시스템에 관한 것이다.
각각 32 비트 길이를 가진 16개의 레지스터와 같이 규정된 수의 일정한 길이를 가진 레지스터를 포함하는 레지스터 뱅크를 갖는, 영국 캠브리지의 ARM Limited에 의해 설계된 ARM 프로세서 코어와 같은 데이터 처리 시스템이 공지되어 있다. 상기 레지스터에 저장된 데이터 값은 적절한 판독 명령어에 의해 레지스터로부터 판독될 수 있다. 상기 레지스터에 기록하는 명령어 및 상기 레지스터로부터 판독하는 명령어는 동일한 방식으로, 예컨대 동일한 레지스터 번호/이름을 사용하여 관련된 소정의 레지스터를 지정하게 된다.
동영상 데이터를 처리하는 동안과 같이, 대용량 데이터에 처리 연산을 수행할 수 있는 데이터 처리 시스템에 대한 요구가 증가함에 따라, 일반적으로 SIMD(single instruction multiple data)라 하는 처리 기술이 개발되어왔다. 이러 한 기술을 이용하면, 화소 성분 값과 같은 다수의 개별적인 데이터 요소를 포함하는 레지스터가 병렬로 그 레지스터 내의 모든 데이터 요소에 이용되는 처리 명령어를 받는다. 일례로, 화소의 성분 값을 소정의 크기조정 인수로 곱하는 것이 바람직할 수도 있어, SIMD 명령어는, 상이한 데이터 요소 각각에 개별적으로 크기조정 값을 적용하는 단일 명령어에 응답하여 발생시키도록 제어할 수 있다. 이러한 시스템에서, 데이터 요소는, 그들에게 수행되는 처리가 동일한 레지스터 내에 보유된 다른 데이터 요소에 부적절하게 영향을 미치는 것이 허용되지 않는다는 점에서 서로 분리된다는 것을 이해할 것이다.
SIMD 처리 기술이 다수의 원하는 연산을 병렬로 실행하는 것을 허용하지만, 이 기술은 일반적으로, SIMD 명령어가 실행될 수 있기 전에 SIMD 레지스터 내의 필요한 위치로 데이터 요소를 배열하는 시간 및 처리 주기를 소비할 필요가 있다는 큰 단점이 있다. 불리하게도, 이러한 조건은 SIMD 연산에 의해 얻어지는 이점을 감소시킨다.
또한, 단일 벡터 데이터 처리 명령어에 응답하여 시분할된 시퀀스의 데이터 처리 연산을 실행하는 데이터 처리 시스템을 제공하는 것이 공지되어 있다. 이러한 벡터 데이터 처리 시스템의 일례로는 영국 캠브리지의 ARM Limited에 의해 설계된 VFP(vector floating point) 코프로세서가 있다. 상기 벡터 코프로세서는 단일 벡터 명령어를 사용하여, 먼저 연산이 수행될 하나의 레지스터 세트를 선택하고, 상기 연산을 수행하며, 다음 레지스터 세트를 선택하여 다시 상기 연산을 수행하는 등의 방식으로 동작한다. VFP 프로세서는 이러한 조종에 사용하기 위해 각자의 레 지스터 데이터 저장소를 구비한다. 레지스터 데이터 저장소는, 짧은 단정밀도 부동 소수점 값을 각각 보유하는 짧은 레지스터, 또는 긴 배정밀도 값을 각각 보유하는 더 적은 수의 긴 레지스터 중 어느 한 가지로 분리될 수 있다. 명령어는 단정밀도 값 또는 배정밀도 값 중 어느 하나에 별도의 연산을 허용한다.
제1 관점에서, 본 발명은 데이터를 처리하기 위한 장치를 제공하며, 상기 장치는:
복수의 데이터 요소를 저장하도록 동작할 수 있는 레지스터 데이터 저장소로서, 상기 레지스터 저장소내의 레지스터가 상기 데이터 요소들의 데이터 요소 크기에 따른 다수의 데이터 요소들을 유지하는 데이터 저장소와,
데이터 처리 명령어에 응답하여, 상기 레지스터 데이터 저장소의 상기 레지스터로서 액세스되는 선택된 복수의 데이터 요소에 병렬로 데이터 처리 연산을 수행하고 상기 레지스터 내의 병렬 처리의 상이한 레인을 채우는 처리 로직을 포함하는 데이터 처리 장치로서,
상기 선택된 복수의 데이터 요소의 데이터 요소는 복수의 상이한 데이터 요소 크기 중 하나를 공유하고, 상기 레지스터는 복수의 상이한 레지스터 크기 중 하나를 가지며, 상기 데이터 처리 명령어는, 상기 데이터 처리 연산에 대해 상기 복수의 상이한 데이터 요소 크기들 중에서 상기 선택된 복수의 데이터 요소들에 의해 공유된 데이터 요소 크기 및 상기 레지스터의 레지스터 크기를 지정하며,
상기 장치는,
상기 레지스터의 상기 레지스터 크기에 따라 상기 레지스터를 상기 레지스터 데이터 저장소의 일부로 맵핑하여, 상기 레지스터 데이터 저장소의 상기 부분 내에 저장된 데이터 요소가 상이한 레지스터 크기의 각각의 상이한 레지스터의 일부로서 액세스될 수 있도록 동작할 수 있는 레지스터 액세싱 로직을 더 포함한다.
본 발명은, 명령어가 데이터 요소 크기 및 레지스터 크기를 지정하도록 허용되며, 레지스터 크기에 따라 소정의 레지스터를 레지스터 데이터 저장소의 일부로 맵핑하는 레지스터 액세싱 로직이 제공될 경우, 레지스터 데이터 저장소 내에 저장된 SIMD 데이터 요소가 더 유연성 있게 액세스될 수 있으며, 따라서 전용 데이터 재배열 연산에 대한 필요성이 감소된다는 것을 인정한다. 따라서, 각각의 데이터 요소는 소정의 레지스터 크기의 한 레지스터의 내용의 일부로서 레지스터 데이터 저장소 내의 소정의 지점으로 기록될 수 있지만, 상이한 레지스터 크기 및 가능하다면 상이한 데이터 요소 크기를 갖는 상이한 레지스터의 일부로서 상기와 동일한 위치로부터 판독될 수 있다. 상이한 크기의 레지스터는, 상기 데이터 요소를 재배열하는데 오버헤드를 발생시키지 않고 데이터 요소에 대한 매우 유연성 있는 액세스를 허용하는 방식으로 서로의 상부에 효과적으로 앨리어스(aliase)된다.
데이터 처리 명령어가 하나 이상의 소스 레지스터 및/또는 하나 이상의 목적지 레지스터를 지정할 수도 있다는 것을 이해할 것이다. 이와 같은 상이한 소스 및 목적지 레지스터의 레지스터 크기와 데이터 요소 크기는 데이터 처리 명령어에 의해 개별적으로 지정될 수도 있다. 선택적으로, 레지스터 크기와 요소 크기 사이에 소정의 관계를 필요로 함으로써, 명령어 인코딩 공간이 절약될 수도 있다. 이러한 관계는, 유연성이 부당하게 감소되지 않도록 통상적으로 접하게 되는 목표가 될 수 있다.
본 기술의 특히 이로운 이용은, 목적지 데이터 요소 크기가 소스 데이터 요소 크기와 상이한 것이다. 이러한 상황은 통상적으로, 예컨대 두 개의 n-비트 수를 함께 곱한 결과 2n-비트 결과가 얻어지는 처리 연산의 결과로서 데이터 폭이 증가하게 되는 SIMD 처리 연산에서 발생한다. 본 기술에 의해 제공되는 레지스터 액세싱의 유연성으로 인해, 단일 명령어를 이용하고 충분한 결과가 얻어지게 하면서, 데이터 요소 크기와 레지스터 크기에 있어서의 상기와 같은 차이가 수용될 수 있다.
앨리어싱 기술의 유용성의 다른 통상적인 예는, 두 개의 개별적인 레지스터의 일부로서 레지스터 저장소에 기록된 데이터 요소가 하나의 상이한 레지스터의 일부로서 레지스터 데이터 저장소로부터 동시에 판독될 수 있을 때이다. 반대로, 단일 레지스터의 일부로서 레지스터 데이터 저장소에 기록된 데이터 요소는 두 개의 상이한 다른 레지스터의 일부로서 레지스터 데이터 저장소로부터 개별적으로 판독될 수 있다. 이와 같은 유형의 동작은, 레지스터 데이터 저장소 내에서의 데이터 재배열에 대한 필요성을 없애는 것을 돕기 때문에, 소프트웨어 라이터(software writer) 및 소프트웨어 컴파일러에 의해 사용되어 높은 코드 밀도와 신속한 처리를 생성할 수 있다.
소스 레지스터 크기와 목적지 레지스터 크기 사이의 특히 유용한 관계는, 이들이 모두 동일한 경우, 소스 레지스터 크기가 목적지 레지스터 크기의 절반인 경우, 및 소스 레지스터 크기가 목적지 레지스터 크기의 두 배인 경우이다. 이들 관계는 명령어 내에서 효과적으로 인코딩될 수 있으며, 실재 프로그래밍에서 공통적이며 유용하다는 이점이 있다. 하나 또는 두 개의 레지스터가 존재할 수도 있다.
바람직한 실시예는, 데이터 처리 명령어 내의 이용가능한 비트 공간에 의해 제약을 받으며, 레지스터 크기 및 데이터 요소 크기에 따라 레지스터 데이터 저장소의 상이한 부분으로 맵핑하는 레지스터 지정 필드 세트를 사용한다. 이러한 상이한 부분은 레지스터 데이터 저장소 내에서 연속적인 부분이 되도록 배열되는 것이 유리하다. 따라서, 고정된 수의 작은 데이터 요소 모두가, 상기 레지스터 크기 및 상기 데이터 요소 크기의 레지스터에 대해 액세스될 수 없는 레지스터 데이터 저장소의 나머지와 함께 레지스터 데이터 저장소의 하나의 연속적인 부분에 저장되게 된다. 반대로, 큰 레지스터 크기 및 데이터 요소 크기 값을 가질 자격이 주어질 때 상기와 동일한 레지스터 지정자는 더 많은 양의 레지스터 데이터 저장소에 확산되게 된다. 이러한 유형의 맵핑은 또한, 레지스터 데이터 저장소 내에 상이한 양의 저장 용량을 제공하도록 각기 다른 실시예에 대해 유연성을 허용하며, 또한 이것이, 더 작은 레지스터 데이터 저장소에 대해 기록되는 지원 레거시 코드(legacy code) 및 동일한 형태를 기본적으로 갖는 데이터 처리 명령어에 의해 다루어질 수 있게 한다. 또한, 레지스터 지정자에 의해 소비되는 명령어 비트 공간은 일정하게 유지된다.
바람직한 실시예에 있어서, 상기 데이터 처리 명령어는 상기 레지스터의 레지스터 번호를 인코딩하는 복수의 비트를 포함하며, 상기 복수의 비트는, 상기 레지스터 번호를 형성하도록 상기 레지스터 크기에 따라 다수의 비트 위치에 의해 순환할 수 있는 비트의 연속 필드로 맵핑될 수 있다. 이러한 인코딩은, 레지스터 크기의 변화에도 불구하고 레지스터 필드에 대한 더욱 간단하고 신속한 디코딩을 허용하는 이점이 있다.
다른 관점에서, 본 발명은 데이터를 처리하는 방법을 제공하며, 상기 방법은:
레지스터 데이터 저장소 내에 복수의 데이터 요소를 저장하는 단계로서, 상기 레지스터 저장소내의 레지스터가 상기 데이터 요소들의 데이터 요소 크기에 따른 다수의 데이터 요소들을 유지하는 단계와,
데이터 처리 명령어에 응답하여, 상기 레지스터 데이터 저장소의 상기 레지스터로서 액세스되는 선택된 복수의 데이터 요소에 병렬로 데이터 처리 연산을 수행하하고, 상기 레지스터 내의 병렬 처리의 상이한 레인을 채우는 단계를 포함하는데이터 처리 방법으로서,
상기 선택된 복수의 데이터 요소의 데이터 요소는 복수의 상이한 데이터 요소 크기 중 하나를 공유하고, 상기 레지스터는 복수의 상이한 레지스터 크기 중 하나를 가지며, 상기 데이터 처리 명령어는 상기 데이터 처리 연산에 대해, 상기 복수의 상이한 데이터 요소 크기들 중에서 상기 선택된 복수의 데이터 요소들에 의해 공유된 데이터 요소 크기 및 상기 레지스터의 레지스터 크기를 지정하며,
상기 방법은,
상기 레지스터 데이터 저장소의 일부에 저장된 데이터 요소가 상이한 레지스터 크기의 각각의 상이한 레지스터의 일부로서 액세스될 수 있도록, 상기 레지스터의 상기 레지스터 크기에 따라 상기 레지스터를 상기 레지스터 데이터 저장소의 일부로 맵핑하는 단계를 더 포함한다.
또한, 본 발명은 보완적인 관점에서, 상기 기술에 따라 레지스터 데이터 저장소를 액세스하는 데이터 처리 명령어를 포함하는 컴퓨터 프로그램을 포함하는 컴퓨터 프로그램 제품의 형태를 갖는 것으로 고려될 수도 있다.
본 발명은, 첨부 도면에 도시되어 있는 그 바람직한 실시예를 참조하여 예시를 통해서 더 상세히 설명되게 된다.
도 1은 통상적인 스칼라 데이터 처리 및 SIMD 데이터 처리 두 가지 모두를 지원하는 집적 회로를 개략적으로 나타내는 도면.
도 2는 SIMD 레지스터 데이터 저장소에 대한 판독 및 기록 포트 배열을 개략적으로 나타내는 도면.
도 3은 목적지 레지스터가 소스 레지스터의 폭의 두 배인 예시적인 SIMD 판독 및 기록 연산을 개략적으로 나타내는 도면.
도 4는 상이한 데이터 처리 연산에 대해 소스 레지스터 크기와 목적지 레지스터 크기 사이의 상이한 유형의 관계를 나타내는 도면.
도 5는 본 발명에 따라 데이터 처리 명령어를 정의하는데 사용될 수 있는 구문을 개략적으로 나타내는 도면.
도 6은 64-비트 레지스터와 128-비트 레지스터로서 본 SIMD 레지스터 데이터 저장소를 개략적으로 나타내는 도면.
도 7은 64-비트 레지스터와 128-비트 레지스터 사이의 오버랩("앨리어싱")을 개략적으로 나타내는 도면.
도 8은 상이한 크기의 SIMD 레지스터 내에 저장된 복수의 데이터 요소를 개략적으로 나타내는 도면.
도 9는 SIMD 벡터 레지스터 내에서의 스칼라 값의 참조를 개략적으로 나타내는 도면.
도 10은 처리 레인의 수와 데이터 요소 크기가 일정하게 유지되는 데이터 처리 명령어를 개략적으로 나타내는 도면.
도 11a 및 11b는 처리 레인의 수가 일정하게 유지되고 데이터 요소 크기가 변경되는 데이터 처리 명령어를 개략적으로 나타내는 도면.
도 12는 SIMD 레지스터 데이터 저장소와 스칼라 레지스터 데이터 저장소 사이에서의 데이터 전송을 나타내는 도면.
도 13, 14, 및 15는 다양한 레지스터 전송 명령어의 동작을 개략적으로 나타내는 도면.
도 16은 도 14 및 15에 도시된 유형의 레지스터 전송 명령어가 유용하게 이용될 수 있는 상황의 예를 나타내는 흐름도.
도 17은 일 실시예에 따라 데이터 요소가 메모리의 연속 블록으로부터 어떤 지정된 레지스터로 로드되는 방법을 개략적으로 나타내는 도면.
도 18은 실시예에 따라 메모리 내에 존재할 수도 있는 상이한 구조체의 예를 개략적으로 나타내는 도면.
도 19a 내지 19c는 일 실시예에 따른 단일 저장 명령어에 대한 소정의 예의 동작을 나타내는 도면.
도 20a 내지 20c는 일 실시예에 따른 단일 로드 명령어에 대한 소정의 예의 동작을 나타내는 도면.
도 21a 내지 21c는 일 실시예에 따른 단일 로드 명령어에 대한 다른 소정의 예의 동작을 나타내는 도면.
도 22a 내지 22c는 일 실시예에 따른 단일 로드 명령어에 대한 또 다른 소정의 예의 동작을 나타내는 도면.
도 23은 도 1의 재배열 로직 내에 제공되는 로직을 보다 상세히 나타내는 블록도.
도 24 내지 26은 실시예에 따른 단일 액세스 명령어의 네 가지 상이한 시퀀스에 대한 재배열 로직을 통한 데이터의 흐름을 나타내는 도면.
도 27은 공지된 폴딩 연산(folding operation)을 나타내는 도면.
도 28은 일 실시예의 폴딩 연산을 나타내는 도면.
도 29는 다른 실시예의 폴딩 연산을 나타내는 도면.
도 30a 내지 30d는 다양한 폴딩 명령어의 동작을 나타내는 도면.
도 31은 도 1의 SIMD 처리 로직 내에 제공되는 폴딩 연산을 수행하도록 배열되는 로직을 개략적으로 나타내는 도면.
도 32는 벡터-바이-스칼라(vector-by-scalar) 명령어의 동작을 나타내는 도면.
도 33은 도 1의 SIMD 레지스터 파일의 스칼라 오러팬드의 배열을 나타내는 도면.
도 34는 도 1의 SIMD 처리 로직 내에 제공되는 벡터-바이-스칼라 연산을 수행하도록 배열된 로직을 개략적으로 나타내는 도면.
도 35는 종래 기술에 따른 시프트 라이트(shifting right) 및 패킹 하이(packing high)의 방법을 나타내는 도면.
도 36은 본 기술의 일 실시예에 따른 시프트 라이트 및 좁히는(narrow) 연산을 개략적으로 나타내는 도면.
도 37은 본 기술에 따른 시프트 레프트 및 좁히는 연산을 개략적으로 나타내는 도면.
도 38은 본 발명의 일 실시예에 따른 캐스트 업 및 시프트 레프트를 개략적으로 나타내는 도면.
도 39는 상이한 양으로 데이터 요소를 시프트하는 것을 개략적으로 나타내는 도면.
도 40은 통상적인 멀티플렉서를 개략적으로 나타내는 도면.
도 41은 소스 값의 선택(a 또는 b)이 비트 단위의 원리로 수행되는 일 실시예를 개략적으로 나타내는 도면.
도 42는 소스 값의 선택(a 또는 b)이 데이터 요소 원리로 수행되는 선택적인 실시예를 개략적으로 나타내는 도면.
도 43은 본 기술에 의해 제공되는 세 개의 멀티플렉싱 명령어에 상응하는 멀티플렉서 배열의 세 가지 예를 개략적으로 나타내는 도면.
도 44는 엔디어니스(endianess) 모드에 따른 상이한 레이아웃에 다수의 데이터 요소를 저장하는 SIMD 레지스터를 개략적으로 나타내는 도면.
도 45는 제1 예에 따라 메모리 액세싱 로직 및 데이터 요소 재배열 로직의 동작을 개략적으로 나타내는 도면.
도 46은 제2 예에 따라 메모리 액세싱 로직 및 데이터 요소 재배열 로직의 동작을 개략적으로 나타내는 도면.
도 47은 보다 상세히 도 45 및 46의 데이터 요소 재배열 로직의 실시예를 개략적으로 나타내는 도면.
도 48은 테이블 레지스터(table register) 역할을 하는 두 개의 레지스터, 결과 레지스터, 및 인덱스 레지스터(index register)를 포함하는 레지스터 데이터 저장소를 개략적으로 나타내는 도면.
도 49는 테이블 검색 확장 명령어의 작용을 개략적으로 나타내는 도면.
도 50은 인덱스 레지스터 내의 인덱스 값이 다른 테이블 검색 확장 명령어에 의해 재사용되기 전에 인덱스 레지스터에 수행되는 처리를 개략적으로 나타내는 도면.
도 51은 범위를 벗어난 인덱스 값에 상응하는 장소의 결과 레지스터에 제로 값이 기록되는 테이블 검색 명령어의 동작을 개략적으로 나타내는 도면.
도 52는 일 실시예에 따라 도 1의 LSU가 메모리 시스템 및 메모리 관리부(Memory Management Unit)와 어떻게 결합되는지를 나타내는 도면.
도 53a 내지 53d는 일 실시예에 따라 액세스될 데이터 블록의 다양한 예를 개략적으로 나타내는 도면.
도 54a 및 54b는 일 실시예에 따라 액세스될 데이터 블록의 다른 예를 개략적으로 나타내는 도면.
도 55a 내지 55c는 각각 인터리브(interleave) 연산, 디-인터리브(de-interleave) 연산, 및 전치(transpose) 연산을 개략적으로 나타내는 도면.
도 56a 및 56b는 일 실시예에 따라 인터리브 및 전치 연산이 어떻게 수행되는지를 개략적으로 나타내는 도면.
도 57a 내지 57c는 일 실시예에 따른 명령어 시퀀스가 영상 화소의 배열을 전치시키는데 어떻게 사용될 수 있는지를 나타내는 도면.
도 58은 일 실시예의 명령어가 복소수의 실수부와 허수부를 인터리브하는데 어떻게 사용될 수 있는지를 나타내는 도면.
도 59a 및 59b는 일 실시예에 따른 두 명령어의 시퀀스가 두 개의 복소수의 곱셈을 병렬로 수행하는데 어떻게 사용될 수 있는지를 나타내는 도면.
도 60은 가산 리터닝 하이 하프(add returning high half) 연산 및 그 관련 명령어를 개략적으로 나타내는 도면.
도 61은 라운딩을 이용한 가산 리터닝 하이 하프 연산 및 그 관련 명령어를 개략적으로 나타내는 도면.
도 62는 감산 리터닝 하이 하프 연산 및 그 관련 명령어를 개략적으로 나타내는 도면.
도 63은 데이터부, adcdefgh, 및 그와 관련된 제어부를 가진 명령어로부터 발생될 수 있는 상수의 표를 나타내는 도면.
도 64는 상수 생성 로직을 나타내는 도면.
도 65는 상수 생성 로직을 가진 데이터 프로세서를 나타내는 도면.
도 66a 및 66b는 생성된 상수를 가진 두 가지 유형의 명령어에 대한 데이터 프로세서 응답을 개략적으로 나타내는 도면.
도 67은 본 기술에 따른 비트 마스크의 생성을 나타내는 도면.
도 1은 스칼라 데이터 처리 기능 및 SIMD 데이터 처리 기능 두 가지 모두를 포함하는 데이터 처리 시스템(집적 회로)(2)을 개략적으로 도시한다. 스칼라 데이터 처리부는 스칼라 레지스터 데이터 저장소(4), 곱셈기(6), 시프터(8), 가산기(10), 명령어 파이프라인(12), 및 스칼라 디코더(14)는 물론, 명료하게 하기 위해 도시되지 않은 다수의 다른 회로 요소를 포함하는 표준 ARM 프로세서 코어라 할 수 있다. 동작시, 상기 스칼라 프로세서 코어는 일정한 길이의 32-비트 데이터 값을 스칼라 레지스터 데이터 저장소(4) 내에 저장하고, 명령어 파이프라인(12)을 지나 스칼라 디코더(14)에 공급된 데이터 처리 명령어의 제어하에 곱셈기(6), 시프터(8), 및 가산기(10)를 사용하여 상기 값을 조종한다. 스칼라 디코더(14)는 통상적인 방법으로 스칼라 처리 요소의 동작을 제어하는 제어 신호를 생성한다.
도 1에 도시되어 있는 바와 같이, 집적 회로(2)는 SIMD 레지스터 데이터 저장소(20), 전용 SIMD 처리 로직(18), 및 재배열 로직(24)을 포함하는 다양한 전용 SIMD 처리 요소를 포함한다. 로드 저장부(22)는 스칼라 부분과 공유되며, 스칼라 프로세서 내에서 통상적으로 발견되는 동일하거나 또는 변형된 형태의 로드 저장부일 수 있다.
명령어 파이프라인(12)은 전용 SIMD 디코더(16)를 통해 SIMD 처리 연산을 제어하는 역할을 하는 추가 파이프라인 단을 이용하여 확장된다. (다른 실시예에서 SIMD 파이프라인이 스칼라 파이프라인과 병렬로 제공될 수도 있다는 것을 이해할 것이다.) SIMD 디코더(16)는, 원하는 데이터 처리 연산을 수행하기 위해 SIMD 레지스터의 판독, SIMD 레지스터의 기록, 및 SIMD 처리 로직의 구성과 같은 SIMD 처리 요소의 동작을 제어하는 SIMD 제어 신호를 발생시킨다. 스칼라 단의 뒤에 SIMD 파이프라인 단이 이어짐으로써, 프로세서의 SIMD 부분이 스칼라 부분에 대해 실질적으로 상이한 실행 위치를 보이는 결과나 나타난다. 이것은, 이하에 논의되는 바와 같이 어떤 인터로킹(interlocking)을 필요로하는 결과를 가져올 수 있다.
재배열 로직(24)은 원하는 SIMD 처리 연산에 더 적합한 순서로 집적 회로(2)에 결합된 메모리(도시되지 않음)로부터 검색되는 데이터 요소를 재배열하는 용도의 역할을 한다. 상기 재배열 로직(24), 그 동작, 및 장점은 이하에 더 상세히 설명되게 된다. 또한, 로드 저장부(22)와 재배열 로직(24) 사이에 로드 및 저장 FIFOs(23 및 23')가 제공된다.
상기 예에서, 스칼라 레지스터 데이터 저장소(4)는 통상적인 16개의 32-비트 ARM 레지스터와 같이 일정한 수의 일정 길이의 레지스터로 분리되는 것으로 여겨질 수 있다. 대조적으로, SIMD 레지스터 데이터 저장소(20)는 관련 SIMD 데이터 처리 명령어과 관련된 파라미터에 따라 유연성있게 어드레스/액세스될 수 있는 저장 블록을 제공한다. 보다 상세히 설명하면, SIMD 데이터 처리 명령어는 데이터 처리 명령어와 관련된 소스 및 목적지 레지스터 수, 데이터 요소 크기, 및 레지스터 크 기를 지정한다. 이들 파라미터는 SIMD 디코더(16) 및 레지스터 데이터 저장소(20)의 판독/기록 포트에 의해 함께 결합되어, 상이한 부분 및 그에 따른 SIMD 레지스터 데이터 저장소(20) 내에 저장된 데이터 요소를 액세스되고 있는 레지스터에 맵핑하는 것을 제어한다. 따라서, 상이한 크기, 상이한 데이터 요소 크기 등의 SIMD 레지스터가 실제로 함께 앨리어스될 수 있다(즉, 이들 레지스터는 원하는 바에 따라 상이한 레지스터 지정자, 레지스터 크기, 및 데이터 요소 크기 조합을 통해 오버랩핑하고 액세스될 수 있는 것으로 여겨질 수 있다. SIMD 디코더(16) 및 판독/기록 포트가 상기 실시예에서 레지스터 액세싱 로직을 제공하는 것으로 여겨질 수 있다).
도 2는 SIMD 레지스터 데이터 저장소(20)에 제공될 수 있는 판독 및 기록 포트 배열을 개략적으로 도시한다. 상기 예에서는, 32개의 SIMD 레지스터가 SIMD 데이터 처리 명령어 내의 레지스터 지정 필드(5 비트)에 의해 지정될 수 있다. N 판독 포트는 SIMD 레지스터 데이터 저장소(20)와 연결된다. 지원되는 최소 입도(granularity)는 64-비트 레지스터 값이다. 상기 예에서, 직접 지원되는 레지스터 크기는 64-비트와 128-비트이다. 당업자들에게는, 이러한 배열이 직접적으로, 또는 더 작은 크기의 레지스터를 이용하여 지원되는 명령어를 사용하여 합성에 의해 간접적으로 256-비트 및 그 보다 높은 레지스터 크기를 지원하도록 크기조정될 수 있다는 것이 명백하다. 도 2는 SIMD 레지스터 데이터 저장소(20)로의 기록 포트 역할을 하는 M 개의 디-멀티플렉서를 개략적으로 도시한다. 실제로 상기 디-멀티플렉서는 원하는 입력을 이들의 목적지로 경로지정하는 멀티플렉서의 작용과 함 께, 적절히 유도된 인에이블 신호의 형태로 SIMD 레지스터 데이터 저장소 내의 저장 요소 열로 제공된다는 것을 이해할 것이다.
도 3은, 다수의 데이터 요소를 각각 포함하는 두 개의 64-비트 SIMD 레지스터 값(D 더블 워드(double word)로 표시됨)이 함께 곱해져, 128-비트 레지스터(Q 쿼드 워드(quad word)로 표시됨)에 함께 저장되는 다수의 출력 데이터 요소를 발생시키는 소정의 예를 도시한다. 개별적인 판독 포트가 SIMD 레지스터 데이터 저장소(20)로부터 소스 SIMD 레지스터 값(D1 및 D2)을 판독하도록 배열된다. 두 개의 기록 포트는 함께 동작하여, 각각 128-비트 결과의 제1 Q[63:0] 부분과 제2 Q[127:64] 부분이 SIMD 레지스터 저장소(20)로 다시 기록될 수 있게 한다. D 레지스터 및 Q 레지스터 내의 데이터 요소 크기가 변화할 수 있다는 것을 이해할 것이다. 예컨대, 4 개의 16-비트 데이터 요소가 각각의 소스 D 레지스터에 포함될 수 있으며, 목적지 Q 레지스터가 곱셈의 결과인 상응하는 4 개의 32-비트 데이터 요소 세트를 포함한다. 상기 예에서는, 병렬 처리 레인의 수(4)가 일정하게 유지되는 한편, 데이터 요소 크기가 곱셈 연산이 수행됨으로써 요구된 바와 같이 16-비트에서 32-비트로 증가된다는 것을 알 수 있다.
도 4는 지원될 수 있는 소스 레지스터 크기와 목적지 레지스터 크기 사이의 다양한 상이한 유형의 관계를 도시한다. 제시된 가장 위의 예에서는, 병렬 처리 레인의 수가 일정하게 유지되고, 데이터 요소 크기가 일정하게 유지된다. 제2 및 제4 예에서는, 병렬 처리 레인의 수가 일정하게 유지되지만, 데이터 요소 크기가 소스와 목적지 사이에 변경된다. 제3 예에서는, 두 개의 소스 요소가 상이한 데이 터 요소 크기를 갖는다. 본 시스템의 SIMD 처리 구조체 및 기술은 이하에 또한 기재되어 있는 바와 같이 상기와 같이 상이한 유형의 데이터 처리 명령어를 지원한다. 마지막 세 개의 예는 단일 입력 변수를 갖는 단항 연산(unary operation)이다. 제5 예는 동일한 데이터 요소 크기를 유지한다. 제6 예는 데이터 요소 크기를 두 배로 하며, 제7 예는 데이터 요소 크기를 절반이 되게 한다.
도 5는 SIMD 데이터 처리 명령어의 구문을 도시한다. 구문의 제1 부분은 관련된 SIMD 연산자, 상기의 경우 곱셈 연산을 지정한다. 그 다음에는, 출력 데이터 요소 크기, 및 출력 데이터 요소의 다른 특성을 나타내는 필드가 이어진다. 상기 예에서, 출력 데이터 요소는 16-비트 길이이며, 부호있는 정수이다. 다음 필드는 입력 데이터 요소 크기 및 특성을 나타내며, 상기의 경우 부호있는 8-비트 정수를 나타낸다. 그 다음 필드는 목적지 레지스터 크기 및 레지스터 지정자를 나타낸다. 상기 예에서는, 레지스터 지정자(12)를 가진 128-비트 쿼드 워드 SIMD 레지스터가 목적지 SIMD 레지스터로 사용되게 된다. 두 개의 소스 SIMD 레지스터는 각각 "1"과 "4"인 레지스터 지정자를 각각 갖는 더블 워드 64-비트 레지스터이다. 이하, 구문에 대한 다른 정보가 설명된다.
상이한 데이터 포맷을 표현하기 위한 데이터 유형 세트가 정해진다. 이들은 표 0에 기재되어 있다. 대부분의 명령어는 적어도 하나의 데이터 유형 수식어를 사용하여 정확한 연산을 판정한다. 그러나, 연산이 반드시 모든 데이터 유형을 지원하지는 않는다. 데이터 유형은 데이터 요소 크기와 특성을 나타내는 필드에 서픽스(suffix)로서 첨부된다.
[표 0]
데이터 유형 수식어 설명
.<size> <size> 비트의 임의의 요소
.I<size> <size> 비트의 부호가있는 또는 부호가없는 모듈로 정수
.F<size> <size> 비트의 부동 소수점 수
.P<size> <size> 보다 낮은 차수의 {0,1} 이상의 다항식
.S<size> <size> 비트의 부호가있는 정수
.U<size> <size> 비트의 부호가 없는 정수
도 6은, SIMD 레지스터 데이터 저장소(20)가 어떻게 32 개의 64-비트 레지스터 또는 16 개의 128-비트 레지스터로 분리되는 것으로 보일 수 있는지를 도시한다. 이들 레지스터는 동일한 물리적 SIMD 레지스터 데이터 저장소(20)에 맵핑함으로써, 함께 앨리어스한다. 예컨대, 레지스터(D0) 내의 데이터 요소가 또한 레지스터(Q0) 내의 데이터 요소로서 액세스될 수도 있다.
도 7은 64-비트 레지스터와 128-비트 레지스터 사이의 오버랩을 개략적으로 도시한다. 나타나있는 바와 같이, 128-비트 레지스터(Q(n))는 두 개의 64-비트 레지스터(D(2n+1) 및 D(2n))에 상응한다.
도 8은 상이한 크기의 SIMD 레지스터 내에 저장될 수 있는 예시적인 데이터 요소를 개략적으로 도시한다. 도 8의 상부에는, 128-비트 SIMD 레지스터가 4 개의 32-비트 데이터 요소 또는 8 개의 16-비트 데이터 요소 중 어느 하나로 도시되어 있다. 데이터 요소는 부호가있거나 부호가없는 정수, 부동 소수점 수, 또는 수행될 병렬 처리에 바람직하며 적합한 다른 포맷의 수일 수 있다.
도 8의 하부는 두 개의 부호있는 32-비트 정수 또는 네 개의 부호없는 16-비트 정수 중 어느 하나를 포함할 수 있는 64-비트 SIMD 레지스터를 도시한다. 다수 의 다른 가능성이 이용될 수 있으며, 이것이 당업자들에게는 자명할 것이다.
도 9는 SIMD 레지스터 내의 개별적인 스칼라 값이 참조되는 방법을 개략적으로 도시한다. 도시된 SIMD 레지스터(26)는 네 개의 부호있는 정수 값을 포함한다. 상기 SIMD 레지스터가 레지스터(Dn)이라 하면, 상이한 각각의 부호있는 정수 값은 Dn[3] 내지 Dn[0]으로 표시될 수 있다. SIMD 레지스터 내의 개별적인 데이터 요소에 대한 상기와 같은 참조는, 예컨대 SIMD 레지스터 내의 데이터 요소 중 하나를 선택하여, 이것을 스칼라 레지스터 데이터 저장소(4) 내의 레지스터 중 한 레지스터로 또는 상기 한 레지스터로부터 이동시키는 레지스터 전송 명령어를 수행할 때 사용된다.
도 10은, 두 개의 소스 레지스터와 목적지 레지스터 사이에 처리 레인의 수를 일정하게 유지하고 데이터 요소 크기를 일정하게 유지하면서 SIMD 데이터 처리 명령어가 어떻게 수행될 수 있는지를 도시한다. 상기 예에서, 소스 SIMD 레지스터는 네 개의 병렬 처리 레인을 가진 D 레지스터(64 비트이며, 네 개의 16-비트 데이터 요소를 포함함)이다. 목적지 SIMD 레지스터 역시 네 개의 결과 16-비트 데이터 요소 값을 포함하는 64-비트 D 레지스터이다.
도 10과 대조적으로, 도 11a는, 목적지 SIMD 레지스터가 소스 SIMD 레지스터 폭의 두 배인 예를 도시한다. 병렬 처리 레인의 수는 일정하게 유지되지만, 데이터 요소 크기가 두 배가 된다. 이러한 유형의 동작은 승산, 가산, 감산, 및 시프트(특히 레프트 시프트)와 같은 SIMD 연산에 사용하기에 적합하다. 도 11b는, 목적지 SIMD 레지스터가 소스 SIMD 레지스터 폭의 절반인 예를 도시한다. 이러한 유 형의 명령어는 가산 및 시프트(특히 라이트 시프트)에 유용하다.
처리 레인의 수를 유지하면서 소스와 목적지 사이의 데이터 요소 크기를 변경할 수 있게 하면, 수행되는 데이터 처리 연산에 의해 발생되는 데이터 요소 크기의 변경으로 인해 명령어의 데이터 요소 재배열 또는 두 배화할 필요없이 SIMD 데이터 처리 명령어 시퀀스가 형성될 수 있다. 이것은 처리 속도, 코드 밀도, 전력 소비 등에 있어서 상당한 이점이다.
도 12는 레지스터 전송 로직(28)에 의해 함께 결합되는 스칼라 레지스터 데이터 저장소(4)와 SIMD 레지스터 데이터 저장소(20)를 개략적으로 도시한다. 스칼라 디코더(14) 또는 SIMD 디코더(16) 중 어느 하나이거나 그 두 가지 모두로부터 수신된 제어 신호는, 명령어 파이프라인(12) 내의 레지스터 전송 명령어에 응답하여 레지스터 전송 로직(28)을 제어하여, 스칼라 레지스터 데이터 저장소(4) 내의 지정된 레지스터와 SIMD 레지스터 데이터 저장소(20)의 지정된 레지스터 내의 지정된 위치 사이에 데이터를 이동시킨다. 스칼라 레지스터에서 SIMD 레지스터로 이동하는 데이터 값은 또한 도 13에 도시되어 있는 바와 같이 SIMD 레지스터 내의 모든 위치로 복제될 수도 있다. 복제를 이용한 이러한 유형의 레지스터 전송 명령어는, SIMD 처리 로직(18)에 의해 SIMD 레지스터 내의 다른 상이한 오퍼랜드에 첨부될 필요가 있는 크기조정 값과 같은 값으로 SIMD 레지스터 내의 모든 처리 레인을 신속하게 채우는데 매우 적합하다.
도 14는 상이한 유형의 레지스터 전송 명령어를 도시한다. 상기 예에서는, 32-비트 스칼라 값(A)이 SIMD 레지스터 내의 지정된 위치(레인)로 이동한다. 다른 레인은 그들의 원래의 값을 유지한다. 스칼라 값이 전체 스칼라 레지스터에 걸쳐 복제되지 않는다. 목적지 스칼라 레지스터 내의 위치는 레지스터 전송 명령어 내의 적절한 필드 값에 의해 변경될 수 있다. 이러한 유형의 동작은 SIMD 레지스터 내의 개별적인 데이터 요소가 스칼라 레지스터 데이터 저장소로부터 얻어진 데이터 값으로 채워질 수 있게 한다.
도 15는 또 다른 유형의 레지스터 전송 명령어를 도시한다. 상기 예에서는, SIMD 레지스터 내의 16-비트 데이터 요소가 그 SIMD 레지스터 내의 지정된 변수 위치로부터 얻어져, 스칼라 레지스터 중 하나로 복사된다. 스칼라 레지스터가 32-비트 레지스터이므로, 상기 예에서 데이터 요소는 부호 확장된다. 상기 대신 데이터 요소는 소정의 알고리즘 또는 시스템의 조건에 따라 제로 확장될 수 있다.
도 16은, 도 14 및 도 15의 레지스터 전송 명령어가 유리하게 이용될 수 있는 예시적인 처리 유형을 개략적으로 도시하는 흐름도이다. 단계 30에서, 각자의 데이터 요소를 각각 포함하는 다수의 레인에서 병렬로 어떤 SIMD 처리가 수행된다.어떤 시점에, 상기 처리는 SIMD 처리 로직(18)에 의해 지원되지 않거나 또는 단지 비효율적으로 지원될 수 있는 데이터 조종이 수행될 것을 필요로 한다. 이러한 상황에서는, 각각의 데이터 요소가 스칼라 처리 시스템에 걸쳐 개별적으로 이동하여 상기와 같은 복잡한 데이터 연산이 수행될 수 있게 하는 것이 바람직하다. 단계 32는 상기와 같이 이동할 제1 데이터 요소를 선택한다. 그런 다음, 단계 34가 도 15에 도시된 바와 같은 레지스터 전송 명령어를 실행한다. 단계 36은 시스템의 스칼라 부분의 현재의 개별적인 데이터 요소에 원하는 복잡한 처리를 실행한다. 이 러한 복잡한 처리가 완료되면, 단계 38은 도 14에 도시된 바와 같은 레지스터 전송 명령어를 실행하여, 변형된 데이터 요소를 다시 그것의 원래 위치로 리턴시킨다. 단계 40은, 마지막 데이터 요소에 도달했는지 여부를 판정하고, 만일 도달하지 않았다면, 단계 42가 단계 34로 처리를 복귀하기 전에 다음 데이터 요소를 선택한다. 복잡한 동작이 수행될 것을 요청한 모든 데이터 요소가 스칼라 시스템으로 이동하여, 원하는 처리가 수행되고, 다시 SIMD 시스템으로 이동하였다면, 상기 처리는 단계 40에서 단계 44로 진행하며, 상기 단계 44에서 병렬 SIMD 처리가 재개된다.
레지스터 데이터 저장소를 액세스하는 SIMD 레지스터를 지정하는 데이터 처리 명령어는 액세스될 레지스터의 레지스터 번호를 인코딩하는 하나 이상의 레지스터 필드를 포함한다. 사용되는 5-비트 레지스터 지정자는 ARM 벡터 부동소수점(Vector Floating Point:VFP)부에 의해 사용된 것과 동일하도록, 즉 레지스터를 지정하는 명령어가 다음과 같도록 설계된다:
* 목적지 레지스터의 경우:
D = bit[22]
Rd = bits[15:12]
* 제1 소스 레지스터 지정자의 경우:
N = bit[7]
Rn = bits[19:16]
* 제2 소스 레지스터 지정자의 경우:
m = bit[5]
Rm = bits[3:0]
또한, 상기 비트의 사용은, VFP가 배정밀도(double precision) 및 단정밀도(single-precision) 레지스터를 각각 지정하는 것과 일치하게 Di 레지스터 및 워드 스칼라가 인코딩하도록 선택되며, Qi 레지스터 및 반워드(halfword) 스칼라에 대한 인코딩이 상기와 동일한 원리를 따른다. 이하, (D, Rd)가 어떻게 사용되는지 설명된다; (N, Rn) 및 (M, Rm)이 유사하게 사용된다:
Qd: Qi 레지스터 번호는 (D,Rd[3],Rd[2],Rd[1])이다
상응하는 Di 레지스터 번호는 (D,Rd[3],Rd[2],Rd[1],0), 및 (D,Rd[3],Rd[2],Rd[1],1)이다
Rd[0]은 제로이다
Dd: Di 레지스터 번호는 (D,Rd[3],Rd[2],Rd[1],Rd[0])이다
워드 스칼라:
Di 레지스터 번호는 (0,Rd[3],Rd[2],Rd[1],Rd[0])이다
워드[D]는 리틀-엔디언(little-endian) 원리로 레지스터로부터 선택된다
반워드 스칼라:
Di 레지스터 번호는 (0,0,Rd[2],Rd[1],Rd[0])이다
반워드[(D,Rd[3])]는 리틀-엔디언 원리로 레지스터로부터 선택된다.
바이트 스칼라:
Di 레지스터 번호는 (0,0,0,Rd[1],Rd[0])이다
바이트[(D,Rd[3],Rd[2])]는 리틀-엔디언 원리로 레지스터로부터 선택된다.
따라서, 비트(D, Rd[3], Rd[2], Rd[1], 및 Rd[0])는 레지스터 번호에 대한 레지스터 크기에 의존하는 다수의 비트 위치에 의해 순환할 수 있는 5-비트의 연속 필드에 맵핑된다고 할 수 있다. 실제로, 레지스터 인코딩 비트는 개별적인 동작으로서 맵핑되거나 순환하지 않고, 레지스터 액세스 로직에 공급되어, 행 및 부분 열 주소 역할을 하기에 올바른 비트 부분을 선택하기 위해 레지스터 크기에 따라 이동가능한 마스크가 이용되도록 하여 레지스터 데이터 저장소를 액세스하는 행 주소 및 열 주소를 형성한다.
실시예에 따르면, SIMD 레지스터 파일(20)(도 1 참조)과 메모리 사이에 데이터를 이동시키기 위한 로드 및 저장 명령어가 제공된다. 로드 명령어는 메모리로부터 지정된 레지스터로 데이터 요소를 로드하는데 사용될 수 있는 반면, 저장 명령어는 지정된 레지스터로부터 메모리로 데이터 요소를 저장하는데 사용된다. 상기 로드 및 저장 명령어는 SIMD 처리 로직(18)을 사용하는 알고리즘에 의해 요구되는 데이터 이동을 지원하도록 설계된다. 실시예의 로드 및 저장 명령어는, 이들이 로드하고 저장하는 데이터 요소의 크기를 지정하며, 이러한 정보는 메모리 시스템 의 엔디어니스에 관계없이 레지스터 내에 일관된 순서를 제공하는데 사용된다.
실시예의 로드 및 저장 명령어에 의해, 다수의 데이터 요소가 메모리의 연속 블록으로부터 SIMD 레지스터 파일(20)로 로드되거나 상기 SIMD 레지스터 파일로부터 저장될 수 있다. 일 실시예에 따르면, 액세스가 임의의 바이트 정렬로 수행될 수 있으며, 최대 32 바이트를 로드하거나 저장할 수 있다.
실시예의 로드 및 저장 명령어는 메모리로부터 데이터를 액세스하기 위해 고려되며, 여기서 각각의 구조체가 다수의 성분을 갖게 하여 데이터 요소가 구조체 내로 배열된다. 일 실시예에 따르면, 메모리의 구조체는 한 가지에서 네 가지 사이의 성분을 포함할 수 있는데, 이 경우 한 성분은 SIMD 처리 로직(18)에 의해 인식되는 임의의 데이터 유형 크기를 가질 수 있으며, 바람직한 실시예에서 상기 데이터 유형 크기는 8, 16, 32 또는 64-비트이다. 실시예에서 사용되는 구조체 포맷의 공통적인 예가 이하의 표에 제시되어 있다:
[표 1]
Figure 112006039851815-pct00001
어떠한 소정의 로드 또는 저장 명령어에 있어서, 메모리의 각 구조체는 액세스 대상이 동일한 구조체 포맷을 가지게 됨으로써, 동일한 수의 성분을 포함하게 된다. 로드 및 저장 명령어가 구조체 포맷 내의 성분의 수를 식별하도록 배열되며, 이 정보는 재배열 로직(24)에 의해, 로드 동작을 수행할 때는 데이터 요소의 디-인터리브를 제공하고 저장 동작을 수행할 때는 데이터 요소의 인터리브를 제공하도록 사용됨으로써, 구조체의 상이한 데이터 요소가 각기 다른 레지스터에 나타나도록 데이터가 레지스터에 배열될 수 있다. 이러한 개념은, 다수의 데이터 요소를 메모리의 연속 블록으로부터 세 개의 지정된 레지스터로 로드하는데 사용되는 로드 명령어의 상황에 대해 도 17에 개략적으로 도시되어 있다. 상기 예에 있어서, 지정된 레지스터는 세 개의 64-비트 레지스터D0(220), D1(225), 및 D2(230)이다. 상기 예에서, 구조체 포맷은 3D 벡터 포맷이며, 따라서 메모리(200)의 각 구조체(210)는 세 개의 성분(215)을 갖는다.
도 1에 도시되어 있는 바와 같이, 로드 명령어가 명령어 파이프라인(12)에서 스칼라 디코더(14)로 경로지정되며, 그 결과 적절한 메모리 액세스 제어 신호가 로드 저장부(LSU)(22)로 전송된다. 그런 다음, LSU가 메모리의 연속 블록으로부터 필요한 네 개의 구조체(A[0], A[1], A[2], 및 A[3])를 액세스한다. 따라서, LSU(22)는 정상적인 방식으로 동작할 수 있다. 그 후, 데이터는 각 구조체의 세 개의 성분을 디-인터리브하도록 배열되는 재배열 로직(24)을 통해 경로지정되어, X 성분에 속하는 데이터 요소가 레지스터 D0(220)으로 경로지정되고, Y 성분의 데이터 요소가 레지스터 D1(225)로 경로지정되며, Z 성분의 데이터 요소가 레지스터 D2(230)로 경로지정된다.
구조체 배열로부터 로드하고 로드 동작의 일부로서 정보를 개별적인 레지스 터로 분리하는 기능이 사용됨으로써, 데이터가 즉시 효율적인 SIMD 처리에 대한 준비를 할 수 있다.
재배열 로직(24)은 또한 지정된 레지스터로부터 메모리의 연속 블록으로 다시 데이터를 저장할 때 유사한 과정을 수행하도록 배열되며, 상기의 경우 재배열 로직(24)은 데이터가 메모리에 저장되기 전에 구조체 포맷을 재생하기 위해 인터리브 동작을 수행한다.
도 1로부터 알 수 있는 바와 같이, 로드 명령어는 그 명령어가 명령어 파이프라인(12)의 SIMD 단에 도달하기 전에 명령어 파이프라인으로부터 스칼라 디코더(14)로 경로지정된다. 이와 같이 하면, SIMD 레지스터 파일(20)로 데이터를 로드하는 과정이 그렇지 않은 경우보다 더 일찍 발생할 수 있고, 후속 SIMD 처리 명령어가 보편적으로 실행을 시작할 수 있기 전에 데이터가 로드되기를 기다릴 필요가 없으므로, 로드 동작의 지연을 상당히 줄이는 이점이 있다. 그러나, 저장 명령어는 SIMD 디코더(16)로 경로지정될 수 있을 때까지 명령어 파이프라인을 통해 전달될 필요가 있으며, 여기로부터 적절한 제어 신호가, LSU(22)를 통해 다시 메모리로 데이터가 저장되기 전에 재배열 로직(24) 내의 적절한 재배열, 및 SIMD 레지스터 파일(20)로부터의 데이터의 액세스를 제어하는데 사용될 수 있다. 그러나, 저장 명령어의 소정의 부분은, 명령어가 데이터 중단을 일으키지 않도록 명령어 파이프라인(12)의 ARM 부분에서, 예컨대 주소, 메모리 액세스 허용 등을 검사하는 동안 수행될 수 있다.
실시예의 로드 및 저장 명령어는 다음과 같은 단일 구문으로 고려될 수 있 다. 구문은 다음과 같이 표현될 수 있다:
V(LD|ST)<st>.<dt>{@<a>}<reglist>,{<n>,}<addr>
여기서,
<st> 구조체 포맷
메모리 내의 데이터 요소는 <st> 성분을 가진 구조체의 배열로 간주된다. 상기 정보가 메모리와 SIMD 레지스터 사이를 이동하는 데이터 요소를 인터리브하고 디-인터리브하는데 사용됨으로써, 효과적인 SIMD 처리가 이루어질 수 있다.
<dt> 데이터 유형
이것은 로드되는 데이터 요소의 크기를 판정한다
<a> 정렬 지정자(부가적임)
<reglist> SIMD 레지스터 목록
이것은 기록되거나 판독되는 SIMD 레지스터 상태를 판정한다. 로드의 경우, 이것은 정확히 명령어에 의해 영향을 받게 되는 SIMD 레지스터 파일의 일부분이다. 레지스터 목록은 동일한 길이의 <st> 벡터로 분리된 크기 <dt>의 데이터 요소의 모음으로 간주된다.
레지스터 목록 내의 바이트의 수가 액세스된 메모리의 바이트 수와 반드시 동일하지는 않는다는 것을 알아야 한다. <n> 옵션 및 도 20a 내지 20c를 참조한다.
<n> 구조체의 수(부가적임)
이것은 로드하거나 저장할 구조체의 수를 정의한다. 이와 같이 함으로써, 레지스터 목록이 일부분만 메모리 데이터로 로드될 수 있으며, 나머지 부분은 제로가 될 수 있다. 이것이 제공되지 않으면, 레지스터 목록과 메모리 액세스 크기가 동일하다는 것을 의미하는 디폴트 값을 취한다.
디폴트 <n>:= 요소<dt>(<reglist>) / <st>
<addr> 액세스에 사용되는 어드레싱 모드
실시예에 따르면, 어드레싱 모드는 다양한 형태를 취할 수 있으며, 특히 아래에 설명된 세 가지 형태를 취할 수 있다:
;// <addr>
[Rn] ;//address:= Rn
[Rn]! ;//address:= Rn, Rn:=Rn + transfer_size(여기서, "transfer_size"는 액세스된 메모리의 양이다)
[Rn], Rm ://address:=Rn,Rn:=Rn + Rm
상기 논의된 의미구조(symantics)는, 단일 구조체 또는 다수의 구조체가 로드되거나 저장될 수 있게 하고, 메모리로부터의 데이터로 채워지지 않는 레지스터의 나머지 부분에 논리적인 제로가 기록될 수 있게 하며, 스칼라 수식어를 포함하 는 레지스터 목록(예컨대, D0[1])을 사용함으로써 레지스터로의 삽입을 허용한다. 실시예에서, 제공되는 실제 로드 및 저장 명령어가 보편적으로 상기 구문의 모든 가능한 조합의 서브세트가 된다는 것을 이해할 것이다.
구조체 포맷과 관련하여, 도 18은 세 가지 가능한 구조체 포맷의 예 및 그들의 상응하는 "st" 값을 도시한다. 도 18로부터 알 수 있는 바와 같이, 제1 구조체(250)는 단지 단일 성분만을 가지므로, st 값이 1이다. 제2 예에서, 구조체(255)는, 예컨대 복소수의 실수부(x)와 허수부(y)를 표현하는 두 개의 성분을 가지므로, st 값은 2이다. 마지막으로, 제3 예에서, 구조체(260)는 R, G, 및 B 데이터 요소를 표현하는 세 개의 성분을 가지므로, st 값이 3이다.
실시예의 로드 및 저장 명령어를 사용할 때 이용될 수 있는 기능에 대한 설명을 돕기 위해, 도 19 내지 22가 로드 및 저장 명령어에 대한 소정의 예를 도시한다. 도 19a 내지 19c를 고려하면, 도 19a는 저장 명령어
VST 2.16 {D0,D1,D2,D3},[r1]
에 의해 지정된 reglist 상태를 도시한다. 이 명령어는 다수의 구조체를 지정된 레지스터 파일로부터 메모리의 연속 블록으로 저장하는데 사용된다. 알 수 있는 바와 같이, 도 19a는 reglist가 네 개의 지정된 레지스터 D0(270), D1(280), D2(290), 및 D3(300)를 포함한다는 것을 식별한다. 도 19b에 도시되어 있는 바와 같이, 이들 레지스터는 "dt" 크기의 (즉, 16-비트) 데이터 요소의 "st" 벡터(즉, 2)로 분할되는 것으로 여겨질 수 있다. 레지스터 D0에서, 상기 데이터 요소는 번호(275)로 참조되고, D1에서는 번호(285)로 참조되고, D2에서는 번호(295)로 참조 되며, D3에서는 번호(305)로 참조된다. 도 19c로부터 알 수 있는 바와 같이, 재배열 로직(24)은, 각 데이터 요소(314)가 구조체(312)에 대한 요청된 구조체 포맷으로 메모리(310)에 저장되도록 상기 두 벡터로부터의 데이터 요소를 인터리브하도록 배열된다.
도 20a 내지 20c는 명령어
VLD2.16 {D0,D1},#1,[r1]
에 의해 수행되는 동작을 나타내는 상기와 유사한 도면 집합이다.
도 20a는 레지스터 D0(270) 및 D1(280)를 식별하는 reglist 상태의 모음을 도시한다. 다음으로, 도 20b는 상기 레지스터가 dt 크기(즉, 16-비트) 데이터 요소의 st 벡터(즉, 2)로 분할되는 방법을 도시한다.
도 19a 내지 19c와 대조적으로, 상기 명령어는 액세스될 구조체의 수를 식별하는 "n" 파라미터를 지정하며, 상기 예에서 n은 1이다. 따라서, 이 로드 명령어의 경우, n × st(즉, 1 × 2) 데이터 요소가 실제 주소에서 시작하여 메모리로부터 판독된 다음, 제1 벡터의 가장 낮은 인덱스 요소에서 시작하여 라운드-로빈 할당으로 벡터로 분배될 필요가 있다. 이러한 과정은 도 20c에 도시되어 있으며, 그 결과 제1 성분(314)의 데이터 요소(x0)가 레지스터 D0의 가장 낮은 16 비트에 기록되는 한편, 제2 성분의 데이터 요소(y0)가 레지스터 D1의 가장 낮은 16 비트에 기록된다. 상기 실시예에 따르면, 일단 모든 데이터 요소가 로드되고 나서 기록되지 않은 레지스터 상태의 임의의 부분은 제로로 설정된다. 상기에 대응하는 저장 명 령어의 경우, n × st 데이터 요소는 상기 로드의 반대 방식으로 저장된다는 것을 알아야 한다.
도 21a 내지 21c는, 명령어에 대한 구문이 두 개의 데이터 유형, 즉 액세스되는 데이터 요소에 대한 데이터 유형 및 레지스터로 로드되거나 메모리에 저장될 결과 데이터 요소에 대한 데이터 유형이 지정되도록 확장되는 또 다른 소정의 예를 도시한다. 따라서, 도 21a 내지 21c는 명령어
VLD 2.32.S16 {D0,D1,D2,D3}[r1]
에 의해 수행되는 동작을 나타난다.
도 21a에 도시되어 있는 바와 같이, 레지스터 D0(270), D1(280), D2(290), 및 D3(300)를 식별하는 reglist 상태가 모인다. 다음으로, 도 21b에 도시되어 있는 바와 같이, 상기 명령어가, 데이터 요소가 레지스터 내에 저장될 때까지는 이들이 32 비트 길이가 된다는 것을 지정하므로, 상기 레지스터 상태는 dt 크기(즉, 32-비트) 데이터 요소의 st 벡터(즉, 2)로 분할된다.
또한 명령어에 의해 지정된 바와 같이, 메모리 내의 데이터 요소가 16-비트 길이이므로, 일단 데이터 요소가 메모리(310)로부터 액세스되면, 이들은 16-비트 데이터 요소 각각을 새로운 32-비트 데이터 요소(342)를 형성하도록 확장하는데 사사용되는 어떤 변환 로직(34)(이것은 부가적으로 재배열 로직(24)의 일부로서 포함될 수 있음)을 통해 전달되게 된다. 상기 데이터 요소는 디-인터리브되어, 제1 성분의 데이터 요소가 레지스터 D0 및 D1 내에 저장되는 한편, 제2 성분의 데이터 요소가 레지스터 D2 및 D3에 저장된다.
도 22a 내지 22c는 또 다른 예를 도시하는 것으로서, 특히 다음과 같은 명령어의 동작을 도시한다.
VLD2.16 {D0[2],D1[2]},[r1]
상기 명령어가 이전 명령어와 동일한 구문을 공유할 수 있지만, 상기 명령어는 개념상, 데이터 요소가 구조체 배열로서 저장되는 메모리의 연속 블록으로부터 데이터 요소를 로드하기 보다, 상기 로드 명령어가 단지 단일 구조체를 로드한다는 점에서 상이한 유형의 명령어이다. 또한, 로드되는 단일 구조체의 데이터 요소가 지정된 레지스터 내의 임의의 선택된 처리 레인에 놓일 수 있다. 따라서, 64-비트 폭의 레지스터 및 16-비트 데이터 요소를 고려하면, 데이터 요소가 놓일 수 있는 가능한 처리 레인이 네 개가 존재한다. 바람직한 실시예에서, 소정의 명령어에 대해 선택된 레인은 소정의 레인을 식별함으로써 reglist 데이터 내에 표시된다.
도 22a를 고려하면, reglist 상태가 모이면, 이것이 레지스터 D0의 레인 2(320) 및 레지스터 D1의 레인 2(325)를 식별한다는 것을 알 수 있다. 도 22b에 도시되어 있는 바와 같이, 이들은 dt 크기(즉, 16-비트) 데이터 요소의 st 벡터(즉, 2)로 분할된다. 그 후, 도 22c에 도시되어 있는 바와 같이, 일단 구조체(312)가 메모리(310)로부터 액세스되면, 재배열 로직(24)이 데이터 요소(x0)를 D0 레지스터(330)의 레인 2로 향하게 하는 한편, 데이터 요소(y0)를 D1 레지스터(335)의 레인 2로 향하게 하도록 배열된다. 상기 예에서는, 레인이 0 에서 3의 범위에서 식별될 수 있다는 것을 이해할 것이다.
관심있는 독자를 위해, 이하의 표가 소정의 일 실시예에 제공될 수 있는 다양한 유형의 로드 및 저장 명령어를 식별한다:
[표 2]
Figure 112006039851815-pct00002
[표 3]
Figure 112006039851815-pct00003
[표 4]
Figure 112006039851815-pct00004
[표 5]
Figure 112006039851815-pct00005
일 실시예에 있어서, 도 1의 재배열 로직(24)은 도 23에 도시된 형태를 취한다. 도 23의 로직은 그 입력에 두 개의 멀티플렉서(350, 355)를 포함하며, 이것은, 로드 명령어의 경우 도 1에 도시된 LSU(22)와 연결된 로드 FIFO(23)로부터 데이터를 수신하도록 배열되고, 또는 저장 명령어의 경우 SIMD 레지스터 저장소(20)로부터 데이터를 수신하도록 배열된다. 또한, 어떤 상황에 있어서, 로드 명령어는 또한 도 23의 로직으로 하여금 SIMD 레지스터 저장소(20)부터 데이터를 수신하게 할 수도 있다. 멀티플렉서(350, 355)는 상이한 입력들 중에 선택하여, 선택된 입력을 연결된 입력 레지스터(360, 365)로 경로지정하도록 제어된다. 일 실시예에서, 각 입력 레지스터는 64 비트의 데이터를 저장할 수 있다. 다음으로, 입력 레지스터에 저장된 데이터가 크로스바 멀티플렉서(375)를 통해 레지스터 캐시(380) 내로 판독되며, 크로스바 제어 레지스터(370)가 크로스바 멀티플렉서에 구동 신호를 제공하여, 입력 레지스터로부터 수신된 데이터의 각각의 바이트를 레지스터 캐시 내의 원하는 바이트 위치로 향하게 한다. 제어 레지스터(370)의 값은 명령어 디코더에 의해 얻어진다.
도 23에 도시되어 있는 바와 같이, 레지스터 캐시(380)는 네 개의 레지스터로 구성된다고 할 수 있으며, 일 실시예에서 각 레지스터는 64-비트 길이이다.
데이터가 레지스터 캐시(380)에 저장된 후, 상기 데이터는 출력 멀티플렉서(385)를 거쳐, LSU(22)와 연결된 저장 데이터 FIFO(23')(저장 명령어의 경우), 또는 SIMD 레지스터 파일(20)(로드 명령어의 경우)로 판독될 수 있다.
바이트 크로스바 멀티플렉서(375)가 바이트 입도로 입력 레지스터를 판독하 고 바이트 입도로 레지스터 캐시에 기록할 수 있지만, 기록 멀티플렉서(385)는 64-비트 입도로 레지스터 캐시로부터 판독한다.
재배열 로직(24)은 SIMD 처리 로직(18)의 나머지로부터 매우 자율적이지만, 집적 회로 내의 다른 기능부와 동일한 방식으로 프로그램 순서로 명령어를 제공받는다. 일 실시예에서, 이것은 스스로 제어하는 두 개의 레지스터 파일 판독 포트 및 두 개의 기록 포트를 갖는다. 해저드를 검출하고 이를 피하기 위해, 재배열 로직(24)은 스코어보드(scoreboard)를 사용하여 어떤 인터로크 로직(도시되지 않음)과 연결되도록 배열될 수 있다.
SIMD 레지스터 파일(20)로부터의 저장 명령어는 다른 SIMD 명령어에 대해서는 순서가 바뀌어 수행되지만, SIMD 레지스터 파일로부터의 다른 저장 명령어에 대해서는 순서대로 유지된다. 대기중인 저장소가 큐 내에 유지되고, 저장 데이터가 준비가 되면, 이것은 판독되어, 재배열 로직(24)을 통해 LSU(22)와 연결된 저장 FIFO(23')로 전달된다.
일 실시예에 있어서, 메모리와 SIMD 레지스터 파일(20) 사이에 전달되는 모든 데이터는 재배열 로직(24)을 통해 경로지정된다. 그러나, 선택적인 실시예에서는, 재배열이 전혀 필요하지 않은 것으로 결정되는 상황을 위해 재배열 로직(24) 주위에 바이패스 경로가 제공될 수도 있다.
레지스터 캐시(380)는, 어떤 조건에서 레지스터 값을 이들이 SIMD 레지스터 파일(20)로 기록되기 전에 저장하기 때문에 "캐시"라고 한다. 레지스터 캐시는 재배열 로직(24)으로부터 데이터가 출력되는 포맷으로 데이터를 보유한다.
도 24a 내지 24c는, 유형 VLD 3.16{D0,D1,D2}[r1]의 명령어를 수행할 때 요구되는 필요한 재배열을 구현하기 위한 재배열 로직(24)의 동작을 도시한다.
일단 LSU(22)에 의해 데이터가 로드되면, 제1 사이클(도 24a에 도시되어 있는 바와 같음)에서, 64비트의 검색된 데이터가 멀티플렉서(350)를 통해 입력 레지스터(360)로 로드되는 한편, 다음 64 비트가 멀티플렉서(355)를 통해 입력 레지스터(365)로 로드된다. 도 24a 내지 24c에 도시되어 있는 예에서는, 구조체 포맷이 성분(x, y, z)을 가진 3D 벡터를 표현하는 것으로 가정한다. 다음 사이클에서, 도 24b에 도시되어 있는 바와 같이, 입력 레지스터 내의 16-비트 데이터 요소가 바이트 크로스바 멀티플렉서(375)를 통해 레지스터 캐시(380)로 판독되며, 상기 멀티플렉서는 x 성분과 관련된 임의의 데이터 요소가 레지스터 캐시의 제1 레지스터에 놓이고, y 성분과 관련된 임의의 데이터 요소가 레지스터 캐시의 제2 레지스터에 놓이며, z 성분과 관련된 임의의 데이터 요소가 레지스터 캐시의 제3 레지스터에 놓이도록 데이터를 재배열한다. 또한 상기 사이클 동안에, 로드 FIFO(23)로부터의 다음 64 비트의 데이터가 멀티플렉서(350)를 통해 입력 레지스터(360)에 로드된다.
다음 사이클에서는, 도 24c에 도시되어 있는 바와 같이, 입력 레지스터(360)로부터의 데이터 요소가, 상기 설명된 바와 같이 x, y, 및 z 성분이 디-인터리브되게 하여 바이트 크로스바 멀티플렉서를 통해 레지스터 캐시로 경로지정된다. 도 24c에 도시되어 있는 바와 같이, 상기와 같이 함으로써 결과적으로 제1 레지스터에 네 개의 x 성분을 포함하고, 제2 레지스터에 네 개의 y 성분을 포함하며, 제3 레지스터에 네 개의 z 성분을 포함하는 레지스터 캐시가 나타난다. 다음으로, 레지스 터 캐시의 내용은 기록 멀티플렉서(385)를 통해 로드 명령어에 의해 지정된 레지스터로 한 번에 두 개의 레지스터씩 출력될 수 있다.
도 25a 내지 25d는 명령어 VLD 3.16 {D0[1],D1[1],D2[1]},[r1]를 실행할 때 요구되는 필요한 재배열을 수행하기 위한 재배열 로직을 통한 데이터 흐름의 제2 예를 도시한다. 상기 명령어에 따르면, 데이터가 레지스터의 소정의 레인(D0, D1, 및 D2), 즉 상기 레지스터 내의 네 개의 16-비트 폭의 레인 중 제2 16-비트 폭의 레인으로 로드되게 된다. 데이터가 레지스터의 소정의 레인에 저장되기 전에, 레지스터의 현재 내용이 검색되어, 레지스터가 그 후 기록될 때, 레지스터의 내용 전체가 기록되도록 할 필요가 있다. 이러한 특징에 의해, SIMD 레지스터 파일(20)의 레지스터의 일부에만 어떠한 기록을 제공할 필요가 없게 된다. 따라서, 제1 사이클 동안에는, 도 25a에 도시되어 있는 바와 같이, 레지스터(D0 및 D1)의 현재 내용이 SIMD 레지스터 파일로부터 멀티플렉서(350, 355)를 거쳐 입력 레지스터(360, 365)로 판독된다. 그 다음 사이클에서는, 도 25b에 도시되어 있는 바와 같이, D0의 내용이 레지스터 캐시의 제1 레지스터에 놓이고, D1의 내용이 레지스터 캐시의 제2 레지스터에 놓이도록, 상기 내용이 크로스바 멀티플렉서(375)를 통해 레지스터 캐시(380)로 판독된다. 동일한 사이클 동안, 레지스터(D2)의 내용이 멀티플렉서(350)를 거쳐 SIMD 레지스터 파일로부터 검색되어, 입력 레지스터(360)에 저장된다.
그 다음 사이클에서는, 도 25c에 도시되어 있는 바와 같이, 레지스터(D2)의 내용이 크로스바 멀티플렉서(375)를 거쳐 레지스터 캐시(380)로 판독되어, 이들이 레지스터 캐시의 제3 레지스터에 저장된다. 상기와 동일한 사이클동안, 로드의 대상인 데이터 구조체(보편적으로 이것은 LSU에 의해 이미 검색되었을 것임)가 로드 FIFO(23)로부터 멀티플렉서(350)를 거쳐 입력 레지스터(360)로 판독된다. 도 25c에 도시되어 있는 예에서, 메모리 내의 구조체는 성분(x, y, 및 z)을 가진 3D 벡터 데이터를 표현하는 것으로 간주된다. 다음 사이클에서는, 도 25d에 도시되어 있는 바와 같이, x, y, 및 z 성분이 크로스바 멀티플렉서(375)를 거쳐 데이터 요소의 제2 레인으로 판독되어, 데이터 요소(x0)가 레지스터 캐시 내에서 레지스터 D0의 제2 레인의 이전 내용에 겹쳐쓰고, 성분(y0)이 레지스터 캐시 내에서 레지스터 D1의 제2 레인에 이전에 저장된 데이터 요소에 겹쳐쓰며, 성분(z0)이 레지스터 캐시 내에서 레지스터 D2의 제2 레인에 이전에 저장된 데이터 요소에 겹쳐쓴다.
이 시점에 SIMD 레지스터 파일의 레지스터(D0, D1, 및 D2)의 실제 내용이 아직 변경되지 않는다는 것을 이해할 것이다. 그러나, 레지스터 캐시에 저장된 데이터가 이제 기록 멀티플렉서(385)를 거쳐 레지스터(D0, D1, 및 D2)로 다시 출력되어, 이전 내용에 겹쳐쓸 수 있다. 그 결과, 단일 로드 명령어가 메모리로부터 소정의 구조체의 성분을 로드한 다음, 그 구조체의 각각의 성분을 선택된 레인 위치에서 상이한 레지스터 내에 삽입하는데 사용될 수 있다는 것을 알 수 있다.
도 25e 내지 25h는, 도 25a 내지 25d를 참조하여 상기 설명된 로드 명령어에 상호 보완적인 저장 명령어를 실행할 때 요구되는 필요한 재배열을 수행하기 위한 재배열 로직을 통한 데이터 흐름의 제3 예를 도시한다. 따라서, 도 25e 내지 25h 는 명령어 VST 3.16 {D0[1],D1[1],D2[1]},[r1]를 실행할 때 필요한 재배열을 수행하는데 요구되는 단계를 도시한다. 따라서, 상기 명령어에 따라, 데이터가 레지스터(D0, D1, 및 D2)의 제2 16-비트 폭 레인으로부터 메모리로 다시 저장되게 된다. 도 25e에 도시되어 있는 바와 같이, 제1 사이클 동안, 레지스터(D0 및 D1)의 현재 내용이 SIMD 레지스터 파일로부터 멀티플렉서(350, 355)를 거쳐 입력 레지스터(360, 365)로 판독된다. 다음 사이클에서는, 도 25f에 도시되어 있는 바와 같이, 제2 레인의 데이터 요소, 즉 값(x0 및 y0)이 크로스바 멀티플렉서(375)를 통해 레지스터 캐시(380)의 제1 레지스터로 판독된다. 동일한 사이클 동안, 레지스터(D2)의 내용이 SIMD 레지스터 파일로부터 멀티플렉서(350)를 거쳐 검색되어, 입력 레지스터(360)에 저장된다.
그 다음 사이클에서는, 도 25g에 도시되어 있는 바와 같이, 레지스터(D2)의 제2 레인 내의 데이터 요소가 크로스바 멀티플렉서(375)를 거쳐 레지스터 캐시(380)의 제1 레지스터로 판독된다. 그런 다음, 다음 사이클에서, 도 25h에 도시되어 있는 바와 같이, x, y, 및 z 성분은 이제 메모리로 다시 저장하기 위해 기록 멀티플렉서(385)에 의해 LSU로 출력될 수 있다. 이 단에서 데이터 요소가 이제 메모리에 저장하는데 필요한 구조체 포맷으로 재배열된다는 것을 이해할 것이다.
도 26a 내지 26e는 이하의 네 개의 명령어 시퀀스를 실행하는 동안 재배열 로직 내에 발생하는 재배열을 도시한다:
VLD 3.16{D0,D1,D2},#1,[r1]
VLD 3.16{D0[1],D1[1],D2[1]},[r2]
VLD 3.16{D0[2],D1[2],D2[2]},[r3]
VLD 3.16{D0[3],D1[3],D2[3]},[r4]
일단 제1 로드 명령어에 의해 식별된 데이터가 LSU에 의해 검색되면, 상기 데이터는 제1 사이클 동안 멀티플렉서(350)를 거쳐 입력 레지스터(360)로 판독된다(도 26a 참조). 다음 사이클에서, 이것은 크로스바 멀티플렉서(375)를 거쳐 레지스터 캐시(380)로 판독되어, x, y, 및 z 성분이 레지스터 캐시의 상이한 레지스터에 놓인다. 제1 명령어 내의 "#1"은, 각 데이터 요소가 각 레지스터의 최하위 데이터 레인에 놓이고, 나머지 레인이 논리 0 값으로 채워져야 한다는 것을 의미하는데, 이것은 도 26b에 도시되어 있다. 또한, 상기 사이클 동안, 제2 로드 명령어에 의해 식별된 데이터 요소가 입력 레지스터(360)로 검색된다. 그 다음 사이클 동안(도 26c 참조), 입력 레지스터(360)에 저장된 데이터 요소가 크로스바 멀티플렉서(375)를 거쳐 레지스터 캐시(380)로 이동하는데, 여기서 이들 데이터 요소는 제2 레인에 저장된다. 또한, 상기 사이클 동안, 제3 로드 명령어의 데이터 요소가 입력 레지스터(360) 내에 놓인다.
그 다음 사이클에서, 입력 레지스터(360)의 내용이 크로스바 멀티플렉서(375)를 거쳐 레지스터 캐시의 제3 레인으로 경로지정되는 한편, 제4 로드 명령어의 대상인 데이터 요소가 입력 레지스터(360)로 검색된다. 이것은 도 26d에 도시되어 있다.
마지막으로, 도 26e에 도시되어 있는 바와 같이, 다음 사이클에서, 상기 데이터 요소가 크로스바 멀티플렉서(375)를 거쳐 레지스터 캐시(380)로 경로지정되는 데, 여기서 이들은 제4 레인에 저장된다. 그 후, 레지스터 캐시의 각 레지스터내의 64-비트 폭 청크(chunk)의 데이터가 SIMD 레지스터 파일의 지정된 레지스터로 출력될 수 있다.
도 25a 내지 25d에서 고려된 접근법과 대조적으로, 도 26a 내지 26e를 참조하여 설명된 제1 VLD 명령어를 사용하면, 일단 데이터 요소가 소정의 레인에 놓이면, 나머지 레인이 0의 값으로 채워짐으로써, 어떠한 업데이트가 이루어지기 전에, 임의의 레지스터(D0 내지 D2)의 현재 내용을 SIMD 레지스터 파일로부터 검색할 필요가 없다는 것을 알아야 한다. 다시 도 26a 내지 26e를 보면, 상기 경우의 레지스터 캐시(380)는, 로드 명령어의 시퀀스에 대한 데이터 요소를 저장하고, 각 명령어가 완료되면, 데이터를 SIMD 레지스터 파일의 관련 레지스터에 기록하므로, "동시 기록 캐시(write through cache)"의 기능을 한다는 것을 알 수 있다. 그러나, 레지스터 파일은 보편적으로 시퀀스 내의 각각의 후속 명령어가 수행되고 있는 동안 판독될 필요가 없다.
종종 데이터 처리시, 상호적인 및 관련 연산자 'op'를 모든 요소들 사이에 적용함으로써 소위 벡터의 요소를 단일 요소로 감소시킬 필요가 있다. 이것은 폴딩 연산으로 기재되게 된다. 폴딩 연산의 보편적인 예는 벡터의 요소들을 합하거나, 벡터 내의 요소의 최대값을 찾는 것이다.
병렬 처리 구조에서, 상기 폴딩 연산을 수행하는데 사용되는 한 가지 공지된 접근법이 도 27을 참조하여 설명된다. 폴드될 데이터 요소([0] 내지 [3])가 레지스터(r1)에 포함된다. 병렬 처리 구조의 이점은 동일한 연산이 다수의 데이터 요 소에 동시에 수행될 수 있다는 것임을 이해할 것이다. 이것은 소위 병렬 처리 레인과 관련하여 더욱 명확히 이해될 수 있는 개념이다. 상기 예에서, 각각의 병렬 처리 레인은 데이터 요소([0] 내지 [3]) 중 하나를 포함한다.
먼저, 단계 A에서, 데이터 요소를 두 자리씩 회전시켜 레지스터(r2)에 회전된 데이터 요소를 형성하는 제1 명령어가 발생된다. 이것은, 단일 명령어 다중 데이터(Single Instruction Multiple Data:SIMD) 연산이 단계 B에 이용될 수 있도록 각 처리 레인에 각기 다른 데이터 요소를 배치한다.
그 후, 단계 B에서, 각 레인의 데이터 요소에 SIMD 연산이 수행되도록 하는 제2 명령어가 발생된다. 상기 예에서, 이러한 다수의 병렬 연산의 결과로 얻어지는 데이터 요소가 레지스터(r3)에 저장된다. 따라서, r3 내의 엔트리가 이제 레지스터(r1)의 데이터 요소 절반을 조합한 결과를 포함한다(즉, r3는 [0] op [2]; [1] op [3]; [2] op [0]; 및 [3] op [1]을 포함함)는 것을 알 수 있다.
다음으로, 레지스터(r3)에 저장된 결과가 단계 C에서 하나의 병렬 처리 레인에 의해 회전되어 레지스터(r4)에 저장되도록 하는 제3 명령어가 발생된다. 다시 한번, r4에 대하여 r3에 저장된 데이터 요소를 회전시킴으로써, 상이한 데이터 요소가 동일한 병렬 처리 레인을 차지할 수 있다.
마지막으로, 단계 D에서, 각 레인에 저장된 데이터 요소에 또 다른 단일 명령어 다중 데이터 연산이 수행되도록 하는 제4 명령어가 발생되며, 그 결과가 레지스터(r5)에 저장된다.
따라서, 단 네 개의 명령어를 사용함으로써, 레지스터를 지나는 모든 데이터 요소가 결합되어 그 결과가 레지스터(r5)의 각 엔트리에 저장될 수 있다는 것을 알 수 있다(즉, r5의 각 엔트리는: [0] op [1] op [2] op [3]을 포함함). 상기 결과로 얻어진 데이터 요소는 필요한 때 레지스터(r5)의 네 개의 엔트리 중 임의의 엔트리로부터 판독될 수 있다.
도 28은 일 실시예의 폴딩 연산의 원리를 도시한다. 각 병렬 처리 레인이 레인 전체에 걸쳐 하나의 데이터 요소의 폭과 동일한 고정된 폭을 갖는 통상적인 병렬 처리 레인의 배열(이것은 도 27을 참조하여 설명됨)과 달리, 상기 실시예에서 병렬 처리 레인의 배열은 상이하다. 이러한 새로운 배열에서, 각 병렬 처리 레인의 폭은 입력에서는 적어도 두 개의 소스 데이터 요소의 폭과 동일하며, 그 출력에서는 일반적으로 그 결과로 얻어진 하나의 데이터 요소의 폭과 동일하다. 이러한 방식으로 병렬 처리 레인을 배열하면, 단일 레지스터 내의 데이터 요소 그룹(예컨대, 데이터 요소 쌍)이 병렬 처리 연산의 대상이 될 수 있으므로 종래 기술의 배열보다 큰 이점이 제공된다는 것을 알 수 있다. 이하의 설명으로부터 명백히 알게 되는 바와 같이, 이것은, 다수의 연산이 병렬로 발생될 수 있게 하기 위해 또 다른 레지스터의 올바른 엔트리 위치에 데이터 요소를 배열할 필요가 없으므로 종래 배열의 데이터 조종 동작(즉, 회전 동작)을 수행할 필요가 없게 한다.
따라서, 소스 데이터 요소(d[0] 내지 d[3])가 레지스터 내의 각자의 엔트리에 제공된다. 인접한 소스 데이터 요소(d[0] 및 d[1])가 한 쌍의 소스 데이터 요소로 간주될 수 있다. 또한, 소스 데이터 요소(d[2] 및 d[3])가 한 쌍의 소스 데이터 요소로 간주될 수 있다. 따라서, 상기 실시예에서는, 두 쌍의 소스 데이터 요소가 존재한다.
단계 (A)에서, 레지스터 내의 각각의 소스 데이터 요소 쌍에 연산이 수행되어, 결과 데이터 요소가 생성되며, 상기와 동일한 연산이 각각의 인접한 소스 데이터 요소 쌍에서 발생한다.
따라서, 소스 데이터 요소의 쌍 및 그것의 상응하는 결과 데이터 요소가 모두 동일한 병렬 처리 레인을 차지한다는 것을 이해할 것이다. 단계 (A) 이후, 상기의 결과 데이터 요소의 수가 소스 데이터 요소의 수의 절반이라는 것을 알 수 있다. 데이터 요소(d[2] op d[3] 및 d[0] op d[1])가 또한 한 쌍의 데이터 요소로 간주 될 수 있다.
단계 (B)에서, 다른 동일한 연산이 한 쌍의 소스 데이터 요소에 수행되어, 결과 데이터 요소(d[0] op d[1] op d[2] op d[3])가 생성된다. 단계 (B) 이후, 결과 데이터 요소의 수가 또한 소스 데이터 요소의 수의 절반이라는 것을 알 수 있다. 상기 언급된 바와 같이, 상기 연산은 상호적이며 연관된 연산이므로, 소스 데이터 요소의 올바른 결합 순서에 관계없이 동일한 데이터 요소가 생성된다.
그러므로, 각 연산의 결과로서 소스 데이터 요소의 수가 절반이 되고, 그 소스 데이터 요소에 동일한 연산이 수행되어 요청된 결과가 생성된다는 것을 알 수 있다. 따라서, 요구된 결과의 데이터 요소가 단 두 개의 연산으로 생성될 수 있는 반면, 도 27의 종래 기술의 배열은 적어도 네 개의 연산으로 수행될 필요가 있었다. 소스 레지스터 내의 데이터 요소 그룹에 병렬 처리 연산을 수행함으로써 효율면에서 상기와 같은 개선이 얻어진다는 것을 이해할 것이다. 명료히 나타내기 위 해 단지 두 쌍의 소스 데이터 요소가 도시되어 있지만, 임의의 수의 소스 데이터 쌍이 연산의 대상이 될 수 있다는 것을 이해할 것이다. 또한, 명료히 나타내기 위해 소스 데이터 요소 쌍에 대한 연산이 도시되어 있지만, 임의의 수의 소스 데이터 요소(예컨대, 세 개, 네 개, 또는 그 이상)가 연산의 대상이 될 수 있다는 것을 이해할 것이다.
실제로, 효율을 이유로, 폴딩 연산은 레지스터 데이터 파일(20)에서 지원되는 최소 레지스터 크기에 의해 결정되는 최소 수의 데이터 요소에 병렬 연산을 수행하도록 배열된다. 도 29는 소스 데이터 요소의 수와 동일한 수의 결과 데이터 요소를 생성하는 구현예를 도시한다.
소스 데이터 요소(d[0] 내지 d3])가 레지스터(Dn)에 제공된다. 동일한 수의 결과 데이터 요소를 생성하기 위해, 소스 데이터 요소(d[0] 내지 d[3])가 또한 레지스터(Dm)에 제공된다. 레지스터(Dn 및 Dm)는, SIMD 처리 로직(18)이 레지스터(Dn)로부터 각각의 소스 데이터 요소를 두 번 판독하여 복사된 결과 데이터 요소를 생성하는 동일한 레지스터일 가능성이 있음을 이해할 것이다.
단계 (A)에서, 단일 SIMD 명령어가 발생되고, 각 소스 데이터 요소의 쌍에 연산이 수행되어, 상응하는 결과 데이터 요소가 발생된다.
단계 (B)에서, 또 다른 단일 SIMD 명령어가 발생되어, 각 소스 데이터 요소 쌍에 연산이 수행되어 상응하는 결과 데이터 요소가 발생된다.
따라서, 모든 소스 데이터 요소가 결합되어 결과 데이터 요소를 생성한다는 것을 알 수 있다.
도 30a 내지 30d는 다른 곳에 기재된 것과 동일한 구문을 따르는 다양한 폴딩 명령어의 동작을 도시한다. 두 소스 레지스터가 나타나는 경우, 이들은 동일한 레지스터일 수도 있다는 것을 이해할 것이다. 또한, 각 소스 레지스터가 목적지 레지스터로 지정되어, 이용되는 레지스터 공간의 양을 줄일 수 있다는 것을 이해할 것이다.
도 30a는 SIMD 폴딩 명령어의 동작을 도시하는 것으로서, 이 명령어에 의해 'n' 비트로 표현된 동일한 레지스터로부터의 데이터 요소의 쌍에 연산이 수행되어 2n 비트로 표현된 결과 데이터 요소를 생성한다. 결과 데이터 요소를 2n 비트를 갖도록 프로모트(promote) 함으로써, 오버플로우가 발생할 가능성을 감소시킨다. 결과 데이터 요소를 프로모트할 때, 이들은 보편적으로 부호 확장되거나 '0'으로 채워진다. 다음과 같은 예시적인 합산 폴딩 명령어가 상기 연산을 지원한다:
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VSUM .S16.S8 Dd, Dm (인접한 요소의 쌍을 가산하고 프로모트함)
.S32.S16 Qd, Qm
.S64.S32
.U16.U8
.U32.U16
.U64.U32
도 30a에 도시된 소정의 예에서(VSUM.S32.S16 Dd,Dm), 네 개의 16-비트 데이터 요소를 포함하는 64-비트 레지스터(Dm)가 폴드되어, 두 개의 32-비트 결과 데이터 요소를 포함하는 64-비트 레지스터(Dd)에 저장된다.
도 30b는, 'n' 비트로 표현된 상이한 레지스터로부터의 소스 데이터 요소의 쌍에 연산을 수행하여, 역시 'n' 비트로 표현된 결과 데이터 요소를 생성하도록 하는 SIMD 폴딩 명령어의 동작을 도시한다. 다음과 같은 예시적인 합산, 최대, 및 최소 명령어가 상기 동작을 지원한다:
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VSUM .I8 Dd,Dn,Dm (인접한 요소의 쌍을 가산함)
.I16
.I32
.F32
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VFMX .S8 Dd,Dn,Dm (인접한 쌍의 최대값을 취함)
.S16
.S32
.U8
.U16
.U32
.F32
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VFMN .S8 Dd,Dn,Dm (인접한 쌍의 최소값을 취함)
.S16
.S32
.U8
.U16
.U32
.F32
도 30b에 도시되어 있는 소정의 예에 있어서(VSUM.I16 Dd,Dn,Dm), 네 개의 16-비트 데이터 요소를 각각 포함하는 두 개의 64-비트 레지스터(Dm,Dn)가 폴드되어, 네 개의 16-비트 결과 데이터 요소를 포함하는 64-비트 레지스터(Dd)에 저장된다.
도 30c는, 'n' 비트로 표현된 동일한 레지스터로부터의 소스 데이터 요소의 쌍에 연산을 수행하여, 역시 'n' 비트로 표현된 결과 데이터 요소를 생성하도록 하는 SIMD 폴딩 명령어의 동작을 도시한다. 도 30c에 도시된 소정의 예에서는, 8개의 16-비트 데이터 요소를 포함하는 128-비트 레지스터(Qm)가 폴드되어, 네 개의 16-비트 결과 데이터 요소를 포함하는 64-비트 레지스터(Dd)에 저장된다.
도 30d는, 도 30b와 유사하지만, Dm=Dn일 경우, 결과 데이터 값이 목적지 레 지스터에 복제되도록 하는 SIMD 폴딩 명령어의 동작을 도시한다. 'n' 비트로 표현된 동일한 레지스터로부터의 소스 데이터 요소의 쌍은 그것에 연산이 수행되어, 역시 'n' 비트로 표현된 결과 데이터 요소를 생성하며, 그 각각은 레지스터의 또 다른 엔트리에 복제된다. 도 30d에 도시된 소정의 예에서는, 네 개의 16-비트 데이터 요소를 포함하는 64-비트 레지스터(Dm)가 폴드되어, 두 개의 16-비트 결과 데이터 요소로 이루어진 두 세트를 포함하는 64-비트 레지스터(Dd)에 저장된다.
도 31은, 폴딩 명령어를 지원할 수 있으며, SIMD 처리 로직(18)의 일부로서 제공되는 예시적인 SIMD 폴딩 로직을 개략적으로 도시한다. 명료히 하기 위해, 도시된 로직은 각각의 인접 쌍의 최대값을 선택하는 명령어를 지원하는데 사용된다. 그러나, 아래에 더 상세히 설명되어 있는 바와 같이, 상기 로직이 다른 연산을 지원하도록 쉽게 조정될 수 있다는 것을 이해할 것이다.
로직은, 부가적으로 레지스터(Dn)로부터 소스 데이터 요소(Dn[0] 내지 Dn[3])과 함께 레지스터(Dm)로부터 소스 데이터 요소(Dm[0] 내지 Dm[3])을 수신한다. 선택적으로, 로직은 레지스터(Qm)로부터 소스 데이터 요소(Qm[0] 내지 Qm[7])를 수신한다. 인접한 소스 데이터 요소의 각 쌍은 연결된 폴딩 연산 로직부(400)에 제공된다. 각각의 폴딩 연산 로직부(400)는, 다른 것에서부터 하나의 소스 데이터 요소를 빼내어 이것이 더 크다는 표시를 경로(415)를 통해 멀티플렉서(420)에 제공하는 산술부(410)를 갖는다. 경로(415)를 통해 제공되는 표시를 토대로, 멀티플렉서는 더 큰 값의 소스 데이터 요소를 연산 로직부(400)로부터 출력한다. 따라서, 각각의 폴딩 연산 로직부(400)는 관련된 인접한 데이터 요소의 쌍 중 최대값을 각자의 경로(425, 435, 445, 455)를 통해 출력하도록 배열된다는 것을 알 수 있다.
선택 및 분배 로직(450)은 결과 데이터 요소를 수신하고, 필요한 때 이들을 경로(431 내지 434)를 통해 제공하여, 상기 언급된 명령어를 지원하여 SIMD 레지스터 파일(20) 내의 레지스터(Dd)의 엔트리에 저장한다. 이제, 선택 및 분배 로직(450)의 동작이 설명되게 된다.
도 30a에 도시된 명령어를 지원하기 위해, 소스 데이터 요소(Dm[0] 내지 Dm[3])가 아래쪽 두 개의 폴딩 연산 로직부(400)에 제공된다. 폴딩 연산 로직부(400)는 경로(425 및 435)를 통해 데이터 요소를 출력한다. 경로(431 및 432)는 부호-확장되거나 제로-확장된 포맷으로 Dm[0] op Dm[1]을 제공하는 반면, 경로(433 및 434)는 부호-확장되거나 제로-확장된 포맷으로 Dm[2] op Dm[3]를 제공하게 된다. 이것은, 멀티플렉서(470)로 하여금 그들의 B 입력을 선택하게 하고, 멀티플렉서(460)로 하여금 부호-확장 또는 제로-확장 중 하나를 선택하게 하고, 멀티플렉서(490)로 하여금 그들의 E 입력을 선택하게 하며, 멀티플렉서(480)로 하여금 그것의 D 입력을 선택하게 하는, 폴딩 명령어에 응답하여 SIMD 디코더(16)에 의해 발생되는 신호에 의해 얻어진다.
도 30b에 도시된 명령어를 지원하기 위해, 소스 데이터 요소(Dm[0] 내지 Dm[3])가 아래의 두 폴딩 연산 로직부(400)에 제공되는 반면, 소스 데이터 요소(Dn[0] 내지 Dn[3])가 위쪽의 두 폴딩 연산 로직부(400)에 제공된다. 폴딩 연산 로직부(400)는 경로(425, 435, 445, 및 455)를 통해 데이터 요소를 출력한다. 경로(431)는 Dm[0] op Dm[1]을 제공하게 되고, 경로(432)는 Dm[2] op Dm[3]을 제공하 게 되고, 경로(433)는 Dn[0] op Dn[1]을 제공하게 되며, 경로(434)는 Dn[2] op Dn[3]을 제공하게 된다. 이것은, 멀티플렉서(470)로 하여금 그들의 A 입력을 선택하게 하고, 멀티플렉서(480)로 하여금 그것의 C 입력을 선택하게 하며, 멀티플렉서(490)로 하여금 그들의 E 입력을 선택하게 하는, 폴딩 명령어에 응답하여 SIMD 디코더(16)에 의해 발생되는 신호에 의해 이루어진다.
도 30c에 도시된 명령어를 지원하기 위해, 소스 데이터 요소(Qm[0] 내지 Qm[7])가 폴딩 연산 로직부(400)에 제공된다. 폴딩 연산 로직부(400)는 경로(425, 435, 445, 및 455)를 통해 데이터 요소를 출력한다. 경로(431)는 Qm[0] op Qm[1]을 제공하고, 경로(432)는 Qm[2] op Qm[3]을 제공하고, 경로(433)는 Qm[4] op Qm[5]를 제공하며, 경로(434)는 Qm[6] op Qm[7]을 제공하게 된다. 이것은, 멀티플렉서(470)로 하여금 그들의 A 입력을 선택하게 하고, 멀티플렉서(480)로 하여금 그것의 C 입력을 선택하게 하며, 멀티플렉서(490)로 하여금 그들의 E 입력을 선택하게 하는 폴딩 명령어에 응답하여 SIMD 디코더(16)에 의해 발생되는 신호에 의해 얻어진다.
도 30d에 도시된 명령어를 지원하기 위해, 소스 데이터 요소(Dm[0] 내지 Dm[3])가 아래쪽 두 개의 폴딩 연산 로직부(400)에 제공된다. 폴딩 연산 로직부(400)는 경로(425 및 435)를 통해 데이터 요소를 출력한다. 경로(431)는 Dm[0] op Dm[1]을 제공하고, 경로(432)는 Dm[2] op Dm[3]을 제공하고, 경로(433)는 Dm[0] op Dm[1]을 제공하며, 경로(434)는 Dm[2] op Dm[3]을 제공하게 된다. 이것은, 멀티플렉서(470)로 하여금 그들의 A 입력을 선택하게 하고, 멀티플렉서(480)로 하여 금 그것의 D 입력을 선택하게 하며, 멀티플렉서(490)로 하여금 그들의 F 입력을 선택하게 하는 폴딩 명령어에 응답하여 SIMD 디코더(16)에 의해 발생되는 신호에 의해 얻어진다. 선택적으로, 소스 데이터 요소가 대신 위쪽의 두 개의 폴딩 연산 로직부(400)에 제공되고, 상기 도 30b를 참조하여 설명한 것과 동일한 연산이 수행되어, 선택 및 분배 로직(450)의 복잡도를 줄인다는 것을 이해할 것이다.
따라서, 상기 로직이 소스 데이터 요소로부터 직접 단일 연산으로 두 개의 인접한 소스 데이터 요소로부터 결과 데이터 요소가 발생될 수 있게 한다는 것을 알 수 있다.
상기 언급된 바와 같이, 폴딩 연산 로직부(400)는 소스 데이터 요소에 임의의 수의 연산을 수행하도록 배열될 수 있다. 예컨대, 선택적으로 멀티플렉서(420)로 하여금 경로(425)를 통해 소스 데이터 요소의 최소값을 공급할 수 있게 하기 위한 또 다른 로직이 용이하게 제공될 수 있다. 선택적으로, 산술부(410)는 소스 데이터 요소를 선택적으로 가산하거나, 감산하거나, 비교 또는 승산하여, 결과 데이터 요소를 출력하도록 배열될 수 있다. 따라서, 본 실시예의 접근법은 상기와 같은 배열을 사용하여 수행될 수 있는 폴딩 연산의 범위에서 상당한 유연성을 제공하는 이점이 있다는 것을 이해할 것이다.
또한,도 31을 참조하여 설명된 로직이 16-비트 연산을 지원하지만, 상기와 유사한 로직이 제공되어 32 또는 8-비트 연산 또는 실제로 어떤 다른 크기를 지원할 수 있다는 것을 이해할 것이다.
도 32는 벡터-바이-스칼라 SIMD 명령어의 연산을 도시한다. SIMD 명령어는 다른 곳에 기재된 것과 동일한 구문을 따른다. 이전의 경우와 같이, 두 개의 소스 레지스터가 표시되는 경우, 이들은 동일한 레지스터일 수도 있다는 것을 이해할 것이다. 또한, 각 소스 레지스터는, 이용되는 레지스터 공간의 양을 줄여 데이터 요소의 효율적인 재순환을 가능하게 하기 위해 목적지 레지스터로 지정될 수 있다.
레지스터(Dm)는 다수의 데이터 요소(Dm[0] 내지 Dm[3])를 저장한다. 이들 데이터 요소 각각은 선택가능한 스칼라 오퍼랜드를 표현한다. 벡터-바이-스칼라 SIMD 명령어는 데이터 요소 중 하나를 스칼라 오퍼랜드로 지정하고, 그 스칼라 오퍼랜드를 사용하여 다른 레지스터(Dn)의 모든 데이터 요소에 병렬로 연산을 수행하여, 그 결과가 레지스터(Dd)의 상응하는 엔트리에 저장된다. 레지스터(Dm, Dn, 및 Dd)에 저장된 모든 데이터 요소가 모두 상이한 크기로 이루어질 수 있다는 것을 이해할 것이다. 특히, 결과 데이터 요소는 소스 데이터 요소에 대해 프로모트될 수도 있다. 프로모팅은 제로 채우기(zero padding) 또는 부호 확장을 수반하여, 하나의 데이터 유형에서 다른 유형으로 변환할 수 있다. 이것은 오버플로우가 발생하지 않게 하는 추가 이점을 가질 수 있다.
SIMD 연산에 대해 하나의 스칼라 오퍼랜드를 선택할 수 있는 것은 데이터 요소 행렬을 수반하는 상황에서 특히 효율적이다. 상이한 스칼라 오퍼랜드가 SIMD 레지스터 파일(20)에 기록된 다음, 데이터 요소를 재기록하거나 데이터 요소를 옮길 필요없이 상이한 벡터-바이-스칼라 연산을 위해 용이하게 선택될 수 있다. 다음과 같은 예시적인 곱셈 명령어가 상기 연산을 지원한다:
스칼라를 이용한 곱셈
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VMUL .I16 Dd,Dn,Dm[x] (Vd[i]=Vn[i]*Vm[x])
.I32 Qd,Qn,Dm[x]
.F32
.S32.S16 Qd,Dn,Dm[x]
.S64.S32
.U32.U16
.U64.U32
스칼라를 이용한 곱셈 누산
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VMLA .I16 Dd,Dn,Dm[x] (Vd[i]=Vd[i]+(Vn[i]*Vm[x]))
.I32 Qd,Qn,Dm[x]
.F32
.S32.S16 Qd,Dn,Dm[x]
.S64.S32
.U32.U16
.U64.U32
스칼라를 이용한 곱셈 감산
간략 기호 데이터 유형 오퍼랜드 포맷 설명
VMLS .I16 Dd,Dn,Dm[x] (Vd[i]=Vd[i]-(Vn[i]*Vm[x]))
.I32 Qd,Qn,Dm[x]
.F32
.S32.S16 Qd,Dn,Dm[x]
.S64.S32
.U32.U16
.U64.U32
Vd, Vn, 및 Vm은 선택된 레지스터 포맷 및 선택된 데이터 유형으로부터 구성된 요소의 벡터를 설명한다. 이 벡터 내의 요소는 배열 표기[x]를 사용하여 선택된다. 예컨대, Vd[0]은 벡터(Vd)에서 가장 낮은 요소를 선택한다.
반복자(iterator)(i)는 벡터 정의를 가능하게 하는데 사용된다; 의미구조는 i의 모든 값을 보유하는데, 여기서 i는 벡터 내의 요소의 수보다 작다. 명령어 정의가 '데이터 유형' 및 '오퍼랜드 포맷' 열을 제공하며; 유효한 명령어가 각 열로부터 하나를 얻음으로써 구성된다.
도 33은 SIMD 레지스터 파일(20)에서의 스칼라 오퍼랜드(H0 내지 H31)의 배열을 도시한다. 다른 곳에 언급된 바와 같이, SIMD 레지스터 파일(20) 내의 데이터 요소의 장소를 지정하기 위해 명령어 필드에 사용되는 비트의 바람직한 수는 5-비트이다. 이것은 32개의 가능한 장소가 지정될 수 있게 한다. 스칼라 오퍼랜드를 SIMD 레지스터 파일(20)에 맵핑하는 한 가지 방법은 레지스터(D0 내지 D31) 각각 의 제1 엔트리에 각 오퍼랜드를 배치하는 것임을 이해할 것이다. 그러나, 상기 대신 SIMD 레지스터 파일(20)은 선택가능한 스칼라 오퍼랜드를 SIMD 레지스터 파일(20)의 제1의 32개 논리적 엔트리로 맵핑하거나 앨리어스하도록 배열된다. 이러한 방식으로 스칼라 오퍼랜드를 맵핑하는 것은 상당한 이점을 제공한다. 먼저, 스칼라 오퍼랜드를 연속적인 엔트리에 배치함으로써, 스칼라 오퍼랜드를 저장하는데 사용되는 D 레지스터의 수가 최소화되고, 이는 다른 데이터 요소를 저장하는데 이용될 수 있는 D 레지스터의 수를 극대화한다. 스칼라 오퍼랜드가 연속 엔트리에 저장되게 함으로써, 벡터 내의 모든 스칼라 오퍼랜드가 액세스될 수 있으며, 이것은 행렬 또는 필터 연산을 수행할 때 특히 유리하다. 예컨대, 행렬 바이 벡터 곱셈은 벡터로부터 선택된 각 스칼라에 대해 벡터 바이 스칼라 연산이 수행될 것을 요구한다. 더욱이, 선택가능한 스칼라 오퍼랜드를 상기와 같이 방식으로 저장하면, 레지스터의 적어도 일부로부터 모든 스칼라 오퍼랜드가 그 레지스터로부터 선택될 수 있다.
도 34는 실시예의 벡터-바이-스칼라 연산을 수행하도록 배열된 로직을 개략적으로 도시한다.
소스 데이터 요소(Dm[0] 내지 Dm[3])가 레지스터(Dm)로부터 제공된다. 각 소스 데이터 요소는 다수의 멀티플렉서(500)를 포함하는 스칼라 선택 로직(510)에 제공된다. 각 소스 데이터 요소는 각 멀티플렉서(500)의 한 입력에 제공된다(즉, 멀티플렉서 각각은 소스 데이터 요소(Dm[0] 내지 Dm[3])를 수신함). 따라서, 각 멀티플렉서가 소스 데이터 요소(Dm[0] 내지 Dm[3]) 중 임의의 요소를 출력할 수 있 다는 것을 알 수 있다. 상기 실시예에서, 각 멀티플렉서는 동일한 소스 데이터 요소를 출력하도록 배열된다. 따라서, 스칼라 선택 로직(510)은 하나의 스칼라 오퍼랜드를 선택하여 출력하도록 배열된다. 이것은, 멀티플렉서로 하여금 소스 데이터 요소(Dm[0] 내지 Dm[3]) 중 한 요소를 선택된 스칼라 오퍼랜드로서 출력하게 하는, 벡터-바이-스칼라 명령어에 응답하여 SIMD 디코더(16)에 의해 발생되는 신호에 의해 얻어진다.
벡터-바이-스칼라 연산 로직(520)은 선택된 스칼라 오퍼랜드를 수신하고, 또한 레지스터(Dn)로부터 제공되는 소스 데이터 요소(Dn[0] 내지 Dn[3])를 수신한다. 각각의 소스 데이터 요소는 다수의 연산부(530)를 포함하는 벡터-바이-스칼라 연산 로직(520)에 제공된다. 각 소스 데이터 요소는 연산부(530) 중 하나에 제공된다(즉, 각 연산부는 소스 데이터 요소(Dn[0] 내지 Dn[3]) 중 한 요소와, 상기 선택된 스칼라 오퍼랜드를 수신함). 벡터-바이-스칼라 연산 로직(520)은 두 개의 데이터 요소에 연산을 수행하고, 그 결과로 얻어지는 데이터 요소를 출력하여, 상기-언급된 명령어를 지원하여 SIMD 레지스터 데이터 파일(20)의 레지스터의 각자의 엔트리에 저장한다. 이것은, 연산부(530)로 하여금 상기 수신된 데이터 요소에 필요한 연산을 수행하도록 하는, 벡터-바이-스칼라 명령어에 응답하여 SIMD 디코더(16)에 의해 발생되는 신호에 의해 이루어진다.
따라서, 상기 로직은, 소스 레지스터의 데이터 요소 중 하나가 스칼라 오퍼랜드로 선택되어, 다른 레지스터로부터의 모든 소스 데이터 요소에 동일한 스칼라 오퍼랜드를 사용하여 벡터-바이-스칼라 연산을 수행할 수 있게 한다는 것을 알 수 있다.
도 35는, SIMD 처리 동안 시프트 및 좁히는 연산을 다루는 공지된 방법을 도시한다. 알 수 있는 바와 같이, 이 연산을 수행하기 위해서는 세 개의 개별적인 명령어(SHR, SHR, 및 PACK LO)가 필요하다. 중간 값은 도 35와, 도 36 및 38에 점선으로 명확하게 도시되어 있다.
도 36은 본 기술에 따른 시프트 라이트 및 좁히는 연산을 도시한다. 본 실시예의 구조는 특히 시프트 및 좁히는 연산을 처리하는데 맞게 잘 조정되며, 단일 명령어에 응답하여 그와 같이 수행할 수 있다. 명령어는 SIMD 디코더(16)(도 1 참조) 내의 명령어 디코더에 의해 디코딩된다. 상기 예에서, SIMD 레지스터 파일(20)(도 1 참조)에 놓여있는 레지스터(Qn) 내의 데이터가 5 비트 시프트 라이트된 다음, 나머지 데이터가 라운드(round)되어, 오른쪽 16 비트가 SIMD 레지스터 파일(20)에 역시 놓여있는 목적지 레지스터(Dd)로 전송된다. 하드웨어는 부가적으로 명령어에 따라 데이터의 라운딩 및/또는 포화를 지원할 수 있다. 일반적으로, 시프트 라이트 명령어는, 정수를 다룰 때 시프트 라이트하는 것이 일반적으로 더 작은 수를 생성하므로 포화를 요구하지 않는다. 그러나, 시프트 라이트하고 좁힐 때는, 포화가 적절할 수도 있다.
포화는 가장 근접한 허용가능한 값을 선택함으로써 데이터 요소를 소정의 범위로 한정하는데 사용될 수 있는 처리이다. 예컨대, 두 개의 부호없는 8-비트 정수가 8 비트 레지스터를 사용하여 곱해질 경우, 그 결과는 오버플로우될 수도 있다. 이러한 경우, 주어질 수 있는 가장 정확한 결과가 2진수 11111111이며, 따라 서 상기 수가 포화되어 그 값을 제공하게 된다. 시프트하고 좁힐 때 상기와 유사한 문제가 발생할 수 있으며, 이로써 좁아지는 수는 더 좁은 공간에 맞을 수 없다. 이러한 경우, 부호없는 수의 경우에는, 시프트 단계에서 버려지는 임의의 비트가 제로가 아니면, 상기 수는 최대 허용가능한 값으로 포화된다. 부호있는 수의 경우에는 문제가 더 복잡해진다. 이 경우, 최상위 비트가 임의의 버려지는 비트와 상이하면, 상기 수는 최대 허용되는 양의 수 또는 최대 허용되는 음의 수로 포화되어야 한다.
포화는 또한, 데이터 요소 입력의 유형이 출력과 상이할 경우, 예컨대 부호있는 값이 시프트되고 좁혀져 포화되어, 부호없는 값이 출력될 경우 발생할 수 있다. 상이한 데이터 유형을 출력하는 기능은 매우 유용할 수 있다. 예컨대, 화소 처리에 있어서, 휘도는 부호없는 값이지만, 이 값을 처리하는 동안 부호있는 값으로 처리하는 것이 적절할 수도 있다. 처리 후, 부호없는 값이 출력되지만, 값을 포화시키는 기능이 제공되지 않는다면, 간단히 부호있는 값에서 부호없는 값으로 전환하는 것은 문제를 야기할 수 있다. 예컨대, 처리하는 동안 약간의 부정확성으로 인해 휘도 값이 음의 값으로 떨어진다면, 간단히 상기 음의 부호있는 값을 부호없는 값으로 출력하는 것은 무의미하다. 따라서, 부호없는 값을 출력하기에 앞서 임의의 음수를 제로로 포화시키는 기능은 매우 유용한 기술이다.
상이한 시프트 명령어에 대해 가능한 포맷의 예가 표 6 및 7에 제공된다. 알 수 있는 바와 같이, 명령어는 정면에 V를 가짐으로서 그것이 벡터 명령어임을 지정하며, 그 다음 시프트는 SH로 지정되고, 즉치값(immediates)을 이용하여 시프 트하는 경우라면, 방향 오른쪽 또는 왼쪽은 R 또는 L로 표시된다. 다음으로, 명령어는 표 0에서와 같이 두 가지 유형을 포함하는데, 제1 유형은 목적지 레지스터의 데이터 요소의 크기이고, 제2 유형은 소스 레지스터의 요소의 크기이다. 다음 정보는 목적지 레지스터와 수신지 레지스터의 이름을 포함하며, 그런 다음 즉치값이 제공될 수 있는데, 이 값은, 데이터가 시프트될 비트의 수를 나타내며 그 앞에 #이 선행된다. 명령어의 일반 포맷에 대한 변경 포맷이 사용될 수 있으며, Q는 연산이 정수 산술의 포화를 사용한다는 것을 나타내는데 사용되며, R은 연산이 라운딩을 수행한다는 것을 나타내는데 사용된다. 명령어의 포맷에 대한 보다 세부적인 사항은, 예컨대 표 0의 상세한 설명에서 이미 제공되어 있다.
표 7은 부호있는 변수를 이용하여 시프트하는 명령어를 도시한다. 이 명령어는 즉치값을 이용하여 시프트 레프트하는 것과 동일하지만, 즉치값에 명령어를 제공하는 대신, 부호있는 변수의 벡터가 저장되는 곳을 나타내는 레지스터 주소가 명령어를 제공받는다. 이러한 경우, 음수는 우측 시프트를 나타낸다. 시프트될 다수의 비트 벡터로 저장되므로, 상이한 부호있는 변수가 각 데이터 요소마다 저장되어, 이들이 각기 다른 양만큼 각각 시프트될 수 있다. 이러한 과정은 도 39에 더 상세하게 도시되어 있다.
[표 6]
즉치값을 이용한 시프트
즉치값 시프트는 명령어 내에 인코딩된 즉치값을 사용하여, 소스 벡터의 모든 요소를 동일한 양만큼 시프트한다. 좁아진 버전은 포화를 포함할 수 있는 값의 캐스팅 다운(casting down)을 허용하는 한편, 긴 버전은 어떤 고정 소수점을 이용한 캐스팅 업(casting up)을 허용한다.
누산을 이용한 시프트 버전은 다수의 DSP 알고리즘에서 발견되는 효과적인 크기조정 및 누산을 지원하도록 제공된다. 라이트 시프트 명령어가 또한 라운딩 옵션을 제공한다. 라운딩은, 실질적으로 라운드될 수에 그 절반을 가산함으로써 수행된다. 따라서, n 자리 만큼 시프트 라이트할 때, 2n-1이 시프트하기 전의 값에 더해진다. 따라서, 아래의 표에서, round(n)은 n≥1일 경우 2n-1이고, n≤0일 경우 0이다.
효과적인 데이터 패킹이 가능하도록 비트단위 추출 명령어가 포함된다.
Figure 112006039851815-pct00006
Figure 112006039851815-pct00007
Figure 112006039851815-pct00008
[표 7]
부호있는 변수를 이용한 시프트
이 단락에서의 시프트는 제2 벡터에 지정된 부호있는 시프트 양에 의해 제어되는 요소의 한 벡터에 시프트를 수행한다. 부호있는 시프트 양을 지원함으로써, 지수값에 의한 시프트가 지원될 수 있으며, 이는 당연히 음의 값이 될 수 있는데; 음의 제어값은 시프트 라이트를 수행하게 된다. 벡터 시프트는 각 요소가 상이한 양 만큼 시프트되게 할 수 있지만, 시프트를 수행하기 전에 벡터의 모든 레인에 시프트 제어 오퍼랜드를 복제함으로써 모든 레인을 동일한 양만큼 시프트하는데 사용될 수 있다. 부호있는 시프트 제어값은 시프트될 오퍼랜드의 최소 오퍼랜드 요소 크기와 동일한 크기의 요소이다. 그러나, 시프터 변수는 시프트 양을 판정하는데단지 각 레인의 아래 8-비트만을 사용하여 해석된다. 또한, 라운딩 및 포화 옵션이 이용될 수 있다.
Figure 112006039851815-pct00009
따라서, 알 수 있는 바와 같이, 하드웨어는 소스 데이터 요소 및 결과 데이터 요소의 크기와, 때로는 데이터가 시프트될 자리의 수를 지정할 수 있는 명령어를 지원한다. 이와 같이 함으로써, 매우 조정가능하며 강력한 수단이 얻어진다.
도 36에 도시되어 있는 시프트 라이트 및 좁히는 연산은 다수의 가능한 응용을 갖는다. 예컨대, 소정의 정확도를 요구하는 고정 소수점 수를 수반하는 계산에서, 계산이 수행되는 동안 데이터의 오버플로우 또는 언더플로우 위험을 줄이기 위해, 32-비트 데이터 값의 중심 방향의 어떤 장소에 소위 16-비트 수를 배치하는 것이 적절할 수도 있다. 계산 종료시, 16-비트의 수가 필요할 수도 있으므로, 도 36에 도시된 시프트 및 좁히는 연산이 적절하게 된다. 상이한 크기의 소스 및 목적지 레지스터를 사용하는 본 기술에 의해 얻어질 수 있는 것은 특히 여기서 효과적이며, 상이한 크기의 데이터가 SIMD 처리 중에 소정의 레인에 유지될 수 있게 한다.
도 36에 도시된 것과 유사한 시프트 및 좁히는 연산의 또 다른 사용은 컬러 화소 데이터의 처리에서 있을 수 있다. SIMD 처리는 특히 영상 데이터에 있어서, 영상 데이터가 모두 동일한 연산이 수행될 것을 요구하는 다수의 화소를 포함할 때 적절하다. 따라서, 상이한 화소 데이터가 레지스터의 상이한 레인에 존재할 수 있으며, 단일 명령어가 모든 데이터에 동일한 연산을 수행할 수 있다. 종종, 영상 데이터는 적색, 녹색, 및 청색 데이터로서 나타날 수도 있다. 이것은, 중요한 연산이 그것에 수행될 수 있기 전에 분리될 필요가 있다. 도 37은 16-비트 데이터 요소로 존재하는 적색, 녹색, 및 청색 데이터의 일반적인 예를 도시한다. 상기 도 시된 예에서, 청색 데이터는 3비트 만큼 시프트 레프트하고 좁히는 연산에 의해 추출될 수 있다. 3자리 시프트 레프트하면, 점선으로 된 레지스터(중간 값을 표현함)에 의해 개략적으로 도시되어 있는 바와 같이 데이터 요소 중앙의 오른쪽으로 청색 데이터를 전송하며, 세 개의 제로가 데이터의 시프트 레프트에 의해 야기되는 데이터 값의 오른쪽에 있는 세 개의 비어있는 위치에 채워진다. 좁히는 연산은, 청색 데이터 및 세 개의 제로가 상기 결과 얻어지는 8 비트 데이터 요소로 전송되는 결과를 가져온다.
시프트하고 좁히는 것 외에, 본 기술은 또한 캐스트 업하고 시프트하는데 사용될 수 있는데, 이 과정은 도 38에 도시되어 있다. 이러한 경우, 캐스팅 업이 수행된 다음, 시프트 레프트가 수행된다. 상기 연산은, 예컨대 32-비트 값을 64-비트 값으로 전송하는데 사용될 수 있으며, 32-비트 값은 64-비트 값 내의 적절한 위치에 놓인다. 도시되어 있는 예에서는, 두 개의 32 비트 값이, 최하위 비트로서 제로가 가산되게 하여 레인의 최상위 비트에 놓임으로써 64 비트 값으로 전송된다.
도 39는, 벡터 값을 사용하여 각 데이터 요소가 시프트되는 자리의 수를 나타낼 수 있다는 것을 도시하며, 상기 값은 부호있는 정수이며, 음수는 시프트 라이트를 나타낸다. 각 데이터 요소에 대한 값을 보유하는 레지스터가 사용되며, 각각의 데이터 요소는 그 레인에 놓인 값에 의해 지정되는 양만큼 시프트된다. 이러한 연산을 위한 명령어는 표 7에 이미 설명되어 있다.
도 40은 간단한 멀티플렉싱 동작을 개략적으로 도시하는 것이다. 상기 멀티플렉싱 동작에서, 멀티플렉서(700)는 제어 비트(c)의 값에 따라 D에 출력될 값(a) 또는 값(b) 중 어느 하나를 선택한다. c는 a 와 b 중에서 출력을 선택하는데 사용된다. c는 종종 a > b와 같은 결정 결과를 기반으로 한다. 상기 구조의 실시예는 SIMD 처리 동안 멀티플렉싱 동작을 수행할 수 있는 기능을 제공한다. SIMD 처리는 분기 동작을 수행하는데 적합하지 않으므로, 다른 명령어의 경우 표준을 사용하여 멀티플렉싱이 수행될 수 없으며, 오히려 마스크가 생성되는데, 상기 마스크는 두 개의 소스 레지스터(a 및 b)의 어느 부분이 선택되는지를 나타내는데 사용된다.
상기 마스크는 두 소스 레지스터(a 및 b) 중 어느 부분이 선택되는지를 나타내는데 사용되는 제어값으로 구성된다. 어떤 실시예에서는, 소정의 위치에서의 1이 b의 소정의 부분이 선택된다는 것을 나타낼 수 있는 반면, 그 위치에서의 0이 a의 상응하는 부분이 선택된다는 것을 나타낸다. 이 마스크는 범용 레지스터에 저장되므로, 전용 레지스터에 대한 필요성이 감소된다.
마스크의 생성은 수행될 멀티플렉싱 동작에 의존하며, 이 동작에 응답하여 생성된다. 예컨대, 상기와 같이 주어지는 경우, a 와 b의 비교가 수행된다. 이것은 한 부분씩 수행될 수 있으며, 예컨대 SIMD 처리에서의 상응하는 데이터 요소가 비교된다. b 와 a의 상응하는 데이터 요소가 비교되어, b가 a보다 큰지, 또는 b가 a 이하인지에 의존하는 제어값을 저장하는데 사용되는 범용 레지스터의 일부에 값이 기록된다. 이것은 모든 데이터 요소에 병렬로 명령어 VCGT 보다 큰 비교를 사용하여 수행될 수 있다. 이 명령어는 시스템의 실시예의 명령에 세트에 제공된다. 아래의 표 8은 상기 구조의 실시예에 의해 제공되는 넓은 범위의 비교 명령어 중 일부를 도시하는 것이다.
[표 8]
비교 및 선택
데이터 플레인 선택 및 마스킹을 제공하는데 사용될 수 있는, 마스크를 생성하기 위한 변수의 비교 및 선택이 수행될 수 있다. 이것은 또한, 벡터화된 코드의 끝에 사용되어 벡터 내의 최대값 또는 최소값을 발견할 수 있는 폴딩 버전을 포함하여, 최대값 및 최소값을 선택하기 위한 명령어를 제공한다.
Figure 112006039851815-pct00010
Figure 112006039851815-pct00011
일단 마스크가 생성되면, 이 마스크를 포함하는 범용 레지스터, 즉 제어 레지스터(C)를 사용하여 a 또는 b 중 하나를 선택하기 위해 단일 명령어가 사용될 수 있다. 따라서, 데이터 프로세서는 C에 의해 제어되어, a 또는 b 중 하나를 선택하는 멀티플렉싱 동작을 수행한다.
도 41은, 소스 값의 선택(a 또는 b)이 비트단위 원리로 수행되는 시스템의 일 실시예를 개략적으로 도시한다. 이러한 경우, 제어 레지스터(730)는 레지스터 a(710)와 b(720)의 데이터 요소를 비교함으로써 데이터로 채워진다. 따라서, 8 비트 폭의 데이터 요소(a0)가 동일한 크기를 갖는 데이터 요소(b0)와 비교된다. 이 경우, a는 b 보다 작거나 그와 동일하며, 따라서 제어 레지스터(730)의 상응하는 부분에 8개의 0이 삽입된다. a가 b 보다 크다면, 제어 레지스터(730)의 상응하는 부분에 8개의 1이 삽입된다. 상기와 유사한 비교가 모든 데이터 요소에 대해 병렬로 수행되어, 상응하는 제어 비트가 생성된다. 제어 벡터를 생성하는 비교 연산은 명령어 VCGT.S8 c,a,b에 상응한다. 다음으로, 소스 레지스터에 저장된 비트와 제어 레지스터에 저장된 비트 사이에 간단한 논리 연산을 수행함으로써, 1 비트씩 매우 간단하게 선택이 수행될 수 있으며, 상기 결과 얻어지는 비트가, 상기 예에서 레지스터(730)인 목적지 레지스터로 기록되는데, 즉 상기 결과는 제어값에 겹쳐 쓰여진다. 이러한 비트단위 선택의 장점은, 데이터 유형 및 폭에 독립적이며, 적절하다면 상이한 크기의 데이터 요소가 비교될 수 있다는 것이다.
도 42는, 제어가 비트단위 원리로 수행되지 않고 데이터 요소 원리로 수행되는 선택적인 실시예를 도시한다. 상기 도시된 실시예에서는, 제어 레지스터 C(730)의 데이터 요소가 0보다 크거나 그와 동일하다면, 소스 레지스터 b(720)의 상응하는 데이터 요소가 목적지 레지스터(상기의 경우 레지스터(720))에 기록된다. 상기 예에서와 같이 C가 부호있는 정수라면, a 또는 b 중 어느 것을 선택할지를 결정할 때 C의 최상위 비트만 고려될 필요가 있다.
다른 실시예에서, 레지스터 a(710)로부터의 데이터 요소가 선택될지 또는 레지스터 b(720)로부터의 데이터 요소가 선택될지를 결정하는데, C의 다른 특성이 사용될 수 있다. 이러한 특성의 예는, C가 홀수인지 또는 짝수인지 여부(여기서 제어값의 단 1 비트만, 상기의 경우 최하위 비트만이 고려될 필요가 있음), 또는 C가 제로와 동일한지, 제로와 동일하지 않은지, 또는 제로 보다 큰지를 포함한다.
일반적으로, ARM 명령어 및 실제로 다수의 다른 RISC 명령어는 오로지 세 개의 오퍼랜드에 임의의 명령어를 제공한다. 멀티플렉싱 동작은 일반적으로 두 개의 소스 레지스터(a 및 b), 제어 레지스터(c), 및 목적지 레지스터(D)를 지정하기 위해 네 개의 오퍼랜드를 필요로 한다. 본 발명의 실시예는, 일반적으로 멀티플렉싱 동작 이후 두 세트의 소스 데이터 또는 제어 데이터 중 적어도 하나가 더 이상 필요하지 않다는 점을 이용한다. 따라서, 목적지 레지스터는 두 개의 소스 레지스터 중 하나 또는 제어 레지스터 중 어느 하나가 되도록 선택된다. 이것은 단지, 제어 레지스터가 범용 레지스터이고 전용 레지스터가 아닐 때 작동한다. 시스템의 실시예에 있어서, 세 가지 상이한 명령어가 명령어 세트에 제공되는데, 한 명령어는 하나의 소스 레지스터에 다시 기록하기 위한 것이고, 다른 명령어는 남은 하나의 소스 레지스터에 다시 기록하기 위한 것이며, 제3 명령어는 제어 레지스터에 기록하기 위한 것이다. 각 명령어는, 두 개의 소스 레지스터 및 제어 레지스터를 지정하는 단 세 개의 오퍼랜드를 필요로 한다. 이들 세 개의 명령어가 아래의 표 9에 지정되어 있다.
[표 9]
논리적 및 비트단위 선택
Figure 112006039851815-pct00012
도 43은 시스템에 의해 제공되는 세 개의 멀티플렉싱 명령어에 상응하는 멀티플렉서 배열의 세 가지 예를 개략적으로 도시하는 것이다. 도 43a는 명령어 비트단위 선택(VBSL)을 수행하도록 연결된 멀티플렉서(701)를 도시한다. 상기 예에서는, 도 41 및 42에 도시된 예와 대조적으로, C가 거짓(0)일 때 A가 선택되고, C가 참(1)일 때 B가 선택된다. 도시된 실시예에서, 목적지 레지스터는 제어 레지스터와 동일하여, 결과값이 제어값에 겹쳐 쓰여진다. 상기와 반대되는 선택이 필요할 경우, 즉 C가 참일 때 A가 선택되고, C가 거짓일 때 B가 선택될 경우에는, 간단히 오퍼랜드 A와 B를 교환함으로써, 상기와 동일한 회로가 사용될 수 있다.
도 43b는, 참일 경우 명령어 BIT 비트단위 삽입에 상응하는 멀티플렉서(702)를 도시하는 것으로서, 결과적으로 소스 레지스터(A)가 소스 및 목적지 레지스터 두 가지 모두의 역할을 하며 결과 데이터로 겹쳐 쓰여진다. 상기 예에서는, C가 참일 때 B가 A로 기록되는 반면, C가 거짓일 경우에는, 레지스터(A)에 존재하는 값이 변경되지 않고 유지된다. 상기 실시예에서, 상기와 반대되는 선택이 필요하다면, 즉 C가 참이 아니라 거짓일 경우 B를 목적지 레지스터에 기록하는 것이 바람직 하다면, 상기 장치가 멀티플렉서(701)의 대칭성을 가지고 있지 않으므로 간단히 레지스터의 배치를 바꾸는 것은 불가능하다.
도 43a는 도 43b의 반대되는 선택, 즉 거짓일 경우의 명령어 BIF 비트단위 삽입에 상응하도록 설정되는 멀티플렉서(703)를 도시한다. 이 실시예에서는, C가 거짓일 때 레지스터(A)의 값이 레지스터(B)에 기록되는 반면, C가 참일 때는, 레지스터(B)의 값이 변경되지 않고 유지된다. 도 43b에서와 같이, 이 시스템에는 대칭성이 존재하지 않는다.
도 44는 메모리 내에 저장되는 데이터의 바이트 시퀀스(B0 내지 B7)를 개략적으로 도시하는 것이다. 이들 바이트는 바이트 불변 어드레싱에 따라 저장되며, 이와 같이 함으로써 동일한 바이트의 데이터가 현재의 엔디어니스 모드에 관계없이 주어진 메모리 주소의 판독에 응답하여 리턴되게 된다. 메모리는 또한 정렬되지않은 어드레싱을 지원하며, 이와 같이 함으로써 반워드, 워드, 또는 더 큰 멀티-바이트 데이터 요소가 임의의 메모리 바이트 주소에서 시작하는 메모리로부터 판독될 수 있다.
데이터의 8 바이트(B0 내지 B7)가 리틀 엔디언 모드의 시스템을 이용하여 메모리로부터 판독되면, 바이트(B0 내지 B7)는 도 44에 도시된 순서로 레지스터(800) 내에 놓인다. 레지스터(800)는 16 비트의 반워드를 각각 포함하는 네 개의 데이터 요소를 포함한다. 도 44는 또한, 시스템이 빅 엔디언 모드로 동작할 때 레지스터(802)로 판독되는 데이터의 상기와 동일한 8 바이트(B0 내지 B7)를 도시한다.
상기 예에서, 일단 메모리로부터 각자의 SIMD 레지스터(800, 802)로 판독된 데이터는 데이터 요소 크기를 두 배로하는 결과를 가져오는 제곱 연산이 수행된다. 따라서, 그 결과가 두 개의 목적지 SIMD 레지스터(804, 806)에 기록된다. 도 44로부터 알게 되는 바와 같이, 상기 제1 또는 제2의 레지스터 쌍(804, 806)에 각각 기록된 결과값은, 데이터가 메모리로부터 판독된 엔디어니스 모드에 따라 변화한다. 따라서, 제곱 결과값을 또한 조종할 수 있는 SIMD 컴퓨터 프로그램이 엔디어니스 모드에 따라 데이터의 상이한 레이아웃을 고려하도록 변경될 필요가 있을 수 있다. 이것은 불리하게도, 메모리 내에 데이터가 저장된 방법에서의 상이한 엔디어니스에 대처하기 위해 두 가지 상이한 형태의 컴퓨터 프로그램을 생성할 것을 필요로 하는 결과를 가져온다.
도 45는 재배열 로직(808)을 제공함으로써 상기 문제를 처리한다. 데이터 처리 시스템은, 지정된 메모리 주소에서 시작하며 메모리의 바이트 불변 어드레싱 특성을 이용하는 메모리로부터 데이터의 8 바이트(B0 내지 B7)를 판독하는 기능을 하는 메모리 액세싱 로직(810)을 포함하다. 따라서, 메모리 액세싱 로직(810)의 출력은 주어진 메모리 주소로부터 판독된 바이트를 엔디어니스 모드에 관계없이 동일한 출력 레인에 표시한다. 따라서, 데이터 워드가 반워드인 상기 설명된 예에 있어서, 소정의 메모리 주소로부터 복원된 바이트는 한 엔디어니스 모드에서는 반워드의 최상위 부분이 될 수 있는 반면, 다른 엔디어니스 모드에서는 반워드의 최하위 부분이다.
데이터 요소 재배열 로직(808)은, SIMD 레지스터(812)에 로드되는 데이터 요 소가 메모리 시스템 내에서 사용되는 엔디어니스 모드에 관계없이 재배열을 이용하지 않고 로드되며 리틀 엔디언 형태로 저장된 데이터와 일치하는 형태가 되도록, 메모리 액세스 로직(810)에 의해 메모리로부터 검색된 데이터 요소를 재배열할 수 있다. 메모리 시스템 내에서 리틀 엔디언 모드가 사용되는 경우, 데이터 요소 재배열 로직(808)은 바이트를 재배열하지 않고, 이들을 변경하지않고 전달하게 된다. 그러나, 데이터가 메모리 시스템 내에서 빅 엔디언 형태로 저장되는 경우에는, 데이터 요소 재배열 로직(808)이 각 반워드 내의 메모리로부터 판독된 바이트의 순서를 반대로하여, 반워드 데이터 요소가 SIMD 레지스터(812) 내에 리틀 엔디언 형태로 나타나게 하는 기능을 한다. 이러한 방식으로, 단일 SIMD 컴퓨터 프로그램은 메모리 내에 저장된 엔디어니스 모드에 관계없이 SIMD 레지스터로 전송되는 데이터 요소에 올바른 데이터 처리 연산을 수행할 수 있다. 도 45로부터, 데이터 요소 재배열 로직(808)이, 메모리에 의해 사용되는 엔디어니스 모드를 나타내는 신호 및 관련 데이터 요소의 크기를 나타내는 신호에 응답한다는 것을 알 수 있다. 사용되는 엔디어니스 모드는 재배열이 필요한지 여부를 제어하게 되며, 크기는 재배열이 필요할 경우 이용되는 재배열의 특징을 제어하게 된다. 데이터가 리틀 엔디언 모드로 메모리 내에 저장되고, SIMD 레지스터가 리틀 엔디언이면, 재배열이 필요하지 않다는 것을 알 수 있다. 반대로, SIMD 레지스터가 빅 엔디언 형태를 취할 경우에는, 데이터가 빅 엔디언 형태로 메모리 내에 저장될 때는 재배열이 필요하지 않지만, 데이터가 리틀 엔디언 형태로 메모리 내에 저장될 때에는 재배열이 필요하다는 것을 알 수 있다.
도 46은, 상기 예에서 데이터 요소가 32-비트 데이터 워드라는 점을 제외하고 도 45와 유사한 예를 도시한다. 알 수 있는 바와 같이, 이들 데이터 워드가 빅 엔디언 형태로 메모리 내에 저장되면, 데이터 요소 재배열 로직(808)에 의해 적용되는 재배열이 메모리 액세싱 로직(810)에 의해 검색되는 4 바이트 데이터 요소의 바이트 순서를 반대로 하여, 이들이 리틀 엔디언 형태로 메모리에 저장되며 재배열없이 로드된 데이터와 일치하는 형태로 SIMD 레지스터(812)에 저장된다.
본원에서 총괄적으로 설명된 프로세서 시스템에 있어서, 메모리 액세싱 로직(810) 및 데이터 요소 재배열 로직(808)이 상기 기재된 로드 저장부의 일부를 형성할 수 있다는 것을 이해할 것이다. 데이터 요소 재배열 로직(808)은 또한, 스칼라 레지스터 내의 데이터에 대해 소정의 엔디어니스가 사용될 때 스칼라 레지스터로 데이터를 판독할 때 메모리 시스템 엔디어니스를 보상하는데 사용될 수도 있다.
도 47은 데이터 요소 재배열 로직(808)을 더 상세히 도시한다. 이것은 각자의 제어 신호(Z, Y, 및 X)에 의해 제어되는 세 레벨의 멀티플렉서로서 형성된다는 것을 알 수 있다. 이들 세 개의 층은 각각, 데이터의 인접 바이트, 인접 반워드, 및 인접 워드의 위치를 반전시키는 책임이 있다. 제어 신호(X, Y, 및 Z)는, 도 47에 도시되어 있는 바와 같이 각각 64, 32, 또는 16 비트 데이터 요소 크기를 나타내는 크기 신호, 및 빅 엔디언 모드를 나타내는 엔디어니스 신호로부터 디코딩된다. 도 45 및 46에 나타나있는 바와 같이, 다수의 다른 형태의 데이터 요소 재배열 로직이 사용되어 기능상 동일한 결과를 얻을 수 있다는 것을 이해할 것이다.
메모리의 바이트 불변 어드레싱을 수행하는데 사용되는 메모리 액세스 명령 어는 통상적으로 프로세서의 스칼라 레지스터 뱅크의 스칼라 내에 보유되는 메모리 주소 포인터를 사용한다. 프로세서는, SIMD 레지스터 내의 데이터 요소 중 선택된 것에 동작하는 데이터 처리 명령어는 물론 데이터 요소 크기를 변경하는 데이터 처리 명령어를 지원한다.
도 48은, 각각 테이블 레지스터의 기능을 하는 레지스터 목록(D0, D1), 인덱스 레지스터(D7), 및 결과 레지스터(D5)를 포함하는 레지스터 데이터 저장소(900)를 도시하다. 테이블 레지스터(D0, D1)는 레지스터 데이터 저장소(900) 내의 연속적인 번호로 된 레지스터라는 것을 알 수 있다. 결과 레지스터(D7) 및 인덱스 레지스터(D5)는 테이블 레지스터 및 서로에 대해 임의적으로 배치된다. 이러한 데이터 조종에 상응하는 명령어의 구문이 도면에 도시되어 있다.
도 49는 테이블 검색 확장 명령어의 실행을 개략적으로 도시한다. 이 명령어는, 예컨대 목록 내의 제1 레지스터 및 목록 내의 레지스터의 수(예컨대, 1 내지 4)를 지정함으로써 테이블 레지스터 블록으로 사용될 레지스터의 목록을 지정한다. 상기 명령어는 또한 인덱스 레지스터(D7)로서 사용될 레지스터 및 결과 레지스터(D5)로서 사용될 레지스터를 지정한다. 테이블 검색 확장 명령어는 또한, 테이블 레지스터(D0, D1) 내에 저장되고, 선택되어, 결과 레지스터(D5)에 기록될 데이터 요소의 데이터 요소 크기를 지정한다. 도시된 예에서, 테이블 레지스터(D0, D1)는 각각 8개의 데이터 요소를 포함한다. 따라서, 인덱스 값은 0 내지 15의 범위를 갖는다. 이 규정된 범위를 벗어난 인덱스 값은 테이블 검색에서 결과로 나타나지 않고, 대신 결과 레지스터(D5) 내의 상응하는 위치가 변경되지 않고 남아있게 된다. 도시되어 있는 바와 같이, 제4 및 제6 인덱스 값이 상기 방식으로 범위를 벗어나있다. 다른 인덱스 값은 테이블 레지스터(D0, D1) 내에서의 각자의 데이터 요소를 가리키며, 이들 데이터 요소는 결과 레지스터(D5) 내의 상응하는 위치에 저장된다. 인덱스 레지스터(D7) 내의 인덱스 값 위치와 결과 레지스터(D5) 내의 데이터 요소 위치 사이에는 일대일 대응이 이루어진다. 결과 레지스터(D5)에서 "U"로 표시된 값은, 그 위치에 저장된 값이 테이블 검색 확장 명령어를 실행하는 동안 유지된다는 것을 나타낸다. 따라서, 명령어를 실행하기 전에 상기 장소에 저장된 비트는 무엇이든지 명령어 실행 이후 상기 위치 내에 여전히 저장되어 있다.
도 50은 도 49로부터의 인덱스 값을 도시하는 것으로서, 이 값들에 SIMD 감산 연산이 수행됨으로써, 16의 차감계산(offset)이 각 인덱스 값에 적용된다. 이것은 이전에 범위내에 있던 인덱스 값을 범위를 벗어난 값이 되게 한다. 이전에 범위를 벗어난 값은 이제 범위내로 이동한다. 따라서, 현재의 변형된 인덱스 값을 포함하는 인덱스 레지스터(D7)가 다른 테이블 검색 확장 명령어에 재사용되면, 제4 및 제6 인덱스 값이 이제 범위 내에 존재하며, 그 결과 테이블 검색은, 제2 테이블 검색 확장 명령어의 실행에 앞서 또한 리로드된 테이블 레지스터(D0, D1)(또는, 제2 테이블 검색 확장 명령어에 지정될 수 있는 다른 상이한 레지스터)에서 수행된다. 따라서, 인덱스 레지스터(D7) 내의 한 세트의 인덱스 값이 차감계산이 수행된 다음, 리로드된 테이블 레지스터(D0, D1)에 재사용되어, 더 큰 테이블이 이용될 수 있는 효과를 제공한다.
도 51은 테이블 검색 확장 명령어 외에 제공될 수 있는 다른 테이블 검색 명 령어를 도시한다. 이들 명령어 사이의 차이점은, 범위를 벗어난 인덱스 값이 테이블 검색 명령어에 나타나면, 그 인덱스 값에 상응하는 결과 레지스터(D5) 내의 위치가 변경되지 않고 남아있는 대신 제로 값으로 기록된다는 것이다. 이러한 유형의 동작은 소정의 프로그래밍 상황에서 유용하다. 도 51은 두 개의 테이블 레지스터가 아니라 세 개의 테이블 레지스터를 도시한다. 제1, 제3, 제4, 제6, 및 제7 인덱스 값이 범위를 벗어난다. 제2, 제5, 및 제8 인덱스 값은 범위 내에 존재하며, 그 결과 테이블 레지스터 내의 상응하는 데이터 요소의 테이블 검색에 나타난다.
상기 언급된 바와 같이, SIMD 레지스터 파일(20)(도 1 참조)과 메모리 사이에 데이터를 이동시키기 위한 로드 및 저장 명령어가 제공된다. 상기 로드 및 저장 명령어는 각각, 액세스 동작(그것이 로드 동작이든지 또는 저장 동작이든지)이 시작되는 메모리 내의 위치를 식별하는 시작 주소를 지정하게 된다. 실시예의 로드 및 저장 명령어에 따르면, 로드 또는 저장 명령어의 대상이 되는 데이터의 양이 명령어마다 변화할 수 있다. 소정의 실시예에서, 데이터의 양은, 데이터 유형 "dt"(즉, 각 데이터 요소의 크기)를 식별하고, SIMD 레지스터 목록을 식별함으로써 액세스될 데이터의 수 및 부가적으로 액세스될 구조체의 수를 식별함으로써 식별된다.
SIMD 처리를 수행할 때, 종종 필요한 데이터 요소에 대해 수행된 액세스 동작이 종종 정렬되지않은 액세스(또한 본원에서 바이트 정렬 액세스라고도 함)인 경우가 있다. 바꾸어 말하면, 시작 주소가 종종 정렬되지 않으며, 이러한 상황에서 LSU(33)는 액세스 동작을 완료하에 하는데 필요할 수 있는 최대 수의 액세스를 액세스 동작에 할당할 필요가 있다.
가능한 구현예에서, LSU(22)는 모든 액세스가 정렬되지 않는 것으로 간주되도록 배열될 수 있지만, 이것은, 시작 주소가 실제로 어떤 다수의 바이트와 정렬되는 상황에서 LSU(22)가 액세스 동작의 효율을 개선할 수 없다는 것을 의미한다.
시작 주소가 규정된 정렬을 갖는지 여부를 LSU(22)가 시작 주소로부터 판정할 수 있지만, LSU(22)는 보편적으로, 시작 주소가 실제로 계산되기 전에 한 번에 액세스 동작을 위한 액세스의 수를 수용해야 한다. 소정의 실시예에서, LSU(22)는 파이프라인 구조를 가지며, 소정의 액세스 동작을 수행하는데 사용될 액세스의 수가 파이프라인의 디코드 단에서 LSU에 의해 판정된다. 그러나, 종종 시작 주소는, 예컨대 기본 주소에 오프셋 값을 가산함으로써 파이프라인의 후속 실행 단에서 계산되며, 따라서 LSU(22)는 얼마나 많은 액세스를 액세스 동작에 할당할지를 결정하기 전에 시작 주소의 결정을 기다릴 수 없다.
일 실시예에 따르면, 이러한 문제는, 본원에서 정렬 수식어로 언급된 정렬 지정자 필드를 액세스 명령어 내에 제공함으로써 완화된다. 소정의 일 실시예에서, 정렬 수식어는, 시작 주소가 바이트 정렬되는 것으로, 즉 정렬되지 않은 것으로 처리된다는 것을 나타내는 제1 값을 취할 수 있다. 상기 제1 값은 정렬 지정자 필드의 임의의 규정된 인코딩에 의해 제공될 수 있다는 것을 이해할 것이다. 이 외에도, 정렬 수식어는 시작 주소가 따르는 것으로 처리되는 상이한 규정된 정렬을 나타내는 복수의 제2 값 중 어느 하나를 취할 수 있으며, 소정의 일 실시예에서 이 용될 수 있는 복수의 제2 값은 이하의 표에 나타나있는 바와 같다:
[표 10]
정렬 수식어 시작 주소 포맷 약속 및 유용성
@16 ..XXXXXXX0 시작 주소가 2바이트의 배수인 것으로 고려된다.
정확히 2바이트를 전송하는 명령어에 이용될 수 있다.
@32 ..XXXXXX00 시작 주소가 4바이트의 배수인 것으로 고려된다.
정확히 4바이트를 전송하는 명령어에 이용될 수 있다.
@64 ..XXXXX000 시작 주소가 8바이트의 배수인 것으로 고려된다.
8 바이트의 배수를 전송하는 명령어에 이용될 수 있다.
@128 ..XXXX0000 시작 주소가 16바이트의 배수인 것으로 고려된다.
16 바이트의 배수를 전송하는 명령어에 이용될 수 있다.
@256 ..XXX00000 시작 주소가 32바이트의 배수인 것으로 고려된다.
32 바이트의 배수를 전송하는 명령어에 이용될 수 있다.
도 52를 참조하여, 일 실시예에서 상기 정렬 수식어 정보가 사용되는 방식이 설명되게 된다. 도 52에 도시되어 있는 바와 같이, LSU(22)는 보편적으로 규정된 폭의 데이터 버스를 통해 메모리 시스템에 접속되게 된다. 종종, 메모리 시스템은 다수의 상이한 레벨의 메모리로 구성되게 되며, 제1 레벨의 메모리가 종종 캐시인데, 이것은, LSU가 데이터 버스를 통해 연결되는 메모리 레벨이다. 따라서, 도 52에 도시되어 있는 바와 같이, LSU(22)는 데이터 버스(1020)를 통해 메모리의 레벨 1 캐시(1010)와 연결되도록 배열되며, 상기 소정의 예에서 데이터 버스는 64 비트의 폭을 갖는 것으로 간주된다. 캐시 적중(cache hit)의 경우, 레벨 1 캐시의 내용에 대해 액세스가 발생하는 반면, 캐시 부적중(cache miss)의 경우에는, 레벨 1 캐시(1010)가 하나 이상의 다른 버스(1030)를 통해 메모리 시스템(1000)의 다른 부분과 연결되게 된다.
메모리 시스템의 다양한 부분이 분배될 수 있으며, 도 52에 도시된 예에서 는, 레벨 1 캐시(1010)가 온-칩(on-chip) 제공되는, 즉 도 1의 집적 회로(2)에 포함되는 반면, 메모리 시스템의 나머지(1000)가 오프-칩(off-chip) 제공되는 것으로 가정한다. 온-칩과 오프-칩 사이의 경계는 도 52에서 점선(1035)으로 나타나있다. 그러나, 당업자들이라면 다른 구성이 사용될 수 있어, 예컨대 메모리 시스템 전체가 오프-칩 제공될 수도 있고, 또는 메모리 시스템의 온-칩 부분과 메모리 시스템의 오프-칩 부분 사이의 어떤 다른 경계가 제공될 수도 있다는 것을 이해할 것이다.
LSU(22)는 또한 메모리 관리부(MMU)(1005)와 연결되도록 배열되며, 이것은 보편적으로 변환 색인 버퍼(Translation Lookaside Buffer:TLB)(1015)를 포함한다. 당업자들이라면 알고 있는 바와 같이, MMU는 소정의 액세스 제어 기능, 예컨대 가상 주소에서 물리 주소로의 변환, 액세스 허용 결정(즉, 액세스가 발생할 수 있는지 여부) 등을 수행하는데 사용된다. 이를 수행하기 위해, MMU는 메모리의 페이지 테이블(page table)로부터 얻어진 디스크립터(descriptor)를 TLB(1015) 내에 저장한다. 각 디스크립터는 메모리의 상응하는 페이지에 대해 상기 메모리의 페이지와 관련된 필요한 액세스 제어 정보를 정의한다.
LSU(22)는 제어 버스(1025)를 통해 레벨 1 캐시(1010) 및 MMU(1005) 두 가지 모두에 액세스의 소정의 세부사항을 전달하도록 배열된다. 특히, LSU(22)는 액세스될 데이터 블록의 크기에 대한 표시 및 시작 주소를 레벨 1 캐시와 MMU에 출력하도록 배열된다. 더욱이, 일 실시예에 따라, LSU(22)는 또한 정렬 지정자로부터 얻어지는 정렬 정보를 출력한다. 이제, 도 53a 및 54b를 참조하여, 정렬 지정자 정 보가 LSU(22) 및/또는 레벨 1 캐시(1010)와 MMU(1005)에 의해 사용되는 방식이 설명되게 된다.
도 53a는 메모리 주소 공간을 도시하는데, 수평의 각 실선은 메모리의 64-비트 정렬을 나타낸다. 액세스 동작이, 우리가 가정하고 있는 논의를 위해 0 x 4의 시작 주소를 갖는 128-비트 길이의 데이터 블록(1040)을 지정한다면, LSU(22)는 64-비트 데이터 버스(1020)를 지나는 개별적인 액세스의 수를 결정하여 액세스 동작에 할당할 필요가 있다. 또한, 상기 설명된 바와 같이, 보편적으로 시작 주소가 무엇인지 알기 전에 상기 결정을 수행핼 필요가 있다. 도 52에 대하여 고려된 실시예에 있어서, LSU(22)는 할당할 액세스의 수를 결정할 때 정렬 지정자 정보를 사용하도록 배열된다.
도 53a의 예에 있어서, 시작 주소는 32-비트 정렬되며, 정렬 지정자가 상기 정렬을 식별할 수 있다. 이러한 경우, 도 53a로부터 알 수 있는 바와 같이, LSU(22)가 최악의 시나리오를 가정하고, 그에 따라 데이터 블록(1040)에 대해 필요한 액세스 동작을 수행하는데 세 개의 개별적인 액세스가 필요하게 된다는 것을 생각해야 한다. 이것은 정렬되지 않은 액세스에 대해 할당되어야만 하는 액세스의 수와 동일하다.
그러나, 도 53b에 도시된 상기와 유사한 예를 고려하면, 역시 128-비트 데이터 블록(1045)이 액세스되지만, 이 경우에는 시작 주소가 64-비트 정렬된다는 것을 알 수 있다. 정렬 지정자 정보가 상기 64-비트 정렬을 식별하거나, 실제로 데이터가 128-비트 정렬되는 것으로 식별한다면, 상기의 경우 LSU(22)는 단지 액세스 동 작에 두 개의 개별적인 액세스를 할당할 필요가 있으므로, 효율면에서 상당히 개선된다. 그러나, 데이터 버스가 128-비트 폭이라면, 정렬 지정자가 64-비트 정렬이 아니라 128-비트 정렬을 나타낼 경우, LSU(22)는 단지 하나의 액세스를 할당할 필요가 있다.
이제 도 53c를 고려하면, 여기서는 96-비트 크기의 데이터 블록(1050)이 액세스될 필요가 있다는 것을 알 수 있으며, 이 경우 정렬 지정자가 시작 주소가 32-비트 정렬된다는 것을 식별한다고 가정한다. 다시 말해, 상기 예에서는, 액세스의 수가 수용될 필요가 있는 때 LSU(22)가 실제로 시작 주소를 계산하지 않는다 하더라도, LSU(22)는 여전히 액세스 동작에 단 두 개의 액세스가 할당될 필요가 있다고 가정할 수 있다. 도 5d는, 80-비트 데이터 블록(1055)이 액세스되며, 정렬 지정자가 시작 주소가 16-비트 정렬된다는 것을 식별하는 제4 예를 도시한다. 다시 말해, LSU(22)는 단지 액세스 동작에 두 개의 액세스를 할당할 필요가 있다. 대신 정렬 지정자가, 액세스가 정렬되지 않은 액세스로서 처리된다는 것을 나타낸다면, 실제로 도 53c에 도시된 액세스의 경우에서와 같이, LSU가 액세스 동작에 세 개의 액세스를 할당해야 한다는 것이 자명하다. 따라서, 정렬 지정자가 시작 주소의 어떤 규정된 정렬을 나타내는 상황에서, 정렬 지정자 정보가 LSU(22)에 의해 액세스 성능을 상당히 개선하는데 사용될 수 있다는 것을 알 수 있다.
정렬 지정자가, 시작 주소(또한 유효 주소라고도 함)가 그 정렬을 가지지 않지만, 계속되는 가설을 LSU(22)에 제공하게 하는 것으로 처리될 수 없다는 것을 알아야 한다. 시작 주소가 그 후 정렬 지정자에 의해 지정된 정렬을 따르지 않는 것 으로 판명된다면, 일 실시예에서 관련 로드 또는 저장 동작이 정렬 실패를 생성하도록 배열된다. 다음으로, 정렬 실패는 다수의 공지된 기술 중 어느 한 기술을 사용하여 처리될 수 있다.
상기 언급된 바와 같이, 정렬 정보는 LSU(22)에 의해 사용될 뿐만 아니라, 경로(1025)를 통해 레벨 1 캐시(1010) 및 MMU(1005) 두 가지 모두에 전달된다. 이제 도 54a 및 54b를 참조하여, 레벨 1 캐시 또는 MMU에 의해 상기 정보가 사용되는 방식이 설명되게 된다. 도 54a 및 54b에 도시되어 있는 바와 같이, 256-비트 데이터 블록(1060, 1065)에 대한 액세스가 고려되며, 상기 예에 있어서 도면의 수평의 실선은 메모리 내의 128-비트 정렬을 나타낸다. 도 54a에서는, 데이터 블록이 64-비트 정렬되는 것으로 가정하는 반면, 도 54b에서는 데이터 블록이 128-비트 정렬되는 것으로 가정한다. 두 가지 경우 모두, 데이터 버스(1020)가 단지 64-비트 폭이므로, LSU(22)가 액세스 동작에 네 개의 액세스를 할당해야 한다는 것이 자명하다. LSU의 관점에서 보면, 정렬 지정자가 시작 주소가 64-비트 정렬되는 것으로 지정하는지 또는 128-비트 정렬되는 것으로 지정하는지 하는 것은 문제가 되지 않는다.
그러나, 레벨 1 캐시(1010) 내의 캐시 라인은 각각 256 비트를 초과한 데이터를 저장할 수 있으며, 또한 128-비트 정렬될 수도 있다. 도 54a의 예에서, 데이터 블록이 128-비트 정렬되지 않으므로, 캐시는 두 개의 캐시 라인이 액세스될 필요가 있다고 가정할 필요가 있다. 그러나, 도 54b의 예에서, 레벨 1 캐시(1010)는 정렬 지정자로부터, 레벨 1 캐시 내의 단 하나의 캐시 라인이 액세스될 필요가 있 으며, 이것이 레벨 1 캐시(1010) 내에서의 액세스 동작의 효율을 증가시키는데 사용될 수 있다는 것을 판정할 수 있다.
이와 유사하게, TLB(1015)로의 적절한 디스크립터를 검색하기 위해 MMU에 의해 액세스될 필요가 있는 페이지 테이블은 종종 256 비트를 초과한 데이터를 저장하게 되며, 종종 128-비트 정렬될 수도 있다. 따라서, MMU(1005)는 경로(1025)를 통해 제공되는 정렬 정보를 사용하여, 액세스될 페이지 테이블의 수를 결정할 수 있다. 도 54a의 예에서는, MMU(1005)가 하나 보다 많은 페이지 테이블이 액세스될 필요가 있다고 가정할 수 있는 반면, 도 54b의 예에서는, MMU가 정렬 지정자로부터, 단 하나의 페이지 테이블이 액세스될 필요가 있는 것으로 판정할 수 있으며, 이 정보는 MMU(1005)에 의해 수행되는 액세스 제어 기능의 효율을 향상시키는데 사용될 수 있다.
따라서, 상기 기재된 바와 같이 로드 또는 저장 명령어 내에 정렬 지정자를 사용하는 것은 하드웨어로 하여금 액세스 동작의 어떤 관점을 최적화할 수 있게 하는데 사용될 수 있다는 것을 알 수 있으며, 이것은 특히, 시작 주소가 판정되기 전에 액세스 사이클 및/또는 캐시 액세스의 수가 수용되어야 할 경우 유용하다. 이러한 방식은 액세스될 데이터의 다양한 길이를 지정하는 로드 또는 저장 명령어, 및 LSU와 메모리 시스템 사이에 상이한 데이터 버스 크기를 갖는 프로세서에 유용하다.
표준 SIMD 포맷으로 수행되기에 적합하지 않은 다수의 데이터 처리 연산이 존재하며, 이 경우 다수의 데이터 요소가 레지스터 내에 나란히 배열된 다음, 그 데이터 요소에 병렬로 연산이 수행된다. 이러한 연산의 예가 도 55a 내지 55c에 도시되어 있다. 도 55a는 인터리브 연산을 도시하는 것으로서, 여기서는 제1 레지스터(1100) 내에 네 개의 데이터 요소(A, B, C, D)를 인터리브하고, 제2 레지스터(1102) 내에 네 개의 데이터 요소(E, F, G, H)를 인터리브하는 것이 바람직하다. 도 55a에 있어서, 상기 결과로 얻어지는 인터리브 데이터 요소는 목적지 레지스터(1104, 1106) 내에 나타난다. 상기 목적지 레지스터는 소스 레지스터(1100, 1102)와 상이한 레지스터일 수도 있고, 또는 선택적으로 소스 레지스터와 동일한 세트의 두 레지스터일 수도 있다. 도 55a로부터 알 수 있는 바와 같이, 상기 인터리브 연산에 따르면, 각 소스 레지스터로부터의 제1 데이터 요소가 목적지 레지스터 내에 나란히 배치된 다음, 두 소스 레지스터로부터의 제2 데이터 요소가 이어지고, 그 다음 두 소스 레지스터로부터의 제3 데이터 요소가 이어진 다음, 두 소스 레지스터로부터의 제4 데이터 요소가 이어진다.
도 55b는 반대되는 디-인터리브 연산을 도시하는 것으로서, 여기서는 두 개의 소스 레지스터(1108 및 1110)에 배치된 8개의 데이터 요소를 디-인터리브할 필요가 있다. 상기 연산에 따르면, 제1, 제3, 제5, 및 제7 데이터 요소가 제1 목적지 레지스터(1112)에 배치되는 반면, 제2, 제4, 제6, 및 제8 데이터 요소가 제2 목적지 레지스터(1114)에 배치된다. 도 55a의 예와 같이, 목적지 레지스터는 소스 레지스터와 상이할 수도 있고, 또는 선택적으로 동일한 레지스터일 수도 있다는 것을 이해할 것이다. 도 55a 및 55b의 예에서, 레지스터가 64-비트 레지스터인 것으로 가정하면, 상기 소정의 예에서 인터리브 또는 디-인터리브되는 데이터 요소는 16-비트 폭의 데이터 요소이다. 그러나, 인터리브되거나 디-인터리브되는 데이터 요소가 반드시 16-비트 폭일 필요가 없으며, 또한 소스 및 목적지 레지스터가 반드시 64-비트 레지스터일 필요도 없다는 것을 이해할 것이다.
도 55c는 전치 연산에 의해 수행되는 기능을 도시한다. 상기 예에 따르면, 제1 소스 레지스터(1116)로부터의 두 데이터 요소(A, B) 및 제2 소스 레지스터(1118)로부터의 두 데이터 요소(C, D)가 전치되게 되며, 전치 결과는, 제1 소스 레지스터(1116)로부터의 제2 데이터 요소가 제2 소스 레지스터(1118)로부터의 제1 데이터 요소와 교환되어, 제1 목적지 레지스터(1120) 내에 데이터 요소(A, C)가 제공되는 반면, 제2 목적지 레지스터(1122)에는 데이터 요소(B, D)가 제공된다는 것이다. 다시 말해, 목적지 레지스터는 소스 레지스터와 상이할 수도 있지만, 목적지 레지스터가 실제로 소스 레지스터와 동일한 레지스터인 경우가 종종 있다. 일례에서, 레지스터(1116, 1118, 1120, 1122) 각각은 64-비트 레지스터로 간주될 수 있으며, 이 경우 데이터 요소는 32-비트 폭의 데이터 요소이다. 그러나, 데이터 요소가 반드시 32-비트 폭일 필요가 없으며, 레지스터가 반드시 64-비트 레지스터일 필요도 없다.
또한, 상기 모든 예에서 레지스터의 전체 내용이 나타나는 것으로 여겨졌지만, 상기 논의된 세 가지 연산 중 임의의 연산이 관련 소스 레지스터의 상이한 부분 내의 데이터 요소에 독립적으로 수행될 수 있으며, 따라서 상기의 경우 도면은 소스/목적지 레지스터의 일부만을 도시한다는 것을 알 수 있다.
상기 언급된 바와 같이, 표준 SIMD 접근법은 다수의 데이터 요소를 레지스터 내에 나란히 배치한 다음, 상기 데이터 요소에 병렬로 연산을 수행하는 것을 수반한다. 즉, 연산의 병렬화가 데이터 요소 입도로 수행된다. 이와 같이 하면, 예컨대 필요한 소스 데이터 요소를 다수의 레지스터에 분산시킴으로써, 필요한 데이터 요소가 상기와 같은 방식으로 배열될 수 있는 경우 매우 효율적으로 연산이 실행될 수 있지만, 필요한 데이터 요소를 상기와 같은 방식으로 배열하는 것이 실용적이지 않으므로, SIMD 접근법의 가능한 속도 이점이 이미 이용될 수 없는 연산이 상당히 많이 존재한다. 상기 인터리브, 디-인터리브, 및 전치 연산은, SIMD 접근법의 속도 이점을 이미 이용할 수 없는 상기와 같은 연산의 예이지만, 예컨대 소정의 유형의 산술 연산과 같이 다수의 다른 예가 존재한다는 것을 이해할 것이다. 이러한 산술 연산에 대한 한 가지 소정의 예는, 실수부와 허수부로 구성된 복소수에 적용될 필요가 있는 산술 연산이다.
일 실시예에 따르면, 상기 문제는, 데이터 요소 크기를 식별할 뿐만 아니라, 데이터 요소 크기의 배수인 레인 크기를 별도의 엔티티로서 식별할 수 있는 기능을 소정의 데이터 처리 명령어에 제공함으로써 완화된다. 다음으로, 데이터 처리 연산의 병렬화가 데이터 요소 크기가 아니라 레인 크기의 입도로 발생하여, 데이터 처리 연산의 소정의 실체화(instantiation)에 수반되는 하나 보다 많은 데이터 요소가 동일한 소스 레지스터에 함께 존재할 수 있다. 따라서, 데이터 처리 연산을 수행하는데 사용되는 처리 로직이 레인 크기를 토대로 병렬 처리 레인의 수를 정할 수 있으며, 그런 다음 데이터 처리 연산이 각 레인에서 병렬로 수행될 수 있는데, 상기 데이터 처리 연산은 상기 각 병렬 처리 레인 내의 선택된 데이터 요소에 적용 된다.
이러한 접근법을 이용하면, 도 55a를 참조하여 상기 기재된 바와 같은 인터리브 연산을 SIMD 방식으로 수행할 수 있다. 특히, 도 56a는 일 실시예에 따라 "ZIP" 명령어를 실행할 때 수행되는 처리를 도시한다. 이러한 소정의 예에서, ZIP 명령어는 32|ZIP.8 명령어이다. 따라서 이 명령어는, 데이터 요소가 8-비트 폭이며 레인이 32-비트 폭이라는 것을 식별한다. 도 56a의 예에 있어서, ZIP 명령어가 소스 레지스터를 64-비트 레지스터 D0(1125) 및 D1(1130)이 되도록 지정하는 것으로 가정한다. 따라서, 상기 레지스터 각각은 8 개의 8-비트 데이터 요소를 포함한다. 각 레인 내에서, 인터리브 연산이 독립적으로 및 병렬로 적용됨으로써, 결과적으로 도 56a의 하반부에 도시되어 있는 바와 같은 데이터 요소의 재배열이 나타난다. 일 실시예에서는, ZIP 명령어의 경우, 목적지 레지스터가 소스 레지스터와 동일하므로, 상기 재배열된 데이터 요소가 레지스터 D0(1125) 및 D1(1130) 내에 다시 한 번 저장된다고 가정한다. 도 56a로부터 알 수 있는 바와 같이, 레인 1내에는, 각 소스 레지스터의 제1의 데이터 요소 4개가 인터리브되어 있고, 레인 2내에는, 각 소스 레지스터의 제2의 데이터 요소 4개가 인터리브되어 있다.
레인 크기 또는 데이터 요소 크기 중 어느 한 가지를 변경함으로써 상이한 형태의 인터리빙이 수행될 수 있다는 것을 쉽게 이해할 것이다. 예컨대, 레인 크기가 64-비트인 것으로 식별될 경우, 즉 결과적으로 단 하나의 레인이 존재한다면, 목적지 레지스터 D0가 각 레지스터의 제1의 데이터 요소 4개의 인터리브된 결과를 포함하는 반면, 목적지 레지스터 D1이 각 레지스터의 제2의 데이터 요소 4개의 인 터리브된 결과를 포함한다는 것을 알 수 있다. 상응하는 UNZIP 명령어가 제공되어, 상응하는 디-인터리브 연산을 수행할 수 있으며, 상기 UNZIP 명령어가 다시 레인 크기와 데이터 요소 크기 두 가지 모두를 지정할 수 있다는 것을 이해할 것이다.
보편적으로, 전치 연산은 인터리브 연산 또는 디-인터리브 연산에 매우 상이한 연산인 것으로 간주되므로, 전치 연산을 수행하기 위한 별도의 명령어가 제공될 필요가 있다고 파악된다. 그러나, 인터리브 또는 디-인터리브 명령어에 레인 크기 및 데이터 요소 크기를 개별적으로 정할 수 있는 기능을 제공하면, 두 개의 소스 레지스터가 지정되고, 레인 크기가 데이터 요소 크기의 두 배로 설정될 때, 전치 연산을 수행하는데 실제로 동일한 명령어가 사용될 수 있다는 것이 실현되었다. 이것은 도 56b에 도시되어 있으며, 이 경우 인터리브 명령어(ZIP)는 8 비트의 데이터 요소 크기와 16 비트의 레인 크기(즉, 데이터 요소 크기의 두 배임)를 식별하도록 설정되었다. 상기와 동일한 64-비트 소스 레지스터 D0(1125) 및 D1(1130)이 도 56a의 예에서와 같이 선택된다고 가정하면, 이것은 도 56b에 도시되어 있는 바와 같이 네 개의 병렬 처리 레인을 형성한다. 도 56b의 하반부로부터 알 수 있는 바와 같이, 인터리빙 과정은 실제로 각 레인 내에 전치된 결과를 생성하는 결과를 가져오며, 여기서 각 레인 내의 제2 소스 레지스터의 제1 데이터 요소가 각 레인 내의 제1 소스 레지스터의 제2 데이터 요소와 교환된다.
따라서, 상기 실시예에 따르면, 레인 크기 및 데이터 요소 크기가 어떻게 정해지는지에 따라, 동일한 ZIP 명령어가 인터리브 연산 또는 전치 연산 중 어느 하 나를 수행하는데 사용될 수 있다. 또한, 전치가 UNZIP 명령어를 사용하여 정확히 동일한 방식으로 수행될 수 있으므로, 16|UNZIP.8 명령어가 16|ZIP.8 명령어와 정확히 동일한 연산을 수행하게 된다는 것을 알아야 한다.
도 57a 내지 57c는 상기와 같은 ZIP 명령어의 소정의 한 구현예를 도시하는 것으로서, 영상 내에 4×4 배열의 화소(1135)가 라인(1136)(도 57a 참조)을 중심으로 전치될 수 있다. 보편적으로, 각 화소는 RGB 포맷으로 표현되는 적색, 녹색, 및 청색 성분으로 구성되게 된다. 논의를 위해, 각 화소를 정의하는데 필요한 데이터가 16-비트 길이라고 가정하면, 배열(1135) 내의 네 개의 화소의 각 수평선에 대한 데이터가 개별적인 소스 레지스터(A, B, C, D)에 배치될 수 있다는 것을 알 수 있다.
도 57b는, 다음과 같은 두 개의 명령어가 실행될 경우 발생하는 다양한 전치를 도시한다:
32|ZIP.16 A,B
32|ZIP.16 C,D
따라서, 각 ZIP 명령어가 레인의 폭을 32-비트가 되도록 정의하며, 데이터 요소 폭을 16-비트가 되도록 정의함에 따라, 도 58b에 도시되어 있는 네 개의 대각 화살표 선에 의해 도시되어 있는 바와 같이, 각 레인 내에서 제2 레지스터의 제1 데이터 요소가 제1 레지스터의 제2 데이터 요소와 교환된다. 그러므로, 네 개의 2×2 블록(1137, 1141, 1143, 및 1145) 각각 내에서 개별적인 전치가 발생한다.
다음으로, 도 57c는 다음과 같은 두 개의 명령어를 실행한 결과로서 발생하 는 전치를 도시한다:
64|ZIP.32 A,C
64|ZIP.32 B,D
상기 명령어에 따라, 레인 폭은 64-비트, 즉 소스 레지스터의 전체 폭으로 설정되며, 데이터 요소 폭은 32-비트로 선택된다. 따라서, 제1 ZIP 명령어를 실행하면, 레지스터 A(1147)의 제2의 32-비트 폭의 데이터 요소가 레지스터 C(1151) 내의 제1 32-비트 폭의 데이터 요소와 교환되는 결과가 얻어진다. 이와 유사하게, 제2 ZIP 명령어는, 레지스터 B(1149)의 제2의 32-비트 폭의 데이터 요소가 레지스터 D(1153) 내의 제1의 32-비트 폭의 데이터 요소와 교환되는 결과를 가져온다. 도 57c에서 대각의 화살표 선으로 도시되어 있는 바와 같이, 이것은, 좌측 상부의 2×2 화소 블록이 우측 하부의 2×2 화소 블록과 교환되는 결과를 가져온다. 당업자들이라면 알고 있는 바와 같이, 네 개의 ZIP 명령어의 상기 시퀀스는 대각선(1136)을 중심으로 전체 4×4 배열(1135)의 화소를 전치하였다. 도 58은 인터리브 명령어 사용의 소정의 예를 도시한다. 상기 예에서는, 실수부와 허수부로 이루어지는 복소수가 고려된다. 일련의 복소수의 실수부에 소정의 한 계산이 수행될 필요가 있는 반면, 그 복소수의 허수부에 별도의 계산이 수행될 필요가 있는 경우가 있을 수 있다. 그 결과, 실수부는 소정의 레지스터 D0(1155)에 배열될 수 있는 반면, 허수부는 별도의 레지스터 D1(1160)에 놓일 수도 있다. 어떤 시점에, 각 복소수의 실수부와 허수부를 재결합하여, 이들이 레지스터 내에 서로 인접하도록 하는 것이 바람직할 수도 있다. 도 58에 도시되어 있는 바와 같이, 이것은, 레인 폭 을 소스 레지스터의 전체 폭이 되도록 설정하고, 데이터 요소 폭을 16-비트, 즉 실수부와 허수부 각각의 폭이 되도록 설정하는 64|ZIP.16 명령어를 사용함으로써 얻어질 수 있다. 도 58의 하반부에 도시되어 있는 바와 같이, ZIP 명령어의 실행 결과는, 각 복소수(a, b, c, d)의 실수부와 허수부 각각이 레지스터 공간 내에 재결합되는 것인데, 목적지 레지스터 D0(1155)는 복소수(a 및 b)의 실수부와 허수부를 포함하고, 목적지 레지스터 D1(1160)는 복소수(c 및 d)의 실수부와 허수부를 포함한다.
데이터 요소 크기와 관계없이 레인 크기를 지정하는 기능을 이용할 수 있는 것은 단지 인터리브 및 디-인터리브 명령어와 같은 데이터 재배열 명령어가 아니다. 예컨대, 도 59a 및 59b는 두 개의 복소수의 곱셈을 수행하는데 사용될 수 있는 두 개의 명령어의 시퀀스를 도시한다. 특히, 다음과 같은 방정식으로 나타나있는 바와 같이, 복소수(A)와 복소수(B)를 곱하여 결과 복소수(D)를 생성하는 것이 바람직하다:
Dre = Are*Bre-Aim*Bim
Dim = Are*Bim+Aim*Bre
도 59a는 다음과 같은 형태의 제1 곱셈 명령어에 응답하여 수행되는 연산을 도시한다:
32|MUL.16Dd,Dn,Dm[0]
소스 레지스터는 64-비트 레지스터이며, 곱셈 명령어는 32 비트의 레인 폭과 16 비트의 데이터 요소 크기를 지정한다. 곱셈 명령어는 각 레인 내에 배열되어, 소스 레지스터 Dm(1165) 내의 상기 레인에 있는 제1 데이터 요소와 제2 소스 레지스터 Dn(1170) 내의 상기 레인에 있는 각 데이터 요소와 곱하여(도 59a에 도시되어 있는 바와 같음), 그 결과값이 목적지 레지스터 Dd(1175) 내의 상응하는 장소에 저장된다. 각 레인 내에서, 목적지 레지스터의 제1 데이터 요소는 복소수의 부분적인 결과의 실수부를 표현하는 것으로 간주되고, 제2 데이터 요소는 복소수의 부분적인 결과의 허수부를 표현하는 것으로 간주된다.
도 59a에 도시되어 있는 명령어를 실행한 후, 다음과 같은 명령어가 실행된다:
32|MASX.16Dd,Dn,Dm[1]
도 59b에 도시되어 있는 바와 같이, 이 명령어는 "교환을 이용한 승산 가산 감산" 명령어이다. 이 명령어에 따라, 소스 레지스터 Dm의 각 레인 내의 제2 데이터 요소가 도 59b에 도시된 바와 같은 방식으로, 제2 소스 레지스터 Dn의 상응하는 레인 내의 각 데이터 요소와 곱해진다. 그런 다음, 그 곱셈 결과가 목적지 레지스터 Dd(1175) 내에 이미 저장되어 있는 상응하는 데이터 요소의 값에 가산되거나 상기 값으로부터 감산된 다음, 그 결과가 목적지 레지스터 Dd(1175) 내에 다시 놓이게 된다. 결과 복소수(D)의 실수부와 허수부를 생성하는 상기 식별된 방정식을 이용하여 도 59a 와 59b의 연산을 비교하면, 상기 두 명령어를 차례로 이용함으로써, 두 개의 복소수 세트에 대해 병렬로 계산이 수행됨에 따라, SIMD 접근법의 속도 이득이 실현될 수 있다는 것을 이해할 것이다.
상기 예로부터, 데이터 요소 크기 외에 레인 크기를 지정할 수 있는 기능을 명령어에 제공함으로써, SIMD 구현으로부터 이득이 될 수 있는 연산의 수가 증가하며, 따라서 이것은 SIMD 방식의 연산 구현과 관련하여 훨씬 개선된 유연성을 제공한다.
본 기술은, 소스 및 목적지 데이터 요소의 폭이 서로 상이한 벡터에 SIMD 처리를 수행할 수 있는 기능을 제공한다. 이러한 환경에서 특히 유리한 한 가지 연산이 가산 또는 감산 이후의 리턴 하이 하프(return high half) SIMD 연산이다. 도 60은 본 기술에 따른 가산 리턴 하이 하프 연산의 일례를 도시한다. SIMD 디코더(16)(도 1 참조) 내의 명령어 디코더가 명령어 VADH.I16.I32 Dd,Qn,Qm을 디코드하여, 도 60에 도시되어 있으며 이하에서 설명되는 가산 리턴 하이 하프를 수행한다.
도 60에 있어서, SIMD 레지스터 파일(20)(도 1 참조)에 놓인 두 개의 소스 레지스터(Qn 및 Qm)가 32-비트 데이터 요소(a 및 b)의 벡터를 포함한다. 이들은 함께 가산되어, 데이터 합의 하이 하프로부터 형성되는 레지스터 파일(20)에 또한 놓이는 16-비트 데이터 요소(Dd)의 벡터를 형성한다:
Qn = [a3 a2 a1 a0]
Qm = [b3 b2 b1 b]
출력은
Dd = [(a3+b3)>>16, (a2+b2)>>16, (a1+b1)>>16, (a0+b0)>>16]이다.
도 61은 도 60에 도시된 것과 유사한 연산을 개략적으로 도시하는 것이지만, 이 경우 디코드된 명령어는 VRADH.I16.I32 Dd,Qn,Qm 이고, 수행되는 연산은 라운딩을 이용한 가산 리턴 하이이다. 이것은 도 60에 도시된 연산과 매우 유사한 방식으로 수행되지만, 하이 하프가 라운딩된다. 상기 예에서, 이것은, 가산된 후 하이 하프가 얻어지기 전에 데이터 값의 로어 하프(lower half)의 최상위 비트 위치에 1을 가지며 그 밖의 장소에서는 제로를 갖는 데이터 값을 가산함으로써 수행된다.
도 61에서와 같이 상기 도면에서, 중간값은 명확히 점선으로 도시되어 있다.
지원될 수 있는 또 다른 명령어(도시되지 않음)는 포화를 이용한 가산 또는 감산 리턴 하이이다. 이 경우, 가산 또는 감산은 하이 하프가 얻어지기 전에 적절한 곳에서 포화되게 된다.
표 11은 본 기술에 의해 지원되는 명령어의 예를 도시한다. Size<a>는 데이터 유형의 크기를 비트로 리턴하며, round<td>는 라운딩 상수 1<<(size<dt>-1)을 리턴한다.
[표 11]
Figure 112006039851815-pct00013
데이터의 하이 하프를 얻는 것이 현명한 일이라면, 본 기술은 상이한 유형의 데이터에 수행될 수 있다. 이것은 특히 고정 소수점 수에 수행되는 처리에 적절하다.
상기 기술은 많은 응용을 가지며, 예컨대 SIMD FFT 구현을 촉진하는데 사용될 수 있다. SIMD는 특히, 다수의 데이터에 동일한 연산이 수행될 필요가 있는 FFT(고속 푸리에 변환) 연산을 수행하는데 유용하다. 따라서, SIMD 처리를 사용하면 다수의 데이터가 병렬로 처리될 수 있다. 종종, FFTs에 수행되는 계산이 복소 수를 함께 곱하는 것을 수반한다. 이것은 데이터 값의 곱셈, 및 그 곱의 가산 또는 감산을 수반한다. SIMD 처리에서는, 상기와 같은 계산이 병렬로 수행되어 처리 속도를 증가시킨다.
이하, 수행될 필요가 있는 합의 종류에 대한 간단한 예가 제공된다.
(a+ic)*(b+id) = e+if
따라서, 실수부(e)는: a*b-c*d 이고,
허수부(f)는: a*d+c*b 이다.
도 62는 실수부(e)를 판정하기 위한 계산을 도시하는 것이다. 알 수 있는 바와 같이, 16 비트 데이터 요소를 포함하는 a에 대한 벡터가 상기와 동일한 크기의 데이터 요소를 포함하는 b에 대한 벡터와 곱해지며, c에 대한 벡터가 d와 곱해진다. 상기 결과가 32 비트 데이터 요소를 가진 두 개의 벡터를 생성한다. e를 생성하기 위해서는, 벡터 중 하나가 다른 하나로부터 감산될 필요가 있지만, 최종 결과만이 원래의 값과 동일한 정밀도에 필요하다. 따라서, 16 비트 데이터 요소를 가진 결과 벡터가 필요하다. 이 연산은 도면에 도시되어 있는 바와 같이 단일 명령어 VSBH.16.32Dd,Qn,Qm에 응답하여 수행될 수 있다. 따라서, 이러한 점에서 상기 명령어인 감산 리턴 하이 하프가 특히 유용하다. 또한 이것은, 산술 연산이 더 넓은 데이터 폭에 수행될 수 있게 하며, 좁히는 것(narrowing)이 오로지 산술 연산(감산) 이후 발생할 수 있게 하는 이점을 갖는다. 이것은 일반적으로 감산을 수행하기 전에 좁히는 것 보다 더 정확한 결과를 제공한다.
ARM은, 어떤 명령어를 이용하여 즉치값이 지정될 수 있게 하는 명령어 인코 딩을 그들의 명령어 세트에 제공하였다. 분명히, 즉치값 크기는 명령어로 인코딩될 경우 제한되어야 한다.
명령어로 인코딩하기에 적합한 크기의 즉치값은 데이터 요소가 병렬로 처리되는 SIMD 처리시 제한 사용된다. 이 문제를 다루기 위해, 관련된 제한된 크기의 즉치값을 갖지만 이 즉치값을 확장하는 기능을 갖는, 생성된 상수를 가진 명령어 세트가 제공된다. 따라서 예컨대, 바이트 크기의 즉치값이 확장되어, 64-비트 상수 또는 즉치값을 생성할 수 있다. 이러한 방식으로, 즉치값은 SIMD 처리에서 다수의 소스 데이터 요소를 포함하는 64-비트 소스 레지스터를 이용하는 논리 연산에 사용될 수 있다.
도 63은, 표의 좌측 열에 도시되어 있는 제어값과 함께 명령어 내에 인코딩되는 즉치값(abcdefgh)을 도시한다. 2진수 즉치값이 확장되어 64-비트 레지스터를 채우며, 실제 확장은 명령어 및 그와 관련된 제어부에 따라 수행된다. 도시된 예에 있어서, 8-비트 즉치값(abcdefgh)은 64 비트 데이터 값 내의 상이한 장소에서 반복되며, 그 즉치값이 놓이는 위치는 제어값에 의존한다. 또한, 제로 및/또는 1이, 값이 놓여있지 않은 비어있는 공간을 채우는데 사용된다. 1 및/또는 0 중 어느 한 가지에 대한 선택 역시 제어값에 의해 결정된다. 따라서, 상기 예에서는, 8-비트 즉치값 및 그와 관련된 4-비트 제어값을 가진 명령어로부터 SIMD 처리에 사용될 수 있는 넓은 범위의 상수가 생성될 수 있다.
일 실시예에서는(표의 마지막 라인), 어떤 장소에 즉치값을 반복하는 대신, 즉치값의 각 비트가 확장되어 새로운 64 비트의 즉치값 또는 상수를 생성한다.
알 수 있는 바와 같이, 어떤 경우에는 상수가 각 레인에서 동일한 반면, 다른 경우에는 어떤 레인에 상이한 상수가 나타난다. 어떤 실시예에서(도시되지 않음), 상기 상수를 변환할 가능성이 또한 제공되어, 이것이 또한 생성될 수 있는 상수의 수를 증가시킨다.
이하, 도 63에 도시되어 있는 바와 같은 상수 생성에 사용될 수 있는 명령어의 포맷에 대한 일례가 제공된다. 이 명령어에서, <value>는 데이터 부분 또는 즉치값이며, <mode>는, 생성된 상수(도 63의 표에서 상이한 라인으로 도시되어 있음) 내에서 <value> 부분이 어떻게 확장되는지에 대한 표시를 제공하는 제어부이다.
VMOV Dd,#<value>,<mode>
여기서,
<value>는 바이트이고
<mode>는 열거된 확장 기능 중 하나이다.
이와 같이 적응된 명령어는 일반적으로, 즉치값을 포함하는 데이터부 <value> 및 제어부 <mode>를 가진 관련 데이터 값을 갖는다. 도 63에 도시되어 있는 바와 같이, 제어부는 즉치값이 확장되는 방법을 나타낸다. 이것은 다양한 방법으로 수행될 수 있지만, 어떤 실시예에서는, 제어부가, 상수의 확장이 상수 생성 로직을 사용하여 수행된다는 것을 나타낸다.
도 64는, 본 기술에 따른 명령어와 관련된 제어부(1200) 및 데이터부(1210)로부터 상수를 생성하도록 동작할 수 있는 상수 생성 로직의 일례를 개략적으로 도시하는 것이다. 도시된 예에서, 제어부(1200)는 제어 생성 로직(1220)을 제어하 며, 이것은, 데이터 값(1210)의 일부 또는 1이나 0 중 어느 하나를 생성될 상수(1240) 내의 각 비트에 출력하기 위한 게이트(1230)를 포함한다.
도 65는 도 1에 도시된 것과 유사한 데이터 프로세서(집적 회로)를 도시하는 것으로서, 유사한 참조 번호는 유사한 특징을 나타낸다. 도 65는, 명백하게 상수 생성 로직(1220)을 명확하게 도시하고 있다는 점에서 도 1과 상이하다. 상수 생성 로직(1220)은 디코드/제어부(14, 16)에 인접해 있거나 그 일부를 형성하는 것으로 여겨질 수 있다. 알 수 있는 바와 같이, 명령어가 명령어 파이프라인(12)으로부터 디코드/제어 로직(14, 16)으로 전송된다. 이것은, 프로세서의 스칼라 처리부(4, 6, 8, 10), 로드 저장부(22), 및 SIMD 처리 로직(18)의 동작을 제어하는 제어 신호를 발생시킨다. 상수 생성을 가진 명령어가 디코드/제어부(14, 16)에 수신된다면, 상수 생성 로직이 SIMD 처리에서 사용하기 위한 상수를 생성하는데 사용된다. 이것은, SIMD 레지스터 데이터 저장소(20)로 직접 전송될 수도 있고(점선 1222), 또는 상수 생성을 가진 명령어가 SIMD 데이터 처리부를 포함할 경우에는, 생성된 상수가, 다른 조종이 상기 생성된 상수에 수행되어 새로운 데이터 값을 발생시키는 SIMD 처리 로직으로 전송된다(라인 1224).
도 66a 및 66b는 도 65에 도시된 두 가지 상이한 경로를 개략적으로 도시한다. 도 66a는, 명령어가 레지스터 저장소로 직접 전송되는 상수를 생성하는 경우, 즉 점선 1222을 도시한다. 도 66b는, 생성된 상수를 가진 명령어가 데이터 처리부를 포함하는 경우를 도시한다. 이 경우, 데이터 처리 연산(OP)이 상기 생성된 상수 및 다른 소스 오퍼랜드(1250)에 수행되어 상기 명령어에 응답하여 최종 데이터 값(1260)을 발생시키며, 이것은 도 65의 라인 1224에 상응한다.
도 63에 도시된 상수 및 그들의 반전 외에, OR, AND, 테스트, 가산, 또는 감산과 같은 추가 데이터 처리 연산이 상기 생성된 상수에 수행되어, 훨씬 더 넓은 범위의 데이터 값이 생성될 수 있다. 이것은 도 65의 경로 1224 및 도 13b에 상응한다. 표 12는, 어떤 추가 데이터 값을 생성하는데 사용될 수 있는 비트단위 AND 및 비트단위 OR의 예를 제공한다.
Figure 112006039851815-pct00014
생성된 상수에 또 다른 데이터 처리 연산을 수행하는 기능은 다양하게 사용될 수 있다. 예컨대, 도 67은, 본 기술의 실시예가 벡터의 다수의 데이터 요소로부터 소정의 비트 또는 비트들을 추출하기 위해 비트 마스크를 생성하는데 어떻게 사용될 수 있는지를 도시한다. 도시된 예에서는, 소스 벡터로부터의 각 데이터 요소의 제4 비트가 추출된다. 먼저, 즉치값(8)이 반복됨으로써 확장된 다음, 생성된 상수를 소스 벡터와 AND 연산을 수행하여 각 데이터 요소로부터 원하는 비트를 추출하는 논리적인 AND 명령어가 수행된다. 이러한 연산은 다음 명령어에 응답하여 수행된다
VAND Dd,#0b00001000,0b1100
여기서, <mode> 값(1100)은 확장된 데이터부를 포함하는 생성된 상수를 의미한다(도 63 참조).
본원에서 소정의 실시예가 설명되었지만, 본 발명이 이것으로 제한되지 않으며, 이것에 대한 다수의 변형 및 추가가 본 발명의 범위 내에서 이루어질 수 있다는 것을 알고 있을 것이다. 예컨대, 본 발명의 범위를 벗어나지 않고, 독립청구항의 특징과 이하의 종속 청구항의 특징의 다양한 조합이 이루어질 수 있다.

Claims (57)

  1. 복수의 데이터 요소를 저장하도록 동작할 수 있는 레지스터 데이터 저장소로서, 상기 레지스터 저장소내의 레지스터가 상기 데이터 요소들의 데이터 요소 크기에 따른 다수의 데이터 요소들을 유지하는 데이터 저장소와,
    데이터 처리 명령어에 응답하여, 상기 레지스터 데이터 저장소의 상기 레지스터로서 액세스되는 선택된 복수의 데이터 요소에 병렬로 데이터 처리 연산을 수행하고, 상기 레지스터 내의 병렬 처리의 상이한 레인을 채우는 처리 로직을 포함하는 데이터 처리장치로서,
    상기 선택된 복수의 데이터 요소의 데이터 요소는 복수의 상이한 데이터 요소 크기 중 하나를 공유하고, 상기 레지스터는 복수의 상이한 레지스터 크기 중 하나를 가지며, 상기 데이터 처리 명령어는, 상기 데이터 처리 연산에 대해 상기 복수의 상이한 데이터 요소 크기들 중에서 상기 선택된 복수의 데이터 요소들에의해 공유된 데이터 요소 크기 및 상기 레지스터의 레지스터 크기를 지정하며,
    상기 장치는,
    상기 레지스터의 상기 레지스터 크기에 따라 상기 레지스터를 상기 레지스터 데이터 저장소의 일부로 맵핑하여, 상기 레지스터 데이터 저장소의 상기 부분 내에 저장된 데이터 요소가 상이한 레지스터 크기의 각각의 상이한 레지스터의 일부로서 액세스될 수 있도록 동작할 수 있는 레지스터 액세싱 로직을 더 포함하는 데이터 처리 장치.
  2. 제 1 항에 있어서,
    상기 데이터 처리 명령어는, 상기 데이터 처리 명령어에 의해 지정되는 각각의 소스 레지스터 크기 및 소스 데이터 요소 크기를 각각 갖는 하나 이상의 소스 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 장치.
  3. 제 1 항 또는 제 2 항에 있어서,
    상기 데이터 처리 명령어는, 상기 데이터 처리 명령어에 의해 지정되는 목적지 레지스터 크기 및 목적지 데이터 요소 크기를 갖는 하나 이상의 목적지 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 장치.
  4. 제 3 항에 있어서,
    상기 목적지 데이터 요소 크기는 상기 하나 이상의 소스 데이터 요소 크기 중 적어도 하나와 상이한 것을 특징으로 하는 데이터 처리 장치.
  5. 제 1 항 또는 제 2 항에 있어서,
    두 개의 상이한 레지스터를 갖는 상기 레지스터 데이터 저장소에 기록된 데이터 요소 세트가, 하나의 추가 레지스터 내에서 상기 레지스터 데이터 저장소로부터 모두 함께 판독될 수 있는 것을 특징으로 하는 데이터 처리 장치.
  6. 제 5 항에 있어서,
    상기 두 개의 상이한 레지스터는 상기 레지스터 데이터 저장소의 인접한 부분에 기록하는 것을 특징으로 하는 데이터 처리 장치.
  7. 제 6 항에 있어서,
    상기 하나의 추가 레지스터는 상기 두 개의 상이한 레지스터의 레지스터 크기의 합과 동일한 레지스터 크기를 갖는 것을 특징으로 하는 데이터 처리 장치.
  8. 제 1 항 또는 제 2 항에 있어서,
    단일 레지스터로부터 상기 레지스터 데이터 저장소에 함께 기록된 데이터 요소 그룹은 두 개의 상이한 추가 레지스터 내에서 상기 레지스터 데이터 저장소로부터 판독될 수 있는 것을 특징으로 하는 데이터 처리 장치.
  9. 제 8 항에 있어서,
    상기 두 개의 상이한 추가 레지스터는 상기 레지스터 데이터 저장소의 인접한 부분으로부터 판독되는 것을 특징으로 하는 데이터 처리 장치.
  10. 제 9 항에 있어서,
    상기 단일 레지스터는 상기 두 개의 상이한 추가 레지스터의 레지스터 크기의 합과 동일한 레지스터 크기를 갖는 것을 특징으로 하는 데이터 처리 장치.
  11. 제 1 항 또는 제 2 항에 있어서,
    제1 레지스터 크기의 제1 레지스터로부터 상기 레지스터 데이터 저장소에 함께 기록된 데이터 요소 그룹은 제2 레지스터 크기의 제2 레지스터 내에서 상기 레지스터 데이터 저장소로부터 판독될 수 있으며, 상기 제1 레지스터 크기는 상기 제2 레지스터 크기와 상이한 것을 특징으로 하는 데이터 처리 장치.
  12. 제 1 항 또는 제 2 항에 있어서,
    상기 데이터 처리 명령어는 각각의 레지스터 크기(S1 및 S2)를 갖는 두 개의 소스 레지스터와 레지스터 크기(D)를 갖는 목적지 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 장치.
  13. 제 12 항에 있어서,
    S1 = S2 = D인 것을 특징으로 하는 데이터 처리 장치.
  14. 제 12 항에 있어서,
    2*S1 = 2*S2 = D인 것을 특징으로 하는 데이터 처리 장치.
  15. 제 12 항에 있어서,
    2*S1 = S2 = D인 것을 특징으로 하는 데이터 처리 장치.
  16. 제 12 항에 있어서,
    S1 = S2 = 2*D인 것을 특징으로 하는 데이터 처리 장치.
  17. 제 1 항 또는 제 2 항에 있어서,
    상기 데이터 처리 명령어는 레지스터 크기(S)를 갖는 소스 레지스터 및 레지스터 크기(D)를 갖는 목적지 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 장치.
  18. 제 17 항에 있어서,
    S=D 인 것을 특징으로 하는 데이터 처리 장치.
  19. 제 17 항에 있어서,
    2*S=D 인 것을 특징으로 하는 데이터 처리 장치.
  20. 제 17 항에 있어서,
    S=2*D 인 것을 특징으로 하는 데이터 처리 장치.
  21. 제 1 항 또는 제 2 항에 있어서,
    상기 데이터 처리 명령어는 상기 레지스터 데이터 저장소 내의 레지스터를 지정하도록 동작할 수 있는 레지스터 지정 필드를 포함하며, 소정의 레지스터 지정 필드에 대한 상기 레지스터는 상기 데이터 요소 크기 및 상기 레지스터 크기에 따라 상기 레지스터 데이터 저장소의 다른 부분에 상응하는 것을 특징으로 하는 데이터 처리 장치.
  22. 제 21 항에 있어서,
    소정의 데이터 요소 크기 및 레지스터 크기에 대한 상기 레지스터 지정 필드의 범위에 상응하는 복수의 레지스터는, 상이한 레지스터 크기 및 상이한 데이터 요소 크기 중 적어도 하나를 사용하여 레지스터로 액세스될 때 상기 레지스터 데이터 저장소의 연속 부분으로 맵핑하는 것을 특징으로 하는 데이터 처리 장치.
  23. 제 1 항 또는 제 2 항에 있어서,
    상기 상이한 레지스터 크기의 각기 다른 레지스터는 상기 부분 내에 저장된 상기 데이터 요소의 크기와 상이한 데이터 요소 크기를 갖는 하나 이상의 레지스터를 포함하는 것을 특징으로 하는 데이터 처리 장치.
  24. 제 1 항 또는 제 2 항에 있어서,
    상기 데이터 처리 명령어는 상기 레지스터의 레지스터 번호를 인코딩하는 복수의 비트를 포함하며, 상기 복수의 비트는, 상기 레지스터 번호를 형성하도록 상기 레지스터 크기에 따라 다수의 비트 위치에 의해 순환할 수 있는 연속적인 비트 필드로 맵핑될 수 있는 것을 특징으로 하는 데이터 처리 장치.
  25. 제 24 항에 있어서,
    상기 레지스터 액세싱 로직은, 상기 레지스터 데이터 저장소로부터 판독된 단일 데이터 요소를 저장하는 스칼라 레지스터로서 상기 레지스터 데이터 저장소를 액세스하도록 동작할 수 있는 것을 특징으로 하는 데이터 처리 장치.
  26. 제 24 항에 있어서,
    상기 레지스터 액세싱 로직은, 상기 레지스터 데이터 저장소로부터 판독된 단일 데이터 요소의 복수의 사본을 저장하는 레지스터로서 상기 레지스터 데이터 저장소를 액세스하도록 동작할 수 있는 것을 특징으로 하는 데이터 처리 장치.
  27. 제 25 항에 있어서,
    상기 레지스터 액세싱 로직은 상기 레지스터 데이터 저장소를 액세스하기 위한 행 주소 및 열 주소를 생성하도록 동작할 수 있으며, 상기 비트의 연속 필드의 제1 부분이 상기 행 주소에 상응하고, 상기 비트의 연속 필드의 제2 부분이 상기 열 주소에 상응하는 것을 특징으로 하는 데이터 처리 장치.
  28. 제 27 항에 있어서,
    상기 제1 부분과 상기 제2 부분 사이의 하나 이상의 경계는 상기 데이터 요소 크기에 따라 그 위치가 변화하는 것을 특징으로 하는 데이터 처리 장치.
  29. 레지스터 데이터 저장소 내에 복수의 데이터 요소를 저장하는 단계로서, 상기 레지스터 저장소내의 레지스터가 상기 데이터 요소들의 데이터 요소 크기에 따른 다수의 데이터 요소들을 유지하는 단계와,
    데이터 처리 명령어에 응답하여, 상기 레지스터 데이터 저장소의 상기 레지스터로서 액세스되는 선택된 복수의 데이터 요소에 병렬로 데이터 처리 연산을 수행하고, 상기 레지스터 내의 병렬 처리의 상이한 레인을 채우는 단계를 포함하는 데이터 처리 방법으로서,
    상기 선택된 복수의 데이터 요소의 데이터 요소는 복수의 상이한 데이터 요소 크기 중 하나를 공유하고, 상기 레지스터는 복수의 상이한 레지스터 크기 중 하나를 가지며, 상기 데이터 처리 명령어는, 상기 데이터 처리 연산에 대해 상기 복수의 상이한 데이터 요소 크기들 중에서 상기 선택된 복수의 데이터 요소들에의해 공유된 데이터 요소 크기 및 상기 레지스터의 레지스터 크기를 지정하며,
    상기 방법은,
    상기 레지스터 데이터 저장소의 일부에 저장된 데이터 요소가 상이한 레지스터 크기의 각각의 상이한 레지스터의 일부로서 액세스될 수 있도록, 상기 레지스터의 상기 레지스터 크기에 따라 상기 레지스터를 상기 레지스터 데이터 저장소의 일부로 맵핑하는 단계를 더 포함하는 데이터 처리 방법.
  30. 제 29 항에 있어서,
    상기 데이터 처리 명령어는, 상기 데이터 처리 명령어에 의해 지정되는 각각의 소스 레지스터 크기 및 소스 데이터 요소 크기를 각각 갖는 하나 이상의 소스 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 방법.
  31. 제 29 항 또는 제 30 항에 있어서,
    상기 데이터 처리 명령어는, 상기 데이터 처리 명령어에 의해 지정되는 목적지 레지스터 크기 및 목적지 데이터 요소 크기를 갖는 하나 이상의 목적지 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 방법.
  32. 제 31 항에 있어서,
    상기 목적지 데이터 요소 크기는 상기 하나 이상의 소스 데이터 요소 크기 중 적어도 하나와 상이한 것을 특징으로 하는 데이터 처리 방법.
  33. 제 29 항 또는 제 30 항에 있어서,
    두 개의 상이한 레지스터를 갖는 상기 레지스터 데이터 저장소에 기록된 데이터 요소 세트가, 하나의 추가 레지스터 내에서 상기 레지스터 데이터 저장소로부터 모두 함께 판독될 수 있는 것을 특징으로 하는 데이터 처리 방법.
  34. 제 33 항에 있어서,
    상기 두 개의 상이한 레지스터는 상기 레지스터 데이터 저장소의 인접한 부분에 기록하는 것을 특징으로 하는 데이터 처리 방법.
  35. 제 34 항에 있어서,
    상기 하나의 추가 레지스터는 상기 두 개의 상이한 레지스터의 레지스터 크기의 합과 동일한 레지스터 크기를 갖는 것을 특징으로 하는 데이터 처리 방법.
  36. 제 29 항 또는 제 30 항에 있어서,
    단일 레지스터로부터 상기 레지스터 데이터 저장소에 함께 기록된 데이터 요소 그룹은 두 개의 상이한 추가 레지스터 내에서 상기 레지스터 데이터 저장소로부터 판독될 수 있는 것을 특징으로 하는 데이터 처리 방법.
  37. 제 36 항에 있어서,
    상기 두 개의 상이한 추가 레지스터는 상기 레지스터 데이터 저장소의 인접한 부분으로부터 판독되는 것을 특징으로 하는 데이터 처리 방법.
  38. 제 37 항에 있어서,
    상기 단일 레지스터는 상기 두 개의 상이한 추가 레지스터의 레지스터 크기의 합과 동일한 레지스터 크기를 갖는 것을 특징으로 하는 데이터 처리 방법.
  39. 제 29 항 또는 제 30 항에 있어서,
    제1 레지스터 크기의 제1 레지스터로부터 상기 레지스터 데이터 저장소에 함께 기록된 데이터 요소 그룹은 제2 레지스터 크기의 제2 레지스터 내에서 상기 레지스터 데이터 저장소로부터 판독될 수 있으며, 상기 제1 레지스터 크기는 상기 제2 레지스터 크기와 상이한 것을 특징으로 하는 데이터 처리 방법.
  40. 제 29 항 또는 제 30 항에 있어서,
    상기 데이터 처리 명령어는 각각의 레지스터 크기(S1 및 S2)를 갖는 두 개의 소스 레지스터와 레지스터 크기(D)를 갖는 목적지 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 방법.
  41. 제 40 항에 있어서,
    S1 = S2 = D인 것을 특징으로 하는 데이터 처리 방법.
  42. 제 40 항에 있어서,
    2*S1 = 2*S2 = D인 것을 특징으로 하는 데이터 처리 방법.
  43. 제 40 항에 있어서,
    2*S1 = S2 = D인 것을 특징으로 하는 데이터 처리 방법.
  44. 제 40 항에 있어서,
    S1 = S2 = 2*D인 것을 특징으로 하는 데이터 처리 방법.
  45. 제 29 항 또는 제 30 항에 있어서,
    상기 데이터 처리 명령어는 레지스터 크기(S)를 갖는 소스 레지스터 및 레지스터 크기(D)를 갖는 목적지 레지스터를 지정하는 것을 특징으로 하는 데이터 처리 방법.
  46. 제 45 항에 있어서,
    S=D 인 것을 특징으로 하는 데이터 처리 방법.
  47. 제 45 항에 있어서,
    2*S=D 인 것을 특징으로 하는 데이터 처리 방법.
  48. 제 45 항에 있어서,
    S=2*D 인 것을 특징으로 하는 데이터 처리 방법.
  49. 제 29 항 또는 제 30 항에 있어서,
    상기 데이터 처리 명령어는 상기 레지스터 데이터 저장소 내의 레지스터를 지정하도록 동작할 수 있는 레지스터 지정 필드를 포함하며, 소정의 레지스터 지정 필드에 대한 상기 레지스터는 상기 데이터 요소 크기 및 상기 레지스터 크기에 따라 상기 레지스터 데이터 저장소의 다른 부분에 상응하는 것을 특징으로 하는 데이터 처리 방법.
  50. 제 49 항에 있어서,
    소정의 데이터 요소 크기 및 레지스터 크기에 대한 상기 레지스터 지정 필드의 범위에 상응하는 복수의 레지스터는, 상이한 레지스터 크기 및 상이한 데이터 요소 크기 중 적어도 하나를 사용하여 레지스터로 액세스될 때 상기 레지스터 데이터 저장소의 연속 부분으로 맵핑하는 것을 특징으로 하는 데이터 처리 방법.
  51. 제 29 항 또는 제 30 항에 있어서,
    상기 상이한 레지스터 크기의 다른 레지스터는 상기 부분 내에 저장된 상기 데이터 요소의 크기와 상이한 데이터 요소 크기를 갖는 하나 이상의 레지스터를 포함하는 것을 특징으로 하는 데이터 처리 방법.
  52. 제 29 항 또는 제 30 항에 있어서,
    상기 데이터 처리 명령어는 상기 레지스터의 레지스터 번호를 인코딩하는 복수의 비트를 포함하며, 상기 복수의 비트는, 상기 레지스터 번호를 형성하도록 상기 레지스터 크기에 따라 다수의 비트 위치에 의해 순환할 수 있는 연속적인 비트 필드로 맵핑될 수 있는 것을 특징으로 하는 데이터 처리 방법.
  53. 제 52 항에 있어서,
    상기 레지스터 액세싱 로직은, 상기 레지스터 데이터 저장소로부터 판독된 단일 데이터 요소를 저장하는 스칼라 레지스터로서 상기 레지스터 데이터 저장소를 액세스하도록 동작할 수 있는 것을 특징으로 하는 데이터 처리 방법.
  54. 제 52 항에 있어서,
    상기 레지스터 액세싱 로직은, 상기 레지스터 데이터 저장소로부터 판독된 단일 데이터 요소의 복수의 사본을 저장하는 레지스터로서 상기 레지스터 데이터 저장소를 액세스하도록 동작할 수 있는 것을 특징으로 하는 데이터 처리 방법.
  55. 제 53 항에 있어서,
    상기 레지스터 액세싱 로직은 상기 레지스터 데이터 저장소를 액세스하기 위한 행 주소 및 열 주소를 생성하도록 동작할 수 있으며, 상기 비트의 연속 필드의 제1 부분이 상기 행 주소에 상응하고, 상기 비트의 연속 필드의 제2 부분이 상기 열 주소에 상응하는 것을 특징으로 하는 데이터 처리 방법.
  56. 제 55 항에 있어서,
    상기 제1 부분과 상기 제2 부분 사이의 하나 이상의 경계는 상기 데이터 요소 크기에 따라 그 위치가 변화하는 것을 특징으로 하는 데이터 처리 방법.
  57. 처리 로직을 제어하여, 제 29 항 또는 제 30 항에 기재된 방법을 수행하도록 동작할 수 있는 적어도 하나의 데이터 처리 명령어를 포함한 컴퓨터 프로그램을 포함하는 컴퓨터 프로그램을 갖는 컴퓨터 판독가능한 기록매체.
KR1020067011129A 2003-12-09 2004-07-01 앨리어싱 데이터 처리 레지스터 KR100996888B1 (ko)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
GB0328513A GB2409062C (en) 2003-12-09 2003-12-09 Aliasing data processing registers
GB0328513.7 2003-12-09

Publications (2)

Publication Number Publication Date
KR20070001903A KR20070001903A (ko) 2007-01-04
KR100996888B1 true KR100996888B1 (ko) 2010-11-29

Family

ID=30129894

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020067011129A KR100996888B1 (ko) 2003-12-09 2004-07-01 앨리어싱 데이터 처리 레지스터

Country Status (11)

Country Link
US (1) US7822947B2 (ko)
EP (1) EP1692611B1 (ko)
JP (1) JP4727589B2 (ko)
KR (1) KR100996888B1 (ko)
CN (1) CN1914592B (ko)
GB (1) GB2409062C (ko)
IL (1) IL175901A (ko)
MY (1) MY137496A (ko)
RU (1) RU2006124547A (ko)
TW (1) TWI322958B (ko)
WO (1) WO2005057417A2 (ko)

Families Citing this family (52)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7483595B2 (en) * 2004-09-16 2009-01-27 Marvell International Technology Ltd. Image processing method and device
US20060218377A1 (en) * 2005-03-24 2006-09-28 Stexar Corporation Instruction with dual-use source providing both an operand value and a control value
US20070226469A1 (en) * 2006-03-06 2007-09-27 James Wilson Permutable address processor and method
US9069547B2 (en) 2006-09-22 2015-06-30 Intel Corporation Instruction and logic for processing text strings
GB2474522B (en) * 2009-10-19 2014-09-03 Advanced Risc Mach Ltd Register state saving and restoring
JP5760532B2 (ja) * 2011-03-14 2015-08-12 株式会社リコー プロセッサ装置及びその演算方法
US8933954B2 (en) * 2011-03-23 2015-01-13 Qualcomm Incorporated Register allocation for graphics processing
US9519617B2 (en) * 2011-07-14 2016-12-13 Texas Instruments Incorporated Processor with instruction variable data distribution
WO2013057872A1 (ja) * 2011-10-18 2013-04-25 パナソニック株式会社 シャッフルパターン生成回路、プロセッサ、シャッフルパターン生成方法、命令
CN108681465B (zh) * 2011-12-22 2022-08-02 英特尔公司 用于产生整数序列的处理器、处理器核及系统
CN106843811B (zh) * 2011-12-22 2019-03-29 英特尔公司 用于将源操作数映射到不同范围的系统、装置和方法
US10565283B2 (en) 2011-12-22 2020-02-18 Intel Corporation Processors, methods, systems, and instructions to generate sequences of consecutive integers in numerical order
WO2013095564A1 (en) 2011-12-22 2013-06-27 Intel Corporation Processors, methods, systems, and instructions to generate sequences of integers in numerical order that differ by a constant stride
US10223112B2 (en) 2011-12-22 2019-03-05 Intel Corporation Processors, methods, systems, and instructions to generate sequences of integers in which integers in consecutive positions differ by a constant integer stride and where a smallest integer is offset from zero by an integer offset
US9946540B2 (en) 2011-12-23 2018-04-17 Intel Corporation Apparatus and method of improved permute instructions with multiple granularities
CN111831334A (zh) 2011-12-23 2020-10-27 英特尔公司 经改进的插入指令的装置和方法
CN107391086B (zh) 2011-12-23 2020-12-08 英特尔公司 改进置换指令的装置和方法
CN107220029B (zh) 2011-12-23 2020-10-27 英特尔公司 掩码置换指令的装置和方法
CN108241504A (zh) 2011-12-23 2018-07-03 英特尔公司 经改进的提取指令的装置和方法
US9400650B2 (en) * 2012-09-28 2016-07-26 Intel Corporation Read and write masks update instruction for vectorization of recursive computations over interdependent data
US9324128B2 (en) * 2013-03-14 2016-04-26 Intel Corporation Techniques for improving rendering efficiency
US9639356B2 (en) * 2013-03-15 2017-05-02 Qualcomm Incorporated Arbitrary size table lookup and permutes with crossbar
CN103235762B (zh) * 2013-04-19 2016-06-22 中国科学院自动化研究所 一种自索引寄存器文件堆装置
US9424034B2 (en) * 2013-06-28 2016-08-23 Intel Corporation Multiple register memory access instructions, processors, methods, and systems
JPWO2015040678A1 (ja) * 2013-09-17 2017-03-02 富士通株式会社 コロニー検査プログラム、コロニー検査装置およびコロニー検査方法
CN103606129B (zh) * 2013-11-29 2016-08-24 广东威创视讯科技股份有限公司 图像处理系统中控制器与图像处理芯片的寻址方法和系统
US20160335636A1 (en) * 2014-01-27 2016-11-17 Tong Shao Dual-Channel Identity Authentication Selection Device, System and Method
US9772848B2 (en) * 2014-11-14 2017-09-26 Intel Corporation Three-dimensional morton coordinate conversion processors, methods, systems, and instructions
US9772849B2 (en) * 2014-11-14 2017-09-26 Intel Corporation Four-dimensional morton coordinate conversion processors, methods, systems, and instructions
US20170046156A1 (en) * 2015-08-14 2017-02-16 Qualcomm Incorporated Table lookup using simd instructions
US9852080B2 (en) 2015-08-17 2017-12-26 Qualcomm Incorporated Efficiently generating selection masks for row selections within indexed address spaces
US20170177350A1 (en) * 2015-12-18 2017-06-22 Intel Corporation Instructions and Logic for Set-Multiple-Vector-Elements Operations
US10275243B2 (en) 2016-07-02 2019-04-30 Intel Corporation Interruptible and restartable matrix multiplication instructions, processors, methods, and systems
KR102584031B1 (ko) * 2017-02-23 2023-10-04 에이알엠 리미티드 데이터 처리장치에서의 요소 바이 벡터 연산
US10409592B2 (en) * 2017-04-24 2019-09-10 Arm Limited Multiply-and-accumulate-products instructions
US11893393B2 (en) 2017-07-24 2024-02-06 Tesla, Inc. Computational array microprocessor system with hardware arbiter managing memory requests
US11409692B2 (en) * 2017-07-24 2022-08-09 Tesla, Inc. Vector computational unit
US10671349B2 (en) 2017-07-24 2020-06-02 Tesla, Inc. Accelerated mathematical engine
CN109298886A (zh) * 2017-07-25 2019-02-01 合肥君正科技有限公司 Simd指令执行方法、装置及处理器
US11243765B2 (en) 2017-09-29 2022-02-08 Intel Corporation Apparatus and method for scaling pre-scaled results of complex multiply-accumulate operations on packed real and imaginary data elements
US10795676B2 (en) 2017-09-29 2020-10-06 Intel Corporation Apparatus and method for multiplication and accumulation of complex and real packed data elements
US10795677B2 (en) 2017-09-29 2020-10-06 Intel Corporation Systems, apparatuses, and methods for multiplication, negation, and accumulation of vector packed signed values
US10802826B2 (en) 2017-09-29 2020-10-13 Intel Corporation Apparatus and method for performing dual signed and unsigned multiplication of packed data elements
US10552154B2 (en) 2017-09-29 2020-02-04 Intel Corporation Apparatus and method for multiplication and accumulation of complex and real packed data elements
US10534838B2 (en) 2017-09-29 2020-01-14 Intel Corporation Bit matrix multiplication
US11074073B2 (en) 2017-09-29 2021-07-27 Intel Corporation Apparatus and method for multiply, add/subtract, and accumulate of packed data elements
US10514924B2 (en) * 2017-09-29 2019-12-24 Intel Corporation Apparatus and method for performing dual signed and unsigned multiplication of packed data elements
US11256504B2 (en) 2017-09-29 2022-02-22 Intel Corporation Apparatus and method for complex by complex conjugate multiplication
US10664277B2 (en) 2017-09-29 2020-05-26 Intel Corporation Systems, apparatuses and methods for dual complex by complex conjugate multiply of signed words
US11561791B2 (en) 2018-02-01 2023-01-24 Tesla, Inc. Vector computational unit receiving data elements in parallel from a last row of a computational array
US11449336B2 (en) * 2019-05-24 2022-09-20 Texas Instmments Incorporated Method of storing register data elements to interleave with data elements of a different register, a processor thereof, and a system thereof
CN112859377B (zh) * 2019-11-28 2023-03-14 京东方科技集团股份有限公司 一种复用寄存器、三维显示装置及其控制方法

Family Cites Families (62)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US4876660A (en) * 1987-03-20 1989-10-24 Bipolar Integrated Technology, Inc. Fixed-point multiplier-accumulator architecture
JPH0778735B2 (ja) * 1988-12-05 1995-08-23 松下電器産業株式会社 キャッシュ装置と命令読出し装置
US5771368A (en) * 1990-10-29 1998-06-23 Sun Microsystems, Inc. Memory addressing scheme for increasing the number of memory locations available in a computer for storing higher precision numbers
JPH05233281A (ja) * 1992-02-21 1993-09-10 Toshiba Corp 電子計算機
US5408670A (en) * 1992-12-18 1995-04-18 Xerox Corporation Performing arithmetic in parallel on composite operands with packed multi-bit components
EP0640912B1 (en) * 1993-08-31 2000-05-10 Sun Microsystems, Inc. Memory addressing scheme for increasing the number of memory locations available in a computer for storing higher precision numbers
US5481743A (en) * 1993-09-30 1996-01-02 Apple Computer, Inc. Minimal instruction set computer architecture and multiple instruction issue method
US5881302A (en) * 1994-05-31 1999-03-09 Nec Corporation Vector processing unit with reconfigurable data buffer
GB9412434D0 (en) * 1994-06-21 1994-08-10 Inmos Ltd Computer instruction compression
US6009508A (en) * 1994-06-21 1999-12-28 Sgs-Thomson Microelectronics Limited System and method for addressing plurality of data values with a single address in a multi-value store on FIFO basis
GB9412487D0 (en) * 1994-06-22 1994-08-10 Inmos Ltd A computer system for executing branch instructions
US5513366A (en) * 1994-09-28 1996-04-30 International Business Machines Corporation Method and system for dynamically reconfiguring a register file in a vector processor
WO1996017293A1 (en) * 1994-12-01 1996-06-06 Intel Corporation A microprocessor having a multiply operation
US5761103A (en) * 1995-03-08 1998-06-02 Texas Instruments Incorporated Left and right justification of single precision mantissa in a double precision rounding unit
GB9509988D0 (en) * 1995-05-17 1995-07-12 Sgs Thomson Microelectronics Matrix transposition
GB9509983D0 (en) * 1995-05-17 1995-07-12 Sgs Thomson Microelectronics Replication of data
GB9509987D0 (en) * 1995-05-17 1995-07-12 Sgs Thomson Microelectronics Manipulation of data
GB9509989D0 (en) * 1995-05-17 1995-07-12 Sgs Thomson Microelectronics Manipulation of data
GB9513515D0 (en) * 1995-07-03 1995-09-06 Sgs Thomson Microelectronics Expansion of data
GB9514695D0 (en) * 1995-07-18 1995-09-13 Sgs Thomson Microelectronics Combining data values
GB9514684D0 (en) * 1995-07-18 1995-09-13 Sgs Thomson Microelectronics An arithmetic unit
JP3526976B2 (ja) * 1995-08-03 2004-05-17 株式会社日立製作所 プロセッサおよびデータ処理装置
US6295599B1 (en) * 1995-08-16 2001-09-25 Microunity Systems Engineering System and method for providing a wide operand architecture
US5907865A (en) * 1995-08-28 1999-05-25 Motorola, Inc. Method and data processing system for dynamically accessing both big-endian and little-endian storage schemes
US5963744A (en) * 1995-09-01 1999-10-05 Philips Electronics North America Corporation Method and apparatus for custom operations of a processor
US6088783A (en) * 1996-02-16 2000-07-11 Morton; Steven G DPS having a plurality of like processors controlled in parallel by an instruction word, and a control processor also controlled by the instruction word
US5937178A (en) * 1996-02-13 1999-08-10 National Semiconductor Corporation Register file for registers with multiple addressable sizes using read-modify-write for register file update
US5808875A (en) * 1996-03-29 1998-09-15 Intel Corporation Integrated circuit solder-rack interconnect module
US6058465A (en) * 1996-08-19 2000-05-02 Nguyen; Le Trong Single-instruction-multiple-data processing in a multimedia signal processor
US5838984A (en) * 1996-08-19 1998-11-17 Samsung Electronics Co., Ltd. Single-instruction-multiple-data processing using multiple banks of vector registers
GB2317467B (en) 1996-09-23 2000-11-01 Advanced Risc Mach Ltd Input operand control in data processing systems
TW364976B (en) * 1996-09-23 1999-07-21 Arm Corp Input operand control in data processing systems
TW380237B (en) 1996-09-23 2000-01-21 Advanced Risc Mach Ltd Data processing system register control
US5996066A (en) * 1996-10-10 1999-11-30 Sun Microsystems, Inc. Partitioned multiply and add/subtract instruction for CPU with integrated graphics functions
US6173366B1 (en) * 1996-12-02 2001-01-09 Compaq Computer Corp. Load and store instructions which perform unpacking and packing of data bits in separate vector and integer cache storage
US5893145A (en) * 1996-12-02 1999-04-06 Compaq Computer Corp. System and method for routing operands within partitions of a source register to partitions within a destination register
US5909572A (en) * 1996-12-02 1999-06-01 Compaq Computer Corp. System and method for conditionally moving an operand from a source register to a destination register
US5991531A (en) * 1997-02-24 1999-11-23 Samsung Electronics Co., Ltd. Scalable width vector processor architecture for efficient emulation
US5898896A (en) * 1997-04-10 1999-04-27 International Business Machines Corporation Method and apparatus for data ordering of I/O transfers in Bi-modal Endian PowerPC systems
US5973705A (en) * 1997-04-24 1999-10-26 International Business Machines Corporation Geometry pipeline implemented on a SIMD machine
US6047304A (en) * 1997-07-29 2000-04-04 Nortel Networks Corporation Method and apparatus for performing lane arithmetic to perform network processing
GB2330226B (en) * 1997-08-30 2000-12-27 Lg Electronics Inc Digital signal processor
GB2329810B (en) * 1997-09-29 2002-02-27 Science Res Foundation Generation and use of compressed image data
US5933650A (en) * 1997-10-09 1999-08-03 Mips Technologies, Inc. Alignment and ordering of vector elements for single instruction multiple data processing
US5864703A (en) * 1997-10-09 1999-01-26 Mips Technologies, Inc. Method for providing extended precision in SIMD vector arithmetic operations
US6269384B1 (en) * 1998-03-27 2001-07-31 Advanced Micro Devices, Inc. Method and apparatus for rounding and normalizing results within a multiplier
US6223198B1 (en) * 1998-08-14 2001-04-24 Advanced Micro Devices, Inc. Method and apparatus for multi-function arithmetic
US6038583A (en) * 1997-10-23 2000-03-14 Advanced Micro Devices, Inc. Method and apparatus for simultaneously multiplying two or more independent pairs of operands and calculating a rounded products
US6144980A (en) * 1998-01-28 2000-11-07 Advanced Micro Devices, Inc. Method and apparatus for performing multiple types of multiplication including signed and unsigned multiplication
US6085213A (en) * 1997-10-23 2000-07-04 Advanced Micro Devices, Inc. Method and apparatus for simultaneously multiplying two or more independent pairs of operands and summing the products
US6223277B1 (en) * 1997-11-21 2001-04-24 Texas Instruments Incorporated Data processing circuit with packed data structure capability
US6223320B1 (en) * 1998-02-10 2001-04-24 International Business Machines Corporation Efficient CRC generation utilizing parallel table lookup operations
US6334176B1 (en) * 1998-04-17 2001-12-25 Motorola, Inc. Method and apparatus for generating an alignment control vector
JP2000020486A (ja) * 1998-06-29 2000-01-21 Ricoh Co Ltd Simd型演算器
US6292888B1 (en) * 1999-01-27 2001-09-18 Clearwater Networks, Inc. Register transfer unit for electronic processor
GB2352065B (en) 1999-07-14 2004-03-03 Element 14 Ltd A memory access system
US6408345B1 (en) * 1999-07-15 2002-06-18 Texas Instruments Incorporated Superscalar memory transfer controller in multilevel memory organization
ATE475930T1 (de) 1999-09-01 2010-08-15 Intel Corp Verzweigungsbefehl für einen mehrfachverarbeitungsprozessor
US6546480B1 (en) * 1999-10-01 2003-04-08 Hitachi, Ltd. Instructions for arithmetic operations on vectored data
US6748521B1 (en) 2000-02-18 2004-06-08 Texas Instruments Incorporated Microprocessor with instruction for saturating and packing data
TW538335B (en) 2001-12-24 2003-06-21 Winbond Electronics Corp Method and device for speeding up reading and writing the register for the processor
US7761683B2 (en) * 2002-03-05 2010-07-20 Hewlett-Packard Development Company, L.P. Variable width memory system and method

Also Published As

Publication number Publication date
TWI322958B (en) 2010-04-01
JP4727589B2 (ja) 2011-07-20
GB0328513D0 (en) 2004-01-14
WO2005057417A3 (en) 2006-03-23
GB2409062B (en) 2006-08-16
US7822947B2 (en) 2010-10-26
IL175901A0 (en) 2006-10-05
CN1914592B (zh) 2010-05-12
GB2409062A (en) 2005-06-15
WO2005057417A2 (en) 2005-06-23
RU2006124547A (ru) 2008-01-20
EP1692611A2 (en) 2006-08-23
TW200525417A (en) 2005-08-01
EP1692611B1 (en) 2018-08-22
IL175901A (en) 2011-11-30
CN1914592A (zh) 2007-02-14
MY137496A (en) 2009-02-27
KR20070001903A (ko) 2007-01-04
GB2409062C (en) 2007-12-11
US20050172106A1 (en) 2005-08-04
JP2007514226A (ja) 2007-05-31

Similar Documents

Publication Publication Date Title
KR100996888B1 (ko) 앨리어싱 데이터 처리 레지스터
KR100991984B1 (ko) 레지스터와 메모리 사이에 데이터를 이동시키는 데이터처리장치 및 방법
KR101099467B1 (ko) 레지스터와 메모리 사이에 데이터를 이동시키는 데이터처리장치 및 방법
US7689811B2 (en) Method and apparatus for constant generation in SIMD processing
US9557994B2 (en) Data processing apparatus and method for performing N-way interleaving and de-interleaving operations where N is an odd plural number
US7761693B2 (en) Data processing apparatus and method for performing arithmetic operations in SIMD data processing
JP5366917B2 (ja) データ要素に対するデータ処理操作を並列に実行するためのデータ処理装置及び方法
US20050198473A1 (en) Multiplexing operations in SIMD processing
US20050125647A1 (en) Endianess compensation within a SIMD data processing system
US6958718B2 (en) Table lookup operation within a data processing system
US20050125636A1 (en) Vector by scalar operations
US7210023B2 (en) Data processing apparatus and method for moving data between registers and memory in response to an access instruction having an alignment specifier identifying an alignment to be associated with a start address
US20050125635A1 (en) Moving data between registers of different register data stores
US20050125631A1 (en) Data element size control within parallel lanes of processing
US20050125638A1 (en) Data shift operations

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant
FPAY Annual fee payment

Payment date: 20131101

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20141107

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20151016

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20161019

Year of fee payment: 7

FPAY Annual fee payment

Payment date: 20171018

Year of fee payment: 8

FPAY Annual fee payment

Payment date: 20191029

Year of fee payment: 10