PDA

View Full Version : آموزش: برنامه نویسی موازی در vs c++ 2010 به وسیله OPENMP



sibooy
سه شنبه 03 اردیبهشت 1392, 16:57 عصر
برنامه نویسی موازی با 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 رو خیلی خوب با مثال توضیح میده. به علت رعایت قانون کپی رایت متن مطلب رو اینجا نمی نویسم اما لینکش رو میگذارم(درست برو بچه های ماهنامه شبکه درد نکنه:تشویق:)
http://www.shabakeh-mag.com/article.aspx?id=1004072 (http://www.shabakeh-mag.com/article.aspx?id=1004072)
اینم لینک یه راهنمای خارجی که باز هم دستورات رو خیلی خوب و همراه مثال توضیح داده
http://bisqwit.iki.fi/story/howto/openmp/ (http://bisqwit.iki.fi/story/howto/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;
}

خدا خیر بده هرکسی این داکیومنتو درست کرده (از لینک زیر دانلود کیند)
http://www.google.com/url?sa=t&rct=j&q=openmp+supprt+change+yes&source=web&cd=10&cad=rja&ved=0CIIBEBYwCQ&url=http%3A%2F%2Fwww.ee.ryerson.ca%2F~courses%2Fee 8218%2FOpenMPmanual.doc&ei=U3h2UaiRGJTe7Abc_oD4Dw&usg=AFQjCNELSQbYIfFYBKz1Tyil7JjwyK1FNg&bvm=bv.45512109,d.ZWU
اگر خدا بخواد تجربیات برنامه نویسی خودم رو هم اینجا میگذارم
***************** مطلب جدید *************
طریقه ایجاد حلقه تو در تو در 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++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ ‎ به لینک زیر برید
http://barnamenevis.org/showthread.php?377875-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-cuda-%D8%AF%D8%B1-VC-(-%DA%A9%D9%88%D8%AF%D8%A7-%D8%AF%D8%B1-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%B3%DB%8C-)&highlight=cuda
و برای آشنایی با نحوه نوشتن یک برنامه موازی کوتاه در cuda به لینک زیر برید
http://barnamenevis.org/showthread.php?393192-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%DA%A9%D9%88%D8%AA%D8%A7%D9%87-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-CUDA-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-(vs-c-2010)-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88-c&highlight=cuda
درپناه حق تعالی باشید

بقیه آموزش ها رو توی این تاپیک گذاشتم
http://barnamenevis.org/showthread.php?414780-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%85%D9%88%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-C-%D8%A8%D8%A7-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D9%87%D8%B3%D8%AA%D9%87-%D8%A7%DB%8C%D8%8C-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%DA%AF%D8%B1%D8%A7%D9%81%DB%8C%DA%A9-%D9%88-%DA%86%D9%86%D8%AF-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%A7%DB%8C

--------------------------------
زکات علم نشر آن است. مولی علی(ع)

kebriya
شنبه 08 تیر 1392, 12:10 عصر
دوست عزیز توی این زمینه چقدر کار کردین؟ یه برنامه دارم که باید با omp بنویسم میشه کمکم کنین؟ منظور از دستور shared چیه؟

sibooy
دوشنبه 10 تیر 1392, 17:41 عصر
سلام دوست عزیز
shared منظور متغیرهایی هست که بین همه نخ ها به اشتراک گذاشته میشه.
راستش نمی دونم بگ چقدر. در حدی که مورد نیازم بوده. بیشتر برای کارای محاسبتی استفاده کردم.

ka1_fire
شنبه 05 مرداد 1392, 15:22 عصر
با عرض سلام خدمت اساتید عزیز بنده قصد دارم این قطعه کد رو موازی سازی کنم

for (i=1; i<=n-diagonal; i++)
{
j=i+diagonal;
sum=0;
for (m=i; m<=j; m++)
sum+=P[m];
A[i][j]=A[i][i-1]+A[i+1][j]+sum;
R[i][j]=i;

for (k=i; k<=j; k++)
{
min=A[i][k-1]+A[k+1][j]+sum;
if(min<A[i][j])
{
A[i][j]=min;
R[i][j]=k;
}
}
}

