শাখার পূর্বাভাস কীভাবে কাজ করে, যদি আপনার এখনও শর্তাদি পরীক্ষা করতে হয়?


30

আমি https://stackoverflow.com/q/11227809/555690 থেকে শাখা ভবিষ্যদ্বাণী সম্পর্কে জনপ্রিয় উত্তরটি পড়ছিলাম এবং আমাকে বিভ্রান্ত করার মতো কিছু আছে:

  • আপনি যদি সঠিক অনুমান করেন তবে এটি অবিরত থাকবে।
  • আপনি যদি ভুল অনুমান করেন তবে ক্যাপ্টেন থামবেন, ব্যাক আপ করবেন এবং স্যুইচটি সরিয়ে ফেলার জন্য আপনাকে চিৎকার করবেন। তারপরে এটি অন্য পথটি আবার চালু করতে পারে।

আপনি যদি প্রতিবার ঠিক মতো অনুমান করেন তবে ট্রেনটি কখনও থামতে হবে না।

আপনি যদি খুব ঘন ঘন ভুল অনুমান করেন, ট্রেন থামাতে, ব্যাক আপ করতে এবং পুনরায় চালু করতে প্রচুর সময় ব্যয় করবে।

কিন্তু এই আমি পেতে না কি: থেকে জানি কিনা আপনার অনুমান ভুল বা ঠিক ছিল, আপনি একটি শর্ত চেক করতে হবে যাহাই হউক না কেন । সুতরাং কিভাবে শাখার পূর্বাভাস এমনকি যদি কাজ করে তবে আপনি যদি এখনও একই শর্তসাপেক্ষ চেক করছেন?

আমি যা বলার চেষ্টা করছি তা হচ্ছে, শাখার পূর্বাভাসটি কোনও শাখার পূর্বাভাস না দেওয়ার মতো ঠিক একই নয় কারণ আপনি যেভাবে শর্তাধীন চেক করছেন? (অবশ্যই আমি ভুল, কিন্তু আমি এটি পাই না)


1
এই উইকি নিবন্ধটি এটি ব্যাখ্যা করার জন্য বেশ ভাল কাজ করে।
এন্ডারল্যান্ড

8
একটি আধুনিক সিপিইউ পাইপলাইনযুক্ত এবং একই সাথে বেশ কয়েকটি জিনিস করতে পারে। সুতরাং এটি সঠিক অনুমান করা হয়েছে কিনা তা এখনও নির্ণয় করার সময় এটি তার অনুমান কার্যকর করা শুরু করতে পারে। অনুমানটি ঠিক থাকলে পাইপলাইনটি চলতে থাকবে। একটি ভুল অনুমানের ভিত্তিতে পাইপলাইনটি টস আউট হয়ে যায় এবং এক্সিকিউশনটি "সঠিক উত্তর" পয়েন্ট থেকে পুনরায় শুরু হয়।
মার্কস্পেস

2
সম্পর্কিত পড়া: পাইপলাইন । আমি আপনার এই প্রশ্নের উত্তর যেমন দেয়, তেমনি এই প্রশ্নটির স্বীকৃত উত্তরটি পুনরায় পড়ারও পরামর্শ দেব।

উত্তর:


19

অবশ্যই শর্তটি প্রতি একক সময় পরীক্ষা করা হয়। তবে এটি যাচাই করা হওয়ার সাথে সাথে এটি সিপিইউ পাইপলাইনে অনেক দূরে। মাঝামাঝি সময়ে, অন্যান্য নির্দেশাবলীও পাইপলাইনে প্রবেশ করেছে এবং কার্যকর করার বিভিন্ন পর্যায়ে রয়েছে।

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

পরবর্তীতে, শর্তের নির্দেশটি পাইপলাইনের উপরে ভ্রমণ করার সাথে সাথে এটি মূল্যায়নের সময়। সেই সময়, সিপিইউ আবিষ্কার করে যে তার অনুমানটি সঠিক ছিল কি ভুল।

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

সংশোধন

স্টার ওয়েভারের মন্তব্যের জবাবে, একক নির্দেশনা কার্যকর করতে সিপিইউকে কী করতে হবে তা সম্পর্কে ধারণা দিতে:

এমন কিছু সাধারণ বিষয় বিবেচনা করুন MOV AX,[SI+10]যা আমরা মানুষ নির্লিপ্তভাবে "এসআই প্লাস 10 এ শব্দটি সহ এক্স লোড করি" বলে মনে করি। মোটামুটিভাবে, সিপিইউ করতে হবে:

  1. ঠিকানা বাসে পিসির সামগ্রী ("প্রোগ্রামের কাউন্টার রেজিস্টার") প্রেরণ করুন;
  2. তথ্য বাস থেকে নির্দেশ অপকোড পড়ুন;
  3. ইনক্রিমেন্ট পিসি;
  4. এটি দিয়ে কী করা যায় তা চিত্রিত করার জন্য অপকোডটি ডিকোড করুন;
  5. ঠিকানা বাসে পিসির সামগ্রীগুলি প্রেরণ করুন;
  6. তথ্য বাস থেকে নির্দেশ অপারেন্ড (এই ক্ষেত্রে 10) পড়ুন;
  7. ইনক্রিমেন্ট পিসি;
  8. সংযোজনকারীকে অপারেন্ড এবং এসআই খাওয়ান;
  9. অ্যাড্রেসের ফলাফল ঠিকানা বাসে প্রেরণ করুন;
  10. ডেটা বাস থেকে অ্যাক্স পড়ুন।

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

