نوشته شده در مرداد ۷م, ۱۳۸۷ توسط حسین
در بخش قبل یک روش نه چندان آسان معرفی شد که با استفاده از آن میتوان از حداکثر توان پردازندههای چند هستهای استفاده کرد. امروز قصد دارم کتابخانهای را معرفی کنم که با استفاده از آن به سادگی میتوان حلقههای for سنگین را با استفاده از چند هستهی پردازنده سریعتر اجرا کرد. کتابخانهی OpenMP یک کتابخانهی C/C++ است که توسط میکروسافت و به منظور تسهیل برنامهنویسی برای پردازندههای چند هستهای تهیه شده است. اگر ویژوال استودیوی ۲۰۰۸ را نصب کنید، نسخهی ۲ این کتابخانه نیز به صورت خودکار نصب میشود. برای استفاده از این کتابخانه باید ابتدا در تنظیمات پروژه، گزینهی OpenMP Support را به Yes تنظیم کنید (شکل زیر).

سپس فایل omp.h را به لیست فایلهای سرآیه اضافه کنید. برای شروع کار بهتر است مثال قبلی را این بار با این کتابخانه امتحان کنیم. با استفاده از دستور omp_set_num_threads میتوان تعداد رویههای مستقل برای استفاده توسط این کتابخانه را تعیین کرد. مقدار پیش فرض به تعداد هستههای پردازنده است. یکی از پرکاربردترین عبارات(هر چی فکر کردم معادل directive یادم نیومد!) این کتابخانه عبارت parallel هست که میتوانید قبل از حلقهی for به صورت زیر از آن استفاده کنید.

به همین سادگی؛ حالا اگر برنامه را اجرا کنید، حلقهی for به طور خودکار در ۴ رویهی مستقل اجرا خواهد شد. با استفاده از این دو خط برنامه شما میتوانید به راحتی تعداد رویههایی که باید در اجرای حلقه کمک کنند را تعیین کنید. مثال جلسات قبل را با استفاده از این کتابخانه اجرا کردم، زمان اجرا برای حالتی که از دو ریسمان استفاده شد ۵٫۵ ثانیه و برای ۴ ریسمان ۲٫۸۵ ثانیه شد که تقریبا مشابه حالتی است که خودمان ۲ یا ۴ ریسمان را تولید کنیم. حتما استفاده از این کتابخانه راحت تر است! برای یادگیری بیشتر این کتابخانه و امکانات جالب آن به MSDN (راهنمای ویژوال استودیو) مراجعه فرمایید.
In the previous paper, I introduced an approach based on threads to use the maximum power of multicore processors in our programs. Here I introduce a handy library from Microsoft which makes programming for multicore CPUs an amazing work. OpenMP is an efficient library with several directives and functions which helps us to write or migrate codes for multi core CPUs simply by adding some line of codes. If you are using visual studio .net 2005 or 2008, this library is already installed and you can use it. To demonstrate this library we consider the example of the previous paper. To add support of OpenMp in our project, we must open “Project Settings” and change the value “OpenMP Support” to “Yes”. This makes visual studio to load required libraries for OpenMP.

Then we should add header file omp.h at the beggining of our cpp file. Using “omp_set_num_threads” we are able to set the number of threads which should be used by OpenMp library. The default value is equal to the number of CPU cores. One of the most important directive in this library is the “parallel” directive which can be used before heavy “for” loops to tell that the following loop must be shared between several cores of the processor. You can use it as follows:

Thats all! you have not to create separated threads and manage them, all of the works will be done by OpenMP. Using this code with omp_set_num_threads(2) the program takes about 5.5 seconds on Q6600 processor and with omp_set_num_threads(4) about 2.85 seconds. These values are almost the same as in the previous paper which we created threads mannualy. But I think OpenMP is easier!. For more information on OpenMP see MSDN (Visual Studio Help)
نوشته شده در تیر ۲۸م, ۱۳۸۷ توسط حسین
نوشته شده در تیر ۲۸م, ۱۳۸۷ توسط حسین
همان طور که در پست “وقتی تکنولوژی کم میآورد” گفتم در این سالهای اخیر پردازندههای چند هستهای رشد چشم گیری داشتهاند. امروز قصد داریم ببینیم این افزایش تعداد هستهها چه فایدهای دارد؟ شاید خیلی از شما بعد از خرید یک پردازندهی ۲ هستهای مثل E8400 یا پردازندهی ۴ هستهای مثل Q6600 چندان احساس افزایش کارایی در سیستم خود نکرده باشید! برای مثال قبلا نرمافزاری مثل مدیا استودیو در عرض بیست دقیقه فیلم شما را تولید میکرد و الان هم همین اتفاق میافتد. تفاوت در چیست؟ از این پس فرض میکنیم شما یک پردازندهی چهارهستهای دارید.

