핵심 요약
- C, Go 등 주요 언어에서 제대로 최적화되지 않던 상수를 나누는 64비트 부호 있는 바닥 나눗셈의 신규 고속 알고리즘이 발표되었습니다.
- ARM 환경에서 기존 표준 라이브러리 방식 대비 약 2배, 기존 최적화 알고리즘보다도 10~20% 빠른 처리량을 보여줍니다.
- 작성자는 원리를 설명함과 동시에 원하는 제수에 맞게 즉시 복사해 쓸 수 있는 코드 생성기와 테스트 코드를 함께 공개했습니다.
요약 대부분의 최신 프로그래밍 언어와 컴파일러(C, C++, Go, Swift 등)에서 기본 나눗셈 연산자(/)는 결과값을 0 방향으로 내림(truncated division) 처리합니다. 반면 음의 무한대 방향으로 내림하는 '부호 있는 바닥 나눗셈(signed integer floor division)'은 수학적이나 실무적으로 훨씬 더 직관적인 결과를 내는 경우가 많지만, 정작 컴파일러 표준 기능으로 제공되지 않거나 구현 라이브러리들조차 최적화되지 않은 느린 방식을 사용해 왔습니다. 심지어 저수준 비트 연산의 바이블로 불리는 책 'Hacker's Delight'에서도 이와 관련된 최적화 기법은 거의 다루어지지 않았습니다.
개발자 벤 조피(Ben Joffe)는 컴파일 시점에 나누는 수(제수)를 미리 알고 있는 상수에 대해 기존 방식보다 처리량을 획기적으로 개선한 새로운 64비트 바닥 나눗셈 알고리즘을 발표했습니다. 이 방식은 128비트 임시 연산과 부호 비트 시프트 연산을 조합해 곱셈 인자를 동적으로 보정하는 간단한 수학적 트릭을 기반으로 합니다.
벤치마크 결과에 따르면, 하루를 초 단위로 나타낸 86,400으로 나누는 연산 기준으로 ARM64 칩셋(MacBook Pro M4 Pro, 스냅드래곤 X1 등)에서 기존 러스트(Rust)나 지그(Zig)의 기본 라이브러리 구현 대비 2배 이상 빠르며, 기존의 대표적 최적화 알고리즘인 Granlund-Montgomery(1994)나 Robison(2005) 방식보다도 10~20% 더 빠른 처리량을 기록했습니다. x86 플랫폼(AMD 라이젠 9 9950X3D 등)에서도 양수 제수의 약 80% 구간에서 5~10% 수준의 성능 개선을 보였습니다. 작성자는 64비트 범위의 다양한 제수에 대한 C++ 코드 생성기와 경계값 테스트 코드를 함께 공개했습니다.
Sponsored · 광고