نمونه ترجمه تخصصی رشته ریاضی - ترجمه آنلاین
جبر خطی با عملکرد بالا
در این بخش مسائلی را در رابطه با جبر خطی در کامپیوترهای موازی بررسی میکنیم. نگاهی واقعگرایانه به این موضع خواهیم داشت، و فرض میکنیم تعداد پردازشگرها محدود است، و دادههای مسئله همیشه نسبت به تعداد پردازشگرها بزرگ است. همچنین به جنبههای فیزیکی شبکه ارتباطی بین پردازشگرها نیز توجه می کنیم.
عملیات مختلف جبر خطی، از جمله روش های تکراری، و رفتار آنها در حضور شبکهای با پهنای باند محدود و امکان ارتباط محدود را تجزیه تحلیل می کنیم. این فصل را با نکات کوتاهی درباره پیچیدگیهای الگوریتمها که ناشی از اجرای موازی است، به پایان می بریم.
سفارش ترجمه تخصصی تمامی رشته ها
6.1. عملیات جمعی
عملیات جمعی نقش مهمی در عملیات جبر خطی دارند. در واقع، مقیاسپذیری عملیات به هزینه این گروهها بستگی دارد که در ادامه خواهیم دید. در اینجا بررسی کوتاهی داریم درباره نظریههای اساسی؛ برای جزئیات بیشتر رجوع کنید به [21].
در محاسبه هزینه عمل جمعی، سه ثابت ساختاری برای بدست آوردن مرزهای پایین کافی است: α، ارسال یک پیام، β معکوس داده ا رسالی (رجوع کنید به بخش 1.3.2)، و γ معکوس زمان برای اجرای عمل حساب. ارسال n آیتم داده به α + βn زمان نیاز دارد. بعلاوه فرض می کنیم که هر بار فقط یک پیام را می توان ارسال کرد. درباره امکان ارتباط پردازشگرها فرضی صورت نگرفته است؛ بنابراین مرزهای پایین حاصل برای دامنه وسیعی از ساختارها صدق میکند.
دلالت اصلی مدل ساختاری بالا این است که تعداد پردازشگر اکتیو در هر مرحله از الگوریتم فقط میتواند دو برابر شود. برای مثال، برای انجام پخش گسترده، پردازشگر اول 0 به پردازشگر 1 ارسال می کند، سپس 0 و 1 می توانند به 2 و 3 ارسال کند، سپس 3-0 به 4-7 ارسال می کنند و همین طور ادامه می یابد. این ترتیب ا رسال پیام، درخت پوشا با حداقل پوشش شبکه پردازشگر نامیده می شود، و هر الگوریتم حداقل α log2p هزینه در رابطه با مجموع نهفتگی دارد.
دیکشنری تخصصی ریاضی آنلاین
6.1.1. پخش گسترده
در عمل پخش گسترده، یک پردازشگر دارا n عنصر داده است که باید به بقیه ارسال شود: پردازشگرهای دیگر به کپی کامل همه n عنصر نیاز دارند. براساس توضیح بالا، می توان نتیجه گرفت که پخش گسترده به p پردازشگر حداقل [log2p] مرحله زمان میبرد و با مجموع نهفتگی (تاخیر) [log2p] α خواهد بود. چون n عنصر ارسال می شود، nβ به همه عناصر ارسالی از پردازشگر افزوده می شود و حد پایین هزینه عبارت است از
می توان متد درخت پوشا (زیرگرافی از یک درخت) را به شکل زیر نشان داد:
(در t = 1، p0 به p1 ارسال میکند؛ در t = 2، p0, p1 به p2p3 ارسال می کند.) این الگوریتم عبارت درست log2p.α را دارد اما پردازشگر 0 به صورت مکرر کل بردار را ارسال می کند، در نتیجه هزینه پهنای باند log2p . nβ است. اگر n کوچک باشد، هزینه نهفتگی غالب است، بنابراین میتوان این رابطه به صورت عملیات جمعی بردار کوتاه عنوان کرد.
الگوریتم زیر پخش گسترده را به صورت ترکیبی از الگوریتم پراکندن و پخش یکنواخت (bucket brigade) اجرا میکند:
حالا پیچیدگی عبارت است از
که در نهفتگی (latency) مطلوب نیست، اما اگر n بزرگ باشد الگوریتم بهتر خواهد بود و آن را به عمل جمعی بردار بلند تبدیل میکند.
6.1.2. کاهش
در عمل کاهش، هر پردازشگر n عنصر داده دارد، و یک پردازشگر باید آنها را عنصر به عنصر ترکیب کند، مثلا با محاسبه n جمع یا ضرب.
با اجرای پخش گسترده روبه عقب در طول زمان، می توان دید که عمل کاهش همان مرز پایین در ارتباط [log2p] α + nβ را دارد. هم چنین عمل کاهش محاسبهای را نیز دربرمی گیرد که به مجموع زمان (p – 1) γn به صورت ترتیبی نیاز دارد: هر n آیتم در n پردازشگر کاهش مییابد. از آنجا که این عملیات میتواند موازی شود، مرز پایین در محاسبات عبارت است ازγn p-1p ، و این مجموع حاصل می شود:
الگوریتم درخت پوشا با استفاده از علامت x(j)i برای آیتم داده i نشان داده شده است که در اصل در پردازشگر j بود، و xi(j:k) را برای مجموعه آیتمهای i پردازشگر j . . . k بکار میبریم.
در زمان t = 1، پردازشگر p0, p2 از p1, p3 دریافت می کند و در زمان t = 2، p0 از p2 دریافت می کند.
در مورد پخش گسترده بالا، این الگوریتم به مرز پایین نمیرسد؛ بلکه پیچیدگی آن عبارت است از
برای بردارهای کوتاه عبارت α غالب است بنابراین این الگوریتم کافی است. برای بردارهای بلند می توان همانند بالا الگوریتمهای دیگری بکار برد [21].
6.1.3. Allreduce
عمل allreduce همان کاهش جزء به جزء n عنصر را در هر پردازشگر محاسبه می کند، اما نتیجه را به جای اینکه فقط در ریشه درخت پوشا قرار دهد، در هر پردازشگر قرار می دهد. این عمل را میتوان به صورت کاهش و سپس پخش گسترده اجرا کرد اما الگوریتمهای موثرتری نیز وجود دارد.
مرز پایین در هزینه allreduce تقریبا با عمل کاهش ساده برابر است: چون در کاهش همه پردازشگرها همزمان فعال نیستند، فرض می کنیم که کار بیشتری را می توان تقسیم کرد. این یعنی مرز پایین در نهفتگی و محاسبه یکسان می ماند. برای پهنای باند، توجیه ما به این است: برای اینکه برقراری ارتباط کاملا موازی شود،n p-ip آیتم باید به هر پردازشگر برسد و آن را ترک کند. بنابراین مجموع زمان عبارت است از
6.1.4. Allgather
در عمل allgather روی n عنصر، هر پردازشگر n/p عنصر دارد، و یک پردازشگر همه آنها را گردآوری می کند، بدون اینکه آنها را همانند کاهش ترکیب کند. allgather همانند gather (گردآوری) محاسبه می کند اما نتیجه را در هر پردازشگر قرار میدهد.
بازهم فرض می کنیم که گردآوریها (gatherها) با چند هدف همزمان فعال هستند. چون هر پردازشگر از درخت پوشای حداقل منشعب می شود، نهفتگی log2pα را داریم. مجموع هزینه ساخت بردار به طول n با allgather عبارت است از
سفارش ترجمه تخصصی تمامی رشته ها
که به اینصورت نشان داده شده است:
در زمان t = 1، مبادله یبن همسایه p0, p1 و همینطور p2, p3 برقرار است؛ در زمان t = 2 مبادله در فاصله دو بین p0, p1 و همینطور p1, p3 است.
6.1.5. کاهش – پراکنش
در عمل کاهش – پراکنش (reduce-scatter)، هر پردازشگر n عنصر دارد، و کاهش n طرفه روی آنها انجام میگیرد. برخلاف کاهش یاا allreduce، نتیجه تقسیم می شود، و همانند عمل پراکنش (scatter) توزیع می شود.
پردازشگر i آیتم x(i)i ر ا دارد و به ∑jxi(j) نیاز دارد. می توان این عمل را با کاهش اندازه p، با گردآوری بردار (∑ix0(i), ∑ixi(i), . . .) در یک پردازشگر، و پراکنش (پخش) نتایج انجام داد. با این حال، می توان این عملیات را در الگوریتم تبادل دوطرفه معروف تلفیق کرد:
کاهش – پراکنش را می توان اجرای معکوس allgather در نظر گرفت که با افزایش حساب همراه است، بنابراین هزینه عبارت است از:
6.2. ضرب برداری ماتریس موازی متراکم
در این بخش به تفصیل به عملکرد ضرب برداری ماتریس موازی متراکم، بویژه مقیاس پذیری میپردازیم. ابتدا مورد سادهای را بررسی می کنیم، و جنبههای موازی سازی را تا اندازهای بحث می کنیم.
6.2.1. پیادهسازی بلوک – ردیف
در طراحی نسخه موازی الگوریتم، معمولا دادههای اهداف مربوطه تجزیه می شود. در مورد عملیات ماتریس-بردار مثل ضرب y = Ax، می توان با تجزیه بردار شروع کرد، و انشعابات آن را در تجزیه ماتریس بررسی کرد، یا با ماتریس شروع کرد و تجزیه بردار را از روی آن بدست آورد. در این مورد، به نظر می رسد که شروع با تجزیه ماتریس بهتر از بردار باشد، زیرا به احتمال زیاد اهمیت محاسباتی بیشتری خواهد داشت. حالا دو گزینه داریم.
- تجزیه تک بعدی روی ماتریس انجام می دهیم و آن را به ردیفهای بلوک یا ستونهای بلوک تقسیم می کنیم و هر یک از اینها را به یک پردازشگر اختصاص می دهیم.
- یا می توان تجزیه د.وبعدی انجام داد و به هر پردازشگر زیرماتریس بیشتری اختصاص داد.
با تجزیه ردیفهای بلوک شروع می کنیم. پردارشگر p و مجموعه Ip اندیسها یا ردیفهای خودش را در نظر میگیریم،Ip i ϵ را ردیفی بگیرید که برای این پردازشگر تعیین شده است. عناصر در ردیف i در عمل زیر بکار می رود:
حالا توجیه مسئله:
زبان تخصصی ریاضی+pdf
- اگر پردازشگر p همه مقادیر xj را داشته باشد، ضرب بردار – ماتریس را می توان به راحتی اجرا کرد، و در پایان اجرا، پردارشگر مقادیر درست yj برای j ϵ Ip خواهد داشت.
- این یعنی هر پردازشگر باید یک کپی از x را داشته باشد، که کاری بیفایده. هم چنین مسئله انسجام دادهها مطرح می شود: باید مطمئن شوید که پردازشگر مقدار درست x را دارد.
- در ایجاد اپلیکیشنهای عملی (مثلا متدهای تکراری که قبلا دیدید)، حاصل ضرب بردار- ماتریس، مستقیما یا غیرمستقیم، ورودی ضرب بردار – ماتریس بعدی است. مطمئناً این وضعیت برای متد توان است که x, Ax, A2x, . . . را محاسبه می کند. چون عمل ما با کل x برای هر پردازشگر شروع شد، اما در پایان x فقط عنوان قسمت محلی Ax بود، اشتباه کردهایم (خطا داریم).
- شاید بهتر باشد فرض کنیم که هر پردازشگر، در شروع عمل، فقط قسمت محلی x را دارد، یعنی xi، که i ϵ Ip است، تا حالت شروع و پایان الگوریتم یکسان باشد. یعنی باید الگوریتم را تغییر دهیم تا ارتباطی را شامل شود که هر پردازشگر بتواند مقادیر xi را با i ∉ Ip
را بدست آورد.
تمرین 6.1. توجیه مشابهی را درباره موردی ارائه دهید که ماتریس به ستونهای بلوک تجزیه می شود. الگوریتم موازی را به تفصیل همانند بالا اما بدون شبه کد توضیح دهید.
حالا ارتباط را با جزئیات بررسی می کنیم: پردازشگر ثابت p، عملیاتی که انجام می دهد و ارتباطی را که لازم دارد، در نظر میگیریم. طبق تحلیل بالا، در اجرای عبارت yi = ∑j ajxj باید بدانیم که مقادیر j به کدام پردازشگر تعلق دارد. برای این منظور، داریم
ورودی: تعداد پردازشگر p، عناصر xi با i ϵ Ip؛ عناصر ماتریس Aij با i ϵ Ip.
خروجی: عناصر yi با i ϵ Ip
برای i ϵ Ip
s←0 را انجام دهید؛
برای j ϵ Ip
s←s + aijxj را انجام دهید.
برای j ∉Ip
Xi را از پردازشگری که در آن قرار دارد به پردازشگر فعلی (جاری) ارسال کنید، سپس؛
s←s + aijxj
yi ←s
روش MVP موازی (a, xlocal, ylocal, p)
شکل 6.1: ضرب بردار-ماتریس موازی کدگذاری شده ساده
اگر j ϵ Ip باشد، در اینصورت yi ← yi + aijxj فقط مقادیری را دربرمیگیرد که از قبل نسبت به پردازشگر محلی است. بنابراین روی مورد j ∉Ip تمرکز می کنیم. بهتر است فقط عبارت زیر را بنویسیم
و لایه پایینتر به صورت خودکار x (j) از هر پردازشگری که در آن ذخیره شده باشد به رجیستر محلی منتقل میشود. (زبانهای PGAS بخش 2.6.5 برای این منظور هستند اما راندمان تضمین نشده است.) پیادهسازی براساس این دیدگاه خوش بینانه در مورد موازیسازی در شکل 6.1. آمده است.
مسئله چنین روش محلی این است که ارتباط خیلی زیا است.
- اگر ماتریس A متراکم باشد، عنصر xj برای هر ردیف ضروری است، و در نتیجه عنصری است که به هر ردیف i ϵ Ip آورده می شود.
- برای هر پردازشگر q ≠p
، تعداد زیادی عنصر xi با i ϵ Ip وجود خواهد داشت که باید از پردازشگر q به p منتقل شوند. انجام اینکار در پیامهای جداگانه، به جای انتقال یکجا، اتلاف زیادی دارد.
این مسائل در مود حافظه مشترک چندان مطرح نیست، اما در مورد حافظه توزیع شده بهتر است از روش بافرینگ استفاده شود.
سفارش ترجمه تخصصی تمامی رشته ها
به جای ارتباط عناصر x به صورت تک تک، ما از بافر محلی Bpq برای هر پردازشگر q ≠p استفاده میکنیم و عناصر لازم را برای انجام ضرب در p از q گردآوری می کنیم. (رجوع کنید به شکل 6.2). الگوریتم موازی در شکل 6.3 نشان داده شده است.
با این روش، علاوه بر اینکه از آوردن هر عنصر بیش از یکبار جلوگیری می شود، پیامهای کوچک زیادی در یک پیام بزرگ ادغام می شود که معمولاً موثرتر است؛ بحث پهنای باند نهفتگی در بخش 2.7.8 را به خاطر آورید.
تمرین 6.2. شبه کدی برای ضرب بردار – ماتریس با استفاده از عملیات غیر بلوک بندی ایجاد کنید (رجوع کنید به بخش 2.6.3.6).
شکل 6.2. ضرب بردار – ماتریس موازی با توزیع ردیف بلوک.
ورودی: تعداد پردازشگر p، عناصر xi با i ϵ Ip؛ عناصر ماتریس Aij با i ϵ Ip.
خروجی: عناصر yi با i ϵ Ip
برای q ≠p
عناصر x را از پردازشگر q به p ارسال کنید، به صورت بافر Bpq دریافت کنید.
ylocal←Axlocal
برای q ≠p
ylocal ← ylocal + ApqBpq
روش MVP موازی (A, xlocal, ylocal, p)
شکل 6.3. پیادهسازی ضرب بردار – ماتریس موازی با بافر (میانگیر)
در بالا گفتیم که داشتن کپی کل x در هر پردازشگر اتلاف فضا است. بحث ضمنی در اینجا این است که به طور کل نمیخواهیم ذخیرهسازی محلی تابعی از تعداد پردازشگر باشد: معمولا باید تابعی از دادههای محلی باشد. (این با مقیاسپذیری ضعیف مرتبط است؛ بخش 2.2.4.)
می بینید که به خاطر ملاحظات ارتباطی به این نتیجه رسیدیم که ذخیره کل بردار ورودی هر پردازشگر اجتنابناپذیر است یا حداقل بهتر است انجام گیرد. چنین موازنهای بین زمان و فضا در برنامه نویسی موازی کاملا متداول است. برای ضرب بردار – ماتریس متراکم می توان از این سربار دفاع کرد، زیرا ذخیره بردار مرتبه پایینتری از ذخیره ماتریس دارد، بنابراین تخصیص ما چندان هم بیش از حد لازم نیست. در ادامه (بخش 6.5) خواهیم دید که برای ضرب بردار – ماتریس اسپارس (کم پشت) ممکن است سربار بسیار کمتر باشد.
به راحتی می توان دید که ضرب بردار – ماتریس متراکم، به طوریکه در صورت صرفنظر از زمان ارتباط، افزایش سرعت خیلی خوبی دارد. در بخشهای بعدی خواهید دید که پیادهسازی ردیف بلوک بالا با در نظر گرفتن ارتباط، مطلوب نخواهد بود. برای مقیاسپذیر بودن به تجزیه دو بعُدی نیاز داریم. با بررسی مشترکها شروع می کنیم.
6.2.2 مقیاسپذیری ضرب بردار – ماتریس متراکم
در این بخش تحلیل کاملی داریم درباره محاسبه موازی y ← Ax که x, y ∈ Rn است و A ∈ Rn ×n
است. فرض می کنیم که p گره بکار می رود، اما فرضی درباره امکان اتصال آنها نداریم. خواهیم دید که چگونه ماتریس توزیع شده تفاوت زیادی در مقیاس گذاری الگوریتم ایجاد می کند؛ برای جستجوی اصلی رجوع کنید به [83, 144, 150]، و بخش 2.24 برای تعریف اشکال مختلف مقیاس گذاری.
6.2.2.1. ضرب بردار – ماتریس، تقسیم براساس ردیف
تقسیمبندی
که در آن A ∈ Rmi ×n و∈ Rn-m
∑p-1i=0 min xiyi
و mi ≈ n/p است. با این فرض شروع میکنیم که Ai , xi , yi در اصل به Pi اختصاص یافتهاند.
در این محاسبه هر پردازشگر به کل بردار x نیاز دارد، اما فقط کسر n/p از آن را داراست. بنابراین allgather را برای x اجرا می کنیم. سپس پردازشگر می تواند ضرب محلی yi ← Aix را انجام دهد؛ ارتباط دیگری پس از آن لازم نیست.
الگوریتمی با هزینه ارتباط برای y = Ax در صورتی موازی است که
مرحله |
هزینه (مرز پایین) |
xi را allgather کنید به طوریکه x در همه گرهها موجود باشد yi = Ax را به صورت محلی محاسبه کنید |
|
تحلیل هزینه: مجموع هزینه الگوریتم به طور تقریبی عبارت است از،
چون هزینه ترتیبی T1(n) = 2n2γ است، افزایش سرعت عبارت است از
و راندمان عبارت است از
نگاهی خوشبینانه: حالا اگر p را معین و n را بزرگ بگیریم،
بنابراین اگر بتوانیم مسئله را به اندازه کافی بزرگ بسازیم، راندمان موازی تقریبا عالی خواهد بود. اما چنین راندمانی با فرض حافظه نامحدود بدست میآید، پس این تحلیل عملی نیست.
نگاهی بدبینانه: در تحلیل مقیاسپذیری قوی، n را ثابت و p را بزرگ میگیریم تا داشته باشیم،
بنابراین، در نهایت راندمان موازی تقریبا وجود ندارد.
نگاهی واقعبینانه: در نگاهی واقعبینانه تعداد پردازشگر را با افزایش میزان داده افزایش میدهیم. اینکار مقیاسپذیری نامیده می شود، و موجب میشود میزان حافظه موجود برای ذخیره مسئله به صورت خطی با p افزایش یابد.
M را برابر با تعداد اعداد با ممیز شناور بگیرید که میتوان در حافظه یک گره ذخیره کرد. در اینصورت حافظه جمعی با Mp بدست میآید. nmax(p) را برابر با بزرگترین مسئله بگیرید که میتوان در حافظه جمعی p گره ذخیره کرد. در اینصورت اگر بتوان از کل حافظه برای ماتریس استفاده کرد،
حالا این پرسش مطرح می شود که با چه راندمان موازی میتوان بزرگترین مسئله را در p گره ذخیره کرد:
حالا اگر آنچه را که با افزایش تعداد گره اتفاق میافتد، تحلیل کنیم، درمییابیم که
بنابراین، این الگوریتم موازی برای ضرب بردار – ماتریس مقیاسپذیر نیست.
اگر این عبارت راندمان را با دقت بیشتری بررسی کنید، می بینید که مسئله اصلی قسمت 1/p است. این جملات فاکتوری از β را دربرمیگیرند و اگر مشتق معکوس را دنبال کنید خواهید دید که از زمان ارسال داده بین پردازشگرها پدید میآید. در واقع بدون توجه به تعداد پردازشگر، اندازه پیام ثابت n است.
فرد واقعبین میداند که زمان محدود، Tmax، برای انجام محاسبه وجود دارد. تحت بهترین شرایط، یعنی با سربار ارتباط صفر، بزرگترین مسئلهای که میتوانیم در زمان Tmax حل کنیم، عبارت است از
بنابراین
راندمان موازی که با بزرگترین مسئله قابل حل در زمان Tmax میتوان برای الگوریتم بدست آورد، عبارت است از
و راندمان موازی با افزایش تعداد گرهها عبارت است از
بازهم با افزایش تعداد پردازشگرها و محدودیت زمان نمیتوان راندمان را حفظ کرد.
6.2.2.2. ضرب بردار – ماتریس، تقسیمبندی براساس ستون
تقسیمبندی
که در آن Aj∈ Rn n× وxiyi ∈ Rn
با ∑p-1i=0 nj = n و nj ≈ n/p است.
با این فرض شروع میکنیم که Aj, xi و yi در اصل به Pj اختصاص داده شده اند (اما حالا Ai بلوک ستونهاست). در این الگوریتم براساس ستون، پردازشگر i میتواند طول بردار Aixi را بدون ارتباط قبلی محاسبه کند. بنابراین این نتایج نسبی باید درعمل کاهش - پراکنش باهم جمع شود:
هر پردازشگر i قسمت (Aixi) نتیجه خود را به پردازشگر j پخش میکند. سپس پردازشگرهای دریافت کننده عمل کاهش را انجام میدهند، و همه این قسمتها را به هم اضافه میکنند:
الگوریتم با هزینهها عبارت است از:
مرحله |
هزینه (مرز پایین) |
به صورت محلی y(j) = Ajxj روی y(j) کاهش- پراکنش انجام دهید به طوریکه yi= j=0(p-1)yi(j) |
|
تحلیل هزینه: مجموع هزینه الگوریتم به صورت تقریبی عبارت است از،
توجه داشته باشید که این تحلیل همانند هزینه T1D-row (n) است، به جز اینکه (β + γ) جایگزین β شده است. به راحتی میتوان دید که نتیجهگیریها د رباره مقیاسپذیری همان است.
6.2.2.3. تقسیمبندی دو بُعدی
سپس تقسیمبندی زیر انجام دهید
که در آن Aij ∈ Rni ×nj و xiyi ∈ Rni
با ∑p-1i=0 nj = N و ni≈N /p
است.
گرهها را به صورت شبکه c × r خواهیم دید، با P = rc، و اندیس آنها به صورت pij با I = 0, . . ., r-1 و j=0, . . . , c-1 است. شکل 6.4 برای ماتریس 12 × 12 در شبکه پردازشگر 4 × 3، تخصیص دادهها به گرهها را نشان میدهد که در آن سلول i, j عناصر ماتریس و بردار را برای pij نشان میدهد.
شکل 4. توزیع عناصر ماتریس و بردار برای مسئلهای با اندازه 12 و در شبکه پردازشگر 3 × 4.
به عبارت دیگر، pij بلوک ماتریس Aij و قسمت x و y را دارد. بر این اساس، الگوریتم زیر حاصل میشود:
- چون xj در ستون jام توزیع شده است، الگوریتم با گردآوری xi در هر پردازشگر pij بوسیله allgather درون ستونهای پردازشگر شروع میشود.
- هر پردازشگر pij، yij = Aijxj را محاسبه میکند. اینکار به ارتباط بیشتری نیاز ندارد.
- سپس نتیجه yi با گردآوری تکههای yij در هر ردیف پردازشگر جمعآوری میشود تا yi شکل گیرد، و سپس در ردیف پردازشگر توزیع میشود (پخش میشود). در واقع این دو عمل برای تشکیل کاهش- پراکنش (reduce – scatter) تلفیق میشود.
- اگر r = c باشد، میتوانیم دادههای y را در پردازشگرها جابجا کنیم، تا بتواند به عنوان ورودی برای ضرب بردار – ماتریس بعدی باشد. اما اگر AtAx را محاسبه میکنیم، y به درستی برای ضرب At توزیع شده است.
الگوریتم: الگوریتم با تحلیل هزینه عبارت است از
مرحله |
هزینه (مرز پایین) |
xi را درون ستونها allgather کنید ضرب بردار – ماتریس محلی را انجام دهید yi را درون ردیفها کاهش- پراکنش دهید |
|
تحلیل هزینه: مجموع هزینه الگوریتم به صورت تقریبی عبارت است از
حالا ساده کردن را انجام میدهیم تا r=c= p شود.
چون هزینه ترتیبی T1(n) = 2n2γ است، افزایش سرعت عبارت است از
و راندمان موازی عبارت است از
سفارش ترجمه تخصصی تمامی رشته ها
بازهم این پرسش را میپرسیم که راندمان موازی برای بزرگترین مسئلهای که میتوان در p گره ذخیره کرد، چیست.
به طوریکه هنوز داریم
با این حال، log2p خیلی آهسته با p رشد میکند و در نتیجه با همان عملکرد خواهد بود. در این مورد Epp×p (nmaxp) خیلی آهسته کاهش مییابد و الگوریتم برای اهداف عملی مقیاسپذیر محسوب میشود.
توجه داشته باشید که وقتی r = p است، الگوریتم 2 بُعدی به الگوریتم "تقسیمبندی با ردیف" تبدیل میشود و وقتی c = p است به الگوریتم "تقسیمبندی با ستون" تبدیل می شود. به راحتی میتوان نشان داد که الگوریتم دو بعدی براساس تحلیل بالا وقتی r = c است تا زمانیکه r/c ثابت بماند، مقیاسپذیر است.
6.3. فاکتورگیری LU به صورت موازی
موازی سازی ماتریس – بردار و ضرب ماتریس – بردار از یک نظر آسان است. همه عناصر خروجی به صورت جداگانه با هر ترتیبی قابل محاسبه هستند، بنابراین درجه رهایش بالایی در الگوریتم موازیسازی داریم. این امر در مورد محاسبه فاکتورگیری LU یا حل کردن سیستم خطی با ماتریس فاکتورگیری شده نیز صدق میکند.
6.3.1. حل سیستم مثلثی
حل سیستم مثلثی y = L-1x ( L مثلثی پایین است) عمل ماتریس-بردار است، بنابراین پیچیدگی O(N2) با ضرب ماتریس – بردار مشترک است. با این حال، برخلاف عمل ضرب، این فرآیند حل رابطه رکورانس (بازگشتی) بین عناصر خروجی دارد:
این به این معنی است که موازیسازی ناچیز نیست. در مورد ماتریس اسپارس استراتژیهای خاصی امکانپذیر است؛ رجوع کنید به بخش 6.11. در اینجا نکته کلی درباره مورد متراکم عنوان میکنیم.
برای سادگی فرض کنید ارتباط زمان نمیبرد، و همه عملیات ریاضی به زمان یکسان نیاز دارند. ابتدا توزیع ماتریس براساس ردیف را در نظر میگیریم، یعنی پردازشگر p عناصر lp* را ذخیره میکند. با این فرض میتوانیم راه حل مثلثی را به ترتیب زیر پیاده کنیم:
- پردازشگر 1، y1= l11-1x1
را حل میکند و مقدار آن را به پردازشگر بعدی میفرستد.
- به طور کل، پردازشگر p مقادیر y1, . . ., yp-1 را از پردازشگر p - 1 میگیرد و yp را محاسبه میکند؛
- سپس هر پردازشگر p، y1, . . ., yp را به p + 1 میفرستد.
تمرین 6.3. نشان دهید که این الگوریتم 2N2 زمان میبرد، درست مثل الگوریتم ترتیبی (متوالی).
در این الگوریتم هر پردازشگر همه مقادیر محاسبه شده را به شیوه خاصی به جانشیناش منتقل می کند. با این حال، اینکار به این معنی است که پردازشگر p فقط در آخرین لحظه y1 را دریافت میکند، در صورتیکه این مقدار قبلا در مرحله اول محاسبه شده است. این الگوریتم حل را میتوان به گونهای تنظیم کرد که عناصر محاسبه شده بالافاصله در دسترس قرار گیرند:
- پردازشگر 1، y1 را حل میکند و به همه پردازشگرهای بعدی می فرستد.
- به طور کل، پردازشگر p منتظر پیامهای فردی با مقادیر yp برای q < p میماند.
- سپس پردازشگر p، yp را محاسبه میکند و آن را به پردازشگرهای q با q > p ارسال میکند.
تحت این فرض که زمان ارتباط قابل صرفنظر است، این الگوریتم میتواند بسیاری سریعتر باشد. برای مثال، همه پردازشگرهای p > 1 همزمان y1 را دریافت میکنند و میتوانند همزمان lp1y1 را محاسبه کنند.
تمرین 6.4. نشان دهید که طول زمان این الگوریتم O(N) است.
تمرین 6.5. حالا توزیع ماتریس براساس ستون را در نظر بگیرید: پردازشگر p، l*p را ذخیره میکند. الگوریتم حل مثلثی را با این توزیع طرح کنید و نشان دهید که زمان حل موازی O(N) است.
6.3.2. فاکتورگیری
تحلیل کامل مقیاسپذیری فاکتورگیری LU متراکم بسیار پیچیده است، بنابراین بدون اثبات بیشتر میگوییم که همانند مورد ماتریس – بردار، توزیع دوبُعدی لازم است. با این حال، میتوان پیچیدگی دیگری نیز مشخص کرد. چون فاکتورگیری از هر نوع در ماتریس پیش میرود، پردازشگرها برای مدتی غیرفعال خواهند بود.
تمرین 6.6. حذف گاوسی رو به راست معمولی را در نظر بگیرید
زمان اجرا، افزایش سرعت، و راندمان را به صورت تابعی از N تحلیل کنید، فرض کنید توزیع تک بُعدی است و پردازشگر کافی برای ذخیره یک ستون به ازای هر پردازشگر وجود دارد. نشان دهید که افزایش سرعت محدود است.
این تحلیل را برای تجزیه دوبُعدی نیز انجام دهید که در آن هر پردازشگر یک عنصر را ذخیره می کند.
به همین دلیل، تجزیه زیاد بکار رفته است، که در آن ماتریس به بلوکهای بیشتری از تعداد پردازشگر تقسیم میشود، و هر پردازشگر چندین زیرماتریس غیرمجاور را ذخیره میکند. این فرآیند در شکل 6.5 نشان داده شده است.
شکل 6.5. توزیع چرخهای تک بُعدی: تخصیص چهار ستون ماتریس به دو پردازشگر، و ترسیم ذخیرهسازی حاصل بر ستونهای ماتریس.
که در آن چهار ستون مارتریس با به دو پردازشگر تقسیم میکنیم: هر پردازشگر در ستون مجاور حافظه دو ستون ماتریس غیرمجاور ذخیره میکند.
در شکل 6.6 نشان میدهیم که ضرب ماتریس – بردار با چنین ماتریسی را میتوان بدون آگاهی از اینکه پردازشگرها قسمتهای غیرمجاور ماتریس را ذخیره میکنند، حل کرد. تنها چیزی که لازم است این است که بردار ورودی نیز به صورت چرخهای توزیع شود.
شکل 6.6. ضرب ماتریس - بردار با ماتریس توزیع شده چرخهای.
تمرین 6.7. حالا ماتریس 4 × 4 و شبکه پردارشگر 2 × 2 در نظر بگیرید. ماتریس را به صورت چرخهای هم براساس ردیف و هم با ستون توزیع کنید. نشان دهید تا زمانی که ورودی درست توزیع شود، ضرب ماتریس – بردار را میتوان با استفاده از ذخیرهسازی مجاور ماتریس انجام داد. خروجی چگونه توزیع میشود؟ نشان دهید که ارتباط بیشتری نسبت به کاهش مثال تک بُعدی نیاز است.
بویژه، با P < N پردارشگر، و با فرض ساده بودن N = cP، پردازشگر 0 را با ذخیره ردیف 0, c, 2c, 3c, … در نظر بگیرید؛ پردازشگر 1 ردیف 1, c + 1, 2c + 1, . . ., را ذخیره میکند و غیره. اگر N = c1P1 = c2P2 و P = P1P2 باشد، این طرح را میتوان به دو توزیع دو بُعدی تعمیم دارد. اینکار توزیع چرخهای 2 بُعدی نامیده میشود. این طرح را میتوان با در نظر گرفتن ردیفها و ستونهای بلوک، و با تخصیص ردیف 0, c, 2c, … بلوک به پردازشگر 0 بیشتر بسط داد.
الگوریتم 1: a ← xty را محاسبه کنید که در آن x, y بردارهای توزیع شده است
کاهش و پخش گسترده (که میتواند در Allreduce تلفیق شود) دادهها در همه پردازشگرها را تلفیق میکند، بنابراین زمان ارتباطی آنها با افزایش تعداد پردازشگر افزایش مییابد. این امر باعث می شود ضرب داخلی عمل گستردهای باشد، و راههایی برای کاهش تاثیر آنها بر عملکرد متدهای تکراری پیشنهاد شده است.
برخی از روشهای اتخاذ شده به ترتیب زیر است.
- ممکن است محاسبه ضرب داخلی بر محاسبات موازی دیگر منبطق باشد [34].
- در متد GMERS، استفاده از متد کلاسیک Gram-Schmidt (GS) ضرب داخلی غیروابسته بسیار کمتری از متد تعدیل شده GS دارد، اما ثبات کمتری دارد. برخی استراتژیهایی برای تصمیمگیری در استفاده از متد کلاسیک GS بررسی کردهاند [110].
از آنجا که حساب کامپیوتری شرکتپذیر نیست، ضربهای داخلی منبع اصلی نتایجی هستند که با اجرای یک محاسبه یکسان برای دو پیکربندی متفاوت پردازشگر فرق میکنند. در بخش 3.3.6 این راه حل را شرح دادهایم.
6.7.2. ساختار ماتریس المان محدود
موضوع بسیار مهم این است که المان ماتریس aij مجموع محاسبات، بویژه انتگرالهای معین، در همه المانهایی است که هر دو متغیر i و j را دارند:
شکل 6.9. دامنه المان محدود، موازیسازی ساختار ماتریس، و موازیسازی ذخیرهسازی المان.
محاسبات در هر المان قسمتهای مشترک زیادی دارند، بنابراین طبیعی است که هر المان e به صورت منحصر برای پردازشگر Pe تخصیص یابد، که همه aij(e) را محاسبه میکند. در شکل 6.9 المان 2 برای پردازشگر 0 تعیین شده و المان 4 برای پردازشگر 1 تخصیص یافته است.
6.8. پیششرط سازهای موازی
در بالا (بخش 5.5.5 و بویژه 5.5.5.1) چند گزینه مختلف از K دیدیم. در این بخش با بررسی استراتژیهای موازیسازی شروع میکنیم. این بحث و بررسی ه تفصیل در بخشها بعدی ادامه خواهد د اشت.
6.8.1. پیششرط سازی ژاکوبی
6.8.2. مشکل با IUL موازی
در بالا دیدیم که از نظر شمارش فلاپ، بکارگیری پیششرطساز ILU (بخش 5.5.5.1) به اندازه انجام ضرب بردار- ماتریس پرهزینه است. اگر متدهای تکراری را در کامپیوتر موازی بکار گیریم، این افزایش هزینه دیگر وجود نخواهد داشت.
در نگاه اول عملیات شبیه هم هست. ضرب بردار – ماتریس y = Ax به این شکل است
در حالت موازی به این شکل خواهد بود
فرض کنید پردازشگر کپی محلی همه المانهای لازم A و x را دارد و این عمل کاملاً موازی است: همه پردازشگرها میتواند بلافاصله کار را شروع کند، و اگر بار کار تقریبا برابر باشد، پردازشگرها کار را همزمان تمام میکنند. در اینصورت مجموع زمان ضرب بردار – ماتریس بر تعداد پردازشگر تقسیم میشود، و افزایش سرعت کمابیش تمام و کمال خواهد بود.
حالا حل روبه جلو Lx = y را در نظر بگیرید، برای مثال در مورد پیششرط ساز ILU:
میتوان به راحتی کد موازی را نوشت:
اما حالا یک مسئله وجود دارد. دیگر نمیتوانیم بگوییم "فرض کنید پردازشگری کپی محلی همه چیز در سمت راست خود را دارد"، زیرا بردار x هم در سمت چپ هست و هم در سمت راست. با اینکه ضرب بردار – ماتریس در اصل در ردیفهای ماتریس کاملا موازی است، اما این کد حل مثلثی بازگشتی و در نتیجه ترتیبی است.
در بخشهای بعد استراتژیهای مختلفی برای یافتن پیششرطسازها خواهیم دید که در حالت موازی عملکرد متفاوتی دارند.
6.8.3. متدهای ژاکوبی بلوکی
روشهای مختلفی برای اصلاح ترتیبی بودن حل مثلثی پیشنهاد شده است. برای مثال، میتوان گفت که پردازشگرها از اجزای x که باید از پردازشگرهای د یگر بیاید، صرفنظر کنند:
سفارش ترجمه تخصصی تمامی رشته ها
این کار رنگآمیزی ما را به کجا میبرد؟ حل هنوز هم ترتیبی است . . . درست است که حلقه بیرونی بالای رنگها ترتیبی است، اما همه نقاط همرنگ مستقل از همدیگر هستند، بنابراین میتوان همه آنها را همزمان حل کرد. پس اگر از تقسیمبندی دامنه عادی استفاده کنیم و آن را با چند رنگ ترکیب کنیم (رجوع کنید به شکل 6.11)، همه پردازشگرها در طی همه مراحل رنگی فعال خواهند بود، رجوع کنید به شکل 6.12. اگر نگاهی به شکل بیاندازید میبینید که یک پردازشگر در آخرین رنگ فعال نیست. با تعداد زیاد گره برای هر پردازشگر این اتفاق نمیافتد، اما ممکن است عدم تعادل بار بوجود آید.