Advertisement
techno-

Paralelismo P3

Apr 25th, 2023
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.26 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/time.h>
  4. #include <mpi.h>
  5.  
  6. #define DEBUG 0
  7.  
  8. //Comandos para compilar y ejecutar
  9. //mpicc main.c -o main -lm
  10. //mpirun --hostfile hostfile -np 90 main
  11. //lamboot
  12.  
  13. /* Translation of the DNA bases
  14.    A -> 0
  15.    C -> 1
  16.    G -> 2
  17.    T -> 3
  18.    N -> 4*/
  19.  
  20. #define M  10 // Number of sequences
  21. #define N  20  // Number of bases per sequence
  22.  
  23. unsigned int g_seed = 0;
  24.  
  25. int fast_rand(void) {
  26.     g_seed = (214013*g_seed+2531011);
  27.     return (g_seed>>16) % 5;
  28. }
  29.  
  30. // The distance between two bases
  31. int base_distance(int base1, int base2){
  32.  
  33.     if((base1 == 4) || (base2 == 4)){
  34.         return 3;
  35.     }
  36.  
  37.     if(base1 == base2) {
  38.         return 0;
  39.     }
  40.  
  41.     if((base1 == 0) && (base2 == 3)) {
  42.         return 1;
  43.     }
  44.  
  45.     if((base2 == 0) && (base1 == 3)) {
  46.         return 1;
  47.     }
  48.  
  49.     if((base1 == 1) && (base2 == 2)) {
  50.         return 1;
  51.     }
  52.  
  53.     if((base2 == 2) && (base1 == 1)) {
  54.         return 1;
  55.     }
  56.  
  57.     return 2;
  58. }
  59.  
  60. int main(int argc, char *argv[] ) {
  61.  
  62.     int i, j;
  63.     int *data1, *data2;
  64.     int *result;
  65.     struct timeval  tv1, tv2;
  66.     int numprocs , rank , namelen;
  67.     char processor_name [MPI_MAX_PROCESSOR_NAME];
  68.     MPI_Init(&argc, &argv);
  69.     MPI_Comm_size (MPI_COMM_WORLD , &numprocs);
  70.     MPI_Comm_rank (MPI_COMM_WORLD , &rank);
  71.     MPI_Get_processor_name (processor_name , &namelen);
  72.  
  73.     data1 = (int *) malloc(M*N*sizeof(int));
  74.     data2 = (int *) malloc(M*N*sizeof(int));
  75.     result = (int *) malloc(M*sizeof(int));
  76.  
  77.     /* Initialize Matrices */
  78.  
  79.     if(rank == 0) {
  80.  
  81.         for (i = 0; i < M; i++) {
  82.             for (j = 0; j < N; j++) {
  83.                 /* random with 20% gap proportion */
  84.                 data1[i * N + j] = fast_rand();
  85.                 data2[i * N + j] = fast_rand();
  86.             }
  87.         }
  88.  
  89.     }
  90.  
  91.     int *recibir = malloc(sizeof(int) * (M*N)/numprocs);
  92.     int *recibir2 = malloc(sizeof(int) * (M*N)/numprocs);
  93.     int *recibirFinal = (int *) malloc(M*sizeof(int));
  94.     printf("LLEGA 0 y rank es : %d\n",rank);
  95.     MPI_Scatter(data1, (M*N)/numprocs, MPI_INT, recibir, (M*N)/numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  96.     MPI_Scatter(data2, (M*N)/numprocs, MPI_INT, recibir2, (M*N)/numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  97.     gettimeofday(&tv1, NULL);
  98.     printf("LLEGA 1\n");
  99.     for(i=0;i<M/numprocs;i++) {
  100.         result[i]=0;
  101.         for(j=0;j<N/numprocs;j++) {
  102.             result[i] += base_distance(data1[i*N+j], data2[i*N+j]);
  103.         }
  104.     }
  105.     printf("LLEGA 2\n");
  106.     gettimeofday(&tv2, NULL);
  107.  
  108.     int microseconds = (tv2.tv_usec - tv1.tv_usec)+ 1000000 * (tv2.tv_sec - tv1.tv_sec);
  109.  
  110.     MPI_Gather (result, (M*N)/numprocs, MPI_INT, recibirFinal, (M*N)/numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  111.  
  112.     printf("Llega3\n");
  113.  
  114.     /* Display result */
  115.     if (DEBUG == 1) {
  116.         int checksum = 0;
  117.         for(i=0;i<M;i++) {
  118.             checksum += result[i];
  119.         }
  120.         printf("Checksum: %d\n ", checksum);
  121.     } else if (DEBUG == 2) {
  122.         for(i=0;i<M;i++) {
  123.             printf(" %d \t ",result[i]);
  124.         }
  125.     } else {
  126.         printf ("Time (seconds) = %lf\n", (double) microseconds/1E6);
  127.     }
  128.     printf("LLEGA 4\n");
  129.  
  130.     free(data1); free(data2); free(result);
  131.  
  132.     MPI_Finalize();
  133.  
  134.     exit(0);
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement