কোন কোড শাখার পূর্বাভাস অপ্টিমাইজেশনের জন্য ভাল?


10

প্রদত্ত শাখার পূর্বাভাস এবং সংকলক অপ্টিমাইজেশনের প্রভাব, কোন কোডটি উচ্চতর পারফরম্যান্স প্রস্তাব করে?

নোট করুন যে bRareExceptionPstream একটি অস্বাভাবিক অবস্থার প্রতিনিধিত্ব করে। এটি যুক্তির সাধারণ পথ নয়।

/* MOST COMMON path must branch around IF clause */

bool SomeFunction(bool bRareExceptionPresent)
{
  // abort before function
  if(bRareExceptionPresent)
  {
     return false;
  }    
  .. function primary body ..    
  return true;
}

/* MOST COMMON path does NOT branch */

bool SomeFunction(bool bRareExceptionPresent)
{
  if(!bRareExceptionPresent)
  {
    .. function primary body ..
  }
  else
  {
    return false;
  }
  return true;
}

9
আমি এখানে একটি অঙ্গ নেভিগেশন যেতে যাচ্ছি এবং বলুন যে কোন পার্থক্য আছে।
রবার্ট হার্ভে

7
এটি সম্ভবত আপনি যে নির্দিষ্ট সিপিইউয়ের জন্য সংকলন করছেন তার উপর নির্ভর করে, কারণ তাদের বিভিন্ন পাইপলাইনের আর্কিটেকচার রয়েছে (বিলম্ব স্লট বনাম কোনও বিলম্বের স্লট নেই)। আপনি এটি সম্পর্কে ভাবতে সময়টি চালানোর সময় সাশ্রয় করা সময়ের চেয়ে সম্ভবত বেশি হবে - প্রথমে প্রোফাইল, তারপরে অনুকূলিত করুন।

2
এটি প্রায় অকাল মাইক্রো-অপ্টিমাইজেশন।
রবার্ট হার্ভে

2
@ মিশেল ইয়েপ, প্রোফাইলিং হ'ল একমাত্র নির্ভরযোগ্য উপায় হ'ল তার প্ল্যাটফর্মের মধ্যে লক্ষ্য, প্ল্যাটফর্মের কোডটির জন্য কার্য সম্পাদন কী চলছে really তবে, আমি কৌতূহল ছিলাম যে কোনও একটিকে সাধারণত পছন্দ করা হয় কিনা।
dyasta

1
@ রবার্টহারভে: উভয় শর্ত পূরণ হয় এমন ক্ষেত্রে ব্যতীত এটি অকাল মাইক্রো-অপ্টিমাইজেশন : (১) লুপটিকে বিলিয়ন (মিলিয়ন নয়) বার বলা হয়; এবং (2) হাস্যকরভাবে, যখন লুপের বডিটি মেশিন কোডের ক্ষেত্রে ছোট হয়। শর্ত # 2 এর অর্থ হল যে ওভারহেডে ব্যয় করা সময়ের ভগ্নাংশটি দরকারী কাজের জন্য ব্যয় করা সময়ের তুলনায় তুচ্ছ নয় । সুসংবাদটি হ'ল সাধারণত, এমন পরিস্থিতিতে যেখানে উভয় শর্ত পূরণ হয়, সিমডি (ভেক্টরাইজেশন) যা প্রকৃতির শাখাবিহীন, সমস্ত কার্য সম্পাদনের সমস্যাগুলি সমাধান করবে।
রাওয়ং

উত্তর:


10

আজকের বিশ্বে, এটি কিছুটা হলেও গুরুত্বপূর্ণ নয়।

