• हाल की चर्चाओं में उठे 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) पर सार्वजनिक हैं

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.