1 पॉइंट द्वारा GN⁺ 4 시간 전 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • x86-32 emulator ने दूसरे प्रोसेसर पर x86-32 code चलाने के लिए binary translation से native code बनाया, और interpreter तरीके की तुलना में बड़ा performance improvement दिया
  • इस emulator को इस तरह समझा जा सकता है कि यह x86-32 को bytecode की तरह देखता है, और emulator को JIT compiler की तरह काम करने देता है
  • एक program को stack पर लगभग 64KB memory allocate करके initialize करनी थी, और सामान्य तरीका था stack probe के बाद stack pointer कम करना और एक छोटे loop से memory initialize करना
  • उस code के compiler ने loop की जगह 65,536 अलग-अलग byte write instructions बनाई, और हर instruction 4 byte की होने से 64KB data initialize करने के लिए 256KB code चाहिए था
  • emulator टीम ने इस function को detect करने के लिए translator में special code जोड़ा, और इसे बराबर काम करने वाले छोटे loop से replace कर दिया

पृष्ठभूमि: x86-32 emulator और binary translation

  • Windows में कभी ऐसे systems के लिए x86-32 processor emulator शामिल था जो x86-32 के अलावा किसी दूसरे processor पर चलते थे
  • यह मामला किस processor पर लागू था, इसे मूल लेख में स्पष्ट नहीं किया गया है
  • इस emulator ने binary translation का उपयोग करके ऐसा native code बनाया जो मूल x86-32 code के बराबर behavior देता था
  • इस तरीके ने interpreter-आधारित emulation की तुलना में काफ़ी बेहतर performance दी
  • इसे इस तरह समझा जा सकता है कि x86-32 को bytecode माना जाए और emulator को JIT compiler की तरह देखा जाए

समस्या वाला code: 64KB stack memory initialization

  • एक program को stack पर लगभग 64KB memory allocate करके उसे initialize करना था
  • मानक तरीका पहले stack probe करना था, ताकि यह जाँचा जा सके कि 64KB memory इस्तेमाल की जा सकती है या नहीं
  • उसके बाद stack pointer से 65,536 घटाकर एक छोटे और tight loop से memory initialize करना सामान्य था

compiler का अत्यधिक loop unrolling

  • इस code को compile करने वाले compiler ने हर byte initialize करने वाला loop नहीं बनाया
  • इसकी जगह उसने loop को 65,536 अलग-अलग “memory में byte write” instructions में खोल दिया
  • हर instruction 4 byte लंबी थी
  • नतीजतन 64KB data initialize करने के लिए 256KB code की ज़रूरत पड़ी

emulator टीम की प्रतिक्रिया

  • emulator टीम ने translator में इस function को पहचानने के लिए special code जोड़ा
  • detect होने पर इस function को उसी behavior देने वाले छोटे loop से replace कर दिया गया
  • यह तरीका मूल program code को ज्यों का त्यों translate करने के बजाय, emulation के दौरान inefficient code pattern को अधिक संक्षिप्त रूप में बदलने का था

1 टिप्पणियां

 
GN⁺ 4 시간 전
Lobste.rs की राय
  • Raymond Chen को loop unrolling समझाने वाली टिप्पणी काफ़ी पसंद आई

    • वह टिप्पणी सिर्फ़ ब्लॉग लेखक के लिए नहीं, बल्कि सामान्य पाठकों के लिए भी लिखी गई हो सकती है
      ऐसे लेख पढ़ने वालों में हर कोई सारी पृष्ठभूमि नहीं जानता, इसलिए ज़्यादा सीखने के संकेतों के लिए आभारी रहने वाले लोग भी बहुत होते हैं
    • वह टिप्पणी मैंने नहीं देखी, शायद हटा दी गई थी। फिर भी Raymond Chen की बात हो, तो वह शख़्स अपने आप में एक दिग्गज है
      https://joelonsoftware.com/2004/06/…
    • इससे दशकों पहले Slashdot पर किसी ने larry@wall.org को Perl का विषय समझाने की कोशिश की थी, उसकी याद आ गई
  • यह शायद Alpha पर था। उस platform के x86 emulator में बहुत ज़्यादा काम लगाया गया था