# IA-64

Intel Itanium architecture| 설계 기업 및 설계자 | HP 및 인텔 |
| 비트 | 64비트 |
| 발표 | 2001 |
| 구조 | EPIC |
| 유형 | 로드-스토어 구조 |
| 인코딩 | 고정 |
| 분기 | 조건부 레지스터(Condition register) |
| 엔디언 | 선택 가능 |
| 레지스터 |
| 범용 목적 | 128 (64비트 + 1 트랩 비트; 32는 고정, 96은 레지스터 윈도 사용); 64 1-bit predicate registers |
| 부동소수점 | 128 |

**IA-64**(**Intel Itanium architecture**)는 단종된 64비트 인텔 마이크로프로세서의 아이테니엄 계열의 명령어 집합 (ISA)이다. 기본 ISA 사양은 휴렛 팩커드(HP)에서 시작되었으며, 이후 인텔이 HP와 협력하여 구현했다. 첫 아이테니엄 프로세서인 코드명 메르세드는 2001년에 출시되었다.

아이테니엄 아키텍처는 명시적인 명령어 수준 병렬성을 기반으로 하며, 컴파일러가 병렬로 실행할 명령어를 결정한다. 이는 런타임에 프로세서가 명령어 종속성을 관리하는 슈퍼스칼라 아키텍처와 대조된다. 투킬라를 포함한 모든 아이테니엄 모델에서 코어는 클럭당 최대 6개의 명령어를 실행한다.

2008년 아이테니엄은 x86-64, 파워 ISA, SPARC에 이어 기업급 시스템에서 네 번째로 많이 배포된 마이크로프로세서 아키텍처였다.

2019년 인텔은 IA-64 아키텍처를 지원하는 마지막 CPU의 단종을 발표했다. 마이크로소프트 윈도우 버전은 IA-64를 지원했지만, 지원이 중단되었으며, 예를 들어 리눅스 커널은 훨씬 더 오랫동안 지원했지만 2024년 버전 6.7부터 지원을 중단했다(리눅스 6.6 LTS에서는 여전히 지원됨). HP-UX, OpenVMS, FreeBSD와 같은 몇몇 다른 운영체제만 IA-64를 지원했으며; HP-UX와 OpenVMS는 여전히 지원하지만 FreeBSD는 FreeBSD 11에서 지원을 중단했다.

## 역사

인텔 아이테니엄 아키텍처
### 개발

1989년, HP는 축소 명령어 집합 컴퓨터(RISC) 아키텍처가 클럭당 하나의 명령어 처리 한계에 접근하고 있다는 우려를 가지기 시작했다. 인텔과 HP 연구원들은 모두 미래 설계에 대한 컴퓨터 아키텍처 옵션을 탐색하고 있었고, 1980년대 초 예일 대학교의 연구에서 비롯된 초장명령어 워드(VLIW)라는 새로운 개념을 따로 조사하기 시작했다.

VLIW는 단일 명령어 워드에 여러 명령어를 하나의 매우 긴 명령어 워드로 인코딩하여 프로세서가 각 클럭 사이클에서 여러 명령어를 실행하도록 하는 컴퓨터 구조 개념이다(RISC 및 CISC와 유사). 일반적인 VLIW 구현은 컴파일 시간에 어떤 명령어를 동시에 실행할 수 있는지와 이 명령어의 실행을 위한 적절한 스케줄링을 결정하고 분기 작업의 방향을 예측하는 데 정교한 컴파일러에 크게 의존한다. 이 접근 방식의 가치는 더 적은 클럭 사이클에서 더 유용한 작업을 수행하고 프로세서 명령어 스케줄링 및 분기 예측 하드웨어 요구 사항을 단순화하는 것이며, 더 빠른 실행을 위해 프로세서 복잡성, 비용 및 에너지 소비가 증가하는 단점이 있다.

### 생산

이 기간 동안 HP는 자체와 같은 개별 기업 시스템 회사들이 독점 마이크로프로세서를 개발하는 것이 더 이상 비용 효율적이지 않다고 믿기 시작했다. 인텔 또한 x86 ISA를 넘어선 여러 아키텍처 옵션을 연구하여 고성능 엔터프라이즈 서버 및 고성능 컴퓨팅(HPC) 요구 사항을 충족하려 했다.

