핵심 요약
- Futhark 컴파일러 개발팀이 2의 보수 체계에서 최솟값을 -1로 나눌 때 발생하는 극미한 확률의 오버플로 버그를 해결했습니다.
- C 언어의 '정의되지 않은 동작(UB)'을 원천 차단하기 위해 모든 정수 나눗셈에 예외 방지 로직이 들어가 전체 성능이 하락했습니다.
- 0.000000000000000000542%라는 천문학적인 확률의 버그 때문에 모든 연산이 느려지는 웃픈 대가를 치렀습니다.
요약 고성능 함수형 프로그래밍 언어 푸트하르크(Futhark) 개발진이 극도로 희귀한 버그 하나를 잡기 위해 모든 나눗셈 연산의 속도를 희생하게 된 사연을 공유했습니다.
현대 컴퓨터는 정수를 표현할 때 대부분 '2의 보수' 방식을 사용합니다. 이 방식은 비대칭 구조라 가장 작은 음수(예: 8비트의 -128)에 대응하는 양수(+128)가 존재하지 않습니다. 이로 인해 32비트 정수 기준 가장 작은 음수를 -1로 나누면 수학적으로는 양수가 되어야 하지만 표현 범위를 벗어나게 됩니다. 가능한 입력 조합 중 약 2의 64제곱분의 1, 즉 0.000000000000000000542%라는 극소의 확률로 오버플로가 발생하는 것입니다.
문제는 Futhark가 C 언어 코드를 생성해 컴파일하는 방식을 쓴다는 점입니다. C 언어 표준에서 부호 있는 정수의 오버플로는 '정의되지 않은 동작(Undefined Behaviour, UB)'으로 규정되어 있어, 컴파일러가 어떤 예측 불가능한 최적화를 적용할지 알 수 없습니다. 오버플로 시 단순히 숫자가 되감기(wrap-around)되는 언어적 원칙을 지키기 위해서는 C의 UB 발생을 무조건 차단해야 했습니다.
결국 개발팀은 나눗셈을 수행할 때마다 해당 희귀 예외 케이스를 처리하는 로직을 추가해야 했고, 그 결과 극히 미세한 확률의 버그를 방지하기 위해 전체 정수 나눗셈 성능이 일괄적으로 느려지는 씁쓸한 타협을 거치게 되었습니다.
Sponsored · 광고