PDA

View Full Version : اجرای موازی در openmp با چند thread



8502803
دوشنبه 25 تیر 1397, 18:10 عصر
سلام
من می خوام یک حلقه تودرتو رو بصورت موازی با تعدادی ترد انجام بدم که هر ترد قسمت خاصی رو اجرا کنه:

for(i=0;i<(size/2);i++)
for(j=0;j<(size/2);j++)
for(k=0;k<(size/2);k++)
{
D1[i][j]+=A1[i][k]*B1[k][j];
D2[i][j]+=A1[i][k]*B2[k][j];
D3[i][j]+=A2[i][k]*B3[k][j];
D4[i][j]+=A2[i][k]*B4[k][j];
D5[i][j]+=A3[i][k]*B1[k][j];
D6[i][j]+=A3[i][k]*B2[k][j];
D7[i][j]+=A4[i][k]*B3[k][j];
D8[i][j]+=A4[i][k]*B4[k][j];
}
تو این کد هر کدوم از این Dها (از D1 تا D8) توسط یک ترد انجام بشه یعنی 8 تا ترد باید تعریف کنیم و هر ترد منتسب به یک D باشه. چطور این کار رو بکنم؟

farhad_shiri_ex
سه شنبه 26 تیر 1397, 06:31 صبح
سلام
من می خوام یک حلقه تودرتو رو بصورت موازی با تعدادی ترد انجام بدم که هر ترد قسمت خاصی رو اجرا کنه:

for(i=0;i<(size/2);i++)
for(j=0;j<(size/2);j++)
for(k=0;k<(size/2);k++)
{
D1[i][j]+=A1[i][k]*B1[k][j];
D2[i][j]+=A1[i][k]*B2[k][j];
D3[i][j]+=A2[i][k]*B3[k][j];
D4[i][j]+=A2[i][k]*B4[k][j];
D5[i][j]+=A3[i][k]*B1[k][j];
D6[i][j]+=A3[i][k]*B2[k][j];
D7[i][j]+=A4[i][k]*B3[k][j];
D8[i][j]+=A4[i][k]*B4[k][j];
}
تو این کد هر کدوم از این Dها (از D1 تا D8) توسط یک ترد انجام بشه یعنی 8 تا ترد باید تعریف کنیم و هر ترد منتسب به یک D باشه. چطور این کار رو بکنم؟

دوست عزیز!!
موازی سازی و استفاده از نخ ها یک مسئله متفاوت هستند !
ولی اگر بخواهید از نخ استفاده کنید خوب چون مشکل race condition دارید در زمان نوشتن ماتریس A1 , B1 , A2,B2 ,A3,B3 A4,B4 باید در زمان ایجاد هر نخ برای هر قسمت از ماتریس های D باید از قفل های سطح کرنل مثل mutex استفاده کنید یعنی به ازای هر ناحیه بحرانی برای جلوگیری از تداخل در نوشتن در ماتریس های A,B باید یک قفل تهیه کنید و بعد از محاسبه هر قسمت قفل هارو آزاد کنید تا به آخر این تکنیک میشه همزمانی و استفاده از چند نخ برای محاسبه.
ولی برای موازی سازی باید هر پردازه را به صورت پارالل محاسبه کنید و از تکنیک های divide by conquer استفاده کنید برای پخش کردن محاسبات بر روی هسته های پردازشگر و در عین حال هم باید نکات thread safety را هم که در بالا اشاره شد رعایت کنید.
به هرحال بحث موازی سازی میتونه خیلی پیچیده باشه و کلافه کننده برای استفاده از نخ ها و همزمانی و موازی سازی حتما باید درباره نخ و پردازه و حوضچه های نخ و پارالل کردن پردازه و قفل های کرنلی و قفل های کاربری و هسته ها و تکنیک های تقسیم وظایف و... خیلی چیزهای دیگه اطلاع داشته باشید.
استفاده از نخ ها همون قدر که جذاب هست همون قدر هم طاقت فرسا و خیلی خیلی سخت دیباگ میشن.