Untitled

 avatar
unknown
c_cpp
a year ago
1.6 kB
7
Indexable
#define WORLD MPI_COMM_WORLD
#define IGNOR MPI_STATUS_IGNORE

// לחלק את המערך ל2 ולשלוח מתהליך 0 לתהליך 1 את "אנ" וחצי מ "איי"
// חישוב עם "או מ פי" של מערך "בי" - יצירת המערך בכל אחד מהתליכים
//לשלוח את החצי של מערך "בי" מתהליך 1 לתהליך 0
// בתהליך 0 לעבור על כל המערך "בי" ולהדפיס את מי שיותר גדול מהשכן שלו
int main(int argc,char **argv){

    MPI_Init(&argc, &argv);
    int rank, size, *A,*B,N,half;
    MPI_Comm_size(MPI_COMM_WORLD, &size);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

if(size != 2){
    printf("2 procs only");
    MPI_Abort(WORLD,EXIT_FAILURE);
}

if (rank ==0){
    N = readA(&A); // assume readA mallocs A and sets N as size of A
    half = N / 2;
    MPI_Send(&half,1,MPI_INT,1,0,WORLD);
    B = malloc(half * sizeof(int));
}
else{
    MPI_Recv(&half,1,MPI_INT,0,0,WORLD);
    A = malloc(half * sizeof(int));
    B = malloc(half * sizeof(int));
}

MPI_Scatter(A,half,MPI_INT,A,half,MPI_INT,0,WORLD);

 #pragma omp parallel for num_threads(4)
        for (int i = 0; i < half; i++)
         B[i] = f(A[i]);


if (rank ==0){
    MPI_Recv(B+half,half,MPI_INT,1,0,WORLD,IGNOR);
    #pragma omp parallel for num_threads(4)
    for (int i = 1; i < N-1; i++){
        if(B[i] > B[i-1])
        printf("%d,B[%d] > B[%d]\n",i,B[i],B[i-1]);
    }
    
}else{
    MPI_Send(B,half,MPI_INT,1,0,WORLD);
}
MPI_Finalize();
return EXIR_SUCCESS;
}
Editor is loading...
Leave a Comment