با توجه به راهنمایی هایی که کردین من این چند خط رو به ابتدای کد ام اضافه کردم

#pragma omp parallel shared(i,j,m,k,sum,min) num_threads(4)
{
#pragma omp for
ولی مشکل این هست که در حالت موازی به جای تسریع دیر تر به جواب میرسم میشه لطفا منو راهنمایی کنید آیا موازی سازی رو درست انجام دادم؟ آیا pragma omp for هارو میشه برای هر for تو در تو بنویسم؟ خیلی واجبه اساتید لطفا کمکم کنین :ناراحت:

ka1_fire
شنبه 05 مرداد 1392, 15:25 عصر
در ضمن تعداد thread هام 4 تا هست...

ka1_fire
شنبه 05 مرداد 1392, 18:49 عصر
در ضمن پردازنده ام core i5 و تعداد thread هام 4 تا هست...

sibooy
دوشنبه 07 مرداد 1392, 12:03 عصر
سلام دوست عزیز
خواستم اول برنامه تون رو خودم امتحان کنم. ولی نه! اول اون جیزایی که تو ذهنمه می گم. برنامه شما وارد محیط موازی سازی می شه؟
اینکه بتونید for های تو در تو رو موازی کنید بستگی به نسخه OpenMp داره که شما استفاده می کنید. ویژوال استودیو 2010 از OpenMP نسخه 2.0 پشتیبانی می کنه که این نسخه فقط خارجی ترین حلقه رو موازی می کنه و حلقه های داخلی بصورت سریال اجرا می شن.
نسخه 3.0 OpenMP فقط با اضافه کردن عبارت colaps() و قرار دادن تعداد حلقه های تو درتویی که میخواید موازی اجرا بشه در قسمت () حلقه ها رو تا هر عمقی که می خواید موازی اجرا می کنه.
فکر می کنم ویژوال استودیو 2012 از OpenMp نسخه 3.0 پشتیبانی کنه.
توی این لینک طریقه موازی کردن تو در تو توضیح داده شده.
http://www.shabakeh-mag.com/article.aspx?id=1004072

حالا برنامه شما اجازه بدید من ببرم رو کامپیوتر خودم اجرا کنم بعد نتیجه ش رو بهتون می گم
یک سوال برنامه ای که نوشتید ساختارش به این صورته؟


#pragma omp parallel shared(i,j,m,k,sum,min) num_threads(4)
{
#pragma omp for
for (i=1; i<=n-diagonal; i++)
{
j=i+diagonal;
sum=0;
for (m=i; m<=j; m++)
sum+=P[m];
A[i][j]=A[i][i-1]+A[i+1][j]+sum;
R[i][j]=i;

for (k=i; k<=j; k++)
{
min=A[i][k-1]+A[k+1][j]+sum;
if(min<A[i][j])
{
A[i][j]=min;
R[i][j]=k;
}
}
}
}

sibooy
دوشنبه 07 مرداد 1392, 16:05 عصر
سلام دوست عزیزم مرسی بابت این که وقت گذاشتین و پاسخ دادین بله 4 تا thread رو میشناسه رو سیستم ام
}[/LTR_INLINE]
من برنامه شما رو روی کامپیوترم اجرا کردم. وقتی بیرونی ترین حلقه رو موازی می کنید زمان پردازش افزایش پیدا می کنه. من فکر می کنم ممکنه که به خاطر وابستگی بین شمارنده های حلقه های داخلی به شمارنده حلقه خارجی باشه.
برای اینکه بتونید بهترین نتیجه رو از موازی سازی بگیرید باید انجام کارهاتون به اندازه کافی استقلال داشته باشه. وقتی داده های وابسته به هم داشته باشید این می شه که نخ ها هی با هم تداخل پیدا می کنن و زمان پردازش افزایش پیدا می کنه.
مثلا اگر شما بخواید کل کارهای این حلقه رو 200 بار انجام بدین و این 200 بار موازی اجرا بشه زمان اجرای برنامه بهبود پیدا می کنه اما چون همه نخ ها دارن روی یک آرایه مشترک کار می کنن باز هم تداخل وجود داره. توی یه پردازنده چهار هسته ای باید چیزی حدود 30 تا 40 درصد افزایش سرعت داشته باشید که ما اینجا نداریم.
یک همچین کدی رو ببینید؛ هیچ کدام از شمارنده ها به هم وابسته نیستن

#pragma omp parallel num_threads(4)
{
#pragma omp for ordered schedule (static)
for(i2=0;i2<5000;i2++)
for(j2=0;j2<5000;j2++)
R[i2][j2]=i2*j2;
#pragma omp for ordered schedule (static)
for(i2=0;i2<5000;i2++)
for(j2=0;j2<5000;j2++)
A[i2][j2]=R[2][j2]+i2*j2;
}


من این کد رو با 4 نخ روی یک پردازنده دو هسته ای اجرا کردم 0.266 ثانیه طول کشید با 2 تا نخ 0.281 ثانیه و با یک نخ 0.391 ثانیه

حالا اگه بخوایم کل کد شما رو 200 بار بصورت موازی اجرا کنیم. یعنی کد

for(i2=0;i2<200;i2++) /*******************/

رو به کدتون اضافه کنیم (همون قسمت که با ستاره مشخص شده)
i2 یک متغیر مستقله و موازی سازی روش جواب مثبت میده اما چون خونه های آرایه هاتون بین نخ ها مشترک استفاده می شه بازم اونطور که باید کاهش زمان نداریم
این کد رو ببینید

#pragma omp parallel num_threads(4)
{
#pragma omp for ordered schedule (static)
for(i2=0;i2<200;i2++) /*******************/
for (i=1; i<n-diagonal; i++)
{
j=i+diagonal;
sum=0;
for (m=0; m<j; m++)
sum+=P[m];
A[i][j]=A[i][j-1]+A[i+1][j]+sum;
R[i][j]=i;

for (k=0; k<j; k++)
{
min=A[i][k-1]+A[k+1][j]+sum;
if(min<A[i][j])
{
A[i][j]=min;
R[i][j]=k;
}
}
i1=i;
}
}


اگه می تونید الگوریتم رو طوری تغییر بدید که متغیرها (می بخشید شمارنده ها) مستقل باشن :متفکر::متفکر:

ka1_fire
سه شنبه 08 مرداد 1392, 02:01 صبح
من برنامه شما رو روی کامپیوترم اجرا کردم. وقتی بیرونی ترین حلقه رو موازی می کنید زمان پردازش افزایش پیدا می کنه. من فکر می کنم ممکنه که به خاطر وابستگی بین شمارنده های حلقه های داخلی به شمارنده حلقه خارجی باشه.
برای اینکه بتونید بهترین نتیجه رو از موازی سازی بگیرید باید انجام کارهاتون به اندازه کافی استقلال داشته باشه. وقتی داده های وابسته به هم داشته باشید این می شه که نخ ها هی با هم تداخل پیدا می کنن و زمان پردازش افزایش پیدا می کنه.
مثلا اگر شما بخواید کل کارهای این حلقه رو 200 بار انجام بدین و این 200 بار موازی اجرا بشه زمان اجرای برنامه بهبود پیدا می کنه اما چون همه نخ ها دارن روی یک آرایه مشترک کار می کنن باز هم تداخل وجود داره. توی یه پردازنده چهار هسته ای باید چیزی حدود 30 تا 40 درصد افزایش سرعت داشته باشید که ما اینجا نداریم.
یک همچین کدی رو ببینید؛ هیچ کدام از شمارنده ها به هم وابسته نیستن

