با مفهوم Pipeline بهتر آشنا شوید
عامل محدود کننده سرعت
در الکترونیک شاید بارها شنیده باشید که حداکثر سرعت این سیستم فلان مقدار است، دقیقا چه عواملی باعث میشوند که حداکثر سرعت یک سیستم محدود شود؟ اگر بخواهیم یک تعریف ساده و مفهومی از سرعت داشته باشیم، میگوییم که سرعت در رابطه است با مقدار زمانی که طول میکشد تا دیتا یا اطلاعات (فرض کنید یک بیت دیتا با مقدار 0 یا 1) از یک نقطه به نقطه دیگر برسد. اما همیشه محدودیتهایی وجود دارند که ما نتوانیم دیتا را سریع منتقل کنیم. اگر شما به عنوان یک فرد آشنا به الکترونیک یا حتی یک فرد معمولی که حداقل یک بار برایش سوال شده که وقتی میگوییم CPU کامپیوترمان 2.4GHZ است، دقیقا به چه معناست؟ به احتمال زیاد مفهوم فرکانس را میدانید.
ما در این مقاله قصد نداریم در مورد تکنولوژی ساخت صحبت کنیم، بلکه صحبت ما در مورد حداکثر فرکانس اعمالی به سیستم خواهد بود و فرض میکنیم که تکنولوژی ساخت و بسیاری از عوامل دیگر به ما این اجازه را دادند که بتوانیم مثلا حداکثر فرکانس 400MHZ را به سیستم اعمال کنیم. اما ما در عمل نمیتوانیم این فرکانس را به سیستم اعمال کنیم! مشکل از کجاست؟ عجله نکنید باید تا پایان این مقاله حوصله به خرج دهید تا متوجه شوید که مشکل از کجاست. در واقع ما با گفتن همه این حرفها قصد داریم مفهوم ( پایپ لاین ) Pipeline را به شما آموزش دهیم، اما قبل از آن باید چندین مفهوم دیگر را نیز بدانید که در زیر به معرفی آن ها خواهیم پرداخت.
Throughput و Latency
به مدت زمانی که طول میکشد تا دیتا از ورودی به خروجی برسد Latency و به تعداد خروجی در واحد زمان Throughput میگویند. فرض کنید یک لوله آب وجود دارد که یک ثانیه طول میکشد تا یک مولکول آب از ابتدا به انتهای آن برسد که همان مفهوم Latency را تداعی میکند و در خروجی در هر یک ثانیه ده مولکول آب خارج میشود و این موضوع نیز مفهوم Throughput را میرساند. حتما توجه دارید که هیچ لزومی ندارد که وقتی میخواهیم در خروجی مولکولهای آب را ببینیم به اندازه زمان Latency صبر کنیم، بلکه فقط برای اولین بار باید به اندازه زمان Latency صبر کرد تا در خروجی مولکول آبی ظاهر گردد ولی پس از آن میتوان با زمان بسیار کمتری مولکولهای آب را در خروجی دید. ما قبل از اینکه هر مولکول آب بخواهد به خروجی برسد، مولکول دیگری را وارد لوله خواهیم کرد. راه حل دیگر این بود که ما صبر کنیم تا زمانی که هر مولکول آب به خروجی رسید مولکول دیگری را وارد لوله کنیم. مقایسه این دو روش ما را به مفهوم Pipeline نزدیکتر میکند.
در سیستمهای دیجیتال ما با استفاده از کلاک (معمولا لبه بالا رونده کلاک) میتوانیم دیتا را از یک حافظه به حافظه دیگر منتقل کنیم و تا زمانی که دیتا به حافظه دوم نرسید ما نمیتوانیم یک لبه کلاک دیگر به سیستم اعمال کنیم. چون در این صورت دیتاها از دست میروند و در نهایت ما یک دیتای غیر صحیح را قرائت خواهیم کرد. اما در یک سیستم الکترونیکی و مشخصا الکترونیک دیجیتال ما تعداد بسیار زیادی حافظه یا رجیستر خواهیم داشت که هر کدام دو به دو با هم یک مسیر تشکیل میدهند و به تاخیری که در طول همین مسیرها اتفاق میافتد Latency میگوییم. در نهایت ما میتوانیم با توجه به طولانیترین مسیر، که مسیر بحرانی نام دارد حداکثر فرکانس را به مدار اعمال کنیم. فرض کنید ما با توجه به مسیر بحرانی حداکثر فرکانس را اعمال کردیم و خواسته مسئله برآورده نشد چاره چیست؟ چاره این است که در مسیر بحرانی و در بین دو حافظه یک حافظه دیگر قرار بدهیم، حتما حدس میزنید که اگر این حافظه دقیقا در وسط مسیر بحرانی قرار گرفته باشد، مسیر بحرانی جدید نصف شده است و این بدان معناست که ما میتوانیم فرکانس اعمالی را دو برابر کنیم و در واحد زمان میتوانیم تعداد خروجی بیشتری دریافت کنیم که منجر به بهبود Throughput خواهد شد و این یعنی افزایش سرعت.
Throughput و Latency چه تغییری می کنند؟
توجه کنید که با پایپ لاین کردن Throughput بیشتر خواهد شد (بهبود مییابد) اما Latency یا تغییر نمیکند یا بیشتر خواهد شد! حتما دارید به این فکر میکنید که چگونه ممکن است Latency بیشتر شود؟ عجله نکنید با مثالی که در ادامه برای شما خواهیم آورد کاملا متوجه این موضوع خواهید شد. پس اگر کمی گیج شدهاید برگردید و دوباره تعاریف را بخوانید چون شاید فکر کنید قصد ما این است که Latency را کاهش بدهیم اما این گونه نیست و قصد ما کاهش مسیر بحرانی میباشد. Latency تنها در صورتی تغییر نمیکند که حافظه را دقیقا در وسط مسیر بحرانی قرار دهیم که همچین چیزی در عمل غیر ممکن خواهد بود، مثلا وقتی شما دارید با FPGA سیستمی را طراحی میکنید نهایتا در گزارشها به شما حداکثر فرکانس اعمالی گزارش خواهد شد، حال اگر این فرکانس خواسته شما را برآورده نکند شما باید به دنبال پایپ لاین کردن باشید و وقتی که پایپ لاین میکنید تقریبا هیچ احتمالی وجود ندارد که الگوریتم ها بتوانند حافظه میانی را دقیقا در وسط مسیر بحرانی قرار بدهند. در ادامه قصد داریم که پایپ لاین کردن را با استفاده از مراحل تولید یک دوچرخه بیان کنیم تا هر سوالی در مورد این موضوع در ذهنتان برطرف شود. فرض کنید در کارخانه ی دوچرخه سازی در پنج مرحله یک دوچرخه کامل خواهد شد و هر کدام از این مراحل یک ساعت طول میکشد.
همانطور که از تصاویر بالا مشخص است برای ساخت کامل یک دوچرخه حداقل 5 ساعت زمان لازم داریم پس Throughput و Latency به قرار زیر خواهند بود:
Throughput = 1/5 Latency = 5
یک ایده جالب، ما به جای اینکه در هر مرحله پس از اتمام کار بیکار باشیم، نتیجه کار مرحله خودمان را به مرحله بعد میدهیم و نتیجه کار مرحله قبل را تحویل میگیریم. به تصویر زیر دقت کنید:
نتیجه فوق العاده بهتر شده است، Throughput پنج برابر حالت قبل است اما در خوش بینانهترین حالت Latency تغییری نکرده است. وقتی پایپ لاین میکنیم دقیقا همین اتفاق میافتد و سرعت بالاتر خواهد رفت. اما هنوز یک سوال پاسخ داده نشد، چگونه ممکن است Latency بیشتر شود؟ فرض کنید یکی از مراحل بالا به جای 1 ساعت 2 ساعت به طول بینجامد، به تصویر زیر نیز دقت کنید:
Latency = 10، اشتباه است؟ نه، پاسخ دقیقا درست است. اما ما در بالا مشاهده میکنیم که از ورودی تا خروجی 6 ساعت طول کشیده است؟! همانطور که میدانید عاملی که دیتا را از ورودی حافظه به خروجی حافظه منتقل میکند کلاک است، و همانطور که میدانیم کلاک نمیتواند به نحوی عمل کند که همه مراحل 1 ساعت طول بکشند و فقط یک مرحله خاص 2 ساعت طول بکشد، کلاک عاملی منظم خواهد بود و بر اساس طولانیترین مسیر یا همان مسیر بحرانی تنظیم میشود، در نتیجه میتوان گفت که زمان همهی مسیرها گرچه زمان خودشان کمتر باشد، باید برابر با زمان مسیر بحرانی در نظر گرفته شود. در مثال بالا فقط مرحله سوم 2 ساعت طول کشیده است اما بقیه مراحل نیز مجبور خواهند بود به دلیلی که ذکر کردیم 2 ساعت زمان صرف کنند و عملا 1 ساعت آن را بیکار خواهند بود.