Advertisement
techno-

Paralelismo P3

May 2nd, 2023
207
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.02 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 1
  7.  
  8. //Comandos para compilar y ejecutar
  9. //mpicc main.c -o main -lm
  10. //mpirun --hostfile hostfile -np 5 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  10  // 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.     if(base1 == base2) {
  37.         return 0;
  38.     }
  39.     if((base1 == 0) && (base2 == 3)) {
  40.         return 1;
  41.     }
  42.     if((base2 == 0) && (base1 == 3)) {
  43.         return 1;
  44.     }
  45.     if((base1 == 1) && (base2 == 2)) {
  46.         return 1;
  47.     }
  48.     if((base2 == 2) && (base1 == 1)) {
  49.         return 1;
  50.     }*/
  51.  
  52.     return 2;
  53. }
  54.  
  55. int main(int argc, char *argv[] ) {
  56.  
  57.     int i, j;
  58.     int *data1, *data2;
  59.     int *result;
  60.     struct timeval  tv1, tv2;
  61.     int numprocs , rank , namelen;
  62.     char processor_name [MPI_MAX_PROCESSOR_NAME];
  63.     MPI_Init(&argc, &argv);
  64.     MPI_Comm_size (MPI_COMM_WORLD , &numprocs);
  65.     MPI_Comm_rank (MPI_COMM_WORLD , &rank);
  66.     MPI_Get_processor_name (processor_name , &namelen);
  67.  
  68.     data1 = (int *) malloc(M*N*sizeof(int));
  69.     data2 = (int *) malloc(M*N*sizeof(int));
  70.     result = (int *) malloc(M*sizeof(int)); ///////////////////////////////////////////////////////////////////
  71.  
  72.     /* Initialize Matrices */
  73.  
  74.     if(rank == 0) {
  75.  
  76.         for (i = 0; i < M; i++) {
  77.             for (j = 0; j < N; j++) {
  78.                 /* random with 20% gap proportion */
  79.                 data1[i * N + j] = fast_rand();
  80.                 data2[i * N + j] = fast_rand();
  81.             }
  82.         }
  83.  
  84.     }
  85.  
  86.     //int *recibir = malloc(sizeof(int) * (M*N)/numprocs);
  87.     //int *recibir2 = malloc(sizeof(int) * (M*N)/numprocs);
  88.  
  89.     int *recibirv;
  90.     int *recibirv2;
  91.  
  92.     int *recibirFinal = (int *) malloc(M*sizeof(int)); //////////////////////////////////////////////////////
  93.     printf("LLEGA 0 y rank es : %d\n",rank);
  94.     int resto = (M*N) % numprocs;
  95.     int *sendcounts = malloc(sizeof(int)*numprocs);
  96.     int *sendcounts2 = malloc(sizeof(int)*numprocs);
  97.     int *displs = malloc(sizeof(int)*numprocs);
  98.     int *displs2 = malloc(sizeof(int)*numprocs);
  99.     int sum = 0;
  100.     int longitudEnviar, longitudRecibir;
  101.     //MPI_Scatter(data1, (M*N)/numprocs, MPI_INT, recibir, (M*N)/numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  102.     //MPI_Scatter(data2, (M*N)/numprocs, MPI_INT, recibir2, (M*N)/numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  103.  
  104.     for (i = 0; i < numprocs; i++) {
  105.         sendcounts[i] = (M*N)/numprocs;
  106.         if (resto > 0) {
  107.             sendcounts[i]++;
  108.             resto--;
  109.         }
  110.         printf("rank %d y sendcounts[%d]: %d\n", rank, i, sendcounts[i]);
  111.  
  112.         displs[i] = sum;
  113.         sum += sendcounts[i];
  114.     }
  115.     resto = (M*N) % numprocs;
  116.     sum=0;
  117.  
  118.     for (i = 0; i < numprocs; i++) {
  119.         sendcounts2[i] = M/numprocs;
  120.         if (resto > 0) {
  121.             sendcounts2[i]++;
  122.             resto--;
  123.         }
  124.         printf("rank %d y sendcounts2[%d]: %d\n", rank, i, sendcounts2[i]);
  125.  
  126.         displs2[i] = sum;
  127.         sum += sendcounts2[i];
  128.     }
  129.  
  130.     longitudEnviar = M*N/numprocs;
  131.     longitudRecibir = M/numprocs;
  132.     if(rank< M*N % numprocs){ ///////////////////////////////¿M*N o M?
  133.         longitudEnviar++;
  134.     }
  135.  
  136.     if(rank< M % numprocs){ ///////////////////////////////¿M*N o M?
  137.         longitudRecibir++;
  138.     }
  139.  
  140.  
  141.     recibirv = malloc(sizeof(int) * longitudEnviar);
  142.     recibirv2 = malloc(sizeof(int) * longitudEnviar);
  143.  
  144.     //printf("Proceso %d y longitud %d\n", rank, longitud);
  145.     MPI_Scatterv(data1, sendcounts, displs, MPI_INT, recibirv, longitudEnviar, MPI_INT, 0, MPI_COMM_WORLD); // Longitud¿?
  146.     MPI_Scatterv(data2, sendcounts, displs, MPI_INT, recibirv2, longitudEnviar, MPI_INT, 0, MPI_COMM_WORLD);
  147.  
  148.  
  149.  
  150.     gettimeofday(&tv1, NULL);
  151.     printf("LLEGA 1\n");
  152.  
  153.     if(longitudEnviar == (M*N)/numprocs) {
  154.  
  155.         for (i = 0; i < M / numprocs; i++) { ////////////////////////////////////
  156.             result[i] = 0;
  157.             for (j = 0; j < N; j++) {
  158.                 result[i] += base_distance(data1[i * N + j], data2[i * N + j]);
  159.             }
  160.             printf("rank es %d y result[%d] es %d\n",rank,i,result[i]);
  161.         }
  162.     }else{
  163.         for (i = 0; i < M / numprocs+1; i++) { //////////////////////////////////// ¿+1?
  164.             result[i] = 0;
  165.             for (j = 0; j < N; j++) {
  166.                 result[i] += base_distance(data1[i * N + j], data2[i * N + j]);
  167.             }
  168.             printf("rank es %d y result[%d] es %d\n",rank,i,result[i]);
  169.         }
  170.     }
  171.     printf("LLEGA 2\n");
  172.     gettimeofday(&tv2, NULL);
  173.  
  174.     int microseconds = (tv2.tv_usec - tv1.tv_usec)+ 1000000 * (tv2.tv_sec - tv1.tv_sec);
  175.  
  176.     printf("Antes gatherv\n");
  177.     MPI_Gatherv(result, longitudRecibir, MPI_INT, recibirFinal, sendcounts2, displs2, MPI_INT, 0, MPI_COMM_WORLD);
  178.     //MPI_Gather (result, M/numprocs, MPI_INT, recibirFinal, M/numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  179.     printf("Después gatherv\n");
  180.     printf("Llega3\n");
  181.  
  182.     /* Display result */
  183.     if (DEBUG == 1) {
  184.         if(rank==0) {
  185.             int checksum = 0;
  186.             for (i = 0; i < M; i++) {
  187.                 printf("recibirFinal[%d] es: %d\n", i,recibirFinal[i]);
  188.                 checksum += recibirFinal[i];
  189.             }
  190.             printf("Checksum: %d\n ", checksum);
  191.         }
  192.     } else if (DEBUG == 2) {
  193.         if(rank==0) {
  194.             for (i = 0; i < M; i++) {
  195.                 printf(" %d \t ", recibirFinal[i]);
  196.             }
  197.         }
  198.     } else {
  199.         printf ("Time (seconds) = %lf\n", (double) microseconds/1E6);
  200.     }
  201.     printf("LLEGA 4\n");
  202.  
  203.     free(data1); free(data2); free(result); free(recibirFinal); free(recibirv); free(recibirv2);
  204.  
  205.     MPI_Finalize();
  206.  
  207.     exit(0);
  208. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement