PDA

View Full Version : ایراد جزیی در برنامه مرتب سازی آرایه به روش چند نخی



Somebodysme
جمعه 19 تیر 1394, 23:56 عصر
سلام دوستان راستش یه مشکل کوچیک پیش اومده که من یه برنامه ب زبان جاوا باید مینوشتم که این نکات را رو در بر داشته باشه
1-آرایه به به تعداد هسته های یک سی پی یو 8 هسته تقسیم شود و سپس از طریق مرتب سازی حبابی این 8 قسمت مرتب شوند و بعد دوتا دوتا این 8 قسمت در مجموع 7 مرحله ادغام شده و در نهایت آرایه مرتبی چاچ شود
شرطهاشم اینه که 8 نخ مرتب سازي را همزمان فعال میکنیم همچنين بايد نخهاي ادغام را همان ابتدا فعال كنیم
تا با مهيا شدن داده ها، عمليات ادغام را بي درنگ شروع كنند
2- بعد برای هماهنگی از سمافور استفاده شود.
ببنید دوستان حالا مشکل برنامه من چی هست:
برنامه من کاملا صحیح کار میکنه و تمام این مراحلو به درستی چاپ میکنه و کلا همهچیش اوکیه اما استاد بمن گیرداده و لج کرده بخاطر غیبتای کلاسیم و 70 درصد نمره رو بم نداده و درصورتی که بقیه نصف اینم به زبان سی کار کرده بودنتقریبا 80 درصد نمره رو بهشون داده بوده حالا گیر این استاد چه میگه که برنامه شما بهینه نیست و در عمل فقط از 2 هسته سی پی یو کار میکشه.میشه یکی یوقی بذاره کد رو بخونه و کمکم کنه .
البته یه نکته بعد از حرف استاد ومدم دوتا زمان اضافه کردم ک ببینم حرف استاد چقد درسته دیدم که مرتب سازی قبل از نخها زمانش خیلییی کمتر از بعد از نخهاست پس حرفش درسته اما خب چطور رفعش کنم. ممنون میشم کمکم کنید اینم main برنامه است . سه تا کلاس هم داره ک bubblesort و merge و print هستن ک اونا کاربردی نداشتن نذاشتمشون. برنامه کاملم ضمیمه کردم ک بدونید دقیق و بدون مشکل کار میکنه فقط ایرادش همونه ک گفتم.

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/


package masoudos;


/**
*
* @author Masoud
*/
import java.util.concurrent.Semaphore;
import java.util.Scanner;
import java.util.Random;
public class Main {
static Scanner read = new Scanner(System.in);
public static void main(String[] args) throws InterruptedException {
System.out.printf("\n\t%s\n", "<<The Bubble Sort for Array By Threads for 8 Kernels>> ");
System.out.printf("\n\t%s\n\n\n", "<<BY Masoud Kp and Supervision By Master Mousazadeh>>");
int i2;
final int size=32;
final int A[]=new int[size];
final int[] B = new int[size];
Random randomGenerator = new Random();
for (int i7 = 0; i7 < A.length; ++i7) {
int randomInt = randomGenerator.nextInt(size);
B[i7]=A[i7] = randomInt;
}
//Agar bekhahim araye b soorate random entekhab shavad az 4 khat zir est
// mishavad dar gheyre insoorat in 4 khat bayad hazf shavnd
//va khotoote 31-34 dar zir faa lshavand
/* Random randomGenerator = new Random();
for (i2 = 0; i2 < A.length; i2++) {
int randomInt = randomGenerator.nextInt(size);
A[i2] = randomInt;
}


//اگر بخواهیم آرایه را خودمان به صورت تک ب تک عناصرش را وارد کنیم
//4 خط زیر ک غیر فعال شده را فعال میکنیم و 4 خط بالا مربوط به
//تولید آرایه تصادفی را غیر فعال میکنیم

/* for(int i=0;i<size;i++){
* System.out.print("Enter number "+(i+1)+" :");
* A[i]=read.nextInt();
*///} //end for

double start1 = System.currentTimeMillis();
BubbleSort.bubblesort(A,size);
System.out.print("The sorted Array wihtout Thread:");
print.print(A,size);
double stop1 = System.currentTimeMillis();
double duration1 = (stop1 - start1);
System.out.println("Duration Without thredas :" + duration1 + " miliseconds");
System.out.println();


double start2 = System.currentTimeMillis();


final int[] C = new int[size/8 ];
final int[] D = new int[size /8];
final int[] E = new int[size /8];
final int[] F = new int[size /8];
final int[] H = new int[size /8];
final int[] I = new int[size /8];
final int[] J = new int[size /8];
final int[] K = new int[size /8];
final int G[] = new int[size];


int k1 = 0,k2 = 0,k3=0 ,k4=0,k5=0,k6=0,k7=0 ;
for (int k=0 ; k<size ; k++)
{


if (k < size/8)
{
C[k] = A[k];
}
if(k >= size/8 && k<size/4)
{
D[k1] = A[k];
k1++;
}
if(k >= size/4 && k < 3*(size/8))
{
E[k2] = A[k];
k2++;
}
if(k >= 3*(size/8) && k<size/2)
{
F[k3] = A[k];
k3++;
}
if(k >= (size/2) && k<5*(size/8))
{
H[k4] = A[k];
k4++;
}
if(k >= 5*(size/8) && k<3*(size/4))
{
I[k5] = A[k];
k5++;
}
if(k >= 3*(size/4) && k<7*(size/8))
{
J[k6] = A[k];
k6++;
}
if(k >= 7*(size/8) && k<size)
{
K[k7] = A[k];
k7++;
}
//System.out.println(k);
}






final Semaphore s = new Semaphore(0);



Thread thread1 = new Thread(){
@Override
public void run()
{
s.release();
signal(s);
BubbleSort.bubblesort(C,(size/8));

System.out.print("The sorted Array with Thread1:");

print.print(C,(size/8));
System.out.println();
}


private void signal(Semaphore s) {


}



};
Thread thread2 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(D,(size/8));

System.out.print("The sorted Array with Thread2:");

print.print(D,(size/8));
System.out.println();
}



};
//this part is for merging 4 parts in threads
final int H55[] = new int[size/4];
int w69=0;
for(int w59=0 ; w59<size/4 ;w59++)
{ if(w59<size/8)
H55[w59]=C[w59];
else{
H55[w59]=D[w69];
w69++;}
}



