- 최신 Sep 0.10.0 버전은 AMD 9950X에서 21 GB/s의 놀라운 CSV 파싱 속도를 달성함
-
AVX-512 지원 및 마스크 레지스터 이슈 극복으로 성능이 크게 향상됨
- 새로운 AVX-512-to-256 파서가 AVX2, 기존 AVX-512 파서를 앞지르는 결과를 보임
-
멀티스레드 환경에서 1백만 행을 72ms에 처리하며 8 GB/s 대역폭을 기록함
-
지속적 소프트웨어 및 하드웨어 최적화로 2년 만에 약 3배의 성능 개선을 이룸
Sep 0.10.0 릴리즈와 성능 향상 개요
- Sep는 최근 0.10.0 릴리즈에서 AVX-512 지원 CPU(예: AMD 9950X, Zen 5)에 대한 최적화를 진행했고, 벤치마크 결과가 업데이트됨
- 최신 버전에서 낮은 수준의 CSV 파싱에서 21 GB/s라는 대단한 성과를 기록함
- 이전 버전과 비교해 18 GB/s에서 상당한 성능이 상승된 결과임
- 개선 내역은 Sep의 GitHub 릴리즈와 README에서 상세히 볼 수 있음
- 본문에서는 .NET 9.0의 AVX-512 머신 코드의 비효율을 극복한 SIMD 기반 C# 코드와 x64 SIMD 어셈블리를 통한 성능 향상 과정을 설명함
Sep의 성능 발전 과정
- Sep의 초기 0.1.0부터 0.10.0, .NET 7.0에서 9.0, AMD 5950X(Zen 3) 에서 9950X(Zen 5) 로의 발전이 시각적으로 표현됨
- 벤치마크는 단일 스레드 기준으로, 각 릴리즈별 약간의 변동이 있을 수 있음
-
핵심 메시지는 대규모 리팩터링(0.2.0 내장 구조 재작성)이나 작은 변경이 누적된 최적화가 꾸준히 성능 개선을 이끈 점임
-
하드웨어와 소프트웨어 동반 발전으로 평균 2년 만에 약 3배 향상된 21 GB/s 파싱 속도를 달성함
- 하드웨어 세대 간(5950X→9950X, 4.9→5.7GHz) 변화만으로도 1.2x 이상의 향상의 근거임
AVX-512 코드 생성과 마스크 레지스터 문제
- Sep는 0.2.3부터 AVX-512를 지원해왔으며, AVX-512의 마스크 레지스터(k1-k8) 활용에 한계가 있었음
- .NET 8에서는 마스크 레지스터에 대한 직접적인 지원이 없어, 정상 레지스터 간의 반복 복사 및 변환이 성능 저하 요인이었음
- 별도의 AVX-512 지원 CPU가 없었던 초기에는 Xeon Silver 4316에서 제한적으로 테스트해 가장 빠름을 확인함
9950X 업그레이드 및 AVX-512 vs AVX2 비교
- 최근 Zen 3(5950X)에서 Zen 5(9950X) 로 CPU를 업그레이드하면서, Sep의 벤치마크를 수행한 결과 18 GB/s에 도달함
- AVX-512와 AVX2 파서를 직접 비교 실험한 결과, 약간 의외로 AVX2가 약 20 GB/s로 AVX-512보다 약 10% 빠름을 보여줌
- 이는 .NET JIT의 마스크 레지스터 처리 비효율이 여전히 문제임을 시사함
파서 코드, 어셈블리 분석 및 새로운 AVX-512-to-256 파서
- Sep의 모든 파서는 16K 단위의 char span을 처리하며 SIMD 레지스터(Vector256 등) 기반의 비교 연산을 활용함
- SIMD로 특수 문자(개행, 따옴표, 구분자 등)를 빠르게 판별하고 비트마스크로 변환하여 집합 연산 최적화를 실현함
- AVX-512 기반 파서는 마스크 레지스터(k1 등)와 일반 레지스터(zmm 등) 간 반복 이동으로 인해 잉여 연산이 많았음
- 0.10.0에서는 MoveMask 호출을 앞당겨 불필요한 마스크 변환 최소화로 어셈블리 명령 수를 줄임
- AVX2 파서는 마스크 레지스터가 없어서 구조가 훨씬 단순, AVX-512보다 실질적으로 빨랐음
- 새로운 AVX-512-to-256 파서는 AVX-512로 데이터를 읽고 256비트 전환 명령으로 마스크 처리 문제 자체를 우회, 구현이 간명해졌고, 21 GB/s 이상 의 성능을 이룸
다양한 파서 벤치마크 정리
- 환경변수로 모든 파서 타입의 벤치마크를 비교한 결과, AVX-512-to-256 파서가 21.5 GB/s로 가장 빠름
- AVX2 기반, Vector256 기반 파서도 불과 5% 차이내로 근접한 성능을 보여줌
- Vector128, Vector512 기반 파서는 AVX2 대비 5~10% 느림, 특히 Vector512 파서는 Vector128보다도 느림
- IndexOfAny 파서는 다른 SIMD 파서에 비해 현격히 느림. Vector64는 9950X에서 가속되지 않아 매우 저조한 성능
- AVX-512 및 AVX2 기반의 SIMD 파서가 동종 CSV 파서 대비 압도적인 성능을 입증함
상위 벤치마크: 5950X와 9950X 비교
- 1백만 패키지 자산 행 기준으로 Sep_MT는 9950X에서 72ms(8GB/s), 5950X에서 119ms(4.9GB/s)를 기록함
- 실부하 데이터(float 등)에서도 9950X에서 멀티스레드로 ~8GB/s 대역폭을 달성함
- 세대 변화(5950X→9950X)로 실제 응용 파싱에서 약 1.5~1.6배의 개선 효과가 나타남
- 경쟁 CSV 라이브러리(Sylvan, ReadLine, CsvHelper 등) 대비 현격한 처리량, 최소 자원 할당량을 입증함
결론 및 요약
- Sep 0.10.0은 소프트웨어 최적화와 최신 하드웨어 기능(AVX-512, 높은 클럭) 의 결합으로 CSV 파싱 성능 한계를 극복함
-
최신 SIMD 알고리듬 설계, .NET JIT 코드 및 어셈블리 구조 개선이 혁신의 핵심임
- 짧은 시간 내 누적 성능 개선과 아키텍처 세대 변화의 효과가 인상적임
- Sep는 CSV 파싱 영역에서 실질적으로 업계 최고 수준의 고성능, 멀티플랫폼, 확장성을 제시함