부동소수점 장치

[[인텔의 x87 계열 수치 보조 프로세서 컬렉션|섬네일|upright=1]]
**부동소수점 장치**(浮動小數點裝置, floating-point unit, **FPU**), **수치 처리 장치**(numeric processing unit, **NPU**)는 흔히 **수치 보조 프로세서**라고도 불리며, 컴퓨터 시스템의 일부로 부동소수점 연산을 수행하도록 특별히 설계되었다. 일반적인 연산으로는 덧셈, 뺄셈, 곱셈, 나눗셈, 제곱근이 있다. 최신 설계에서는 일반적으로 실제 코드에서 매우 흔하게 발견되는 단일 곱셈-누산기 명령어가 포함된다. 일부 FPU는 지수 함수나 삼각 함수 계산과 같은 다양한 초월함수도 수행할 수 있지만, 정확도가 낮을 수 있으므로, 일부 시스템에서는 이러한 함수를 소프트웨어로 계산하는 것을 선호한다.

부동소수점 연산은 초기 컴퓨터에서는 원래 소프트웨어로 처리되었다. 시간이 지나면서 제조사들은 표준화된 부동소수점 라이브러리를 소프트웨어 컬렉션의 일부로 제공하기 시작했다. 과학 처리 전용으로 사용되는 일부 기계들은 이러한 작업을 훨씬 더 빠르게 수행하기 위해 특수 하드웨어를 포함했다. 1960년대 마이크로코드의 도입으로 이러한 명령어들이 시스템의 명령어 집합 (ISA)에 포함될 수 있게 되었다. 일반적으로 이들은 마이크로코드에 의해 라이브러리와 유사한 일련의 명령어로 디코딩되었지만, FPU가 있는 기계에서는 대신 해당 장치로 라우팅되어 훨씬 빠르게 수행되었다. 이로 인해 부동소수점 하드웨어는 선택 사항으로 남아있으면서도 부동소수점 명령어는 보편화될 수 있었다. 예를 들어, PDP-11에서는 플러그인 확장 카드를 사용하여 언제든지 부동소수점 처리 장치를 추가할 수 있었다.

1970년대 마이크로프로세서의 도입은 이전의 메인프레임 및 미니컴퓨터와 유사한 발전을 가져왔다. 초기 마이크로컴퓨터 시스템은 부동소수점 연산을 소프트웨어로 수행했으며, 일반적으로 롬에 포함된 벤더별 라이브러리를 사용했다. 단일 칩 전용 FPU는 10년 후반에 나타나기 시작했지만, 1980년대 중반까지는 실제 시스템에서 드물게 사용되었고, 이를 사용하려면 소프트웨어를 다시 작성해야 했다. FPU가 보편화됨에 따라 소프트웨어 라이브러리는 이전 기계의 마이크로코드처럼 작동하도록 수정되어, 필요하면 메인 CPU에서 명령어를 수행하고, FPU가 있으면 FPU로 오프로드했다. 1980년대 후반에는 반도체 제조 기술이 향상되어 FPU를 메인 CPU에 통합하는 것이 가능해졌고, 그 결과 인텔 80486 및 모토로라 68040과 같은 설계가 등장했다. 이러한 설계는 "통합 FPU"로 알려졌으며, 1990년대 중반부터 FPU는 임베디드 프로세서와 같이 저가형으로 설계된 경우를 제외하고는 대부분의 CPU 설계에서 표준 기능이 되었다.

최신 설계에서는 단일 CPU에 일반적으로 여러 개의 산술 논리 장치 (ALU)와 여러 개의 FPU가 포함되어, 동시에 많은 명령어를 읽고 병렬 실행을 위해 다양한 장치로 라우팅한다. 2000년대에 이르러서는 임베디드 프로세서조차도 일반적으로 FPU를 포함하게 되었다.

## 역사
1954년, IBM 704는 이전 모델인 IBM 701에 비해 주요 개선점 중 하나로 부동소수점 연산을 표준 기능으로 탑재했다. 이는 후속 모델인 709, 7090, 7094에도 이어졌다.

1963년, 디지털은 부동소수점을 표준 기능으로 탑재한 PDP-6를 발표했다.

