কীভাবে হিপ হপ ভার্চুয়াল মেশিন (এইচএইচভিএম) তাত্ত্বিকভাবে পিএইচপি রানটাইম কর্মক্ষমতা উন্নত করে?


9

একটি উচ্চ স্তর থেকে, কীভাবে ফেসবুক, ইত্যাদি করে। হিপ হপ ভার্চুয়াল মেশিনের সাথে পিএইচপি পারফরম্যান্স উন্নত করতে আল ব্যবহার?

Theতিহ্যবাহী জেন্ড ইঞ্জিন ব্যবহার করে কোড কার্যকর করার কোড থেকে এটি কীভাবে আলাদা? প্রকারের অপ্টিমাইজেশান কৌশলগুলির জন্য হ্যাকের সাথে প্রকারগুলি optionচ্ছিকভাবে সংজ্ঞায়িত হওয়ার কারণে এটি হয়?

আমার কৌতূহল এই নিবন্ধটি পড়ে, এইচএইচভিএম গ্রহণের পরে উত্থিত হয়েছিল ।

উত্তর:


7

তারা ট্রান্সলেটরএক্স 64 এর ট্রেসলেটগুলি নতুন হিপহপ ইন্টারমিডিয়েট রিপ্রেজেন্টেশন (হির) দিয়ে প্রতিস্থাপিত করে এবং একটি নতুন ইন্দিরেশন লেয়ারে হিরার উত্সর্গ করার জন্য যুক্তি যুক্ত করে, যা আসলে একই নাম, হির নামে অভিহিত হয়।

উচ্চ স্তরের থেকে, এটি পূর্বে 9 টি নির্দেশাবলীর জন্য যা করা দরকার তা করতে 6 টি নির্দেশনা ব্যবহার করছে, যেমনটি এখানে উল্লেখ করা হয়েছে: "এটি একই টাইপিক্স দিয়ে শুরু হয় তবে অনুবাদটির মূল অংশটি 6 টি নির্দেশনা, অনুবাদক 9 এর 9 এর চেয়ে উল্লেখযোগ্যভাবে ভাল"

http://hhvm.com/blog/2027/faster-and-cheaper-the-evolution-of-the-hhvm-jit

সিস্টেমটি কীভাবে ডিজাইন করা হয়েছে এবং এটি আমরা পরিশেষে পরিষ্কার করার পরিকল্পনা করি এটির বেশিরভাগই এটি একটি নিদর্শন। ট্রান্সলেটরএক্স in৪ এর সমস্ত কোড বাকি কোডগুলি নির্গত করার জন্য এবং একসাথে অনুবাদগুলি লিঙ্ক করার জন্য প্রয়োজনীয় যন্ত্রপাতি; যে কোডটি বুঝতে পেরেছিল যে কীভাবে পৃথক বাইকোডগুলি অনুবাদ করতে হয় তা অনুবাদক X64 থেকে চলে গেছে।

যখন hhir TranslatorX64 প্রতিস্থাপন করেছে, তখন এটি এমন কোড উত্পন্ন করছিল যা মোটামুটি 5% দ্রুত এবং ম্যানুয়াল পরিদর্শন করার পরে উল্লেখযোগ্যভাবে আরও ভাল দেখায়। আমরা অন্য মিনি-লকডাউনের সাথে এর প্রযোজনার প্রথমটি অনুসরণ করেছি এবং তার উপরে পারফরম্যান্স লাভের জন্য অতিরিক্ত 10% পেয়েছি। ক্রিয়ায় এই উন্নতিগুলির কয়েকটি দেখতে, আসুন একটি ফাংশন অ্যাডপোসিটিভ এবং এর অনুবাদটির অংশটি দেখুন look

function addPositive($arr) {
      $n = count($arr);
      $sum = 0;
      for ($i = 0; $i < $n; $i++) {
        $elem = $arr[$i];
        if ($elem > 0) {
          $sum = $sum + $elem;
        }
      }
      return $sum;
    }