Thread thread9 = new Thread(){
@Override
public void run()
{
merge.merge(H55, 0, size / 8, (size / 4) - 1);
s.release();
signal(s);
System.out.print("The sorted Array after Merged two array QuarterFinaL 1:");


print.print(H55,(size/4));
System.out.println();
}


private void signal(Semaphore s1) {


}
};











Thread thread3 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(E,(size/8));

System.out.print("The sorted Array with Thread3:");


print.print(E,(size/8));
System.out.println();
}



};
Thread thread4 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(F,(size/8));

System.out.print("The sorted Array with Thread4:");


print.print(F,(size/8));
System.out.println();
}









};
final int H3[] = new int[size/4];
int w61=0;
for(int w51=0 ; w51<size/4 ;w51++)
{ if(w51<size/8)
H3[w51]=E[w51];
else{
H3[w51]=F[w61];
w61++;}
}



Thread thread10 = new Thread(){
@Override
public void run()
{
merge.merge(H3, 0, size / 8, (size / 4) - 1);
s.release();
signal(s);
System.out.print("The sorted Array after Merged two array QuarterFinaL 2:");


print.print(H3,(size/4));
System.out.println();
}


private void signal(Semaphore s) {


}
};
final int H53[] = new int[size/2];
int w18=0;
for(int w19=0 ; w19<size/2 ;w19++)
{ if(w19<size/4)
H53[w19]=H55[w19];
else{
H53[w19]=H3[w18];
w18++;}
}



Thread thread13 = new Thread(){
@Override
public void run()
{
merge.merge(H53, 0, size / 4, (size / 2) - 1);
s.release();
signal(s);
System.out.print("The sorted Array after Merged SemiFinaL 1:");


print.print(H53,(size/2));
System.out.println();
}


private void signal(Semaphore s) {


}
};



Thread thread5 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(H,(size/8));
System.out.print("The sorted Array with Thread5:");


print.print(H,(size/8));
System.out.println();
}
};
Thread thread6 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(I,(size/8));

System.out.print("The sorted Array with Thread6:");


print.print(I,(size/8));
System.out.println();
}


};
final int H4[] = new int[size/4];
int w62=0;
for(int w52=0 ; w52<size/4 ; w52++)
{ if(w52<size/8)
H4[w52]=H[w52];
else{
H4[w52]=I[w62];
w62++;}
}





Thread thread11 = new Thread(){
@Override
public void run()
{
merge.merge(H4, 0, size / 8, (size / 4) - 1);
s.release();
signal(s);
System.out.print("The sorted Array after Merged two array QuarterFinaL 3:");


print.print(H4,(size/4));
System.out.println();
}


private void signal(Semaphore s) {


}
};





