আমি সবসময় ভাবতাম কেন প্রসেসরগুলি 32 টি রেজিস্টারে থামে। এটি এখন পর্যন্ত মেশিনের দ্রুততম টুকরো, কেন কেবল আরও রেজিস্টার দিয়ে বড় প্রসেসর তৈরি করা হয় না? তার মানে কি র্যামে কম যাওয়া হবে না?
আমি সবসময় ভাবতাম কেন প্রসেসরগুলি 32 টি রেজিস্টারে থামে। এটি এখন পর্যন্ত মেশিনের দ্রুততম টুকরো, কেন কেবল আরও রেজিস্টার দিয়ে বড় প্রসেসর তৈরি করা হয় না? তার মানে কি র্যামে কম যাওয়া হবে না?
উত্তর:
প্রথমত, সমস্ত প্রসেসরের আর্কিটেকচার 32 টি রেজিস্টারে থামেনি। প্রায় সমস্ত আরআইএসসি আর্কিটেকচারে যে নির্দেশিকাতে 32 টি রেজিস্ট্রি প্রকাশিত আছে সেখানে 32 টি সংখ্যার নিবন্ধ এবং 32 টি আরও ভাসমান পয়েন্ট রেজিস্টার রয়েছে (সুতরাং 64)। (ফ্লোটিং পয়েন্ট "অ্যাড" পূর্ণসংখ্যার "অ্যাড" এর চেয়ে আলাদা আলাদা রেজিস্টার ব্যবহার করে)) স্পার্ক আর্কিটেকচারটিতে উইন্ডোজ নিবন্ধিত আছে। স্পার্কে আপনি একবারে কেবলমাত্র 32 টি পূর্ণসংখ্যার রেজিস্টারগুলিতে অ্যাক্সেস করতে পারবেন তবে নিবন্ধগুলি স্ট্যাকের মতো কাজ করে এবং আপনি একবারে 16 টি রেজিস্ট্রার পুশ এবং পপ করতে পারেন। এইচপি / ইন্টেলের আইটানিয়াম আর্কিটেকচারটিতে নির্দেশের সেটে 128 পূর্ণসংখ্যা এবং 128 ভাসমান পয়েন্ট রেজিস্টার ছিল। এনভিডিয়া, এএমডি, ইন্টেল, এআরএম এবং কল্পনা প্রযুক্তিগুলি থেকে আধুনিক জিপিইউগুলি, তাদের সমস্ত রেজিস্টার ফাইলগুলিতে প্রচুর পরিমাণে নিবন্ধন প্রকাশ করে। (আমি এটি এনভিডিয়া এবং ইন্টেল আর্কিটেকচারের সত্য হতে জানি, আমি এএমডি, এআরএম এবং কল্পনা নির্দেশের সেটগুলির সাথে খুব বেশি পরিচিত নই, তবে আমি মনে করি সেখানে রেজিস্টার ফাইলগুলিও বড়))
দ্বিতীয়ত, সর্বাধিক আধুনিক মাইক্রোপ্রসেসরগুলি রিসোর্সগুলির পুনরায় ব্যবহারের প্রয়োজনের কারণে সৃষ্ট অপ্রয়োজনীয় সিরিয়ালাইজেশন দূর করতে রেজিস্ট্রার নাম পরিবর্তন করে, তাই অন্তর্নিহিত শারীরিক নিবন্ধ ফাইলগুলি বড় হতে পারে (কিছু মেশিনে 96, 128 বা 192 রেজিস্টার)) এটি (এবং গতিশীল সময়সূচী) কিছুটিকে মুছে ফেলে সংকলকটির জন্য এতগুলি অনন্য নিবন্ধের নাম উত্পন্ন করার দরকার রয়েছে, তবুও সময়সূচীর জন্য আরও বড় রেজিস্টার ফাইল সরবরাহ করা হয়।
নির্দেশের সেটে প্রকাশিত নিবন্ধকের সংখ্যা আরও বাড়ানো কেন কঠিন হতে পারে তার দুটি কারণ রয়েছে। প্রথমত, আপনাকে প্রতিটি নির্দেশিকায় নিবন্ধক সনাক্তকারী নির্দিষ্ট করতে সক্ষম হতে হবে। 32 রেজিস্টারে একটি 5 বিট রেজিস্ট্রার স্পেসিফায়ার প্রয়োজন, সুতরাং 3-ঠিকানা নির্দেশাবলী (আরআইএসসি আর্কিটেকচারগুলিতে প্রচলিত) 32 টি নির্দেশের বিটগুলির মধ্যে 15 টি কেবলমাত্র নিবন্ধগুলি নির্দিষ্ট করার জন্য ব্যয় করে। আপনি যদি এটি 6 বা 7 বিটগুলিতে বৃদ্ধি করেন তবে আপনার কাছে অপকড এবং ধ্রুবক নির্দিষ্ট করার জন্য কম স্থান থাকবে। জিপিইউ এবং ইটানিয়ামের অনেক বড় নির্দেশ রয়েছে। বড় নির্দেশাবলী ব্যয় করে আসে: আপনার আরও নির্দেশের মেমরি ব্যবহার করা দরকার, সুতরাং আপনার নির্দেশের ক্যাশে আচরণটি কম আদর্শ।
নিবন্ধের সংখ্যা সীমাবদ্ধ করার জন্য আরও দুটি কারণ:
প্রচুর কোডে প্রচুর মেমরি অ্যাক্সেস থাকে (30% একটি সাধারণ চিত্র)। এর মধ্যে সাধারণত 2/3 য় অংশ অ্যাক্সেসগুলি পড়ে এবং 1/3 য় অংশ অ্যাক্সেসগুলি লিখতে হয়। অ্যারে অ্যাক্সেস করা, অবজেক্টের সদস্য ভেরিয়েবলগুলি অ্যাক্সেস করা ইত্যাদির চেয়ে নিবন্ধভুক্ত হওয়ার কারণে এটি নয় is
কীভাবে সি / সি ++ তৈরি করা হয় তার কারণে মেমোরিতে (বা ডেটা ক্যাশে) এটি সম্পন্ন করা উচিত (আপনি যে কোনও পয়েন্টার পেতে পারেন তার সমস্ত ঠিকানার সম্ভাব্য স্মৃতিতে সংরক্ষণ করতে হবে)। যদি সংকলক অনুমান করতে পারে যে আপনি ভেরিয়েবল উইলি-নিলিতে পাগল পরোক্ষ পয়েন্টার ট্রিকস ব্যবহার করে লিখবেন না এটি তাদের রেজিস্টারে রাখবে এবং এটি ফাংশন ভেরিয়েবলের জন্য দুর্দান্ত কাজ করে তবে বিশ্বব্যাপী অ্যাক্সেসযোগ্যগুলির জন্য নয় (সাধারণত, মলোক থেকে বেরিয়ে আসা সমস্ত কিছু) ()) কারণ বিশ্বব্যাপী রাষ্ট্র কীভাবে পরিবর্তিত হবে তা অনুমান করা মূলত অসম্ভব।
এর কারণে, এটি সাধারণ নয় যে সংকলকটি প্রায় 16 টিরও বেশি ব্যবহারের সাথে নিবন্ধের সাথে কিছু করতে সক্ষম হবে। যে কারণে সমস্ত জনপ্রিয় স্থপতিদের কাছে এটির অনেকগুলি রয়েছে (এআরএমের 16 টি)।
এমআইপিএস এবং অন্যান্য আরআইএসসিগুলির ঝুলি 32 রয়েছে কারণ অনেকগুলি রেজিস্টার করা খুব কঠিন নয় - ব্যয়টি যথেষ্ট কম তাই এটি কিছুটা "কেন নয়?" " ৩২ টিরও বেশি বেশিরভাগই অকেজো এবং এতে রেজিস্টার ফাইলটি অ্যাক্সেসের জন্য দীর্ঘতর করার ক্ষয়ক্ষতি রয়েছে (রেজিস্টারে সংখ্যায় প্রতিটি দ্বিগুণ হওয়ার ফলে মাল্টিপ্লেক্সারের একটি অতিরিক্ত স্তর যুক্ত হয় যা আরও কিছুটা বিলম্ব যোগ করে ...)। এটিও গড়পড়তাভাবে নির্দেশিকাগুলি কিছুটা দীর্ঘায়িত করে - এর অর্থ হ'ল নির্দেশ মেমরি ব্যান্ডউইথের উপর নির্ভরশীল যে ধরণের প্রোগ্রামগুলি চালানো হয়, তখন আপনার অতিরিক্ত রেজিস্টারগুলি আপনাকে আসলে ধীর করে দেয়!
যদি আপনার সিপিইউ ক্রমযুক্ত থাকে এবং নাম পরিবর্তন করে নিবন্ধ না করে এবং আপনি চক্র প্রতি প্রচুর অপারেশন করার চেষ্টা করছেন (3 এর বেশি), তবে তত্ত্ব অনুসারে আপনার চক্র প্রতি অপশনের সংখ্যা বাড়ার সাথে আপনার আরও নিবন্ধগুলি প্রয়োজন। এই কারণেই ইটানিয়ামে এতগুলি নিবন্ধ রয়েছে! তবে অনুশীলনে, সংখ্যাগত-ভাসমান-বিন্দু বা সিমডি ওরিয়েন্টেড কোড (যা ইটানিয়ামটি সত্যই ভাল ছিল) বাদে বেশিরভাগ কোডে প্রচুর মেমরি পড়তে / লিখতে এবং ঝাঁপ দিতে হবে যা চক্র প্রতি 3-এর চেয়ে বেশি অপের স্বপ্নকে অসম্ভব করে তোলে impossible (বিশেষত ডাটাবেস, সংকলক, জাভাস্ক্রিপ্ট, এমুলেশন ইত্যাদির মতো উচ্চ-স্তরের ভাষা কার্যকরকরণের মতো সার্ভার-ভিত্তিক সফ্টওয়্যারগুলিতে)। এটিই ডুবে গেল ইটানিয়াম।
এটি সমস্তই গণনা এবং মৃত্যুদন্ডের পার্থক্যে নেমে আসে!
কে আপনাকে বলে যে প্রসেসরের সর্বদা 32 টি রেজিস্টার থাকে? x86 এর 8, এআরএম 32-বিট এবং x86_64 এর 16, আইএ -৪৪ এর 128, এবং আরও অনেক সংখ্যা রয়েছে। আপনি এখানে একবার দেখতে পারেন । এমনকি এমআইপিএস, পিপিসি বা যে কোনও আর্কিটেকচারের 32 টি সাধারণ উদ্দেশ্যে রেজিস্ট্রেশন সেটে রেজিস্ট্রি রয়েছে, সংখ্যাটি 32 এর চেয়ে অনেক বেশি যেহেতু এখনও সর্বদা পতাকা রেজিস্টারগুলি (যদি থাকে), নিয়ন্ত্রণ রেজিস্ট্রারগুলি ... নামকরণকৃত রেজিস্টার এবং হার্ডওয়্যার রেজিস্টার সহ নয়
সবকিছুর দাম আছে। নিবন্ধের সংখ্যা যত বেশি হবে, টাস্ক স্যুইচিংয়ের সময় আপনার যত বেশি কাজ হবে, নির্দেশের এনকোডিংয়ে আপনার আরও বেশি স্থানের প্রয়োজন হবে। আপনার যদি কম রেজিস্টার থাকে তবে কিছু সংখ্যক-বিস্তৃত কোডে রেজিস্টরের অভাবের কারণে বাণিজ্যগুলি কল করে এবং ফাংশনগুলি থেকে ফিরে আসা বা কার্যগুলি স্যুইচ করার সময় আপনার খুব বেশি সঞ্চয় এবং পুনরুদ্ধার করতে হবে না
তদতিরিক্ত, নিবন্ধের ফাইলটি যত বড় হবে, এটি তত বেশি ব্যয়বহুল এবং জটিল হবে। এসআরএএম হ'ল দ্রুত এবং ব্যয়বহুল র্যাম তাই এটি কেবল সিপিইউ ক্যাশে ব্যবহৃত হয়। তবে এটি এখনও অনেক সস্তা এবং একই ক্ষমতা সহ রেজিস্টার ফাইলের চেয়ে কম অঞ্চল নেয়।
উদাহরণস্বরূপ, একটি সাধারণ ইনটেল প্রসেসরের "সরকারীভাবে" 16 পূর্ণসংখ্যা এবং 16 ভেক্টর নিবন্ধ রয়েছে। তবে বাস্তবে, আরও অনেক রয়েছে: প্রসেসরটি "রেজিস্টার নাম পরিবর্তনকরণ" ব্যবহার করে। আপনার যদি কোনও নির্দেশ রেজি 3 = রেজি 1 + রেজি 2 থাকে তবে রেজি 3 ব্যবহার করে অন্য কোনও নির্দেশনা এখনও শেষ না হলে আপনার যদি সমস্যা হয় - আপনি পূর্ববর্তী নির্দেশটি পড়ার আগেই রেজি 3 ওভাররাইট করার ক্ষেত্রে নতুন নির্দেশটি কার্যকর করতে পারবেন না।
সুতরাং প্রায় 160 বা তাই বাস্তব নিবন্ধ আছে। সুতরাং উপরের সরল নির্দেশাবলীতে "regX = reg1 + reg2" পরিবর্তন করা হয়েছে এবং মনে রাখবেন যে RegX- এ Reg3 রয়েছে। নাম পরিবর্তনকারী রেজিস্টার না করে, আদেশের বাইরে চলে যাওয়া পানিতে ডুবে মারা যাবে।
আমি বৈদ্যুতিক প্রকৌশলী নই, তবে আমি মনে করি রেজিস্টারের সংখ্যা সীমাবদ্ধ করার কারণের জন্য আরও একটি সম্ভাবনা ঘুরছে। এখানে গাণিতিক ইউনিটগুলির একটি সীমাবদ্ধ সংখ্যা রয়েছে এবং তাদের অবশ্যই প্রতিটি নিবন্ধ থেকে ইনপুট নিতে এবং প্রতিটি রেজিস্টারে আউটপুট নিতে সক্ষম হতে হবে। এটি বিশেষত সত্য যখন আপনার পাইপলাইনযুক্ত প্রোগ্রাম থাকে যা চক্র প্রতি অনেক নির্দেশাবলী কার্যকর করতে পারে।
মিল সিপিইউতে ইভান গার্ডার্ডের কিছু আলোচনা দেখে আমি এই উত্তরের ধারণা পেয়েছি। মিল সিপিইউর উদ্ভাবনের অংশটি হ'ল আপনি স্বেচ্ছাসেবী রেজিস্টারগুলিতে আউটপুট দিতে পারবেন না - ফলাফলগুলি সমস্তই একটি রেজিস্টার স্ট্যাক বা "বেল্ট" এর উপরে চাপানো হয়, যা এইভাবে রাউটিংয়ের সমস্যা হ্রাস করে, কারণ আপনি সর্বদা জানেন যে আউটপুটটি কোথায় যাবে। মনে রাখবেন পাটিগণিত ইউনিটগুলিতে ইনপুট রেজিস্টার পাওয়ার জন্য তাদের এখনও রাউটিং সমস্যা রয়েছে।
দেখুন বেল্ট (9 এর 2) - মিল CPU- র আর্কিটেকচার সমস্যা বিবৃতি জন্য, এবং মিলের সমাধান।