#pragma omp parallel num_threads(4)
{
#pragma omp for ordered schedule (static)
for(i2=0;i2<5000;i2++)
for(j2=0;j2<5000;j2++)
R[i2][j2]=i2*j2;
#pragma omp for ordered schedule (static)
for(i2=0;i2<5000;i2++)
for(j2=0;j2<5000;j2++)
A[i2][j2]=R[2][j2]+i2*j2;
}


من این کد رو با 4 نخ روی یک پردازنده دو هسته ای اجرا کردم 0.266 ثانیه طول کشید با 2 تا نخ 0.281 ثانیه و با یک نخ 0.391 ثانیه

حالا اگه بخوایم کل کد شما رو 200 بار بصورت موازی اجرا کنیم. یعنی کد

for(i2=0;i2<200;i2++) /*******************/

رو به کدتون اضافه کنیم (همون قسمت که با ستاره مشخص شده)
i2 یک متغیر مستقله و موازی سازی روش جواب مثبت میده اما چون خونه های آرایه هاتون بین نخ ها مشترک استفاده می شه بازم اونطور که باید کاهش زمان نداریم
این کد رو ببینید

#pragma omp parallel num_threads(4)
{
#pragma omp for ordered schedule (static)
for(i2=0;i2<200;i2++) /*******************/
for (i=1; i<n-diagonal; i++)
{
j=i+diagonal;
sum=0;
for (m=0; m<j; m++)
sum+=P[m];
A[i][j]=A[i][j-1]+A[i+1][j]+sum;
R[i][j]=i;

for (k=0; k<j; k++)
{
min=A[i][k-1]+A[k+1][j]+sum;
if(min<A[i][j])
{
A[i][j]=min;
R[i][j]=k;
}
}
i1=i;
}
}


اگه می تونید الگوریتم رو طوری تغییر بدید که متغیرها (می بخشید شمارنده ها) مستقل باشن :متفکر::متفکر:
دوست عزیزم خیلی ممنون که کمک میکنین بله میخوام با یک الگوریتم جدید مثل اگوریتم SA داده هام رو تقسیم کنم و این عملیات رو روی هر کدوم مستقلن انجام بدم ولی خودم نمیدونم چه جوری اساتیدی که الگوریتم خوب بلدن کمک کنن خیلی ممنون میشم

sibooy
سه شنبه 08 مرداد 1392, 15:20 عصر
سلام
درمورد بهبود الگوریتم به نظرم باید توی چندتا از تالارها سوالتون رو مطرح کنید دوستان زیادی هستن که می تونن کمکتون کنن.
درمورد thread share برای ساختارای دیگه مثل section بود فکر می کنم (اگر یادم نرفته باشه حافظه درست و درمانی ندارم) خیلی کاربرد داره. برای for فکر نکنم زیاد به درد بخوره.
دوم اینکه خیلی خوبه که اینقدر افزایش سرعت دارید.
اگر فقط کارتون با OpenMP و پردازنده های چند هسته ای راه میفته که هیچ. من نظر خاص دیگه ای ندارم ولی اگر فقط قصدتون پردازش موازی هست و افزایش سرعت می تونید با استفاده از پردازنده گرافیکی CUDA یه افزایش سرعت فوق العاده رو داشته باشید. حتی اگه از نسخه های بالاتر OpenMP استفاده کنید محاله به افزایش سرعتب بیش از چهار برابر (متناسب با تعداد هسته های پردازنده) داشته باشید.
محاسبات من با پردازنده های چند هسته ای دو تا سه برابر افزایش سرعت داشت(متناسب با تعداد هسته ها).
اما با استفاده از پردازنده گرافیکی چیزی حدود 58 برابر افزایش سرعت داشتم.
البته بازم اینو یاد آوری کنم که برای استفاده از پردازنده های گرافیکی باید استقلال کارهاتون خیلی بالا باشه.
و همچنین حجم محاسباتتون انقدر زیاد باشه که به زمان انتقال داده از حافظه رم به حافظه پردازنده گرافیکی غلبه کنه.
مورد دیگه ای که فرموده بودین. C++‎‎ ویژوال استودیو آرایه های خیلی بزرگ رو نمی تونه ساپورت کنه البته یه تنظیماتی داره
من این سوال رو توی فروم مطرح کردم یه بلبشویی را افتاد بیا و ببین. اما یه بنده خدایی یه جواب درست بهم داد
اونم اینه
project properties\c,C++‎‎\linker\system\enable large address
تقریبا فضای آدرس دهی آرایه رو تا دو برابر افزایش میده
خواستید امتحان کنید
اینم لینک اون پست. شاید توی نظرات دیگه ای که دوستان دادن چیز بدرد بخورتری پیدا کنید
http://barnamenevis.org/showthread.php?400259-%D8%A7%D9%86%D8%AC%D8%A7%D9%85-%D8%AA%D9%86%D8%B8%DB%8C%D9%85%D8%A7%D8%AA-%D8%A8%D8%B1%D8%A7%DB%8C-%D9%BE%D8%B0%DB%8C%D8%B1%D8%B4-%D8%A2%D8%B1%D8%A7%DB%8C%D9%87-%D9%87%D8%A7%DB%8C-%D8%A8%D8%B2%D8%B1%DA%AF-%D9%85%D9%82%DB%8C%D8%A7%D8%B3-%D8%AF%D8%B1-VS-C-2010&highlight=cuda
در پناه خدای یکتا موفق باشید

