حافظه اصلی در محاسبات موازی یا بهصورت حافظهاشتراکی است یا حافظه توزیع شده. معماری حافظه توزیع شده یا Distributed گاهی بهصورت فیزیکی و گاهی بهصورت منطقی است که در بهترین حالت پردازندههای سیستم در محاسبات موازی باید از حافظههای فیزیکی که بهصورت محلی است، استفاده کنند.
همانطور که میدانید، محاسبات همزمان و موازی بهچند صورت انجام میپذیرد: در حد بیت، خط دستور، اطلاعات و اجرای تکالیف همزمان که هر کدام از این انواع در چیدمان و معماری سیستمهای همزمان تأثیرگذار هستند.
زمانی که پردازندههای کامپیوترها تکهستهای بود، همزمانی اجرای دستورات نرمافزار با استفاده از Multi Threading انجام میشد که اگر چه واقعاً Cuncurrency یا همزمانی مطلق تحقق پیدا نمیکرد، اما با استفاده از نرمافزار امکان اجرای دستورات موازی با استفاده از رشتهپردازشی (Thread) امکانپذیر بود. بهعنوان مثال، در دات نت یا جاوا میتوان نرمافزارهایی را طراحی کرد که چند عمل را بهصورت موازی و همزمان انجام دهند.
از طرفی هر چه که پیش میرویم، هستههای پردازنده کامپیوترها بیشتر و بیشتر میشود. در داتنت 4 که بهتازگی از طرف شرکت مایکروسافت به بازار عرضه شده، قابلیت استفاده از چند پردازنده بیشتر از نسخههای قبلی تقویت شده است.
استفاده از کلاسهایی که در دات نت4 برای اجرای همزمان دستورات وجود دارد، از نسخههای قبلی بسیار آسانتر است تا آنجا که حتی دیگر به استفاده از رشتهپردازشی و Thread Pool نیز بهصورت مستقیم نیازی وجود ندارد ( با استفاده از System.Threading.Tasks در VS2010 میتوان از این قابلیتها استفاده کرد)، یکی از کامپوننتهای داتنت که میتوان تأثیر همزمانی را در آن بیشتر احساس کرد، LINQ است که از نسخه 3 دات نت پا به عرصه وجود گذاشت و تحول عظیمی در سیستمهای نرمافزاری که با پایگاه داده کار میکنند، ایجاد کرد.
LINQ با قابلیت پرسوجو یا Query در منابع اطلاعاتی بهصورت جستوجو در Collection های (ListT) عمل میکند و PLINQ که Parallel LINQ است، اجرای الگوی همزمانی در این جستوجوها است که در داتنت 4 به بازار معرفی شد. در PLINQ هدف استفاده کامل از تمامی پردازشگرها و تمام ظرفیت آنها است.
PLINQ این کار را با تکهتکه کردن منبع اطلاعاتی به تکههای Segment و اجرای جستوجو برای هر Segment در یک رشته بهصورت موازی در چند پردازنده انجام میدهد. که این کار به افزایش سرعت اجرای Queryها کمک میکند.
شاید تا اینجا فکر کنید که همزمانی در اجرای پرسوجوها همیشه سرعت سیستم را بالا میبرد. اما همیشه اینطور نیست و ملاحظاتی وجود دارد که باید در طراحی و اجرای دستورات PLINQ به آن توجه کرد. باید توجه داشت که سرعت بالاتر در PLINQ با استفاده از روشهای خاصی بهوجود میآید.
بهعنوان مثال، اگر اجرای دستوری دو میلی ثانیه زمان بخواهد، اگر به صورت سریال اجرا شود برای اجرای صد دستور دویست میلیثانیه زمان نیاز خواهیم داشت. اما اگر از یک سیستم با چهار هسته استفاده شود سیستم باید درپنجاه میلیثانیه این عملیات را انجام دهد که باعث خواهد شد 150 میلیثانیه صرفهجویی زمانی بهوجود آید.
حال محاسبه کنید اگر یک عملیات یکثانیه طول بکشد، چه میزان صرفهجویی در زمان انجام عملیات بهوجود میآید. در عملیاتی که سرعت، اهمیت بالایی در آن دارد و زمان اجرای آنطولانی است، استفاده از PLINQ کارایی بیشتری به سیستم میدهد.
عواملی را که در افزایش سرعت در جستوجوهای PLINQ تأثیرگذار است، میتوان به چند دسته تقسیم کرد: نخست آنکه باید قبل از استفاده از دستورات PLINQ به هزینهای که پرسوجوها دارند، دقت کرد (مطابق مثال بالا). نکته دیگر دقتکردن بهتعداد هستههایی است که سیستم دارد. تعداد هستههای پردازنده و اختصاص دادن هر عملیات به هسته خاص تأثیر فراوانی در کار خواهد داشت.
عامل دیگر توجه به این موضوع است که در پرسوجو به چه ترتیبی از منابع استفاده میشود و چه ایندکسهایی در پایگاه داده قرار داده شده است. همچنین باید بهتعداد و نوع عملیاتی که PLINQ انجام میدهد، دقت و نوع جمعآوری اطلاعات از آرایهها و فهرستهایی که از جستوجوی هر کدام از منابع اطلاعاتی به دست میآید، توجه کرد. نکته آخر این که نحوه تقسیمبندی یا Partitioning اطلاعات در سگمنتها برای سرعت در جستوجو از اهمیت بالایی برخوردار است.