پرش به محتوا

معماری راه‌اندازی حمل‌ونقل

از ویکی‌پدیا، دانشنامهٔ آزاد

در معماری کامپیوتر، معماری راه‌اندازی حامل (TTA یا Transport triggered architecture) نوعی طراحی پردازنده است که در آن برنامه‌ها مستقیماً گذرگاه‌های انتقال داخلی یک پردازنده را کنترل می‌کنند. محاسبات به عنوان قسمت فرعی انتقال داده اتفاق می‌افتد: نوشتن داده‌ها در یک پورت راه‌اندازی یک واحد اجرایی، واحد اجرایی را برای شروع محاسبات تحریک می‌کند. این شبیه چیزی است که در یک آرایه سیستولیک اتفاق می‌افتد. با توجه به ساختار ماژولار، TTA یک الگوی پردازنده ایده‌آل برای پردازنده ASIP با مسیر داده دلخواه اما با انعطاف‌پذیری و بدون هزینه طراحیی که شتاب‌دهنده‌های سخت‌افزاری آن عملکرد ثابت دارند.

معمولاً یک پردازشگر TTA دارای چندین گذرگاه حامل و چندین واحد عملکردی متصل به گذرگاه‌ها است که فرصت‌هایی را برای موازی‌سازی سطح دستورالعمل فراهم می‌کند. موازی سازی به صورت ایستا توسط برنامه‌نویس تعریف می‌شود. از این نظر معماری TTA شبیه معماری کلمه دستورالعمل بسیار طولانی (VLIW) است. یک کلمهٔ دستورالعمل TTA از چندین اسلات (slot, شکاف) تشکیل شده است، یک اسلات در هر گذرگاه، و هر اسلات تعیین‌کننده انتقال داده‌ای است که در گذرگاه مربوطه انجام می‌شود. کنترل ریزدانه(The fine-grained control) امکان برخی بهینه‌سازی‌هایی را فراهم می‌کند که در یک پردازنده معمولی امکان‌پذیر نیست. به عنوان مثال، نرم‌افزار می‌تواند داده‌ها را مستقیماً بین واحدهای عملکردی بدون استفاده از ثبات انتقال دهد.

TTA، برخی از جزئیات ریزمعماری را که معمولاً از دید برنامه نویسان پنهان هستند، آشکار می‌کند. این امر منطق کنترل یک پردازنده را بسیار ساده می‌کند، زیرا بسیاری از تصمیماتی که معمولاً در زمان اجرا انجام می‌شوند در زمان کامپایل تصحیح می‌شوند. اما به این معنی نیز است که اگر یک تفاوت کوچک در معماری بین این دو وجود داشته باشد، یک باینری که برای یک پردازنده TTA کامپایل شده است، بدون کامپایل مجدد روی دیگری اجرا نخواهد شد. مشکل ناسازگاری باینری، علاوه بر پیچیدگی اجرای یک سوئیچ زمینه کامل، TTAها را برای سیستم‌های جاسازی شده مناسب تر از محاسبات با هدف عمومی می‌کند.

از میان تمام معماری‌های کامپیوتری مجموعه‌ای یک دستورالعمل(OISC)، معماری TTA یکی از معدود معماری‌هایی است که پردازنده‌ها مبتنی بر آن ساخته شده‌اند، و تنها موردی است که پردازنده‌ها مبتنی بر آن به صورت تجاری به فروش می‌رسد.

مزایا در مقایسه با معماری‌های VLIW

[ویرایش]

TTAها را می‌توان به عنوان یک معماری VLIW که «مسیر دادهٔ آن در معرض است» دید. در حالی که VLIW با استفاده از عملیات برنامه‌ریزی می‌شود، TTA اجرای عملیات را به چند عملیات حرکت(move) تقسیم می‌کند. مدل برنامه‌نویسی سطح پایین در مقایسه با VLIW استاندارد، مزایای متعددی را ممکن می‌سازد. برای مثال، یک معماری TTA می‌تواند موازی‌سازی بیشتری را با فایل‌های رجیستر ساده‌تر از VLIW ارائه دهد. از آنجایی که برنامه‌نویس زمان‌بندی عملوند و انتقال داده‌ها را کنترل می‌کند، پیچیدگی (تعداد پورت‌های ورودی و خروجی) فایل رجیستر (RF) لازم نیست مطابق با بدترین حالت مشکل/تکمیل سناریو ی دستورالعمل‌های موازی متعدد، مقیاس بندی شود.

