নিবন্ধগুলি যদি খুব নির্লজ্জভাবে দ্রুত হয়, তবে আমরা কেন তাদের বেশি নেই?


89

32 বিটে, আমাদের 8 "সাধারণ উদ্দেশ্য" রেজিস্টার ছিল। Bit৪ বিটের সাথে পরিমাণ দ্বিগুণ হয় তবে এটি bit৪ বিট পরিবর্তনের থেকে আলাদা বলে মনে হয়।
এখন, যদি নিবন্ধগুলি এত দ্রুত হয় (মেমোরি অ্যাক্সেস নেই) তবে স্বাভাবিকভাবে কেন তাদের বেশি নেই? সিপিইউ নির্মাতারা কি সিপিইউতে যথাসম্ভব নিবন্ধকদের কাজ করা উচিত নয়? আমাদের কেবলমাত্র পরিমাণ পরিমাণ কেন থাকবে তার জন্য যৌক্তিক বাধা কী?


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

উত্তর:


120

আপনার কেবলমাত্র বিপুল সংখ্যক নিবন্ধক না থাকার অনেকগুলি কারণ রয়েছে:

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

এই দিনগুলিতে আমাদের কাছে প্রচুর নিবন্ধ রয়েছে - সেগুলি কেবল স্পষ্টভাবে প্রোগ্রাম করা হয়নি। আমাদের "রেজিস্ট্রার নামকরণ" আছে। আপনি কেবলমাত্র একটি ছোট সেট (8-32 নিবন্ধক) অ্যাক্সেস করার সময় সেগুলি আসলে অনেক বড় সেট (যেমন 64৪-২৫6) সমর্থন করে। এরপরে সিপিইউ প্রতিটি নিবন্ধকের দৃশ্যমানতা ট্র্যাক করে এবং পুনরায় নামকরণ সেটে তাদের বরাদ্দ করে। উদাহরণস্বরূপ, আপনি লোড করতে পারবেন, সংশোধন করতে পারেন, তারপরে একাধিকবার নিবন্ধে সংরক্ষণ করতে পারেন এবং এই ক্রিয়াকলাপগুলির প্রতিটি প্রকৃতপক্ষে স্বাধীনভাবে ক্যাশে মিস করা ইত্যাদির উপর নির্ভর করে সম্পাদনা করতে পারেন:

ldr r0, [r4]
add r0, r0, #1
str r0, [r4]
ldr r0, [r5]
add r0, r0, #1
str r0, [r5]

কর্টেক্স এ 9 কোর নাম পরিবর্তন করে রেজিস্ট্রেশন করে, তাই "r0" এ প্রথম লোড আসলে একটি নাম পরিবর্তিত ভার্চুয়াল রেজিস্টারে যায় - আসুন একে "ভি0" বলি। "ভি0" এ লোড, ইনক্রিমেন্ট এবং স্টোরটি ঘটে। এদিকে, আমরা আবারও লোড / মডিফাই / স্টোরটি আর -0 করতে পারব, তবে এটির নাম "ভি 1" হয়ে যাবে কারণ এটি r0 ব্যবহার করে সম্পূর্ণ স্বাধীন ক্রম ence ধরা যাক "r4" এর পয়েন্টার থেকে লোডটি ক্যাশে মিসের কারণে স্থির হয়ে গেল। এটি ঠিক আছে - আমাদের প্রস্তুত হওয়ার জন্য "r0" অপেক্ষা করার দরকার নেই। কারণ এটির নামকরণ হয়েছে, আমরা পরবর্তী সিকোয়েন্সটি "v1" (r0 তে ম্যাপযুক্ত) দিয়ে চালাতে পারি - এবং সম্ভবত এটি একটি ক্যাশে হিট এবং আমাদের কেবল দুর্দান্ত পারফরম্যান্সের জয় ছিল।

ldr v0, [v2]
add v0, v0, #1
str v0, [v2]
ldr v1, [v3]
add v1, v1, #1
str v1, [v3]