sibooy
سه شنبه 08 مرداد 1392, 15:21 عصر
دوست عزیزم خیلی ممنون که کمک میکنین بله میخوام با یک الگوریتم جدید مثل اگوریتم SA داده هام رو تقسیم کنم و این عملیات رو روی هر کدوم مستقلن انجام بدم ولی خودم نمیدونم چه جوری اساتیدی که الگوریتم خوب بلدن کمک کنن خیلی ممنون میشم

درمورد بهبود الگوریتم به نظرم باید توی چندتا از تالارها سوالتون رو مطرح کنید دوستان زیادی هستن که می تونن کمکتون کنن. سوالتون رو محدود به این تاپیک نکنید

ka1_fire
چهارشنبه 09 مرداد 1392, 02:46 صبح
در مورد thread shareباید بگم وقتی حذف میکنم جوابه اشتباه میده. میشه لطف کنین و بگین چه طوری میتونم با استفاده از پردازنده گرافیکی CUDA افزایش سرعت داشته باشم؟ چون تا حالا در این زمینه کار نکردم. تا الگوریتم تغییر نکنه فکر نکنم با استفاده از mpi هم به نتیجه برسم چون الگوریتم به گونه ای است که حافظه اشتراکی بهتر به جواب میرسه نظر شما چیه؟ من دنبال تسریع هستم حالا به هر طریقی وقتی تعداد آرایه ام 4000 تا هست در حالت موازی 273 ثانیه و در حالت سری 440 ثانیه است که عملا دردی رو دوا نمیکنه حالا باید به نظر شما از کدوم روش استفاده کنم تغییر الگوریتم و استفاده از ترکیب mpi و openmp و یا استفاده از پردازنده گرافیکی CUDA؟؟؟

