معماری جریان داده

معماری پردازش موازی
معماری گردش داده (به انگلیسی: Dataflow Architecture)  یک روش معماری کامپیوتر است که در معماری‌های پردازش موازی به کار می‌رود و کاملاً با روش کلاسیک فون نویمن یا کنترل گردش (Control Flow) در تضاد است. در معماری گردش داده، شمارنده برنامه (Program Counter) وجود ندارد، یا توانایی اجرا (Executibility) و اجرای دستورها تنها بر اساس موجود بودن آرگومان‌های ورودی تشخیص داده می‌شود. اگرچه هیچ محصول تجاری موفقی در زمینه سخت‌افزارهای با اهداف کلی (General Purpose) از این روش استفاده نمی‌کند، ولی اخیراً پیاده‌سازی‌های موفقی از آن در سیستم‌های تخصصی مثل پردازش سیگنال‌های دیجیتال، مسیریابی شبکه‌ها، پردازش گرافیکی و جدیدترین آن در انبارداری داده (Data Warehousing) استفاده می‌شود. همچنین این روش در بسیاری از معماری‌های نرم‌افزاری هم استفاده می‌شود مثل طراحی موتورهای پایگاه داده‌ای و چهارچوب‌های پردازش موازی.



معماری‌های گردش داده همزمان (Synchronous Data Flow Architecture) وفق یافته‌اند تا بار کاری تحمیل شده توسط یک مسیرداده‌ای همزمان مثلاً سرعت یک سیم در پیش فرستادن بسته‌ها را میزان کند. معماری گردش داده‌ای به صورت طبیعی برنامه ریزان را قادر می‌سازد تا بتوانند کارهای پیچیده‌ای از جمله بالانس کردن بارپردازشی را به صورت همزمان انجام دهند، همچنین در این روش در دسترسی به منابع مشترک هم بسیار مؤثر عمل می‌کند.



معماری سخت‌افزاری برای گردش داده‌ها یک از مهم‌ترین مساثل در معماری کامپیوترها در دهه هفتاد میلادی و اوایل دهه هشتاد میلادی بود. جک دنیس (Jack Dennis) از دانشگاه MIT در زمینه معماری گردش داده ایستا پیشرو بود و این درست در زمانی بود که همزمان پروژهای معماری Manchester Dataflow Machine و MIT Tagged Token در زمینه ماشین‌های با معماری گردش داده پویا را نیز در حال اجرا بودند.



طراحی‌هایی که از روش‌های معمول آدرس دهی حافظه به عنوان استقلال داده‌ای استفاده می‌کنند (Data Dependency) را ماشین‌های گردش داده‌ای ایستا می‌گویند. این ماشین‌ها اجازه نمی‌دهند تا چند نمونه (instance) از یک رویه(routine) به صورت همزمان ساخته و اجرا شود. دلیل این امر این است که برچسب ساده(simple tag) نمی‌تواند میان آنان تفاوت قائل شود. طراحی‌هایی که از Content Addressable Memory) CAM) استفاده می‌کنند را ماشین‌های با گردش داده پویا می‌گویند. این برنامه‌ها از برچسب‌هایی استفاده می‌کنند که پردازش موازی را تسهیل می‌کند.



به صورت عادی کامپایلر ها(compilers) متن اصلی برنامه(source code)را آنالیز می‌کنند تا وابستگی‌های داده‌ای میان دستورها را برای ساماندهی بهتر ترتیب دستورها، در فایل باینری خروجی، بیابد. دستورها به صورت ترتیبی ساماندهی شده‌اند ولی اطلاعات مربوط به وابستگی در فایل‌های باینری ذخیره نمی‌شوند. فایل‌های باینری ای که برای ماشین‌های گردش داده‌ای ذخیره می‌شوند، حاوی این اطلاعات وابستگی هستند. کامپایلر برای نگهداری این اطلاعات به جای استفاده از متغیرها از از برچسب‌های یکتایی استفاده می‌کند. با استفاده از این روش برچسب گذاری به قطعه کد غیر مستقل اجازه داده می‌شود که در پردازش موازی بدون ترتیب (out of order) اجرا شود.



