SWAR 기반 비트 카운트와 패리티 알고리즘

본 논문은 곱셈·시프트 없이도 SIMD‑within‑a‑register(SWAR) 기법을 활용해 비트열의 1 개수를 세는 알고리즘을 제시한다. 논문은 논리 연산·덧셈만으로 O(log² n) 단계, 패리티는 O(log n) 단계로 계산할 수 있음을 보이며, 곱셈을 허용할 경우 O(log* n) 복잡도로 개선한다. 또한 각 모델별 구현 예시와 복잡도 표를 제공한다.

저자: Holger Petersen

이 논문은 “SIMD Within A Register”(SWAR) 기법을 활용해 비트열의 1 개수를 세는 알고리즘을 연산 집합별로 체계적으로 분석한다. 서론에서는 기존의 인구 카운트(population count) 알고리즘이 주로 루크업 테이블, 곱셈·시프트 기반의 O(log log n) 방법에 의존한다는 점을 지적하고, 곱셈·시프트가 하드웨어에서 비용이 높거나 지원되지 않을 경우를 대비해 대안을 모색한다. 이를 위해 두 가지 연산 모델을 정의한다. 첫 번째는 OPAL(Oblivious Parallel Addition and Logical) 모델로, 논리 연산(AND, OR, XOR)과 덧셈만 허용한다. 두 번째는 PAL 모델로, 여기에는 흐름 제어문(if, while)도 포함한다. 첫 번째 주요 결과는 Theorem 1에서 제시된 O(√n) 알고리즘이다. 입력을 √n개의 필드로 나누고, 각 필드 사이에 스페이서 비트를 삽입한다. 스페이서 비트는 초기 단계에서 입력 비트와 AND 연산을 통해 1의 위치를 파악하고, 이후 두 번의 뺄셈을 통해 각 필드의 최상위 비트를 감소시킨다. 필드가 비어갈 때까지 반복하면 전체 비트 수가 합산된다. 이 과정은 필드 수와 필드 길이 모두 √n이므로 전체 반복 횟수는 O(√n)이다. 구현 코드는 32비트 예시를 들어 상수 마스크(0x88888888 등)를 사용한다. 다음으로 Theorem 2와 Corollary 1에서는 OPAL 모델에서 O(log² n) 단계로 비트 카운트를 수행하는 방법을 제시한다. 핵심 아이디어는 Lemma 1에 기반한 “비트 이동 없이 필드 내 최하위 비트를 최상위 비트로 옮기는” 기술이다. 이 기술은 상수 마스크와 덧셈을 이용해 특정 위치의 비트를 복사하고, 필요 없는 비트를 마스크한다. 필드 크기를 2ᶦ‑1에서 2ᶦ 로 확장하면서 단계별로 합산하면 총 O(log n) 단계가 필요하고, 각 단계마다 O(log n) 연산이 들어가 O(log² n) 복잡도가 된다. 실제 구현에서는 16비트 이하를 처리하기 위해 0x5555, 0x6666 등 다양한 마스크와 상수를 연속적으로 적용한다. 패리티 계산에 대해서는 Theorem 3과 Corollary 2가 제시된다. 패리티는 비트 카운트의 결과를 2로 나눈 나머지와 동일하므로, O(log n) 단계로 구현한다. 먼저 입력을 두 배씩 확장된 필드에 XOR 연산을 적용해 2비트 필드의 패리티를 구하고, 이후 Lemma 1을 이용해 최상위 비트를 인접 필드로 전파한다. 최종적으로 가장 높은 비트만 남게 되며, 필요 시 단일 조건문을 통해 0/1 로 변환한다. 가장 강력한 결과는 Theorem 4에서 제시된 곱셈을 포함한 모델이다. 여기서는 필드 길이를 k² 로 정의하고, 각 단계에서 두 반쪽 필드를 마스크·시프트 후 곱셈 마스크(mₖ)와 곱해 부분 합을 만든다. 이후 다시 마스크·시프트를 통해 결과를 정렬하고, 필드 내 합을 수행한다. 이 과정을 k가 증가하면서 반복하면, 필드 길이가 입력 크기 n을 초과할 때까지 진행되며, 필요한 반복 횟수는 로그를 여러 번 적용한 log* n 이다. 따라서 비트 카운트는 O(log* n) 시간에 완성된다. 논문은 이 방법을 이용해 파리티도 O(log* n) 수준으로 계산할 수 있음을 보이며, 최종 단계에서는 HAKMEM 169 항목의 나머지 연산을 사용해 7개의 C‑연산만으로 결과를 얻는다. 마지막으로 논문은 각 연산 집합에 대한 복잡도 표를 제시한다. OPAL 모델에서는 O(log² n), PAL 모델에서는 O(log n) (패리티) 혹은 O(log² n) (비트 카운트), 곱셈 포함 모델에서는 O(log* n) 혹은 O(log log n) (곱셈 없이도 가능) 등으로 정리한다. 또한, 현재 알려진 하드웨어 제한과 회로 복잡도 결과를 인용해 Ω(log n / log log n) 이하의 하한을 제시한다. 전체적으로 논문은 연산 제한에 따른 비트 카운트와 패리티 알고리즘의 이론적 복잡도 경계를 명확히 제시하고, 각 모델에 맞는 구현 예시와 증명을 제공한다. 다만 실험적 평가가 없고, 상수 마스크의 크기와 실제 워드 길이에서의 효율성에 대한 정량적 분석이 부족하다는 점이 아쉽다. 특히 O(√n) 알고리즘은 상수 오버헤드가 커 실용성이 낮으며, O(log² n) 알고리즘은 큰 상수 마스크 때문에 현재의 64비트 CPU에서는 기존의 POPCNT 명령어보다 느릴 가능성이 있다. 반면 곱셈·시프트를 허용한 O(log* n) 접근법은 이론적으로는 최적에 가깝지만, 복잡한 마스크와 곱셈 연산이 많아 실제 적용에는 신중한 튜닝이 필요하다.

원본 논문

고화질 논문을 불러오는 중입니다...

댓글 및 학술 토론

Loading comments...

의견 남기기