Untitled

 avatar
unknown
c_cpp
a year ago
3.4 kB
8
Indexable
void *Malloc(unsigned int nbytes ){
 void *p = malloc(nbytes);
 if (p == NULL) {
    fprintf(stderr, "malloc failed\n");
 MPI_Abort(MPI_COMM_WORLD, 1);
    }
 return p;
}

int main(int argc, char **argv) {
 int my_rank, nprocs;
 int *A, *B; // the input arrays
 int N; // size of A. size of B is N+1

 MPI_Init(&argc, &argv);

 MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
 MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

 if (my_rank == 0) {
 N = 999;
 A = (int *) Malloc(sizeof(int)*N);
 B = (int *) Malloc(sizeof(int)*(N+1));

 /* initialize A and B -- just an example. */
 for(int i = 0; i<N;i++) {
    A[i] = B[i] = 100;
    }
 B[23] = 23;
 B[513] = 513;
 B[N] = 100;
 
    }
 /* The root process first broadcasts N
 This enables the processes to allocate memory for local copies of A and B.
 And then the root broadcasts both arrays.
 */
 MPI_Bcast(&N, 1, MPI_INT, 0, MPI_COMM_WORLD);
 if (my_rank != 0) {
 A = (int *) Malloc(sizeof(int)*N);
 B = (int *) Malloc(sizeof(int)*(N+1));
 }

 MPI_Bcast(A, N, MPI_INT, 0, MPI_COMM_WORLD);
 MPI_Bcast(B, N+1, MPI_INT, 0, MPI_COMM_WORLD);

 int chunk = (N+1)/nprocs;
 int my_start = my_rank * chunk;
 int my_end = my_start + chunk;
 int distance = N+1; // distance between A and B must be smaller than N+1

 #pragma omp parallel for default(none) shared(A, B, my_start, my_end, N) reduction(min:distance)
 for(int skip = my_start; skip < my_end; skip++) {
 /* compare A with B but skip B[skip] */
 int count = 0; // count number of places in which A and B differ

 for (int i = 0, j = 0; i < N; )
 if (j == skip)
 j++;
 else {
 if (A[i] != B[j])
 count++;
 i++; j++;
 }
 if (count < distance)
 distance = count;
 }

 int final_distance; // used by process 0
 MPI_Reduce(&distance, &final_distance, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

 if (my_rank == 0)
 printf("distance between A and B is %d\n", final_distance);


 MPI_Finalize();
 return 0;
}




////////// 

int calcDistance(int *A,int *B,int n,int skip);

int main(int argc, char *argv[]) {
 int rank, p,*A,*B,n,chunckSize,distance;
 
 MPI_Init(&argc, &argv);
 MPI_Comm_size(MPI_COMM_WORLD, &p);
 MPI_Comm_rank(MPI_COMM_WORLD, &rank);

 if (my_rank == 0) {
 int N = readA(&A);
 readA(&B);
 n=N;
    }


 MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
 
 if (my_rank != 0) {
 A = (int *) Malloc(sizeof(int)*n);
 B = (int *) Malloc(sizeof(int)*(n+1));
 }

 MPI_Bcast(A, n, MPI_INT, 0, MPI_COMM_WORLD);
 MPI_Bcast(B, n+1, MPI_INT, 0, MPI_COMM_WORLD);

 int chunkSize = (N+1)/p;
 int my_start = my_rank * chunkSize;
 int my_end = my_start + chunkSize;
 
 int distance = n+1; // distance between A and B must be smaller than N+1

 #pragma omp parallel for reduction(min:distance)
 for(int skip = my_start; skip < my_end; skip++) {
    distance=calcDistance(A,B,n,skip);
 }

 int final_min_distance = distance;
 
 MPI_Reduce(&distance, &final_min_distance, 1, MPI_INT, MPI_MIN, 0, MPI_COMM_WORLD);

 if (my_rank == 0)
 printf("distance between A and B is %d\n", final_min_distance);


 MPI_Finalize();
 return 0;
}

int calcDistance(int *A,int *B,int n,int skip){
    int distance = 0;
    for(int i = 0 , int j = 0 ; i<n+1;i++)
        if(i == skip){
            continue;
        
        if (B[i] != A[j])
            distance += 1;
        j++;
        
    }
    
    return distance;
    
    
}
Editor is loading...
Leave a Comment