গতিশীল শাখার পূর্বাভাস (কয়েক দশক ধরে চিন্তা করা কিছু (দেখুন ১৯৯ (সালে প্রকাশিত ডায়নামিক ব্রাঞ্চ প্রেডিকশন স্কিমসন সিস্টেম ওয়ার্কলোডগুলির একটি বিশ্লেষণ )) মোটামুটি সাধারণ জায়গা।

এর উদাহরণ এআরএম প্রসেসরে পাওয়া যাবে। শাখা ভবিষ্যদ্বাণীতে আর্ম ইনফো সেন্টার থেকে

শাখার পূর্বাভাসের যথার্থতা উন্নত করতে, স্ট্যাটিক এবং গতিশীল কৌশলগুলির সংমিশ্রণটি নিযুক্ত করা হয়।

তারপরে প্রশ্নটি "আর্ম প্রসেসরে গতিশীল শাখার পূর্বাভাসটি কী?" ডায়নামিক শাখার পূর্বাভাসের মনোযোগ সহকারে পড়া থেকে বোঝা যায় যে এটি 2 বিট প্রেডিকশন স্কিম ব্যবহার করে (কাগজে বর্ণিত) শাখাটি দৃ strongly় বা দুর্বলভাবে নেওয়া হয়েছে বা নেওয়া হয়নি কিনা সে সম্পর্কে তথ্য তৈরি করে।

সময়ের সাথে সাথে (এবং সময়ের সাথে সাথে আমি বলতে চাইছি block ব্লকটি কয়েকটা পথ পেরিয়ে গেছে) এটি কোডটি কীভাবে যাবে সে সম্পর্কে তথ্য তৈরি করে।

জন্য স্ট্যাটিক ভবিষ্যদ্বাণী , এটা উপায় কোড নিজেই এবং কোন পথে দেখায় শাখা পরীক্ষায় তৈরি করা হয় এ দেখায় - একটি পূর্ববর্তী নির্দেশ বা আপনার কাছে কোড আরও:

এআরএম 1136 জেএফ-এস প্রসেসরে ব্যবহৃত স্কিমটি ভবিষ্যদ্বাণী করে যে সমস্ত ফরোয়ার্ড শর্তাধীন শাখা নেওয়া হয় নি এবং সমস্ত পশ্চাৎ শাখা নেওয়া হয়। সমস্ত শাখার প্রায় 65% পূর্বে পূর্বাভাস দেওয়ার জন্য পর্যাপ্ত অ-শাখাচক্র দ্বারা চালিত হয়।

স্পার্কি দ্বারা উল্লিখিত হিসাবে, এটি বোঝার উপর ভিত্তি করে যে লুপটি বেশি নয় লুপ হয়। লুপটি শাখাগুলি পিছনের দিকে (এটি শীর্ষে পুনরায় চালু করার জন্য লুপের শেষে একটি শাখা রয়েছে) - এটি সাধারণত এটি করে।

সংকলকটিকে দ্বিতীয় অনুমান করার চেষ্টা করার বিপদটি হ'ল আপনি কীভাবে কী কোডটি আসলে সংকলিত হতে চলেছেন তা জানেন না (এবং অনুকূলিত)। এবং বেশিরভাগ ক্ষেত্রে, এটি কোনও ব্যাপার নয়। গতিশীল ভবিষ্যদ্বাণী সহ, ফাংশনের মাধ্যমে দু'বার এটি অকাল প্রত্যাবর্তনের জন্য গার্ড স্টেটমেন্টের পিছনে অগ্রাহ্য করবে। দুটি ফ্লাশ পাইপলাইনগুলির পারফরম্যান্স যদি সমালোচনামূলক পারফরম্যান্সের হয় তবে চিন্তা করার মতো আরও কিছু বিষয় রয়েছে।

কোনও স্টাইলকে অন্যের উপর পড়তে যে সময় লাগে তার থেকে বেশি গুরুত্ব দেওয়া যায় - কোডটি পরিষ্কার করে দেওয়া যাতে কোনও মানুষ এটি পড়তে পারে, কারণ আপনি কোডটি কতটা অগোছালো বা আদর্শিত করেই কম্পাইলার ঠিক ঠিকঠাক কাজ করে যাচ্ছে।


7
একটি বিখ্যাত Stackoverflow প্রশ্ন শাখা ভবিষ্যদ্বাণী দেখিয়েছেন করে আজই এমনকি কোন ব্যাপার।
ফ্লোরিয়ান মার্জাইন

3
@ ফ্লোরিয়ানমারগেইন এটি গুরুত্বপূর্ণ হলেও এটি এমন পরিস্থিতিতে পড়ে যা মনে হচ্ছে যে আপনি আসলে কী সংকলন করছেন এবং এটি কীভাবে কাজ করে তা বোঝা দরকার (আর্ম vs x86 বনাম মিপস ...)। শুরুতে এই মাইক্রো-অপ্টিমাইজেশানটি করার চেষ্টা করে রাইটিং কোড সম্ভবত ভুল জায়গা থেকে কাজ করছে এবং পছন্দসই প্রভাব অর্জন করবে না।

অবশ্যই, ডি কে উদ্ধৃত করা যাক না। তবে আমি মনে করি এই প্রশ্নটি পরিষ্কারভাবে অপ্টিমাইজেশনের অর্থে ছিল, যখন আপনি ইতিমধ্যে প্রোফাইলের পর্যায়ে চলে গেছেন। :-)
ফ্লোরিয়ান মার্জাইন