یک بهینه‌سازی نرم‌افزار منحصر به فرد و مهم که توسط برنامه‌نویسی حمل و نقل فعال می‌شود، دور زدن نرم‌افزار (software bypassing) نامیده می‌شود. در صورت دور زدن نرم‌افزار، برنامه‌نویس با انتقال مستقیم داده‌ها به پورت‌های عملوند واحد اجرایی بعدی، نوشتن فایل ثبات را دور می‌زند. هنگامی که این بهینه‌سازی به‌طور تهاجمی اعمال شود، حرکت اصلی که نتیجه را به فایل رجیستر منتقل می‌کند، می‌تواند به‌طور کامل حذف شود، بنابراین فشار پورت فایل ثبات کاهش می‌یابد و یک ثبات عمومی برای سایر متغیرهای موقت آزاد می‌شود. کاهش فشار رجیستر، علاوه بر ساده‌سازی پیچیدگی مورد نیاز سخت‌افزار RF، می‌تواند منجر به صرفه‌جویی قابل‌توجه در انرژی CPU شود که یک مزیت مهم و ویژه در سیستم‌های تعبیه‌شده موبایل است.[۱][۲]

واحد اجرایی

[ویرایش]

هر بخش تابع یک یا چند عملیات را پیاده‌سازی می‌کند. عملکردهای طیف وسیعی دارند و از اضافه کردن ساده اعداد صحیح گرفته و تا محاسبات خاص برنامه پیچیده و دلخواه کاربردی اجرا می‌کند. عملگرها برای عملیات از طریق پورت های واحد اجرایی منتقل می‌شوند.

هر واحد تابع ممکن است یک خط لوله مستقل داشته باشد. در صورتی که یک واحد تابع به طور کامل به صورت خط لوله درآمده باشند، می‌توان عملیات جدیدی را که برای پایان دادن به چندین چرخه ساعت طول می‌کشد، در هر چرخه ساعت شروع کرد. از طرف دیگر، یک خط لوله می‌تواند به گونه ای باشد که همیشه درخواست‌های شروع عملیات جدید را در حالی که یک مورد قدیمی هنوز در حال اجرا است نپذیرد.

دسترسی به حافظه داده(data) و ارتباط با خارج پردازنده با استفاده از واحدهای اجرایی ویژه انجام می‌شود. واحدهای اجرایی که عملیات دسترسی به حافظه را اجرا می‌کنند و به یک ماژول حافظه متصل می‌شوند، اغلب واحدهای بارگذاری/ذخیره نامیده می‌شوند.

واحد کنترل

[ویرایش]

واحد کنترل یک مورد خاص از واحدهای اجرایی است که اجرای برنامه‌ها را کنترل می‌کند. واحد کنترل به حافظه دستورات، دسترسی دارد تا دستورات را اجرا کند. برای اینکه برنامه‌های اجرا شده بتوانند اجرا (پرش) را به یک موقعیت دلخواه در برنامه اجرا شده منتقل کنند، واحد کنترل عملیات جریان کنترل را فراهم می‌کند. یک واحد کنترل معمولاً دارای یک خط لوله دستورالعمل است که شامل مراحلی برای واکشی، رمزگشایی و اجرای دستورالعمل‌های برنامه است.

ثبات فایل‌ها

[ویرایش]

فایل‌های رجیستر حاوی ثبات‌های عمومی هستند که برای ذخیره متغیرها در برنامه‌ها استفاده می‌شوند. مانند واحدهای اجرایی، فایل‌های رجیستر نیز دارای پورت‌های ورودی و خروجی هستند. تعداد پورت‌های خواندن و نوشتن (یعنی توانایی خواندن و نوشتن چندین ثبات در یک چرخه ساعت) می‌تواند در هر فایل ثبات متفاوت باشد.

گذرگاه‌ها و سوکت‌های حامل

[ویرایش]

معماری اینترکانکت شامل گذرگاه‌های حامل است که با استفاده از سوکت‌ها به پورت‌های واحد اجرایی متصل می‌شوند. به دلیل هزینه اتصال، معمولاً تعداد اتصالات بین واحدها کاهش می‌یابد (واحدهای اجرایی و ثبات فایل‌ها). در صورتی که مسیری از هر پورت خروجی واحد به درگاه‌های ورودی هر واحد وجود داشته باشد و اگر به طور کامل متصل باشد، به آن TTA گفته می‌شود.

