KR100911786B1 - 다목적 승산-가산 기능 유닛 - Google Patents

다목적 승산-가산 기능 유닛 Download PDF

Info

Publication number
KR100911786B1
KR100911786B1 KR1020077012628A KR20077012628A KR100911786B1 KR 100911786 B1 KR100911786 B1 KR 100911786B1 KR 1020077012628 A KR1020077012628 A KR 1020077012628A KR 20077012628 A KR20077012628 A KR 20077012628A KR 100911786 B1 KR100911786 B1 KR 100911786B1
Authority
KR
South Korea
Prior art keywords
operand
result
operations
pipeline
operands
Prior art date
Application number
KR1020077012628A
Other languages
English (en)
Other versions
KR20070085755A (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
Priority claimed from US10/986,531 external-priority patent/US20060101244A1/en
Priority claimed from US10/985,291 external-priority patent/US7225323B2/en
Priority claimed from US10/985,695 external-priority patent/US7240184B2/en
Priority claimed from US10/985,674 external-priority patent/US7428566B2/en
Application filed by 엔비디아 코포레이션 filed Critical 엔비디아 코포레이션
Publication of KR20070085755A publication Critical patent/KR20070085755A/ko
Application granted granted Critical
Publication of KR100911786B1 publication Critical patent/KR100911786B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F7/00Methods or arrangements for processing data by operating upon the order or content of the data handled
    • G06F7/38Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation
    • G06F7/48Methods or arrangements for performing computations using exclusively denominational number representation, e.g. using binary, ternary, decimal representation using non-contact-making devices, e.g. tube, solid state device; using unspecified devices
    • G06F7/57Arithmetic logic units [ALU], i.e. arrangements or devices for performing two or more of the operations covered by groups G06F7/483 – G06F7/556 or for performing logical operations
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/30007Arrangements for executing specific machine instructions to perform operations on data operands
    • G06F9/30025Format conversion instructions, e.g. Floating-Point to Integer, decimal conversion
    • 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

Abstract

다목적 기능 유닛이 승산-가산 및 비교 테스트 연산은 물론, 다른 정수 및/또는 부동 소수점 산술 연산, 부울 연산, 및 포맷 변환 연산을 포함하는 다수의 연산을 지원하도록 구성될 수 있다.
다목적 승산-가산 기능 유닛, 승산 파이프라인, 가산 파이프라인, 지수 파이프라인, 피연산자,

Description

다목적 승산-가산 기능 유닛{MULTIPURPOSE MULTIPLY-ADD FUNCTIONAL UNIT}
<관련 출원들의 교차 참조>
본 출원은, 모두 2004년 11월 10일자로 출원되어 본 출원의 양수인에게 양도된, 이하의 미국 특허 출원들에 대한 우선권을 주장한다:
- 발명의 명칭이 "다목적 승산-가산 기능 유닛"인 미국출원번호 제10/985,291호
- 발명의 명칭이 "결합된 정수 및 부동 소수점 승산-가산 파이프라인을 구비한 다목적 기능 유닛"인 미국출원번호 제10/986,531호
- 발명의 명칭이 "승산-가산 및 논리 테스트 파이프라인을 구비한 다목적 기능 유닛"인 미국출원번호 제10/985,695호
- 발명의 명칭이 "승산-가산 및 포맷 변환 파이프라인을 구비한 다목적 기능 유닛"인 미국출원번호 제10/985,674호
본 발명은 일반적으로 마이크로프로세서에 관한 것으로서, 구체적으로는 프로세서 코어용의 다목적 승산-가산 기능 유닛에 관한 것이다.
실시간 컴퓨터 애니메이션은 프로세서에 극심한 수요를 두고 있다. 이러한 수요를 만족시키기 위하여, 전용 그래픽 처리 유닛은 통상적으로 다수(예를 들어, 16개)의 코어가 병렬로 동작하는 고도의 병렬 아키텍처를 구현하며, 각각의 코어는 프로세싱 유닛에 의해 지원되는 연산들을 수행하기 위한 기능 유닛들을 구비하는 다수(예를 들어, 8개)의 병렬 파이프라인을 각각 포함한다. 이러한 연산들은 일반적으로 정수 및 부동 소수점 산술 연산(가산, 승산 등), 비트 논리 연산, 비교 연산, 포맷 변환 연산 등을 포함한다. 파이프라인들은 일반적으로 동일한 설계를 가지므로, 임의의 파이프라인에 의해 임의의 지원 명령이 처리될 수 있고, 따라서 각 파이프라인은 완전한 기능 유닛들의 세트를 요구한다.
통상적으로, 각각의 기능 유닛은 하나 또는 두 가지 연산을 처리하도록 특화되어 있다. 예를 들어, 기능 유닛들은 정수 가산/감산 유닛, 부동 소수점 승산 유닛, 하나 이상의 이진 논리 유닛, 및 정수와 부동 소수점 포맷 간의 변환을 위한 하나 이상의 포맷 변환 유닛을 포함할 수 있다.
시간이 지남에 따라, 그래픽 처리 유닛이 지원할 것으로 기대되는 기본 연산들(명령들)의 수가 증가해 오고 있다. 피연산자 A, B 및 C에 대해 A*B+C를 계산하는 3 변수 "승산-가산"(MAD) 명령과 같은 새로운 명령들이 제안되어 왔다. 이러한 연산들을 지원하기 위하여 계속 기능 유닛들을 추가하는 것은 많은 문제를 유발한다. 예를 들어, 임의의 새로운 기능 유닛들이 각각의 파이프라인에 추가되어야 하므로, 단지 추가 유닛을 추가하는데 필요한 칩 면적이 중요해질 수 있다. 또한, 새로운 기능 유닛들은 전력 소모를 증가시키며, 이는 개량된 냉각 시스템을 요구할 수 있다. 이러한 요인들은 칩 설계의 어려움 및 비용에 기여한다. 또한, 기능 유닛들의 수가 한 사이클 내에 발행될 수 있는 명령들의 수를 초과하는 만큼, 기능 유닛들의 처리 용량이 비효율적으로 사용된다.
따라서, 감소된 칩 면적을 필요로 하고 보다 효율적으로 사용될 수 있는 기능 유닛들을 제공하는 것이 바람직하다.
<발명의 개요>
본 발명의 실시예들은 다목적 기능 유닛들을 제공한다. 일 실시예에서, 다목적 기능 유닛은 다음의 연산들, 즉 정수 및 부동 소수점 피연산자들에 대한 가산, 승산 및 승산-가산; 부울 연산, 최대치 및 최소치 연산, 3 변수 비교 연산 및 이진 테스트 연산(예를 들어, 초과, 미만, 등가 또는 무순서)을 포함하는 테스트 연산; 좌측 시프트 및 우측 시프트 연산; 정수와 부동 소수점 포맷 간, 하나의 정수 포맷과 다른 정수 포맷 간, 및 하나의 부동 소수점과 다른 부동 소수점 간의 변환을 위한 포맷 변환 연산; 지수 및 삼각 함수를 포함하는 초월 함수의 독립 변수들에 대한 독립 변수 축소 연산; 및 부동 소수점 피연산자의 소수부(fractional portion)를 반환하는 소수 연산 모두를 지원한다. 다른 실시예들에서, 다목적 기능 유닛은 이들 연산 및/또는 다른 연산들의 임의의 서브세트도 지원할 수 있다.
본 발명의 일 양상에 따르면, 프로세서용의 다목적 기능 유닛은, 입력부, 승산 파이프라인, 테스트 파이프라인, 가산 파이프라인, 지수 파이프라인, 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되며, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결 과로서 선택하도록 구성될 수 있다. 테스트 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자들의 비교를 수행하고, 비교 결과를 제2 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 지수 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자에 대해 지수 연산을 수행하고, 지수 연산의 결과를 지수 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과 및 지수 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정되는 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다. 지원 연산들은 부동 소수점 승산-가산(FMAD) 연산, 정수 승산-가산(IMAD) 연산 및 적어도 하나의 비교 테스트 연산을 포함한다.
다양한 비교 테스트 연산이 지원될 수 있다. 예를 들어, 일 실시예에서, 적어도 하나의 비교 테스트 연산은 최대치(MAX) 연산, 최소치(MIN) 연산, 및 3 변수 비교(CMP) 연산으로 이루어지는 그룹으로부터 선택되는 하나 이상의 연산을 포함한다. 다른 실시예에서, 적어도 하나의 비교 테스트 연산은 초과 연산, 미만 연산, 등가 연산 및 무순서 연산으로 이루어지는 그룹으로부터 선택되는 하나 이상의 이진 테스트(SET) 연산을 포함하는데, 하나 이상의 이진 테스트 연산 각각은 부울 결과를 생성한다. 부울 결과를 갖는 SET 연산들이 지원되는 실시예들에서, 보조 결과 경로가 테스트 파이프라인과 출력부 사이에 결합되고, 테스트 파이프라인으로부 터의 부울 보조 결과를 출력부로 전달하도록 구성될 수 있으며, 출력부는 제어 신호에 응답하여, 연산 코드가 SET 연산들 중 하나를 지정하는 경우에 부울 보조 결과에 기초하여 최종 결과를 생성하도록 더 구성될 수 있다.
다른 연산들도 지원될 수 있다. 예를 들어, 지원 연산들은 비트 부울 논리 연산(예를 들어, AND 연산, OR 연산, XOR 연산); 부동 소수점 가산(FADD) 연산 및 정수 가산(IADD) 연산 - 가산 파이프라인은 제어 신호에 응답하여 FADD 연산 및 IADD 연산을 수행하도록 더 구성될 수 있음 -; 부동 소수점 승산(FMUL) 연산 및 정수 승산(IMUL) 연산 - 승산 파이프라인은 제어 신호에 응답하여 FMUL 연산 및 IMUL 연산을 수행하도록 더 구성될 수 있음 -; 제1 피연산자를 입력 포맷에서 타겟 포맷으로 변환하는 포맷 변환 연산; 예를 들어 삼각 또는 지수 함수에 대한 도메인 맵핑(RRO) 연산; 및 제1 피연산자의 소수부를 반환하는 소수(FRC) 연산을 더 포함할 수 있다. 이들 연산은 물론 다른 연산들의 다양한 부 조합이 지원될 수 있다.
본 발명의 다른 양상에 따르면, 마이크로프로세서는 프로그램 연산을 실행하도록 구성된 기능 유닛들을 구비한 실행 코어를 포함한다. 기능 유닛들 중 적어도 하나는 적어도 부동 소수점 승산-가산(FMAD) 연산, 정수 승산-가산(IMAD) 연산, 및 적어도 하나의 비교 테스트 연산을 포함하는 다수의 지원 연산을 실행할 수 있는 다목적 기능 유닛이다. 다목적 기능 유닛은 입력부, 승산 파이프라인, 테스트 파이프라인, 가산 파이프라인, 지수 파이프라인 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성 된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 테스트 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자들의 비교를 수행하고, 비교 결과를 제2 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 지수 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자에 대한 지수 연산을 수행하고 지수 연산의 결과를 지수 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과 및 지수 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정되는 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다.
본 발명의 또 다른 양상에 따르면, 마이크로프로세서의 기능 유닛을 동작시키기 위한 방법이 제공된다. 연산 코드 및 하나 이상의 피연산자가 수신되며, 연산 코드는 하나 이상의 피연산자에 대해 수행될 복수의 지연 연산 중 하나를 지정한다. 연산 코드 및 하나 이상의 피연산자에 응답하여, 기능 유닛 내의 승산 파이프라인은 제1 중간 결과를 생성하도록 동작하고, 기능 유닛 내의 테스트 파이프라인은 제2 중간 결과를 생성하도록 동작하며, 기능 유닛 내의 지수 파이프라인은 지수 결과 및 정렬 제어 신호를 생성하도록 동작한다. 기능 유닛 내의 가산 파이프라인은 연산 코드 및 정렬 제어 신호에 응답하여 제1 및 제2 중간 결과들을 더하여 연산 결과를 생성하도록 동작한다. 기능 유닛의 출력부는 연산 결과 및 지수 결과로부터 최종 결과를 계산하도록 동작한다. 지원 연산들은 부동 소수점 승산-가산(FMAD) 연산, 정수 승산-가산(IMAD) 연산 및 적어도 하나의 비교 테스트 연산을 포함한다.
본 발명의 또 다른 양상에 따르면, 프로세서용의 다목적 기능 유닛이 입력부, 승산 파이프라인, 가산 파이프라인, 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자들, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정되는 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다. 지원 연산들은 제1, 제2 및 제3 피연산자들에 대해 연산하는 부동 소수점 승산-가산(FMAD) 연산 및 정수 승산-가산(IMAD) 연산을 포함하며, 승산 파이프라인 및 가산 파이프라인은 제어 신호에 응답하여 FMAD 연산에 대해 최종 결과가 부동 소수점 값을 나타내고, IMAD 연산에 대해 최종 결과가 정수 값을 나타내도록 더 구성될 수 있다.
다양한 다른 연산들도 지원될 수 있다. 예를 들어, 일 실시예에서, 지원 연 산들은 제1 및 제3 피연산자들에 대해 연산하는 부동 소수점 가산(FADD) 연산 및 정수 가산(IADD) 연산을 더 포함한다. 다른 실시예에서, 지원 연산들은 제1 및 제2 피연산자들에 대해 연산하는 부동 소수점 승산(FMUL) 연산 및 정수 승산(IMUL) 연산을 더 포함한다. 또 다른 실시예에서, 지원 연산들은 절대차 정수합(ISAD) 연산을 더 포함한다.
본 발명의 다른 양상에 따르면, 마이크로프로세서는 프로그램 연산을 실행하도록 구성된 기능 유닛들을 구비한 실행 코어를 포함한다. 기능 유닛들 중 적어도 하나는 적어도 부동 소수점 승산-가산(FMAD) 연산 및 정수 승산-가산(IMAD) 연산을 포함하는 다수의 지원 연산을 실행할 수 있는 다목적 기능 유닛이다. 다목적 기능 유닛은 입력부, 승산 파이프라인, 가산 파이프라인, 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자들, 및 수행할 지원 연산들 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정되는 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다. 승산 파이프라인 및 가산 파이프라인은 제어 신호에 응답하여 FMAD 연산에 대해 최종 결과가 부동 소수점 값을 나타 내고 IMAD 연산에 대해 최종 결과가 정수 값을 나타내도록 더 구성될 수 있다.
본 발명의 또 다른 양상에 따르면, 마이크로프로세서의 기능 유닛을 동작시키기 위한 방법에 제공된다. 연산 코드 및 하나 이상의 피연산자가 수신되고, 연산 코드는 하나 이상의 피연산자에 대해 수행되는 복수의 지원 연산 중 하나를 지정한다. 연산 코드 및 하나 이상의 피연산자에 응답하여, 기능 유닛 내의 승산 파이프라인은 제1 중간 결과 및 제2 중간 결과를 생성하도록 동작한다. 기능 유닛 내의 가산 파이프라인은 제1 및 제2 중간 결과들을 더하여 연산 결과를 생성하도록 동작한다. 기능 유닛의 출력부는 연산 결과로부터 최종 결과를 계산하도록 동작한다. 지원 연산들은 부동 소수점 승산-가산(FMAD) 연산 및 정수 승산-가산(IMAD) 연산을 포함한다.
본 발명의 또 다른 양상에 따르면, 프로세서용의 다목적 기능 유닛은 입력부, 승산 파이프라인, 테스트 파이프라인, 가산 파이프라인 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자들, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 테스트 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 비교를 수행하고, 비교 결과를 제2 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과 들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정된 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다. 복수의 지원 연산은 제1, 제2 및 제3 피연산자들에 대해 연산하는 정수 승산-가산(IMAD) 연산 및 제1, 제2 및 제3 피연산자들 중 적어도 하나에 대해 연산하는 논리 테스트 연산을 포함한다.
몇몇 실시예에서, 논리 테스트 연산은 한 세트의 이진 테스트(SET) 연산들 중 하나일 수 있는데, 이진 테스트 연산들의 세트는 적어도 등가 테스트, 초과 테스트, 및 미만 테스트를 포함한다. 일 실시예에서, 논리 테스트 연산에 대한 제1, 제2 및 제3 피연산자들은 정수 피연산자 또는 부동 소수점 피연산자일 수 있다. 몇몇 실시예에서, 지원 연산들을 또한 제1, 제2 및 제3 피연산자들에 대해 연산하는 부동 소수점 승산-가산(FMAD) 연산을 포함한다. 다른 실시예들에서, 지원 연산들은 또한 비트 부울 AND 연산, 비트 부울 OR 연산 및 비트 부울 XOR 연산을 포함한다.
본 발명의 또 다른 양상에 따르면, 마이크로프로세서는 프로그램 연산을 실행하도록 구성된 기능 유닛들을 구비한 실행 코어들 포함한다. 기능 유닛들 중 적어도 하나는 제1, 제2 및 제3 피연산자들에 대해 연산하는 승산-가산(MAD) 연산, 및 제1, 제2 및 제3 피연산자들 중 적어도 하나에 대해 연산하는 논리 테스트 연산을 포함하는 다수의 지원 연산을 실행할 수 있는 다목적 기능 유닛이다. 다목적 기능 유닛은 입력부, 승산 파이프라인, 테스트 파이프라인, 가산 파이프라인 및 출 력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 테스트 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 비교를 수생하고, 비교 결과를 제2 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정된 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다.
본 발명의 또 다른 양상에 따르면, 마이크로프로세서의 기능 유닛을 동작시키기 위한 방법이 제공된다. 연산 코드 및 하나 이상의 피연산자가 수신되고, 연산 코드는 하나 이상의 피연산자에 대해 수행될 다수의 지원 연산 중 하나를 지정한다. 연산 코드 및 하나 이상의 피연산자에 응답하여, 기능 유닛 내의 승산 파이프라인은 제1 중간 결과를 생성하도록 동작하고, 기능 유닛 내의 테스트 파이프라인은 제2 중간 결과를 생성하도록 동작한다. 기능 유닛 내의 가산 파이프라인은 제1 및 제2 중간 결과를 더하여 연산 결과를 생성하도록 동작한다. 기능 유닛의 출력부는 연산 결과로부터 최종 결과를 계산하도록 동작한다. 지원 연산들은 제1, 제2 및 제3 피연산자들에 대해 연산하는 승산-가산(MAD) 연산 및 제1, 제2 및 제3 피연산자들 중 적어도 하나에 대해 연산하는 논리 테스트 연산을 포함한다.
본 발명의 또 다른 양상에 따르면, 프로세서용의 다목적 기능 유닛은 입력부, 승산 파이프라인, 가산 파이프라인, 지수 파이프라인 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자들, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 지수 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 지수 계산을 수행하고, 지수 계산의 결과를 지수 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과 및 지수 결과를 수신하도록 결합되고, 제어 신호에 응답하여 연산 코드에 의해 지정된 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다. 지원 연산들은 제1, 제2 및 제3 피연산자들에 대해 연산하는 승산-가산(MAD) 연산 및 제1 피연산자를 입력 포맷에서 타겟 포맷으로 변환하는 포맷 변환 연산을 포함한다.
정수 및 부동 소수점 연산들의 다양한 조합이 지원될 수 있다. 예를 들어, 일 실시예에서, 정수 MAD 연산이 지원되고, 입력 포맷 및 타겟 포맷 중 적어도 하 나가 정수 포맷인 포맷 변환 연산도 지원된다. 다른 실시예에서, 부동 소수점 MAD 연산이 지원되고, 입력 포맷 및 타겟 포맷 중 적어도 하나가 부동 소수점 포맷인 포맷 변환 연산도 지원된다. 또 다른 실시예에서, MAD 연산은 부동 소수점 MAD 연산 또는 정수 MAD 연산 중 어느 하나로 선택 가능하다.
본 발명의 또 다른 양상에 따르면, 마이크로프로세서는 프로그램 연산을 실행하도록 구성된 기능 유닛들을 구비한 실행 코어를 포함한다. 기능 유닛들 중 적어도 하나는 적어도, 제1, 제2 및 제3 피연산자들에 대해 연산하는 승산-가산(MAD) 연산, 및 제1 피연산자를 입력 포맷에서 타겟 포맷으로 변환하는 포맷 변환 연산을 포함하는 다수의 지원 연산을 실행할 수 있는 다목적 기능 유닛이다. 다목적 기능유닛은 입력부, 승산 파이프라인, 가산 파이프라인, 지수 파이프라인 및 출력부를 포함한다. 입력부는 제1, 제2 및 제3 피연산자들, 및 수행될 다수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 연산 코드에 응답하여 제어 신호를 생성하도록 더 구성된다. 승산 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1 및 제2 피연산자들의 곱을 계산하고, 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있다. 가산 파이프라인은 승산 파이프라인 및 테스트 파이프라인에 결합되고, 제어 신호에 응답하여 제1 및 제2 중간 결과들의 합을 계산하고, 계산된 합을 연산 결과로서 선택하도록 구성될 수 있다. 지수 파이프라인은 입력부에 결합되고, 제어 신호에 응답하여 제1, 제2 및 제3 피연산자들 중 하나 이상의 지수 연산을 수행하고, 지수 연산의 결과를 지수 결과로서 선택하도록 구성될 수 있다. 출력부는 연산 결과 및 지수 결과를 수신하도록 결합되고, 제어 신호 에 응답하여 연산 코드에 의해 지정된 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있다.
본 발명의 또 다른 양상에 있어서, 마이크로프로세서의 기능 유닛을 동작시키기 위한 방법이 제공된다. 연산 코드 및 하나 이상의 피연산자가 수신되고, 연산 코드는 하나 이상의 피연산자에 대해 수행할 복수의 지원 연산 중 하나를 지정한다. 연산 코드 및 하나 이상의 피연산자에 응답하여, 기능 유닛 내의 승산 파이프라인은 제1 중간 결과를 생성하도록 동작하고, 기능 유닛 내의 테스트 파이프라인은 제2 중간 결과를 생성하도록 동작한다. 기능 유닛 내의 지수 파이프라인은 지수 결과 및 정렬 제어 신호를 생성하도록 동작한다. 기능 유닛 내의 가산 파이프라인은 정렬 제어 신호에 응답하여 제1 및 제2 중간 결과들을 더하여 연산 결과를 생성하도록 동작한다. 지원 연산들은 적어도, 제1, 제2 및 제3 피연산자들에 대해 연산하는 승산-가산(MAD) 연산 및 제1 피연산자를 입력 포맷에서 타겟 포맷으로 변환하는 포맷 변환 연산을 포함한다.
아래의 상세한 설명은 첨부 도면들과 함께 본 발명의 특성 및 이점에 대한 보다 나은 이해를 제공할 것이다.
도 1은 본 발명의 일 실시예에 따른 컴퓨터 시스템의 블록도.
도 2는 본 발명의 일 실시예에 따른 실행 코어의 일부의 블록도.
도 3은 본 발명의 일 실시예에 따른 다목적 승산-가산(MMAD) 유닛에서 수행될 수 있는 연산들의 리스트를 나타내는 도면.
도 4는 본 발명의 일 실시예에 따른 MMAD 유닛의 블록도.
도 5는 도 4의 MMAD 유닛에 대한 피연산자 포맷팅 블록의 블록도.
도 6A는 도 4의 MMAD 유닛의 전치 승산기 블록의 블록도.
도 6B는 도 4의 MMAD 유닛에 대한 지수곱 블록의 블록도.
도 6C는 도 4의 MMAD 유닛에 대한 비트 논리 블록의 블록도.
도 7A는 도 4의 MMAD 유닛에 대한 승산기 블록의 블록도.
도 7B는 도 4의 MMAD 유닛에 대한 지수합 블록의 블록도.
도 8A는 도 4의 MMAD 유닛에 대한 후치 승산기 블록의 블록도.
도 8B는 도 4의 MMAD 유닛에 대한 비교 논리 블록의 블록도.
도 9는 도 4의 MMAD 유닛에 대한 정렬 블록의 블록도.
도 10은 도 4의 MMAD 유닛에 대한 소수합 블록의 블록도.
도 11은 도 4의 MMAD 유닛에 대한 정규화 블록의 블록도.
도 12는 도 4의 MMAD 유닛에 대한 출력 제어 블록의 블록도.
본 발명의 실시예들은 그래픽 프로세서와 같이 많은 수의 고속 연산을 수행할 수 있는 임의의 처리 시스템을 위한 고속 다목적 기능 유닛을 제공한다. 일 실시예에서, 기능 유닛은 승산기 트리 및 가산기 회로를 포함하는 파이프라인을 통해 정수 또는 부동 소수점 포맷으로 입력된 피연산자들 A, B 및 C에 대해 A*B+C를 계산하는 3 변수 승산-가산("MAD") 연산을 지원한다. MAD 파이프라인의 하드웨어를 이용하여, 기능 유닛은 다른 정수 및 부동 소수점 산술 연산도 지원한다. 기능 유닛은 단지 소량의 추가 회로를 이용하여 다양한 비교, 포맷 변환 및 비트 연산을 지원하도록 더 확장될 수 있다.
Ⅰ. 시스템 개요
A. 그래픽 프로세서
도 1은 본 발명의 일 실시예에 따른 컴퓨터 시스템(100)의 블록도이다. 컴퓨터 시스템(100)은 버스(106)를 통해 통신하는 중앙 처리 유닛(102) 및 시스템 메모리(104)를 포함한다. 사용자 입력은 버스(106)에 결합된 하나 이상의 입력 장치(108)(예를 들어, 키보드, 마우스)로부터 수신된다. 비주얼 출력은 시스템 버스(106)에 결합된 그래픽 처리 서브시스템(112)의 제어하에 동작하는 픽셀 기반 디스플레이 장치(110)(예를 들어, 통상의 CRT 또는 LCD 기반 모니터) 상에 제공된다. 시스템 디스크(128), 및 하나 이상의 착탈식 저장 장치(129)(예를 들어, 플로피 디스크 드라이브, 컴팩트 디스크(CD) 드라이브, 및/또는 DVD 드라이브)와 같은 다른 컴포넌트들도 시스템 버스(106)에 결합될 수 있다. 시스템 버스(106)는 PCI(Peripheral Component Interconnect), AGP(Advanced Graphics Processing) 및/또는 PCI 익스프레스(PCI-E)를 포함하는 다양한 버스 프로토콜 중 하나 이상을 이용하여 구현될 수 있으며, 노스 브리지 및 사우스 브리지(도시되지 않음)와 같은 적절한 "브리지" 칩들이 다양한 컴포넌트 및/또는 버스를 상호접속하기 위해 제공될 수 있다.
그래픽 처리 서브시스템(112)은 그래픽 처리 유닛(GPU; 114) 및 그래픽 메모리(116)를 포함하는데, 이들은 예를 들어 프로그래머블 프로세서, ASIC(application specific intergrated circuit), 및 메모리 장치와 같은 하나 이상의 집적 회로 장치를 이용하여 구현될 수 있다. GPU(114)는 렌더링 모듈(120), 메모리 인터페이스 모듈(122), 및 스캔아웃 모듈(124)을 포함한다. 렌더링 모듈(120)은 시스템 버스(106)를 통해 제공되는 그래픽 데이터로부터 픽셀 데이터를 생성하고(예를 들어, 다양한 2D 및/또는 3D 렌더링 알고리즘을 구현), 픽셀 데이터를 저장하고 갱신하기 위해 그래픽 메모리(116)와 상호작용하는 등과 관련된 다양한 태스크를 수행하도록 구성될 수 있다. 렌더링 모듈(120)은 유리하게도 CPU(102) 상에서 실행되는 다양한 프로그램에 의해 제공되는 2D 또는 3D 장면 데이터로부터 픽셀 데이터를 생성하도록 구성된다. 렌더링 모듈(120)의 특정 구성은 필요에 따라 변할 수 있으며, 본 발명의 이해에 중요하지 않으므로 상세한 설명은 생략된다.
렌더링 모듈(120) 및 스캔아웃 모듈(124)과 통신하는 메모리 인터페이스 모듈(122)은 그래픽 메모리(116)와의 모든 상호작용을 관리한다. 메모리 인터페이스 모듈(122)은 또한 시스템 메모리(106)로부터 수신된 픽셀 데이터를 렌더링 모듈(120)에 의한 처리 없이 그래픽 메모리(116)에 기입하기 위한 경로들을 포함할 수 있다. 메모리 인터페이스 모듈(122)의 특정 구성은 필요에 따라 변할 수 있으며, 본 발명의 이해에 중요하지 않으므로 상세한 설명은 생략된다.
일반적으로 통상의 설계를 가진 하나 이상의 집적 회로 메모리 장치를 이용하여 구현될 수 있는 그래픽 메모리(116)는 픽셀 버퍼(126)와 같은 다양한 물리적 또는 논리적 구획을 포함할 수 있다. 픽셀 버퍼(126)는 스캔아웃 제어 논리(124)에 의해 판독되고 처리되어 표시를 위해 디스플레이 장치(110)로 전송되는 화상(또는 화상의 일부)에 대한 픽셀 데이터를 저장한다. 이 픽셀 데이터는 예를 들어 시스템 버스(106)를 통해 GPU(114)의 렌더링 모듈(120)로 제공되거나 CPU(102) 상에서 실행되는 다양한 프로세스에 의해 생성되고 시스템 버스(106)를 통해 픽셀 버퍼(126)로 제공되는 2D 또는 3D 장면 데이터로부터 생성될 수 있다.
GPU(114)와 함께 단일 칩에 집적되거나 개별 칩에 구현될 수 있는 스캔아웃 모듈(124)은 픽셀 버퍼(118)로부터 픽셀 칼라 데이터를 판독하여 이 데이터를 표시될 디스플레이 장치(110)로 전송한다. 일 실시예에서, 스캔아웃 모듈(124)은 GPU(114)에서 또는 시스템(100) 내의 그 밖의 장소에서 발생할 수 있는 임의의 다른 액티비티에 관계없이 소정의 리프레시 속도(예를 들어, 80 Hz)로 픽셀 데이터의 프레임들을 동시에 스캐닝 아웃하도록 동작한다. 몇몇 실시예에서, 소정의 리프레시 속도는 사용자 선택 가능 파라미터일 수 있으며, 스캔아웃 순서는 표시 포맷(예를 들어, 인터레이스 또는 진행 스캔)에 적절하게 변할 수 있다. 스캔아웃 모듈(124)은 또한 특정 디스플레이 하드웨어에 대한 칼라 값의 조정 및/또는 픽셀 버퍼(126)로부터의 픽셀 데이터를, 예를 들어 그래픽 메모리(116), 시스템 메모리(104) 또는 다른 데이터 소스(도시되지 않음)로부터 얻을 수 있는 비디오 또는 커서 오버레이 화상과 조합함으로써 합성 스크린 화상을 생성하는 등과 같은 다른 동작들을 수행할 수 있다. 스캔아웃 모듈(124)의 특정 구성은 필요에 따라 변할 수 있으며, 본 발명의 이해에 중요하지 않으므로 상세한 설명은 생략된다.
시스템(100)의 동작 동안, CPU(102)는 운영 체제 프로그램, 애플리케이션 프로그램, 및 그래픽 처리 서브시스템(112)을 위한 드라이버 프로그램과 같은 다양한 프로그램을 실행한다. 드라이버 프로그램은 애플리케이션 및 운영 체제 프로그램들이 이 분야에 공지된 그래픽 처리 서브시스템(112)의 다양한 기능을 호출할 수 있게 하는 OpenGL, 마이크로소프트 DirectX 또는 D3D와 같은 통상의 애플리케이션 프로그램 인터페이스(API)를 구현할 수 있다. 그래픽 처리 서브시스템(112)의 동작은 적절한 커맨드 버퍼들의 이용을 통해 다른 시스템 동작들과 비동기될 수 있다.
본 명세서에 기술되는 시스템은 예시적이며, 변형 및 수정이 가능하다는 것을 이해할 것이다. GPU는 예를 들어 하나 이상의 집적 회로 장치와 같은 임의의 적절한 기술을 이용하여 구현될 수 있다. GPU는 하나 이상의 프로세서를 포함할 수 있는 확장 카드 상에 장착되거나, 시스템 마더보드 상에 직접 장착되거나, 시스템 칩셋 컴포넌트(예를 들어, 일반적으로 사용되는 하나의 PC 시스템 아키텍처의 노스 브리지 칩) 내에 집적될 수 있다. 그래픽 처리 서브시스템은 임의 양의 전용 그래픽 메모리를 포함할 수 있으며(몇몇 구현은 전용 그래픽 메모리를 갖지 않을 수도 있다), 시스템 메모리 및 전용 그래픽 메모리를 임의로 조합하여 사용할 수 있다. 구체적으로, 픽셀 버퍼는 필요에 따라 전용 그래픽 메모리 또는 시스템 메모리 내에 구현될 수 있다. 스캔아웃 회로는 GPU와 함께 집적되거나, 개별 칩 상에 제공될 수 있으며, 예를 들어 하나 이상의 ASIC, 프로그래머블 프로세서 소자들, 다른 집적 회로 기술 또는 이들의 임의의 조합을 이용하여 구현될 수 있다. 또한, 본 발명을 구현하는 GPU는 범용 컴퓨터 시스템, 비디오 게임 콘솔 및 다른 특수 목적의 컴퓨터 시스템, DVD 플레이어, 이동 전화 또는 개인 휴대 단말기와 같은 핸드헬드 장치 등을 포함하는 다양한 장치 내에 포함될 수 있다.
B. 실행 코어
도 2는 본 발명의 일 실시예에 따른 실행 코어(200)의 블록도이다. 예를 들어 전술한 GPU(114)의 렌더링 모듈(120)용의 프로그래머블 쉐이더 내에 구현될 수 있는 실행 코어(200)는 다양한 계산을 수행하기 위한 명령들의 임의의 시퀀스들을 실행하도록 구성된다. 실행 코어(200)는 페치 및 디스패치 유닛(202), 발행 유닛(204), 다목적 승산-가산(MMAD) 기능 유닛(220), 다수(M)의 다른 기능 유닛(FU; 222), 및 레지스터 파일(224)을 포함한다. 각각의 기능 유닛(220, 222)은 지정된 동작을 수행하도록 구성된다. MMAD 유닛(220)에 의해 수행되는 동작들은 후술한다. 다른 기능 유닛(222)은 일반적으로 통상의 설계를 가지며, 초월 함수 연산(예를 들어, 사인 및 코사인, 지수 및 대수 등), 교환, 텍스처 필터링, 메모리 액세스(예를 들어, 로딩 및 저장 동작), 정수 또는 부동 소수점 연산 등과 같은 다양한 동작을 지원할 수 있다.
실행 코어(200)의 동작 동안, 페치 및 디스패치 유닛(202)은 명령 저장소(도시되지 않음)로부터 명령들을 취득하여, 이들을 디코딩하고, 이들을 연관된 피연산자 참조 또는 피연산자 데이터를 갖는 연산 코드로서 발행 유닛(204)으로 급송한다. 각각의 명령에 대해, 발행 유닛(204)은 예를 들어 레지스터 파일(224)로부터 임의의 참조된 피연산자를 취득한다. 명령에 대한 모든 피연산자가 준비된 때, 발행 유닛(204)은 연산 코드 및 피연산자들을 MMAD 유닛(220) 또는 다른 기능 유닛(222)으로 전송함으로써 명령을 발행한다. 발행 유닛(204)은 유리하게도 연산 코드를 이용하여 주어진 명령을 실행할 적절한 기능 유닛을 선택한다. 페치 및 디스패치 회로(202) 및 발행 유닛(204)은 통상의 마이크로프로세서 아키텍처 및 기술을 이용하여 구현될 수 있으며, 본 발명의 이해에 중요하지 않으므로 상세한 설명은 생략된다.
MMAD 유닛(220) 및 다른 기능 유닛들(222)은 연산 코드 및 관련 피연산자들을 수신하여, 피연산자들에 대해 지정된 연산을 수행한다. 결과 데이터는 결과 값(OUT) 및 그 값이 양인지 음인지 또는 특수 값(후술함)인지와 같은 결과 값(OUT)에 대한 일반 정보를 제공하는 조건 코드(COND)의 형태로 제공된다. 몇몇 실시예에서, 조건 코드(COND)는 기능 유닛의 동작 동안 에러 또는 예외가 발생하였는지를 나타낼 수도 있다. 결과 데이터는 데이터 전달 경로(226)를 통해 레지스터 파일(224)(또는 다른 목적지)로 전달된다.
도 2의 실행 코어는 예시적이며, 변형 및 수정이 가능하다는 것을 이해할 것이다. 페치 및 디스패치 유닛(202) 및 발행 유닛(204)은 필요에 따라 질서 또는 무순서 명령 발행, 추측 실행 모드 등을 갖는 스칼라 또는 수퍼스칼라 아키텍처를 포함하는 임의의 원하는 마이크로아키텍처를 구현할 수 있다. 몇몇 아키텍처에서, 발행자는 다수의 기능 유닛에 대한 연산 코드 및/또는 피연산자를 포함하는 긴 명령 워드를 발행할 수 있다. 실행 코어는 또한 한 스테이지에서의 기능 유닛들로부터의 결과들이 레지스터 파일로 직접이 아니라 나중 스테이지에서의 기능 유닛들로 전송되는 파이프라인화된 기능 유닛들의 시퀀스를 포함할 수 있으며, 기능 유닛들은 하나의 긴 명령 워드 또는 개별 명령들에 의해 제어될 수 있다. 본 가르침에 접근하는 이 분야에 통상의 지식을 가진 사람들은 MMAD 유닛(220)이 그래픽 프로세서 또는 임의의 특정 프로세서 또는 실행 코어 아키텍처로 한정되지 않는 임의의 마이크로프로세서 내의 기능 유닛으로서 구현될 수 있다는 것을 이해할 것이다.
C. MMAD 유닛
본 발명의 일 실시예에 따르면, 실행 코어(200)는 최대 3개의 피연산자(본 명세서에서 A, B 및 C로 표시됨)에 대한 다양한 정수 및 부동 소수점 연산을 지원하는 MMAD 유닛(220)을 포함한다. 일 실시예에서, MMAD 유닛(220)은 정수 또는 부동 소수점 피연산자들에 대한 A*B+C를 계산하기 위한 승산-가산(MAD) 파이프라인을 구현하며, 이 파이프라인 내의 다양한 회로는 다양한 다른 정수 및 부동 소수점 연산을 수행하기 위해 이용된다. MMAD 유닛(220)의 연산은 전술한 바와 같이 MMAD 유닛에 피연산자 및 연산 코드를 제공하는 발행 유닛(204)에 의해 제어된다. 발행 유닛(204)에 의해 각각의 피연산자 세트와 함께 제공되는 연산 코드들은 MMAD 유닛(220)의 거동을 제어하여, 선택적으로 그의 연산들 중 하나가 해당 피연산자 세트에 대해 수행될 수 있게 한다.
MMAD 유닛(220)은 유리하게도 정수 및 부동 소수점 포맷 양자를 포함하는 다양한 포맷으로 피연산자들을 처리하도록 설계된다. 본 명세서에서 설명되는 실시예들에서, MMAD 유닛(220)은 2개의 부동 소수점 포맷(본 명세서에서 fp32 및 fp16으로 지칭) 및 6개의 정수 포맷(본 명세서에서 u8, u16, u32, s8, s16, s32로 지칭)을 처리한다. 이제, 이들 포맷이 설명된다.
"fp32"는 정규 부동 소수점 수가 하나의 부호 비트, 8개의 지수 비트 및 23개의 유효수 비트로 표현되는 표준 IEEE 754 단일 정밀도 부동 소수점 포맷을 지칭한다. 지수는 127만큼 상향으로 바이어스되어, 2-126 내지 2127 범위의 지수들이 1 내지 254의 정수를 이용하여 표현된다. "정규" 수들에 대해, 23개의 유효수 비트는 정수부로서 함의된 1을 갖는 24 비트 가수의 소수부로서 해석된다. 지수 비트가 모두 0인 수들은 디놈(denorm)으로 지칭되며, 가수 내에 함의된 선두 1을 갖지 않는 것으로 해석되며, 이러한 수들은 예를 들어 연산에서의 언더플로우를 표현할 수 있다. 지수 비트가 모두 1이고 유효수 비트가 모두 0인 (양 또는 음)수는 (양 또는 음)INF로 지칭되는데, 이러한 수는 예를 들어 연산에서의 오버플로우를 표현할 수 있다. 지수 비트가 모두 1이고 유효수 비트들이 0이 아닌 수인 수들은 수가 아님(Not a Number; NaN)으로 지칭되며, 예를 들어 정의되지 않은 값을 표현하는데 사용될 수 있다. 0은 또한 특수한 수로 간주되며, 지수 및 유효수 비트들 모두가 0으로 설정된 것으로서 표현된다.
"fp16"은 그래픽 처리에 종종 사용되는 반 정밀도 포맷을 지칭한다. fp 16 포맷은 5개의 지수 비트 및 10개의 유효수 비트를 갖는 점을 제외하고는 fp32와 유사하다. 지수는 15만큼 상향으로 바이어스되고, 정규 수들에 대한 유효수는 정수부로서 함의된 1을 갖는 11 비트 가수의 소수부로서 해석된다. 디놈, INF, NaN 및 0을 포함하는 특수한 수들은 fp32와 유사하게 정의된다.
정수 포맷들은 본 명세서에서 포맷이 부호를 갖는지의 여부를 나타내는 머리 글자 "s" 또는 "u" 및 비트들의 총 수(예를 들어, 8, 16, 32)를 나타내는 수에 의해 지정되며, 따라서 s32는 부호가 가진 32 비트 정수, u8은 부호가 없는 8 비트 정수 등을 지칭된다. 부호가 있는 포맷에 대해서는 유리하게도 2의 보수 부정이 사용된다. 따라서, u8에 대한 범위는 [0, 15]인 반면, s8에 대한 범위는 [-8, 7]이다. 본 명세서에 사용되는 모든 포맷에서, 최상위 비트(MSB)는 비트 필드의 좌측에 있고, 최하위 비트(LSB)는 우측에 있다.
본 명세서에서는 설명의 목적으로 특정 포맷들이 정의되고 언급되며, MMAD 유닛은 이들 포맷 및 다른 포맷들의 임의의 조합을 지원할 수 있다는 것을 이해해야 한다.
상이한 피연산자 포맷들을 처리하는 것 외에도, MMAD 유닛(220)은 다수의 상이한 연산을 지원하도록 이롭게 구성된다. 예를 들어, 도 3은 본 명세서에 설명되는 MMAD 유닛(220)의 일 실시예에 의해 수행될 수 있는 연산 타입들의 리스트이다. 부동 소수점 산술 연산들(302)은 fp32 또는 fp16 포맷의 피연산자들 상에 수행될 수 있으며, 결과는 입력 포맷으로 반환된다. 몇몇 실시예에서, 부동 소수점 연산은 단 하나의 포맷, 예를 들어 fp32에서 지원된다. 가산(FADD), 승산(FMUL) 및 승산-가산(FMAD) 연산들과 함께, 다양한 피연산자 비교 연산이 지원된다. 이들은 C가 0 이상인 경우에는 A를, 그렇지 않은 경우에는 B를 선택하는 3 변수 조건부 선택 연산(FCMP)은 물론, 피연산자들 A 및 B 중 큰 쪽을 반환하는 최대치 연산(FMAX) 및 둘 중의 작은 쪽을 반환하는 최소치 연산(FMIN)을 포함한다. 이진 테스트 연산(FSET)은 피연산자들 A 및 B에 대해 다수의 이진 관계 테스트 중 하나를 수행하고, 테스트가 만족되었는지를 나타내는 부울 값을 반환한다. 이 실시예에서, 테스트될 수 있는 이진 관계는 초과(A>B), 미만(A<B), 등가(A=B) 및 무순서(A?B, 이것은 A 또는 B가 NaN인 경우에 참이다)는 물론 부정(예를 들어, A≠B) 및 다양한 조합 테스트(예를 들어, A≥B, A<>B, A?=B 등)를 포함한다.
정수 산술 연산(304)은 임의의 정수 포맷의 피연산자들에 대해 수행될 수 있으며, 결과는 입력 포맷으로 반환된다. 지원되는 정수 산술 연산들은 가산(IADD), 승산(IMUL), 승산-가산(IMAD), 조건부 선택(ICMP), 최대치(IMAX), 최소치(IMIN), 및 이진 테스트(ISET)를 포함하며, 이들 모두는 이들의 부동 소수점 대응물과 유사하게 정의된다. 또한, |A-B|+C를 계산하는 절대차 합(ISAD) 연산이 지원된다.
비트 연산(306)은 피연산자들을 32 비트 필드로서 처리한다. 논리 연산(LOP)은 이진 부울 연산들 AND(A&B), OR(A|B) 및 XOR(A^B)을 포함한다. LOP의 결과는 피연산자들 A 및 B의 대응 비트들에 대해 연산을 수행한 결과를 나타내는 32 비트 필드이다. 좌측 시프트(SHL) 및 우측 시프트(SHR) 연산도 지원되며, 피연산자 A는 시프트될 비트 필드를 제공하는데 사용되며, 피연산자 B는 시프트 양을 지정하는데 사용된다. 우측 시프트는 논리적이거나(0이 새로운 MSB 위치들에 삽입됨), 산술적(부호 비트가 새로운 MSB 위치들로 확장됨)일 수 있다.
포맷 변환 연산(308)은 피연산자 A를 하나의 포맷에서 다른 포맷으로 변환한다. "F2F"는 일반적으로 하나의 부동 소수점에서 다른 부동 소수점으로의 변환을 지칭한다. 몇몇 실시예에서, 이들 변환은 정수 N에 대해 2N 에 의해 피연산자를 스케일링하는 것을 포함한다. 또한, 정수 라운딩을 구비한 F2F 변환도 지원된다. "F2I"는 부동 소수점 포맷에서 정수 포맷으로의 변환을 지칭한다. F2F 변환에서와 같이, 피연산자는 2N 에 의해 스케일링된다. "I2F"는 일반적으로 정수 대 부동 소수점 변환을 지칭하는데, 이러한 연산은 부정 또는 절대값 연산은 물론, 2N 스케일링과 조합될 수 있다. "I2I"는 하나의 정수 포맷에서 다른 정수 포맷으로의 변환을 지칭하는데, 이러한 변환은 절대값 또는 부정 연산과 조합될 수도 있다. "FRC"는 부동 소수점 입력 피연산자의 소수부를 반환하는 "소수" 연산이다.
범위 감소 연산(RRO)으로도 지칭되는 fp32 독립 변수 감소 연산(310)은 초월 함수가 적절히 구성된 기능 유닛(예를 들어, 도 2의 기능 유닛들(222) 중 하나일 수 있다)에 의해 계산될 수 있도록 초월 함수(예를 들어, sin(x), cos(x) 또는 2x)의 독립 변수 x를 편리한 수치 구간으로 제한하는데 사용된다. 이 실시예에서, 초월 함수 명령이 기능 유닛으로 발행되기 전에, 그의 독립 변수가 피연산자 A로서 MMAD 유닛(220)에 제공된다. 사인 및 코사인 함수에 대해, 피연산자 A는 구간 [0,2π]로 맵핑되며, 지수 함수(EX2로도 표시됨)에 대해 피연산자 A는 수 N+f로서 표현되는데, 여기서 N은 정수이고, f는 구간 [0,1] 내에 있다. 이 분야에 공지된 바와 같이, 이러한 독립 변수 감소는 가능한 독립 변수들의 세트를 경계 범위로 제한함으로써 초월 함수들에 대한 기능 유닛들의 설계를 단순화할 수 있다.
Ⅱ장 및 Ⅲ장은 도 3에 도시된 연산들 모두를 수행할 수 있는 MMAD 유닛(220)을 설명한다. Ⅱ장은 MMAD 유닛(220)에 대한 회로 구조를 설명하고, Ⅲ장은 이러한 회로 구조가 도 3에 열거된 연산들을 실행하는데 이용될 수 있는 방법을 설명한다. 본 명세서에 기술되는 MMAD 유닛(220)은 예시적이며, 기능들의 다른 또는 상이한 조합들이 적절한 회로 블록들의 조합을 이용하여 지원될 수 있다는 것을 이해해야 한다.
Ⅱ. MMAD 유닛 구조의 예
도 4는 도 3에 도시된 모든 연산을 지원하는 본 발명의 일 실시예에 따른 MMAD 유닛(220)의 간단한 블록도이다. 이 실시예에서, MMAD 유닛(220)은 모든 연산에 사용되는 8 스테이지 파이프라인을 구현한다. 각각의 프로세서 사이클 상에서, MMAD 유닛(220)은 피연산자 입력 경로들(402, 404, 406)을 통해 3개의 새로운 피연산자(A0, B0, C0)를, 연산 코드 경로(408)를 통해 수행할 연산을 지정하는 연산 코드를 (예를 들어, 도 2의 발행 회로(204)로부터) 수신할 수 있다. 이 실시예에서, 연산은 도 3에 도시된 임의의 연산일 수 있다. 연산에 더하여, 연산 코드는 유리하게도 피연산자들에 대한 입력 포맷(그리고 또한 결과에 대해 사용할 출력 포맷, 이는 입력 포맷과 같거나 같지 않을 수 있다)을 나타낸다. 도 3에 도시된 연산은 그와 연관된 다수의 연산 코드를 가질 수 있다는 점에 유의해야 하는데, 예를 들어 fp32 피연산자들을 가진 FMUL에 대해 하나의 연산 코드가 존재할 수 있고, fp16 피연산자들을 가진 FMUL에 대해 상이한 연산 코드가 존재할 수 있는 등이다.
MMAD 유닛(220)은 파이프라인 스테이지들 0-7 모두를 통해 각각의 연산을 처리하고, 신호 경로(410) 상의 32 비트 결과 값(OUT) 및 신호 경로(412) 상의 대응 조건 코드(COND)를 생성한다. 이들 신호는 예를 들어 아키텍처에 따라 도 2에 도시된 바와 같이 레지스터 파일(224)로, 또는 프로세서 코어의 다른 요소들로 전송될 수 있다. 일 실시예에서, 각각의 스테이지는 프로세서 사이클에 대응하며, 다른 실시예에서 하나의 스테이지에 도시된 요소들은 다수의 프로세서 사이클에 분산되거나, 2개(또는 그 이상)의 스테이지로부터의 요소들은 하나의 프로세서 사이클로 조합될 수 있다. 일 구현은 1.5 GHz에서의 10 스테이지(사이클)이었다.
Ⅱ장의 A는 MMAD 파이프라인의 개요를 제공하며, Ⅱ장의 B-I은 각 스테이지의 회로 블록들을 상세히 설명한다.
A. MMAD 파이프라인
파이프라인의 초기의 이해는 스테이지들 0-2의 회로 블록들이 FMAD 연산 동안 사용되는 방법을 참조하여 이루어질 수 있다. 스테이지 0은 일관된 방식으로 피연산자들(32 비트 미만을 가질 수 있다)을 정렬하고 표현하기 위하여 발행 유닛(204) 또는 MMAD 유닛(220)에서 옵션으로 구현될 수 있는 피연산자 포맷팅 스테이지이다. 스테이지들 1-3은 FMAD 연산의 승산(A*B=P) 부분을 수행하며, 스테이지들 4-6은 가산(P+C) 부분을 수행한다. 스테이지 7에서, 최종 결과는 신호 경로들(410, 412) 상의 분배를 위해 포맷된다. 스테이지 7은 또한 후술하는 바와 같이 특수 수치 입력, 오버플로우, 언더플로우 또는 다른 조건의 경우에 특수 출력을 생성하기 위한 제어 논리를 포함한다.
본 설명을 용이하게 하기 위하여, MMAD 유닛(220)에 대한 3개의 주요 내부 데이터 경로가 도 4의 점선 경계들에 의해 표시되며, 본 명세서에서 "가수 경로"(413), "지수 경로"(415) 및 "테스트 경로"(417)로 지칭된다. 이들 명칭은 각각의 경로 상에 도시된 다양한 회로 블록에 의해 소정 연산(예를 들어, MMAD 또는 비교) 동안 수행되는 기능들을 제시하지만, 임의의 내부 데이터 경로(413, 415, 417)를 따르는 회로 블록들은 연산 종속 방식으로 다양한 사용을 위해 이용될 수 있다는 것은 명백할 것이다.
가수 경로(413)를 따라, 스테이지들 1-3은 부동 소수점 피연산자들 A 및 B의 가수들을 승산하는 회로 블록들을 포함한다. 스테이지 2의 승산기 블록(414)은 전치 승산기 블록(416) 및 후치 승산기 블록(418)에 의해 지원된다. 승산 결과는 스테이지 2의 끝에서 경로(421) 상에 결과 R3a로서 제공된다. 스테이지 4-6은 결과 R3a와, 경로(419) 상에 결과 R3b로서 테스트 경로(417)를 통해 제공되는 부동 소수점 피연산자 C의 가수를 정렬하고 더하는 정렬 블록(420) 및 소수합 블록(422)을 포함한다. 최종 가수는 정규화 블록(423)에서 정규화되어 스테이지 6의 출력에서 경로(425) 상에 결과 R6으로서 제공된다.
지수 경로(415)는 FMAD 연산을 지원하기 위하여 부동 소수점 피연산자들 A, B 및 C의 지수부들(Ea, Eb, Ec로 표시됨)에 대해 적절한 연산을 수행한다. 스테이지 1의 지수곱 블록(424)은 예를 들어 Ea 및 Eb를 더하고 바이어스(예를 들어, 127)를 뺌으로써 곱 A*B에 대한 지수를 계산하며, 스테이지 2의 지수합 블록(426)은 합 (A*B)+C에 대한 유효 최종 지수(EFE) 및 스테이지 4의 정렬 블록(420)의 연산을 제어하는데 사용되는 지수차(Ediff)를 결정한다. 스테이지 3의 Rshift 카운트 블록(428), 스테이지 4의 지수 증가 블록(430) 및 스테이지 6의 지수 감소 블록(432)을 포함하는 지수 경로(415)를 따르는 후속 회로 블록들은 가수 결과들의 특성에 기초하여 지수 EFE를 조정하여, 경로(427) 상에 최종 지수 E0를 제공한다.
테스트 경로(417)의 회로 블록들은 주로 FMAD가 아닌 연산들, 특히 정수 및 부동 소수점 비교 연산들에 대해 사용된다. 테스트 경로(417)는 스테이지 1의 비트 논리 블록(434) 및 스테이지 3의 비교 논리 블록(436)을 포함하는데, 이들 요소의 연산들은 후술한다. FMAD 연산 동안, 테스트 경로(417)는 스테이지 3의 출력에서 경로(419) 상에 피연산자 C의 가수를 전송한다.
주 데이터 경로들과 병렬로, MMAD 유닛(220)은 또한 경로(429) 상에 특수 수치 신호(SPC)를 생성하는 스테이지 1의 특수 수치 검출 회로(438)를 통해 특수 수치들(예를 들어, fp32 또는 fp16 피연산자들의 경우에 NaN, INF, 디놈 및 0)을 처리한다. 3개의 피연산자 A, B 및 C를 수신하는 특수 수치 검출 회로(438)는 일반적으로 통상의 설계를 가질 수 있으며, 특수 수치 신호(SPC)는 소정의 특수 수치 코드를 통해 각각의 피연산자의 특수 수치 상태를 지시하기 위해 피연산자당 여러(예를 들어, 3) 비트를 포함할 수 있다. 특수 수치 신호(SPC)는 적절한 때 특수 수치 신호(SPC)를 사용하여 파이프라인으로부터의 결과들(예를 들어, R6 및 E0)을 특수 값들로 오버라이드하는 스테이지 7의 출력 제어 블록(440)을 포함하는 다양한 하향 회로 블록에 제공될 수 있는데, 그 예는 후술된다.
파이프라인의 끝에서, 출력 제어 블록(420)은 신호 경로(410) 상에 결과 OUT를, 신호 경로(412) 상에 조건 코드 COND를 제공한다. 유리하게도 결과보다 적은 비트를 포함하는 조건 코드는 결과의 특징에 대한 일반 정보를 지닌다. 예를 들어, 조건 코드는 결과가 양, 음, 0, NaN, INF, 디놈 등인지를 나타내는 비트들을 포함할 수 있다. 이 분야에 공지된 바와 같이, 조건 코드가 결과와 함께 제공되는 경우, 그 결과의 후속 소비자는 때때로 그의 처리에 있어서 결과 자체가 아니라 조건 코드를 사용할 수 있다. 몇몇 실시예에서, 조건 코드는 연산의 실행 동안 예외 또는 다른 이벤트의 발생을 지시하기 위해 사용될 수 있다. 다른 실시예들에서, 조건 코드는 완전히 생략될 수 있다.
데이터 경로들에 더하여, MMAD 유닛(220)은 또한 도 4에서 스테이지 0의 제어 블록(442)으로 표시되는 제어 경로를 제공한다. 제어 블록(442)은 연산 코드를 수신하고, 파이프라인을 통해 데이터 전송과 동기하여 각 회로 블록으로 전송될 수 있는 본 명세서에서 일반적으로 "OPCTL"로 표시되는 다양한 연산 코드 종속 제어 신호를 생성한다. (OPCTL 신호들의 다양한 회로 블록들로의 접속은 도 4에 도시되어 있지 않다.) 후술하는 바와 같이, OPCTL 신호는 상이한 연산들이 동일 파이프라인 요소들을 이용하여 수행될 수 있도록 연산 코드에 응답하여 MMAD 유닛(220)의 다양한 회로 블록의 연산을 가능하게 하고, 불가능하게 하고, 다르게는 제어하는데 사용될 수 있다. 본 명세서에서 언급되는 다양한 OPCTL 신호는 연산 코드 자체, 또는 예를 들어 제어 블록(442)에서 구현되는 조합 논리에 의해 연산 코드로부터 도출되는 소정의 다른 신호를 포함할 수 있다. 몇몇 실시예에서, 제어 블록(442)은 여러 파이프라인 스테이지에서 다수의 회로 블록을 이용하여 구현될 수 있다. 주어진 연산 동안 상이한 블록들에 제공되는 OPCTL 신호는 동일 신호 또는 상이한 신호들일 수 있다는 것을 이해해야 한다. 본 공개본의 관점에서, 본 기술분야의 숙련자들은 적절한 OPCTL 신호를 구성할 수 있을 것이다.
주어진 스테이지의 회로 블록들은 상이한 양의 처리 시간을 필요로 하며, 특정 스테이지에 필요한 시간은 연산마다 다를 수 있다는 점에 유의해야 한다. 따라서, MMAD 유닛(220)은 또한 하나의 파이프라인 스테이지에서 다음 파이프라인 스테이지로의 상이한 경로들 상에서의 데이터의 전송을 제어하기 위한 다양한 타이밍 및 동기화 회로(도 4에 도시되지 않음)를 포함할 수 있다. 임의의 적절한 타이밍 회로(예를 들어, 래치, 전송 게이트 등)가 사용될 수 있다.
B. 스테이지 0의 요소들
이 실시예에서, 8 비트(16 비트) 정수 피연산자들이 32 비트 피연산자의 8(16)개의 LSB로서 MMAD 유닛(220)에 전달되며, fp16 피연산자들은 3개의 초과 비트(모두 0)가 5개의 지수 비트의 좌측에 삽입되고 13개의 초과 비트(모두 0)가 10개의 소수 비트의 우측에 삽입되는 "패딩된" 포맷으로 전달된다. 스테이지 0 동안, 포맷팅 블록(400)은 유리하게도 소정 연산들을 위해 수신된 피연산자들 상에 추가 포맷팅을 수행한다.
도 5는 포맷팅 블록(400)의 컴포넌트들을 나타내는 블록도이다. 각각의 수신된 피연산자들 A0, B0 및 C0는 다수의 경로를 병렬로 하향 통과하는데, 각각의 경로 상에서는 상이한 변환이 적용된다. 8비트 상향 컨버터들(504, 505, 506)은 최상위 비트(MSB)를 부호 확장함으로써 8비트 정수들을 32비트 정수들로 변환한다. 마찬가지로, 16비트 상향 컨버터들(508, 509, 510)은 부호 확장에 의해 16비트 정수들을 32비트 정수들로 변환한다. 피연산자 A에 대해, fp16 상향 컨버터 블록(512)은 지수 바이어스를 15에서 127로 조정함으로써 fp16 피연산자를 fp32로 승진시킨다.
선택 멀티플렉서들(mux)(514, 515, 516)은 피연산자 포맷(전술한 바와 같이 연산 코드에 의해 지정됨)에 대응하는 OPCTL 신호에 기초하여 각각의 피연산자에 대한 정확한 입력 포맷을 선택한다. mux들(514∼516) 이후에, 각각의 피연산자 경로는 또한 모든 비트를 플립함으로써 피연산자의 1의 보수를 생성하는데 사용될 수 있는 조건부 인버터 회로(518, 519, 520)를 포함한다. 조건부 인버터 회로(518∼520)는 OPCTL 신호 및 피연산자의 부호 비트에 의해 제어된다. 반전이 수행될 수 있는 특수한 경우들이 후술된다.
몇몇 실시예에서, fp16 및 fp32 피연산자들에 대해, 33비트 표현이 내부적으로 사용된다. 이 표현에서, fp32(fp16)에 대해 24(11)개의 가수 비트가 전송되도록 함축적인 선두 1이 유효수 비트들에 전치(prepend)된다. 다른 실시예들에서, 32개 미만의 비트를 가진 포맷의 정수 피연산자들이 32 비트 필드 내에 임의로 정렬될 수 있으며, 포맷팅 블록(400)은 이러한 피연산자들을 내부 32비트 데이터 경로의 LSB들로 시프트할 수 있다. 마찬가지로, fp16 피연산자들은 패딩없이 전달될 수 있으며, 포맷팅 블록(400)은 전술한 바와 같이 패딩을 삽입하거나 다른 정렬 연산을 수행할 수 있다.
C. 스테이지 1의 요소들
다시 도 4를 참조하면, 포맷팅 블록(400)은 피연산자들 A, B 및 C를 스테이지 1의 다양한 데이터 경로에 제공한다. 스테이지 1은 가수 경로(413) 내의 전치 승산기 블록(416), 지수 경로(415) 내의 지수곱 블록(424), 및 테스트 경로(417) 내의 비트 논리 블록(434)은 물론, 전술한 바와 같은 특수 수치 검출 블록(438)을 포함한다.
도 6A는 전치 승산기 블록(416)의 블록도이다. 전치 승산기 블록(416)은 부스 3 알고리즘을 이용한 승산을 위해 피승수(피연산자 A) 및 승수(피연산자 B)를 준비하며, 실제 승산은 스테이지 2의 승산기 블록(414)에서 구현된다. 정수 피연산자들 A 및 B의 경우, 전치 승산기 블록(416)은 전체 피연산자에 대해 연산하며, 부동 소수점 피연산자들의 경우, 전치 승산기 블록(416)은 함축적 또는 명시적 선두 "1"을 포함하는 가수부에 대해 연산한다. 따라서, 본 설명이 하나의 피연산자를 언급하는 경우, 전체 피연산자 또는 가수부만이 적절히 사용될 수 있다는 것을 이해해야 한다.
도 6A에 도시된 바와 같이, 전치 승산기 블록(416)은 "3X" 가산기(612), 부스3 인코더(614), 및 선택 승산기(mux)(616)를 포함한다. 일반적으로 통상의 설계를 가질 수 있는 3X 가산기(612)는 피연산자 A(피승수)를 수신하여, 승산기 블록(414)에 의한 사용을 위해 3A(예를 들어, A+2A에 의해)를 계산한다. 피연산자 A 및 계산된 3A는 스테이지 2로 전달된다. 일반적으로 통상의 설계를 가질 수 있는 부스3 인코더(614)는 피연산자 B(승수)를 수신하고, 통상의 부스3 인코딩을 수행하여, 피연산자 B의 비트들로부터 중복 4비트 세그먼트들을 생성한다. 다른 실시예들에서, 부스3와 다른 승산 알고리즘이 사용될 수 있으며, 임의의 적절한 전치 승산기 회로가 본 명세서에서 설명되는 특정 회로들을 대체할 수 있다.
선택 mux(616)는 피연산자 B, 피연산자 B의 부스3 인코딩된 버전, 및 레지스터들(618, 620)에 부스3 인코딩된 형태로 저장되는 상수 승수들(예를 들어, 1/2π 및 1.0) 중에서 선택하도록 OPCTL 신호에 의해 제어된다. 선택된 값은 스테이지 2에 결과 BB로서 제공된다. FMUL 또는 IMUL 연산에 대해, 피연산자 B의 부스3 인코딩된 버전이 선택된다. 다른 연산들 동안, 선택 mux(616)는 피연산자 B를 부스3 인코더(614)의 주위로 바이패스하도록(예를 들어, 후술하는 바와 같은 비교 연산을 위해), 또는 레지스터들(618, 620)로부터 상수 승수들 중 하나를 선택하도록(예를 들어, 후술하는 바와 같은 독립 변수 감소 또는 포맷 변환을 위해) 제어될 수 있다. 다른 실시예들에서, 상수 승수가 사용되는 연산들에 대해, 승수는 MMAD 유닛(220)의 입력에 피연산자 B0로서 제공될 수 있거나, 승수의 부스 인코딩되지 않은 표현이 전치 승산기 블록(416)의 입력에서 선택된 후 인코더(614)를 이용하여 부스 인코딩될 수 있다.
도 6B는 지수곱 블록(424)을 나타내는 블록도이다. 부동 소수점 산술 연산들에 대해, 지수곱 블록(424)은 피연산자들 A 및 B에 대한 지수 비트들(Ea, Eb)을 수신하고, 제1 가산기 회로(622)에서 이들을 더하여 곱 A*B에 대한 지수를 계산한다. 또한, 지수곱 블록(424)은 합 Ea+Eb에 바이어스 β(양, 음 또는 0일 수 있다)를 더하는 제2 가산기 회로(624)를 포함한다. 바이어스 레지스터(626)가 하나 이상의 후보 바이어스 값을 저장하며, OPCTL 신호가 연산 종속 방식으로 적절한 바이어스를 선택하는데 사용된다. 예를 들어, FMUL 연산 동안, 바이어스 β는 2개의 바이어스된 지수 Ea 및 Eb가 더해질 때 fp16 또는 fp32 지수 바이어스를 수정하는데 사용될 수 있다. 다른 연산 동안, 후술하는 바와 같이 다른 값들이 바이어스 β로 선택될 수 있다. 지수곱 블록(424)의 출력에서, 선택 mux(628)는 OPCTL 신호에 응답하여 합 및 2개의 입력 지수 중에서 선택한다. 결과 Eab는 경로(431) 상에서 스테이지 2로 전송된다.
결과 Eab는 유리하게도 입력 지수들 Ea, Eb보다 하나 더 많은 비트를 사용하여 표현되어, 지수 포화(오버플로우)가 하향 검출되는 것을 가능하게 한다. 예를 들어, 지수들 Ea 및 Eb가 각각 8비트인 경우, Eab는 9비트일 수 있다.
도 6C는 비트 논리 블록(434)을 나타내는 블록도이다. 피연산자들 A 및 B는 AND2 회로(630), OR2 회로(632) 및 XOR2 회로(634)에 제공된다. 일반적으로 통상의 설계를 가질 수 있는 이들 회로 각각은 피연산자들 A 및 B의 대응 비트들 상에 지정된 논리 연산을 수행하여, 32비트 후보 결과를 제공한다. 병행하여, 조건부 인버터(635)가 FRC 연산 동안 피연산자 C를 반전시키고, 다른 연산 동안 피연산자 C를 변경없이 전달하도록 동작한다. 선택 mux(636)는 OPCTL 신호에 응답하여 다양한 논리 연산의 결과들 중 하나 또는 피연산자 C(또는 그의 역)를 선택하며, 선택된 데이터(R1)는 경로(433) 상에 스테이지 2를 통해 전송된다. 선택 mux(636)에 대한 OPCTL 신호는 피연산자 C가 MAD, ADD 또는 CMP 연산에 대해 선택되고, 논리 연산 결과들 중 적절한 하나는 논리 연산에 대해 선택되고, XOR2 회로(634)로부터의 결과는 SET 연산을 위해 전송되도록 구성된다. 몇몇 연산에 대해, 결과 R1은 하향 컴포넌트들에서 사용되지 않으며, 이러한 예에서는 임의의 선택이 이루어질 수 있다.
스테이지 1은 또한 도 4에 도시된 바와 같이 "I2F 바이트" 회로(444)를 포함한다. I2F 포맷 변환 연산 동안 사용되는 이 회로는 피연산자 A의 8 MSB를 바이트 A로서 선택하여, 바이트 A를 경로(435)를 통해 스테이지 2로 전송한다. I2F 바이트 회로(444)는 또한 피연산자 A의 24 LSB 모두가 1인지를 판정하는 AND 트리(도시되지 않음)를 포함한다. 경로(437) 상의 AND 트리 출력 신호(And24)는 피연산자 A의 모든 24 LSB가 1인 경우에는 1로 설정되고 그렇지 않은 경우에는 0으로 설정되는 단일 비트일 수 있다.
D. 스테이지 2의 요소들
다시 도 4를 참조하면, 스테이지 2는 가수 경로(413) 상의 승산기 블록(414) 및 지수 경로(415) 상의 지수합 블록(426)을 포함한다. 테스트 경로(417) 상에서, 경로(433)는 데이터 R1을 추가 처리 없이 스테이지 3으로 전송한다.
도 7A는 승산기 트리(700)를 포함하는 승산기 블록(414)의 블록도이다. 승산기 트리(700)에서, 부스 멀티플렉서(704)가 스테이지 1로부터 피연산자 A, 계산된 결과 3A, 및 부스3 인코딩된 피연산자 BB를 수신하고, 부스 승산 알고리즘을 구현한다. 이 분야에 공지된 바와 같이, 부스 승산은 부스3 인코딩된 승수 BB 내의 각각의 비트 그룹에 대응하는 부분 곱(피승수 A의 배수)의 선택을 포함한다. 결과적인 부분 곱들은, 본 실시예에서 하나의 (4:2) 39비트 캐리-세이브 가산기(CSA)(710)를 공급하는 2개의 (3:2) CSA(708)를 공급하는 3개의 (3:2) CSA(706)로 이루어지는 CSA 트리를 이용하여 가산된다. 부스 멀티플렉서(704) 및 CSA들(706, 708, 710)은 일반적으로 통상의 설계를 가질 수 있다. 최종 출력은 중복(합, 캐리) 표현의 곱 A*B이다. 합 및 캐리 필드들은 유리하게도 피연산자들보다 넓다(예를 들어, 일 실시예에서 각각 48 비트). 부스 승산과 다른 알고리즘을 구현하는 회로를 포함하는 다른 승산기 회로들이 대체될 수 있다.
일 실시예에서, 승산기는 최대 24비트 X 24비트 승산을 지원한다. 보다 큰 피연산자들(예를 들어, 32비트 정수들)의 곱들은 이 분야에 공지된 바와 같이 다중 승산 연산(예를 들어, 다중 16비트 X 16비트 승산 연산)을 이용하여 합성될 수 있다. 다른 실시예들에서, 승산기는 상이한 크기를 가질 수 있으며, 예를 들어 최대 32비트 X 32비트 승산을 지원할 수 있다. 이러한 설계 선택은 본 발명에 중요하지 않으며, 칩 면적 및 성능과 같은 고려 사항에 기초할 수 있다.
승산기 블록(414)은 또한 피연산자들 A 및 B에 대한 바이패스 경로를 포함한다. 구체적으로, 선택 mux(711)는 승산기 트리(700)로부터 피연산자 A 및 합 필드를 수신하며, 다른 선택 mux(713)는 승산기 트리(410)로부터 피연산자 B 및 캐리 필드를 수신한다. mux들(711, 713)은 공통 OPCTL 신호에 의해 제어되어, 피연산자들(A, B) 또는 승산 결과(합, 캐리)가 결과들 R2a 및 R2b로서 선택되어 경로(715, 717) 상으로 전송되게 한다. 승산 또는 MAD 연산들에 대해, 합 및 캐리 결과들이 선택될 것이다. 다른 연산들, 예를 들어 ISAD 또는 최대치 또는 최소치 연산에 대해, 후술하는 바와 같이 피연산자들 A 및 B가 선택될 것이다. 결과 경로들(715, 717)은 유리하게도 정규 피연산자들보다 넓게 되며(예를 들어, 32비트와 달리 48비트), 따라서 피연산자들 A 및 B는 mux들(711, 713)에 의해 선택될 때 필요에 따라 선두 또는 후미 0들로 패딩될 수 있다는 점에 유의해야 한다.
도 7B는 차 회로(714), 선택 mux(716) 및 8비트 우선순위 인코더(718)를 포함하는 지수합 블록(702)의 블록도이다. 차 회로(714)는 경로(431) 상에서 곱 지수 Eab를, 경로(439) 상에서 피연산자 C의 지수부(Ec)를 수신하고, 그 차(Eab-Ec)를 계산한다. 부동 소수점 가산 또는 MAD 연산들 동안, 차 회로(714)는 경로(721) 상에서 차의 부호를 나타내는 신호(Sdiff)를 제공한다. 이 신호는 Eab 및 Ec 중 큰 쪽을 합 (A*B)+C에 대한 유효 최종 지수(EFE)로서 선택하도록 선택 mux(716)를 제어하는데 사용된다. 신호 EFE는 경로(723) 상에서 하향 전송된다. 양 또는 음일 수 있는 차(Ediff) 자체는 경로(725) 상에서 하향 컴포넌트들로 전송된다. 부동 소수점 가산 또는 MAD와 다른 연산들에 대해, 지수합 블록(702)은 다른 목적으로 이용될 수 있으며, 따라서 차 회로(714)는 후술하는 바와 같이 신호들 Sdiff 및 Ediff의 생성을 제어하는 OPCTL 신호를 수신한다.
우선순위 인코더(718)는 I2F 변환 연산들 동안 피연산자 A의 8 MSB 중에서 선두 1(존재할 경우)의 위치를 식별하는데 사용된다. MSB들(신호 바이트 A)은 경로(435)를 통해 우선순위 인코더(718)로 제공되며, 우선순위 인코더 출력 BP는 선두 1의 비트 위치로부터 도출되는 지수를 나타낸다(모든 8 MSB가 0인 경우, 출력 BP는 0일 수 있다). I2F 변환 연산 동안, 차 회로(714)는 또한 후술하는 바와 같이 출력 선택 동안 신호 And24를 사용한다.
E. 스테이지 3의 요소들
스테이지 3은 가수 경로(413) 상의 후치 승산기 블록(418), 지수 경로(415) 상의 Rshift 카운트 회로(428) 및 테스트 경로(417) 상의 비교 논리(436)를 포함한다.
도 8A는 중간 곱(IP) 가산기(804), 스티키 비트 논리(sticky bit logic; 808), 정수 mux(810), 입력 선택 mux(812), 및 출력 선택 mux(814)를 포함하는 후치 승산기 블록(418)의 블록도이다. OPCTL 신호에 응답하여, 입력 선택 mux(812)는 경로(717) 상의 결과 R2b(스테이지 2의 승산기 블록(414)으로부터)와 레지스터(816)에 저장된 상수 피연산자(값 1) 중에서 선택한다. 후술하는 바와 같이, mux(812)에 대한 OPCTL 신호는 피연산자 A의 2의 보수가 필요한 소정의 포맷 변환 연산들 동안에 상수 피연산자를 선택한다. 이 경우, 피연산자 A는 스테이지 0에서 반전되며, IP 가산기(804)를 이용하여 1이 더해진다. 다른 연산들에 대해, mux(812)는 결과 R2b를 선택할 수 있다.
IP 가산기(804)는 결과들 R2a 및 R2b(또는 R2a 및 상수 피연산자)를 더하여 합 RP를 생성한다. IP 가산기(804)는 또한 논리 블록(806)을 비교하기 위하여 경로(805)를 통해 합 RP의 2개의 MSB(RP2)를 제공한다. 승산 또는 MAD 연산의 경우, 합 RP는 곱 A*B이다. 다른 연산들에 대해, 합 RP는 A+B(예를 들어, 피연산자들 A 및 B가 승산기 트리(700) 주위로 바이패스되는 경우) 또는 ∼A+1(예를 들어, 피연산자 A가 스테이지 0에서 반전되고 승산기 트리(700) 주위로 바이패스되며, 상수 피연산자가 입력 mux(812)에 의해 선택되는 경우)을 나타낼 수 있다.
전술한 바와 같이, 결과들 R2a 및 R2b는 정규 피연산자들보다 넓을 수 있으며(예를 들어, 48비트), 따라서 IP 가산기(804)는 48비트 가산기로서 구현될 수 있으며, 경로 RP는 캐리들을 수용하도록 49비트 넓이를 가질 수 있다. 후치 승산기 블록(802)은 유리하게도 예를 들어 LSB들을 제거함으로써 합 RP를 정규 피연산자 폭(예를 들어, 32비트)을 가진 결과 R3a로 감소시킨다. 일반적으로 통상의 설계를 가질 수 있는 스티키 비트 논리(808)는 유리하게도 스티키 비트들 SB3(제거된 비트들의 일부 또는 모두)를 수집하고, 이들을 후술하는 바와 같이 라운딩을 위해 스티키 비트들을 사용할 수 있는 하향 컴포넌트들에 제공한다. 병행하여, 정수 mux(810)는 정수 피연산자들을 처리하는데, mux(810)는 OPCTL 신호에 응답하여 49비트 합 RP의 상위 32비트 또는 하위 32비트를 선택한다. 선택은 피연산자들 R2a 및 R2b가 넓은 경로들(715, 717) 상에 정렬되는 방법에 의존한다.
출력 mux(814)는 연산 및 피연산자 포맷에 의존하여 경로(421) 상에 R3a를 제공하는 OPCTL 신호에 응답하여 부동 소수점 경로 또는 정수 경로로부터 결과 R3a를 선택한다. 또한, 바이패스 경로(817)는 결과 R2a가 IP 가산기(804) 주위로 바이패스되고 출력 mux(814)에 의해 선택되는 것을 가능하게 하며, 따라서 R2a(피연산자 A일 수 있다)는 경로(421) 상에 결과 R3a로서 전송될 수 있다.
다시 도 4를 참조하면, Rshift 카운트 회로(428)는 OPCTL 신호에 응답한다. FMAD(또는 FADD) 연산 동안, Rshift 카운트 회로(428)는 경로(725) 상의 지수차 Ediff를 사용하여 부동 소수점 가산수들(예를 들어, A*B 및 C)에 대한 적절한 정렬을 결정한다. 구체적으로, 보다 작은 지수를 가진 가산수는 우측 시프트되어 보다 큰 지수를 이용하여 표현될 수 있다. 따라서, Rshift 카운트 회로(428)는 지수차 Ediff의 부호를 이용하여 A*B 또는 C가 보다 큰 지수를 갖는지를 판정하고, 후술하는 바와 같이 어느 가산수가 우측 시프트되는지를 제어하는 스왑 제어 신호(SwapCtl)를 생성한다. Rshift 카운트 회로(428)는 또한 지수차 Ediff의 크기를 이용하여, 후술하는 바와 같이 선택된 가산수가 얼마나 멀리 우측 시프트되는지를 제어하는 시프트 양 신호(RshAmt)를 생성한다. 시프트 양은 예를 들어 가산수들의 폭에 기초하여 클램핑될 수 있다. 이들 신호는 경로(441) 상에서 정렬 블록(420)으로 전송된다.
OPCTL 신호의 이용을 통해, Rshift 카운트 회로(428)는 우측 시프트가 이용될 수 있는 다른 연산들에 이용된다. 이러한 이용 예는 후술한다.
도 8B는 AB 부호 회로(820), 이진 테스트 논리 유닛(822) 및 선택 mux(824)를 포함하는 비교 논리 블록(436)을 나타내는 블록도이다. 비교 논리 블록(436)은 입력들 R1, R2a 및 R2b를 수신하고 경로(419) 상에서 결과 R3b로서 전송하기 위해 이들 중 하나를 선택한다. MAD 또는 가산 연산의 경우, 피연산자 C는 입력 R1으로서 수신되고 수정 없이 비교 논리 블록(436)을 통해 전송된다. LOP, CMP, MAX, MIN 및 SET를 포함하는 다른 연산들에 대해, 비교 논리 블록(436)은 그의 입력들 중 다른 하나를 선택할 수 있다.
AB 부호 회로(820)는 경로(805) 상에서 IP 가산기(804)(도 8A)로부터 2개의 MSB RP2를 수신한다. 최대치(FMAX 또는 IMAX), 최소치(FMIN 또는 IMIN), 또는 이진 테스트(FSET 또는 ISET) 연산들의 경우에, 피연산자 B는 유리하게도 스테이지 0(도 5 참조)의 조건부 인버터(519)에 의해 반전되며, 피연산자들 A 및 B는 전술한 바와 같이 선택 mux들을 이용하여 IP 가산기(804)로 바이패스된다. 이 경우, 결과 RP는 차 A-B이며, MSB RP2는 차가 음인지(B>A를 의미)의 여부를 나타낸다. AB 부호 회로(820)는 MSB들을 수신하고, 부호 신호 Sab(예를 들어, A-B가 음인 경우 표명되고 그렇지 않은 경우에는 역표명되는 1비트 신호)를 생성한다. 부호 신호 Sab는 경로(821)를 통해 이진 테스트 논리 유닛(822) 및 하향 컴포넌트들에 제공된다.
부호 신호 Sab에 더하여, 이진 테스트 논리 유닛(822)은 경로(429)를 통해 스테이지 1(도 4)의 특수 수치 검출 블록(438)으로부터 특수 수치 신호 SPC, OPCTL 신호, 및 스테이지 1의 비트 논리 회로(434)로부터 결과 R1을 수신한다. 결과 R1은 조건부 선택 연산들(FCMP, ICMP)에 대한 피연산자 C, 또는 스테이지 3의 이진 테스트 논리 유닛(822)이 활성화되는 다른 연산들에 대한 XOR 유닛(634)의 출력이다.
이들 입력 신호에 응답하여, 이진 테스트 논리 유닛(822)은 선택 mux(824)의 연산을 제어하는 비교 선택 신호(CSEL)는 물론, 도 4에 도시된 바와 같이 경로(825) 상에서 스테이지 7로 전송되는 부울 결과 신호(BSEL)를 생성한다. CSEL 신호는 또한 경로(827)를 통해 하향 컴포넌트들에 전송될 수 있다.
CSEL 및 BSEL 신호의 생성은 연산 종속적이다. FMAX, IMAX, FMIN 또는 IMIN의 경우, 피연산자들 A 및 B는 승산기 트리(700)(도 7A) 주위로 바이패스되어, 결과들 R2a 및 R2b로서 제공된다. 이진 테스트 논리(822)는 부호 신호 Sab에 기초하여 이들 2개의 피연산자 중 하나를 선택하기 위해 CSEL 신호를 생성한다.
조건부 선택 연산들(FCMP, ICMP)에 대해, 경로(433) 상의 결과 R1은 피연산자 C이다. 특수 수치 신호 SPC는 특히 피연산자 C가 0인지(또는 임의의 다른 특수 수치인지)의 여부를 나타낸다. 이진 테스트 논리(822)는 피연산자 C의 부호 비트 및 특수 수치 신호 SPC를 이용하여 조건 C≥0이 만족되는지를 판정하고, 피연산자들 A(R2a) 및 B(R2b) 중 하나를 적절히 선택한다.
이진 테스트 연산들(FSET, ISET)에 대해, 이진 테스트 논리(822)는 부울 참 또는 거짓 신호 BSEL을 생성한다. 이 신호는 경로(825)를 통해 스테이지 7로 제공되어, 부울 결과의 적절한 32비트 표현을 생성하는데 사용된다. 이 경우, 경로(433) 상의 결과 R1은 32비트 XOR2 결과를 제공한다. 이진 테스트 논리(822)는 4개의 기본 테스트, 즉 "무순서"(A?B), "등가"(A=B), "초과"(A>B) 및 "미만"(A<B) 테스트를 수행한다. A?B 테스트는 A 및 B 중 적어도 하나가 INF 또는 NaN인 경우 부울 참을 산출하는데, 이는 특수 수치 신호 SPC를 참조하여 결정될 수 있다. A=B 테스트는 경로 상의 XOR 결과 R1의 모든 비트가 0인 경우 부울 참을 산출한다. A<B 테스트는 경로 상의 부호 신호 Sab가 A-B가 음수임을 나타내는 경우 부울 참을 산출한다. A>B 테스트는 다른 3개 테스트 모두가 거짓을 산출하는 경우에 부울 참을 산출한다. 네가티브 테스트(등가가 아님, 크지 않음, 작지 않음, 무순서 아님)는 4개의 기본 테스트의 결과들을 반전시킴으로써 해결될 수 있다. 추가적인 조합 테스트(예를 들어, A≤B 등)는 4개의 기본 테스트 또는 이들의 부정으로부터의 결과들의 적절한 부울 OR을 구성함으로써 지원될 수 있다. 일 실시예에서, 이진 테스트 논리(822)는 다수의 테스트를 병렬로 실행하고, OPCTL 신호에 기초하여 결과 BSEL을 선택하도록 구성된다. mux(824)로의 임의의 입력은 결과 R3b로서 선택될 수 있는데, 이는 그 결과가 SET 연산 동안 무시될 것이기 때문이다.
F. 스테이지 4의 요소들
다시 도 4를 참조하면, 스테이지 4는 정렬 블록(420) 및 지수 증가 블록(430)을 포함한다.
도 9는 정렬 블록(420)을 나타내는 블록도이다. FMAD 또는 FADD 연산 동안, 정렬 블록(420)은 부동 소수점 가산을 위한 준비에 있어서 가수들을 정렬하는데 사용된다. 정렬 블록(420)은 또한 후술하는 바와 같이 다른 연산들 동안에 우측 시프트를 수행하는데 이용된다. 정렬 블록(420)에 대한 제어 신호는 경로(441)를 통해 Rshift 카운트 회로(428)에 의해 부분적으로 제공된다.
정렬 블록(420)은 "작은" 스왑 mux(904) 및 "큰" 스왑 mux(906)를 포함하는데, 이들 각각은 경로들(421, 419)로부터 입력들 R3a 및 R3b를 수신한다. 작은 스왑 mux(904) 및 큰 스왑 mux(906)는 Rshift 카운트 회로(428)로부터의 SwapCtl 신호의 공통 제어하에 있으며, 따라서 작은 스왑 mux(904)가 입력들(R3a, R3b) 중 하나를 작은 피연산자 경로(908)로 지향시킬 때, 큰 스왑 mux(906)는 다른 입력(R3b, R3a)을 큰 피연산자 경로(910)로 향하게 한다. FMAD 연산의 경우, 피연산자들은 (A*B) 및 C에 대응하며, 보다 작은 지수를 가진 피연산자는 작은 피연산자 경로(908)로 지향된다.
작은 피연산자 경로(908)는 우측 시프트 회로(912), 스티키 비트 논리(914), 시프트 mux(916) 및 조건부 인버터(918)를 포함한다. 우측 시프트 회로(912)는 작은 피연산자 경로(908) 상의 데이터 비트들을 우측 시프트시키며, 시프트의 양(예를 들어, 0 내지 32비트)은 Rshift 카운트 회로(804)로부터의 RshAmt 신호에 의해 제어된다. 일 실시예에서, 우측 시프트 회로(912)는 RshAmt 신호 또는 개별 OPCTL 신호(도시되지 않음)를 통해 산술 또는 논리 시프트를 수행하도록 제어될 수 있다.
스티키 비트 논리(914)는 우측 시프트 회로(912)에 의해 시프트된 LSB들의 일부 또는 모두를 캡쳐하며, 후술하는 바와 같은 라운딩에서의 사용을 위해 스티키 비트들 SB4를 경로(915)를 통해 스테이지 5에 제공한다. 일 실시예에서, 스티키 비트 논리(914)는 또한 경로(SB3)를 통해 스테이지 3(도 8A 참조)으로부터 스티키 비트들(SB3)을 수신하며, 스티키 비트 논리(914)가 수신된 스티키 비트들(SB3)를 전송하는지 또는 새로운 스티키 비트들을 생성하는지는 OPCTL 신호에 응답하여 제어될 수 있다.
시프트 mux(916)는 이전 승산이 다음 비트 위치로의 캐리 아웃을 산출하는 경우에 정렬을 조정하기 위해 제공된다. 이것은 또한, 시프트 양 RshAmt가 기초하는 지수차(Ediff)가 음인 경우에 정렬 시프트의 정확한 구현을 지원하는데 사용될 수도 있다. 이러한 경우는 Rshift 카운트 회로(428)에서 Ediff 값을 반전시켜 RshAmt를 얻은 후 시프트 mux(916)를 동작시켜 1비트 만큼 추가적인 우측 시프트를 수행함으로써 처리될 수 있다. 몇몇 실시예에서, 시프트 mux(916)는 또한 피연산자가 추가적인 특수 논리를 이용하지 않고 32비트 시프트될 때 0이 반환되어야 하는 연산들을 지원하기 위해 사용될 수 있다.
조건부 인버터(918)는 OPCTL 신호 및 몇몇 경우에 비교 논리 블록(436)(도 8B 참조)으로부터의 CSEL 신호 또는 Sab 신호와 같은 다른 신호들에 응답하여 작은 피연산자 경로(908) 상에서 피연산자를 반전시키거나 반전시키지 않을 수 있다. 조건부 반전은 예를 들어 스테이지 5 동안 감산 연산을 구현하는데 이용될 수 있다. 출력 신호 R4a는 경로(909) 상에서 스테이지 5로 제공된다.
큰 피연산자 경로(910)는 조건부 제로 회로(920) 및 시프트 mux(922)를 포함한다. OPCTL 신호에 응답하는 조건부 제로 회로(920)는 경로(910) 상의 피연산자를 0으로 대체하는데 사용될 수 있다. 이것은 예를 들어 스테이지 5(후술함)에서 R3a 또는 R3b를 수정 없이 가산기를 통과시키는 것이 바람직한 연산들 동안에 이용된다. FMAD 연산들에 대해, 조건부 제로 회로(920)는 비활성적이며, 큰 피연산자는 수정 없이 통과한다. 시프트 mux(922)는 시프트 mux(916)와 같이 이전 승산에서의 캐리 아웃의 경우에 정렬을 조정하는데 사용될 수 있다.
큰 피연산자 경로(410)로부터의 출력 신호 R4b는 경로(911) 상에서 스테이지 5로 제공된다.
다시 도 4를 참조하면, 지수 증가 블록(430)은 경로(723) 상에서 유효 최종 지수 EFE, 및 경로(421) 상에서 곱 결과 R3a(또는 단지 곱 결과의 최상위 비트들)를 수신한다. FMAD 또는 FMUL 연산 동안, 지수 증가 블록(430)은 후치 승산기 블록(418)에서의 48비트 합 및 캐리 결과들(R2a, R2b)의 가산이 캐리를 49번째 비트 위치에 배치하였는지를 검출한다. 그러한 경우, 유효 최종 지수 EFE는 1만큼 증가한다. 수정된(또는 수정되지 않은) 유효 최종 지수 EFE2는 경로(443)를 통해 스테이지 4로 제공된다.
G. 스테이지 5의 요소들
스테이지 5는 소수합 블록(422)을 포함한다. 가산 및 MAD 연산 동안, 이 블록은 가산을 수행한다. 이것을 사용하는 모든 연산에 대한 라운딩도 이 스테이지에서 구현된다.
도 10은 플러스-1 가산기(1002), AND2 회로(1004), 인버터(1006), 라운딩 논리 유닛(1008) 및 선택 mux(1010)를 포함하는 소수합 블록(422)의 블록도이다. 가산수들 R4a 및 R4b가 정렬 블록(420)으로부터 경로(909, 911) 상에서 수신된다. 일반적으로 통상의 설계를 가질 수 있는 플러스-1 가산기(1002)는 가산수들을 더하여, 합 출력을 생성하고, 합에 1을 더하여 합+1 출력을 생성한다. 인버터(1006)는 합 출력을 반전시켜 ∼합 출력을 생성한다. 이들 출력은 2의 보수 계산은 물론 라운딩을 지원한다.
병행하여, AND2 회로(1004)는 피연산자들 R4a 및 R4b의 대응 비트들 상에 논리적 AND 연산을 수행하여 32 비트 결과를 제공한다. AND2 회로(1004)는 후술하는 바와 같이 FRC 연산 동안에 사용된다. 다른 연산들 동안, AND2 회로(1004)는 바이패스되거나 저전력 유휴 상태가 될 수 있다.
일반적으로 통상의 설계를 가질 수 있는 라운딩 논리(1008)는 OPCTL 신호, 비교 논리 블록(436)(도 8B 참조)으로부터의 경로(821) 상의 부호 신호 Sab, 경로(915) 상의 스티키 비트들 SB4, 및 플러스-1 가산기(1002)로부터 선택된 MSB 및 LSB를 수신한다. 이들 신호에 응답하여, 라운딩 논리(1008)는 합, 합+1, ∼합 및 AND2 출력들 중 하나를 결과 R5로서 선택하도록 mux(1010)에게 지시하며, 선택된 결과 R5는 경로(1011) 상에서 전송된다.
결과 R5의 선택은 다수의 고려 사항에 의존한다. 예를 들어, 라운딩 논리(1008)는 유리하게도 IEEE 표준 산술에 대해 정의된 4개의 라운딩 모드(최근접, 최저, 최고, 절단)를 구현하며, 상이한 모드들은 아마도 상이한 결과들을 선택한다. OPCTL 신호 또는 다른 제어 신호(도시되지 않음)가 라운딩 모드들 중 하나를 지정하는데 사용될 수 있다. 또한, 선택도 포맷(정수 또는 부동 소수점), 결과가 양인지 음인지, 절대값 또는 부정이 요청되었는지, 그리고 유사한 고려 사항들에 의존할 것이다. 다양한 라운딩 모드에 따라 양수 및 음수를 라운딩하기 위한 통상의 규칙들이 구현될 수 있다. FRC 연산에 대해, AND2 회로(1004)의 출력이 선택되고, 다른 연산들에 대해 이 출력은 무시될 수 있다.
H. 스테이지 6의 요소들
다시 도 4를 참조하면, 스테이지 6은 정규화 블록(423) 및 지수 감소 블록(432)을 포함한다. FMAD, FMUL 또는 FADD 연산 동안, 정규화 블록(423)은 선두 비트가 1이 될 때까지 결과를 좌측으로 시프트함으로써 가수 R5를 정렬하도록 동작한다. 이 상황에서 좌측 시프트는 2배 승산을 의미하므로, 좌측 시프트 양은 그에 대응하여 지수 EFE를 감소시키는 지수 감소 블록(432)으로 제공되며, 따라서 최종 지수 E0가 생성된다. 다른 연산들 동안, 정규화 블록(423)은 후술하는 바와 같이 좌측 시프트를 수행하는데 이용된다.
도 11은 정규화 블록의 블록도이다. 우선 순위 인코더(1108)가 경로(1011) 상에서 가산 결과 R5를 수신하여 선두 1의 위치를 결정한다. 이 정보는 좌측 시프트 양 신호 LshAmt를 생성하는 시프트 제어 회로(1110)에 제공된다. LshAmt 신호는 좌측 시프트 회로(1112)에, 그리고 또한 지수 감소 블록(432; 도 4)에 제공된다. 좌측 시프트 회로(1112)는 결과 R5를 좌측으로 지정된 비트 수 만큼 시프트시켜 결과 R6을 경로(425) 상에 제공한다. 지수 감소 블록(432)은 LshAmt 신호에 따라 지수 EFE2를 감소시켜 결과적인 최종 지수 E0을 경로(427) 상에 제공한다.
시프트 제어 회로(1110)는 또한 OPCTL 신호, 경로(443)으로부터의 EFE2 신호, 및 경로(429)로부터의 특수 수치 신호 SPC를 수신하여, 좌측 시프트 회로(1112)가 다른 상황에서 좌측 시프트를 수행하는데 이용될 수 있게 하는데, 그 예는 후술한다.
I. 스테이지 7의 요소들
다시 도 4를 참조하면, 스테이지 7은 출력 제어 블록(440)을 포함하는데, 이 블록은 MMAD 유닛(220) 외부의 컴포넌트들로 경로들(410, 412)을 통해 전달하기 위해 최종 결과(OUT 및 COND)를 포맷하고 선택한다. 도 12는 출력 제어 블록(440)의 블록도이다. 부동 소수점 연산들에 대해, 포맷 블록(1210)이 경로(427)를 통해 최종 지수 E0을, 경로(425)를 통해 최종 가수 R6을 수신한다. 부동 소수점 연산들에 대해, 포맷 블록(1210)은 값들 E0 및 R6을 사용하여, OPCTL 신호에 의해 지정된 fp32 또는 fp16 포맷의 결과 Rdata를 생성한다.
정수 연산들에 대해, 포맷 블록(1210)은 결과 R6을 수신하여 지수 E0를 버린다. 포맷 블록(1210)은 수정되지 않은 정수 결과 R6를 전달하거나 적절한 포맷팅을 적용할 수 있는데, 예를 들어 32비트보다 적은 비트를 사용하는 정수 포맷에 대해 32비트 결과의 적절한 위치에 유효 비트들을 정렬한다. 몇몇 실시예에서, 포맷 블록(1210)은 또한 오버플로우하거나 언더플로우하는(예를 들어, 지정된 정수 포맷에 대해 최대치 또는 최소치로) 정수 출력을 클램핑한다.
포맷팅된 결과 Rdata는 경로(410) 상에서 최종 결과 OUT으로서 결과 Rdata와 하나 이상의 소정의 값 중에서 선택하는 최종 선택 mux(1212)에 입력으로서 제공된다. 일 실시예에서, 소정의 값들은 fp16 및 fp32 포맷의 특수 수치들 NaN 및 INF는 물론, 32비트 부울 참(예를 들어, 0x1) 및 거짓(예를 들어, OxO) 값들을 포함한다. 선택된 최종 결과 OUT은 결과에 기초하여 조건 코드 COND를 생성하는 조건 코드 회로(1218)에도 제공된다. 결과 포맷은 부분적으로 연산 코드에 의존하므로, 조건 코드 회로(1218)는 예상 포맷을 지시하는 OPCTL 신호를 수신한다. 조건 코드의 예는 위에서 설명하였다.
부동 소수점 산술 연산들 동안, 지수 포화 논리(1216)는 최종 지수 E0을 수신하여, 지수 오버플로우(또는 언더플로우)가 발생하였는지를 결정한다. 결정은 유리하게도 fp16 또는 fp32 포맷이 사용되고 있는지를 지시하는 OPCTL 신호에 부분적으로 기초한다. 지수 포화 논리(1216)로부터의 지수 포화 신호 Esat는 최종 결과 선택 논리(1214)에 제공된다.
최종 결과 선택 논리(1214)는 OPCTL 신호, 경로(429)(스테이지 1로부터) 상의 특수 수치 신호 SPC, 경로(825)(스테이지 3으로부터) 상의 부울 선택 신호 BSEL, 및 지수 포화 신호 Esat을 포함하는 제어 신호들의 조합에 응답하여 최종 선택 mux(1212)의 연산을 제어한다. 최종 결과의 선택은 연산 및 최종 결과는 물론, 특수 수치 또는 포화의 발생에 따라 변한다.
예를 들어, 부동 소수점 산술 연산의 경우에, 최종 결과 선택 논리(1214)는 유리하게도 특수 수치 신호 SPC를 사용하여, 특수 수치를 포함하는 계산에 대한 규칙(예를 들어, 임의의 수에 더해지거나 임의의 수에 의해 곱해지는 NaN은 NaN이라는 등)을 구현한다. 입력 피연산자들 중 하나(A, B 또는 C)가 특수 수치인 경우, 최종 결과 선택 논리(1214)는 결과 Rdata에 우선하여 대응하는 특수 수치를 선택하도록 mux(1212)에게 지시한다. 게다가, 최종 결과 선택 논리(1214)는 또한 포화 신호 Esat를 이용하여, 지수 오버플로우 또는 언더플로우 조건의 경우에 특수 수치(예를 들어, INF 또는 0)를 선택한다.
이진 테스트(FSET, ISET) 연산의 경우에, 최종 결과 선택 논리(1214)는 부울 선택 신호 BSEL을 사용하여, 부울 참 및 논리 거짓 출력들 사이에서 선택하고, 수치 결과 Rdata를 무시한다.
J. 피연산자 바이패스 또는 통과 경로
전술한 바와 같이, MMAD 유닛(220)은 피연산자들이 다양한 회로 블록을 통해 수정되지 않은 채로 전송되는 것을 가능하게 하는 바이패스 또는 통과 경로를 제공한다. 예를 들어, 피연산자 A는 스테이지 1에서 전치 승산기 블록(416)을 통과한다(도 6A 참조). 피연산자 A는 또한 스테이지 2(도 7A 참조)에서 승산기 트리(700) 주위로 결과 R2a로서 바이패스되고, 스테이지 3(도 8A 참조)에서 IP 가산기(804) 주위로 결과 R3a로서 바이패스되며, 스테이지 4(도 9 참조)에서 결과 R4a로서 작은 피연산자 경로(908)를 통과할 수 있다. 또한, 조건부 제로 유닛(920)은 결과 R4b가 0이 되도록 강제하며, 따라서 피연산자 A는 스테이지 5(도 10 참조)에서 플러스-1 가산기(1002)에 의해 0에 더해진다. 이어서, 합 결과가 mux(1010)에 의해 선택되는 경우, 결과 R5는 피연산자 A이다.
마찬가지로, 피연산자 B는 스테이지 1(도 6A 참조)에서 전치 승산기 블록(416) 주위로 경로 BB로 바이패스되고, 스테이지 2(도 7A 참조)에서 승산기 트리(700) 주위로 결과 R2b로서 바이패스될 수 있다. 피연산자 C는 스테이지 1(도 6C 참조)에서 결과 R1으로서 비트 논리 블록(434)을 통과할 수 있고, 스테이지 3(도 8B 참조)에서 결과 R3b 로서 비교 논리 블록(436)을 통과할 수 있다. 이 실시예에서, 피연산자들 B 및 C에 대한 추가적인 바이패스 경로는 제공되지 않으며, 대체 실시예들에서는 필요에 따라 추가적인 바이패싱(피연산자 A에 대해 도시된 것과 유사)이 제공될 수 있다.
따라서, Ⅲ장에서의 동작 설명은 다양한 피연산자가 특정 스테이지로 바이패스 또는 통과되는 것을 나타내는데, 몇몇 스테이지를 통한 바이패스 또는 통과 경로를 따르는 것은 후속 스테이지들에서 바이패스 경로를 계속 따르는 것을 반드시 필요로 하는 것은 아니라는 점을 이해해야 한다. 또한, 하나의 스테이지에서 수정된 값은 후속 스테이지를 통한 바이패스 경로를 따를 수 있다. 연산 중에 특정 회로 블록이 바이패스되는 경우, 그 블록은 비활성 상태로 설정되어 전력 소모를 줄이거나, 정상적으로 동작하도록 허가되어 그의 출력이 예를 들어 선택 mux들 또는 다른 회로 요소들의 사용을 통해 무시되게 할 수 있다.
본 명세서에 설명되는 MMAD 유닛은 예시적이며, 변형 및 수정이 가능하다는 것을 이해할 것이다. 본 명세서에 설명되는 많은 회로 블록은 통상의 기능을 제공하며, 이 분야에 공지된 기술을 이용하여 구현될 수 있고, 따라서 이들 블록에 대한 상세한 설명은 생략되어 있다. 연산 회로의 블록들로의 분할은 수정될 수 있으며, 블록들은 조합되거나 변경될 수 있다. 또한, 아래에서 명백해지듯이, 파이프라인 스테이지들의 수 및 특정 회로 블록들 또는 연산들의 특정 스테이지들에 대한 할당도 수정되거나 변경될 수 있다. 특정 구현을 위한 회로 블록들의 선택 및 배열은 지원되는 연산들의 세트에 의존하며, 본 기술분야의 숙련자들은 본 명세서에서 설명되는 블록들 모두가 모든 가능한 연산들의 조합에 대해 필요한 것은 아니라는 것을 인식할 것이다.
Ⅲ. MMAD 유닛 연산들의 예
MMAD 유닛(220)은 유리하게도 위에 설명된 회로 블록들을 이용하여 면적 효율적인 방식으로 도 3에 리스트된 연산들 모두를 지원한다. 따라서, MMAD 유닛(220)의 연산은 적어도 일부 관계에서 어떠한 연산이 실행되고 있는지에 의존한다. 다음 장들은 도 3에 리스트된 연산들 각각을 수행하기 위해 MMAD 유닛(220)을 이용하는 것을 설명한다.
A. 부동 소수점 연산
MMAD 유닛(220)에 의해 지원되는 부동 소수점 연산들이 도 3의 302에 도시되어 있다. 산술 연산들(FADD, FMUL, FMAD)에 대해, 지수 경로(415)는 지수를 계산하는데 사용되며, 가수 경로(413)는 가수를 계산하는데 사용된다. 다른 부동 소수점 연산들(FCMP, FMIN, FMAX 및 FSET)은 fp32 및 fp16 포맷에서 수치들을 부호 없는 32비트 정수인 것처럼 처리함으로써 상대적 크기가 정확히 결정될 수 있는 특성을 이용하는데, 이들 연산은 가수 경로(413) 및 테스트 경로(417)를 이용하여 처리된다.
1. FMAD 연산
FMAD 연산은 fp16 또는 fp32 포맷으로 MMAD 유닛(220)에 제공되는 피연산자들 A, B 및 C에 대해 A*B+C를 계산하여, 결과를 입력 피연산자들과 동일한 포맷으로 반환한다.
스테이지 0에서, 피연산자들 A0, B0 및 C0이 수신되어, 선택 mux들(514-516)(도 5)의 연산을 통한 수정 없이 피연산자들 A, B 및 C로 포맷팅 블록(400)을 통과한다.
스테이지 1에서, 전치 승산기 블록(416)은 피연산자 A의 가수부로부터 3A를 계산하고, 부스3는 피연산자 B의 가수부를 인코딩하며, 경로 BB 상에서 부스 인코딩된 가수를 전송한다. 지수곱 블록(424)은 피연산자들 A 및 B의 지수부들(Ea, Eb)을 수신하여, Ea+Eb를 계산하는데, 유리하게도 합에서 정확한 fp16 또는 fp32 지수 바이어스를 재설정하기 위해 바이어스 β가 사용된다. 피연산자 C의 가수부는 비트 논리 블록(434)으로 전달되고, 여기서 피연산자 C는 mux(636)에 의해 선택되어, 경로(433) 상으로 결과 R1으로서 전송된다. 피연산자 C의 지수부(Ec)는 경로(439) 상에서 지수 경로(415)로 라우팅된다. 또한, 스테이지 1 동안, 특수 수치 검출 블록(438)은 피연산자들 A, B 및 C 중 임의의 피연산자가 특수 수치인지를 결정하고, 스테이지 7에서 사용하기 위해 경로(429) 상에서 적절한 특수 수치 신호 SPC를 생성한다.
스테이지 2에서, 승산기 블록(414)은 A*B의 가수부를 계산하고, 합 및 캐리 필드를 결과 R2a 및 R2b로서 선택한다. 지수합 블록(426)은 경로(431) 상에서 경로 상의 곱 지수 Eab를, 경로(439) 상에서 피연산자 C의 지수부(Ec)를 수신한다. 차 유닛(704)(도 7B)은 Eab-Ec를 계산하여, 그 결과 Ediff를 경로(725) 상에서 전송한다. 또한, Eab-Ec의 부호에 기초하여, Eab 및 Ec 중 하나가 유효 최종 지수 EFE로서 선택된다. 피연산자 C의 가수(R1)는 경로(433) 상에서 통과한다.
스테이지 3에서, 후치 승산기 블록(418)은 합 및 캐리 결과들 R2a 및 R2b를 더하여, 그 결과 R3a를 경로(421) 상에 제공한다. 스티키 비트 논리(808)(도 8A)는 동작할 수 있지만, 이 실시예에서는 스티키 비트들 SB3가 후속 스테이지들에서 무시되며, 따라서 곱 A*B는 라운딩되는 것이 아니라 절단된다. Rshift 카운트 블록(428)은 경로(725) 상에서 Ediff의 부호를 이용하여 부동 소수점 가산 동안 어느 피연산자가 시프트되는지를 결정하고, 대응하는 SwapCtl 신호를 생성한다. 또한, Rshift 카운트 블록(428)은 경로 상의 값 Ediff의 크기를 이용하여, 선택된 피연산자를 시프트할 비트 수를 결정하고, 적절한 RshAmt 신호를 생성한다. 비교 논리(436)는 경로(419) 상의 결과 R3b로서 피연산자 C의 가수부를 통과시킨다.
스테이지 4에서, 정렬 블록(420)은 곱 A*B의 가수를 결과 R3a로서, 피연산자 C의 가수를 결과 R3b로서 수신한다. Rshift 카운트 블록(804)으로부터의 SwapCtl 신호에 기초하여, 스왑 mux들(904, 906; 도 9)은 피연산자들 중 하나를 작은 피연산자 경로(908)로, 나머지를 큰 피연산자 경로(910)로 향하게 한다. 작은 피연산자는 우측 시프트 회로(912)에 의해 우측으로 시프트되며, 스티키 비트 논리(914)는 시프트된 비트들로부터 스티키 비트들 SB4를 생성한다. 정렬된 결과적인 가산수들 R4a 및 R4b는 경로들(909, 911) 상에 제공된다. 지수 증가 블록(430; 도 4)은 곱 A*B의 가수(R3a)를 수신하고, 전술한 바와 같이 유효 최종 지수 EFE를 증가시키거나 증가시키지 않는다. 결과 EFE2는 경로(443) 상에서 전송된다.
스테이지 5에서, 소수합 블록(422)은 정렬된 가산수들 R4a 및 R4b를 수신한다. 플러스-1 가산기(1002; 도 10)는 합 및 합+1 출력을 생성하고, 인버터(1006)는 반전된 합을 제공한다. 라운딩 논리(1008)는 경로 상의 스티키 비트들(SB4)을 수신하고, 선택 mux(1010)가 스티키 비트들, 선택된 라운딩 모드들, 및 플러스-1 가산기(1002)에서 계산된 합의 부호에 기초하여 합 및 합+1 출력 중에서 선택하도록 제어한다. 결과적인 가수 R5는 경로(1011) 상으로 전송된다.
스테이지 6에서, 정규화 블록(423)은 가수 R5를 정규화한다. 우선 순위 인코더(1108; 도 11)는 선두 1의 위치를 검출하고, 그 데이터를 시프트 제어 유닛(1110)에 제공하며, 이 유닛은 대응하는 LshAmt를 생성한다. 좌측 시프트 블록(1112)은 가수를 좌측으로 시프트하여 결과 R6을 경로(425) 상으로 전송한다. 지수 감소 블록(432; 도 4)은 유효 최종 지수 EFE2를 적절히 하향 조정하며, 결과적인 최종 지수 E0을 경로(427) 상으로 전송한다.
스테이지 7에서, 출력 제어 회로(440)는 최종 결과를 생성한다. 포맷 블록(1210; 도 12)은 지수 E0 및 가수 R6을 수신하고, Rdata 상의 정규 수치를 적절한 포맷(예를 들어, fp32 또는 fp16)으로 생성한다. 포화 논리(1216)는 지정된 포맷에 따라 지수 E0을 평가하고, 임의의 오버플로우를 검출하며, 적절한 포화 신호 Esat를 생성한다. 최종 결과 선택 논리(1214)는 포화 신호 Esat는 물론 특수 수치 신호 SPC를 수신한다. 이 연산을 위해, 최종 결과 선택 논리(1214)는 Esat 또는 SPC 신호가 최종 결과가 특수 수치이어야 함을 지시하지 않는 경우에 mux(1212)에게 결과 Rdata를 선택하도록 지시한다. 그 경우, 적절한 특수 수치가 최종 결과로서 선택된다. 전술한 바와 같이, 최종 결과 선택 논리(1214)는 입력 피연산자들 중 하나가 특수 수치인 경우에 대해 IEEE 754-준수 규칙들(또는 다른 규칙들)을 구현할 수 있다.
2. FMUL 및 FADD 연산
부동 소수점 승산(FMUL)을 위해, MMAD 유닛(220)은 피승수를 피연산자 A로서, 승수를 피연산자 B로서 수신하는데, 값 0.0(부동 소수점 0)은 유리하게도 피연산자 C에 대해 제공된다. 이어서, 스테이지 4에서 스티키 비트 논리(914; 도 9)가 유리하게도 스테이지 3으로부터의 스티키 비트들 SB3를 통과시켜 곱이 라운딩되는 것을 허가하는 점 외에는, 전술한 바와 같은 FMAD 연산이 실행되어, 곱 A*B(+0.0)를 생성한다. 몇몇 실시예에서, 피연산자 C는 스테이지 4에서 조건부 제로 블록(920; 도 9)의 이용을 통해 0으로 강제될 수 있으며, 따라서 피연산자 C에 대해 임의의 값이 제공될 수 있다.
부동 소수점 가산(FADD)을 위해, MMAD 유닛(220)은 가산수들을 피연산자들 A 및 C로서 수신한다. 일 실시예에서, FMAD 연산이 수행되는데, (A*1.0)+C를 계산하기 위해 피연산자 B가 1.0으로 설정되며, 피연산자 B의 1.0으로의 설정은 부동 소수점 1.0을 MMAD 유닛(220)에 피연산자 B로서 제공하거나, 전치 승산기 선택 mux(616; 도 6A)를 동작시켜 레지스터(620)로부터 부스3 인코딩된 1.0을 선택함으로써 행해질 수 있다.
FADD의 대체 구현에 있어서, 피연산자 B는 0.0으로 설정되며(예를 들어, 부동 소수점 0을 MMAD 유닛(220)에 입력 피연산자로서 제공함으로써), 피연산자들 A 및 B는 스테이지 3으로 바이패스되어, 여기서 합 A+0.0이 후치 승산기 블록(418) 내의 IP 가산기(804; 도 8A)에 의해 계산되거나, 대체 실시예에서 피연산자 A가 결과 R3a로서 IP 가산기(804) 주위로 더 바이패스될 수 있다. 후속 스테이지들은 FMAD 연산에 대해서는 A+C를 계산하도록 동작한다.
3. FMIN 및 FMAX 연산
부동 소수점 최대치(FMAX) 및 최소치(FMIN) 연산은 두 피연산자 중 크거나 작은 피연산자를 반환한다. 전술한 바와 같이, 이들 및 다른 비교 기반 연산들은 가수 경로(413) 및 테스트 경로(417)의 컴포넌트들을 이용하여 처리된다. MMAD 유닛(220)은 FMAX 또는 FMIN 연산을 수행할 피연산자들 A 및 B를 수신하며, 피연산자 C는 임의의 값으로 설정될 수 있다.
FMIN 및 FMAX 연산을 위해, 피연산자 B는 스테이지 0에서 반전되고(∼B로), 피연산자들 A 및 ∼B의 모든 32 비트는 결과 R2a 및 R2b로서 각각 스테이지 3으로 통과된다. 스테이지 3에서, IP 가산기(804; 도 8A)는 합 A+∼B(즉, A-B)를 계산한다. 이 결과 RP2의 2개의 MSB는 비교 논리 블록(436)으로 제공된다. 피연산자들 A 및 B가 부동 소수점 수이지만, 비교 연산을 위해, 이들은 fp32 및 fp16 포맷이 정의되는 방법 때문에 정수인 것처럼 감산될 수 있다는 점에 유의해야 한다.
비교 논리 블록(436)에서, AB 부호 회로(820; 도 8B)는 경로 상의 신호(RP2)를 수신하여 적절한 부호 신호 Sab를 생성한다. 이진 테스트 논리(822)는 전술한 바와 같은 선택을 행하는데, FMAX에 대해, (A+∼B)가 음인 경우(즉, B가 A보다 큰 경우) B가 선택되고, 그렇지 않은 경우에는 A가 선택되며, FMIN에 대해, (A+∼B)가 음인 경우 A가 선택되고, 그렇지 않은 경우에는 B가 선택된다. FMIN 또는 FMAX에 대해 어느 하나의 피연산자를 선택하는 것은 정확한 결과를 산출하므로 A=B인 경우는 특별히 처리되지 않는다는 점에 유의해야 한다. 이진 테스트 논리(822)는 mux(824)에게 R2a(피연산자 A) 및 R2b(피연산자 ∼B) 중 적절한 하나를 결과 R3b로서 전송하도록 지시하는 적절한 CSEL 신호를 생성한다.
스테이지 4에서, 작은 스왑 mux(904; 도 9)는 작은 피연산자 경로(908)로의 전송을 위해 결과 R3b를 선택하며, 큰 스왑 mux(906)는 스테이지 3 동안의 연산으로 인해 A-B일 수 있는 결과 R3a를 선택한다. Rshift 카운트 회로(428)는 지수들에 관계없이 SwapCtl 신호에 대한 적절한 상태를 생성하여 OPCTL 신호에 응답하여 이 결과를 생성하기 위해 사용될 수 있다. 큰 피연산자 경로(910)에서, 조건부 제로 블록(914)은 결과 R4a를 소거하도록 동작한다. 작은 피연산자 경로(908)에서, 결과 R3b는 결과 R4a로서 통과된다. 피연산자 ∼B(스테이지 0에서 반전됨)가 스테이지 3에서 선택되는 경우, 조건부 반전 회로(918)는 결과 R4a를 재반전시키는데 사용될 수 있다. 이 경우를 검출하기 위하여, 조건부 반전 회로(918)는 경로(827; 도 8B)로부터 CSEL 신호를 수신할 수 있다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 R4a(A 또는 B)와 R4b(0)를 더한다. 합 결과(즉, 선택된 피연산자 A 또는 B)는 결과 R5로서 mux(1010)에 의해 선택된다.
스테이지 6에서, 시프트 제어 회로(1110; 도 11)는 LshAmt를 0으로 설정함으로써 OPCTL 신호에 응답하며, 따라서 결과 R5는 수정 없이 결과 R6으로서 통과된다.
스테이지 7에서, 포맷 블록(1210; 도 12)은 변경되지 않은 결과 R6을 결과 Rdata로서 제공할 수 있다. A 또는 B가 특수 수치인 경우에, 최종 결과 선택 논리(1214)는 mux(1212)를 동작시켜 결과 Rdata를 적절한 특수 수치로 오버라이드할 수 있다. 예를 들어, A 또는 B가 NaN인 경우, FMAX 또는 FMIN 결과는 NaN으로 강제될 수 있다.
4. FSET 연산
이진 테스트(FSET) 연산을 위해, MMAD 유닛(220)은 피연산자들 A 및 B를 수신하며, 임의의 값이 피연산자 C로서 제공될 수 있다. 전술한 FMIN 및 FMAX 연산에서와 같이, 피연산자 B는 스테이지 0에서 반전되며, 피연산자들 A 및 ∼B는 스테이지 3으로 바이패스되는데, 여기서 이들은 PP 가산기(802; 도 8A)를 이용하여 감산되며, MSB들 RP2는 비교 논리 블록(436)으로 제공된다.
스테이지 1에서, 피연산자들 A 및 B는 통과되지만, 비트 논리 블록(434)은 동작하며, mux(436; 도 6C)는 결과 R1으로서 전송하기 위해 XOR2 유닛(634)의 결과를 선택한다.
스테이지 3에서, AB 부호 회로(820; 도 8B)는 신호 RP2를 수신하여 부호 신호 Sab를 생성한다. 이진 테스트 논리(822)는 Sab 신호, XOR2 결과(R1), 특수 수치 신호 SPC, 및 어는 이진 테스트가 수행되는지를 지정하는 OPCTL 신호를 수신한다. 이진 테스트 논리(822)는 전술한 바와 같이 그의 테스트를 수행하며(Ⅱ장의 E 참조), 부울 결과 BSEL을 경로(825) 상으로 전송한다.
부울 결과 BSEL은 경로(825) 상에서 스테이지 7로 전송된다. 스테이지 4 내지 6의 다양한 회로 블록은 적절한 신호 경로들에 나타나는 어떠한 신호에 대해서도 동작하거나, 디스에이블될 수 있다. 스테이지 4∼6에서 실행되는 임의의 연산들의 결과는 출력 제어 블록(440)에 의해 무시될 것이다.
스테이지 7에서, 최종 결과 선택 논리(1214)는 부울 결과 BSEL을 수신하고, 최종 선택 mux(1212)를 동작시켜 부울 참(예를 들어, Ox1)과 거짓(예를 들어, 0x0) 값들 사이에서 적절히 선택한다. 결과 BSEL은 피연산자들이 특수 수치인지를 정확히 반영하며, 최종 결과 선택 논리(1214)는 FSET 연산 동안 특수 수치 신호 SPC를 무시할 수 있다.
5. FCMP 연산
삼 변수 조건부 선택 연산(FCMP)을 위해, MMAD 유닛은 피연산자들 A, B 및 C를 수신한다. 피연산자들 A 및 B는 각각 결과 R2a 및 R2b로서 스테이지 3으로 통과된다. 피연산자 C는 결과 R1으로서 스테이지 3으로 통과된다.
스테이지 3에서, 이진 테스트 논리(822; 도 8B)는 피연산자 C(R1) 및 특수 수치 신호 SPC를 수신한다. 전술한 바와 같이(Ⅱ장의 E 참조), 이진 테스트 논리(822)는 이들 신호를 이용하여 조건 C≥0이 만족되는지를 판정한다. 이진 테스트 논리(822)는 C≥0인 경우 피연산자 A(R2a)를, 그렇지 않은 경우에는 피연산자 B(R2b)를 선택하도록 mux(824)에게 지시한다. NaN은 0보다 크지도 같지도 않으므로, 피연산자 B는 피연산자 C가 NaN인 경우에 선택될 것이다.
선택된 값은 FMIN 및 FMAX 연산에 대해 전술한 방식으로 스테이지 7로 결과 R3b로서 전송된다. (결과 R3a는 IP 가산기(804; 도 8A)로부터의 피연산자들 A 및 B의 합이거나, 피연산자 A는 결과 R3a로서 선택될 수 있는데, 어느 경우에나, 결과 R3a는 최종 결과에 영향을 주지 않는다.) 스테이지 7에서, 최종 결과 선택 논리(1214)는 유리하게도 피연산자 C가 NaN인 경우를 검출하고 전송된 결과를 NaN 값으로 오버라이드한다.
B. 정수 연산
정수 피연산자들은 지수 비트를 포함하지 않는다. 본 명세서에서 사용되는 포맷들에서, 부호를 가진 정수들은 2의 보수를 이용하여 표현되는데, 본 기술분야의 숙련자들은 다른 표현으로 대체될 수 있다는 것을 인식할 것이다. 후술하는 바와 같이, 정수 산술 연산은 일반적으로 지수 논리가 사용되지 않는다는 점 외에는 그들의 부동 소수점 대응물과 유사하다.
1. IMAD
정수 MAD(IMAD) 연산을 위해, MMAD 유닛(220)은 가수 경로(413)를 이용하여 A*B+C를 계산한다. 몇몇 정수 포맷이 부호를 갖지 않을 수 있지만, MMAD 유닛(220)은 유리하게도 모든 포맷을 부호를 가진 32비트 2의 보수 표현으로서 처리하는데, 이는 본질적으로 실제 포맷과 무관하게 정확한 결과를 생성한다.
스테이지 0에서, 피연산자들 A, B 및 C는 필요에 따라 8비트 입력 포맷에 대한 블록들 504∼506(도 5) 또는 508∼510(16비트 포맷에 대해)을 이용하여 32비트로 확장된다.
스테이지 1에서, 전치 승산기 블록(416)은 3A 및 피연산자 B의 부스3 인코딩을 계산한다. 비트 논리 블록(434)은 피연산자 C를 결과 R1으로서 전송한다.
스테이지 2에서, 승산기 블록(414)은 A*B를 계산하고, 곱에 대한 합 및 캐리 필드를 결과들 R2a 및 R2b로서 선택한다.
스테이지 3에서, 후치 승산기 블록(418)은 IP 가산기(804; 도 8A)를 이용하여 합 및 캐리 필드를 더한다. 정수 mux(810)는 상위 32 비트를 선택하며, 선택 mux(812)는 이것을 결과 R3a로서 선택한다. 비교 논리 블록(436)은 피연산자 C(R1)를 결과 R3b로서 전송한다.
스테이지 4에서, 정렬 유닛(420)은 R3a(곱 A*B) 및 R3b(피연산자 C)를 수신한다. 정수 가산은 가수 정렬을 필요로 하지 않으므로, Rshift 카운트 회로(428)는 모든 IMAD 연산에 대해 일관된 상태에서 SwapCtl 신호를 생성할 수 있으며, 따라서 예를 들어 R3a(R3b)는 항상 작은(큰) 피연산자 경로(908(910); 도 9)로 지향되거나 그 반대이다. 대안으로, 피연산자들 중 하나가 음인 경우, 그 피연산자는 작은 피연산자 경로(908)로 라우팅되고, 조건부 인버터(918)에 의해 반전될 수 있다. 스티키 비트 논리(914)는 경로(915) 상에서 스티키 비트들 SB4를 생성하도록 동작한다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 값들 R4a 및 R4b(A*B+C를 나타냄)를 더하고, 라운딩 논리(1008)는 수신된 피연산자들의 부호 및 스티키 비트들 SB4에 기초하여 합, 합+1 및 ∼합 출력 중 적적한 하나를 선택한다. 결과 R5는 경로(1011) 상으로 전송된다.
스테이지 6에서, 결과 R5는 수정 없이 정규화 블록(423)을 통과한다.
스테이지 7에서, 포맷팅 블록(1210)은 결과 R6을 수신하고, 필요에 따라 입력 피연산자 포맷에 매칭되도록 포맷한다. 포맷팅 블록(1210)은 유리하게도 또한 임의의 오버플로우를 검출하고, 결과 값 Rdata를 입력 포맷에 대한 최대 허용 값으로 클램핑한다. 최종 결과 선택 논리(1214)는 경로 상의 값 Rdata를 최종 결과 OUT로서 선택한다.
2. 승산(IMUL) 및 가산(IADD)
전술한 FMUL 및 FADD 연산과 마찬가지로, 정수 승산(IMUL) 및 가산(IADD) 연산은 MAD 파이프라인을 이용한다. IMAD 연산을 위해, MMAD 유닛(220)은 피승수를 피연산자 A로서, 승수를 피연산자 B로서 수신하며, 값 0(정수 0)이 유리하게도 피연산자 C로 제공된다. 이어서, 스테이지 4에서 스티키 비트 논리(914; 도 9)가 유리하게도 스티키 비트들 SB3를 통과시켜 곱이 라운딩될 수 있게 하는 점 외에는, 전술한 바와 같은 IMAD 연산을 실행하여 곱 A*B(+0)를 생성한다. 몇몇 실시예에서, 피연산자 C는 스테이지 4에서 조건부 제로 블록(920; 도 9)의 이용을 통해 0으로 강제될 수 있으며, 따라서 임의의 값이 피연산자 C로서 제공될 수 있다.
정수 가산(IADD)을 위해, MMAD 유닛(220)은 가산수들을 피연산자들 A 및 C로서 수신한다. 일 실시예에서, IMAD 연산은 피연산자 B를 1로 설정하여 (A*1)+C를 계산하도록 수행되는데, 피연산자 B를 1로 설정하는 것은 예를 들어 정수 1을 MMAD 유닛(220)에 피연산자 B로서 제공하거나, 예를 들어 레지스터(620) 또는 다른 레지스터로부터 부스3 인코딩된 정수 1을 선택하도록 전치 승산기 선택 mux(616; 도 6A)를 동작시킴으로써 이루어질 수 있다.
IADD의 대체 구현에 있어서, 피연산자 B는 0으로 설정되며(예를 들어, 정수 0을 MMAD 유닛(220)에 입력 피연산자로서 제공함으로써), 피연산자들 A 및 B는 합 A+0이 후치 승산기 블록(802) 내의 IP 가산기(804; 도 8A)에 의해 계산될 수 있는 스테이지 3으로 바이패스되거나, 다른 실시예에서 피연산자 A는 결과 R3a로서 IP 가산기(804) 주위로 바이패스될 수 있다. 후속 스테이지들은 IMAD 연산에 대해 A+C를 계산하도록 동작한다.
3. 절대차의 합: ISAD
정수에 대해, 절대차 합(ISAD) 연산이 지원된다. 이 연산은 |A-B|+C를 계산한다. 스테이지 0에서, 피연산자들 A, B 및 C가 수신되고, 피연산자 B는 인버터(519; 도 5)에 의해 반전되어 피연산자 ∼B가 생성된다. 이어서, 피연산자들은 스테이지 1 및 2를 통과한다.
스테이지 3에서, 후치 승산기 블록(418)은 IP 가산기(804; 도 8A)에서 A 및 ∼B를 더함으로써 A-B를 계산하며, 결과 R3a를 전송한다. 비교 논리 블록(436; 도 8B)에서, AB 부호 회로(820)는 A-B의 부호를 검출하고, 경로(821) 상에서 스테이지들 4 및 5로 전송되는 대응 부호 신호 Sab를 생성한다. 이진 테스트 논리(822)는 피연산자 C를 결과 R3b로서 전송하도록 선택 mux(824)를 제어한다.
스테이지 4에서, A-B의 절대값이 구해진다. 구체적으로, ISAD 연산을 위한 SwapCtl 신호는 결과 R3a(즉, A-B)는 작은 피연산자 경로(908)로 라우팅되며, 결과 R3b(즉, 피연산자 C)는 큰 피연산자 경로(910)로 라우팅되도록 스왑 mux(904, 906; 도 9)를 제어한다. 작은 피연산자 경로(908) 상의 조건부 인버터(918)는 AB 부호 회로(820)로부터 Sab 신호를 수신하고, 부호가 음인 경우 피연산자 (A-B)를 반전시킨다. 따라서, 결과 R4a는 음이 아닌 정수에 대응하고, 피연산자 C(양 또는 음의 정수일 수 있다)는 결과 R4b로서 전송된다.
스테이지 5에서, 플러스-1 가산기(1002)는 경로들로부터의 값들(R4a, R4b)을 더한다. Sab 신호에 기초하여, 라운딩 논리(1008)는 합 또는 합+1 출력을 선택하여 2의 보수 형태로 정확한 답을 제공한다. 구체적으로, A-B가 음이 아닌 경우, 결과는 합 출력인 (A-B)+C이어야 한다. A-B가 음인 경우, 결과는 2의 보수에서 C+∼(A-B)+1로서 표현되는 C-(A-B)인데, 이는 스테이지 4에서의 조건부 반전으로 인한 합+1 출력이다.
스테이지 6 및 7에서, 결과 R5는 다른 정수 산술 연산을 위해 통과된다. 몇몇 실시예에서, 스테이지 7(도 12)의 포맷팅 블록(1214)은 전술한 바와 같이 오버플로우를 검출하여 처리한다.
4. 비교 연산: IMIN, IMAX, ISET
전술한 바와 같이, 부동 소수점 비교들 FMIN, FMAX, FSET는 피연산자들을 정수로서 처리함으로써 실행될 수 있다. 따라서, 정수 비교 연산들 IMIN, IMAX 및 ISET의 구현은 Ⅲ장의 A.3 및 Ⅲ장의 A.4에서 전술한 부동 소수점 비교의 구현과 완전히 유사하다.
5. 조건부 선택 연산: ICMP
정수 조건부 선택 연산(ICMP)도 그의 부동 소수점 대응물과 완전히 유사하며, MMAD 유닛(220)에서의 이 연산의 처리는 Ⅲ장의 A.5에서 전술한 FCMP의 구현과 동일하다.
C. 비트 논리 연산
정수 및 부동 소수점 연산 기능들에 더하여, MMAD 유닛(220)은 또한 비트들이 표현할 수 있는 것을 참조하지 않고 그들의 피연산자들의 비트들을 조작하는 다양한 비트 논리 연산(도 3에 306으로 리스트됨)을 지원한다. 이들 연산은 비트 부울 연산들 AND, OR 및 XOR은 물론, 비트 시프팅 연산 SHL(좌측 시프트) 및 SHR(우측 시프트)을 포함한다.
1. 부울 연산: AND, OR, XOR
부울 연산은 주로 스테이지 1에서 비트 논리 블록(434)에 의해 처리된다. 이들 연산을 위해, MMAD 유닛은 2개의 32비트 피연산자들 A 및 B(피연산자 C는 무시되므로 임의의 값으로 설정될 수 있다), 및 원하는 부울 연산을 지시하는 연산 코드를 수신한다. 피연산자들은 스테이지 0을 통과한다.
스테이지 1에서, 비트 논리 블록(434)은 피연산자들 A 및 B를 수신하고, 논리 회로들(630, 632, 634; 도 6C)을 이용하여 피연산자들 A 및 B에 대해 비트 AND, OR 및 XOR 연산을 병렬로 실행한다. 선택 mux(636)는 어느 부울 연산이 요청되는지를 지시하는 OPCTL 신호를 수신하고, 대응 결과를 R1으로서 전송한다. 피연산자들 A 및 B는 스테이지 1의 전치 승산기 블록(416) 및 스테이지 2의 승산기 블록(414)을 통과할 수 있다.
스테이지 3에서, 비교 논리 블록(436)은 부울 연산 결과 R1을 결과 R3b로서 전송한다. 후치 승산기 블록(418)은 A 및 B를 더하거나, 단순히 A를 결과 R3a로서 전송할 수 있는데, 어느 경우에나 결과 R3a는 버려질 것이다.
스테이지 4에서, 스왑 mux들(904, 906; 도 9)은 결과 R3b를 작은 피연산자 경로(908) 상으로, 결과 R3a를 큰 피연산자 경로(910) 상으로 향하게 한다. 작은 피연산자 경로(908)에서, 결과 R3b(원하는 결과)는 수정 없이 결과 R4a로서 전송된다. 큰 피연산자 경로(910)에서, 조건부 제로 회로(920)는 OPCTL 신호에 응답하여 결과 R4b를 소거한다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 R4b(0)를 R4a(부울 연산 결과)에 더하며, mux(1010)는 합 결과를 결과 R5로서 선택한다. 스테이지 6에서, 결과 R6에는 어떠한 시프트도 적용되지 않는다. 스테이지 7에서, 결과 R6은 추가 수정 없이 최종 결과로서 전송되는데, 이들 연산에 대해서는 오버플로우 또는 다른 특수한 조건은 존재하지 않는다.
2. 비트 시프트 연산: SHL, SHR
MMAD 유닛(220)은 또한 비트 필드를 좌측으로 시프트하거나(SHL) 우측으로 시프트하는(SHR) 비트 시프트 연산을 수행한다. 두 연산을 위해, 시프트할 32비트 필드가 피연산자 A로서 MMAD 유닛(220)으로 제공되며, 유리하게도 피연산자 B의 fp32 지수 비트 위치들에 8비트 정수 값을 삽입함으로써 MMAD 유닛(220)에 시프트 양이 제공된다. 31보다 큰 시프트 양은 중요치 않으므로, 시프트 양 데이터를 보유하기 위해 8비트면 충분하다. 피연산자 B의 부호 및 소수 비트들은 이들 연산에 대해 무시되며, 따라서 피연산자 C와 같이 임의 값으로 설정될 수 있다.
SHL 연산은 스테이지 6(도 11)의 좌측 시프트 회로(1112)를 이용한다. 피연산자 A는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 5의 출력 R5로 통과된다. 병행하여, 시프트 양을 나타내는 피연산자 B의 지수부 Eb도 경로(443) 상에서 결과 EFE2로 지수 경로(415)를 통과한다. 구체적으로, 스테이지 1에서, 시프트 양 Eb는 선택 mux(628; 도 6B)의 연산에 의해 지수곱 블록(424)을 통해 바이패스된다. 스테이지 2에서, 차 블록(714; 도 7B)은 입력 Eab(Eb)를 출력 EFE로서 선택하도록 mux(716)에게 지시함으로써 OPCTL 신호에 응답한다. 지수 증가 블록(902)은 수정되지 않은 EFE 신호를 경로(443)으로 통과시킨다.
스테이지 6에서, 시프트 제어 블록(1110; 도 11)은 시프트 양 Eb를 경로(443) 상의 신호 EFE2로서 수신하고, 그 양을 반영하는 LshAmt 신호를 생성한다. 몇몇 실시예에서, 시프트 제어 블록(1110)은 Eb가 너무 큰 경우 LshAmt 신호를 예를 들어 31비트로 클램핑할 수 있다. LshAmt 신호에 응답하여, 좌측 시프트 회로(1112)는 피연산자 A(결과 R5)를 적절한 비트 수 만큼 좌측으로 시프트시켜, 유리하게도 필요에 따라 후미 0들을 삽입한다. 좌측 시프트된 결과 R6은 경로(426) 상으로 전송된다. 몇몇 실시예에서, 지수 감소 블록(432)은 시프트 양 신호 EFE2를 수정 없이 최종 지수 E0으로서 전송한다.
스테이지 7에서, 결과 R6은 유리하게도 수정 없이 최종 결과 OUT로서 제공된다. 몇몇 실시예에서, 스테이지 7은 또한 시프트 양이 31을 초과하는 경우 결과를 0으로 클램핑하기 위한 논리를 포함하는데, 이 논리는 시프트 양을 최종 지수 E0로서 수신할 수 있는 포화 논리(1216)에 포함될 수 있다.
SHR 연산은 스테이지 4(도 9)의 우측 시프트 회로(912)를 이용한다. SHR 연산은 0이 각각의 새로운 MSB에 삽입되는 논리 시프팅 모드와 부호 비트가 새로운 MSB로 확장되는 산술 시프팅 모드 둘 모두를 지원하도록 구현될 수 있으며, 연산 코드는 유리하게도 각각의 SHR 연산을 위한 모드를 선택한다.
전술한 바와 같이, 시프트할 피연산자는 피연산자 A로서 제공되며, 시프트 양은 fp32 피연산자 B의 지수 비트를 이용하여 제공된다. 피연산자 A는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 3의 출력(결과 R3a)을 통과한다.
병행하여, 시프트 양 Eb는 Rshift 카운트 회로(804)로 전송된다. 구체적으로, 스테이지 1에서, 시프트 양 Eb는 선택 mux(618; 도 6B)의 연산에 의해 지수곱 블록(424)을 통해 경로(431)로 바이패스된다. 스테이지 2에서, 차 블록(714; 도 7B)은 Eab를 차 Ediff로서 선택하도록 mux(716)에게 지시한다. EFE 신호는 무시될 수 있으며, 임의의 후보 값이 필요에 따라 선택될 수 있는데, 몇몇 실시예에서 Eab 값은 EFE 값으로서 제공된다.
스테이지 3에서, Rshift 카운트 회로(428)는 Ediff 신호(즉, Eb)에 대응하는 RshAmt 신호를 생성한다. RshAmt 신호는 예를 들어 31비트로 클램핑된다. 몇몇 실시예에서, Rshift 카운트 회로(408)는 수신한 OPCTL 신호에 기초하여, 논리 또는 산술 시프트가 요청되는지를 판정하고, 대응하는 "시프트 타입" 비트를 RshAmt 신호에 포함시킨다.
스테이지 4에서, 작은 스왑 mux(904; 도 9)는 피연산자 A를 작은 피연산자 경로(908) 상으로 향하게 한다. 큰 피연산자 경로(910) 상에서, 결과 R4b는 조건부 제로 회로(920)에 의해 0으로 된다. 작은 피연산자 경로(908) 상에서, 우측 시프트 회로(912)는 RshAmt 신호를 수신하고, 피연산자 A를 지정된 비트 수만큼 우측으로 시프트한다. 몇몇 실시예에서, 우측 시프트 회로(912)는 RshAmt 신호에서 시프트 타입 비트(논리 또는 산술)를 검출하며, 피연산자가 우측으로 시프트될 때 새로운 MSB에 0 또는 1을 적절히 삽입한다.
스테이지 5에서, 결과 R4a(우측 시프트된 피연산자 A)는 플러스-1 가산기(1002; 도 10)에 의해 R4b(0)에 더해지고, 결과 R5로서 선택된다. 스테이지 6에서, 결과 R5는 추가 수정 시프트 없이 정규화 블록(423)을 통과한다. 스테이지 7에서, 결과 R6은 유리하게도 수정 없이 최종 결과 OUT로서 사용된다. 몇몇 실시예에서, 스테이지 7도 시프트 양 Eb가 31을 초과하는 경우에 결과를 0으로 클램핑하기 위한 논리를 포함하는데, 이 논리는 좌측 시프트 연산에 대해 전술한 바와 같이 Eb를 수신할 수 있는 포화 논리(1216)에 포함될 수 있다.
D. 포맷 변환 연산
MMAD 유닛(220)은 또한 다양한 정수와 부동 소수점 포맷들 간의 변환을 지원한다. 몇몇 실시예에서, 포맷 변환은 전술한 산술 연산과 동시에 수행되지 않지만, 소정의 다른 연산들이 포맷 변환과 조합될 수 있다. 예를 들어, 다양한 변환 연산은 정수 N에 대한 2N에 의한 스케일링 및/또는 피연산자의 절대값 또는 부정의 결정과 조합될 수 있다. 다음 장들은 부동 소수점 포맷들 간의 변환 및 정수 포맷들 간의 변환을 설명한다.
1. 부동 소수점 대 부동 소수점 변환(F2F)
지원되는 부동 소수점 대 부동 소수점(F2F) 변환 연산은 fp16에서 fp32로, 그리고 그 반대로의 직접 변환을 포함하는데, 이러한 변환도 절대값, 부정 및/또는 2N 스케일링을 포함할 수 있다. 또한, fp16에서 fp16으로, 그리고 fp32에서 fp32로의 정수 라운딩 변환도 지원된다. 모든 경우에, 변환될 수치는 피연산자 A로서 MMAD 유닛(220)에 제공되며, 2N 스케일링이 행해지는 경우, 스케일 팩터 N은 fp32 피연산자 B의 8개 지수 비트를 이용하여 제공된다. fp16 및 fp32 포맷에 대해, 부호 비트가 제공되며, 절대값 및 부정은 부호 비트를 조작함으로써 구현될 수 있다. 이러한 조작은 이 분야에 공지되어 있으며 상세한 설명은 생략한다.
fp16에서 fp32로의 직접 변환은 스테이지 0(도 5)의 상향 컨버터(512)를 이용하여 피연산자 A의 fp32 표현을 생성한다. 상향 컨버터(512)는 fp32에 대응하도록 지수 바이어스를 조정하며(예를 들어, 127-15=112를 더함으로써), 13개의 후미 제로를 소수에 첨부한다. 이 변환은 피연산자 A가 fp16 디놈이 아닌 경우에는 정확하다. 스테이지 1에서, 특수 수치 검출 블록(414)은 피연산자 A가 fp16 디놈인지, INF인지, 또는 NaN인지를 판정하고, 경로 상의 적절한 신호 SPC를 생성한다.
피연산자 A의 가수부는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 5의 출력(결과 R5)으로 통과된다. 피연산자들 A 및 B의 지수부들 Ea, Eb는 각각 스테이지 1의 지수곱 블록(424)으로 전달되는데, 이 경우에 지수 Eb는 지수 스케일 팩터 N이다. 지수들 Ea 및 Eb는 지수곱 블록(424)에서 더해져, 2N 스케일링을 달성하며, 결과 Eab는 경로(431) 상으로 전송된다. 스테이지 2에서, 지수합 블록(426)은 결과 Eab를 유효 최종 지수 EFE로서 전송한다. 스테이지 3에서, Rshift 카운트 회로(428)는 제로 시프트를 위한 신호를 생성함으로써 OPCTL 신호에 응답하여, 경로(725) 상에 존재할 수 있는 임의의 Ediff 신호를 무시한다. 스테이지 4에서, 지수 증가 블록(430)은 지수 EFE를 수정 없이 경로(433) 상으로(EFE2로서) 전송한다.
스테이지 6은 fp16 디놈들을 처리하는데 사용되는데, 이들 모두는 fp32에서 정규 수치들로서 표현될 수 있다. 전술한 바와 같이, 디놈들은 최소 허용 지수를 갖고 가수에 함의된 정수 1을 갖지 않는 것으로 해석된다. 스테이지 6에서, 우선 순위 인코더(1108; 도 11)는 피연산자 A의 가수부에서 선두 1의 위치를 결정한다. 특수 수치 신호 SPC가 피연산자 A가 fp16 디놈인 것을 지시하는 경우, 시프트 제어 회로(1110)는 선두 1의 위치에 기초하여 LshAmt 신호를 생성하고, 그렇지 않은 경우에 시프트 제어 회로(1110)는 제로 시프트에 대응하는 LshAmt 신호를 생성한다. 우측 시프트 회로(1112)는 지정된 시프트를 가수 R5에 적용하여, 정규화된 가수 R6을 생성한다. 지수 감소 블록(432; 도 4)은 지수 EFE2를 대응하는 양만큼 감소시킨다.
스테이지 7은 입력이 fp16 INF 또는 NaN인 경우를 처리하는데 사용된다. 구체적으로, 특수 수치 신호 SPC가 그러한 값을 나타내는 경우, 최종 결과 선택 논리(1214; 도 12)는 정규 fp32 INF 또는 NaN 값을 적절히 선택한다. 또한, 2N 스케일링은 지수가 포화되게 할 수 있으므로, 포화 논리(1216)는 유리하게도 또한 그러한 포화를 검출하고 적절한 특수 수치(예를 들어, INF)의 최종 결과로서의 선택을 유발하는데 사용된다.
fp32에서 fp16으로의 직접 변환은 지수 형태를 8비트에서 5비트로, 유효수를 23비트에서 10비트로 줄이는 것을 포함한다. 유효수는 필요에 따라 라운딩되거나 절단될 수 있다. 이러한 라운딩은 스테이지 4(도 9)의 정렬 유닛(420) 및 스테이지 5(도 10)의 라운딩 논리(1008)를 이용한다. 피연산자 A의 가수부(바람직하게는 명시적 선두 1을 포함)는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 3의 출력(결과 R3a)으로 통과된다.
스테이지 1에서, 피연산자 A의 지수부 Ea는 지수곱 블록(424)을 통과하며, 전술한 바와 같이 피연산자 B의 지수부 Eb를 더함으로써 2N 스케일링이 적용될 수 있다. 결과 Eab는 경로(431) 상에 전송된다.
스테이지 2에서, 지수합 블록(426)은 예를 들어 차 회로(714; 도 7B)를 이용하여 112를 뺌으로써 지수를 fp16 바이어스로 리바이어싱하며, 결과를 유효 최종 지수 EFE로서 제공한다. 다른 실시예들에서, 리바이어싱도 바이어스 β 및 지수곱 블록(424; 도 6B)의 가산기(624)를 이용하여 수행될 수 있다. 또한, 지수합 블록(426)은 유리하게도 fp16 지수 오버플로우(INF 또는 NaN) 및 언더플로우(디놈들)를 검출한다. 오버플로우에 대해, 지수는 최대값으로 클램핑된다. 언더플로우에 대해, 지수합 블록(426)은 언더플로우의 양(예를 들어, 112-Eab)을 나타내도록 차 Ediff를 설정하고, 유효 최종 지수 EFE를 0(최소 지수)으로 설정한다. 언더플로우가 아닌 경우에 대해, 차 Ediff는 0으로 설정될 수 있다.
스테이지 3에서, Rshift 카운트 회로(428)는 Ediff 신호를 이용하여 적용할 우측 시프트 양을 결정하고, 적절한 RshAmt 신호를 생성한다. fp32 대 fp16 변환에 대해, 디폴트 시프트는 13비트이다(따라서, 결과 R4a의 11 LSB가 fp16 가수를 갖는다). 차 Ediff는 이 디폴트 값에 더해지며, 따라서 fp16 디놈들은 최대 24비트 우측으로 시프트될 수 있다. 24비트보다 많은 시프트는 fp16 제로를 도출하며, 따라서 Rshift 카운트 회로(804)는 이 연산에 대해 시프트 양을 24비트로 클램핑할 수 있다.
스테이지 4에서, 스왑 mux(904; 도 9)는 피연산자 A의 가수를 작은 피연산자 경로(908) 상으로 향하게 한다. 큰 피연산자 경로(910) 상에서, 결과 R4b는 조건부 제로 유닛(920)에 의해 0으로 된다. 작은 피연산자 경로(908) 상에서, 우측 시프트 회로(912)는 RshAmt 신호에 따라 가수를 우측으로 시프트하며, 스티키 비트 논리(914)는 유리하게도 스티키 비트들 SB4를 생성한다.
스테이지 5에서, 결과 R4a(피연산자 A의 가수)는 플러스-1 가산기(1002; 도 10)에 의해 R4b(0)에 더해진다. 라운딩 논리(1008)는 스티키 비트들 SB4를 수신하고, 원하는 라운딩 모드에 따라 합과 합+1 출력들 사이에서 선택하는데, 다른 연산들에서와 같이, 임의의 IEEE 라운딩 모드가 선택될 수 있다. 라운딩 논리(1008)에 의해 선택된 결과 R5a는 경로(1011) 상으로 전송된다.
스테이지 6에서, 정규화 블록(423)은 결과 R5를 수정 없이 통과시킨다.
스테이지 7에서, 포맷 블록(1210; 도 12)은 최종 지수 E0 및 가수 R6을 이용하여 fp16 결과를 포맷한다. 지수 포화 논리(1216)는 fp16 지수 오버플로우를 검출하며, 최종 결과 선택 논리(1214)는 결과를 fp16 INF로 오버라이딩함으로써 오버플로우에 응답한다. 또한, 스테이지 1에서 특수 수치 검출 블록(438)에 의해 검출된 fp32 INF 또는 NaN 입력들은 fp16 INF 또는 NaN이 출력되게 할 수 있다.
F2F 정수 라운딩 연산들은 입력 포맷 및 출력 포맷이 동일한 경우(fp32 대 fp32 또는 fp16 대 fp16)에 대해 구현된다. 정수 라운딩은 피연산자에 의해 표현되는 수치의 소수부를 제거하며, 라운딩은 임의의 표준 IEEE 라운딩 모드(최고, 최저, 절단 및 최근접)를 이용할 수 있다. fp32 대 fp16 변환에서와 같이, MMAD 유닛(220)은 스테이지 4의 우측 시프트 회로(912) 및 스테이지 5의 라운딩 논리(1008)를 이용하여 정수 라운딩을 지원한다. 2N 스케일링은 이 연산과 조합될 수 있다.
피연산자 A의 가수는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 3의 출력(결과 R3a)으로 통과된다. 정수 라운딩을 지원하기 위하여, 스테이지 1 및 2의 지수 논리는 이진 소수점의 위치를 결정하는데 사용된다. 스테이지 1에서, 임의의 2N 스케일링을 적용하는 것 외에도, 지수곱 블록(424; 도 6B)은 또한 바이어스 β(예를 들어, fp32에 대해 127 또는 fp16에 대해 15)를 감산하고, 결과를 Eab로서 제공한다. 결과 Eab가 0보다 작은 경우, 그 수치는 순수한 소수이다. 스테이지 2에서, 지수합 블록(426)은 결과 Eab를 경로들 725(신호 Ediff로서) 및 723(신호 EFE로서)에 제공한다.
스테이지 3에서, Rshift 카운트 회로(428)는 신호 Ediff에 기초하여 우측 시프트 양 RshAmt를 결정한다. 시프트 양은 유리하게도, 시프트된 가수에 대해 참의 이진 소수점이 바로 LSB의 우측에 있도록 선택된다. 예를 들어, fp32 입력에 대해, 시프트 양은 Eab≤23에 대해 (23-Eab)이고, Eab>23에 대해 0 비트일 것이다. Rshift 카운트 회로(428)는 이 양을 계산하고, 적절한 RshAmt 신호를 정렬 블록(420)에 제공한다.
스테이지 4에서, 작은 스왑 mux(904; 도 9)는 피연산자 A를 작은 피연산자 경로(908)로 지향시키며, 큰 피연산자 경로(910) 상에서, 조건부 제로 회로(920)는 결과 R4b를 소거한다. 작은 피연산자 경로(908)에서, 우측 시프트 회로(912)는 RshAmt 신호에 따라 우측 시프트를 수행하며, 스티키 비트 논리(914)는 스티키 비트들 SB4를 생성한다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 결과 R4a(피연산자 A의 가수)와 R4b(0)를 더하고, 라운딩 논리(1008)는 라운딩 모드 및 경로(504) 상의 스티키 비트들에 기초하여 합 및 합+1 결과들 중에서 선택한다.
스테이지 6에서, 결과 R5는 입력 포맷으로 다시 재정규화된다. 우선 순위 인코더(1108; 도 11)는 선두 1의 위치를 검출하고, 시프트 제어 회로(1110)는 가수를 적절한 비트 수만큼 좌측으로 시프트하여 후미 제로들을 삽입하도록 좌측 시프트 회로(1112)에게 지시하는 대응 LshAmt 신호를 생성한다. 지수 감소 블록(432; 도 4)은 유리하게도 LshAmt 신호를 무시하고 지수 EFE2를 수정 없이 최종 지수 E0로서 제공하도록 구성된다.
스테이지 7에서, 결과는 포맷되어 출력으로서 전송된다. 유리하게도, 2N 스케일링이 포화를 유도할 수 있으므로 지수 포화 논리(1216)가 동작한다. 전술한 바와 같이, 특수 수치 입력들(예를 들어, INF 또는 NaN)이 검출되고 대응하는 특수 수치 결과들이 반환될 수 있다.
2. 부동 소수점 대 정수 변환(F2I)
부동 소수점 대 정수(F2I) 변환은 전술한 정수 라운딩 F2F 변환과 마찬가지로 MMAD 유닛(220)에서 구현된다. 변환될 부동 소수점 수는 fp16 또는 fp32 포맷으로 피연산자 A로서 MMAD 유닛(220)에 제공된다. 전술한 바와 같이 fp32 피연산자 B의 지수 비트들에서 스케일링 파라미터 N을 제공함으로써 2N 스케일링이 구현될 수 있다. 일 실시예에서, 타겟 정수 포맷은 16 또는 32비트이고, 부호를 갖거나 갖지 않을 수 있으며, 타겟 포맷은 연산 코드를 통해 지정될 수 있다.
스테이지 0에서, 피연산자 A가 fp16 포맷인 경우, 상향 컨버터(512; 도 5)는 전술한 바와 같이 피연산자 A를 fp32 포맷으로 승진시킨다. 절대값 및 부정도 이 스테이지에서 적용될 수 있다. 절대값에 대해, 부호 비트는 양으로 설정된다. 부정에 대해, 부호 비트는 플립된다. 적용 가능한 부정 후에, 부호 비트가 음이고, 부호를 가진 정수 표현이 요청되는 경우, 가수부가 조건부 인버터(518)에 의해 반전되며, 음의 결과를 요청하는 부호 제어 신호(도 4에 도시되지 않음)도 전송된다.
스테이지 1-4는 F2F 정수 라운딩 변환에 대해 전술한 바와 같이 진행되는데, 스테이지 3의 Rshift 제어 회로(428)는 가수가 우측으로 시프트될 때 LSB의 바로 우측에 이진 소수점을 배치하는 시프트 양 RshAmt를 생성하며, 스테이지 4의 우측 시프트 회로(912; 도 9)는 시프트를 적용하는데 사용된다. 스티키 비트 논리(914)는 스티키 비트들 SB4를 생성할 수 있다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 결과들 R4a(피연산자 A의 가수) 및 R4b(0)를 더하여, 합 및 합+1 출력을 생성한다. 라운딩 논리(1008)는 적용 가능한 라운딩 모드, 및 부호를 가진 정수 포맷들에 대해 스테이지 0으로부터의 부호 제어 신호가 적절한 2의 보수 표현이 얻어지도록 음의 결과를 나타내는지의 여부에 기초하여 이들 중에서 선택한다.
스테이지 6에서, 우측 시프트된 가수 R5는 수정 없이 통과된다.
스테이지 7에서, 지수 포화 논리(1216; 도 12)는 입력 부동 소수점 값이 타겟 정수 포맷에서의 최대값을 초과하는지를 판정한다. 그러한 경우, 결과는 최종 결과 선택 논리(1214)에 의해 최대값(예를 들어, 모든 비트가 1로 설정됨)으로 클램핑될 수 있다. 입력 피연산자가 INF인 경우, 출력은 최대 정수값으로 클램핑될 수 있으며, 마찬가지로 입력 피연산자가 NaN인 경우, 출력도 원하는 값, 예를 들어 0으로 클램핑될 수 있다. 적절히 포맷된 정수가 최종 결과 OUT로서 전달된다. 32 미만의 비트를 가진 정수 포맷에 대해, 결과는 필요에 따라 32비트 필드 내에서 우측 정렬 또는 좌측 정렬될 수 있다.
3. 정수 대 부동 소수점 변환(I2F)
일 실시예에서, 정수 대 부동 소수점(I2F) 변환 연산은 부호를 갖거나 갖지 않는 임의의 정수 포맷을 fp32로 변환하고, 부호를 갖거나 갖지 않는 8비트 및 16비트 포맷을 fp16으로 변환하기 위해 지원된다. 다른 변환에서와 같이, 선택적 부정, 절대값 및 2N 스케일링이 지원된다. 전술한 바와 같이, 피연산자 A는 정수 포맷으로 MMAD 유닛(220)에 제공되고, 스케일링 파라미터 N은 부동 소수점 피연산자 B의 지수 비트들에서 제공될 수 있다.
스테이지 0에서, 피연산자 A는 상향 컨버터들(504, 508; 도 5)에 의해 필요에 따라 32비트로 상향 변환된다. 상향 변환은 부호 확장 또는 제로 확장을 이용한다. 피연산자 A가 음인 경우, 이는 조건부 인버터(518)에 의해 반전되며, A가 반전되었는지를 나타내는 부호 제어 신호가 전송된다. 이 신호는 부동 소수점 결과의 부호 비트를 설정하는데 사용될 수 있다. (절대값이 요청되는 경우, 부호 비트는 항상 그의 양의 상태로 설정된다.)
부동 소수점 수에 대한 지수는 231에 대응하도록 초기화된 후, 정수에서 선두 1의 실제 위치에 기초하여 하향 조정된다. 가수에 대해, 정수의 32비트는 부동 소수점 가수 필드에 정수를 맞추는데 필요한 정도로 우측 시프트된다(fp32의 경우에 24비트, fp16의 경우에 11비트). 구체적으로, 우측 시프팅은 정수의 8 MSB 중 어떠한 것도 0이 아닌 경우에 32비트 정수에서 fp32로의 변환 동안에, 그리고 정수의 5 MSB 중 어떠한 것도 0이 아닌 경우에 16비트 정수에서 fp16으로의 변환 동안에 수행된다. 우측 시프팅이 발생하는 경우, 부동 소수점 결과는 임의의 IEEE 라운딩 모드를 이용하여 라운딩될 수 있다.
보다 구체적으로, 스테이지 1에서, I2F 바이트 회로(444)는 입력 포맷에 기초하여 피연산자 A로부터 8개의 MSB를 추출한다. 32비트 정수 입력들에 대해, 32비트 필드의 8개 MSB가 추출되고, 32비트 필드에서 우측 정렬되는 16비트 정수 포맷들에 대해, 32비트 필드의 처음 16 비트가 제거되며, 다음 8개 MSB가 추출된다. 8비트 정수들에 대해서는 최종 8비트가 추출될 수 있지만, 명백해지는 바와 같이, I2F 바이트 회로(444)의 결과는 8비트 정수 입력에 대해 사용되지 않는다. 전술한 바와 같이, I2F 바이트 회로(444)도 나머지 비트들이 모두 1인지를 테스트하는 AND 트리를 포함하며, 이 테스트의 결과(신호 And24)는 경로(437) 상에서 전송된다. 병행하여, 지수곱 블록(424)은 신호 Eab를 31 플러스 fp16(15) 또는 fp32(127)에 대한 적절한 바이어스로 설정한다. 2N 스케일링이 사용되는 경우, 전술한 바와 같이, 지수곱 블록(424)은 또한 스케일링 파라미터 N을 더한다.
스테이지 2에서, 지수합 블록(426; 도 7B)의 우선 순위 인코더(718)는 피연산자 A의 MSB들 내의 선두 1의 위치를 결정한다. 차 회로(714)는 우선 순위 인코더의 결과를 지수차 Ediff로서, 지수 Eab를 유효 최종 지수 EFE로서 선택한다. 몇몇 실시예에서, 차 회로(714)는 신호 And24를 이용하여, 2의 보수를 얻기 위해 피연산자에 1을 더하는 것이 8개 MSB 중에서 0이 아닌 비트를 생성하는지를 판정하고, 우선 순위 인코더 결과를 적절히 조정한다. 유사한 논리도 우선 순위 인코더(718) 내에 포함될 수 있다. 피연산자 A는 Ⅱ장의 J에서 전술한 바와 같이 승산기 블록(414)의 출력(결과 R2a)으로 바이패스된다.
스테이지 3에서, 피연산자 A가 스테이지 0에서 반전된 경우(이는 전술한 부호 제어 신호로부터 판정될 수 있다), 피연산자 B는 mux(812; 도 8A)를 이용하여 1로 강제되고, 2의 보수 반전을 달성하기 위하여 IP 가산기(804)에 의해 피연산자 A에 더해진다. 그렇지 않은 경우, 피연산자 A는 경로(421)로 바이패스된다. 따라서, 결과 R3a는 fp16 또는 fp32 포맷의 가수에 대해 필요에 따라 양으로 보증된다.
또한, 스테이지 3에서, Rshift 카운트 회로(428)는 신호 Ediff를 이용하여 가수가 우측으로 시프트되어야 하는지를 판정하고, 그러한 경우 시프트 양을 결정한다. 우측 시프팅은 유리하게도, 정수를 표현하는데 필요한 비트 수(선두 제로를 포함)가 부동 소수점 포맷에서의 유효수 비트들의 수를 초과하는 경우에 사용된다. 예를 들어, 32비트 정수 포맷에서 fp32로의 변환 동안, 선두 1이 제1 내지 제8 비트 위치들 중 임의의 위치에 있는 경우에 가수는 우측으로 시프트되어야 하며, 16비트 정수 포맷에서 fp16으로의 변환 동안, 선두 1이 제1 내지 제5 비트 위치들 중 임의의 위치에 있는 경우에 가수는 우측으로 시프트되어야 한다. 전술한 바와 같이, 우선 순위 인코더(718)로부터 출력되는 신호 Ediff는 이 정보를 반영하며, Rshift 카운트 회로(428)는 적절한 신호 RshAmt를 생성한다.
스테이지 4에서, 작은 스왑 mux(904; 도 9)는 가수(결과 R3a)를 작은 피연산자 경로(908) 상으로 향하게 한다. 우측 시프트 회로(912)는 RshAmt 신호에 따라 가수를 우측으로 시프트한다. 스티키 비트 논리(908)는 스티키 비트들 SB4를 생성한다. 큰 피연산자 경로(910) 상에서, 조건부 제로 회로(920)는 결과 R4b를 소거한다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 결과들 R4a(지수) 및 R4b(0)를 더하며, 라운딩 논리(1008)는 라운딩 모드 및 스티키 비트들 SB4에 기초하여 합 및 합+1 출력들 중에서 선택한다.
스테이지 6에서, 가수 R5는 부동 소수점 표현으로 정규화된다. 정규화 블록(423)은 선두 1을 MSB 위치에 배치하기 위해 가수를 좌측으로 시프트하며, 지수 감소 블록(432)은 이에 대응하여 지수 E0를 하향 조정한다.
스테이지 7에서, 가수 R6 및 지수 E0는 포맷 블록(1210; 도 12)에 의해 fp32 또는 fp16 수치로 포맷되며, 최종 선택 mux(1212)로 제공된다. 포환 논리(1216)는 활성적일 수 있으며, 포화는 몇몇 경우에, 예를 들어 u16에서 fp16으로의 변환에서 발생할 수 있다. 포화가 발생하는 경우, 적절한 부동 소수점 포맷의 오버플로우 값(예를 들어, INF)이 선택될 수 있다.
이 실시예에서는 우선 순위 인코더(718; 도 7B)가 8비트 인코더이므로 32비트 정수에서 fp16으로의 I2F 변환이 지원되지 않음에 유의해야 한다. 본 기술분야의 숙련자들은 우선 순위 인코더의 크기는 설계 선택의 문제이며, 이러한 변환은 보다 큰 우선 순위 인코더(예를 들어, 21비트)를 제공함으로써 지원될 수 있다는 것을 인식할 것이다.
다른 실시예에서, 우선 순위 인코더(718)는 2의 보수 반전이 수행된 후에 파이프라인 내의 소정의 포인트로(예를 들어, IP 가산기(804)의 뒤) 이동될 수 있다. 이 경우, AND 트리는 플러스 1 연산의 결과를 검출할 필요가 없을 것이다.
4. 정수 대 정수(I2I) 변환
정수 대 정수(I2I) 변환 연산은 부호를 가진 포맷에서 부호를 갖지 않는 포맷으로, 그리고 그 반대의 변환을 포함하는 임의 정수 포맷을 임의의 다른 정수 포맷으로 변환하기 위해 지원된다. 부정(2의 보수) 및 절대값 옵션들이 지원된다.
이 실시예에서, I2I 변환에서의 오버플로우를 처리하기 위해 다음의 규칙들이 적용된다. 첫째, 부호를 가진 포맷에서 부호를 갖지 않는 포맷으로의 변환을 위해, 모든 음의 값은 0으로 클램핑된다. 둘째, 보다 큰 포맷(즉, 보다 많은 비트를 가진 포맷)에서 보다 작은 포맷(즉, 보다 적은 비트를 가진 포맷)으로의 변환을 위해, 오버플로우는 보다 작은 포맷에서의 최대 허용값으로 클램핑된다. 셋째, 보다 작은 포맷에서 보다 큰 포맷으로의 변환을 위해, 양의 값들은 제로 확장되며, 부호를 가진 보다 큰 포맷으로의 변환을 위해 부호 확장이 이용된다.
스테이지 0에서, 피연산자 A가 수신된다. 입력 포맷이 32비트보다 작은 경우, 피연산자 A는 부호 확장(또는 부호 없는 입력 포맷에 대해서는 제로 확장)을 이용하여 32비트(도 5 참조)로 상향 변환된다. 이어서, 피연산자 A는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 3의 출력(결과 R3a)으로 통과된다. 스테이지 4에서, 작은 스왑 mux(904; 도 9)는 피연산자 A를 작은 피연산자 경로(908)로 지향시키며, 큰 피연산자 경로(910) 상에서, 조건부 제로 회로(920)는 결과 R4b를 제로로 만든다. 작은 피연산자 경로(908)에서, 조건부 인버터(918)는 부정 또는 절대값이 요청되었는지의 여부, 그리고 절대값의 경우에는 피연산자 A가 양인지 음인지에 기초하여 피연산자 A를 반전시키거나 반전시키지 않는다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 R4a(피연산자 A) 및 R4b(0)을 더한다. 피연산자 A가 스테이지 4에서 반전된 경우, 합+1 출력이 선택되며, 따라서 결과는 2의 보수 형태이다. 결과 R5는 수정 없이 스테이지 6을 통과한다.
스테이지 7에서, 출력은 포맷팅 블록(1210; 도 12)에서 포맷된다. 부호를 갖는 보다 큰 포맷으로의 변환을 위해, 포맷팅 블록(1210)은 유리하게도 부호 확장을 적용한다. 포맷팅 블록(1210)은 또한 결과를 주어진 포맷에 대해 허용되는 최대 정수로 클램핑하는데, 예를 들어 양의 수치들에 대해, 타겟 포맷의 MSB 위치의 좌측에 1들이 존재하는 경우, 출력은 모두 1로 설정된다.
5. 소수(FRC) 연산
소수(FRC) 연산은 부동 소수점(예를 들어, fp32) 피연산자 A의 소수부를 반환한다. FRC 연산을 위해, MMAD 유닛(220)은 피연산자 A의 지수부를 이용하여 피연산자 A의 가수 내의 이진 소수점의 위치를 결정하고, 이진 소수점의 좌측에 있는 모든 비트(정수 비트들)를 0으로 설정하고 이진 소수점의 우측에 있는 비트들(소수 비트들)을 유지하는 마스크를 적용한다.
스테이지 0에서, 부동 소수점(예를 들어, fp16 또는 fp32) 피연산자 A가 수신되고, 필요에 따라 fp32로 상향 변환될 수 있다. 피연산자 C는 모두 0인 필드로서 입력된다(또는 강제될 수 있다). 피연산자 A는 Ⅱ장의 J에서 전술한 바와 같이 스테이지 3의 출력(결과 R3a)으로 통과된다.
스테이지 1에서, 피연산자 A가 통과되고 있는 동안, 비트 논리 블록(434) 내의 조건부 인버터(635; 도 6C)는 피연산자 C를 반전시켜 모두 1인 필드를 얻으며, 선택 mux(636)는 이 필드를 결과 R1으로서 선택한다. 다른 실시예들에서, 선택 mux(636) 또는 다른 회로는 예를 들어 적절한 레지스터(도시되지 않음)로부터 모두 1인 필드를 선택하는데 사용될 수 있다. 결과 R1(모두 1인 필드)은 Ⅱ장의 J에서 전술한 바와 같이 스테이지 3의 출력(결과 R3b)으로 통과된다.
또한, 스테이지 1에서, 지수곱 블록(424)은 피연산자 A의 지수부 Ea로부터 지수 바이어스(예를 들어, fp32 피연산자들에 대해 127)를 감산하며, 이 값을 지수 Eab로서 전송한다. 스테이지 2에서, 지수합 블록(426)은 Eab를 지수차 Ediff로서, 그리고 유효 최종 지수 EFE로서 제공한다.
스테이지 3에서, Rshift 카운트 회로(428)는 A의 바이어스되지 않은 지수(Eab) 및 결과들 R3a 및 R3b를 각각 큰 피연산자 경로 및 작은 피연산자 경로 상으로 지향시키기 위한 적절한 SwapCtl 신호들에 기초하여 시프트 신호 RshAmt를 생성한다.
스테이지 4에서, 큰 스왑 mux(906; 도 9)는 피연산자 A(결과 R3a)를 큰 피연산자 경로(910) 상으로 지향시키며, 작은 스왑 mux(904)는 1들의 필드(결과 R3b)를 작은 피연산자 경로(908) 상으로 향하게 한다. 우측 시프트 회로(912)는 RshAmt 신호에 응답하여 1들의 필드를 우측으로 시프트함으로써 마스크를 형성하는데, 유리하게도 논리 우측 시프트가 사용된다. 마스크는 경로(909) 상의 결과 R4a로서 조건부 인버터(918)를 통과한다. 피연산자 A의 바이어스되지 않은 지수가 0 또는 음인 경우, RshAmt 신호는 유리하게도 제로 시프트에 대응한다는 점에 유의해야 한다. 양의 지수들에 대해, 0이 아닌 시프트가 적절하며, 시프트는 예를 들어 24비트로 제한될 수 있다.
큰 피연산자 경로(910)는 피연산자 A를 수정 없이 경로(911) 상에 결과 R4b로서 통과시킨다. 병행하여, 지수 증가 블록(430; 도 4)은 유효 최종 지수 EFE를 수정 없이 EFE2로서 통과시킨다.
스테이지 5에서, AND2 회로(1004; 도 10)는 마스크 R4a를 피연산자 A(R4b로서 수신됨)에 적용하도록 동작한다. 마스크는 피연산자 A의 정수 비트들을 소거하며, 소수 비트에는 영향을 미치지 않는다. 선택 mux(1010)는 A의 소수 비트들인 AND2 회로(1004)로부터의 출력을 선택한다.
스테이지 6에서, 정규화 블록(423)은 결과 R5를 우선 순위 인코딩하고 정규화하며, 지수 감소 블록(432)은 유효 최종 지수 EFE2에 대해 대응하는 조정을 행하여 최종 지수 E0를 얻는다.
스테이지 7에서, 지수 E0을 포함하는 결과 R6이 포맷 블록(1210; 도 12)에 의해 fp32(또는 fp16) 수치로서 포맷되고, 선택을 위해 최종 선택 mux(1212)로 제공된다. 피연산자 A가 INF 또는 NaN인 경우에 계산된 결과를 오버라이드하기 위해 필요에 따라 특수 수치 논리가 사용될 수 있다.
E. 도메인 맵핑(RRO)
독립 변수 감소 또는 범위 감소 연산(RRO)이라고도 하는 도메인 맵핑 연산도 MMAD 유닛(220)에서 구현된다. 이들 연산은 예를 들어 도 2의 다른 기능 유닛들(222) 중 하나로서 구현될 수 있는 개별 산술 유닛에서 다양한 초월 함수의 계산을 지원한다. 일 실시예에서, MMAD 유닛(220)은 삼각 함수들(예를 들어, sin(x) 및 cos(x)) 및 지수 함수(2x)의 부동 소수점 독립변수 x를 경계 범위로 감소시키는 도메인 맵핑 연산을 수행한다. 따라서, RRO에 대해, MMAD 유닛(220)으로의 입력은 피연산자 A로서 제공된 fp32 수치 x이다. 출력은 후술하는 바와 같이 특수 32비트 포맷이다.
1. 삼각 함수에 대한 RRO
sin(x) 및 cos(x)를 계산하는 기능 유닛들은 일반적으로 독립 변수 x를 먼저 2πK+x0(여기서, K는 정수이고, 0≤x0<2π)로 줄일 것을 요구함으로써 이들 함수의 주기성을 이용한다. 이어서, 삼각 함수는 x0를 이용하여 계산될 수 있다. 몇몇 구현에 있어서, x0는 소수 xR=x0/2π로서 지정되는데, 여기서 0≤xR<1이다.
본 발명의 일 실시예에서, MMAD 유닛(220)은 MMAD 파이프라인의 승산 스테이지들(도 4의 스테이지 1-3)을 이용하여 1/2π에 의한 부동 소수점 승산을 실행하고, 나머지 스테이지들을 이용하여 결과의 소수부를 추출함으로써 삼각 RRO에 대한 xR을 계산한다. 승산의 유한 수치 정밀도로 인하여, 결과는 근사치이지만, 이 근사치는 일반적으로 매우 큰 x 값이 발생하지 않는 응용들(예를 들어, 그래픽)에 적합하다.
삼각 RRO의 출력은 부호 비트, 1비트 특수 수치 플래그, 5개의 역 비트 및 25개의 소수 비트를 포함하는 특수 32비트 고정 소수점 포맷으로 제공된다. 특수 수치 플래그가 논리적 참으로 설정되는 경우, 결과는 특수 수치이며, 역 또는 소수 비트들의 일부 또는 모두는 특수 수치(예를 들어, INF 또는 NaN)를 나타내는데 사용될 수 있다.
스테이지 0에서, 독립 변수 x는 fp32 포맷의 피연산자 A0로서 제공되고, 피연산자 A로서 통과된다.
스테이지 1에서, 지수곱 블록(424)은 피연산자 A의 지수부 Ea를 지수 Eab로서 통과시킨다. 전치 승산기 회로(416)에서, 멀티플렉서(616; 도 6A)는 레지스터(618)로부터 저장된 1/2π의 부스3 인코딩된 표현을 경로 BB 상의 승수로서 선택한다.
스테이지 2에서, 지수합 블록(426)은 지수 Ea를 유효 최종 지수 EFE 및 차 Ediff로서 선택한다. 승산기 블록(614)은 A*(1/2π)를 계산하고, 곱에 대한 합 및 캐리를 결과들 R2a 및 R2b로서 제공한다.
스테이지 3에서, Rshift 카운트 회로(428)는 신호 Ediff로부터, 고정 소수점 결과에 대해 이진 소수점을 적절히 정렬하기 위하여 우측 시프트가 수행되어야 하는지를 판정한다. 예를 들어, 지수가 음인 경우에 우측 시프트가 필요할 수 있다. 우측 시프트가 필요한 경우, Rshift 카운트 회로(428)는 적절한 시프트 양 신호 RshAmt를 제공한다. 또한, 스테이지 3에서, IP 가산기(804; 도 8A)는 합 및 캐리 필드들(R2a, R2b)을 더하여 곱을 생성한다. 상위 32비트는 mux(814)에 의해 결과 R3a로서 선택된다. 스티키 비트 논리(808)는 나중에 라운딩에서 사용하기 위해 스티키 비트들 SB3를 생성할 수 있다.
스테이지 4에서, 지수 증가 블록(430)은, 전술한 FMUL 및 FMAD 연산 동안 행해지는 바와 같이, 필요에 따라 지수를 조정하여 IP 가산기(804)에서 캐리들을 반영한다. 정렬 유닛(420)에서, 작은 스왑 mux(904; 도 9)는 곱 R3a를 작은 피연산자 경로(908) 상으로 지향시키는데, 여기서 Rshift 카운트 회로(428)에 의해 결정된 임의의 우측 시프트가 우측 시프트 회로(912)에 의해 적용된다. 결과 R4a는 경로(909)로 전송된다. 우측 시프트가 적용되는 경우, 스티키 비트 논리(914)는 새로운 스티키 비트들 SB4를 생성할 수 있으며, 그렇지 않은 경우에 스티키 비트 논리(914)는 스티키 비트들 SB3를 스티키 비트들 SB4로서 전송할 수 있다. 큰 피연산자 경로(910)에서, 조건부 제로 유닛(920)은 결과 R4b를 소거한다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 결과들 R4a(곱) 및 R4b(0)를 더한다. 몇몇 실시예에서, 라운딩 논리(1008)는 사용되지 않으며, 다른 실시예들에서 라운딩 논리(1008)는 경로로부터의 스티키 비트들 SB4 상에 작용할 수 있다. (RR0는 근사적이므로, 라운딩은 반드시 결과의 정확도를 향상시키는 것은 아니다.)
스테이지 6에서, 정규화 블록(423)은 필요에 따라 좌측 시프트를 적용하여 이진 소수점을 적절히 찾는다(예를 들어, 지수가 양인 경우). 경로 상의 유효 최종 지수 EFE2는 좌측 시프트 양을 결정하기 위해 시프트 제어 회로(1110)에 의해 사용되며, 시프트는 좌측 시프트 회로(1112)에 의해 수행된다. 이 시프트된 결과 R6은 경로(425) 상에 제공된다. 지수 감소 블록(432)은 이에 대응하여, 지수가 스테이지 7에서 무시될지라도 필요에 따라 최종 지수 E0를 감소시킬 수 있다.
스테이지 7에서, 경로 상의 결과 R6으로부터의 부호 비트 및 25 비트가 전술한 포맷으로 최종 32비트 결과 Rdata를 생성하기 위해 포맷 블록(1210; 도 12)에 의해 사용된다. 결과 Rdata 내의 특수 수치 플래그는 유리하게도 스테이지 1의 특수 수치 검출 블록(439)으로부터의 특수 수치 신호 SPC에 응답하여 설정되는데, 특수 수치가 검출되는 경우, 소수 비트들 또는 역 비트들 중 일부는 특수 수치를 나타내는데 사용될 수 있다.
2. 지수 함수 EX2에 대한 RRO
이 분야에 공지된 바와 같이, 기수 2의 지수 함수(EX2(x)=2x)는 x=M+f(여기서, M은 정수이고, f는 구간 [0.0, 1.0] 내에 있다)를 분해한 후 2M*2f를 계산함으로써 산술 기능 유닛에서 구현될 수 있다. 2M의 계산은 명백하며(비트 시프팅 또는 지수 가산), 2f의 계산은 탐색표를 이용하여 수행될 수 있다.
일 실시예에서, MMAD 유닛(220)은 독립변수 x의 소수부를 추출함으로써 EX2 함수에 대한 RRO를 수행한다. 이 RRO는 F2F 변환의 상황에서 전술한 정수 라운딩 연산과 다소 유사하지만, 이 경우에는 이진 소수점 우측의 비트들은 유지된다.
지수 RRO의 출력은 부호 비트, 1비트 특수 수치 플래그, 7개의 정수 비트 및 23 소수 비트를 가진 특수 32비트 포맷이다. 특수 수치 플래그가 논리적 참으로 설정되는 경우, 결과는 특수 수치이며, 정수 또는 소수 비트들의 일부 또는 모두는 특수 수치를 나타내는데 사용될 수 있다.
스테이지 0에서, 독립 변수 x는 fp32 포맷의 피연산자 A0로서 MMAD 유닛에 제공되며, 피연산자 A로서 통과된다.
스테이지 1에서, 지수곱 블록(424)은 지수 Ea에서 127(fp32 바이어스)을 빼서 결과 Eab를 생성한다. 후술하는 바와 같이, 결과 Eab는 후속 스테이지들에서 이진 소수점을 정렬하는데 사용되며, 따라서 그의 우측에 23비트가, 좌측에 7비트가 존재하게 된다. 전치 승산기 회로(416; 도 6A)에서, 레지스터(620)로부터의 1.0의 부스3 인코딩된 표현이 mux(616)에 의해 선택된다.
스테이지 2에서, 지수합 블록(426)은 Eab를 유효 최종 지수 EFE 및 차 Ediff로서 통과시킨다. 승산기 블록(414)은 피연산자 A에 1.0을 곱하고, 곱에 대한 합 및 캐리 필드들을 결과들 R2a 및 R2b로서 제공한다.
스테이지 3에서, Rshift 카운트 회로(428)는 차 신호 Ediff로부터, 예를 들어 Ediff가 음인지 양인지에 기초하여, 이진 소수점을 정렬하는데 우측 시프트가 필요한지를 판정한다. 우측 시프트가 필요한 경우, Rshift 카운트 회로(428)는 RshAmt 신호를 생성하여, Ediff의 크기로부터 결정되는 시프트 양을 반영한다. 또한, 스테이지 3에서, IP 가산기(804; 도 8A)는 합 및 캐리 필드들 R2a 및 R2b를 더하여, 곱을 생성하고, mux(814)는 상위 32비트를 결과 R3a로서 선택한다. 스티키 비트 논리(808)는 스티키 비트들 SB3를 생성할 수 있다.
스테이지 4에서, 지수 증가 블록(430)은 지수를 조정하여 IP 가산기(804)에 의한 임의의 캐리들을 반영한다. 정렬 유닛(420)에서, 작은 스왑 mux(904; 도 9)는 곱 결과 R3a를 작은 피연산자 경로(908) 상으로 지향시키는데, 여기서 Rshift 카운트 회로(804)에 의해 결정된 임의의 우측 시프트가 우측 시프트 회로(912)에 의해 적용되어 결과 R4a가 생성된다. 우측 시프트가 적용되는 경우, 스티키 비트 논리(914)는 우측 시프트 양에 기초하여 새로운 스티키 비트들 SB4를 생성하며, 그렇지 않은 경우에 스티키 비트들 SB3는 스티키 비트들 SB4로서 전송될 수 있다. 큰 피연산자 경로(910)에서, 조건부 제로 유닛(920)은 결과 R4b를 소거한다.
스테이지 5에서, 플러스-1 가산기(1002; 도 10)는 결과들 R4a(곱 A*1) 및 R4b(0)를 더한다. 몇몇 실시예에서, 라운딩 논리(1008)는 합 출력을 결과 R5로서 선택하며, 다른 실시예들에서 라운딩 논리(1008)는 스티키 비트들 SB4를 이용하여 합과 합+1 출력들 사이에서 선택할 수 있다.
스테이지 6에서, 정규화 블록(423)은 (필요에 따라) 우측 시프트를 적용하여, 이진 소수점을 적절히 정렬한다(예를 들어, 지수가 양인 경우). 유효 최종 지수 EFE2는 좌측 시프트 양을 결정하기 위해 시프트 제어 회로(1110)에 의해 사용되며, 시프트는 좌측 시프트 회로(1112)에 의해 수행된다. 이 시프트된 결과 R6은 경로(425) 상에 제공된다. 지수 감소 블록(432)은 이에 대응하여 필요에 따라 지수를 감소시킨다.
스테이지 7에서, 포맷 블록(1210; 도 12)은 결과 R6을, 7개의 정수 비트와 23개의 소수 비트를 갖는 고정 소수점 표현으로 변환한다. 지수 포화 논리(1216)는 포화를 검출하는데 사용될 수 있으며, 이 경우에 INF(전술한 특수 출력 포맷)가 결과로서 선택될 수 있다.
IV. 기타 실시예
본 발명은 특정 실시예들에 관하여 설명되었지만, 본 기술분야의 숙련자들은 다양한 수정이 가능하다는 것을 인식할 것이다. 예를 들어, MMAD 유닛은 더 많거나, 적거나 상이한 기능들을 조합하여 지원하고, 임의의 포맷 또는 포맷들의 조합으로 피연산자들 및 결과들을 지원하도록 구현될 수 있다.
본 명세서에서 설명되는 다양한 바이패스 경로 및 통과도 변경될 수 있다. 일반적으로, 임의의 회로 블록 주위의 바이패스 경로가 설명되는 경우, 그 경로는 그 블록에서 항등 연산(즉, 0을 더하는 것과 같이 피연산자에 대한 효과가 없는 연산)으로 대체되거나 그 반대일 수 있다. 주어진 연산 동안 바이패스되는 회로 블록은 유휴 상태(예를 들어, 절전 상태)로 되거나, 정상적으로 동작하여 그 결과가 하향 블록들에 의해, 예를 들어 선택 mux들 또는 다른 회로들의 연산을 통해 무시될 수 있다.
MMAD 파이프라인의 스테이지들로의 분할은 임의적이다. 파이프라인은 임의 수의 스테이지를 포함할 수 있으며, 각 스테이지에서의 컴포넌트들의 조합은 필요에 따라 변경될 수 있다. 본 명세서에서 특정 블록들에 할당되는 기능도 파이프라인 스테이지들에 분산될 수 있는데, 예를 들어 승산기 트리가 다수의 스테이지를 점유할 수 있다.
다양한 블록의 기능도 수정될 수 있다. 몇몇 실시예에서, 예를 들어 상이한 가산기 회로들 또는 승산기 회로들이 사용될 수 있으며, 승산을 위한 부스3 인코딩(또는 임의의 다른 인코딩)의 이용은 필요하지 않다.
또한, MMAD 유닛은 이해를 쉽게 하기 위해 회로 블록들에 의해 설명되었으며, 본 기술분야의 숙련자들은 블록들이 다양한 회로 컴포넌트 및 레이아웃을 이용하여 구현될 수 있으며, 본 명세서에 설명되는 블록들은 특정 세트의 컴포넌트들 또는 물리적 레이아웃으로 한정되지 않는다는 것을 인식할 것이다. 블록들은 필요에 따라 물리적으로 조합되거나 분리될 수 있다.
프로세서는 실행 코어 내에 하나 이상의 MMAD 유닛을 포함할 수 있다. 예를 들어, 수퍼스칼라 명령 발행(즉, 사이클당 둘 이상의 명령 발행)이 필요한 경우, 다수의 MMAD 유닛이 구현될 수 있으며, 상이한 MMAD 유닛들이 상이한 기능들의 조합을 지원할 수 있다. 또한, 프로세서는 다수의 실행 코어를 포함할 수 있으며, 각각의 코어는 그 자신의 MMAD 유닛(들)을 가질 수 있다.
또한, 본 발명은 그래픽 프로세서를 참조하여 설명되었지만, 본 기술분야의 숙련자들은 본 발명이 수학 코프로세서, 벡터 프로세서, 또는 범용 프로세서 등의 다른 프로세서들에서도 이용될 수 있음을 이해할 것이다.
따라서, 본 발명이 특정 실시예들을 참조하여 설명되었을지라도, 본 발명은 이하의 청구의 범위의 범위 내에서 모든 변경 및 등가물을 포함하도록 의도된 것임을 이해할 것이다.

Claims (28)

  1. 프로세서용의 다목적 기능 유닛으로서,
    제1, 제2 및 제3 피연산자들, 및 수행될 복수의 지원 연산 중 하나를 지정하는 연산 코드(opcode)를 수신하도록 구성되고, 상기 연산 코드에 응답하여 복수의 제어 신호를 생성하도록 더 구성된 입력부;
    상기 입력부에 결합되고, 상기 제어 신호에 응답하여 상기 제1 및 제2 피연산자들의 곱을 계산하고, 그 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있는 승산 파이프라인;
    상기 입력부에 결합되고, 상기 제어 신호에 응답하여 상기 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자에 대한 비교를 수행하고, 상기 비교의 결과를 제2 중간 결과로서 선택하도록 구성될 수 있는 테스트 파이프라인;
    상기 승산 파이프라인 및 상기 테스트 파이프라인에 결합되고, 상기 제어 신호에 응답하여 상기 제1 및 제2 중간 결과들의 합을 계산하고, 그 계산된 합을 연산 결과로서 선택하도록 구성될 수 있는 가산 파이프라인;
    상기 입력부에 결합되고, 상기 제어 신호에 응답하여 상기 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자에 대한 지수 연산을 수행하고, 상기 지수 연산의 결과를 지수 결과로서 선택하도록 구성될 수 있는 지수 파이프라인; 및
    상기 연산 결과 및 상기 지수 결과를 수신하도록 결합되고, 상기 제어 신호에 응답하여 상기 연산 코드에 의해 지정되는 상기 지원 연산들 중 하나에 대한 최 종 결과를 생성하도록 구성될 수 있는 출력부
    를 포함하고,
    상기 복수의 지원 연산은 부동 소수점 승산-가산(FMAD) 연산, 정수 승산-가산(IMAD) 연산, 및 적어도 하나의 비교 테스트 연산을 포함하는 다목적 기능 유닛.
  2. 제1항에 있어서,
    상기 가산 파이프라인은, 상기 제어 신호에 응답하여, 상기 연산 코드가 상기 비교 테스트 연산을 지정하는 경우에 상기 제1 및 제2 중간 결과들을 가산하기 전에 상기 제1 중간 결과가 0의 값으로 대체되도록 더 구성될 수 있는 다목적 기능 유닛.
  3. 제1항에 있어서,
    상기 적어도 하나의 비교 테스트 연산은, 최대치(MAX) 연산, 최소치(MIN) 연산 및 3 변수 비교(CMP) 연산으로 이루어지는 그룹으로부터 선택되는 하나 이상의 연산을 포함하는 다목적 기능 유닛.
  4. 제3항에 있어서,
    상기 적어도 하나의 비교 테스트 연산은, 상기 MAX 연산, 상기 MIN 연산 및 상기 CMP 연산을 포함하고, 상기 테스트 파이프라인은 상기 제어 신호에 응답하여,
    상기 연산 코드가 상기 MAX 연산을 지정하는 경우에는, 상기 제2 중간 결과 가 상기 제1 피연산자 및 상기 제2 피연산자 중 큰 쪽에 대응하고,
    상기 연산 코드가 상기 MIN 연산을 지정하는 경우에는, 상기 제2 중간 결과가 상기 제1 피연산자 및 상기 제2 피연산자 중 작은 쪽에 대응하며,
    상기 연산 코드가 상기 CMP 연산을 지정하는 경우에는, 상기 제2 중간 결과가, 상기 제3 피연산자가 0보다 작은 때에는 상기 제2 피연산자에 대응하고, 그렇지 않은 경우에는, 상기 제1 피연산자에 대응하도록 더 구성될 수 있는 다목적 기능 유닛.
  5. 제1항에 있어서,
    상기 적어도 하나의 비교 테스트 연산은, 초과 연산(greater than operation), 미만 연산(less than operation), 등가 연산 및 무순서 연산(unordered operation)으로 이루어지는 그룹으로부터 선택되는 하나 이상의 이진 테스트(SET) 연산을 포함하고, 상기 하나 이상의 이진 테스트 연산 각각은 부울 결과를 생성하는 다목적 기능 유닛.
  6. 제5항에 있어서,
    상기 테스트 파이프라인과 상기 출력부 사이에 결합되고, 상기 테스트 파이프라인에서 상기 출력부로 부울 보조 결과를 전달하도록 구성된 보조 결과 경로를 더 포함하고,
    상기 출력부는, 상기 제어 신호에 응답하여, 상기 연산 코드가 상기 SET 연 산들 중 하나를 지정하는 경우에 상기 부울 보조 결과에 기초하여 상기 최종 결과를 생성하도록 더 구성될 수 있는 다목적 기능 유닛.
  7. 제1항에 있어서,
    상기 복수의 지원 연산은, 비트 부울 논리 연산(bitwise Boolean logic operation)을 더 포함하는 다목적 기능 유닛.
  8. 제7항에 있어서,
    상기 비트 부울 논리 연산은, AND 연산, OR 연산 및 XOR 연산으로 이루어지는 그룹으로부터 선택될 수 있고,
    상기 테스트 파이프라인은:
    상기 제1 및 제2 피연산자들의 비트 논리 AND를 제1 출력으로서 생성하도록 구성된 AND 회로;
    상기 제1 및 제2 피연산자들의 비트 논리 OR을 제2 출력으로서 생성하도록 구성된 OR 회로;
    상기 제1 및 제2 피연산자들의 비트 논리 XOR을 제3 출력으로서 생성하도록 구성된 XOR 회로; 및
    상기 제어 신호에 응답하여, 상기 연산 코드가 상기 AND, OR 및 XOR 연산들 중 하나를 지정하는 경우에, 상기 제2 중간 결과가 상기 제1, 제2 및 제3 출력들 중 하나에 대응하도록 구성될 수 있는 선택 회로
    를 포함하는 다목적 기능 유닛.
  9. 제1항에 있어서,
    상기 복수의 지원 연산은 부동 소수점 가산(FADD) 연산 및 정수 가산(IADD) 연산을 더 포함하고, 상기 가산 파이프라인은 상기 제어 신호에 응답하여 상기 FADD 연산 및 상기 IADD 연산을 수행하도록 더 구성될 수 있는 다목적 기능 유닛.
  10. 제9항에 있어서,
    상기 승산 파이프라인은 상기 제어 신호에 응답하여 상기 연산 코드가 상기 FADD 연산 또는 상기 IADD 연산을 지정하는 경우에 상기 제1 피연산자가 상기 제1 중간 결과로서 선택되도록 더 구성될 수 있는 다목적 기능 유닛.
  11. 제1항에 있어서,
    상기 복수의 지원 연산은 부동 소수점 승산(FMUL) 연산 및 정수 승산(IMUL) 연산을 더 포함하고, 상기 승산 파이프라인은 상기 제어 신호에 응답하여 상기 FMUL 연산 및 상기 IMUL 연산을 수행하도록 더 구성될 수 있는 다목적 기능 유닛.
  12. 제11항에 있어서,
    상기 가산 파이프라인은 상기 제어 신호에 응답하여 상기 연산 코드가 상기 FMUL 연산 또는 상기 IMUL 연산을 지정하는 경우에 상기 제1 및 제2 중간 결과들을 가산하기 전에 상기 제2 중간 결과가 0의 값으로 대체되도록 더 구성될 수 있는 다목적 기능 유닛.
  13. 제1항에 있어서,
    상기 복수의 지원 연산은 상기 제1 피연산자를 입력 포맷에서 타겟 포맷으로 변환하는 포맷 변환 연산을 더 포함하는 다목적 기능 유닛.
  14. 제1항에 있어서,
    상기 복수의 지원 연산은 도메인 맵핑(RRO) 연산을 더 포함하는 다목적 기능 유닛.
  15. 제14항에 있어서,
    상기 RRO 연산은 삼각 함수를 계산하는데 사용하기 위하여 상기 제1 피연산자를 감소시키는 다목적 기능 유닛.
  16. 제14항에 있어서,
    상기 RRO 연산은 지수 함수를 계산하는데 사용하기 위하여 상기 제1 피연산자를 감소시키는 다목적 기능 유닛.
  17. 제1항에 있어서,
    상기 복수의 지원 연산은 상기 제1 피연산자의 소수부를 반환하는 소수(FRC) 연산을 더 포함하는 다목적 기능 유닛.
  18. 제1항에 있어서,
    상기 가산 파이프라인은:
    상기 제어 신호에 응답하여, 상기 연산 코드가 상기 FMAD 연산을 지정하는 경우에, 상기 지수 파이프라인으로부터의 정렬 신호에 기초하여 상기 제1 및 제2 중간 결과들 중 하나를 우측으로 시프트시키도록 구성될 수 있는 정렬 회로; 및
    상기 제어 신호에 응답하여, 상기 연산 코드가 상기 FMAD 연산을 지정하는 경우에, 상기 제1 및 제2 중간 결과들의 합을 좌측으로 시프트시키도록 구성될 수 있는 정규화 회로
    를 포함하는 다목적 기능 유닛.
  19. 제18항에 있어서,
    상기 복수의 지원 연산은 상기 제1 피연산자를 좌측 및 우측으로 각각 시프트시키는 좌측 시프트(SHL) 연산 및 우측 시프트(SHR) 연산을 더 포함하고,
    상기 연산 코드가 상기 SHL 연산을 지정하는 경우에, 상기 정규화 회로는 좌측 시프트를 적용하고,
    상기 연산 코드가 상기 SHR 연산을 지정하는 경우에, 상기 정렬 회로는 우측 시프트를 적용하는 다목적 기능 유닛.
  20. 프로세서용의 다목적 기능 유닛으로서,
    제1, 제2 및 제3 피연산자들, 및 수행될 복수의 지원 연산 중 하나를 지정하는 연산 코드를 수신하도록 구성되고, 상기 연산 코드에 응답하여 복수의 제어 신호를 생성하도록 더 구성된 입력부;
    상기 입력부에 결합되고, 상기 제어 신호에 응답하여 상기 제1 및 제2 피연산자들의 곱을 계산하고, 그 계산된 곱을 제1 중간 결과로서 선택하도록 구성될 수 있는 승산 파이프라인;
    상기 입력부에 결합되고, 상기 제어 신호에 응답하여 상기 제1, 제2 및 제3 피연산자들 중 하나 이상의 피연산자에 대한 비교를 수행하고, 상기 비교의 결과를 제2 중간 결과로서 선택하도록 구성될 수 있는 테스트 파이프라인;
    상기 승산 파이프라인 및 상기 테스트 파이프라인에 결합되고, 상기 제어 신호에 응답하여 상기 제1 및 제2 중간 결과들의 합을 계산하고, 그 계산된 합을 연산 결과로서 선택하도록 구성될 수 있는 가산 파이프라인; 및
    상기 연산 결과를 수신하도록 결합되고, 상기 제어 신호에 응답하여 상기 연산 코드에 의해 지정되는 상기 지원 연산들 중 하나에 대한 최종 결과를 생성하도록 구성될 수 있는 출력부
    를 포함하고,
    상기 복수의 지원 연산은 상기 제1, 제2 및 제3 피연산자들에 대해 연산하는 부동 소수점 승산-가산(FMAD) 연산 및 정수 승산-가산(IMAD) 연산을 포함하고,
    상기 승산 파이프라인 및 상기 가산 파이프라인은, 상기 제어 신호에 응답하여, 상기 FMAD 연산에 대해서는 상기 최종 결과가 부동 소수점 값을 나타내고, 상기 IMAD 연산에 대해서는 상기 최종 결과가 정수 값을 나타내도록 더 구성될 수 있는 다목적 기능 유닛.
  21. 제20항에 있어서,
    상기 승산 파이프라인은:
    2개의 팩터들의 곱을 계산하도록 구성된 승산기 트리; 및
    상기 제어 신호에 응답하여 상기 제1 및 제2 피연산자들의 각각의 지수들로부터 곱 지수를 계산하고, 상기 곱 지수와 상기 제3 피연산자의 지수로부터 합 지수를 계산하도록 구성될 수 있는 지수 논리 블록을 포함하고,
    상기 연산 코드가 상기 FMAD 연산을 지정하는 경우에, 상기 승산기 트리는 상기 제1 및 제2 피연산자들의 각각의 가수들(mantissas)을 승산하고, 상기 지수 논리 블록은 상기 곱 지수 및 상기 합 지수를 계산하는 다목적 기능 유닛.
  22. 제20항에 있어서,
    상기 복수의 지원 연산은, 상기 제1 및 제3 피연산자들에 대해 연산하는 부동 소수점 가산(FADD) 연산 및 정수 가산(IADD) 연산을 더 포함하는 다목적 기능 유닛.
  23. 제22항에 있어서,
    상기 승산 파이프라인은:
    제1 팩터와 제2 팩터의 곱을 계산하도록 구성된 승산기 트리; 및
    상기 제어 신호에 응답하여 상기 제1 피연산자를 상기 제1 팩터로서 선택하고, 상기 제2 피연산자 또는 1에 대응하는 값 중 하나를 상기 제2 팩터로서 선택하도록 구성될 수 있는 전치 승산(premultiply) 선택 회로를 포함하고,
    상기 연산 코드가 상기 FADD 또는 IADD 연산을 지정하는 경우에, 상기 전치 승산 선택 회로는 상기 제2 피연산자를 상기 1에 대응하는 값으로 오버라이드(override)하는 다목적 기능 유닛.
  24. 제22항에 있어서,
    상기 승산 파이프라인은:
    상기 연산 코드가 상기 FADD 또는 IADD 연산을 지정하는 경우에, 상기 제1 피연산자를 상기 제1 중간 결과로서, 상기 제3 피연산자를 상기 제2 중간 결과로서 제공하도록 구성된 바이패스 경로를 더 포함하는 다목적 기능 유닛.
  25. 제20항에 있어서,
    상기 복수의 지원 연산은 상기 제1 및 제2 피연산자들에 대해 연산하는 부동 소수점 승산(FMUL) 연산 및 정수 승산(IMUL) 연산을 더 포함하는 다목적 기능 유닛.
  26. 제25항에 있어서,
    상기 가산 파이프라인은:
    제1 가산수 및 제2 가산수의 합을 계산하도록 구성된 가산기 회로; 및
    정렬 블록을 포함하고,
    상기 정렬 블록은:
    상기 제어 신호에 응답하여, 상기 제1 및 제2 중간 결과들 중 하나를 작은 피연산자로서, 상기 제1 및 제2 중간 결과들 중 다른 하나를 큰 피연산자로서 선택하도록 구성될 수 있는 조종 회로;
    상기 제어 신호에 응답하여, 상기 작은 피연산자에 우측 시프트를 적용하고, 상기 시프트된 작은 피연산자를 상기 제1 가산수로서 선택하도록 구성될 수 있는 우측 시프트 회로;
    상기 제어 신호에 응답하여, 상기 큰 피연산자 또는 0의 값 중 하나를 상기 제2 가산수로서 선택하도록 구성될 수 있는 조건부 제로 회로를 구비하며,
    상기 연산 코드가 상기 FMUL 또는 IMUL 연산을 지정하는 경우에, 상기 제1 중간 결과 및 상기 0의 값이 상기 제1 및 제2 가산수들로서 선택되는 다목적 기능 유닛.
  27. 제20항에 있어서,
    상기 승산 파이프라인은:
    제1 및 제2 필드들을 갖는 중복 표현에서 제1 및 제2 팩터들의 곱을 계산하도록 구성된 승산기 트리;
    상기 제어 신호에 응답하여, 상기 제1 및 제2 피연산자들을 상기 제1 및 제2 팩터들로서 선택하도록 구성될 수 있는 전치 승산 선택 회로;
    2개의 입력 값들의 정수 합을 계산하고, 상기 정수 합을 상기 제1 중간 결과로서 공급하도록 구성된 중간 곱 가산기; 및
    상기 승산기 트리와 상기 중간 곱 가산기 사이에 결합되고, 상기 제어 신호에 응답하여 상기 제1 필드 및 상기 제2 필드 또는 상기 제1 피연산자 및 상기 제2 피연산자 중 한 쪽을 상기 중간 곱 가산기에 선택가능하게 제공하도록 구성될 수 있는 후치 승산(postmultiply) 선택 회로
    를 포함하는 다목적 기능 유닛.
  28. 제27항에 있어서,
    상기 복수의 지원 연산은 절대차 정수합(ISAD) 연산을 더 포함하고,
    상기 연산 코드가 상기 ISAD 연산을 지정하는 경우에,
    상기 입력부는 상기 제1 피연산자, 및 상기 제2 피연산자의 반전 버전을 상기 승산 파이프라인에 제공하고,
    상기 후치 승산 선택 회로는 상기 제1 피연산자, 및 상기 제2 피연산자의 반전 버전을 상기 중간 곱 가산기에 제공하며,
    상기 가산 파이프라인은 상기 제1 중간 결과 및 상기 제3 피연산자의 합을 계산하는 다목적 기능 유닛.
KR1020077012628A 2004-11-10 2005-11-09 다목적 승산-가산 기능 유닛 KR100911786B1 (ko)

Applications Claiming Priority (8)

Application Number Priority Date Filing Date Title
US10/986,531 US20060101244A1 (en) 2004-11-10 2004-11-10 Multipurpose functional unit with combined integer and floating-point multiply-add pipeline
US10/985,674 2004-11-10
US10/985,695 2004-11-10
US10/985,291 2004-11-10
US10/985,291 US7225323B2 (en) 2004-11-10 2004-11-10 Multi-purpose floating point and integer multiply-add functional unit with multiplication-comparison test addition and exponent pipelines
US10/985,695 US7240184B2 (en) 2004-11-10 2004-11-10 Multipurpose functional unit with multiplication pipeline, addition pipeline, addition pipeline and logical test pipeline capable of performing integer multiply-add operations
US10/986,531 2004-11-10
US10/985,674 US7428566B2 (en) 2004-11-10 2004-11-10 Multipurpose functional unit with multiply-add and format conversion pipeline

Publications (2)

Publication Number Publication Date
KR20070085755A KR20070085755A (ko) 2007-08-27
KR100911786B1 true KR100911786B1 (ko) 2009-08-12

Family

ID=36337229

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020077012628A KR100911786B1 (ko) 2004-11-10 2005-11-09 다목적 승산-가산 기능 유닛

Country Status (4)

Country Link
JP (1) JP4891252B2 (ko)
KR (1) KR100911786B1 (ko)
TW (1) TWI389028B (ko)
WO (1) WO2006053173A2 (ko)

Families Citing this family (10)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8106914B2 (en) * 2007-12-07 2012-01-31 Nvidia Corporation Fused multiply-add functional unit
JP5367552B2 (ja) 2009-12-15 2013-12-11 株式会社東芝 画像処理装置および画像処理プログラム
US8667042B2 (en) * 2010-09-24 2014-03-04 Intel Corporation Functional unit for vector integer multiply add instruction
GB2484654B (en) 2010-10-12 2013-10-09 Advanced Risc Mach Ltd Conditional selection of data elements
KR101735677B1 (ko) 2010-11-17 2017-05-16 삼성전자주식회사 부동 소수점의 복합 연산장치 및 그 연산방법
DE102013212840B4 (de) * 2013-07-02 2022-07-07 Robert Bosch Gmbh Modellberechnungseinheit und Steuergerät zur Berechnung eines datenbasierten Funktionsmodells mit Daten in verschiedenen Zahlenformaten
DE102013224694A1 (de) * 2013-12-03 2015-06-03 Robert Bosch Gmbh Verfahren und Vorrichtung zum Ermitteln eines Gradienten eines datenbasierten Funktionsmodells
US9875084B2 (en) * 2016-04-28 2018-01-23 Vivante Corporation Calculating trigonometric functions using a four input dot product circuit
US10979054B1 (en) * 2020-01-14 2021-04-13 Nuvotonn Technology Corporation Coupling of combinational logic circuits for protection against side-channel attacks
CN114968175B (zh) * 2022-06-06 2023-03-07 湖南毂梁微电子有限公司 一种用于智能计算加速的可配置移位加法融合单元

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6363476B1 (en) 1998-08-12 2002-03-26 Kabushiki Kaisha Toshiba Multiply-add operating device for floating point number

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH0480867A (ja) * 1990-07-23 1992-03-13 Mitsubishi Electric Corp 演算回路
JP3790307B2 (ja) * 1996-10-16 2006-06-28 株式会社ルネサステクノロジ データプロセッサ及びデータ処理システム
JPH10207863A (ja) * 1997-01-21 1998-08-07 Toshiba Corp 演算処理装置
JPH1173409A (ja) * 1997-08-29 1999-03-16 Matsushita Electric Ind Co Ltd 積和演算装置および積和演算方法
US6480872B1 (en) * 1999-01-21 2002-11-12 Sandcraft, Inc. Floating-point and integer multiply-add and multiply-accumulate

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6363476B1 (en) 1998-08-12 2002-03-26 Kabushiki Kaisha Toshiba Multiply-add operating device for floating point number

Also Published As

Publication number Publication date
JP4891252B2 (ja) 2012-03-07
KR20070085755A (ko) 2007-08-27
WO2006053173A3 (en) 2007-05-10
TWI389028B (zh) 2013-03-11
WO2006053173A2 (en) 2006-05-18
JP2008520048A (ja) 2008-06-12

Similar Documents

Publication Publication Date Title
US7428566B2 (en) Multipurpose functional unit with multiply-add and format conversion pipeline
US7225323B2 (en) Multi-purpose floating point and integer multiply-add functional unit with multiplication-comparison test addition and exponent pipelines
KR100911786B1 (ko) 다목적 승산-가산 기능 유닛
US20060101244A1 (en) Multipurpose functional unit with combined integer and floating-point multiply-add pipeline
US8106914B2 (en) Fused multiply-add functional unit
US8037119B1 (en) Multipurpose functional unit with single-precision and double-precision operations
US8990282B2 (en) Apparatus and method for performing fused multiply add floating point operation
US7720900B2 (en) Fused multiply add split for multiple precision arithmetic
US5940311A (en) Immediate floating-point operand reformatting in a microprocessor
GB2497469B (en) Multiply add functional unit capable of executing scale,round,Getexp,round,getmant,reduce,range and class instructions
US8051123B1 (en) Multipurpose functional unit with double-precision and filtering operations
JP2004213622A (ja) 固定小数点表示と浮動小数点表示との間で数を変換するデータ処理装置および方法
US7640285B1 (en) Multipurpose arithmetic functional unit
US20050228844A1 (en) Fast operand formatting for a high performance multiply-add floating point-unit
Boersma et al. The POWER7 binary floating-point unit
US7240184B2 (en) Multipurpose functional unit with multiplication pipeline, addition pipeline, addition pipeline and logical test pipeline capable of performing integer multiply-add operations
US8190669B1 (en) Multipurpose arithmetic functional unit
CN107291420B (zh) 整合算术及逻辑处理的装置
US6922771B2 (en) Vector floating point unit
CN107315710B (zh) 全精度及部分精度数值的计算方法及装置
US11704092B2 (en) High-precision anchored-implicit processing
US20150067299A1 (en) Splitable and scalable normalizer for vector data
EP1163591A1 (en) Processor having a compare extension of an instruction set architecture
WO2000048080A9 (en) Processor having a compare extension of an instruction set architecture

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: 20120727

Year of fee payment: 4

FPAY Annual fee payment

Payment date: 20130723

Year of fee payment: 5

FPAY Annual fee payment

Payment date: 20140722

Year of fee payment: 6

FPAY Annual fee payment

Payment date: 20160801

Year of fee payment: 8

FPAY Annual fee payment

Payment date: 20180801

Year of fee payment: 10