موضوع مقاله: DOPIPE | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # DOPIPE | مقدمه: موازی‌سازی DOPIPE روشی است که از طریق ایجاد خط لوله دستورالعمل‌ها در قالب حلقه می‌تواند موازی‌سازی در سطح حلقه را اجرا کند. | ## بخش 1: DOPIPE | موازی‌سازی در خط لوله ایجاد شده می‌تواند در سطوح جداسازی مختلفی مثل حلقه‌ها، توابع و مراحل الگوریتمی وجود داشته باشد. میزان موازی‌سازی به این بستگی دارد که برنامه‌نویسان چقدر قابلیت بهره‌برداری حداکثری از این مفهوم را داشته باشند. همچنین به عواملی مثل شناسایی و جداسازی کار‌های مستقل و اجرای موازی انها بستگی دارد. پیشینه هدف اصلی به کارگیری موازی‌سازی در سطح حلقه این است که کار‌های متوالی در یک برنامه را یافته و انها را از هم جدا کند و بدون هیچ گونه اطلاعات قبلی درباره این الگوریتم انها را به مجموعه‌ای از کار‌های موازی تبدیل کند. بخش‌هایی از داده‌ها که مکررا تکرار می‌شوند و بخش قابل توجهی از زمان اجرا را به خود اختصاص می‌دهند، گزینه‌های خوبی برای موازی‌سازی در سطح حلقه هستند . برخی کاربردهای متداول موازی‌سازی در سطح حلقه به گروهی از آنالیزهای ریاضی مربوط می‌شوند که از ماتریس‌های چند بعدی تکرار شده در حلقه‌های تو در تو استفاده می‌کنند. انواع مختلفی از تکنیک‌های موازی‌سازی وجود دارد که بر اساس میزان هزینه‌های اضافی حاصل از ذخیره داده‌ها، میزان موازی سازی و وابستگی داده ها استفاده می‌شود . DOALL: وقتی می‌توانیم هر تکرار از حلقه را بدون هیچ گونه تعاملی بین تکرار‌ها، موازی کنیم از این تکنیک استفاده می‌کنیم. بنابراین، زمان کلی مورد نیاز برای اجرا از N * T (برای یک فرِآیند سری، که در آن T زمان اجرای هر تکرار است) به T کاهش می‌یابد (زیرا تمامی N تکرار به صورت موازی اجرا می‌شوند). | ## بخش 2: DOPIPE | بنابراین، کار‌ها را به نحوی موازی می‌کنیم که کار‌هایی با داده‌های مستقل به صورت موازی اجرا شوند، اما کار‌هایی که داده‌های وابسته دارند به صورت متوالی اجرا شوند. در پردازنده‌های موازی برای همزمانی کار‌های وابسته، درجه‌ای از همزمان‌سازی استفاده می‌شود. شرح DOPIPE یک تکنیک موازی‌سازی همراه با ایجاد خط لوله است و در برنامه‌هایی استفاده می‌شود که عناصر تولید شده در هر تکرار در تکرار بعدی مصرف می‌شود. مثال زیر نشان می‌دهد که برای کاهش کل زمان مورد نیاز برای اجرای برنامه چگونه تکنیک DOPIPE را از طریق شکستن کارهای موجود در هر حلقه و اجرای آنها در خط لوله ی ایجاد شده پیاده کنیم. شکستن کار‌ها به نحوی انجام می‌شود که تمامی وابستگی‌های درون حلقه یک سویه هستند، یعنی تکرار بعدی به تکرار قبلی بسته نیست. در این کد، در حلقه‌ای که با j از 1 تا N تکرار می‌شود سه کار (F1، F0 و F2) وجود دارند. در زیر فهرست وابستگی‌های موجود در کد را مشاهده می‌کنید: F1[j] → T F1[j+1]، نشان می‌دهد که دستورالعمل F1 در تکرار j+1 باید پس از دستورالعمل F1 در تکرار j اجرا شود. از طرف دیگر، دستورالعمل‌های F1 و F2 وابسته هستند (در بالا توضیح داده شد)، بنابراین آنها را به دو حلقه مختلف جدا می‌کنیم و با خط لوله ایجاد شده اجرا می‌کنیم. پس از انتظار برای اجرای F1، با استفاده ازF2 ، wait(j) اجرای خود را آغاز می کند زیرا مقدار z[j] را برای استفاده در دسترس دارد. | ## بخش 3: DOPIPE | همچنین، از آنجایی که اجرای F1 با F2 محدود نمی‌شود، F1 همزمان تکرار j+1 را اجرا می‌کند. در حالیکه برای F1 و F2، کل زمان اجرا برابر است با مقدار N * T F1 + T F2 (اگر زمان مربوط به همزمان‌سازی را ناچیز در نظر بگیریم). این مقدار به میزان قابل توجهی کمتر از زمان به دست آمده در هنگام اجرای متوالی است. در مقایسه با سایر مدل ها موازی‌سازی DOALL عمدتاً بر اساس اصل << تقسیم کن و موفق شو >> کار می‌کند. در اینجا همه کارها با تکرارهای متفاوتی اجرا می‌شوند که از مجموعه داده‌های منحصربفردی استفاده می‌کنند. بنابراین مشکل این پیاده‌سازی این است که وقتی حجم زیادی از داده‌ها با هم محاسبه می‌شوند، فضای کش بزرگی برای کار کردن با رشته‌های مختلف مورد نیاز است. از آنجایی که در این رشته‌ها هیچ نوع وابستگی وجود ندارد، هیچ انرژی اضافه‌ای برای ارتباط بین رشته‌ای هزینه نمی‌شود. در حالی که در DOPIPE، انرژی اضافه‌ای برای همزمان‌سازی بین رشته‌ها مورد نیاز است. | ## جمع‌بندی | اما به دلیل ساختار خط لوله ایجاد شده در آن، به فضای کش کمتری نیاز دارد زیرا داده‌های تولید شده بلافاصله توسط مصرف کننده مصرف می‌شود.