এখন, বিবেচনা করুন যে আরও জটিল অ্যাড্রেসিং মোড রয়েছে, যেমন MOV AX, [DX+SI*4+10]এবং আরও জটিল নির্দেশাবলীর উপস্থিতি, যেমন MUL AX, operandসিপিইউর অভ্যন্তরে লুপগুলি কার্যকর করে তাদের ফলাফল গণনা করার জন্য।

সুতরাং, এখানে আমার বক্তব্যটি হ'ল "পারমাণবিক স্তর" রূপক সিপিইউ নির্দেশিকা স্তরের পক্ষে উপযুক্ত নয়। এটি পাইপলাইন ধাপ স্তরের জন্য উপযুক্ত হতে পারে, যদি আপনি প্রকৃত লজিক গেট স্তরে খুব বেশি নিচে যেতে না চান।


2
হু, আমি আশ্চর্য হয়েছি যে সমস্যাগুলির লোকদের (আমাকে সহ) এটি বোঝার বিষয়ে যদি মনে হয় যে এটি কেবলমাত্র একটিমাত্র শিক্ষার আংশিক জ্ঞানসম্পন্ন সিপিইউর কল্পনা করা খুব কঠিন (আমার পক্ষে); বা অর্ধেক সমাপ্ত নির্দেশাবলী "পিজ্জা বেল্ট ওভেনের মধ্য দিয়ে যাওয়া" পাওয়া আমার পক্ষে ... অন্ততপক্ষে, যখন আমি ইরেক্টর সেট এবং ধাতব লেদ স্তরের মধ্যে জিনিসগুলির সাথে কাজ করতে অভ্যস্ত তখন এটি পরমাণুতে স্কেল পরিবর্তনের মতো অনুভূত হয়।
স্টারওয়েভার

1
@ স্টারওয়েভার আমাকে আপনার মন্তব্য পছন্দ হয়েছে, তাই আমি এটিকে সম্বোধন করার জন্য আমার উত্তরটি সংশোধন করেছি।
মাইক নাকিস

1
বাহ, সুন্দর এক্সপ্লিনেশন। আমি ভুলে যাওয়ার প্রবণতা রাখি যে কেবল দরকারী শব্দগুলিকে আরও দরকারী স্থানে নিয়ে যায়। আমি এখনও একটি সিপিইউ বেল্ট চালিত পিজ্জা ওভেনের সেট হিসাবে দেখছি যদিও: 3।
স্টারওয়েভার

এটি মনে রাখার মতো যে স্ট্যাক ওভারফ্লো প্রশ্নটি ওপি দ্বারা যুক্ত - এটি যা সম্ভবত "শাখার পূর্বাভাস" এমনকি বিদ্যমান ছিল এমন পূর্ববর্তী অপরিচিত 1 মিলিয়ন প্রোগ্রামারকে পরিচয় করিয়েছিল এমন 1.3 মিলিয়ন মতামত যা জাভাতে একটি উদাহরণ প্রদর্শন করে । আমার মতো লোকেরা যারা জাভা জাতীয় ভাষা আমাদের সরবরাহ করে এমন বিমূর্ততার স্তরে কাজ করতে অভ্যস্ত, এমনকি MOV AX,[SI+10]পরকীয়া, "সরল" নয়; বেশিরভাগ প্রোগ্রামাররা আজও অ্যাসেম্বলি লিখেছেন না। আমরা এটিকে কোনও অর্থ হিসাবে "নির্লজ্জভাবে ভাবি" না।
মার্ক আমেরিকা

@ মার্ক অ্যামেরি ভাল, ঠিক আছে, আমি ভেবেছিলাম যে এটি "স্পষ্টতই মানুষ" দ্বারা আমি বোঝাচ্ছি "আমরা মানুষ যারা সমাবেশ লেখার সাহস করি"। মূল বক্তব্যটি হ'ল এমনকি সংসদীয় ভাষা প্রোগ্রামাররাও সব সময় পাইপলাইনের কথা ভাবছেন না, এমনকি মোটেইও না।
মাইক নাকিস

28

