ZEN의 부동 소수점 / SIMD 파이프는 4 명령 병렬 구성
AMD는 ZEN 마이크로 아키텍처의 부동 소수점 / SIMD 파이프 라인도 완전히 다시 설계했습니다. ZEN 부동 소수점 / SIMD (Single Instruction, Multiple Data) 연산 유닛은 128-bit 폭 SIMD 곱셈 & 제곱 연산 유닛 (MUL / FMAD)와 128-bit SIMD의 덧셈 유닛 (ADD)의 조합이 2 세트니 총 4 파이프가 됩니다. 총 128비트의 곱셈/제곱 연산 유닛이 2+2개니 4스테이지/사이클 명령 발행이 가능합니다. 디스패처의 출력도 최대 4 마이크로 OP가 됩니다. 128-bit라고 해도 SIMD에서 32-bit 단정밀도일 경우이며 4-way 64-bit 배정밀도라면 2-way가 됩니다.
불도저 아키텍처는 부동 소수점 / SIMD 연산 유닛은 총 4개입니다. 128-bit의 제곱 연산 유닛 (FMAD)이 2 개로 128-bit의 SIMD 제곱 연산 유닛이 2 개이며 명령 발행은 4 포트였습니다. 불도저를 개량한 스팀롤러는 FP 유닛 디자인을 수정해 128-bit 제곱 연산과 SIMD 정수의 통합 파이프와 128-bit 제곱 연산 유닛, 28 -bit의 SIMD 정수 연산과 셔플의 결합 파이프가 3 파이프 구성, 3 명령 발행이었습니다.
AMD의 CPU 마이크로 아키텍처의 흐름
AMD의 ZEN 마이크로 아키텍처의 전체 이미지
ZEN에서는 SIMD 곱셈과 덧셈을 병렬로 실행할 수 있게 됐습니다. 따라서 곱셈과 덧셈이 공존할 경우 처리량은 이전 세대보다 높아집니다. 디자인에선 상대적으로 도입 비용이 저렴한 덧셈 유닛의 파이프를 추가했습니다. 제곱 연산은 128-bit에서 2 파이프에서 제곱 연산 시엔 덧셈은 할 수 없기에 1 사이클에 2 명령이고 제곱 연산이니까 4 운영, 32-bit 단정밀도 부동 소수점 연산이라면 128-bit SIMD 4 병렬이기에 16 운영 / 사이클입니다.
부동 소수점 레지스터는 불도저의 물리적 FP 레지스터가 160 레지스터 (128-bit wide)로 ZEN의 160 레지스터와 같습니다. 파일드라이버는 176 레지스터니 물리 레지스터 수는 줄어든 것이나, 실행 지연 시간과도 관련이 있으니 아직 비교할 수 없습니다.
ZEN 마이크로 아키텍처
CPU의 벡터 유닛의 사상이 서로 다른 인텔과 AMD
인텔의 현재 아키텍처는 256-bit의 제곱 유닛이 2개 있습니다. 따라서 제곱 연산 처리량은 인텔 쪽이 2배 높아집니다. 그러나 이것은 256-bit SIMD를 사용하는 경우로 한정됩니다. 물리 레지스터 자원은 스카이레이크가 168개고 ZEN은 160개입니다.
인텔과 AMD는 CPU의 짧은 벡터 연산에 대한 생각이 크게 다릅니다. 인텔은 짧은 벡터를 확장하는 데 열심입니다. SSE는 128-bit 벡터였는데 AVX는 256-bit 벡터로 확장하고 MIC (Many Integrated Core) 아키텍처 나이츠 계열 멀티 코어 CPU는 512-bit 벡터를 채택했습니다. 그리고 나이츠 명령 세트는 명령 포맷을 바꿔 AVX-512며 제온 파이 x200 (Knights Landing)를 구현했을뿐 아니라 스카이레이크 아키텍처 제온 브랜드의 서버 CPU도 이를 씁니다.
인텔과 AMD의 마이크로 아키텍처 비교
간단히 말하면 인텔은 x86 / x64 CPU의 SIMD 명령을 확장하여 보다 벡터 길이를 길게 유지하려 합니다. 현재 인텔 CPU의 256-bit SIMD 유닛은 512-bit 명령어 지원을 상정한 것입니다. AVX-512는 GPU와 마찬가지로 프레디케이션에 의한 플로우 컨트롤도 있습니다. 즉 인텔은 GPU와 같은 벡터 연산을 CPU의 내부에 넣으려고 합니다.
인텔의 고성능 CPU와 나이츠 랜딩
이에 비해 AMD는 CPU의 벡터는 128-bit 폭으로 충분하다고 생각하는 느낌이 강합니다. 32-bit 단정밀도에서 4-way까지가 CPU의 명령 스트림에서 효율적으로 처리 할 수 있는 크기며, 그 이상으로 벡터를 확장해도 효과가 충분치 않다고 생각하는 듯 합니다. 따라서 SIMD 유닛은 128-bit 너비로 고정하고 와이드 벡터 연산은 GPU 코어에서 실행하면 된다는 게 AMD의 헤테로지니어스 컴퓨팅의 발상입니다.
제곱 연산 파이프는 덧셈 파이프에서 레지스터 포트를 빌려옴
AMD의 공식 설명에서 ZEN의 부동 소수점 연산 파이프는 곱셈 유닛 (MUL)과 덧셈 유닛 (ADD)가 각각 2 개씩입니다. 그러나 실제로는 곱셈 파이프에 제곱 유닛이 내장됩니다. FMA 또는 FMAD라는 융합형 연산은 제곱 유닛으로 실행합니다. 곱셈 유닛과 덧셈 유닛을 함께 사용하는 방식이 아닙니다.
"제곱 연산 유닛은 곱셈 파이프에 포함됩니다. (곱셈 유닛과 덧셈 유닛을 함께 사용하는 것이 아님) 제곱 연산의 유닛이 있습니다."(Mike Clark, Senior Fellow, AMD)
따라서 원칙적으로는 제곱 연산 시에도 2 개 (곱셈과 덧셈) 파이프를 동시에 움직일 수 있습니다. 그러나 실제로는 제곱 연산과 덧셈은 동시에 이루어질 수 없습니다. 이것은 레지스터 파일의 리드 포트의 제약에 의한 것입니다.
ZEN의 부동 소수점 연산 유닛 부분
ZEN의 4 개의 부동 소수점 / SIMD 연산 유닛은 각각 2 개의 레지스터 리드 포트를 갖춥니다. 1 사이클에 각 스테이지에서 2 개의 소스 피연산자를 불러오는 게 가능합니다. 그러나 제곱 연산시엔 3 개의 소스 피연산자를 써야 합니다.
"제곱 연산에선 3개의 소스 피연사자가 필요합니다. 레지스터 파일에서 읽을 경우 리드 포트가 부족합니다. 따라서 약간의 트릭을 사용합니다. 제곱 연산시엔 덧셈 파이프에서 레지스터 파일 리드 포트를 하나 빌려옵니다. 제곱 연산시에 덧셈 유닛은 사용하지 않으니 덧셈 유닛 자체는 비어 있습니다. 그러나 덧셈 유닛은 레지스터 리드 포트가 하나밖에 남지 않습니다. 따라서 덧셈 (명령 발행)은 스케줄러가 차단합니다. "(Mike Clark, Senior Fellow, AMD)
즉, 연산 유닛 자체는 곱셈 & 제곱 연산 유닛 (MUL / FMAD) 및 덧셈 유닛 (ADD)이 서로 분리됐지만, 레지스터 리드 포트 수가 제한되어 있어 곱셈 연산과 덧셈은 동시에 실행할 수 없습니다. FP 레지스터 파일 전체는 128-bit의 리드 포트가 각 유닛 2 개씩 총 8 포트가 됩니다.
ZEN 부동 소수점 / SIMD 연산 유닛과 레지스터 포트의 관계
256-bit 명령은 2 개의 128-bit SIMD 마이크로 OP로 나눠 실행
x86 / x64 계의 AVX2 명령어는 256-bit 폭의 SIMD 연산이 있습니다. AMD도 AVX2를 지원하지만 이것은 마이크로 OP 수준으로 나눠 실행합니다.
"256-bit 명령은 두개로 나눠 각각 독립적으로 실행합니다. 128-bit 연산 유닛을 2 개 결합시켜 실행하지 않고 완전히 독립된 마이크로 OP가 됩니다. 이 두 가지 마이크로 OP를 아웃 오브 오더 실행할 수 있습니다. 리타이더는 함께 이루어지나 그 전까지는 독립됩니다."(Mike Clark, Senior Fellow, AMD)
256-bit AVX 명령 디스패치 스테이지에서 마이크로 OP 레벨로 나뉘어진 128-bit 마이크로 OP로 스케줄을 잡습니다. 마이크로 OP 분할 단계에서 2 개 또는 4 개 (피연산자에 메모리가 포함 된 경우)의 128-bit SIMD 마이크로 OP로 나뉘어집니다. 레지스터도 각각 128-bit 레지스터를 사용합니다. 명령 리타이어는 256-bit 명령으로 만들 필요가 있지만, 그 전까지는 2 개의 128-bit 연산 마이크로 OP는 의존성에 문제가 없는 한 아웃 오브 오더 실행됩니다.
예약을 체크하는 큐를 마련
ZEN 부동 소수점 유닛 부에서는 마이크로 OP 큐가 2 단계인 NSQ (Non-Scheduling Queue)와 스케줄러 큐 (Scheduler Queue)로 나뉩니다. 기존에는 스케줄러 큐 뿐이었으나 새로 NSQ가 추가되었습니다.
스케줄러 큐는 각 실행 유닛마다 마이크로 OPs을 실행할 때까지 대기하도록 스케줄링하는 큐입니다. 아웃 오브 오더 스케줄러에선 일반적이지요. 자원이 충족되면 스케줄러 큐에서 마이크로 OP 실행 유닛에 발행합니다.
ZEN 실행 엔진
반면 그 앞의 NSQ 단계에서는 FP 마이크로 OP를 예약할 수 없습니다. 즉 단순한 마이크로 OP 버퍼입니다. 그러나 NSQ에 FP 마이크로 OP가 대기하는 동안 정수 유닛에 발행된 다른 마이크로 OP가 실행됩니다. 상대적으로 대기 시간이 긴 로드 마이크로 OP가 실행되는 동안 FP 마이크로 OP는 NSQ에서 스케줄러 대기열로 이동합니다. 그리고 FP 마이크로 OP가 연산 파이프에 파견되는 무렵에는 피연산자의 데이터가 레지스터에 로드된다고 합니다.
2 단계의 큐를 도입해 ZEN에서는 스케줄링 자원을 절약할 수 있습니다. 다르게 보면 대기하는 동안 자원의 확인 등 예약 작업을 하지 않아도 로드 지연 시간을 줄일 수 있도록 마이크로 OP를 버퍼하는 형태로 바꿨습니다. 이에 따라 스케줄링 자원을 최소화하면서 대기를 효율적으로 할 수 있도록 변경했습니다. 정수와 부동 소수점 연산의 큐잉의 균형을 취하도록 조정했다고 AMD는 설명합니다.
ZEN 부동 소수점 / SIMD 연산 유닛 부분의 특징은 자원을 최소화하면서 높은 효율을 발휘할 수 있도록 설계되어 있다는 점입니다. 인텔 256-bit의 제곱 연산 엔진을 2 유닛 탑재해 자원을 부동 소수점 / SIMD로 나눴던 것과는 대조적입니다. GPU 코어와 헤테로지니어스 컴퓨팅을 전제로 한 AMD와, CPU 코어에 GPU와 비슷한 방식을 도입하는 인텔과의 차이가 명확합니다.
GPU 와 헤테로지니어스로 하면 되니까 CPU 의 백터 처리 길이는 작게 잡아도 된다는 발상이라니.. 헤테로지니어스를 잘 지원해주는 언어 & 툴이라도 만드는게 먼저일거 같네요.
어찌 되었든 태생이 벡터 연산 능력이 떨어지는게 당연하다는 얘기네요. 뭐 벡터 연산 처리 능력이 필요한 것은 다 GPU 에서 처리하게 만들면 되는 문제이기도 하겠네요.
헤테로지니어스 쓴다는 것은 현재 상태에서는 농담 수준인거고, 이것도 소프트웨어 업체들이 AMD 지원을 안 해서 그렇다는 핑계거리로 써먹히게 될려나 모르겠다.
하여튼 ZEN 에 대한 기대치를 좀 낮추게 되는 소식임에는 틀림없군요.