این درس با مرور کوتاهی از برنامهنویسی موازی به طور کلی آغاز میشود و به طور خاص به مبحث برنامهنویسی چند رشتهای میپردازد. ما از کتابخانهی POSIX threads به عنوان مثال مخروطی استفاده میکنیم، اگرچه اصول یکسان برای اکثر کتابخانههای رشتهها اعمال میشود. برای ایجاد انگیزه در برنامهنویسی موازی، وظیفه زیر را در نظر بگیرید: یک مجموعه از صفحات وب به شما داده میشود که برخی از آنها به یکدیگر پیوند دارند. ما این را با استفاده از یک انتزاع استاندارد از یک گراف جهتدار ترسیم میکنیم که در آن یالهای خروجی نشان دهنده پیوندها هستند. بنابراین، صفحه وب Aدر اینجا حاوی پیوندی به صفحه وب Bاست، و هدف ما این است که بفهمیم وبسایت ما، مثلاً U، چند پیوند به آن اشاره دارد.
این کاری است که یک موتور جستجو ممکن است انجام دهد تا به میزان محبوبیت یک وبسایت کمک کند. اما هیچ راهی برای دانستن اینکه آیا یک صفحه وب دیگر به صفحه وب ما پیوند دارد یا خیر بدون نگاه کردن به صفحه وب ما وجود ندارد. بنابراین، به هر طریقی باید تمام صفحات وب مجموعه خود را بخوانیم. و اگر بخواهیم این کار را با یک پردازنده انجام دهیم، ممکن است زمان زیادی طول بکشد. ابتدا باید صفحه وب A را بخوانیم و سپس وبسایت B و غیره را بخوانیم. خوشبختانه این کار بسیار فلجکننده است، به این معنی که هیچ چیزی در مورد پردازش من از A وجود ندارد، به عبارت دیگر شمارش تعداد پیوندهایی که به وبسایت U دارد وابسته به نحوه پردازش وبسایت B یا C است.
بنابراین، میتوانیم صفحات وب را بین چندین CPUتقسیم کنیم. به عنوان مثال، سه صفحه را به CPU یک، سه صفحه را به CPUدو، و سه صفحه را به CPUسه اختصاص دهیم. حالا هر CPUمیتواند تعداد پیوندهایی که به آن داده شده حساب کند و نتایج را اضافه کنیم تا پاسخ نهایی را دریافت کنیم. با بازگشت به نمودار زمان، میبینیم که با سه CPU، فقط به یک سوم زمان نیاز داریم، و با n CPU میتوانیم به یک سوم زمان نیاز داشته باشیم.
این مهم است که بدانیم ما در اینجا همان میزان کار انجام میدهیم. فرض کنید در تاپیک اصلی خود، ابتدا صفحات وبی که به CPU یک اختصاص داده شده، سپس صفحاتی که به CPU دو و سپس به CPU سه اختصاص داده شدهاند را پردازش میکنیم. در برنامهنویسی موازی، ما این یک رشته محاسباتی طولانی را به سه رشته کوتاهتر تقسیم کردهایم و با دادن آنها به سه CPUمجزا، آنها را به صورت موازی اجرا کردهایم.
به طور کلی، این رویکرد ایدهآل برای برنامهنویسی موازی است، اما در زندگی واقعی، ما همیشه به همان تعداد پردازنده دسترسی نداریم و آنها همیشه در دسترس نیستند. با این وجود، با بیان الگوریتم خود به این شکل، میتوانیم از پردازندههایی که در اختیار داریم بهینه استفاده کنیم و در نتیجه الگوریتمهایمان را بهتر و سریعتر اجرا کنیم.