1963년, GE-235는 부동소수점 및 배정밀도 계산을 위한 "보조 산술 장치"를 특징으로 했다.

역사적으로 일부 시스템은 부동소수점을 통합 장치 대신 코프로세서로 구현했다(그러나 지금은 CPU 외에도, 예를 들어 GPUCPU에 항상 내장되지는 않는 코프로세서는 일반적으로 FPU를 가지고 있지만, 1세대 GPU는 그렇지 않았다). 이는 단일 집적 회로, 전체 인쇄 회로 기판, 또는 캐비닛일 수 있었다. 부동소수점 계산 하드웨어가 제공되지 않은 경우, 부동소수점 계산은 소프트웨어로 수행되어 더 많은 프로세서 시간을 소모하지만, 추가 하드웨어 비용을 피할 수 있었다. 특정 컴퓨터 아키텍처의 경우, 부동소수점 장치 명령어는 소프트웨어 함수 라이브러리에 의해 에뮬레이션될 수 있다. 이는 동일한 목적 파일이 부동소수점 하드웨어가 있거나 없는 시스템에서 실행될 수 있도록 허용한다. 에뮬레이션은 여러 수준에서 구현될 수 있다: CPU 내부의 마이크로코드로, 운영체제 기능으로, 또는 사용자 공간 코드로. 정수 기능만 사용 가능한 경우, 초월함수 평가에는 주로 CORDIC 메서드가 사용된다.

대부분의 현대 컴퓨터 아키텍처에서는 부동소수점 연산과 정수 연산이 어느 정도 분리되어 있다. 이러한 분리는 아키텍처에 따라 상당히 다르다. 일부는 전용 부동소수점 레지스터를 가지고 있는 반면, 인텔 X86과 같은 일부는 독립적인 클럭 방식까지 사용한다.

CORDIC 루틴은 8087을 포함한 인텔 X87 코프로세서( 80287, 80387)부터 80486 마이크로프로세서 시리즈, 그리고 모토로라 68881 및 68882에서 특정 종류의 부동소수점 명령어를 위해 구현되었는데, 이는 주로 FPU 서브시스템의 게이트 수(및 복잡성)를 줄이는 방법으로 사용되었다.

부동소수점 연산은 종종 파이프라인화된다. 일반적인 비순차적 실행이 없는 초기 슈퍼스칼라 아키텍처에서는 부동소수점 연산이 때때로 정수 연산과 별도로 파이프라인화되었다.

불도저 마이크로아키텍처의 모듈형 아키텍처는 FlexFPU라는 특수 FPU를 사용하며, 이는 동시 멀티스레딩을 사용한다. 각 물리적 정수 코어는 모듈당 두 개이며, 인텔의 하이퍼스레딩과는 달리 단일 스레드이며, 이는 두 개의 가상 동시 스레드가 단일 물리적 코어의 리소스를 공유하는 것과 대조된다.

## 부동소수점 라이브러리
일부 부동소수점 하드웨어는 덧셈, 뺄셈, 곱셈과 같은 가장 단순한 연산만을 지원한다. 그러나 아무리 복잡한 부동소수점 하드웨어라도 지원할 수 있는 연산의 수는 유한하다.예를 들어, 어떤 FPU도 임의 정밀도 연산을 직접 지원하지 않는다.

CPU가 하드웨어에서 직접 지원하지 않는 부동소수점 연산을 호출하는 프로그램을 실행할 때, CPU는 일련의 더 간단한 부동소수점 연산을 사용한다. 부동소수점 하드웨어가 전혀 없는 시스템에서는 CPU가 에뮬레이션을 통해 정수 산술 논리 장치에서 실행되는 일련의 더 간단한 고정소수점 연산을 사용한다.

부동소수점 연산을 에뮬레이션하는 데 필요한 일련의 연산을 나열하는 소프트웨어는 종종 부동소수점 라이브러리에 패키징된다.

## 통합 FPU
경우에 따라 FPU는 특수화되어 더 간단한 부동소수점 연산(주로 덧셈 및 곱셈)과 나눗셈과 같은 더 복잡한 연산으로 나뉠 수 있다. 어떤 경우에는 간단한 연산만이 하드웨어 또는 마이크로코드로 구현되고, 더 복잡한 연산은 소프트웨어로 구현될 수 있다.