인텔과 HP는 1994년 IA-64 ISA 개발을 위해 협력했으며, 인텔이 명시적 병렬 명령어 컴퓨팅(EPIC)이라고 명명한 VLIW 설계 개념의 변형을 사용했다. 인텔의 목표는 HP가 초기 VLIW 작업에서 개발한 전문 지식과 자체 기술을 활용하여 앞서 언급한 고급 시스템을 대상으로 모든 OEM(Original Equipment Manufacturer)에 판매할 수 있는 대량 생산 제품 라인을 개발하는 것이었고, HP는 인텔의 대량 생산 및 최신 공정 기술을 사용하여 PA-RISC 프로세서보다 우수한 기성 프로세서를 구매할 수 있기를 원했다.

인텔은 설계 및 상용화 프로세스를 주도했으며, HP는 ISA 정의, Merced/Itanium 마이크로아키텍처 및 아이테니엄 2에 기여했다. 첫 아이테니엄 제품군인 Merced를 출시하려던 원래 목표 연도는 1998년이었다.

### 마케팅

인텔의 제품 마케팅 및 산업 참여 노력은 상당했으며, 당시 RISC 프로세서를 기반으로 한 대부분의 기업 서버 OEM과의 설계 계약을 따냈다. 산업 분석가들은 IA-64가 서버, 워크스테이션, 고급 데스크톱에서 지배적인 위치를 차지하고 궁극적으로 모든 범용 응용 프로그램에서 RISC 및 CISC 아키텍처를 대체할 것이라고 예측했다. 컴팩과 실리콘 그래픽스는 Alpha와 MIPS 아키텍처의 추가 개발을 포기하고 IA-64로 전환하기로 결정했다.

1997년이 되자 IA-64 아키텍처와 컴파일러가 원래 생각했던 것보다 구현하기 훨씬 어렵다는 것이 분명해졌고, 아이테니엄의 출시는 지연되기 시작했다. 아이테니엄은 최초의 EPIC 프로세서였기 때문에 개발 노력은 팀이 예상했던 것보다 더 많은 예상치 못한 문제에 부딪혔다. 게다가 EPIC 개념은 이전에 구현된 적 없는 컴파일러 기능에 의존했으므로 더 많은 연구가 필요했다.