এটিকে জিপিএসবিহীন রোড ট্রিপের মতো ভাবুন। আপনি কোনও মোড়ে এসেছেন এবং ভাবেন আপনার মোড় ঘুরানো দরকার তবে সম্পূর্ণ নিশ্চিত নন। সুতরাং আপনি পালা নিন, তবে আপনার যাত্রীকে মানচিত্রটি পরীক্ষা করতে বলুন। আপনি যেখানে রয়েছেন সে সম্পর্কে বিতর্ক শেষ করার পরে আপনি রাস্তা থেকে তিন মাইল দূরে থাকতে পারেন। আপনি যদি ঠিকই থাকেন, আপনি যদি বাঁক দেওয়ার আগে থামিয়ে তর্ক করেছিলেন তবে আপনি তার থেকে তিন মাইল দূরে ছিলেন। আপনি যদি ভুল হয়ে থাকেন তবে আপনাকে ঘুরে দাঁড়াতে হবে।

সিপিইউ পাইপলাইনগুলি একইভাবে কাজ করে। তারা যখন শর্তটি পরীক্ষা করতে পারে ততক্ষণে তারা রাস্তায় নেমে ইতিমধ্যে একটি উপায়। পার্থক্যটি হল, তাদের তিন মাইল পিছনে গাড়ি চালাতে হবে না, তারা কেবল মাথাটি শুরু করে lose তার মানে চেষ্টা করার কোনও ক্ষতি নেই।


2
এই ব্যাখ্যা ঝরঝরে।
শার্পথুথ

2

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

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

তবে মূল কীটি হ'ল সিপিইউ পূর্বাভাসিত শাখার একটির জন্য কাজ শুরু করছে কারণ এটি এখনও শর্তটি নিজেই মূল্যায়ন করতে পারে না


1

সংক্ষিপ্ত রূপ:

কিছু সিপিইউ পুরানোটি শেষ করার আগে কোনও নতুন নির্দেশিকায় কাজ শুরু করতে পারে। এগুলি সেই সিপিইউ যা শাখার পূর্বাভাস ব্যবহার করে।

একটি সিউডোকোড উদাহরণ:

int globalVariable;
int Read(int* readThis, int* readThat)
{
    if ((globalVariable*globalVariable % 17) < 5)
       return *readThis;
    else
       return *readThat;
}

উপরের কোডটি একটি শর্ত পরীক্ষা করে এবং ফলাফলের উপর ভিত্তি করে মেমরির অবস্থানটিতে addThisসঞ্চিত মান বা এতে সঞ্চিত মানটি ফেরত পাঠানো দরকার readThat। যদি শাখার পূর্বাভাস শর্তটি হওয়ার পূর্বাভাস দেয় তবে স্টেটমেন্টটি মূল্যায়নের জন্য প্রয়োজনীয় গণনা করার সময় trueসিপিইউ ইতিমধ্যে মেমরির অবস্থানের সঞ্চিত মানটি পড়বে । এটি একটি সরল উদাহরণ।addThisif


1

হ্যাঁ, অবস্থাটি যে কোনও উপায়ে পরীক্ষা করা হয়েছে। তবে শাখার পূর্বাভাসের সুবিধা হ'ল আপনি শর্ত পরীক্ষার ফলাফলের জন্য অপেক্ষা না করে কাজ করতে পারবেন।

বলুন আপনাকে একটি রচনা লিখতে হবে এবং এটি বিষয় A বা বিষয় বি সম্পর্কে হতে পারে আপনি পূর্ববর্তী প্রবন্ধগুলি থেকে জানেন যে আপনার শিক্ষক বি এর চেয়ে সেরা এ বিষয় পছন্দ করেন এবং এটি প্রায়শই পছন্দ করেন। তার সিদ্ধান্তের জন্য অপেক্ষা না করে আপনি প্রথম বিষয়টি নিয়ে রচনা লিখতে শুরু করতে পারেন। এখন দুটি সম্ভাব্য ফলাফল রয়েছে:

  1. আপনি আপনার ভুল প্রবন্ধটি প্রবন্ধটি শুরু করেছিলেন এবং এখন পর্যন্ত যা লিখেছেন তা ফেলে দিতে হবে। আপনাকে অন্য বিষয় সম্পর্কে লেখা শুরু করতে হবে এবং এটি একই সময় প্রচেষ্টা যেমন আপনি অপেক্ষা করেছিলেন।
  2. আপনি সঠিক অনুমান করেছেন এবং আপনি ইতিমধ্যে কাজ সম্পন্ন করেছেন।

আধুনিক সিপিইউগুলি বেশিরভাগ সময় অলস অবস্থায় থাকে কারণ তারা আইও প্রতিক্রিয়া বা অন্যান্য গণনার ফলাফলের জন্য অপেক্ষা করে। এই সময়টি ভবিষ্যতের কিছু কাজ করতে ব্যবহৃত হতে পারে।

এমনকি এই অলস সময়ে আপনি কী করছেন তা যদি আপনাকে বরখাস্ত করতে হয় - তবে প্রোগ্রামটি কোন পথটি বেছে নেবে তা অনুমান করার ক্ষমতা আপনার যদি থাকে তবে এটি আরও কার্যকর হতে পারে। এবং আধুনিক সিপিইউগুলির এই ক্ষমতা রয়েছে।

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