코프로세서

인텔 80386 프로세서와 80387 코프로세서 **코프로세서**(coprocessor)는 CPU의 기능을 보충하기 위해 사용되는 컴퓨터 프로세서이다. **보조프로세서**(補助 processor) 또는 **보조 처리기**(補助處理器)라고도 부른다. 코프로세서는 부동소수점 산술, 그래픽, 신호 처리, 문자열 연산, 암호화, 주변장치 입출력 등의 기능을 수행한다. 코프로세서는 주 CPU 프로세서에 집중된 작업들의 짐을 덜어 시스템 수행 속도를 빠르게 해 준다. 코프로세서로 일련의 컴퓨터들을 원하는 대로 설정할 수 있어서, 추가의 성능이 필요하지 않는 고객들은 그러한 기능에 비용을 들이지 않아도 되는 장점이 있다. 코프로세서는 메인프레임 컴퓨터에서 처음 등장했는데, 기존의 CPU에 없는 추가 기능을 지원하는 데에, 또는 채널 컨트롤러와 같이 입출력 채널을 제어하는 데에 주로 사용되었다.
# 역할
코프로세서는 그 스스로 다목적의 프로세서가 아닐 수 있다. 코프로세서는 메모리로부터 명령어를 불러들이거나, 흐름 제어 명령 프로그램을 실행하거나, 입출력을 하거나, 메모리를 관리하는 등의 역할을 할 수 없다. 코프로세서가 코프로세서 명령어를 불러들이거나 코프로세서 기능이 아닌 다른 모든 작업을 다루려면 주 프로세서가 필요하다. 일부 아키텍처에서 코프로세서는 그보다 다목적으로 사용되나, 관리 프로세서의 통제하에서는 제한된 범위의 기능만을 수행한다.
# 등장 및 전개
메인프레임 컴퓨터 프로세서의 처리 시간을 최대한 활용하기 위해, 입출력 작업이 입출력 채널로 불리는 별개의 시스템에 위임되었다. 메인프레임은 입출력 처리를 할 필요가 전혀 없이 입출력 파라미터를 설정하기만 하고 채널 프로세서에 전 작업을 수행하도록 신호를 주면 되었다. 상대적으로 시간을 소비하는 입출력 포맷과 처리에 단순한 서브 프로세서를 배치함으로 전체적인 시스템의 성능은 향상되었다. 부동소수점 계산을 위한 코프로세서가 1970년대에 처음으로 개인용 컴퓨터에 등장하였고, 1980년대에서 1990년대 초반에 걸쳐 일반화되었다. 초기의 8비트와 16비트 프로세서는 부동소수점 연산을 위한 소프트웨어를 사용하였다. 코프로세서가 지원되면 부동소수점 계산을 수 배 빠르게 수행할 수 있었다. 수치연산 보조프로세서는 컴퓨터 지원 설계(computer-aided design, CAD) 소프트웨어나 과학 기술 계산을 하는 이들에게 인기가 있었다. 인텔 I8231, 웨이텍(Weitek) FPU와 같은 일부 부동소수점 유닛들은 CPU에 단단히 통합된 인텔 8087, 모토롤라 68881, 내셔널 32081 AMD 9511 등과는 달리 주변장치로 취급되기도 했다. 또 다른 형태의 코프로세서로 비디오 디스플레이 코프로세서가 있는데, 아타리 8비트 종류, 텍사스 인스트루먼트 TI-99/4A, MSX 가정용 컴퓨터에 사용되었고, '비디오 디스플레이 컨트롤러'로 불렸다. 코모도어 아미가 종류에 사용된 그래픽 처리 장치 칩은 '카퍼'(Copper)로 알려졌다. 마이크로프로세서가 발전하면서 부동소수점 연산 기능을 프로세서에 통합하는 비용이 줄어들었고, 프로세서 속도가 늘어나면서 긴밀히 통합된 코프로세서의 구현이 어려워졌다. 별도로 운용되었던 수치연산 보조프로세서는 현재 개인용 컴퓨터에서는 흔하지 않다. 어쨌든, 특히 컴퓨터 게임에서의 사실적 3D 게임에 대한 요구의 증가와 함께 그래픽 전용 코프로세서에 대한 요구도 증가되었다.
## 인텔 코프로세서
x87 i8087 과 i80287 마이크로아키텍처. i80387 마이크로아키텍처. 원래의 IBM PC는 인텔 8087 부동소수점 코프로세서용 소켓을 포함했다. 부동소수점 장치(FPU, Floating point unit)로도 알려진 코프로세서는 캐드나 수학용 계산을 위해 컴퓨터를 사용하는 계층에 인기가 있었다. 그러한 아키텍처에서 코프로세스는 부동소수점 계산을 대략 5배까지 빠르게 할 수 있었다. 문서 작성에만 컴퓨터를 사용하는 경우에는 문서 처리 능력에 도움이 되지 않을 고가의 코프로세스를 구입하지 않아도 되었다. 8087은 인텔 8086/8088과 단단히 통합되어 있었고, 80886 부동소수점 명령어열에 삽입된 기계어 실행 코드들에 응답했다. 8087이 없는 8088 프로세서는 이러한 명령어를 해석할 수 없었고, FPU를 갖춘 시스템과 갖추지 못한 시스템은 별도 버전의 프로그램을 준비하거나, 최소한 FPU가 있는지를 실시간으로 테스트하고 적절한 수학용 라이브러리 함수를 선택해야 했다. 8086/8088 중앙처리장치의 또 다른 코프로세서로 인텔 8089 입출력 코프로세서가 있다. 이 코프로세서는 메모리로부터 주변 기기로 데이터를 옮기는 등의 8087과 같은 프로그래밍 기술이 사용되었고, 그렇게 하여 CPU의 부하를 줄였다. 하지만, IBM은 PC 설계에 이 장치를 사용하지 않았고, 인텔은 이러한 방식의 코프로세서의 개발을 중단하였다. 인텔 80386 마이크로프로세서는 선택적인 코프로세서인 80387을 사용하여 부동소수점 연산을 하드웨어에서 직접 수행하게 했다. 인텔 80486DX 프로세서에는 부동소수점 하드웨어가 칩에 내장되었다. 인텔은 그보다 가격이 싼 80486SX를 출시했는데, 부동소수점 하드웨어가 없는 것이었다. 또한 80487SX 코프로세서를 판매하였고, 이는 설치되면 기본적으로 주 프로세서를 작동하지 않게 하였는데, 이는 80487SX가 다른 세트의 핀으로 접속되는 완전한 80486DX였기 때문이다.Scott Mueller, *Upgrading and repairing PCs* 15판, Que Publishing, 2003 , 108~110쪽 80486 후의 인텔 프로세서는 부동소수점 하드웨어를 주 프로세서 칩에 통합했다. 이러한 진전으로 선택적 부품으로 부동소수점 프로세서를 판매하는 가격적 이점이 사라지게 되었다. 이들 칩에 내장된 부동소수점 프로세서는 여전히 코프로세서라 불리는데, 이들이 CPU와는 병렬적으로 작동되기 때문이다.
## 웨이텍 코프로세서
8비트와 16비트 개인용 컴퓨터의 시대, 또 다른 부동소수점 코프로세서로 웨이텍(Weitek) 코프로세서가 있었다. 이 코프로세서는 명령 집합이 인텔 코프로세서와는 달랐으며, 모든 마더보드가 지원하지는 않았다. 웨이텍 프로세서는 x87 종류처럼 선험적인 수학 함수(예를 들면, 삼각 함수)를 제공하지 않았으며, 함수의 지원을 위해 특별한 소프트웨어 라이브러리가 필요했다.Scott Mueller, *Upgrading and Repairing PCs, Second Edition*, Que Publishing, 1992, , p.412~413
## 모토롤라 코프로세서
모토롤라 68000 계열로 모토롤라 68881/68882 코프로세서가 있었으며, 인텔 프로세서와 유사하게 부동소수점 계산 속도를 빠르게 했다. 68000 계열을 사용하지만 부동소수점 하드웨어가 없는 컴퓨터는 소프트웨어로 부동소수점 명령을 흉내낼 수 있었고, 느리긴 하지만 두 곳 모두 하나의 2진 버전의 프로그램을 배포할 수 있었다. 68451 메모리 관리 코프로세서는 68020 프로세서와 함께 작동하도록 설계되었다.William Ford, William R. Topp, *Assembly language and systems programming for the M68000 family*, Jones & Bartlett Learning, 1992, p.892 이후.
## 현대의 코프로세서
1990년대 초에는 사운드 블라스터 AWE32 등 일부 사운드 카드에는 전용 프로세서가 있어서 디지털 다중 채널 혼성과 실시간 DSP 효과를 제공하기도 했다. 최근의 예로는 사운드 블라스터 오디지와 사운드 블라스터 X-Fi가 있다. 2000년을 전후로 그래픽 카드 형태의 전용 그래픽 처리 장치(GPU, Graphics Processing Units)가 보급되었다. 2006년 에이지아(Ageia)에서는 컴퓨터에서 사용되는 PhysX라는 부속 카드를 발표하였다. PhysX는 복잡한 물리 계산을 수행하도록 설계되었기에, CPU와 GPU는 이러한 시간을 소비하는 계산을 하지 않아도 되었다. 부속 카드는 비디오 게임용으로 설계되었고, 수학적인 사용을 개발하는 것은 이론적으로는 가능했다. 2008년, 엔비디아에서 PhysX를 매입하여 카드 조립 공정을 폐지하기 시작했고, 그 기능은 CUDA에서와 같은 방식으로 소프트웨어를 통하여 GPU의 일반 그래픽 연산을 담당하는 코어에서 PhysX를 렌더링하는 것으로 더해졌다. 2006년, 빅풋 시스템은 킬러NIC 이라 명명한 PCI 부속 카드를 선보였다. 이 카드는 400 MHz의 프리스케일 파워QUICC에서 운용되는 고유의 리눅스 커널이 구동되었고, 프리스케일 칩은 네트워크 프로세서, 약칭 NPU라 불렀다. 2007년, 스퍼스엔진(SpursEngine)은 셀 마이크로아키텍처에 기반한 코프로세스가 장착된 매체 지향 부속 카드를 출시하였다. 2008년, 크로노스 그룹은 하나의 공통된 언어로 일반용 CPU와 ATI/AMD 와 엔비디아 GPU 모두를 지원하는 것을 목표로 하는 OpenCL을 내놓았다. 2012년, 인텔은 MIC(Xeon Phi) 코프로세서를 발표하였다. 2010년대, 일부 모바일 컴퓨팅 기기에서는 코프로세서로 센서 허브를 구현하였다. 모바일 기기에서의 센서 통합을 다루는 데 사용된 코프로세서의 예로는 애플 M7과 M8 모션 코프로세서, 퀄컴 스냅드래곤 센서 코어와 퀄컴 헥사곤, 미이크로소프트 홀로렌즈(HoloLens)에 사용되는 홀로그래픽 프로세스 유닛 등이 포함된다.
## 기타 코프로세서들
* MIPS 아키텍처는 메모리 관리, 부동소수점 연산에 쓰이는 코프로세서 유닛을 최고 4개까지 지원하며, 그래픽 가속 등 기타 작업에 사용하는 정의되지 않은 2개의 코프로세서를 지원한다.Erin Farquhar, Philip Bunce, *The MIPS programmer's handbook*,Morgan Kaufmann, 1994 , 부록 A3 p.330 * FPGA (현장 프로그래머블 게이트 어레이)를 사용하면 디지털 신호 처리와 같은 특정 처리 작업의 가속화를 위한 맞춤형 코프로세서를 생성할 수 있다. * TLS/SSL 가속기가 서버에서 사용된다. * 일부 멀티 코어 칩에서는 그중 하나가 주 프로세서이면 나머지 프로세서들은 지원하는 코프로세서가 되도록 프로그래밍 할 수 있다.