Thread thread7 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(J,(size/8));
System.out.print("The sorted Array with Thread7:");


print.print(J,(size/8));
System.out.println();
}
};


Thread thread8 = new Thread(){
@Override
public void run()
{
BubbleSort.bubblesort(K,(size/8));

System.out.print("The sorted Array with Thread8:");


print.print(K,(size/8));
System.out.println();
}





};

final int H5[] = new int[size/4];
int w63=0;
for(int w53=0 ; w53<size/4 ; w53++)
{ if(w53<size/8)
H5[w53]=J[w53];
else{
H5[w53]=K[w63];
w63++;}
}


Thread thread12 = new Thread(){
@Override
public void run()
{
merge.merge(H5, 0, size / 8, (size / 4) - 1);
s.release();
signal(s);
System.out.print("The sorted Array after Merged two array QuarterFinaL 4:");


print.print(H5,(size/4));
System.out.println();
}


private void signal(Semaphore s) {


}
};
final int H2[] = new int[size/2];
int w118=0;
for(int w29=0 ; w29<size/2 ;w29++)
{ if(w29<size/4)
H2[w29]=H4[w29];
else{
H2[w29]=H5[w118];
w118++;}
}





Thread thread14 = new Thread(){
@Override
public void run()
{
merge.merge(H2, 0, size / 4, (size / 2) - 1);
s.release();
signal(s);
System.out.print("The sorted Array after Merged SemiFinaL 2:");


print.print(H2,(size/2));
System.out.println();
}


private void signal(Semaphore s) {


}




};
int w2 = 0;
int w3 = 0;
int w4 = 0;
int w5 = 0;
int w6 = 0;
int w7 = 0;
int w8 = 0;
for(int w=0 ; w<size;w++)
{
if(w <size/8)
G[w] = C[w];
else
if (w<size/4)
{
G[w] = D[w2];
w2++;
}
else
if (w<3*(size/8))
{
G[w] = E[w3];
w3++;
}
else if (w < size / 2) {
{
G[w] = F[w4];
w4++;
}}
else
if (w<5*(size/8))
{
G[w] = H[w5];
w5++;
}
else
if (w<3*(size/4))
{
G[w] = I[w6];
w6++;
}
else
if (w<7*(size/8))
{
G[w] = J[w7];
w7++;
}
else


{
G[w] = K[w8];
w8++;
}
}


Thread thread15 = new Thread(){
@Override
public void run()
{
merge.merge(G, 0, size / 2, size -1 );
s.release();
signal(s);
System.out.print("The sorted Array after Final Merge:");

print.print(G,size);
System.out.println();




}


public void signal(Semaphore s) {


}




};






thread1.start();
thread2.start();
wait(s);
s.acquire();
thread9.start();
thread3.start();
thread4.start();
wait(s);
s.acquire();
thread10.start();
wait(s);
s.acquire();
thread13.start();

thread5.start();
thread6.start();
wait(s);
s.acquire();
thread11.start();
thread7.start();
thread8.start();
wait(s);
s.acquire();
thread12.start();
wait(s);
s.acquire();
thread14.start();
wait(s);
s.acquire();
thread15.start();
wait(s);
s.acquire();


double stop2 = System.currentTimeMillis();
double duration2 = (stop2 - start2);
System.out.println("Duration with threads :" + duration2 + " miliseconds");
double x =((duration1 -duration2 ) / duration1 ) * 100 ;
System.out.println("Optimize:" + x + " %");
















}


private static void wait(Semaphore s) {

}


}

ahmad.mo74
یک شنبه 04 مرداد 1394, 16:43 عصر
سلام، چقدرررر بد کد زدید :اشتباه:

بهتر بود به جای اینکه خودتون Thread رو new کنید، از یه Thread pool استفاده میکردید.

ایده کلیش به اینصورته :

- آرایه اولیه رو به چند قسمت تقسیم کنیم (مثلا به تعداد هسته های cpu که با دستور ()Runtime.getRuntime().availableProcessors به دست میاد)
- عمل سورت رو روی هر قسمت به صورت موازی انجام بدیم.
- آخر سر هم با هم merge اشون کنیم. (خود این بخش رو هم میشه موازی انجام داد)

توی کلاس Arrays هم متدی به اسم parallelSort هست که میتونی با نگاه کردن به پیاده سازیش ازش ایده بگیری.