sibooy
پنج شنبه 10 مرداد 1392, 17:41 عصر
برای استفاده از پردازنده گرافیکی شما باید یه کارت گرافیک انویدیا که از کودا پشتیبانی می کنه داشته باشید
درضمن دوست عزیز شما نمی تونید از موازی سازی معجزه بخواید. موازی سازی وقتی (البته به نظر من) ارزش داره که یه زمان اجرای خیلی بالا رو بخواید کمش کنید.
نکته مهمی که باید درنظر داشته باشید اینه که هر پردازنده چند هسته ای حداکثر به اندازه تعداد هسته هاش می تونه افزایش سرعت داشته باشه. از یه پردازنده چهار هسته ای نمی تونید انتظار صد برابر افزایش سرعت رو داشته باشید.
با این حجم محاسبات استفاده از پردازنده گرافیکی به درد نمی خوره چون سربار انتقال داده داره.
بذارید بگم کودا چطور کار می کنه.
شما داده هاتون رو از حافظه رم باید به حافظه کارت گرافیک کپی کنید(مثلا با 30 ثانیه زمان)
هسته کودا رو فراخوانی می کنید و محاسباتتون رو با پردازنده گرافیکی انجام می دین (با کمتر از یک هزارم ثانیه)
داده های جدیدتون تون رو از حافظه پردازنده گرافیکی به رم منتقل کنید (مثلا بازم 30 ثانیه)
اگر می ارزه استفاده کنید. مخصوصا روی لپ تاپ زمان نتقال داده به خاطر اینکه رابط ها و مادربورد ضعیف تر از کامپیوتر دسکتاپه بیشتر هم می شه. مثلا بجای 30 ثانیه شما 80 ثانیه باید زمان صرف کنید.
اینم بگم شما نمی تونید فقط زمانی رو که اجرای محاسبات در هسته کودا مصرف می کنه به عنوان زمان محاسبه معرفی کنید. زمان شما از همه اون سه قسمتی که نوشتم تشکیل می شه.
باید ببینید می ارزه یا نه.
در پناه خدای یکتا موفق باشید

sibooy
دوشنبه 11 شهریور 1392, 15:22 عصر
در این پست هم روش نصب CUDA هم یک مثال از اون رو گذاشتم. هم برنامه نویسی موازی روی پردازنده های چندهسته ای با openMP رو با یک مثال گذاشتم.
http://barnamenevis.org/showthread.php?414780-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%85%D9%88%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B1-C-%D8%A8%D8%A7-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%DA%86%D9%86%D8%AF-%D9%87%D8%B3%D8%AA%D9%87-%D8%A7%DB%8C%D8%8C-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D9%87%D8%A7%DB%8C-%DA%AF%D8%B1%D8%A7%D9%81%DB%8C%DA%A9-%D9%88-%DA%86%D9%86%D8%AF-%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D9%86%D8%AF%D9%87-%D8%A7%DB%8C
دوستان اگر نکته ای آموزشی چیزی در مورد برنامه نویسی موازی با پردازنده های چند هسته ای پردازنده های گرافیکی و چند پردازنده ای بلدید همونجا بذارید.

shaskoll
پنج شنبه 14 شهریور 1392, 09:47 صبح
سلام خسته نباشید
من میخواستم پوسته محدب(convex hull) را با openmp بنویسم میتونید یکم کمکم کنید
ممنون میشم
اینم میل منه
safiyehpor@yahoo.com

sibooy
یک شنبه 17 شهریور 1392, 11:12 صبح
دوست عزیز پوسته محدب اصلا چی هست؟

neda1393
یک شنبه 18 خرداد 1393, 21:08 عصر
با سلام
دوستای عزیز من به الگوریتم مرتب سازی های مختلف مثل مرتب سازی درجی، ادغام،.... و همین طور الگوریتم های bfs و dfs که با openmp موازی شدن خیلی خیلی نیاز دارم:گریه::گریه::گریه:
ممنون میشم اگه کسی بتونه کمکم کنه
مرسی

