Go की concurrency और parallelism का उपयोग
- संख्यात्मक गणना क्षमता को बेहतर बनाने के लिए Go की concurrency और parallelism का उपयोग करने वाले एक प्रोजेक्ट का परिचय।
- SIMD(Same Instruction Multiple Data) निर्देशों का उपयोग करके हार्डवेयर स्तर पर parallel गणना की जा सकती है।
- Go का compiler SIMD का उपयोग नहीं करता, और उपयुक्त general-purpose SIMD package न मिलने पर स्वयं package विकसित करने का निर्णय लिया गया।
Plan9 assembly भाषा
- Go अपनी खुद की Plan9 assembly भाषा का उपयोग करता है, जो किसी विशेष platform के instructions और registers को थोड़ा संशोधित करके इस्तेमाल करती है।
- x86 Plan9 और ARM Plan9 एक-दूसरे से अलग हैं।
- Plan9 के सरल उदाहरणों के माध्यम से इसकी बुनियादी उपयोग-विधि समझाई गई है।
Plan9 उदाहरण
AddInts_amd64.s फ़ाइल और main.go फ़ाइल के माध्यम से Plan9 में बुनियादी function declaration और उपयोग का तरीका समझाया गया है।
- Go की calling convention के अनुसार function arguments और return values को stack में store करने का तरीका बताया गया है।
package design योजना
- arithmetic और bit operation SIMD कार्यों के लिए एक पतली abstraction layer प्रदान करने वाला package डिज़ाइन किया गया है।
- architecture-विशिष्ट Plan9 implementation शामिल करने वाला internal package बनाया जाता है, और initialization function के माध्यम से इसे सेट किया जाता है।
SIMD उदाहरण
- x86 SIMD Plan9 function के उदाहरण के माध्यम से SIMD के उपयोग का तरीका समझाया गया है।
Supported_amd64.s और AddFloat32_amd64.s फ़ाइलों के जरिए SSE support की जाँच और float32 addition operation करने का तरीका दिखाया गया है।
performance और भविष्य
- Go software implementation और Plan9 SIMD implementation के बीच performance अंतर दिखाने वाले chart से लगभग 200-450% speed improvement की पुष्टि होती है।
- आशा है कि यह मेमो Plan9 और SIMD का उपयोग करने वाले प्रोजेक्ट्स के लिए प्रेरणा देगा।
# GN⁺ का सार
- यह लेख Go की concurrency और parallelism का उपयोग करके performance को अधिकतम करने के तरीकों का परिचय देता है।
- Plan9 assembly भाषा और SIMD निर्देशों का उपयोग करके हार्डवेयर स्तर पर parallel गणना करने के तरीके समझाए गए हैं।
- यह लेख Go developers के लिए Plan9 और SIMD के उपयोग की संभावनाएँ दिखाता है और performance सुधार के लिए नए approaches तलाशने में उपयोगी हो सकता है।
- समान कार्यक्षमता वाले प्रोजेक्ट्स के रूप में Rust की SIMD support libraries या C++ की SIMD-संबंधित libraries की सिफारिश की गई है।
1 टिप्पणियां
Hacker News टिप्पणियाँ
NOSPLITके बारे में विवरण: Go assembly में frame size और argument size बताने के लिए एक अनोखा syntax है-से अलग किया जाता है, और यह गणितीय subtraction नहीं हैgo vettool यह जांचता है कि argument size सही है या नहींLLM (large language model) की व्याख्या पर राय: code interpretation को लेकर गलतफ़हमी हो सकती है
Go की internal assembly language
Plan9का उल्लेख: Go अपनी खुद की assembly language का उपयोग करता हैint64-bit होता है, औरint32का उपयोग करने पर argument list में word alignment होता हैNOSPLITtextflag.hमें defined है, और केवल runtime में valid हैGo assembly design पर Rob Pike की explanation: एक common assembly language बनाई गई ताकि नई syntax सीखे बिना machine से संवाद किया जा सके
SIMD operations के लिए function उपयोग पर राय: ऐसे functions की ज़रूरत है जो slice पर SIMD operations कर सकें
forloop के बजाय SIMD का उपयोग करके parallel में process किया जा सकता हैGo compiler की design philosophy: complex compiler की बजाय simple और fast compiler को प्राथमिकता दी जाती है
SIMD operations के लिए GPU उपयोग पर राय: GPU parallel processing और matrix operations में बेहतर है, इसलिए SIMD operations के लिए ज़्यादा उपयुक्त हो सकता है