اگر نگاهی به Task Manager بیندازید ملاحظه میکنید که به جای تک گراف سبز رنگی که قبلا میدیدید، الان ۴ گراف کوچک وجود دارد که هر کدام نمایندهی یک cpu است. حال اگر درحین اجرای یک برنامهی سنگین این گرافها را ببینید ملاحظه میکنید که تنها یکی از این گرافها در حالت بیشینه(۱۰۰%) است و سه گراف دیگر روی ۰% قرار دارند. گراف کلی مصرف پردازنده هم تنها ۲۵% مصرف را نشان میدهد. این وضعیت بیانگر این است که آن برنامهی سنگین، تنها میتواند از توان یک پردازنده استفاده کند. متاسفانه این وضعیت برای اکثر نرمافزارهای موجود وجود دارد و از این رو شما هیچ سودی از تعویض پردازندهتان نکردهاید! از ویندوز هم که انتظار نمیرود قدرت توزیع پردازشهای یک برنامه روی چند پردازنده را داشته باشد.
نگران نباشید برای اینکه به پردازندهی خود افتخار کنید!، اینبار چند برنامهی سنگین را اجرا کنید؛ ملاحظه میکنید که هر کدام از این برنامهها از یک پردازنده استفاده کرده و کارایی کاملی از خود به نمایش میگذارند، مثلا اگر چهار برنامه، در حال کار سنگین باشند؛ هر چهار پردازنده مشغول شده و مصرف کلی به ۱۰۰% میرسد. در چنین زمانی پردازندهی شما مثل چهار پردازندهی تک هستهای عمل میکند. خوش به حالتون!
خوب شاید شما به عنوان یک برنامه نویس بخواهید برنامهای بنویسید که از هر چهار هسته استفاده کند؛ چنین کاری البته شود و لیک به خون جگر شود!
در پست بعدی یک روش تقریبا آسان برای استفاده از حداکثر کارایی پردازندههای چندهستهای بیان خواهیم کرد.
——————————————————————————————————————–
Nowadays multi core processors are well developed and distributed through the world. Here we are going to find whether these CPUs are beneficial or not. You may don’t experience a better performance when installing new Quad Core CPU like Q6600 or Dual Core one like E8400. Here I will describe the reasons. From now on I assume that you have a Quad Core CPU.

Take a look on the performance graph of the Task Manager; you will see 4 small graphs instead of traditional single graph. Each graph represents one core of your CPU. Now run a heavy program and trace the graphs, you will see that only one graph is in maximum load and the others are not affected at all; the global CPU usage is about 25%. This is because your program can not use the power of 4 processing cores and also windows can not distribute the work load on all CPUs. So in this case no improvements happened and this multi core CPU is not different from single core CPUs!
Now run 4 heavy applications and again trace the graphs, oh all graphs were reached to the maximum value and the overall CPU usage was reached to 100%. This is a really improvement, you are using the power of four CPUs!
Is it possible that an application uses the power of all processors? Of course, and I will describe it in next posts.
نوشته شده در تیر ۲۲م, ۱۳۸۷ توسط حسین
توی دنیای الکترونیک یک قانونی هست به نام قانون مور، طبق این قانون که جناب گوردون مور در سال ۱۹۶۵ کشف کرده، هر دو سال تعداد ترانزیستورهایی که روی یک چیپ (مثل cpu) قرار میگیرد دوبرابر میشود. این پیش بینی الان بیش از ۴۰ سال است که درست از آب درآمده و تعداد ترانزیستورها از ۲۳۰۰ عدد در intel 4004 در سال ۱۹۷۱ به ۸۲۰ میلیون عدد در cpuهای چهار هستهای فعلی رسیده است.

اما بخش دوم این قانون الان چند سالی است که نقض شده: طبق پیش بینی جناب مور، فرکانس کلاک در هر ۱۸ ماه ۵۰% افزایش مییابد، این در حالیست که از حدود ۳ سال پیش به این طرف فرکانس بیش از ۳٫۵ گیگا هرتز را تجربه نکردهایم. در چنین شرایطی شرکتهای اینتل و AMD دست به دامان تکنیکهایی برای حفظ بازار شدهاند. پردازندههای چندهستهای ایدهی موفقی برای حفظ بازار طی حداقل یکی دو دهة است. در این پردازندهها فرکانس کلاک بیشتر نشده که حتی کمتر هم شده، لیکن به جای یک هستة پردازشی، دو یا چهار هسته کار گذاشته شده تا در مواردی که چندین برنامه را در حال اجرا دارید هر کدام از یک هسته استفاده کرده و کارایی کلی سیستم بهبود یابد.
منتظر توضیحات بیشتر باشید…