SIMD 기술로 CSV 파싱 속도 혁신!
SIMD(Single Instruction, Multiple Data) 기술을 활용하여 CSV 파싱 속도를 대폭 향상시킴
ARM NEON SIMD 명령어를 사용하여 16바이트 단위로 구조적 문자 분류
Lookup Table과 Bitmasking 기법을 통해 쉼표, 따옴표, 개행 문자 처리
Prefix XOR 연산을 활용하여 따옴표 안의 쉼표와 개행 문자 필터링
SIMD(Single Instruction, Multiple Data)를 활용한 CSV 파싱의 핵심 원리
본 게시물은 SIMD(Single Instruction, Multiple Data) 기술을 활용하여 CSV 파일을 효율적으로 파싱하는 방법을 제시한다. 특히, ARM NEON 명령어 집합을 사용하여 16바이트 단위로 데이터를 처리함으로써, 기존 방식보다 훨씬 빠른 속도를 구현한다. 핵심은 벡터화된 분류(Vectorized Classification) 기법으로, 룩업 테이블(Lookup Table)을 사용하여 구조적 문자를 빠르게 식별하고, 비트마스크(Bitmask)를 통해 실제 구분자와 가짜 구분자를 구분하는 것이다. 이러한 접근 방식은 CPU 병렬 처리(CPU Parallel Processing)를 극대화하여 성능을 향상시킨다.
Lookup Table 기반의 구조적 문자 분류
게시물에서는 룩업 테이블(Lookup Table)을 활용하여 CSV 파일 내의 구조적 문자를 분류하는 방법을 설명한다. 특히, 각 문자를 4비트 단위로 분할하여 두 개의 룩업 테이블을 사용한다. 이러한 방식은 병렬 처리(Parallel Processing)를 가능하게 하며, 각 문자의 클래스를 빠르게 식별할 수 있게 한다. 예를 들어, 쉼표(,)와 큰따옴표(")는 공통된 하이 니블(High Nibble)을 가지지만, 로우 니블(Low Nibble)을 통해 구별된다. 이러한 룩업 테이블 기반의 분류는 분기 없는 코드(Branchless Code)를 구현하여 성능을 더욱 향상시킨다.
Bitmasking과 Prefix XOR을 이용한 유효 구분자 필터링
게시물은 비트마스크(Bitmask)와 Prefix XOR 연산을 활용하여 따옴표 안의 쉼표와 개행 문자를 필터링하는 방법을 제시한다. 먼저, 각 클래스(쉼표, 따옴표, 개행 문자)에 대한 비트마스크를 생성한다. 그 후, Prefix XOR 연산을 통해 따옴표의 짝수/홀수 여부를 판단하여, 따옴표 안에 있는 구분자를 제거한다. 이러한 과정을 통해 실제 구분자만을 추출하여 CSV 파일의 구조를 정확하게 파악할 수 있다. 이 기술은 데이터 무결성(Data Integrity)을 유지하면서 파싱 속도를 향상시키는 데 기여한다.
ARM NEON SIMD 명령어 활용
게시물은 ARM NEON SIMD 명령어를 사용하여 CSV 파싱을 최적화하는 방법을 설명한다. 특히, `vld1q_u8`, `vandq_u8`, `vshrq_n_u8`, `vqtbl1q_u8` 등의 NEON intrinsics를 활용하여 16바이트 단위로 데이터를 처리한다. 이러한 명령어들은 병렬 연산(Parallel Operation)을 가능하게 하여, 각 바이트를 개별적으로 처리하는 방식보다 훨씬 빠른 속도를 제공한다. 또한, 분기 없는 코드(Branchless Code)를 유지하여 파이프라인(Pipeline)의 효율성을 극대화한다.