taherabadifull
یک شنبه 18 خرداد 1393, 22:44 عصر
سلام عزیز
برای موازی کردن در open mp ابتدا بعد از نوشتن کد هاتون با توجه به اینکه میخوایی چند تا پروسز رو به کار بگیرید و یا چند تا ترد ایجاد کنید از قطعه برنامه زیر استفاده کنید.
int omp_ get_num_procs (void
void omp_ get_num_thread (int t

nana rad
پنج شنبه 22 خرداد 1393, 18:21 عصر
کسی میتونه این کدضرب ماتریس رو موازی کنه

که سه حلقه تودر توه
چطور موازیش کنم

nana rad
جمعه 13 تیر 1393, 18:50 عصر
سلام من این برنامه رو کپی کردم اجرا کردم اعداد به صورت مرتب چاپ میشه که !!!!!!!!!!!!!!!!!!1

nana rad
جمعه 13 تیر 1393, 18:56 عصر
برنامه نویسی موازی با 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 رو خیلی خوب با مثال توضیح میده. به علت رعایت قانون کپی رایت متن مطلب رو اینجا نمی نویسم اما لینکش رو میگذارم(درست برو بچه های ماهنامه شبکه درد نکنه:تشویق:)
http://www.shabakeh-mag.com/article.aspx?id=1004072 (http://www.shabakeh-mag.com/article.aspx?id=1004072)
اینم لینک یه راهنمای خارجی که باز هم دستورات رو خیلی خوب و همراه مثال توضیح داده
http://bisqwit.iki.fi/story/howto/openmp/ (http://bisqwit.iki.fi/story/howto/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;
}

خدا خیر بده هرکسی این داکیومنتو درست کرده (از لینک زیر دانلود کیند)
http://www.google.com/url?sa=t&rct=j&q=openmp+supprt+change+yes&source=web&cd=10&cad=rja&ved=0CIIBEBYwCQ&url=http%3A%2F%2Fwww.ee.ryerson.ca%2F~courses%2Fee 8218%2FOpenMPmanual.doc&ei=U3h2UaiRGJTe7Abc_oD4Dw&usg=AFQjCNELSQbYIfFYBKz1Tyil7JjwyK1FNg&bvm=bv.45512109,d.ZWU
اگر خدا بخواد تجربیات برنامه نویسی خودم رو هم اینجا میگذارم
***************** مطلب جدید *************
طریقه ایجاد حلقه تو در تو در 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++‎‎‎‎‎‎‎‎‎‎‎‎‎‎‎ به لینک زیر برید
http://barnamenevis.org/showthread.php?377875-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-cuda-%D8%AF%D8%B1-VC-(-%DA%A9%D9%88%D8%AF%D8%A7-%D8%AF%D8%B1-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%B3%DB%8C-)&highlight=cuda
و برای آشنایی با نحوه نوشتن یک برنامه موازی کوتاه در cuda به لینک زیر برید
http://barnamenevis.org/showthread.php?393192-%DB%8C%DA%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%DA%A9%D9%88%D8%AA%D8%A7%D9%87-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-CUDA-%D8%A8%D8%B1-%D8%B1%D9%88%DB%8C-(vs-c-2010)-%D9%88%DB%8C%DA%98%D9%88%D8%A7%D9%84-%D8%A7%D8%B3%D8%AA%D9%88%D8%AF%DB%8C%D9%88-c&highlight=cuda
درپناه حق تعالی باشید

--------------------------------
زکات علم نشر آن است. مولی علی(ع)
من به این کد برای بخشی از برنامه ام نیاز دارم که تعداد سی پی یو ها رو چاپ کنه اما این برنامه اعداد رو برای من مرتب چاپ میزنه؟؟؟؟؟؟؟؟؟؟؟؟

sibooy
چهارشنبه 18 تیر 1393, 18:11 عصر
سلام
آیا اصلا وارد محیط موازی میشید؟ باید این پیغام براتون چاپ بشه
if program in paralle=1 or serial=0 ? 1
اگر پیغام مثل زیر باشه یعنی وارد محیط موازی نشدین
if program in paralle=1 or serial=0 ? 0
اگر وارد محیط موازی نشدین باید تنظیماتتون رو درست انجام بدین

sibooy
چهارشنبه 18 تیر 1393, 18:12 عصر
سلام من این برنامه رو کپی کردم اجرا کردم اعداد به صورت مرتب چاپ میشه که !!!!!!!!!!!!!!!!!!1
سلام
آیا اصلا وارد محیط موازی میشید؟ باید این پیغام براتون چاپ بشه
if program in paralle=1 or serial=0 ? 1
اگر پیغام مثل زیر باشه یعنی وارد محیط موازی نشدین
if program in paralle=1 or serial=0 ? 0
اگر وارد محیط موازی نشدین باید تنظیماتتون رو درست انجام بدین

szss5668
سه شنبه 04 شهریور 1393, 13:04 عصر
سلام
من می خوام با mpi ، مرتب سازی ادغامی و بنویسم تا به حال هم برنامه نویسی موازی کار نکردم میشه را هنمایی کنین از کجا شروع کنم؟
با تشکر

sibooy
پنج شنبه 13 شهریور 1393, 11:09 صبح
سلام
من mpi کار نکردم. سخت افزار من فقط اجازه کار با shared memory رو می داد.
برای کار با mpi یا باید چندتا cpu جداگانه داشته باشید یا اینکه cpu چند هسته ای داشته باشید که از معماری mpi استفاده کرده باشه. برای این کار باز هم OpenMP چاره ساز هست اما نمی دونم که آیا نوع برنامه نویسیش همینطوره که من نوشتم یا جور دیگه ایه!!!!!!!!!
شرمنده که نمی تونم کمک کنم.
دوستان کسی هست که جواب بده؟

amirreyhaneh
جمعه 07 آذر 1393, 16:20 عصر
با سلام خدمت دوستان
من visual studio team system 2008 دارم.تمام تنظیمات گفته شده رو انجام میدم ولی وقتی include <omp.h وارد می کنم پروژه >بدون خطا build میشه ولی هنگام اجرا پیام زیر رو میده؟لطفا راهنماییی کنید؟126116

تارو69
یک شنبه 09 آذر 1393, 15:24 عصر
سلام دوستان
وقتتون بخیر
کسی کد موازی یکی از گرافهای bfs dfsدیکسترا یا کروسکالو داره بمن کمک کنه
ممنون میشم اگ بتونین کمکم کنین پروژمه و من با open mp کار نکردم
ممنون از وقتی که صرف خوندن کردین
میلم میزارم اگه کسی تونست کمکم کنه بهم خبر بده دستتون درد نکنه
star69taro@gmail.com
موفق و پیروز باشید

sibooy
چهارشنبه 10 دی 1393, 22:36 عصر
با سلام خدمت دوستان
من visual studio team system 2008 دارم.تمام تنظیمات گفته شده رو انجام میدم ولی وقتی include <omp.h وارد می کنم پروژه >بدون خطا build میشه ولی هنگام اجرا پیام زیر رو میده؟لطفا راهنماییی کنید؟
سلام
برنامه تون رو خط به خط اجرا کنید
تا ببینید از کدوم خط اشکال می گیره.
یک راه بسیار عالی برای کشف خطاست.

mgupload
شنبه 23 اسفند 1393, 22:03 عصر
با سلام

اگه من بخوام یک حلقه مثل حلقه زیر رو به صورت Parallel اجرا کنم باید چیکار کنم ؟


for(int i=0 ; i<n ; i++)
j = a[i] + j;


با تشکر

a.alborzi
سه شنبه 19 دی 1396, 13:14 عصر
با سلام
من یک برنامه ضرب ماتریس نوشتم، با CUDA در VS2015 این برنامه ضرب سریال را با ضرب موازی مقایسه می نماید. برای ضرب دو ماتریس 1024*1024 جواب میدهد . اما برای ضرب دو ماتریس 2048*2048 در زمان کپی نتیجه ماتریس (پس از ضرب در GPU)به HOST ، متد cudaMemcpy خطا میده ؟ کسی هست بتواند راهنمایی بفرماید . حتی ضرب را به صورت tile بندی دو ماتریس هم نوشته ام . باز هم همین طوری است . فکر میکنم تنظیم خاصی باید صورت گیرد ؟ ممنون میشم یک از اساتید راهنمایی بفرمایند