سوکت‌ها ابزاری برای برنامه‌نویسی پردازنده‌های TTA فراهم می‌کنند که به آنها اجازه می‌دهد در هر لحظه انتخاب کنند کدام اتصالات گذرگاه به پورت سوکت فعال باشد؛ بنابراین، انتقال داده‌هایی که در یک چرخه ساعت انجام می‌شوند را می‌توان با تعریف اتصال سوکت/پورت منبع و مقصد برای فعال کردن هر گذرگاه برنامه‌ریزی کرد.

اجرای شرطی

[ویرایش]

برخی از پیاده‌سازی‌های TTA از اجرای شرطی پشتیبانی می‌کنند.

اجرای شرطی با کمک گاردها اجرا می‌شود. هر انتقال داده را می‌توان توسط یک گارد شرطی کرد که به یک ثبات (اغلب یک ثبات شرطی یک بیتی) و به یک گذرگاه متصل است. در صورتی که مقدار رجیستر محافظت شده به اشتباه (صفر) ارزیابی شود، انتقال داده برنامه‌ریزی شده برای گذرگاهی که گارد به آن متصل است، له می‌شود، یعنی در مقصد نوشته نمی‌شود. انتقال داده‌های بدون قید و شرط به هیچ گاردی متصل نیست و همیشه اجرا می‌شود.

شاخه‌ها

[ویرایش]

همه پردازنده‌ها، از جمله پردازنده‌های TTA، شامل دستورالعمل‌های جریان کنترلی هستند که شمارنده برنامه را تغییر می‌دهند، که برای اجرای توابع، if-then-else، for-loop و غیره استفاده می‌شوند. زبان اسمبلی برای پردازنده‌های TTA معمولاً شامل دستورالعمل‌های جریان کنترلی مانند شاخه‌های بدون شرط (JUMP)، شاخه‌های شرطی نسبی (BNZ)، فراخوانی توابع (CALL)، بازگشت شرطی (RETNZ) و غیره است که برای سایر پردازنده‌ها شبیه دستورالعمل‌های زبان اسمبلی مربوطه هستند.

مانند بقیه عمل‌ها در یک ماشین TTA، این دستورالعمل‌ها به عنوان دستورالعمل‌های «حرکت» به یک واحد اجرایی ویژه پیاده‌سازی می‌شوند.

پیاده‌سازی‌های TTA که از اجرای شرطی پشتیبانی می‌کنند، مانند sTTAck و نمونه اولیه MOVE، می‌توانند بیشتر این دستورالعمل‌های جریان کنترل را به عنوان یک حرکت مشروط به شمارنده برنامه پیاده‌سازی کنند.[۳][۴]

پیاده‌سازی‌های TTAای که فقط از انتقال داده‌های بدون شرط پشتیبانی می‌کنند، مانند مکزیم اینتگریتد MAXQ,[۵] معمولاً دارای یک واحد اجرایی ویژه هستند که ارتباط نزدیکی با شمارنده برنامه دارند که به انواع آدرس‌های مقصد پاسخ می‌دهد. هر یک از این آدرس‌ها، هنگامی که به عنوان مقصد یک "حرکت" استفاده می‌شود، تأثیر متفاوتی بر شمارنده برنامه دارد - هر دستور "شاخه نسبی < شرط > " آدرس مقصد متفاوتی برای هر شرط دارد. و سایر آدرس‌های مقصد از CALL, RETNZ و غیره استفاده می‌شود.

منابع

[ویرایش]
  1. V. Guzma, P. Jääskeläinen, P. Kellomäki, and J. Takala, “Impact of Software Bypassing on Instruction Level Parallelism and Register File Traffic”
  2. Johan Janssen. "Compiler Strategies for Transport Triggered Architectures". 2001. p. 168.
  3. Henk Corporaal. "Transport Triggered Architectures examined for general purpose applications". p. 6.
  4. Aliaksei V. Chapyzhenka. "sTTAck: Stack Transport Triggered Architecture".
  5. "MAXQ Family User's Guide". Maxim Integrated. Section "1.1 Instruction Set". A register-based, transport-triggered architecture allows all instructions to be coded as simple transfer operations. All instructions reduce to either writing an immediate value to a destination register or memory location or moving data between registers and/or memory locations.