- हाल की चर्चाओं में उठे I/O प्रदर्शन और CPU प्रोसेसिंग स्पीड के असंतुलन को प्रयोग से सत्यापित करते हुए दिखाया गया कि वास्तव में अब भी CPU ही मुख्य सीमा है
- sequential read speed cold cache में 1.6GB/s और warm cache में 12.8GB/s तक पहुँचती है, लेकिन single-threaded word frequency गणना केवल 278MB/s के स्तर पर रहती है
- कोड की branch संरचना vectorization में बाधा डालती है, और सिर्फ साधारण lowercase conversion optimization से भी यह केवल लगभग 330MB/s तक ही सुधरती है
wc -w कमांड भी केवल 245MB/s तक पहुँचती है, जिससे पुष्टि होती है कि डिस्क नहीं बल्कि CPU गणना और branch processing bottleneck हैं
- AVX2 आधारित manual vectorization से इसे 1.45GB/s तक बढ़ाया गया, लेकिन यह अब भी sequential read speed का लगभग 11% ही है, जो साबित करता है कि bottleneck I/O नहीं बल्कि CPU है
I/O स्पीड और CPU प्रदर्शन की तुलना
- Ben Hoyt के दावे के अनुसार, यह जाँचा गया कि हाल की sequential read speed में वृद्धि क्या CPU स्पीड की ठहराव स्थिति से आगे निकल चुकी है
- उसी तरीके से मापने पर cold cache में 1.6GB/s और warm cache में 12.8GB/s दर्ज हुए
- लेकिन single thread पर word frequency गणना चलाने पर यह केवल 278MB/s रही
- यानी cache warm होने पर भी यह disk read speed की लगभग 1/5 ही है
C आधारित word frequency गणना प्रयोग
- GCC 12 से
optimized.c को -O3 -march=native विकल्पों के साथ compile करने के बाद 425MB input file पर चलाया गया
- परिणाम: 1.525 सेकंड लगे, प्रोसेसिंग स्पीड 278MB/s
- कोड के भीतर multiple branches और early exit ने compiler की vectorization optimization को बाधित किया
- lowercase conversion logic को loop के बाहर ले जाने के बाद यह 330MB/s तक सुधरा
- Clang का उपयोग करने पर vectorization बेहतर हुई
साधारण word count (wc -w) तुलना
- frequency गणना की जगह केवल शब्दों की संख्या गिनने वाली
wc -w कमांड चलाई गई
- परिणाम: 245.2MB/s, जो अपेक्षा से धीमी थी
wc ' ', '\n', '\t' जैसे विभिन्न whitespace characters और locale characters को संभालती है
- इसलिए यह केवल साधारण spaces को विभाजक मानने वाले कोड की तुलना में अधिक गणना करती है
AVX2 आधारित vectorization का प्रयास
- आधुनिक CPU फीचर्स का उपयोग करते हुए AVX2 instruction set के साथ vectorization लागू की गई
- 256-bit registers का उपयोग, डेटा को 32-byte alignment के साथ
- whitespace character comparison के लिए
VPCMPEQB निर्देश का उपयोग
- bit mask (PMOVMSKB) और Find First Set(ffs) निर्देशों से word boundaries का पता लगाया गया
- प्रेरणा Cosmopolitan libc के
strlen implementation से ली गई
प्रदर्शन परिणाम और निष्कर्ष
- manual vectorized code (
wc-avx2) ने 1.45GB/s प्रोसेसिंग स्पीड हासिल की
wc -w के समान परिणाम (82,113,300 शब्द) सत्यापित किए गए
- cold cache स्थिति में भी अब भी user mode computation time ही प्रमुख रहा
- इससे पुष्टि हुई कि disk I/O की तुलना में CPU गणना bottleneck है
- कुल मिलाकर disk speed पर्याप्त तेज़ है, लेकिन branch processing और hash calculation जैसे CPU operations अब भी सीमित करने वाले कारक बने हुए हैं
- कोड और प्रयोग के परिणाम GitHub (
haampie/wc-avx2) पर सार्वजनिक हैं
अभी कोई टिप्पणी नहीं है.