Lobsters

Subnormal floating-point numbers are expensive… on Intel processors

Subnormal 부동소수점 연산은 비싸다 — 단, Intel 프로세서에서만

IEEE 부동소수점 표준의 subnormal(비정규) 수가 연산을 느리게 한다는 오래된 통념을 Daniel Lemire가 최신 프로세서 5종에서 직접 측정했습니다. Intel에서는 subnormal이 관여된 곱셈이 최대 50배 느려지지만, AMD Zen 5와 Arm 계열(Graviton 5, Apple M4 Max)에서는 거의 페널티가 없다는 결과가 나왔습니다. 저성능 부동소수점 회피 전략이 이제 CPU 아키텍처에 따라 갈린다는 점이 핵심입니다.

본문

IEEE 부동소수점 표준은 아주 작은 수를 표현하기 위해 subnormal(비정규) 수를 사용합니다. 문제는 이 수들이 연산을 느리게 한다는 평판이 있어서, 게임 프로그래머와 머신러닝 엔지니어들이 성능을 위해 subnormal 연산을 회피하곤 한다는 것입니다. Daniel Lemire가 실제로 얼마나 느린지를 최신 프로세서들에서 직접 측정했습니다.

벤치마크 설계

Lemire는 캐시에 들어갈 크기인 16,384개 값의 배열에 대해 몇 가지 커널을 작성했습니다. 각 값에 0.75를 곱하는 연산, 두 배열의 덧셈, 각 값을 3으로 나누는 연산, 정상 값에 아주 작은 상수(2^-1030)를 곱해 입력은 정상이지만 출력이 subnormal이 되는 연산, 그리고 x *= 0.9999를 16,384번 반복하는 의존성 체인입니다. 각 커널에는 정상 값([0.5, 1) 범위), 전부 subnormal인 값, 또는 100개 중 1개만 subnormal인 값을 입력했으며, 컴파일러의 자동 벡터화를 허용했습니다. 컴파일러는 Linux에서 GCC 15(-O3 -march=native), macOS에서 Apple clang 17을 사용했고, clang 21로도 검증했습니다. 측정 대상은 Intel Xeon 6975P-C(Granite Rapids, AWS c8i.xlarge), Intel Xeon Gold 6548N(Emerald Rapids), AMD EPYC 9R45(Zen 5, c8a.xlarge), AWS Graviton 5(Arm Neoverse V3, c9g.xlarge), Apple M4 Max의 다섯 종입니다.

Intel — 곱셈 45~50배, 레이턴시 4사이클에서 128사이클로

double 값 기준으로, Intel 프로세서에서 subnormal이 관여된 곱셈은 정상 곱셈보다 약 45~50배 느렸고, 나눗셈은 18배 느렸습니다. 이전 곱셈 결과를 기다려야 하는 의존성 체인에서는 스텝당 약 1ns에서 30ns 이상으로 치솟았습니다. 정상 곱셈의 레이턴시가 4사이클인 데 비해 subnormal이 끼면 128사이클이 됩니다. 흥미로운 점은 subnormal이 입력이든 출력이든 상관없이 느려진다는 것인데, 정상 수끼리 곱해서 subnormal 결과가 나와도 subnormal 입력을 곱하는 것만큼 느립니다. 예외는 덧셈과 뺄셈으로, 이들은 최고 속도로 동작합니다. 또한 subnormal이 1%만 섞여 있어도 컴파일러가 연산을 벡터화하면 단 하나의 subnormal이 전체 연산 블록을 느리게 만들 수 있어, 희소한 경우에도 비용이 상당합니다.

AMD와 Arm — 사실상 무시할 수 있는 수준

AMD Zen 5는 훨씬 낫습니다. 곱셈과 덧셈은 입력과 무관하게 최고 속도로 동작하고, 의존성 곱셈 체인만 스텝당 0.66ns에서 0.88ns로 약 3분의 1 느려지는데, 이는 곱셈기가 subnormal 처리에 한 사이클 정도를 더 쓰기 때문입니다. 나눗셈은 약 2배 느려지며, 나눗셈의 경우 100개 중 1개만 subnormal이어도 전부 subnormal인 것과 거의 비슷하게 느려진다는 점이 주목할 만합니다. 두 Arm 프로세서인 Graviton 5와 Apple M4 Max는 아예 신경 쓰지 않아도 됩니다 — subnormal을 최고 속도로 처리합니다.

시사점

최신 AMD와 Arm 프로세서에서는 subnormal이 더 이상 성능 문제가 아닐 수 있지만, Intel 프로세서에서는 여전히 심각한 성능 이슈로 남아 있습니다. subnormal 회피 여부를 설계 결정으로 삼는다면, 이제 대상 아키텍처를 먼저 확인해야 한다는 이야기입니다.

Lobsters 반응

  • @david_chisnall — 이 결과가 최신 GPU에 어떻게 적용되는지 궁금하다고 말합니다. 몇 년 전 Oakland 학회에서 브라우저가 합성(composite)은 허용하지만 읽기는 막은 콘텐츠를 canvas의 타이밍 사이드채널로 유출하는 논문이 있었는데, subnormal을 쓰도록 계산을 유도하는 방식이었다고 합니다. 그 논문에 따르면 subnormal의 상대 성능 저하가 GPU에서 CPU보다 한 자릿수 더 컸다고 합니다. 그는 또한 AMD와 Graviton의 FPU가 왜 느리지 않은지도 궁금하다며, subnormal을 최적화할 가치가 있다고 판단했거나(어떤 워크로드를 근거로 했을지 의문이라고 덧붙임), 다른 설계 방식을 쓰고 있을 것이라고 추측합니다.

원문: Daniel Lemire's blog / 번역·요약: Trawling