- नवीनतम Sep 0.10.0 version ने AMD 9950X पर 21 GB/s की शानदार CSV parsing speed हासिल की
- AVX-512 support और mask register issues को पार करने से performance में बड़ा सुधार हुआ
- नया AVX-512-to-256 parser ने AVX2 और पुराने AVX-512 parser, दोनों को पीछे छोड़ दिया
- Multithreaded environment में 10 लाख rows को 72ms में process करते हुए 8 GB/s bandwidth दर्ज की गई
- लगातार software और hardware optimization से 2 साल में लगभग 3 गुना performance improvement हासिल हुआ
Sep 0.10.0 release और performance improvement का overview
- Sep ने हाल की 0.10.0 release में AVX-512 support वाले CPU (जैसे AMD 9950X, Zen 5) के लिए optimization किया, और benchmark results अपडेट किए गए
- नवीनतम version में low-level CSV parsing में 21 GB/s जैसा शानदार परिणाम दर्ज किया गया
- यह पिछले version के 18 GB/s की तुलना में बड़ा performance jump है
- सुधारों का विवरण Sep के GitHub release और README में देखा जा सकता है
- इस लेख में .NET 9.0 के AVX-512 machine code की inefficiency को पार करने वाले SIMD-आधारित C# code और x64 SIMD assembly के जरिए performance improvement की प्रक्रिया समझाई गई है
Sep की performance evolution
- Sep के शुरुआती 0.1.0 से 0.10.0 तक, .NET 7.0 से 9.0 तक, और AMD 5950X (Zen 3) से 9950X (Zen 5) तक की प्रगति को visual रूप में दिखाया गया है
- benchmark single-thread आधार पर हैं, और हर release में थोड़ा-बहुत उतार-चढ़ाव हो सकता है
- मुख्य संदेश यह है कि बड़े refactoring (0.2.0 में internal structure rewrite) और छोटे-छोटे changes से जमा हुई optimizations ने लगातार performance बढ़ाई
- Hardware और software की संयुक्त प्रगति से औसतन 2 साल में लगभग 3 गुना बेहतर 21 GB/s parsing speed हासिल हुई
- केवल hardware generation change (5950X→9950X, 4.9→5.7GHz) से भी 1.2x से अधिक improvement का आधार बनता है
AVX-512 code generation और mask register समस्या
- Sep, 0.2.3 से AVX-512 support देता रहा है, लेकिन AVX-512 के mask registers (k1-k8) के उपयोग में सीमाएँ थीं
- .NET 8 में mask registers के लिए direct support नहीं था, इसलिए सामान्य registers के बीच बार-बार copy और conversion performance drop का कारण बनते थे
- शुरुआती दौर में अलग AVX-512 support CPU नहीं होने के कारण Xeon Silver 4316 पर सीमित testing की गई थी, जहाँ इसे सबसे तेज़ पाया गया
9950X upgrade और AVX-512 vs AVX2 तुलना
- हाल में Zen 3 (5950X) से Zen 5 (9950X) पर CPU upgrade करने के बाद Sep के benchmark में 18 GB/s तक performance पहुँची
- AVX-512 और AVX2 parser की direct comparison testing में, थोड़ा अप्रत्याशित रूप से AVX2 ने लगभग 20 GB/s के साथ AVX-512 से लगभग 10% बेहतर प्रदर्शन किया
- यह दिखाता है कि .NET JIT की mask register handling inefficiency अभी भी समस्या बनी हुई है
parser code, assembly analysis और नया AVX-512-to-256 parser
- Sep के सभी parser 16K unit के char span को process करते हैं और SIMD registers (जैसे Vector256) पर आधारित compare operations का उपयोग करते हैं
- SIMD से special characters (newline, quote, delimiter आदि) को तेज़ी से पहचानकर bitmask में बदला जाता है, जिससे set operations optimization संभव होता है
- AVX-512 आधारित parser में mask registers (k1 आदि) और सामान्य registers (zmm आदि) के बीच repeated moves की वजह से बहुत से अतिरिक्त operations थे
- 0.10.0 में MoveMask call को पहले लाकर अनावश्यक mask conversion को कम किया गया, जिससे assembly instructions की संख्या घटी
- AVX2 parser में mask register नहीं होते, इसलिए इसकी structure कहीं ज़्यादा simple रही और यह व्यवहारिक रूप से AVX-512 से तेज़ निकला
- नया AVX-512-to-256 parser AVX-512 से data पढ़ता है और 256-bit conversion instructions से mask handling समस्या को ही bypass कर देता है; implementation सरल हो गई और performance 21 GB/s से ऊपर पहुँची
अलग-अलग parser benchmark का सार
- environment variable के जरिए सभी parser types के benchmark की तुलना में AVX-512-to-256 parser 21.5 GB/s के साथ सबसे तेज़ निकला
- AVX2-आधारित और Vector256-आधारित parser भी केवल 5% के भीतर काफ़ी नज़दीकी performance दिखाते हैं
- Vector128 और Vector512-आधारित parser, AVX2 की तुलना में 5~10% धीमे रहे; खासकर Vector512 parser, Vector128 से भी धीमा था
- IndexOfAny parser दूसरे SIMD parser की तुलना में बहुत धीमा है। Vector64 को 9950X पर acceleration नहीं मिलता, इसलिए उसकी performance बहुत कम है
- AVX-512 और AVX2-आधारित SIMD parser ने समान श्रेणी के CSV parser की तुलना में दबदबे वाली performance साबित की
उच्च-स्तरीय benchmark: 5950X और 9950X तुलना
- 10 लाख package asset rows के आधार पर Sep_MT ने 9950X पर 72ms (8GB/s) और 5950X पर 119ms (4.9GB/s) दर्ज किए
- वास्तविक payload data (जैसे float आदि) में भी 9950X पर multithreaded mode में ~8GB/s bandwidth हासिल हुई
- generation change (5950X→9950X) से वास्तविक application parsing में लगभग 1.5~1.6x improvement देखा गया
- competing CSV libraries (Sylvan, ReadLine, CsvHelper आदि) की तुलना में कहीं अधिक throughput और न्यूनतम resource allocation साबित हुई
निष्कर्ष और सार
- Sep 0.10.0 ने software optimization और नवीन hardware features (AVX-512, उच्च clock) के मेल से CSV parsing performance की सीमाएँ आगे बढ़ाईं
- नवीनतम SIMD algorithm design, .NET JIT code, और assembly structure में सुधार इस innovation की कुंजी हैं
- कम समय में संचित performance improvement और architecture generation change का असर प्रभावशाली है
- Sep, CSV parsing क्षेत्र में वास्तविक रूप से industry-top स्तर की high performance, multiplatform support, और scalability पेश करता है
1 टिप्पणियां
Hacker News राय
'\n','\r',';','“') और फिर तीन or operations करने के बजाय, एक आम trick से 1 shuffle, 1 comparison, और 0 or operations में काम हो सकता है। मैंने इस trick पर एक blog post भी लिखा है, देख सकते हैं। वैसे इस लेख में भीvpternlogdऔरvporoperations से or operations कम किए गए हैं।ns/rowलगभग 27ns/row है (प्रति सेकंड 37,000 row के आसपास), लेकिन अगर speed 21GB/s है तो प्रति row लगभग 570KB बैठता है, इसलिए यह benchmark बहुत असामान्य लगता है।