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

در معماری کامپیوتر ، **معماری راه‌اندازی حامل** ( **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ای که فقط از انتقال داده‌های بدون شرط پشتیبانی می‌کنند، مانند Maxim Integrated 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.