2
@ মিশেলটি ভাল উত্তর দিয়েছে, এবং আমি আপনার উপসংহারের সাথে খুব সম্মত। এই ধরণের প্রাক-প্রোফাইলিং / বিমূর্ত অপ্টিমাইজেশান অবশ্যই পাল্টা উত্পাদনশীল হতে পারে। এটি একটি অনুমানমূলক খেলা হয়ে শেষ হয়, যার কারণে যুক্তিহীন কারণে ডিজাইনের সিদ্ধান্ত নেওয়া হয়। তবুও, আমি নিজেকে কৌতূহল বলে মনে করেছি; ও
দ্যস্ত


9

আমার বোধগম্যতা হ'ল প্রথমবারের মতো সিপিইউ কোনও শাখার মুখোমুখি হয়, এটি পূর্বাভাস দেয় (যদি সমর্থিত হয়) যে ফরোয়ার্ড শাখাগুলি নেওয়া হয় না এবং পিছনের শাখাগুলি হয়। এর যুক্তিটি হ'ল লুপগুলি (যা সাধারণত পিছনের দিকে শাখা করে) নেওয়া হয় বলে ধরে নেওয়া হয়।

কিছু প্রসেসরগুলিতে, আপনি কোন পথে পাথের সম্ভাবনা বেশি তা সংসদীয় নির্দেশিকায় একটি ইঙ্গিত দিতে পারেন। এই বিবরণ এই মুহূর্তে আমাকে অব্যাহতি।

অতিরিক্তভাবে, কিছু সি সংকলক স্থিতিশীল শাখার পূর্বাভাসকেও সমর্থন করে যাতে আপনি কোন শাখার বেশি সম্ভাবনা রয়েছে তা সংকলকটিকে বলতে পারেন। পরিবর্তে এটি উত্পন্ন কোডটিকে পুনর্গঠিত করতে পারে, বা এই তথ্যের সুবিধা নিতে পরিবর্তিত নির্দেশাবলী ব্যবহার করতে পারে (বা এমনকি এটিকে উপেক্ষা করে কেবল ফ্ল্যাট করে)।

__builtin_expect((long)!!(x), 1L)  /* GNU C to indicate that <x> will likely be TRUE */
__builtin_expect((long)!!(x), 0L)  /* GNU C to indicate that <x> will likely be FALSE */

আশাকরি এটা সাহায্য করবে.


3
"আমার বোধগম্যতা হ'ল সিপিইউ প্রথমবার কোনও শাখার মুখোমুখি হবে, ভবিষ্যদ্বাণী করা হবে (সমর্থিত হলে) ফরোয়ার্ড শাখা নেওয়া হয় না এবং পিছনের শাখা হয়।" এটি একটি খুব আকর্ষণীয় চিন্তা। এটি সত্যই সাধারণ আর্কিটেকচারে বাস্তবায়িত হয়েছে এমন কোনও প্রমাণ রয়েছে কি?
blubb

5
সোজা ঘোড়ার মুখ থেকে: একটি অগ্রণী শাখা ডিফল্ট নেওয়া হয় নি। একটি পশ্চাৎপদ শাখা ডিফল্ট নেওয়া হয় । এবং একই পৃষ্ঠা থেকে: "উপসর্গ 0x3E - হিসাবে নেওয়া হিসাবে একটি শাখার স্থিরভাবে পূর্বাভাস"।
এমএসএলটাররা

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