일부 현재 아키텍처에서는 FPU 기능이 단일 명령어, 다중 데이터 (SIMD) 유닛과 결합되어 SIMD 계산을 수행한다. 이의 예로는 최신 인텔 및 AMD 프로세서에서 사용되는 X86-64 아키텍처에서 X87 명령어 세트에 스트리밍 SIMD 확장 명령어 세트를 추가한 것을 들 수 있다.

## 애드온 FPU

PDP-11의 여러 모델(예: PDP-11/45, PDP-11/34a, PDP-11/44, 및 PDP-11/70)은 부동소수점 명령어를 지원하기 위해 애드온 부동소수점 장치를 지원했다. PDP-11/60, MicroPDP-11/23 및 여러 VAX 모델은 애드온 FPU 없이 부동소수점 명령어를 실행할 수 있었고(MicroPDP-11/23은 애드온 마이크로코드 옵션이 필요했다), 해당 명령어의 실행 속도를 더욱 높이기 위한 애드온 가속기를 제공했다.

1980년대에는 IBM PC/호환 마이크로컴퓨터에서 FPU가 CPU와 완전히 분리되어 일반적으로 선택적 애드온으로 판매되는 것이 일반적이었다. 이는 수학적 연산이 많은 프로그램의 속도를 높이거나 활성화해야 하는 경우에만 구매되었다.

IBM PC, XT 및 8088 또는 8086 기반의 대부분의 호환 기종에는 선택적 8087 코프로세서용 소켓이 있었다. AT 및 80286 기반 시스템에는 일반적으로 80287용 소켓이 있었고, 80386/80386SX 기반 기종에는 각각 80387 및 80387SX용 소켓이 있었다. 하지만 초기에는 80387이 아직 존재하지 않았기 때문에 80287용 소켓이 있었다. 다른 회사들도 인텔 X86 시리즈용 코프로세서를 제조했다. 여기에는 사이릭스와 와이텍이 포함되었다. 아콘 컴퓨터는 ARM 기반의 아르키메데스 제품군에 단정밀도, 배정밀도 및 확장 정밀도를 제공하기 위해 WE32206을 선택했으며, ARM2 프로세서와 WE32206을 연결하여 추가 ARM 부동소수점 명령어를 지원하기 위해 게이트 어레이를 도입했다. 아콘은 나중에 ARM이 개발한 FPA10 코프로세서를 ARM3 프로세서가 장착된 다양한 기종에 제공했다.

코프로세서는 모토로라 68000 계열의 68881과 68882에서 사용 가능했다. 이들은 모토로라 68020/68030 기반 워크스테이션 (예: 선-3 시리즈)에서 흔히 사용되었다. 또한 애플 매킨토시 및 코모도어 아미가 시리즈의 고급 모델에도 흔히 추가되었지만, IBM PC 호환 시스템과는 달리 저가형 시스템에는 코프로세서 추가용 소켓이 그리 흔하지 않았다.

마이크로컨트롤러 장치(MCU/μC)/단일 보드 컴퓨터 (SBC)용 애드온 FPU 코프로세서 장치도 있는데, 이는 부동소수점 산술 기능을 제공한다. 이러한 애드온 FPU는 호스트 프로세서에 독립적이며, 자체 프로그래밍 요구 사항(연산, 명령어 집합 등)을 가지며, 종종 자체 통합 개발 환경 (IDE)과 함께 제공된다.

## 같이 보기
* 산술 논리 장치 (ALU)
* 주소 생성 장치 (AGU)
* 로드-스토어 유닛
* CORDIC 루틴은 많은 FPU에서 함수를 구현하는 데 사용되지만 게이트 수를 크게 늘리지는 않는다.
* 실행 장치
* IEEE 754 부동소수점 표준
* IBM 16진 부동소수점
* 그래픽 처리 장치
* 단일 곱셈-누산기

## 각주

## 추가 자료
* 

분류:컴퓨터 산술
분류:중앙 처리 장치
분류:부동소수점
분류:코프로세서