আমি মনে করি x86 আজকাল পুনরায় নামকরণকারী রেজিস্টারগুলির একটি বিশাল সংখ্যক পর্যন্ত (বলপার্ক 256)। এর অর্থ হ'ল উত্স এবং গন্তব্য কী তা প্রতিটি নির্দেশের জন্য 8 বিট বার 2 হবে। এটি কোর জুড়ে প্রয়োজনীয় তারের সংখ্যা এবং তার আকারকে ব্যাপকভাবে বাড়িয়ে তুলবে। সুতরাং প্রায় ১-3-৩২ টি রেজিস্ট্রারের আশেপাশে একটি মিষ্টি স্পট রয়েছে যার জন্য বেশিরভাগ ডিজাইনাররা সেটেল করেছেন এবং আউট-অফ-অর্ডার সিপিইউ ডিজাইনের জন্য, রেজিস্টার নামকরণ এটি প্রশমিত করার উপায়।

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

তাই রেজিস্টার ব্যাংক আকারের জন্য একটি প্রাকৃতিক মিষ্টি স্পট রয়েছে যা সিপিইউয়ের বেশিরভাগ শ্রেণির জন্য প্রায় 32 আর্কিটেটেড রেজিস্টারগুলিতে সর্বাধিক আউট হয়। x86-32 এর 8 টি নিবন্ধ রয়েছে এবং এটি অবশ্যই খুব ছোট। এআরএম 16 ​​টি রেজিস্টার নিয়ে গেছে এবং এটি একটি ভাল আপস ise 32 রেজিস্টারগুলি কিছুটা হলেও সামান্য বেশি - আপনার শেষ 10 বা তার বেশি প্রয়োজন নেই।

এসএসই এবং অন্যান্য ভেক্টর ভাসমান পয়েন্ট কপ্রোসেসরগুলির জন্য আপনি যে অতিরিক্ত রেজিস্টার পান সেগুলির কোনওটিই স্পর্শ করে না। এগুলি অতিরিক্ত সেট হিসাবে বিবেচনা করে কারণ তারা পূর্ণসংখ্যা কোর থেকে স্বতন্ত্রভাবে চালায় এবং সিপিইউর জটিলতা তাত্পর্যপূর্ণভাবে বাড়ায় না।


12
দুর্দান্ত উত্তর - আমি মিশ্রণের মধ্যে আরও একটি কারণ ছুঁড়ে ফেলতে চাই - কারও কাছে যত বেশি রেজিস্ট্রেশন করা হয়, প্রসঙ্গের স্যুইচিংয়ের সময় তাদেরকে স্ট্যাকের উপরে ফেলে / টানতে আরও সময় লাগে। অবশ্যই প্রধান সমস্যা নয়, তবে একটি বিবেচনা।
হবে যারা একটি

