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

در معماری کامپیوتر، **معماری راه‌اندازی حامل** (**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, معمولاً دارای یک واحد اجرایی ویژه هستند که ارتباط نزدیکی با شمارنده برنامه دارند که به انواع آدرس‌های مقصد پاسخ می‌دهد. هر یک از این آدرس‌ها، هنگامی که به عنوان مقصد یک "حرکت" استفاده می‌شود، تأثیر متفاوتی بر شمارنده برنامه دارد - هر دستور "شاخه نسبی &#x3C; شرط &#x3E; " آدرس مقصد متفاوتی برای هر شرط دارد. و سایر آدرس‌های مقصد از CALL, RETNZ و غیره استفاده می‌شود.

## تأخیر عملیات قابل مشاهده برای برنامه‌نویس (Programmer-visible operation latency):
"این مقاله در حال ترجمه از ویکی انگلیسی است

لطفا حذف نشود." 

فلسفه‌ی اصلی معماری‌های تحریک انتقالی (TTA) بر این مبناست که **پیچیدگی از سخت‌افزار به نرم‌افزار منتقل شود**.

به‌دلیل این ویژگی، چندین نوع خطر (Hazard) جدید برای برنامه‌نویس ایجاد می‌شود. یکی از مهم‌ترین آن‌ها **شکاف‌های تأخیری (delay slots)** است، که همان **تأخیرهای عملیاتی قابل مشاهده توسط برنامه‌نویس** در واحدهای تابعی (Function Units) به شمار می‌رود. در این معماری، کنترل زمان‌بندی به‌طور کامل بر عهده‌ی برنامه‌نویس است.

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

برای مثال فرض کنید معماری‌ای وجود دارد که عمل جمع (**add**) دارای تأخیر ۱ و عمل ضرب (**mul**) دارای تأخیر ۳ چرخه‌ی کلاک است.

در هنگام تحریک (Trigger) عمل *add*، نتیجه در دستورالعمل بعدی (چرخه‌ی کلاک بعدی) قابل خواندن است. اما در مورد *mul*، باید دو دستورالعمل صبر کرد تا بتوان نتیجه را خواند؛ یعنی نتیجه در **سومین دستورالعمل پس از تحریک** آماده می‌شود.

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

ز طرف دیگر، نتیجه باید **به موقع (نه خیلی دیر)** خوانده شود تا قبل از این که عملیات بعدی نتیجه جدیدی را در همان درگاه خروجی (Output Port) بنویسد، نتیجه‌ی قبلی از بین نرود.

به‌دلیل حجم زیاد «زمینه‌های مرئی برای برنامه‌نویس» (Programmer-visible context) در پردازنده‌های TTA — که علاوه بر محتوای ثبات‌ها (Register file)، مواردی مانند **محتوای ثبات‌های پایپلاین واحدهای تابعی** و **درگاه‌های ورودی و خروجی آن‌ها** را هم شامل می‌شود —

فرآیند **ذخیره‌سازی محیط (Context saving)** برای پشتیبانی از وقفه‌های خارجی (Interrupts) در این معماری بسیار پیچیده و پرهزینه است.

به‌همین دلیل، **پردازنده‌های TTA معمولاً از وقفه‌ها پشتیبانی نمی‌کنند**. در عوض، وظیفه‌ی آن‌ها به سخت‌افزار خارجی (مثل **پردازنده ورودی/خروجی (I/O processor)**) واگذار می‌شود یا با استفاده از مکانیسم‌های جایگزینی مانند **Polling** (پرس‌وجوی دوره‌ای) نیاز به وقفه برطرف می‌گردد.

## نمونه‌های پیاده‌سازی (Implementations):

* **MAXQ** از شرکت *Maxim Integrated*، تنها **ریزکنترل‌گر تجاری** شناخته‌شده‌ای است که بر پایه‌ی معماری تحریک انتقالی ساخته شده است. این تراشه نوعی **رایانه‌ی تک‌دستورالعملی (OISC)** محسوب می‌شود و تنها یک دستور **MOVE** (انتقال) دارد که می‌تواند با جابه‌جا کردن مستقیم مقادیر (مثلاً به‌شمارنده‌ی برنامه یا Program Counter)، به‌صورت چندین دستور مجازی گوناگون عمل کند.
* **پروژه‌ی MOVE** چندین ریزپردازنده‌ی آزمایشی بر پایه‌ی TTA را طراحی و تولید کرده است.
* **OpenASIP** یک ابزار متن‌باز (open-source) برای طراحی مجموعه‌دستورالعمل‌های اختصاصی (Application-Specific Instruction Set Processor) است که از TTA به عنوان الگوی پردازنده استفاده می‌کند.
* معماری **Amiga Copper** شامل همه‌ی ویژگی‌های اصلی یک معماری تحریک انتقالی است.
* **پردازنده‌ی Able** که توسط شرکت *New England Digital* توسعه یافته نیز نمونه‌ای از معماری TTA است.
* **رایانه‌ی مبتنی بر WireWorld** نیز از الگوی تحریک انتقالی در طراحی منطق خود استفاده می‌کند.
* مجله‌ی **Dr. Dobb’s Journal** طرحی با نام *One-Der* منتشر کرده است — یک پردازنده‌ی ۳۲بیتی مبتنی بر TTA که با زبان **Verilog** نوشته شده و دارای اسمبلر و کامپایلر **Forth** منطبق بر آن است.
* **پردازنده‌ی رأس‌گرافیک (Vertex processor)** در واحدهای **Mali (۲۰۰/۴۰۰)** نیز از معماری تحریک انتقالی با دقت ممیز شناور (Single-Precision Floating-Point) و قالب دستورالعمل ۱۲۸ بیتی استفاده می‌کند. *(نیاز به استناد دارد.)*

## منابع

رده:معماری رایانه
رده:پردازش دستورها