এই ফাংশনটি অনেকটা পিএইচপি কোডের মতো দেখাচ্ছে: এটি একটি অ্যারের উপরে লুপ করে এবং প্রতিটি উপাদান দিয়ে কিছু করে। আসুন আপাতত 5 এবং 6 লাইনগুলিতে তাদের বাইটোকোড সহ ফোকাস করি:

    $elem = $arr[$i];
    if ($elem > 0) {
  // line 5
   85: CGetM <L:0 EL:3>
   98: SetL 4
  100: PopC
  // line 6
  101: Int 0
  110: CGetL2 4
  112: Gt
  113: JmpZ 13 (126)

এই দুটি লাইন একটি অ্যারে থেকে একটি উপাদান লোড করে, এটি একটি স্থানীয় ভেরিয়েবলে সঞ্চয় করে, তারপরে সেই স্থানীয়টির মান 0 এর সাথে তুলনা করে শর্তসাপেক্ষে ফলাফলের ভিত্তিতে কোথাও লাফিয়ে যায়। বাইটোকোডে কী চলছে সে সম্পর্কে যদি আপনি আরও বিশদে আগ্রহী হন তবে আপনি বাইটকোড.স্পেসিফিকেশন দিয়ে স্কিম করতে পারেন। অনুবাদক X64 দিনের মধ্যে এখন এবং পিছনে জেআইটি এই কোডটিকে দুটি ট্রেসলেট বিভক্ত করে: একটি মাত্র সিসিটিএম সহ, অন্যটি নির্দেশাবলীর সাথে অন্যটি (কেন এটি ঘটে তার পুরো ব্যাখ্যা এখানে প্রাসঙ্গিক নয়, তবে এটি প্রায়শই কারণ আমরা সংকলন সময়ে জানি না যে অ্যারের উপাদানটির ধরণ কী হবে)। সিগেটএম এর অনুবাদটি সি ++ সহায়ক ফাংশনে কল এনে দেয় এবং এটি খুব আকর্ষণীয় নয়, তাই আমরা দ্বিতীয় ট্রেসলেটটি দেখব। এই প্রতিশ্রুতিটি অনুবাদক X64 এর সরকারী অবসর ছিল,

  cmpl  $0xa, 0xc(%rbx)
  jnz 0x276004b2
  cmpl  $0xc, -0x44(%rbp)
  jnle 0x276004b2
101: SetL 4
103: PopC
  movq  (%rbx), %rax
  movq  -0x50(%rbp), %r13
104: Int 0
  xor %ecx, %ecx
113: CGetL2 4
  mov %rax, %rdx
  movl  $0xa, -0x44(%rbp)
  movq  %rax, -0x50(%rbp)
  add $0x10, %rbx    
  cmp %rcx, %rdx    
115: Gt
116: JmpZ 13 (129)
  jle 0x7608200

প্রথম চারটি লাইন টাইপচেকগুলি যাচাই করে যা নিশ্চিত করে যে $ এলেম এর মান এবং স্ট্যাকের শীর্ষে থাকা মানটি আমাদের প্রত্যাশাগুলি। যদি সেগুলির মধ্যে দুটিও ব্যর্থ হয়, আমরা মেশিন কোডের আলাদা আলাদা বিশেষায়িত অংশ তৈরি করতে নতুন ধরণগুলি ব্যবহার করে ট্রেডলেটের একটি পুনঃপ্রবর্তন ঘটায় এমন কোডে ঝাঁপিয়ে দেব। অনুবাদের মাংসটি অনুসরণ করে এবং কোডটিতে উন্নতির জন্য প্রচুর জায়গা রয়েছে। লাইন 8 এ একটি মৃত বোঝা রয়েছে, 12 লাইনে সরানো রেজিস্ট্রেশন করার জন্য একটি সহজেই এড়ানো যায় নিবন্ধক এবং 10 এবং 16 লাইনগুলির মধ্যে ধ্রুবক প্রচারের সুযোগ রয়েছে These ট্রান্সলেটরএক্স 64 দ্বারা ব্যবহৃত বাইটোকোড-এ-এ-টাইম পদ্ধতির এই সমস্ত পরিণতি। কোনও সম্মানজনক সংকলক এর আগে এই জাতীয় কোড নির্গত করতে পারে না, তবে এড়াতে প্রয়োজনীয় সাধারণ অপ্টিমাইজেশানগুলি কেবল অনুবাদকএক্স 64৪ মডেলের সাথে খাপ খায় না।

এখন একই hhvm সংশোধনীতে hhir ব্যবহার করে একই ট্রেসলেটটি অনুবাদ করা দেখুন:

  cmpl  $0xa, 0xc(%rbx)
  jnz 0x276004bf
  cmpl  $0xc, -0x44(%rbp)
  jnle 0x276004bf
101: SetL 4
  movq  (%rbx), %rcx
  movl  $0xa, -0x44(%rbp)
  movq  %rcx, -0x50(%rbp)
115: Gt    
116: JmpZ 13 (129)
  add $0x10, %rbx
  cmp $0x0, %rcx    
  jle 0x76081c0

এটি একই টাইপচেকগুলি দিয়ে শুরু হয় তবে অনুবাদটির মূল অংশটি 6 টি নির্দেশনা, অনুবাদকএক্স 64 এর 9 এর চেয়ে উল্লেখযোগ্যভাবে ভাল। লক্ষ্য করুন যে কোনও মৃত লোড নেই বা চলনগুলি নিবন্ধকরণের জন্য নিবন্ধভুক্ত নেই, এবং ইন্ট 0 বাইটকোড থেকে অবিলম্বে 0 টি লাইনের 12 নম্বরে সিএমপিতে প্রচারিত হয়েছিল এখানে ট্রেসলেট এবং সেই অনুবাদটির মধ্যে উত্সর্গীকৃত এই হির এখানে রয়েছে:

  (00) DefLabel    
  (02) t1:FramePtr = DefFP
  (03) t2:StkPtr = DefSP<6> t1:FramePtr
  (05) t3:StkPtr = GuardStk<Int,0> t2:StkPtr
  (06) GuardLoc<Uncounted,4> t1:FramePtr
  (11) t4:Int = LdStack<Int,0> t3:StkPtr
  (13) StLoc<4> t1:FramePtr, t4:Int
  (27) t10:StkPtr = SpillStack t3:StkPtr, 1
  (35) SyncABIRegs t1:FramePtr, t10:StkPtr
  (36) ReqBindJmpLte<129,121> t4:Int, 0

বাইটকোড নির্দেশাবলী ছোট এবং সরল ক্রিয়াকলাপে বিভক্ত হয়েছে। নির্দিষ্ট বাইটোকোডের আচরণে লুকানো অনেকগুলি ক্রিয়াকলাপ হিরে স্পষ্টভাবে উপস্থাপিত হয়, যেমন line লাইনের এলডিস্ট্যাক যা সেটেলের অংশ। মানগুলির প্রবাহ উপস্থাপনের জন্য শারীরিক নিবন্ধগুলির পরিবর্তে নামহীন টেম্পোরারিগুলি (টি 1, টি 2, ইত্যাদি ...) ব্যবহার করে আমরা প্রতিটি মানটির সংজ্ঞা এবং ব্যবহার (গুলি) সহজেই ট্র্যাক করতে পারি। এটি কোনও লোডের গন্তব্য আসলে ব্যবহৃত হয় কিনা তা দেখার জন্য তুচ্ছ করে তোলে বা কোনও নির্দেশনার ইনপুট যদি সত্যিই 3 বাইকোডের আগে থেকে স্থির মান হয়। Hhir কী এবং এটি কীভাবে কাজ করে তার আরও বিশদ ব্যাখ্যার জন্য, ir.specifications এ একবার দেখুন।

এই উদাহরণটি অনুবাদকএক্স 6464 এর মাধ্যমে হিরের কয়েকটি উন্নতি দেখিয়েছে। Hhir প্রযোজনায় নিযুক্ত এবং মে 2013 সালে অনুবাদক এক্স 64 অবসর গ্রহণ হিট করার জন্য একটি দুর্দান্ত মাইলফলক, তবে এটি কেবল শুরু ছিল। তার পর থেকে, আমরা আরও অনেক অপটিমাইজেশন বাস্তবায়ন করেছি যা অনুবাদক এক্স 64৪ এ প্রায় অসম্ভব হয়ে উঠবে, এইচএইচভি প্রক্রিয়াটিতে প্রায় দ্বিগুণ দক্ষ করে তুলেছে। আমাদের পুনর্নির্মাণের জন্য প্রয়োজনীয় আর্কিটেকচার-নির্দিষ্ট কোডের পরিমাণ বিচ্ছিন্ন করে এবং এআরএম প্রসেসরগুলিতে এইচএইচভিএম চালানোর জন্য আমাদের প্রচেষ্টাগুলিও এটি অত্যন্ত গুরুত্বপূর্ণ ছিল been আরও তথ্যের জন্য আমাদের এআরএম বন্দরে নিবেদিত একটি আসন্ন পোস্ট দেখুন! "


1

সংক্ষেপে: তারা এলোমেলো মেমরি অ্যাক্সেসকে ছোট করার চেষ্টা করে এবং সিপিইউ ক্যাশে দিয়ে সুন্দরভাবে খেলতে মেমরির কোডের টুকরাগুলির মধ্যে লাফ দেয়।

এইচএইচভিএম পারফরম্যান্স স্থিতি অনুসারে এলোমেলো মেমরি অ্যাক্সেস হ্রাস করতে তারা বেশিরভাগ ঘন ঘন ব্যবহৃত ডেটা ধরণের স্ট্রিং এবং অ্যারে অনুকূলিত করে। ধারণাটি হ'ল ডেটা টুকরা একসাথে ব্যবহৃত (অ্যারের আইটেমের মতো) মেমোরিতে যতটা সম্ভব একে অপরের কাছাকাছি রাখা, আদর্শভাবে রৈখিক ফ্যাশনে to এইভাবে, যদি ডেটা সিপিইউ এল 2 / এল 3 ক্যাশে ফিট করে তবে এটি র‌্যামের চেয়ে দ্রুতগতির ক্রমগুলি প্রসেস করা যেতে পারে।

উল্লিখিত অন্য কৌশলটি কোনও কোডে সর্বাধিক ব্যবহৃত পাথগুলি এমনভাবে সংকলন করা হয় যে সংকলিত সংস্করণটি লিনিয়ার (ইআই এর কমপক্ষে "জাম্প" এর কম পরিমাণে থাকে) এবং যতটা সম্ভব মেমরির বাইরে / বাইরে ডেটা লোড করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.