
نوشته شده توسط
ka1_fire
سلام دوست عزیزم مرسی بابت این که وقت گذاشتین و پاسخ دادین بله 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;
}
}
اگه می تونید الگوریتم رو طوری تغییر بدید که متغیرها (می بخشید شمارنده ها) مستقل باشن 