View Full Version : سوال: برنامه نویسی موازی در vs C++ 2010 به وسیله OPENMP
ka1_fire
شنبه 05 مرداد 1392, 16:04 عصر
با عرض سلام خدمت اساتید عزیز بنده قصد دارم این قطعه کد رو موازی سازی کنم
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 تو در تو بنویسم؟ خیلی واجبه اساتید لطفا کمکم کنین :ناراحت:
در ضمن پردازنده ام core i5 و تعداد thread هام 4 تا هست...
ka1_fire
یک شنبه 06 مرداد 1392, 15:28 عصر
کسی کمکی نمیکنه؟ :افسرده:
jblaox
یک شنبه 06 مرداد 1392, 19:25 عصر
من هم همین مشکل دارم ...
کامپایل میشود اما هیچ کاری نمی کند ... من با Resourrce monitor هم برنامه را نگاه میکنم اما حتی یک دونه threads هم نسبت به حالت سریال اضافه نمیشود ...
اگر کسی تجربه داره یک کمکی بکنه ....
ka1_fire
یک شنبه 06 مرداد 1392, 20:04 عصر
فکر کنم مشکل شما با نگاه کردن به لینک زیر حل بشه
http://barnamenevis.org/showthread.php?395000-%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-vs-c-2010-%D8%A8%D9%87-%D9%88%D8%B3%DB%8C%D9%84%D9%87-OPENMP
مشکل من اینه که موازی برنامه دیرتر از سری اش جواب میده
این بار هم به این ترتیب تغییر دادم کد رو
#pragma omp parallel shared(i,j,m,sum) 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;
#pragma omp parallel shared(i,j,k,sum,min) num_threads(4)
{
#pragma omp for
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;
}
}
}
}
ولی باز تعداد داده ها که زیاد میشه دیر تر از برنامه سری به جواب میرسه...
لطفا یکی کمک کنه خیلی مهمه برایه من... :افسرده:
UfnCod3r
یک شنبه 06 مرداد 1392, 20:50 عصر
هر چیزی رو که نباید موازی کرد
اول این باید دستورات طوری باشن که دقیقا رو هر هسته در یک زمان اجرا بشه
این که شما نوشتی داخلش کلی شرط و .. هست
مثلا فرض کن می خوای تک تک پیکسل های ی تصویر رو با رنگ قرمز ضرب کنی این موقع ها موازی بدر می خوره
void imageMul(pixel* color, int nPixel, pixel mul)
{
#pragma omp for nowait
for(int i = 0; i < nPixel; i++)
color[i] = color[i] * mul;
}
ka1_fire
یک شنبه 06 مرداد 1392, 23:40 عصر
هر چیزی رو که نباید موازی کرد
اول این باید دستورات طوری باشن که دقیقا رو هر هسته در یک زمان اجرا بشه
این که شما نوشتی داخلش کلی شرط و .. هست
مثلا فرض کن می خوای تک تک پیکسل های ی تصویر رو با رنگ قرمز ضرب کنی این موقع ها موازی بدر می خوره
void imageMul(pixel* color, int nPixel, pixel mul)
{
#pragma omp for nowait
for(int i = 0; i < nPixel; i++)
color[i] = color[i] * mul;
}
خوب چه فرقی میکنه من میخوام هر یک از for ها به صورت موازی اجرا بشه این که داخلش کلی شرط هست دلیل نمیشه که دیر تر جواب بده اصولا باید چند برابر سریع تر به جواب برسیم ...
sibooy
دوشنبه 11 شهریور 1392, 15:23 عصر
در این پست هم روش نصب 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
دوستان اگر نکته ای آموزشی چیزی در مورد برنامه نویسی موازی با پردازنده های چند هسته ای پردازنده های گرافیکی و چند پردازنده ای بلدید همونجا بذارید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.