برنامه نویسی موازی با OPENMP
هنوز ابتدای راهم اما بلاخره بعد از مدت ها تونستم راه اندازی OPENMP رو در ویژوال استودیو 2010 (visual studio 2010) رو پیدا کنم چون هرچه هم کتابخانه omp.h رو include می کردم فایده نداشت.
این مختصر رو اینجا می نویسم امیدوارم اگر کسی هم مثل من مشکلی براش پیش اومد بتونه از این راهنمایی استفاده کنه.
برای راه اندازی ابتدا یک پروژه C++ ایجاد می کنیم البته از نوع win32 consol application توجه داشته باشید از پنجره application setting علامت تیک perecompiled heder رو بردارید (یعنی این گزینه نباید انتخاب شده باشه) بعد ok کنید.
قسمت اصل کاری:
در قسمت solution explorer روی پروژه راست کلیک کنید بعد این مسیر رو برید
peroperties-> configuration peroperties-> c/C++ -> language
حالا از فریم کناری گزینه openmp support رو yes می کنیم بعدم applay و ok می کنیم.
حالا دیگه پروژه شما OPENMP رو پشتیبانی می کنه.
بعد یک فایل .cpp هم برای برنامه نویسی ایجاد می کنیم و داخلش باید برای استفاده از openmp فایل omp.h رو include کنیم.
نمی دونم چرا این تیکه اصل کاری رو فراموش کرده بودم بنویسم از همه دوستانی که اومدن اینجا و دست خالی برگشتم عذر می خوام
یه لینک بسیار بدرد بخور هم پیدا کردم که دستورات openmp رو خیلی خوب با مثال توضیح میده. به علت رعایت قانون کپی رایت متن مطلب رو اینجا نمی نویسم اما لینکش رو میگذارم(درست برو بچه های ماهنامه شبکه درد نکنه)
اینم لینک یه راهنمای خارجی که باز هم دستورات رو خیلی خوب و همراه مثال توضیح داده
اینم یه نمونه کد کوتاه برای اینکه ببنید برنامه بصورت موازی اجرا می شه یا نه.
خروجی برنامه باید چاپ اعداد یک تا ده بصورت نامرتب باشه (چون هر عدد توسط یک thread بصورت موازی با threadهای دیگه چاپ میشه و ممکنه threadها پشت سر هم اجرا نشن(این خاصیت برنامه نویسی موازی هست اگر اعداد مرتب چاپ شد به موازی سازی تون شک کنید)
در این برنامه چون پردازنده من دو هسته ای هست برنامه برام دوتا thread درست می کنه و همه دستورات چاپ رو دوبار برام چاپ می کنه و اعداد داخل حلقه رو هم قاطی دستورات چاپ دیگه چاپ می کنه:) !!!!!!
باید از دستورات هماهنگ سازی استفاده کرد که من هنوز باهاشون کار نکردم.
انشاءالله که خدا کمک کنه بیشتر یاد بگیرم اینجا هم بیشتر درباره OPENMP و برنامه نویسی موازی با اون می نویسم.
اگر دوستان مطلبی بلد هستن به من هم یاد بدن جای دوری نمیره (خدا یک در دنیا صد در آخرت عوض خیر بهتون بده آمییییین
)
اینم اون کد که بهتون گفتم
#include<omp.h>
#include<stdio.h>
#include<conio.h>
long int i,j,a,k;
int main(int argc, char* argv[])
{omp_set_num_threads(4);
omp_set_dynamic(true);
omp_set_nested(true);
#pragma omp parallel shared(i,j,a) num_threads(4)
{
k=omp_get_num_procs();
printf("number of processor= %d \n",k);
k=omp_in_parallel();
printf("if program in paralle=1 or serial=0 ?? %d \n",k);
k=omp_get_max_threads();
printf("muaximum number of thread= %d \n",k);
k=omp_get_num_threads();
printf("number of threads= %d \n",k);
k=omp_get_thread_num();
printf("thread number is= %d \n",k);
#pragma omp for
for(j=0;j<10;j++)
printf("%d",j);
}
j=0;
getch();
return 0;
}
خدا خیر بده هرکسی این داکیومنتو درست کرده (از لینک زیر دانلود کیند)
اگر خدا بخواد تجربیات برنامه نویسی خودم رو هم اینجا میگذارم
***************** مطلب جدید *************
طریقه ایجاد حلقه تو در تو در OpenMP نسخه 2.0 (از نسخه 3.0 به بعد حلقه های تو در تو پشتیبانی می شن.)
یک راه جالب توی کتاب OpenMP پیدا کردم دوتا حلقه تو در تو رو می شه به یکی از این دو شیوه موازی کرد نمی دونم حلقه سوم رو هم با همین شیوه می شه موازی کرد یا نه اما همینم غنیمته.
شیوه اول:
#pragma omp parallel default (shared)
{
#pragma omp for
for(i=0;i<n;i++)
{
#pragma omp parallel shared(i,n)
{
#pragma omp for
for(j=0;j<n;j++)
work(i,j);
}
}
}
شیوه دوم:
#pragma omp parallel default (shared)
{
#pragma omp for
for(i=0;i<n;i++)
work1(i,n);
}
void work1(int 1, int n)
{
int j;
#pragma omp for
for(j=0;j<n;j++)
work2(i,j);
}
***************************************
اگر میخواید برنامه نویسی بسیار موازی با cuda رو هم تازه شروع کنید این دو لینک خیلی به دردتون خواهد خورد
برای نصب و راه اندازی cuda روی ویژوال استودیو C++ به لینک زیر برید
و برای آشنایی با نحوه نوشتن یک برنامه موازی کوتاه در cuda به لینک زیر برید
درپناه حق تعالی باشید
--------------------------------
زکات علم نشر آن است. مولی علی(ع)