- एक साधारण integer summation function को compile करते समय GCC और Clang की optimization में अंतर देखने का मामला
- GCC loop के भीतर एक बार में दो संख्याएँ जोड़ने वाली
x*2 + 1 रूप की loop optimization करता है
- Clang loop को पूरी तरह हटा देता है और गणना को
v(v - 1)/2 के closed-form formula से बदल देता है
- इस रूपांतरण से कोड O(n) से O(1) में बदल जाता है, और गणितीय simplification अपने-आप हो जाती है
- 20 साल से अधिक समय से compiler के साथ काम कर रहे लेखक को भी चौंका देने वाला यह उदाहरण, compiler की intelligent optimization क्षमता दिखाता है
GCC की loop optimization
- जब एक साधारण integer summation function लिखा गया, तो GCC ने loop-आधारित efficient summation code generate किया
- loop के भीतर
lea edx, [rdx+1+rax*2] instruction का उपयोग करके दो संख्याएँ एक साथ जोड़ी गईं
- यह
x और x+1 को जोड़ने की operation को x*2 + 1 में बदलने का रूप है
- optimization level को
-O3 तक बढ़ाने पर parallel addition (vectorization) के जरिए loop को और तेज़ी से process किया जाता है
- यह तरीका loop को बनाए रखते हुए भी operation efficiency को अधिकतम करने वाली पारंपरिक optimization का रूप है
Clang की गणितीय optimization
- वही कोड Clang से compile करने पर loop पूरी तरह गायब हो जाता है
- Clang input value के positive होने की जाँच करने के बाद
lea, imul, shr instructions की एक श्रृंखला से गणना करता है
- नतीजतन, इसे
(v² - v)/2, यानी integer sum के closed-form formula में बदला जाता है
- यह रूपांतरण loop को हटाकर constant-time (O(1)) calculation से बदल देता है
- लेखक ने इस परिणाम को “integer sum का गणितीय हल compiler ने खुद खोज लिया” जैसा बताया
सूत्र के विस्तार की प्रक्रिया
- Clang द्वारा generate किए गए assembly code को गणितीय रूप से उल्टा समझने पर निम्नलिखित रूपांतरण दिखाई देता है
v + ((v - 1)(v - 2) / 2) - 1
- इसे विस्तार और सरलीकरण करने पर यह
(v² - v)/2 बन जाता है
- अंततः यह
v(v - 1)/2 के रूप में आता है, जो 1 से v तक के योग के सूत्र से मेल खाता है
- इसे compiler द्वारा गणितीय pattern पहचानकर की गई optimization के उदाहरण के रूप में प्रस्तुत किया गया है
compiler का intelligent व्यवहार
- Clang इस विशेष instruction sequence का उपयोग क्यों करता है, इसे overflow से बचाव और induction variable tracking के तरीके से समझाया गया है
- सटीक internal behavior का कारण पूरी तरह स्पष्ट नहीं है, लेकिन इसे Clang की internal optimization logic के संयुक्त प्रभाव का परिणाम बताया गया है
- लेखक ने इस नतीजे को “विनम्र बनाने वाला और प्रेरक अनुभव” कहा
समापन और series का संदर्भ
- यह लेख ‘Advent of Compiler Optimisations 2025’ series का 24वाँ लेख है
- इसमें यह देखा गया है कि compiler code transformation के जरिए गणितीय simplification और performance improvement कैसे हासिल करता है
- लेखक कहते हैं, “compiler आज भी मुझे चौंकाते हैं,” और लंबे अनुभव के बावजूद बने रहने वाले तकनीकी विस्मय पर ज़ोर देते हैं
अभी कोई टिप्पणी नहीं है.