برنامه‌ها در CAM کامپیوتر جریان داده پویا ذخیره می‌شوند. هنگامی که همه عملونده‌های یک دستورالعمل فعال می‌شوند (یعنی خروجی یک دستورالعمل قبلی ویا یک ورودی از کاربر)، دستور به عنوان دستور آماده علامت گذاری می‌شود. این عمل توسط یک بخش اجرایی(execution unit) انجام می‌شود. به این عمل فعالسازی(activation) یا شعله‌ور کردن(firing)دستورالعمل می‌گویند. به محض این که عملیات بخش اجرایی بر روی یک دستور خاتمه می‌یابد، خروجی آن در CAM ذخیره می‌شود (به همراه برچسب آن). هر دستوری که به که به داده خاصی وابسته باشد (این امر با بررسی مقدار برچسب شناسایی می‌شود) و سپس به عنوان آماده برای اجرا برچسب می‌خورد. در این حالت دستورها بعدی با ترتیب درست اجرا می‌شوندو از حالت مسابقه‌ای پرهیز می‌شود(race condition). این ترتیب اجرا احتمالاً با ترتیب مورد انتظار نوشته شده توسط انسان متفاوت خواهد بود.
یک دستورالعمل به همراه عملوندهای مورد نیاز آن، به شکل یک بسته به بخش اجرایی فرستاده می‌شود، که به آن instruction token گفته می‌شود. به صورت مشابه، داده خروجی به عوان token به CAM بازگردانده می‌شود. این بسته سازی دستورها و نتایج اجازه می‌دهد تادستورات در پردازش موازی بتوانند در ابعاد بزرگ اجرا شوند. شبکه‌های جریان داده وظیفه رساندن دستورها به شکل token را به بخش اجرایی و برعکس به CAM را بر عهده دارند. کاملاً برعکس معماری فون نویمن، tokenها به شکل پایدار در حافظه ذخیره نمی‌شوند، بلکه آن‌ها پیام‌های موقتی هستند که در زمان تبادل دستورها ذخیره می‌شوند.

تحقیقات هنوز نتوانسته‌اند به مسائل مربوط به موارد زیر هیچگاه فائق بیایند:
کارایی پخش کردن Data Tokenها در سیستم‌های موازی بسیار حجیم.
کارایی مخابره instruction tokenها در سیستم‌های موازی حجیم.
درست کردن CAMهایی با بزرگی مناسب برای نگهداری همه وابستگی‌ها در سیستم‌های حقیقی.
با این وجود، از دهه ۱۹۹۰ اجرای خارج از روال(out-of-order execution) تبدیل به یک مشکل اساسی در پارادایم محاسباتی شده‌است که یک روش گردش داده‌ای محدود می‌باشد. در این پارادایم، یک ایده به نام پنجره اجرایی(execution window)معرفی شده‌است. این پنجره‌های اجرایی از همان ترتیب معماری فون نویمن پیروی می‌کنند، با این حال داده‌ها در داخل این پنجره‌ها اجازه دارند تا با توجه به وابستگی‌ها اجرا و خاتمه یابند. این روش در CPUهایی که به روش پویا به برچسب گذاری می‌پردازند پیاده‌سازی شده‌است. پیچیدگی منطقی پیگیری اثر داده‌های وابسته به شکل پویا OoO CPUرا به تعدادی بخش‌های اجرایی محدود می‌کند و اندازه سایز پنجره‌ها را به رنج ۳۲تا ۲۰۰ دستور کوچک می‌کند. این مقدرا بسیار کوچکتر از مقدار آن در سیستم‌های تمام گردش داده‌ای است.