رایانش موازی: تفاوت میان نسخهها
برچسب: متن دارای ویکیمتن نامتناظر |
|||
خط ۶۹: | خط ۶۹: | ||
هر دو قانون آمدال و گوستافسون فرض می کنند که زمان اجرای قسمت متوالی برنامه مستقل از تعداد پردازنده ها است. قانون آمدال فرض می کند که کل مساله دارای اندازه ثابت است به طوری که کل کار انجام شده به طور موازی نیز مستقل از تعداد پردازنده ها است ، در حالی که قانون گوستافسون فرض می کند که کل کار انجام شده به صورت موازی ارتباط خطی با تعداد پردازنده ها دارد. |
هر دو قانون آمدال و گوستافسون فرض می کنند که زمان اجرای قسمت متوالی برنامه مستقل از تعداد پردازنده ها است. قانون آمدال فرض می کند که کل مساله دارای اندازه ثابت است به طوری که کل کار انجام شده به طور موازی نیز مستقل از تعداد پردازنده ها است ، در حالی که قانون گوستافسون فرض می کند که کل کار انجام شده به صورت موازی ارتباط خطی با تعداد پردازنده ها دارد. |
||
=== وابستگی ها === |
|||
== مزایای استفاده از پردازش موازی == |
|||
درک وابستگی داده ها در اجرای الگوریتم های موازی اساسی است. هیچ برنامه ای نمی تواند سریعتر از طولانی ترین زنجیره محاسبات وابسته (معروف به مسیر بحرانی) اجرا شود ، زیرا محاسباتی که به محاسبات قبلی در زنجیره بستگی دارند باید به ترتیب اجرا شوند. با این حال ، بیشتر الگوریتم ها فقط از یک زنجیره طولانی محاسبات وابسته تشکیل نشده اند. معمولاً فرصت هایی برای اجرای محاسبات مستقل به طور موازی وجود دارد. |
|||
مزایای سیستمهای ابررایانه را که عامل اصلی رشد سریع آنها نیز میباشد میتوان به شرح زیر لیست نمود. |
|||
* نسبت هزینه بهکارایی بسیار پایین |
|||
فرض کنید ''P''<sub>''i''</sub> و ''P''<sub>''j''</sub> دو بخش برنامه باشند. شرایط برنشتاین<ref>{{cite journal|last=Bernstein|first=A. J.|title=Analysis of Programs for Parallel Processing|journal=IEEE Transactions on Electronic Computers|date=1 October 1966|volume=EC-15|issue=5|pages=757–763|doi=10.1109/PGEC.1966.264565}}</ref> زمانی را توصیف می کند که این دو مستقل باشند و بتوانند به طور موازی اجرا شوند. برای ''P''<sub>''i''</sub> ، فرض کنید ''I''<sub>''i''</sub> همه متغیرهای ورودی و ''O''<sub>''i''</sub> متغیرهای خروجی باشند ، و به همین شکل، برای ''P''<sub>''j''</sub>. دو قسمت ''P''<sub>''i''</sub> و ''P''<sub>''j''</sub> در صورت براورده کردن شرایط زیر مستقل هستند |
|||
* سختافزار و نرمافزار ارزان و در دسترس |
|||
{{چپچین}} |
|||
* تعمیر و نگهداری ساده |
|||
: <math>I_j \cap O_i = \varnothing,</math> |
|||
* قابلیت توسعه سیستم متناسب با افزایش نیاز |
|||
: <math>I_i \cap O_j = \varnothing,</math> |
|||
* امکان بهروزرسانی سیستم |
|||
: <math>O_i \cap O_j = \varnothing.</math> |
|||
* زمان بالای در اختیار بودن و سرویسدهی سیستم |
|||
{{پایان چپچین}} |
|||
* کاهش زمان اجرا در شبیه سازی ها و حل مسائل کاربردی |
|||
* گسترش دامنه تحقیقات |
|||
نقض شرط اول وابستگی جریان را ایجاد می کند ، به این معنی که اولین بخش نتیجه ای تولید می کند که توسط بخش دوم استفاده میشود. شرط دوم نشان دهنده ی ضد وابستگی است، بدین معنی که قطعه دوم متغیر مورد نیاز بخش اول را تولید می کند. شرط سوم و نهایی وابستگی خروجی را نشان می دهد: وقتی دو بخش در یک مکان بنویسند ، نتیجه ی نهایی مربوط به آخرین قسمت اجرا شده از نظر منطقی است.<ref>{{cite book|last=Roosta|first=Seyed H.|title=Parallel processing and parallel algorithms : theory and computation|year=2000|publisher=Springer|location=New York, NY [u.a.]|isbn=978-0-387-98716-3|page=114}}</ref> |
|||
* امکان حل مسائل بزرگتر و پیچیدهتر |
|||
* استفاده از IO (سیستم های ورودی و خروجی) در بسیاری از ماشین آلات (مثل پایگاه داده های توزیعی). |
|||
توابع زیر را در نظر بگیرید ، که انواع مختلفی از وابستگی ها را نشان می دهد: |
|||
{{چپچین}} |
|||
1: function Dep(a, b) |
|||
2: c := a * b |
|||
3: d := 3 * c |
|||
4: end function |
|||
{{پایان چپچین}} |
|||
در این مثال ، دستورالعمل 3 نمی تواند قبل از (یا حتی به موازات) دستورالعمل 2 اجرا شود ، زیرا دستورالعمل 3 از نتیجه دستورالعمل 2 استفاده می کند. این کار شرط اول را نقض می کند ، بنابراین وابستگی جریان را ایجاد می کند. |
|||
{{چپچین}} |
|||
1: function NoDep(a, b) |
|||
2: c := a * b |
|||
3: d := 3 * b |
|||
4: e := a + b |
|||
5: end function |
|||
{{پایان چپچین}} |
|||
در این مثال ، هیچ وابستگی بین دستورالعمل ها وجود ندارد ، بنابراین می توان همه آنها را به طور موازی اجرا کرد. |
|||
شرایط برنشتاین اجازه نمی دهد حافظه بین فرآیندهای مختلف تقسیم شود. برای این کار ، برخی از ابزارهای اعمال نظم بین دسترسی ها لازم است؛ مانند سمافورها ، موانع یا سایر روش های همگام سازی. |
|||
== برنامهنویسی موازی == |
== برنامهنویسی موازی == |
نسخهٔ ۲۲ مهٔ ۲۰۲۱، ساعت ۰۴:۴۲
گمان میرود که این مقاله ناقض حق تکثیر باشد، اما بدون داشتن منبع امکان تشخیص قطعی این موضوع وجود ندارد. اگر میتوان نشان داد که این مقاله حق نشر را زیر پا گذاشته است، لطفاً مقاله را در ویکیپدیا:مشکلات حق تکثیر فهرست کنید. اگر مطمئنید که مقاله ناقض حق تکثیر نیست، شواهدی را در این زمینه در همین صفحهٔ بحث فراهم آورید. خواهشمندیم این برچسب را بدون گفتگو برندارید. (ژانویه ۲۰۱۶) |
رایانش موازی نوعی رایانش است که در آن بسیاری از محاسبات یا فرآیندها به طور همزمان انجام می شوند. [۱] مشکلات بزرگ را اغلب می توان به مشکلات کوچکتر تقسیم کرد ، سپس می توان همزمان آنها را حل کرد. چندین فرم مختلف رایانش موازی وجود دارد: سطح بیت ، سطح دستورالعمل ، داده ها و موازی کاری(task parallelism). موازی سازی مدت هاست که در رایانش دارای عملکرد بالا (ابر رایانه) مورد استفاده قرار می گیرد ، اما به دلیل محدودیت های فیزیکی که مانع از افزایش فرکانس (frequency scaling) بیشتر می شوند، اقبال گسترده تری پیدا کرده است.[۲] از آنجا که مصرف برق (و در نتیجه تولید گرما) توسط رایانه ها در سالهای اخیر به یک نگرانی تبدیل شده است ،[۳] رایانش موازی به الگوی غالب در معماری رایانه تبدیل شده است ، که عمدتاً به صورت پردازنده های چند هسته ای است.[۴]
رایانش موازی(parallel) ارتباط نزدیکی با رایانش همروند(concurrent) دارد - آنها اغلب با هم مورد استفاده قرار می گیرند و اغلب با هم ادغام می شوند ، گرچه این دو متمایز هستند: این امکان وجود دارد تا موازی سازی بدون همروندی (مانند موازی سازی در سطح بیت) و همروندی بدون موازی سازی (مانند چند وظیفه ای با به اشتراک گذاری زمان در یک پردازنده تک هسته ای).[۵][۶] در رایانش موازی ، یک وظیفه ی محاسباتی بطور مرسوم به چندین، معمولا تعداد زیادی، زیر وظیفه ی بسیار مشابه تقسیم می شود که می توانند به طور مستقل پردازش شوند و نتایج آنها پس از اتمام ، ترکیب شوند. در مقابل ، در رایانش همروند ، فرایندهای مختلف غالباً وظایف مرتبط را رفع و رجوع نمی کنند؛ اگر هم این کار را بکنند ، همانطور که در رایانش توزیع شده معمول است ، وظایف جداگانه ممکن است ماهیت متنوعی داشته باشند و اغلب هنگام اجرا به برخی از ارتباطات بین فرآیندی نیاز دارند.
رایانه های موازی را می توان تقریباً بر اساس سطحی از موازی سازی که سخت افزار پشتیبانی می کند، طبقه بندی کرد ، در این میان رایانه های چند هسته ای و چند پردازنده دارای چندین عنصر پردازشی در یک ماشین واحد هستند ، در حالی که خوشه ها(clusters) ، رایانش شدیداً موازی (massively paralle computing) و شبکه ها(grids) از چندین رایانه برای کار با بر روی یک وظیفه استفاده می کنند . برای تسریع در انجام کارهای خاص ، گاهی اوقات از معماری های کامپیوتری موازی خاص در کنار پردازنده های سنتی استفاده می شود.
در بعضی موارد ، موازی سازی برای برنامه نویس شفاف است ، مانند موازی سازی در سطح بیت یا در سطح دستورالعمل ، اما نوشتن الگوریتم های صریحاً موازی ، به ویژه آنهایی که از همروندی استفاده می کنند ، دشوارتر از موارد متوالی است ،[۷] زیرا همروندی باعث بوجود آمدن چندین کلاس جدید از اشکالات نرم افزاری بالقوه می شود ، که شرایط مسابقه ای شایع ترین آن ها است. ارتباط و همگام سازی بین زیر-وظایف مختلف معمولاً از بزرگترین موانع دستیابی به عملکرد بهینه در برنامه ی موازی است.
در قانون آمدال، یک حداکثر مجاز نظری برای افزایش سرعت یک برنامه واحد در نتیجه موازی سازی وجود دارد.
زمینه
به طور مرسوم ، نرم افزار کامپیوتر برای رایانش متوالی (sequential computing) نوشته شده است. برای حل یک مسئله ، الگوریتمی به شکل یک جریان متوالی از دستورالعمل ها ساخته و اجرا می شود. این دستورالعمل ها در یک واحد پردازش مرکزی در یک رایانه اجرا می شوند. فقط یک دستورالعمل می تواند در هر زمان اجرا شود - پس از پایان آن دستورالعمل ، دستور بعدی اجرا می شود.[۸]
از طرف دیگر ، رایانش موازی از چندین عنصر پردازش گر به طور همزمان برای حل یک مسئله استفاده می کند. این امر با تقسیم مسئله به قسمت های مستقل حاصل می شود تا هر عنصر پردازش گر بتواند سهمی از الگوریتم را همزمان با بقیه اجرا کند. عناصر پردازش گر می توانند متنوع باشند و شامل منابعی مانند یک رایانه با چندین پردازنده ، چندین رایانه شبکه شده ، سخت افزار تخصصی یا هر ترکیبی از موارد فوق هستند.[۸] از نظر تاریخی رایانش موازی برای محاسبات علمی و شبیه سازی مسأله های علمی ، به ویژه در علوم طبیعی و مهندسی ، مانند هواشناسی استفاده می شد. این امر منجر به طراحی سخت افزار و نرم افزار موازی و همچنین رایانش با کارایی بالا شد.[۹]
افزایش فرکانس دلیل اصلی بهبود عملکرد رایانه(computer performance) از اواسط دهه 1980 تا 2004 بود. زمان اجرای یک برنامه برابر است با تعداد دستورالعمل ها ضربدر متوسط زمان برای هر دستورالعمل. با ثابت نگه داشتن همه عوامل دیگر ، افزایش فرکانس ساعت باعث کاهش میانگین زمان اجرای دستورالعمل می شود. بنابراین افزایش فرکانس باعث کاهش زمان اجرا برای همه برنامه های غالبا-محاسباتی (compute-bound) می شود.[۱۰] با این حال ، مصرف برق (P) یک تراشه با معادله ی زیر محاسبه می شود:
P = C × V 2 × F
که در آن، C ظرفیتی است که در هر چرخه ی ساعت سوئیچ می شود (متناسب با تعداد ترانزیستورهایی که ورودی های آنها تغییر می کند) ، V ولتاژ و F فرکانس پردازنده (تعداد چرخه در ثانیه) است.[۱۱] افزایش فرکانس باعث افزایش میزان توان مصرفی در پردازنده می شود. افزایش مصرف انرژی پردازنده در نهایت منجر به لغو پردازنده های Tejas و Jayhawk اینتل در 8 مه 2004 شد ، که به طور کلی به عنوان پایان افزایش فرکانس به عنوان الگوی غالب معماری رایانه ذکر می شود.[۱۲] برای مقابله با مشکل مصرف برق و گرم شدن بیش از حد واحد پردازش مرکزی اصلی (CPU یا پردازنده) ، تولیدکنندگان شروع به تولید پردازنده های چند هسته ای کارامد از نظر مصرف انرژی کردند. هسته واحد محاسباتی پردازنده است و در پردازنده های چند هسته ای هر هسته مستقل است و هسته ها می توانند بطور همزمان به یک حافظه دسترسی داشته باشد. پردازنده های چند هسته ای رایانش موازی را به رایانه های خانگی آورده اند. بنابراین موازی سازی برنامه های سریالی تبدیل به کار اصلی برنامه نویسی شده است. در سال 2012 پردازنده های چهار هسته ای در رایانه های خانگی معمول شدند ، در حالی که سرورها دارای 10 یا 12 هسته ی پردازنده بودند. از قانون مور می توان پیش بینی کرد که تعداد هسته ها در هر پردازنده هر 18-24 ماه دو برابر شود. این می تواند به این معنی باشد که پس از سال 2020 یک پردازنده معمولی ده ها یا صدها هسته دارد.[۱۳]
یک سیستم عامل باید اطمینان حاصل کند که وظایف مختلف و برنامه های کاربر به طور موازی بر روی هسته های موجود اجرا می شوند. با این وجود ، برای اینکه یک برنامه نرم افزاری سریالی از معماری چند هسته ای کاملاً بهره ببرد ، برنامه نویس باید ساختار کد آن را تغییر دهد و این را موازی سازی کند. سرعت بخشیدن به زمان اجرای نرم افزار اپلیکیشن دیگر از طریق افزایش فرکانس امکان پذیر نیست ، و در عوض برنامه نویسان برای استفاده از قدرت محاسباتی فزاینده معماری های چند هسته ای ، باید کد نرم افزار خود را موازی سازی کنند.[۱۴]
قانون آمدال و قانون گوستافسون
در حالت مطلوب ، افزایش سرعت از طریق موازی سازی خطی خواهد بود - دو برابر شدن تعداد عناصر پردازش گر باید زمان اجرا را به نصف کاهش دهد و اگر تعداد عناصر پردازشگر برای بار دوم دو برابر شود، باز هم باید زمان اجرا نصف شود . با این حال ، تعداد بسیار کمی از الگوریتم های موازی افزایش سرعت بهینه را به دست می آورند. بیشتر آنها برای تعداد کمی از عناصر پردازش گر افزایش سرعت تقریباً خطی دارند که برای تعداد زیاد به یک مقدار ثابت می رسد و صاف می شود.
افزایش سرعت بالقوه یک الگوریتم در یک سیستم رایانش موازی توسط قانون آمدال بدست می آید:[۱۵]
که در آن:
- Slatency، افزایش سرعت بالقوه در تأخیر اجرای کل کار است؛
- s افزایش سرعت در تأخیر اجرای قسمت قابل موازی سازی کار است.
- p درصدی از زمان کل اجرای برنامه است که متعلق به بخشی از برنامه است که قابل موازی سازی است.
از آنجا که Slatency < 1/(1 - p)، این نشان می دهد که قسمت کوچکی از برنامه که نمی تواند موازی سازی شود ، افزایش سرعت(speedup) کلی حاصل از موازی سازی را محدود می کند. برنامه ای که یک مسئله بزرگ ریاضی یا مهندسی را حل می کند ، معمولاً از چندین قسمت قابل موازی سازی و چند قسمت غیر قابل موازی (متوالی) تشکیل می شود. اگر قسمت غیر قابل موازی سازی یک برنامه 10٪ از کل زمان اجرا را تشکیل دهد (0.9 = p) ، هر قدر تعداد پردازنده ها را افزایش دهیم، نمی توانیم بیش از 10 برابر افزایش سرعت داشته باشیم. این امر موجب یک محدودیت حداکثری در رابطه با سودمندی افزودن واحدهای اجرایی موازی بیشتر می شود. "وقتی یک کار به دلیل محدودیت های ناشی از توالی قابل تقسیم نیست ، اعمال تلاش بیشتر هیچ تاثیری در زمانبندی آن ندارد. طول دوره ی حاملگی نه ماه است ، مهم نیست که چند زن به آن اختصاص داده شود."[۱۶]
قانون آمدال فقط در مواردی اعمال می شود که اندازه مسأله ثابت باشد. در عمل ، با در دسترس قرار گرفتن منابع محاسباتی بیشتر ، آنها تمایل دارند که از مسأله های بزرگتر (مجموعه داده های بزرگتر) استفاده کنند ، و زمان صرف شده در قسمت قابل موازی سازی اغلب سریعتر از کار ذاتا سریالی رشد می کند.[۱۷] در این حالت ، قانون گوستافسون ارزیابی کمتر بدبینانه و بیشتر واقع بینانه از کارایی موازی سازی ارائه می دهد:[۱۸]
هر دو قانون آمدال و گوستافسون فرض می کنند که زمان اجرای قسمت متوالی برنامه مستقل از تعداد پردازنده ها است. قانون آمدال فرض می کند که کل مساله دارای اندازه ثابت است به طوری که کل کار انجام شده به طور موازی نیز مستقل از تعداد پردازنده ها است ، در حالی که قانون گوستافسون فرض می کند که کل کار انجام شده به صورت موازی ارتباط خطی با تعداد پردازنده ها دارد.
وابستگی ها
درک وابستگی داده ها در اجرای الگوریتم های موازی اساسی است. هیچ برنامه ای نمی تواند سریعتر از طولانی ترین زنجیره محاسبات وابسته (معروف به مسیر بحرانی) اجرا شود ، زیرا محاسباتی که به محاسبات قبلی در زنجیره بستگی دارند باید به ترتیب اجرا شوند. با این حال ، بیشتر الگوریتم ها فقط از یک زنجیره طولانی محاسبات وابسته تشکیل نشده اند. معمولاً فرصت هایی برای اجرای محاسبات مستقل به طور موازی وجود دارد.
فرض کنید Pi و Pj دو بخش برنامه باشند. شرایط برنشتاین[۱۹] زمانی را توصیف می کند که این دو مستقل باشند و بتوانند به طور موازی اجرا شوند. برای Pi ، فرض کنید Ii همه متغیرهای ورودی و Oi متغیرهای خروجی باشند ، و به همین شکل، برای Pj. دو قسمت Pi و Pj در صورت براورده کردن شرایط زیر مستقل هستند
نقض شرط اول وابستگی جریان را ایجاد می کند ، به این معنی که اولین بخش نتیجه ای تولید می کند که توسط بخش دوم استفاده میشود. شرط دوم نشان دهنده ی ضد وابستگی است، بدین معنی که قطعه دوم متغیر مورد نیاز بخش اول را تولید می کند. شرط سوم و نهایی وابستگی خروجی را نشان می دهد: وقتی دو بخش در یک مکان بنویسند ، نتیجه ی نهایی مربوط به آخرین قسمت اجرا شده از نظر منطقی است.[۲۰]
توابع زیر را در نظر بگیرید ، که انواع مختلفی از وابستگی ها را نشان می دهد:
1: function Dep(a, b) 2: c := a * b 3: d := 3 * c 4: end function
در این مثال ، دستورالعمل 3 نمی تواند قبل از (یا حتی به موازات) دستورالعمل 2 اجرا شود ، زیرا دستورالعمل 3 از نتیجه دستورالعمل 2 استفاده می کند. این کار شرط اول را نقض می کند ، بنابراین وابستگی جریان را ایجاد می کند.
1: function NoDep(a, b) 2: c := a * b 3: d := 3 * b 4: e := a + b 5: end function
در این مثال ، هیچ وابستگی بین دستورالعمل ها وجود ندارد ، بنابراین می توان همه آنها را به طور موازی اجرا کرد.
شرایط برنشتاین اجازه نمی دهد حافظه بین فرآیندهای مختلف تقسیم شود. برای این کار ، برخی از ابزارهای اعمال نظم بین دسترسی ها لازم است؛ مانند سمافورها ، موانع یا سایر روش های همگام سازی.
برنامهنویسی موازی
برنامهنویسی موازی (به انگلیسی: Parallel Programming) برای استفاده هر چه بهتر از منابع سیستم و افزایش سرعت و کارایی برنامه روی پردازندهها به وجود آمد. در این نوع برنامهنویسی، قسمتهایی از برنامه اصلی که قابلیت اجرای همزمان (به انگلیسی: Concurrent) را دارند به چند زیربرنامه تقسیم شده و به صورت همزمان روی چند پردازنده یا چند نخ (en:Thread) اجرا میشوند. قسمتی از برنامه هم که قابلیت اجرای موازی (به انگلیسی: Parallel) را ندارد به صورت سریال روی یک پردازنده اجرا میشود. در واقع تفاوت اصلی برنامهسازی ترتیبی و موازی همین امر میباشد، اما در پی آن مفاهیم متعددی مطرح میشود که اغلب در برنامهنویسی معمولی مطرح نبوده و یا ماهیت آنها با مفهوم متناظر آن در برنامهنویسی معمولی کاملاً متفاوت است.
یکی از دلایل اصلی استفاده از برنامهنویسی موازی، بحث افزایش سرعت اجرای برنامه میباشد، که این امر در پردازندههای تک هستهای دارای محدودیتهای زیر میباشد:
- افزایش تعداد ترانزیستورهای پردازنده برای بدست آوردن سرعت بیشتر، باعث افزایش توان مصرفی خواهد شد که اگر تعداد این ترانزیستورها زیاد باشد، گرمای ایجاد شده ناشی از توان مصرفی پردازنده باعث ذوب شدن آن خواهد شد.
- باید به این نکته توجه داشت که اگر پردازندهها بسیار قوی باشند، به دلیل اینکه هر دسترسی به حافظه به چندین کلاک پردازنده نیاز دارد، محدودیت سرعت دسترسی به حافظه باعث خواهد شد پردازنده زمانی را برای نوشتن در یا خواندن از حافظه منتظر بماند و در نتیجه از تمام توان مصرفی آن استفاده نشود.
تاریخچه
دهه ۱۹۵۰
ایده استفاده از موازی سازی چنددستور، چندداده (به انگلیسی: Multiple Instruction, Multiple Data) یا به اختصار (en:MIMD) به سال ۱۹۵۴ بر میگردد، جایی که اولین کامپیوتر تجاری محاسبات اعداد ممیز شناور توسط جن آمدال در شرکت آی بی ام با نام ۷۰۴ تولید شد. در آوریل ۱۹۵۸ اس. جیل (فرانتی)، بحث انشعاب و انتظار را در برنامهنویسی موازی مطرح کرد. همچنین در همین سال دو تن از محققان شرکت آی بی ام به نامهای جان کوک و دنییل اسلوتنیک، ایده استفاده از موازی سازی در محاسبات عددی را برای اولین بار مطرح کردند.
دهه ۱۹۶۰
در سال ۱۹۶۲ شرکت باروز، کامپیوتر دی ۸۲۵ که دارای ۴ پردازنده و توانایی دسترسی به ۱۶ ماژول حافظه از طریق سوییچ چلیپایی بود را معرفی کرد. در سال ۱۹۶۷، آمدال و اسلوتنیک در کنفرانس پردازش اطلاعات در آمریکا، قانون آمدال را معرفی کردند که محدودیت افزایش سرعت در برابر موازی سازی را مطرح میکند. در سال ۱۹۶۹ شرکت هانی ول، سیستم چندپردازندهای را معرفی کرد که دارای ۸ پردازنده به صورت موازی بود.
دهه ۱۹۸۰
اولین کامپیوتر مدرن یک دستور، چند داده (به انگلیسی: Single Instruction, Multiple Data) یا به اختصار (en:SIMD) در سال ۱۹۸۷ با نام ماشین متفکر توسط دنی هیلز و شرلی هندلر بازسازی شد.
دهه ۱۹۹۰
در دهه 19۹۰ تولید کامپیوترهای یک دستور، چندداده روند رو به رشدی پیدا کردند، در سال ۱۹۹۵ شرکت سانمیکروسیستم UltraSPARC را معرفی کرد. همچنین شرکت اینتل در سال ۱۹۹۶ اولین کامپیوتر رو میزی دارای سیستم یکدستور، چندداده برای سیستمهای ۳۲ بیتی معرفی کرد. در سال ۱۹۹۶ استاندارد (en:POSIX Threads) برای برنامهنویسی چند نخی معرفی شد. همچنین در این دهه معماری (en:OpenMP) در سال ۱۹۹۷ برای برنامه نویسی سیستمهای موازی با زبان فرترن معرفی گردید، و در سال ۱۹۹۸ نیز نسخه C/C++ این معماری معرفی شد.
سال ۲۰۰۰ تا کنون
از سال ۲۰۰۰ تا کنون نسخههای بهبود یافتهای از OpenMP ارائه شده است. در سال ۲۰۰۰ نسخه ۲٫۰ فرترن و در سال ۲۰۰۲ نسخه ۲٫۰ سی پلاس پلاس OpenMP ارائه شد. نسخه ۲٫۵ در سال ۲۰۰۵ و نسخه ۳٫۰ در سال ۲۰۰۸ ارائه شد. نسخه ۴٫۰ برنامه در سال ۲۰۱۲ ارائه شد.
ارتباط بین پردازش ها
پردازشها (به انگلیسی: Process) در برنامهنویسی موازی برای انجام محاسبات خود نیاز به برقراری ارتباط با یکدیگر دارند، که روشهای زیر برای این کار میباشند:
- حافظه اشتراکی (en: Shared Memory)
- تبادل پیام (en: Message Passing)
- مدل ضمنی (به انگلیسی: Implicit)
حافظه اشتراکی
در حافظه اشتراکی، وظایف (به انگلیسی: Task) موازی برای برقراری ارتباط با یکدیگر از یک فضای آدرس اشتراکی که توانایی نوشتن و خواندن غیرهمزمان (به انگلیسی: asynchronous) را دارد استفاده میکنند. در این حالت برای کنترل دسترسیهای همزمان (به انگلیسی: synchronous) وظایف به این آدرسها نیاز به مکانیزمهایی مانند قفلها، سمافورها و مانیتورها میباشد.
تبادل پیام
در این روش، وظایف موازی دادههای مورد نیاز را از طریق پیام برای یکدیگر ارسال میکنند، که این ارتباطات میتوانند همزمان یا غیرهمزمان باشند. در روش غیرهمزمان فرستنده پیام خود را بدون توجه به آمادگی گیرنده ارسال میکند.
مدل ضمنی
در این مدل، ارتباط بین وظایف بدون دخالت برنامهنویس انجام میشود. به این صورت که کامپایلر این کار را انجام میدهد.
اصول برنامه نویسی موازی
یافتن موازات کافی در برنامه(قانون آمدال)
طبق قانون آمدال در برنامهنویسی موازی، باید طوری برنامه را به دو قسمت موازی و سریال تقسیم کرد، که مقدار سرباری (به انگلیسی: Overhead) که به سیستم به دلیل تقسیم وظایف میان نخها/پردازندهها تحمیل میشود از مقدار سودی که بدلیل موازی کردن برنامه بدست میآوریم کمتر باشد.
دانه دانه کردن
هنگام تقسیم وظایف، باید به اندازه قسمتی از برنامه که قرار است به صورت موازی اجرا شود توجه داشت. به این صورت که در صورت زیاد بودن تعداد آنها و کوچک بودن این قسمتها سربار بسیار زیادی به سیستم تحمیل خواهد شد، و در صورتی که اندازه این قسمتها بسیار بزرگ باشد، در آن صورت این قسمتها تقریباً به صورت سریال اجرا میشود که افزایش سرعتی در این حالت نخواهیم داشت.
محلی سازی
سرعت دسترسی به حافظههای دارای حجم بالا کم بوده، و سرعت دسترسی به حافظههای دارای حجم پایین زیاد میباشد. با توجه به این امر، برنامهنویس باید طوری عمل کند که الگوریتمهای موجود در برنامه باید بیشتر کار خود را روی دادههای موجود در حافظه محلی (به انگلیسی: Local Memory) انجام دهند.
عدم تعادل بار
عدم تعادل بار (به انگلیسی: Load Imbalance) به حالتی گفته میشود که در آن بعضی از پردازندهها در برخی زمانها به دلایل زیر کاری را انجام نمیدهند:
- موزات ناکافی.
- وظایف غیرهماندازه.
تعادل بار به دو صورت ایستا (به انگلیسی: Static)، یا پویا (به انگلیسی: Dynamic) در زمان اجرا انجام میپذیرد.
همگام سازی
بسیاری از الگوریتمهایی که برای اجرای موازی فرمانهای، موازیسازی میشوند، الگوریتمهایی هستند که پردازشهای موازی حاصل از آنها بدون نیاز به ارتباط با دیگر پردازشها، به محاسبات خود پرداخته و آن را ادامه میدهند. اما الگوریتمهای دیگری نیز وجود دارند که در آنها هر پردازنده محاسبات تکراری یکسانی را روی یک جزء متمایز دادهای انجام میدهد، اما پردازندهها باید در انتهای هر تکرار با یکدیگر همگام (به انگلیسی: Sync) شوند و نتایج میانی خود را در اختیار دیگر پردازندهها قرار دهند. یک روش مورد استفاده برای همگامسازی استفاده از حصاربند (به انگلیسی: Barrier) است که در این روش پردازشهای اولیه که دستورالعمل حصاربندی را اجرا میکنند تا زمانی که تمام پردازشهای دیگر وارد این نقطه شوند، در انتظار باقی میمانند.
شرایط مسابقه
شرایط مسابقه (به انگلیسی: Race Condition) یکی از خطاهای رایج در برنامه نویسی موازی به دلیل دسترسی همزمان وظایف به منابع میباشد که این خطاها به صورت غیرقطعی بوده (به انگلیسی: non-deterministic) و لذا تشخیص آنها سخت میباشد. برای جلوگیری از به وجود آمدن این شرایط میتوان از قفلهای سختافزاری یا نرمافزاری استفاده کرد.
ابزارهای برنامه نویسی موازی
با استفاده از ابزارها، برنامهنویس میتواند خود به طراحی روند اجرای موازی برنامه بپردازد و برای اموری مانند متغیرهای اشتراکی، وابستگی ورودی و خروجی رشتههای موازی، ارتباط میان رشتههای پردازشی یا پردازهها و تجزیهپذیری بنیادی راهحل مسئله مورد نظر تصمیم بگیرد و شیوه توزیع شدن محاسبه، متغیرها و اشیا را طراحی کند. این دسته ابزارها خود به دو گروه عمده تقسیم میشوند:
- ابزارهای برنامهسازی برای سیستمهای دارای حافظه اشتراکی
- ابزارهای برنامهنویسی برای سیستمهای دارای حافظه توزیعشده (en: Distributed Memory).
ابزارهای برنامه نویسی حافظه اشتراکی
POSIX Threads
مجموعهای از کتابخانههای استاندارد به زبان C، که دارای توابعی برای برنامهنویسی موازی چندنخی میباشد و معمولاً با عنوان Pthreads شناخته میشود. در Pthreads نخها از یک فضای آدرس دهی مشترک استفاده میکنند که کنترل و همگامسازی دسترسی نخها به این حافظه بر عهده برنامه نویس میباشد. همچنین هر نخ فضای آدرس مخصوص به خود را دارد. Pthreads برای برنامههای که دارای ویژگیهای زیر هستند، میتواند مناسب باشد:
- چند وظیفه به صورت همزمان، قابلیت اجرای پردازش روی دادههای برنامه را داشته باشند.
- قطعههای از برنامه که زمان زیادی را منتظر ورودی/خروجی میمانند.
- برنامههایی که در آنها برخی کارها نسبت به بقیه دارای اولویت باشد.(وقفههای اولویت)
دلایل استفاده از Pthreads
- Pthreads، هنگام اجرای برنامه کار پردازنده را با کار ورودی/خروجی همپوشانی میسازد.
- نخها با سربار بسیار کمتری نسبت به پردازشها در سیستم ایجاد میشوند.
- تمام نخها در داخل یک پردازش، از یک فضای آدرس اشتراکی استفاده میکنند.
OpenMP(open multi-processing)
OpenMP یک واسط برنامه نویسی کاربردی (en: API) برای برنامهنویسی موازی رشتهها در سیستمهای حافظه اشتراکی با یکی از سه زبان C، C++ یا فورترن است و از معماریهای مختلفی از جمله پلتفرمهای ویندوز و یونیکس پشتیبانی میکند. البته تولیدکنندگان کامپایلر برای زبانهای دیگر از جمله جاوا نیز امکان نوشتن برنامه با رابط OpenMP را فراهم کردهاند. باید توجه داشت، OpenMP تضمین نمیکند که از حافظه اشتراکی استفاده بهینه خواهد کرد. همچنین مواردی مانند وابستگی دادهها، شرایط مسابقه یا بنبستها(به انگلیسی: deadlock) باید توسط خود برنامه نویس در کد برنامه کنترل شود وOpenMP عموماً نمیتواند کاری درباره آنها انجام دهد. همزمان سازی ورودی و خروجی هنگام دسترسی موازی و چک کردن ترتیب اجرای کد برنامه نیز از جمله وظایف برنامه نویس است و از عهده OpenMP خارج است. بهاین ترتیب، برنامهنویس باید ساختار کد و الگوریتم خود را کاملاً کنترل کرده و اطمینان حاصل کند که موارد ذکر شده در اجرای برنامه رخ نخواهد داد.
دلایل و مزایای استفاده از OpenMP
- سختی استفاده از کتابخانههای مربوط به نخها، رابطهایی (به انگلیسی: Interface) مانند Pthreads دارای تعداد زیادی فراخوانی کتابخانهای (به انگلیسی: Library Call) برای مقدار دهی اولیه(به انگلیسی: Initialization)، همگام سازی، ساخت نخ و دیگر کارها دارند.
- سادگی انجام موازیسازی برنامه سریال با برچسب زنی(به انگلیسی: Annotation) کد برنامه که موازات را نشان میدهد.
- مقیاس پذیری (به انگلیسی: Scalibility) و کارایی خوب در صورت استفاده صحیح.
- قابل حمل بودن(به انگلیسی: Portable) برنامه نوشته شده با OpenMP، به دلیل پشتیبانی بسیاری از کامپایلرها از OpenMP.
- عدم نیاز به برنامه نویسیهای پیچیده توسط برنامه نویس.
- اجرا شدن هر نخ برنامه در OpenMP توسط نخهای سختافزاری.
ابزارهای برنامهنویسی سیستمهای دارای حافظه توزیعیافته
رابط عبور پیام
متداولترین شیوه برنامهنویسی موازی استفاده از MPI میباشد. رابط عبور پیام، ویژگیهای یک واسط برنامه نویسی کاربردی کلی برای برنامهنویسی موازی را برای سیستمهای دارای حافظه توزیعیافته مانند کلاسترهای تیغهای و مجموعه آنها تعیین میکند و به خودی خود یک ابزار نیست، بلکه یک طرح ویژگیها (به انگلیسی: Specification) و یک پروتکل ارتباطی به شمار میرود و همانگونه که از نامش پیداست، شیوه صحبت کردن سیستمهای موازی با هم را تعیین میکنند. مهمترین مزیت روش رابط عبور پیام به سایر روشهای عبور پیام، قابل حمل بودن و سرعت بالای آن میباشد. سرعت بالای این روش به این دلیل است که هنگام اجرا بر روی هر سختافزاری برای آن سختافزار بهینه میشود. مزیت بزرگ دیگر این روش، توانایی فراخوانی توابع آن با زبانهای C++، C، فورترن، جاوا، C# و پایتون میباشد.
زبانهای برنامهنویسی موازی
زبان های برنامه نویسی همزمان، کتابخانه ها، رابط های برنامه کاربردی، و مدل های برنامه نویسی موازی (مانند اسکلت الگوریتمی) برای برنامه نویسی موازی کامپیوترها ایجاد شده است.این به طور کلی به چند کلاس بر مبنای حافظه معماری مشترک ، حافظه توزیع شده و حافظه توزیع شده مشترک تقسیم میشود.
زبان های برنامه نویسی حافظه مشترک با دستکاری متغیرهای حافظه مشترک ارتباط برقرار کنید. حافظه توزیع شده از عبور پیام استفاده میکنند.ترد های POSIX و OpenMP هردو بیشتر از رابط های برنامه های کاربردی حافظه مشترک استفاده میکنند،درحالی که رابط عبور پیام (MPI) بیشتر از رابط های برنامه کاربردی سیستم عبور پیام استفاده میکند. [۲۱]
در کنار رهیافتهایی مانند MPI و OpenMP که قابلیتهای مورد نیاز برای برنامهنویسی موازی با زبانهای شناختهشدهای مانند C و فرترن را فراهم میآورند، شمار قابل توجهی زبان برنامهنویسی مستقل، از اساس برای نوشتن کدهای پردازش موازی ایجاد شدهاند.
لیندا
لیندا به دستهای از زبانهای برنامهنویسی موازی تعلق دارد که در آنها تقسیم کارهای درون برنامه به رشتهها و فرستادن رشتهها به پردازندهها باید به طور صریح در متن کد مشخص شود، اما ارتباط میان رشتههای ایجادشده بر عهده برنامهنویس نیست.
لیندا به خودی خود یک زبان قابل استفاده مستقیم نیست و به اصطلاح یک زبان هماهنگسازی (به انگلیسی: Coordination) خوانده میشود. پیادهسازیهایی از آن برای بسیاری از زبانهای برنامهنویسی و اسکریپتنویسی متداول، از جمله جاوا، C و C++، پایتون و روبی ارائه شدهاست. خصلت اصلی لیندا آن است که به جای مدل ارتباط نقطه به نقطه که در بیشتر رهیافتهای برنامهنویسی موازی دنبال میشود، مفهومی به نام فضای چندگانه (به انگلیسی: tuple space) را ارائه میکند که بستر اصلی موازیسازی در مدل این زبان است. فضای چندگانه یک مخزن عمومی دادهها است که دادهها را میتوان در آن ذخیره و سپس از آن بازیابی کرد.[۲۲]
ارلنگ
ارلنگ یک زبان زمان اجرا است که از ابتدا با هدف مستقیم ایجاد برنامههای موازی بیدرنگ با آستانه تحمل خطای بالا و تا حد زیادی با در نظر داشتن سیستمهای مخابراتی نوشتهشدهاست. ارتباط میان پردازشها در ارلنگ صریح است و همانند OpenMP باید توسط برنامهنویس تعیین شود، اما بر خلافOpenMP، ارلنگ از تبادل پیام برای ارتباط میان روندها استفاده میشود. ارلنگ زبانی مبتنی بر تابعها است، به این مفهوم که پردازش دادهها در یک برنامه ارلنگ در قالب محاسبه تابعهای ریاضی صورت میپذیرد و تقریباً همه چیز با تعریف کردن تابعها انجام میشود. موازیسازی پردازش در ارلنگ با تعریف کردن روندهایی که اشتراکی با هم ندارند، انجام میشود. ارتباط میان این روندها توسط یک سیستم تبادل پیام ناهمگام انجام میشود.[۲۲]
چارم++
چارم++، زبانی مبتنی بر C++ است که با هدف آسان کردن برنامهنویسی موازی و با ارائه قابلیتهای برنامهنویسی موازی در سطح بالایی از انتزاع ارائه شده است. مبنای موازیسازی برنامه در چارم++، بر تجزیهکردن برنامه به شماری شیء به نام Chare است. Chareها با یکدیگر تعامل دارند و به پیامها وابسته هستند. Chareها در زمان اجرای برنامه با یک سیستم زمان اجرای پویا به پردازندههای مختلف متناظر میشوند که چارم++، امکان تغییر دادن این تناظر هنگام اجرای برنامه را فراهم میآورد. چنین امکانی برای متعادل کردن بار پردازشی روی پردازندهها در زمان اجرا مفید است. امکان برنامهنویسی با شیوهای مبتنی بر رابط عبوری پیام، نیز با ارائه یک پیادهسازی از آن به نام رابط عبوری تطبیقی پیام به اختصار AMPI در لایهای روی چارم++، فراهم شده است.[۲۲]
Unified Parallel C
زبانی بر پایه C99 است که قابلیتهای آن را برای برنامهنویسی موازی برای سیستمهای دارای حافظه اشتراکی یا توزیعیافته گسترش میدهد. مبنای برنامهنویسی در UPC بر پایه اشتراک داده میان پردازندههای مختلف است، به گونهای که همه پردازندهها به تمام متغیرها در برنامه دسترسی دارند، اما هر متغیر در اصل به یک پردازنده مشخص تعلق دارد. موازیسازی برنامه هنگام آغاز اجرا شدن آن تعیین میشود و در طول اجرا تغییر نمیکند، زیرا تناظر میان متغیرها با پردازندهها را در میانه اجرای برنامه نمیتوان تغییر داد. برای نوشتن برنامههای پردازش موازی به اینگونه، UPC چهار دسته ساختار به ابزارهای عادی C میافزاید:
- یک مدل صریح اجرای موازی.
- فضای حافظه اشتراکی.
- شیوههایی برای همگامسازی متغیرها
- مدلی برای بررسی سازگاری درونی حافظه اشتراکی و شیوههایی برای مدیریت حافظه.[۲۲]
کاربرد های پردازش موازی
پیش بینی وضعیت اب و هوایی : استفاده از مدل های ریاضی از اقیانوس و جو و گرفتن مشاهدات فعلی آب و هوا و پردازش این داده ها با مدل های کامپیوتری برای پیش بینی وضعیت آینده آب و هوا.
مسائل اقتصادی جامعه : پردازش موازی برای مدل سازی اقتصاد یک جهان یا ملت استفاده می شود. سیستم برنامه ها که شامل دستگاه های محاسبه خوشه ای هستند ، برای پیاده سازی الگوریتم های موازی در راستای بهینه سازی در چنین مدل های اقتصادی استفاده می شود.
هوش مصنوعی و اتوماسیون : هوش مصنوعی یا هوش ماشینی (به انگلیسی: Artificial Intelligence)هوشی که یک ماشین در شرایط مختلف از خود نشان میدهد، گفته میشود.که در این سیستم ها تا حد زیادی از پردازش موازی استفاده میشود.به عنوان مثال در 4 عمل 1)پردازش تصویر 2)پردازش زبان های طبیعی 3) تشخیص الگوها 4)سیستم های خبره ف پردازش موازی کاربرد دارد.
نرمافزار پزشکی: پردازش موازی در پردازش تصویر پزشکی استفاده می شود.به عنوان مثال برای اسکن بدن انسان و اسکن مغز انسان ، در بازسازی MRI برای تشخیص مهره ها استفاده میشود.
منابع
- ↑ Gottlieb, Allan; Almasi, George S. (1989). Highly parallel computing. Redwood City, Calif.: Benjamin/Cummings. ISBN 978-0-8053-0177-9.
- ↑ S.V. Adve et al. (November 2008). "Parallel Computing Research at Illinois: The UPCRC Agenda" بایگانیشده در ۲۰۱۸-۰۱-۱۱ توسط Wayback Machine (PDF). Parallel@Illinois, University of Illinois at Urbana-Champaign. "The main techniques for these performance benefits—increased clock frequency and smarter but increasingly complex architectures—are now hitting the so-called power wall. The computer industry has accepted that future performance increases must largely come from increasing the number of processors (or cores) on a die, rather than making a single core go faster."
- ↑ Asanovic et al. Old [conventional wisdom]: Power is free, but transistors are expensive. New [conventional wisdom] is [that] power is expensive, but transistors are "free".
- ↑ Asanovic, Krste et al. (December 18, 2006). "The Landscape of Parallel Computing Research: A View from Berkeley" (PDF). University of California, Berkeley. Technical Report No. UCB/EECS-2006-183. "Old [conventional wisdom]: Increasing clock frequency is the primary method of improving processor performance. New [conventional wisdom]: Increasing parallelism is the primary method of improving processor performance… Even representatives from Intel, a company generally associated with the 'higher clock-speed is better' position, warned that traditional approaches to maximizing performance through maximizing clock speed have been pushed to their limits."
- ↑ "Concurrency is not Parallelism", Waza conference Jan 11, 2012, Rob Pike (slides بایگانیشده در ۲۰۱۵-۰۷-۳۰ توسط Wayback Machine) (video)
- ↑ "Parallelism vs. Concurrency". Haskell Wiki.
- ↑ Hennessy, John L.; Patterson, David A.; Larus, James R. (1999). Computer organization and design: the hardware/software interface (2. ed., 3rd print. ed.). San Francisco: Kaufmann. ISBN 978-1-55860-428-5.
- ↑ ۸٫۰ ۸٫۱ Barney, Blaise. "Introduction to Parallel Computing". Lawrence Livermore National Laboratory. Retrieved 2007-11-09.
- ↑ Thomas Rauber; Gudula Rünger (2013). Parallel Programming: for Multicore and Cluster Systems. Springer Science & Business Media. p. 1. ISBN 9783642378010.
- ↑ Hennessy, John L.; Patterson, David A. (2002). Computer architecture / a quantitative approach (3rd ed.). San Francisco, Calif.: International Thomson. p. 43. ISBN 978-1-55860-724-8.
- ↑ Rabaey, Jan M. (1996). Digital integrated circuits : a design perspective. Upper Saddle River, N.J.: Prentice-Hall. p. 235. ISBN 978-0-13-178609-7.
- ↑ Flynn, Laurie J. (8 May 2004). "Intel Halts Development Of 2 New Microprocessors". New York Times. Retrieved 5 June 2012.
- ↑ Thomas Rauber; Gudula Rünger (2013). Parallel Programming: for Multicore and Cluster Systems. Springer Science & Business Media. p. 2. ISBN 9783642378010.
- ↑ Thomas Rauber; Gudula Rünger (2013). Parallel Programming: for Multicore and Cluster Systems. Springer Science & Business Media. p. 3. ISBN 9783642378010.
- ↑ Amdahl, Gene M. (1967). "Validity of the single processor approach to achieving large scale computing capabilities". Proceeding AFIPS '67 (Spring) Proceedings of the April 18–20, 1967, Spring Joint Computer Conference: 483–485. doi:10.1145/1465482.1465560.
- ↑ Brooks, Frederick P. (1996). The mythical man month essays on software engineering (Anniversary ed., repr. with corr., 5. [Dr.] ed.). Reading, Mass. [u.a.]: Addison-Wesley. ISBN 978-0-201-83595-3.
- ↑ Michael McCool; James Reinders; Arch Robison (2013). Structured Parallel Programming: Patterns for Efficient Computation. Elsevier. p. 61.
- ↑ Gustafson, John L. (May 1988). "Reevaluating Amdahl's law". Communications of the ACM. 31 (5): 532–533. CiteSeerX 10.1.1.509.6892. doi:10.1145/42411.42415. S2CID 33937392. Archived from the original on 2007-09-27.
- ↑ Bernstein, A. J. (1 October 1966). "Analysis of Programs for Parallel Processing". IEEE Transactions on Electronic Computers. EC-15 (5): 757–763. doi:10.1109/PGEC.1966.264565.
- ↑ Roosta, Seyed H. (2000). Parallel processing and parallel algorithms : theory and computation. New York, NY [u.a.]: Springer. p. 114. ISBN 978-0-387-98716-3.
- ↑ ^ The Sidney Fernbach Award given to MPI inventor Bill Gropp refers to MPI as "the dominant HPC communications interface"
- ↑ ۲۲٫۰ ۲۲٫۱ ۲۲٫۲ ۲۲٫۳ «پایگاه اطلاع رسانی ماهنامه شبکه». ۲۸ فروردین ۱۳۹۲.
- جزوه درس برنامه نویسی موازی، فرشاد خونجوش، دانشکده برق و کامپیوتر، دانشگاه شیراز.
- جزوه درس برنامه نویسی موازی، رضا عظیمی، دانشکده برق و کامپیوتر، دانشگاه شیراز.
- PowerPoint lecture, Professor Saman Amarasinghe, MIT, http://groups.csail.mit.edu/cag/ps3/lectures.shtml بایگانیشده در ۳ سپتامبر ۲۰۱۵ توسط Wayback Machine
- PowerPoint lecture, Professors Arvind and Joe Elmer, MIT, http://csg.csail.mit.edu/6.823/lecnotes.html
- Parallel Programming C with MPI and OpenMP By Michael J. Quinn
- List of concurrent and parallel programming languages
- https://www.slideshare.net
- Efficient multitasking: parallel versus serial processing of multiple tasks ,Rico Fischer1 and Franziska Plessow,Front Psychol. 2015; 6: 1366
در ویکیانبار پروندههایی دربارهٔ رایانش موازی موجود است. |