여러 그룹이 이 아키텍처를 위한 운영체제를 개발했는데, 여기에는 마이크로소프트 윈도우, 유닉스 및 유닉스 계열 시스템(예: 리눅스, HP-UX, FreeBSD, 솔라리스, Tru64 UNIX, 그리고 몬터레이/64 (마지막 세 개는 시장에 출시되기 전에 취소됨)가 포함된다. 1999년, 인텔은 리눅스를 IA-64로 포팅하기 위한 오픈소스 산업 컨소시엄("Trillium", 이후 상표권 문제로 "Trillian"으로 개명) 구성을 주도했으며, 이 컨소시엄은 인텔이 주도하고 칼데라 시스템즈, CERN, 시그너스 솔루션스, 휴렛 팩커드, IBM, 레드햇, SGI, SUSE, 터보리눅스 및 VA 리눅스 시스템즈가 참여했다. 그 결과, 작동하는 IA-64 리눅스가 예정보다 일찍 출시되었으며, 새로운 아이테니엄 프로세서에서 실행되는 최초의 운영체제였다.

인텔은 1999년 10월 4일 프로세서의 공식 명칭을 아이테니엄으로 발표했다. 몇 시간 만에 유즈넷 뉴스그룹에서 이 명칭에 대한 말장난으로 아이테닉이라는 이름이 붙여졌다. 아이테닉은 1912년 처녀 항해에서 침몰한 "가라앉지 않는" 타이타닉호에서 유래했다.

바로 다음 날인 1999년 10월 5일, AMD는 인텔의 x86 명령어 집합을 확장하여 완벽하게 하위 호환되는 64비트 모드를 포함할 계획을 발표했으며, AMD의 새로운 x86 64비트 아키텍처가 AMD의 차기 8세대 마이크로프로세서인 SledgeHammer에 통합될 것이라고 추가로 밝혔다. AMD는 또한 아키텍처 사양 및 추가 세부 정보가 2000년 8월에 공개될 것이라고 밝혔다.

AMD는 IA-64 아키텍처에 기여하는 당사자로 초대된 적이 없었고 어떤 종류의 라이센싱도 불가능해 보였기 때문에, AMD의 AMD64 아키텍처 확장은 기존 x86 아키텍처에 64비트 컴퓨팅 기능을 추가하는 진화적인 방법으로 처음부터 자리매김했으며, 레거시 32비트 x86 코드도 여전히 지원했다. 이는 IA-64로 완전히 새로운, x86과 완전히 호환되지 않는 64비트 아키텍처를 만드는 인텔의 접근 방식과는 대조적이었다.

### 단종

2019년 1월, 인텔은 키트슨(Kittson)이 단종될 것이며, 마지막 주문일은 2020년 1월, 마지막 선적일은 2021년 7월이 될 것이라고 발표했다. 2023년 11월, IA-64 지원은 리눅스 커널에서 제거되었으며, 이후 트리 외부에서 유지되고 있다.

## 아키텍처

인텔은 아이테니엄의 명령어 집합을 광범위하게 문서화했으며, 기술 언론에서는 개요를 제공했다.

이 아키텍처는 역사상 여러 번 이름이 변경되었다. HP는 원래 이를 PA-WideWord라고 불렀다. 인텔은 나중에 IA-64라고 불렀고, 그 다음에는 아이테니엄 프로세서 아키텍처(IPA)라고 불렀다. 최종적으로 인텔 아이테니엄 아키텍처로 정착했지만, 여전히 IA-64로 널리 불린다.

이것은 64비트 레지스터가 풍부한 명시적 병렬 아키텍처이다. 기본 데이터 워드는 64비트이며, 바이트 주소 지정이 가능하다. 논리 주소 공간은 264바이트이다. 이 아키텍처는 술어, 추측 실행, 그리고 분기 예측을 구현한다. 매개변수 전달을 위해 가변 크기 레지스터 윈도잉을 사용한다. 동일한 메커니즘은 루프의 병렬 실행을 허용하는 데도 사용된다. 추측 실행, 예측, 술어, 그리고 이름 변경은 컴파일러의 제어 하에 있다. 각 명령어 워드에는 이를 위한 추가 비트가 포함된다. 이 접근 방식은 아키텍처의 특징적인 요소이다.

이 아키텍처는 많은 수의 레지스터를 구현한다.

* 128개의 일반 정수 프로세서 레지스터. 이들은 64비트이며 투기적 실행에 사용되는 트랩 비트("NaT", "nothing"의 약자)가 하나 더 있다. 이 중 32개는 정적이고, 나머지 96개는 가변 크기 레지스터 윈도를 사용하거나 파이프라인 루프를 위해 회전한다. `gr0`은 항상 0을 읽는다.
* 128개의 부동소수점 레지스터. 부동소수점 레지스터는 중간 결과의 정밀도를 유지하기 위해 82비트 길이이다. 정수 레지스터와 같은 전용 "NaT" 트랩 비트 대신, 부동소수점 레지스터는 "NaTVal"("Not a Thing Value")이라는 트랩 값을 가지며, 이는 NaN과 유사하지만 구별된다. 이 레지스터들 역시 32개의 정적 레지스터와 96개의 윈도우 또는 회전 레지스터를 가진다. `fr0`은 항상 +0.0을 읽고, `fr1`은 항상 +1.0을 읽는다.
* 64개의 1비트 술어 레지스터. 이들은 16개의 정적 레지스터와 48개의 윈도우 또는 회전 레지스터를 가진다. `pr0`은 항상 1(참)을 읽는다.
* 8개의 분기 레지스터는 간접 점프 주소를 위한 것이다. `br0`은 `br.call`로 함수가 호출될 때 반환 주소로 설정된다.
* 128개의 특수 목적(또는 "응용 프로그램") 레지스터는 주로 커널에 관심이 있으며 일반 응용 프로그램에는 해당되지 않는다. 예를 들어, `bsp`라는 한 레지스터는 레지스터 창이 래핑될 때 하드웨어가 자동으로 레지스터를 스필하는 두 번째 스택을 가리킨다.

각 128비트 명령어 워드를 번들(bundle)이라고 하며, 각각 41비트 명령어를 담는 세 개의 슬롯과 각 슬롯에 어떤 종류의 명령어가 들어있는지를 나타내는 5비트 템플릿으로 구성된다. 이러한 종류에는 M-유닛(메모리 명령어), I-유닛(정수 ALU, 비ALU 정수, 또는 긴 즉시 확장 명령어), F-유닛(부동소수점 명령어), 또는 B-유닛(분기 또는 긴 분기 확장 명령어)이 있다. 템플릿은 또한 스톱(stop)을 인코딩하는데, 이는 스톱 전후의 데이터 사이에 데이터 종속성이 존재함을 나타낸다. 한 쌍의 스톱 사이에 있는 모든 명령어는 번들링과 관계없이 명령어 그룹을 구성하며, 많은 유형의 데이터 종속성으로부터 자유로워야 한다. 이 지식은 프로세서가 자체적으로 복잡한 데이터 분석을 수행할 필요 없이 병렬로 명령어를 실행할 수 있도록 한다. 이러한 분석은 명령어가 작성될 때 이미 수행되었기 때문이다.

각 슬롯 내에서, 몇 가지 예외를 제외하고 모든 명령어는 술어화되며, 술어 레지스터를 지정하는데, 이 레지스터의 값(참 또는 거짓)에 따라 명령어가 실행될지 여부가 결정된다. 항상 실행되어야 하는 술어화된 명령어는 항상 참을 읽는 `pr0`에 술어화된다.

IA-64 어셈블리 언어와 명령어 형식은 주로 컴파일러에 의해 작성되도록 의도적으로 설계되었으며, 사람에 의해 작성되지 않는다. 명령어는 세 개의 번들로 그룹화되어야 하며, 세 개의 명령어가 허용된 템플릿과 일치해야 한다. 명령어는 특정 유형의 데이터 종속성 사이에 스톱을 발행해야 하며, 스톱은 허용된 템플릿에 따라 제한된 위치에서만 사용할 수 있다.

### 명령어 실행

페치(fetch) 메커니즘은 클럭당 최대 두 개의 번들을 L1 캐시에서 파이프라인으로 읽을 수 있다. 컴파일러가 이를 최대한 활용할 수 있을 때, 프로세서는 클럭 사이클당 6개의 명령어를 실행할 수 있다. 프로세서에는 11개의 그룹에 30개의 기능 실행 유닛이 있다. 각 유닛은 명령어 집합의 특정 하위 집합을 실행할 수 있으며, 각 유닛은 데이터 대기 때문에 실행이 멈추지 않는 한 클럭당 하나의 명령어 속도로 실행한다. 그룹의 모든 유닛이 명령어 집합의 동일한 하위 집합을 실행하는 것은 아니지만, 일반적인 명령어는 여러 유닛에서 실행될 수 있다.

실행 유닛 그룹에는 다음이 포함된다.

* 6개의 범용 ALU, 2개의 정수 유닛, 1개의 시프트 유닛
* 4개의 데이터 캐시 유닛
* 6개의 멀티미디어 유닛, 2개의 병렬 시프트 유닛, 1개의 병렬 곱셈, 1개의 인구 계산 유닛
* 2개의 82비트 부동소수점 곱셈-누산기 유닛, 2개의 SIMD 부동소수점 곱셈-누산기 유닛 (각각 2개의 32비트 연산)
* 3개의 분기 유닛

이상적으로는 컴파일러가 명령어를 동시에 실행할 수 있는 여섯 개씩의 그룹으로 묶을 수 있다. 부동소수점 유닛은 곱셈-누산기 연산을 구현하므로, 애플리케이션이 곱셈 후 덧셈을 요구할 때 단일 부동소수점 명령어가 두 명령어의 작업을 수행할 수 있다. 이는 과학 연산에서 매우 일반적이다. 이러한 경우 프로세서는 클럭당 4 FLOPs를 실행할 수 있다. 예를 들어, 800 MHz 아이테니엄은 이론적으로 3.2 GFLOPS의 성능을 가졌고, 1.67 GHz의 가장 빠른 아이테니엄 2는 6.67 GFLOPS로 평가되었다.

실제로 프로세서는 데이터 종속성이나 사용 가능한 번들 템플릿의 한계 등으로 인해 모든 슬롯이 유용한 명령어로 채워지지 않아 종종 활용도가 낮을 수 있다. 가장 밀집된 코드는 명령어당 42.6비트를 요구하며, 이는 당시 전통적인 RISC 프로세서의 명령어당 32비트와 비교된다. 낭비되는 슬롯으로 인한 불필요한 작업(no-ops)은 코드의 밀도를 더욱 떨어뜨린다. 투기적 로드 및 분기와 캐시에 대한 힌트를 위한 추가 명령어는 최적으로 생성하기 비실용적이다. 왜냐하면 컴파일러는 여러 프로세스를 실행하고 인터럽트를 처리하는 시스템에서 다른 캐시 수준의 내용을 예측할 수 없기 때문이다.

### 메모리 아키텍처

2002년부터 2006년까지 아이테니엄 2 프로세서는 공통 캐시 계층을 공유했다. 이들은 16 KB의 레벨 1 명령어 캐시와 16 KB의 레벨 1 데이터 캐시를 가졌다. L2 캐시는 통합되어 (명령어 및 데이터 모두) 256 KB였다. 레벨 3 캐시 또한 통합되었고 크기는 1.5 MB에서 24 MB까지 다양했다. 256 KB L2 캐시에는 메인 산술 논리 장치(ALU)를 방해하지 않고 세마포어 작업을 처리하기에 충분한 로직이 포함되어 있었다.

주 메모리는 오프칩 칩셋으로의 버스를 통해 접근된다. 아이테니엄 2 버스는 처음에는 매킨리 버스(McKinley bus)라고 불렸지만, 지금은 보통 아이테니엄 버스라고 불린다. 버스 속도는 새로운 프로세서 출시와 함께 꾸준히 증가했다. 버스는 클럭 사이클당 2×128비트를 전송하므로, 200 MHz 매킨리 버스는 6.4 GB/s를 전송했고, 533 MHz 몬테시토 버스는 17.056 GB/s를 전송한다.

### 아키텍처 변경 사항

2006년 이전에 출시된 아이테니엄 프로세서는 레거시 서버 애플리케이션을 지원하기 위해 IA-32 아키텍처에 대한 하드웨어 지원을 제공했지만, IA-32 코드의 성능은 네이티브 코드보다 훨씬 나빴으며 동시대 x86 프로세서의 성능보다도 나빴다. 2005년 인텔은 더 나은 성능을 제공하는 소프트웨어 에뮬레이터인 IA-32 실행 계층(IA-32 EL)을 개발했다. 따라서 몬테시토부터 인텔은 IA-32 코드에 대한 하드웨어 지원을 없앴다.

2006년, 몬테시토 출시와 함께 인텔은 기본 프로세서 아키텍처에 여러 가지 개선 사항을 적용했다.

* 하드웨어 멀티스레딩: 각 프로세서 코어는 두 개의 실행 스레드에 대한 컨텍스트를 유지한다. 한 스레드가 메모리 액세스 중 멈추면 다른 스레드가 실행될 수 있다. 인텔은 이를 하이퍼스레딩 기술과 구별하기 위해 "코스 멀티스레딩"이라고 부른다. 인텔은 일부 x86 및 x86-64 마이크로프로세서에 이 기술을 통합했다.
* 가상화를 위한 하드웨어 지원: 인텔은 코어 가상화 기능을 위한 하드웨어 지원을 제공하는 인텔 가상화 기술(Intel VT-i)을 추가했다. 가상화를 통해 소프트웨어 "하이퍼바이저"가 프로세서에서 여러 운영체제 인스턴스를 동시에 실행할 수 있다.
* 캐시 개선 사항: 몬테시토는 분할된 L2 캐시를 추가했는데, 여기에는 명령어 전용 1 MB L2 캐시가 포함되었다. 원래 256 KB L2 캐시는 전용 데이터 캐시로 전환되었다. 몬테시토는 또한 최대 12 MB의 온다이 L3 캐시를 포함했다.

* 인텔 아이테니엄 마이크로프로세서 목록

* Intel Itanium Home Page
* Hewlett Packard Enterprise Integrity Servers Home Page
* Intel Itanium Specifications
* Some undocumented Itanium 2 microarchitectural information - 웨이백 머신 (보관됨 2007-02-23)
* IA-64 tutorial, including code examples
* Itanium Docs at HP