2 पॉइंट द्वारा GN⁺ 2025-02-23 | 1 टिप्पणियां | WhatsApp पर शेयर करें

परिचय

  • FFmpeg की असेंबली भाषा कक्षा में आपका स्वागत है। यह कक्षा FFmpeg में असेंबली भाषा कैसे लिखी जाती है, इसकी बुनियादी समझ देती है।

आवश्यक ज्ञान

  • C भाषा, खासकर pointers के बारे में जानकारी आवश्यक है।
  • हाई स्कूल स्तर का गणितीय ज्ञान (scalar और vector, जोड़, गुणा आदि) आवश्यक है।

असेंबली भाषा क्या है?

  • असेंबली भाषा एक प्रोग्रामिंग भाषा है जिसमें CPU द्वारा प्रोसेस किए जाने वाले निर्देशों के सीधे अनुरूप कोड लिखा जाता है।
  • FFmpeg का अधिकांश असेंबली कोड SIMD(Single Instruction Multiple Data) है, जिसे vector programming भी कहा जाता है।
  • SIMD उन बड़े डेटा सेट्स को प्रोसेस करने के लिए उपयुक्त है जो image, video, audio की तरह memory में क्रमबद्ध रूप से संग्रहीत होते हैं।

असेंबली भाषा में क्यों लिखते हैं?

  • मल्टीमीडिया प्रोसेसिंग की गति बढ़ाने के लिए। असेंबली कोड में लिखने पर 10 गुना या उससे अधिक speedup मिल सकता है।
  • FFmpeg में intrinsics का उपयोग नहीं किया जाता, बल्कि सीधे असेंबली कोड लिखा जाता है। intrinsics आमतौर पर hand-written assembly की तुलना में 10-15% धीमे होते हैं।

असेंबली भाषा के प्रकार

  • यह कक्षा x86 64-बिट असेंबली भाषा पर केंद्रित है। इसे amd64 भी कहा जाता है और यह Intel CPU पर भी काम करती है।
  • x86 असेंबली syntax के दो प्रकार हैं: AT&T और Intel, और हम Intel syntax का उपयोग करेंगे।

संदर्भ सामग्री

  • FFmpeg असेंबली प्रोग्रामिंग high-performance image processing पर केंद्रित है और इसका दृष्टिकोण अनोखा है।
  • "The Art of 64-bit assembly" पुस्तक के diagrams सहायक हो सकते हैं।

रजिस्टर

  • रजिस्टर CPU में वह क्षेत्र हैं जहाँ डेटा प्रोसेस किया जाता है। CPU memory को सीधे manipulate नहीं करता, बल्कि डेटा को registers में load करके प्रोसेस करता है और फिर उसे वापस memory में लिखता है।

सामान्य प्रयोजन रजिस्टर

  • सामान्य प्रयोजन रजिस्टर (GPR) में डेटा या memory address हो सकता है। FFmpeg के असेंबली कोड में GPR मुख्य रूप से आधार की भूमिका निभाते हैं।

वेक्टर रजिस्टर

  • vector (SIMD) registers में कई डेटा elements होते हैं। vector registers के कई प्रकार मौजूद हैं।
  • अधिकांश video compression और decompression गणनाएँ integer-आधारित होती हैं।

x86inc.asm शामिल करना

  • x86inc.asm एक हल्की abstraction layer है, जिसका उपयोग FFmpeg, x264, और dav1d में असेंबली प्रोग्रामरों का काम आसान बनाने के लिए किया जाता है।

सरल scalar असेंबली कोड

  • उदाहरण कोड के माध्यम से समझाया गया है कि scalar असेंबली कोड कैसे काम करता है।

बुनियादी vector function को समझना

  • पहले SIMD function उदाहरण के माध्यम से हर पंक्ति का अर्थ समझाया गया है।
  • movu, paddb जैसे निर्देशों का उपयोग करके vector operations किए जाते हैं।
  • function arguments के डेटा को modify करता है और कोई value return नहीं करता।

1 टिप्पणियां

 
GN⁺ 2025-02-23
Hacker News राय
  • इसी विषय पर एक और संदर्भ के रूप में FFmpeg और dav1d के उदाहरण हैं

    • FFmpeg का अक्सर उपयोग होता है, इसलिए इसे एक स्पष्ट use case माना जा सकता है
    • dav1d प्रमुख browsers और Android operating system में उपयोग होता है, और इसकी सफलता का एक बड़ा कारण hand-written SIMD है
    • dav1d का कुछ code दिन में खरबों बार चलता है, इसलिए उसे जितना संभव हो उतनी तेज़ी से चलना चाहिए
    • hand-written SIMD और compiler-generated SIMD के बीच performance का अंतर अधिकतम 50% तक हो सकता है
    • ऐसी तकनीकों को बनाए रखने के लिए FFmpeg assembly language school जैसे resources महत्वपूर्ण हैं
  • मुझे लगता है कि assembly लिखने की तुलना में intrinsics का उपयोग करना अधिक मूल्यवान है, लेकिन इसे पढ़ना बहुत उपयोगी था

    • Compiler Explorer का उपयोग करके समझा कि compiler performance optimization के लिए कौन-कौन से optimization करता है
  • मुझे लगता है कि यह guide बहुत शानदार है

    • जब मेरी low-level में रुचि थी, तब काश मेरे पास यह guide होता
  • मुझे जिज्ञासा है कि assembly सीखने या लागू करने में कोई "मज़ा" है या नहीं

    • क्या इसमें LISP या RISC-V जैसी खुशी मिलती है, या फिर COBOL की तरह इसे किसी विशेष system के साथ काम करने के लिए सीखा जाता है
    • मेरे रोज़मर्रा के काम में assembly का कोई कारण नहीं है, लेकिन क्या सिर्फ़ मज़े के लिए इसमें समय लगाना सार्थक है, यह जानना चाहता हूँ
  • q suffix pointer size को दर्शाता है, और 64-bit system में यह 8 होता है

    • यह वाक्य भ्रमित करने वाला लगता है
    • i.e को i.e., होना चाहिए, और *(* को opening parenthesis होना चाहिए
    • sizeof pointer return नहीं करता
  • K&R संदर्भ की प्रशंसा

    • C और programming सीखने के लिए खरीदी गई मेरी पहली किताब वही थी
    • शुरुआत में मैंने C++ सीखी थी, लेकिन वह बहुत abstract थी इसलिए समझना कठिन था
  • assembly उपयोग करने की कमी यह है कि code architecture-dependent हो जाता है

    • x86, arm, x86_64 के लिए अलग-अलग code लिखना पड़ता है
    • SIMD के लिए portable code लिखने का कोई अच्छा तरीका नहीं है
    • Rust portable SIMD API को stabilize कर रहा है, और Zig SIMD support देता है, लेकिन FFmpeg को फिर भी speed से असंतोष हो सकता है
  • inline assembly के विरोध को लेकर भ्रम है

    • inline assembly, assembly function call की तुलना में अधिक efficient लगता है
  • यह सामग्री परफेक्ट है

    • 386 दौर का x86 assembly मुझे पता था, लेकिन उससे अधिक उन्नत processors बहुत जटिल थे
    • मैं हाल के CPU के SIMD के बारे में और सीखना चाहता हूँ
  • मुझे जिज्ञासा है कि क्या assembly का C से 10 गुना तेज़ होना अभी भी सच है

    • क्या compilers इतने ठहर गए हैं कि वे hand-written assembly के क़रीब भी नहीं पहुँच सकते, यह जानना चाहता हूँ