सारांश
परिचय
- मैट्रिक्स गुणन आधुनिक न्यूरल नेटवर्क का एक अनिवार्य हिस्सा है
- NumPy बाहरी BLAS लाइब्रेरी का उपयोग करके उच्च प्रदर्शन हासिल करता है
- यह लेख बताता है कि सरल, portable और scalable high-performance मैट्रिक्स गुणन कैसे implement किया जाए
NumPy प्रदर्शन
- NumPy AMD CPU पर OpenBLAS का उपयोग करता है
- प्रदर्शन का मापन FLOP/s में किया जाता है
- Ryzen 7 7700 CPU पर NumPy के single-thread और multi-thread प्रदर्शन को मापा गया है
सैद्धांतिक सीमा
- CPU की memory hierarchy और SIMD extension की व्याख्या की गई है
- सैद्धांतिक रूप से single-thread में 163 GFLOPS और multi-thread में 1203 GFLOPS हासिल किए जा सकते हैं
सरल implementation
- बुनियादी मैट्रिक्स गुणन एल्गोरिद्म की व्याख्या की गई है और सरल implementation के प्रदर्शन को मापा गया है
- सरल implementation 2.7 GFLOPS हासिल करता है
kernel
- मैट्रिक्स गुणन को छोटे subproblem में बाँटकर हल करने का तरीका बताया गया है
- SIMD instruction का उपयोग करके kernel को optimize किया गया है
- 16x6 kernel का उपयोग करके 147 GFLOPS हासिल किए गए हैं
masking और packing
- मनमाने मैट्रिक्स आकार को संभालने के लिए boundary case को handle करने का तरीका बताया गया है
- performance optimize करने के लिए masking और packing का उपयोग किया गया है
- नई implementation 56 GFLOPS हासिल करती है
caching
- CPU cache की memory system की व्याख्या की गई है
- cache का उपयोग करके data reuse और cache management को optimize किया गया है
GN⁺ की राय
- यह लेख high-performance मैट्रिक्स गुणन को implement करने का तरीका step-by-step समझाता है, इसलिए यह बहुत शिक्षाप्रद है
- SIMD instruction और CPU cache का उपयोग करके optimization के तरीके सीखे जा सकते हैं
- यह NumPy जैसी लाइब्रेरी के अंदरूनी कामकाज को समझने में मदद करता है
- समान क्षमता वाले अन्य प्रोजेक्ट्स में Intel MKL, OpenBLAS आदि शामिल हैं
- नई तकनीक या open source अपनाते समय performance और portability पर विचार करना चाहिए
1 टिप्पणियां
Hacker News टिप्पणियाँ
ज़्यादातर सॉफ़्टवेयर optimize नहीं होते, इसलिए performance सुधार की काफ़ी गुंजाइश रहती है
BLIS repository में संदर्भित papers इस विषय को समझने के लिए प्रामाणिक सामग्री हैं
SIMD instructions, micro-kernel vectorization के लिए ज़रूरी नहीं हैं
ज़्यादातर coding patterns पूरी तरह hardware-specific नहीं होते, इसलिए बहुत-सी performance छूट जाती है
benchmark को आसानी से दोहराया जा सके, यह सराहनीय है
matmul.cकोgcc -O3से compile करने पर 1.41 सेकंड,clang -O2से compile करने पर 1.47 सेकंड लगे, जबकि NumPy को 1.07 सेकंड लगेompकी जगहpthreadsका इस्तेमाल कर thread pool को explicitly manage करने से overhead कम हो सकता हैयह सवाल उठता है कि numpy का implementation वास्तव में multithreading का उपयोग करता है या नहीं
यह जानने की जिज्ञासा है कि इसकी performance OpenBLAS से बेहतर क्यों है
एक तरफ Python और दूसरी तरफ C से तुलना करना उचित नहीं है
mask generation की inefficiency खटकती है
matrix multiplication को खुद multithreading करने की व्यावहारिकता पर सवाल है
jart के tinyBLAS का उल्लेख