7
@ উইলএ ভালো পয়েন্ট তবে প্রচুর রেজিস্টার সহ আর্কিটেকচারে এই ব্যয় হ্রাস করার উপায় রয়েছে। এবিআইতে সাধারণত বেশিরভাগ রেজিস্টারের ক্যালি-সেভ থাকে, সুতরাং আপনাকে কেবল একটি মূল সেটটি সংরক্ষণ করতে হবে। প্রসঙ্গের স্যুইচিং সাধারণত পর্যাপ্ত ব্যয়বহুল যে অন্য সমস্ত লাল টেপের তুলনায় অতিরিক্ত সংরক্ষণ / পুনরুদ্ধার করতে খুব বেশি খরচ হয় না। স্পার্ক প্রকৃতপক্ষে এটিকে চারপাশে কাজ করে রেজিস্টার ব্যাঙ্ককে একটি স্মৃতি অঞ্চলে একটি "উইন্ডো" তৈরি করে, তাই এটি এটি কিছুটা দিয়ে স্কেল করে (হাতের মতো এমনভাবে ved
জন রিপলি

4
আমার মনকে এমন একটি উত্তম উত্তরের দ্বারা ফুটিয়ে তোলা বিবেচনা করুন যা আমি নিশ্চিতভাবে আশা করি না didn't এছাড়াও, কেন আমাদের এমন অনেক নামকরা রেজিস্ট্রার সত্যই প্রয়োজন হয় না সে বিষয়ে সেই ব্যাখ্যাটির জন্য ধন্যবাদ, এটি অত্যন্ত আকর্ষণীয়! আমি আপনার উত্তরটি পড়ে সত্যিই উপভোগ করেছি, কারণ "হুডের নীচে" যা হয় তাতে আমি সম্পূর্ণ আগ্রহী। :) উত্তর গ্রহণের আগে আমি আরও কিছুটা অপেক্ষা করব, কারণ আপনি কখনই জানেন না, তবে আমার +1 নিশ্চিত।
Xoo

4
নিবন্ধগুলি সংরক্ষণের দায়িত্ব যেখানে সময় নেয় তা নির্বিশেষে প্রশাসনিক ওভারহেড। ঠিক আছে সুতরাং প্রসঙ্গের স্যুইচিং বেশিরভাগ ক্ষেত্রে ঘটতে পারে না, তবে বিঘ্ন ঘটে। হ্যান্ড-কোডেড রুটিনগুলি নিবন্ধগুলিতে অর্থোন্নয় হতে পারে তবে ড্রাইভারদের সি সম্ভাবনায় লিখিত থাকলে হ'ল বিঘ্নিত ঘোষিত ফাংশনটি প্রতিটি একক নিবন্ধককে সংরক্ষণ করবে, আইএসআরকে কল করবে এবং তারপরে সমস্ত সংরক্ষিত রেজিস্টার পুনরুদ্ধার করবে। আইআইএ -32 এর আরআইএসসি আর্কিটেকচারের 32+ কিছু রেগের তুলনায় এর 15-20 রেগগুলির সাথে একটি বাধা সুবিধা ছিল।
অলফ ফোর্শেল

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

12

আমরা কি তাদের আরো

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

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

উদাহরণ:

load  r1, a  # x = a
store r1, x
load  r1, b  # y = b
store r1, y

কেবলমাত্র r0-r7 রয়েছে এমন একটি আর্কিটেকচারে, নিম্নলিখিত কোডটি সিপিইউ দ্বারা স্বয়ংক্রিয়ভাবে আবার কিছু লেখা যেতে পারে:

load  r1, a
store r1, x
load  r10, b
store r10, y

এই ক্ষেত্রে r10 হ'ল একটি গোপন নিবন্ধ যা অস্থায়ীভাবে r1 এর জন্য প্রতিস্থাপিত হয়। সিপিইউ বলতে পারে যে প্রথম স্টোরের পরে আর 1 এর মান আর কখনও ব্যবহার করা হবে না। এটি দ্বিতীয় লোড বা দ্বিতীয় স্টোরের বিলম্বের প্রয়োজন ছাড়াই প্রথম লোডটি বিলম্ব হতে দেয় (এমনকি একটি অন-চিপ ক্যাশে হিট সাধারণত বেশ কয়েকটি চক্র নেয়)।


2

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


1

এখানে কিছু আকর্ষণীয় তথ্য যুক্ত করতে আপনি লক্ষ্য করতে পারেন যে 8 টি একই আকারের রেজিস্টারগুলি অপকডগুলিকে হেক্সাডেসিমাল নোটেশনের সাথে ধারাবাহিকতা বজায় রাখতে দেয়। উদাহরণস্বরূপ নির্দেশটি push axx86 এ 0x50 অপকড এবং শেষ রেজিস্টার ডিআই-তে 0x57 পর্যন্ত যায়। তারপরে নির্দেশটি pop ax0x58 থেকে শুরু হয় এবং pop diপ্রথম বেস -16 সম্পূর্ণ করতে 0x5F এ যায় । হেক্সাডেসিমাল ধারাবাহিকতা একটি আকার প্রতি 8 টি রেজিস্টার সহ বজায় রাখা হয়।


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