Arm v8에서 명령 확장
Arm의 차세대 CPU 명령어 세트 아키텍처(ISA : Instruction Set Architecture)인 Armv9가 서서히 모습을 드러내고 있습니다. Arm은 현 세대의 ISA인 Arm v8을 단계적으로 확장하며, Arm v9로 건너가는 경로로 삼고 있습니다. Arm v9는 생산성 향상이 가장 중요하다고 보며, Arm v8.3 이후엔 보안에 중점을 두고 확장해 나가며 Arm v9로 향해 나가고 있습니다.
보안 확장에 초점을 맞춘 Arm 구조
클라이언트에서 보안이 중요해짐
Arm의 명령 세트 아키텍처의 진화는 IT 분야에서 매우 중요합니다. 고성능 CPU의 명령 세트 아키텍처가 x86/x64 시스템과 Arm 계열의 2개로 거의 독점된 상황이거든요. 모바일과 임베디드는 Arm의 세력이 가장 큽니다. Arm 자체의 CPU 코어 IP를 쓰지 않아도 애플 A 시리즈 SoC, 퀄컴 스냅드래곤 SoC의 Kryo 코어는 Arm의 명령어 세트를 내장합니다. Arm의 명령 세트 아키텍처의 변화는 많은 컴퓨팅 장치에 영향을 줍니다.
Arm은 2011년 Arm v8에서 CPU ISA를 64비트로 구성하면서 아키텍처를 극적으로 바꿨습니다. 간단하게 정리한 64bit 아키텍처 AArch64에서 ISA를 수정했습니다. 그리고 Arm v8의 기반 위에 Arm은 현재 확장 명령을 쌓아가고 있습니다. 이러한 확장에는 가상화 및 RAS 등 서버에 대한 시스템적인 확장, 심층 학습을 위한 연산 확장, 그리고 보안 확장의 3가지 방향이있습니다.
Arm v8-A 프로필 아키텍처의 확장
또 Arm은 앞으로 CPU 아키텍처 확장의 방향성도 제시했습니다. CPU 코어 수의 확장을 위해 트랜잭션 메모리를 도입, 자동차용 제품에 필요한 세이프 기능을 추가, 딥 러닝에서 매트릭스 연산 지원, 벡터 연산을 256비트로 확장합니다. 256비트를 어떻게 추진하는지는 밝히지 않았지만요.
매트릭스 연산 유닛을 CPU 코어에 통합
매트릭스 연산 유닛으로 딥 러닝 성능이 2배 향상
인프라 확장
또 Arm에서 라이센스를 받은 사용자가 커스텀 명령을 Arm 명령어 세트에 통합할 수 있습니다. 커스텀 명령은 임베디드 Cortex-M부터 시작하지만 리얼타임 Cortex-R이나 컴퓨팅을 위한 Cortex-A도 계획하고 있습니다. Arm CPU의 명령 세트 아키텍처가 나뉘는 걸 막기 위해 지금까지는 라이센스받은 사용자들이 커스텀 명령을 추가하지 못하도록 했습니다. Cortex-A 급에서 커스텀 명령은 파편화를 막기 위해 조심스럽게 진행합니다. 커스텀 명령을 인정하는 RISC-V 명령어 세트 아키텍처에 대항하기 위해 커스텀 명령을 도입한다고 여겨집니다.
Arm 아키텍처에 커스텀 명령을 도입
커스텀 명령어는 Arm Cortex-M 프로파일에서 먼저
커스텀 명령을 Arm의 기존 연산 코드 스페이스에 넣고, 명령어 인출과 라이트백은 공유ㅏ는 구조
매년 버전이 오르는 Armv8-A 명령어 세트
현 세대 Arm CPU의 명령어 세트 아키텍처는 8세대 해당되는 Arm v8입니다. 그리고 프로파일에 따라 3가지 ISA가 나뉩니다. 고성능 CPU인 Cortex-A이 Arm v8-A, 리얼타임 CPU인 Cortex-R는 Arm v8-R, 임베디드 MCU인 Cortex-M은 Arm v8-M입니다. 이들 프로파일마다 명령어 세트가 다릅니다.
또 명령어 세트가 마이너 버전 업그레이드를 하기도 합니다. 고성능 CPU를 위한 Armv8-A도 버전에서 소수점 이하의 숫자가 바뀌었습니다. Armv8.1-A에서 시작해 매년 0.1씩 올라 지금은 Armv8.6-A가 나왔습니다. Armv8.6-A가 2019년의 ISA 확장, Armv8.5-A가 2018년, Armv8.4-A가 2017년 같은 식입니다.
원래 Arm의 ISA는 소수점 버전이 새로 바뀔때마다 거기에 맞춰 Arm의 CPU 코어 IP에 새 버전이 추가됐습니다. 그러나 지금은 그렇지 않습니다. Arm의 하이엔드 CPU 코어 IP인 Cortex-A77의 ISA 버전은 Armv8.2-A입니다. 차세대 코어인 헤라클레스도 Armv8.2-A입니다. 2015년의 Armv8.2-A 이후 CPU 코어 IP의 ISA 버전이 오르지 않았습니다.
아키텍처 라이센스를 받아 개발한 독특한 디자인의 Arm v8 계열 CPU 코어도 비슷한 상황입니다. 퀄컴 Kryo 시리즈를 비롯해 대부분은 Arm v8.2-A에 머물러 있고, 애플만 Arm v8.3-A입니다. 그 다음 버전인 Arm v8.x 계열이 발표됐지만 CPU에 구현된 사례는 없습니다.
그 이유는 복잡합니다. 먼저 ISA 버전과 CPU에 구현한 ISA 버전의 이름은 다릅니다. 각 Arm v8.x 세대의 ISA 버전은 여러 기능이 포함됩니다. 허나 Arm ISA는 특정 세대의 기능을 모두 갖췄을때만 그 버전과 호환된다고 이름을 붙일 수 있습니다. 예를 들어 Arm v8.2-A 기능을 구현하면 Arm v8.2-A CPU가 됩니다. 그러나 Arm v8.0-A 외에 Arm v8.2-A의 기능을 일부 구현한다면 Arm v8.2-A CPU가 아니라 Arm v8.0-A CPU가 됩니다.
실제 코어 IP는 Cortex-A77이 Arm v8.2-A까지의 모든 기능을 구현하지만, Arm v8.3-A와 Arm v8.4-A의 기능은 완전히 구현하지 않았습니다. 그래서 ISA 버전으로 치면 Arm v8.2-A CPU가 됩니다. Arm v8.4-A를 완벽하게 구현한 CPU 코어는 현재 없습니다. 기능을 일부만 빼내어 쓰기에 Arm v8 ISA 버전 표기 조건을 맞추지 못하고, 예전 버전에 머무른 것처럼 보입니다.
Arm v8.xA 아키텍처와 CPU 코어 IP 연결
그러나 이 상황은 조만간 바귈 것 같습니다. Arm CPU 코어가 다음 다음 세대인 마테호른(Matterhorn)이 되면 Arm v8.6-A까지의 많은 기능을 전부 구현합니다. 명령어 세트에선 마테호른이 큰 전환점이 됩니다. Arm CPU의 코드네임이 그리스 신화의 신 이름에서 산 이름으로 바뀌는데, 코드네임 뿐만 아니라 CPU 아키텍처도 크게 바뀝니다. 마테호른은 Arm v9을 준비하는 CPU가 될 것 같습니다.
보안 확장에 초점을 맞췄던 지난 2년 동안의 Arm v8.x 명령 확장
Arm의 명령 세트에 단계적으로 기능이 추가 될 때마다 거기에 맞춘 Arm CPU 코어 IP도 나왔습니다. 그러나 Armv8.2-A 이후로는 잘 구현되지 않았고 새로운 기능은 계속 쌓이기만 했습니다. 앞서 말한대로 CPU 코어의 ISA 버전이 Arm v8.2-A 이후로 발전하지 않아서입니다.
그 이유는 뭘까요? Arm v8.2-A 이후의 기능 때문입니다. 지난 3세대의 Arm v8.x 확장은 보안에 주력했습니다. 특히 Arm v8.4-A와 8.5-A는 거의 보안 관련 확장입니다. 2017년에 나온 사이드 채널 공격인 멜트다운과 스펙터 이후로 CPU 마이크로 아키텍처의 보안을 중요하게 여기면서 CPU 개발사들이 마이크로 아키텍처와 CPU 아키텍처에 보안 기능을 추가해 왔습니다.
Arm은 Arm 플랫폼에 의존도가 높은 구글이 아키텍처 차원에서 보안 대책을 추진했습니다. 그 결과가 Arm v8.4-A(2017)와 Arm v8.5-A(2018) 같은 최신 ISA 버전에 포함됐습니다. SIMD/FP(부동 소수점) 연산이 녹색, 보안이 보라색, 시스템/메모리 기능이 카키색입니다.
보안 기능은 Arm v8.3-A에서 시작해 Arm v8.4-A/Arm v8.5-A에서 대번에 늘었습니다.
레지스터 키가 맞는 메모리에만 액세스 가능한 메모리 태깅
Arm v8.3-A에 도입된 Pointer Authentication은 Arm v8.6-A로 확장
Arm v8.5-A의 또 다른 중요한 보안 기능 Branch Target Indicators (BTI)
그리고 이런 보안 기능은 소프트웨어 파트너와 협력이 매우 중요합니다. 파트너와 보안 기능의 검증을 진행하고 실제 IP에서 구현할 수 있는 단계까지 상당한 시간이 필요합니다. 보안에 취약점이 있는지 검증해야 하니까요. 위에서 소개한 보안 확장 중에서도 가장 중요한 Memory Tagging이 갖춰진 건 Arm v8.5-A이며, 그걸 구현한지 2년이 지난 2020년의 마테호른 세대에서야 도입하는 것도 이런 사정 때문이라 보입니다.
보안에서 딥 러닝으로
사이드 채널 공격 문제가 고성능 CPU 아키텍처 개발을 급격히 변화시켰습니다. 그 전까지는 속도만 높이면 됐지만 멜트다운/스펙터 이후 보안 문제의 확인이 꼭 필요해졌습니다. 그리고 사이드 채널 공격에 대한 근본적인 보안 기능을 아키텍처/이크로 아키텍처에 통합할 필요가 생겼습니다.
고성능 CPU 제조사는 2017년 중반 이후 이 문제를 해결하는데 바빴습니다. Arm뿐만 아니라 인텔이나 AMD를 비롯한 모든 고성능 CPU 제조사의 목표는 사이드 채널 공격에서 아키텍처를 보호하는 것이 됐습니다.
Arm v8-A 명령어 세트의 진화는 이러한 상황을 명확하게 보여주고 있습니다. Arm 보안 확장은 Arm v8.5-A로 우선 끝내고, 마테호른의 구현으로 넘어갔습니다. 그래서일까요? 다음 명령 확장인 Arm v8.6-A는 보안이 아니라 딥 러닝 지원에 초점을 맞췄습니다.
Arm은 Arm v8.2-A에서 FP16을 지원하고 Arm v8.4-A에선 8비트 Dot Product 명령어를 지원합니다. CPU의 SIMD 연산에서 딥 러닝 지원을 강화하고 있습니다. Arm v8.6-A는 매트릭스 연산과 BFloat16을 지원하여 딥 러닝을 강화합니다. CPU에 매트릭스 연산과 BFloat16을 도입하는 이유 중 하나는 부담이 적은 엣지 디바이스에서 딥러닝을 처리하기 위해서입니다. 클라우드의 무거운 학습이 아니라 그 중간 단계나 엣지에서 가벼운 학습이 가능합니다.
Arm 매트릭스 연산의 bfloat16
Arm CPU 아키텍처에서 bfloat16를 지원해 AI를 강화
Arm v8-A의 SIMD 연산은 두 가지로 나뉩니다. Arm v8 표준 SIMD 명령어는 NEON(aarch64는 ASIMD)입니다. 슈퍼컴퓨터를 위해 후지쯔가 개발한 Scalable Vector Extension(SVE)도 있습니다. Arm v8.x의 요구 스펙은 ASIMD와 SVE 중 하나만 지원하면 되며, 모두 다 지원할 필요는 없습니다. 그리고 Arm은 당분간 ASIMD와 SVE를 함께 개발하며 매트릭스 연산도 ASIMD와 SVE 모두 구현합니다. 하지만 SVE는 슈퍼컴퓨터를 위한 명령어이며 ASIMD로 대체할 상황은 아닙니다.