پیش‌نویس:لوله گذاری حلقه

این مقاله در حال ترجمه از ویکی انگلیسی است لطفا حذف نشود.

موازی‌سازی DOPIPE روشی برای اجرای موازی در سطح حلقه (Loop-level parallelism) است که از طریق لوله‌گذاری (Pipelining) دستورات موجود در یک حلقه عمل می‌کند. موازی‌سازی لوله‌گذاری شده می‌تواند در سطوح مختلف انتزاع مانند حلقه‌ها، توابع و مراحل الگوریتمی وجود داشته باشد. میزان موازی‌سازی به توانایی برنامه‌نویس در شناسایی و جداسازی وظایف مستقل و اجرای موازی آن‌ها بستگی دارد.

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

 DOALL: زمانی استفاده می‌شود که هر تکرار حلقه کاملاً مستقل از دیگر تکرارها باشد.
 DOACROSS: زمانی استفاده می‌شود که وابستگی داده‌ای وجود دارد؛ وظایف مستقل به صورت موازی و وظایف وابسته به صورت متوالی اجرا می‌شوند.
 DOPIPE: تکنیک لوله‌گذاری شده برای مواردی که هر عنصر تولید شده در یک تکرار، در تکرار بعدی مصرف می‌شود.

 توصیف 
در روش DOPIPE، وظایف داخل حلقه به گونه‌ای شکسته می‌شوند که تمام وابستگی‌ها یک‌طرفه باشند. به عنوان مثال، کد زیر را در نظر بگیرید که دارای سه تابع F0، F1 و F2 است:
 for (j=1; j<=N; j++) {
 F0: o[j] = x[j] - a[j];
 F1: z[j] = z[j-1] * 5;
 F2: y[j] = z[j] * w[j];
 }
در این مثال، F0 کاملاً مستقل است و می‌تواند با روش DOALL اجرا شود. اما F1 و F2 به هم وابسته هستند و به صورت لوله‌گذاری (Pipelined) اجرا می‌شوند.

 مقایسه با مدل های دیگر 
موازی‌سازی DOALL بر اساس اصل «تقسیم و غلبه» کار می‌کند و به فضای حافظه نهان (Cache) زیادی نیاز دارد. در مقابل، DOPIPE اگرچه هزینه همگام‌سازی (Synchronization overhead) دارد، اما به دلیل ساختار لوله‌گذاری شده، به فضای کش کمتری نیاز دارد زیرا داده‌های تولید شده بلافاصله توسط مصرف‌کننده استفاده می‌شوند.

 منابع