Advertisement
techno-

P2 paralelismo

Apr 11th, 2023
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #include <mpi.h>
  5.  
  6. //Comandos para compilar y ejecutar
  7. //mpicc main.c -o main -lm
  8. //mpirun --hostfile hostfile -np 90 main 10 A
  9.  
  10. void inicializaCadena(char *cadena, int n){
  11.     int i;
  12.     for(i=0; i<n/2; i++){
  13.         cadena[i] = 'A';
  14.     }
  15.     for(i=n/2; i<3*n/4; i++){
  16.         cadena[i] = 'C';
  17.     }
  18.     for(i=3*n/4; i<9*n/10; i++){
  19.         cadena[i] = 'G';
  20.     }
  21.     for(i=9*n/10; i<n; i++){
  22.         cadena[i] = 'T';
  23.     }
  24. }
  25.  
  26. void MPI_BinomialColectiva(){
  27.  
  28. }
  29.  
  30. void MPI_FlatreeColectiva(void * buff, void * recvbuff, int count, MPI_Datatype datatype, MPI_Op op, int root, MPI_Comm comm){
  31.     int i; int *a; int *final; int rank;
  32.     MPI_Comm_rank (MPI_COMM_WORLD , &rank);
  33.     MPI_Status status;
  34.     a=(int*)buff;
  35.  
  36.     if(rank == 0) {
  37.         for(i=1; i<count; i++){
  38.             int count2=0;
  39.             MPI_Recv(&count2, 1, MPI_INT, i,0 ,MPI_COMM_WORLD, &status);
  40.  
  41.             *a=*a+count2;
  42.         }
  43.  
  44.     }else{
  45.         MPI_Send(a, 1, MPI_INT, 0,0 ,MPI_COMM_WORLD);
  46.     }
  47.     final=(int*)recvbuff;
  48.     *final=*a;
  49. }
  50.  
  51. void MPI_BinomialBcast(void * buf, int count, MPI_Datatype datatype, int root, MPI_Comm comm){
  52.     int rank; int i; int n; char L; int numprocs; int j;
  53.     MPI_Status status;
  54.     numprocs=count;
  55.     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  56.  
  57.     for(i=0; i<numprocs; i++){
  58.  
  59.         if(rank<pow(2,i-1)) {
  60.             MPI_Send(&n, 1, MPI_INT, rank + pow(2, i - 1), 0, MPI_COMM_WORLD);
  61.             MPI_Send(&L, 1, MPI_CHAR, rank + pow(2, i - 1), 0, MPI_COMM_WORLD);
  62.         }
  63.     }
  64.  
  65.     for(i=1;i<=numprocs;i++) {
  66.         for(j=0; numprocs<rank+pow(2,i-1);j++){
  67.             MPI_Recv(&n, 1, MPI_INT, rank-pow(2,j-1), 0, MPI_COMM_WORLD, &status);
  68.             MPI_Recv(&L, 1, MPI_CHAR, rank-pow(2,j-1), 0, MPI_COMM_WORLD, &status);
  69.         }
  70.     }
  71.  
  72. }
  73.  
  74.  
  75.  
  76.  
  77. int main(int argc, char *argv[])
  78. {
  79.     int numprocs , rank , namelen;
  80.     char processor_name [MPI_MAX_PROCESSOR_NAME];
  81.     MPI_Init(&argc, &argv);
  82.     MPI_Comm_size (MPI_COMM_WORLD , &numprocs);
  83.     MPI_Comm_rank (MPI_COMM_WORLD , &rank);
  84.     MPI_Get_processor_name (processor_name , &namelen);
  85.  
  86.     if(argc != 3){
  87.         printf("Numero incorrecto de parametros\nLa sintaxis debe ser: program n L\n  program es el nombre del ejecutable\n  n es el tamaño de la cadena a generar\n  L es la letra de la que se quiere contar apariciones (A, C, G o T)\n");
  88.         exit(1);
  89.     }
  90.  
  91.     int i, n, count=0, recibir=0;
  92.     char *cadena;
  93.     char L;
  94.     MPI_Status status;
  95.  
  96.     if(rank==0) {
  97.         n = atoi(argv[1]);
  98.         L = *argv[2];
  99.     }
  100.     //MPI_Bcast(&n, 1, MPI_INT, 0, MPI_COMM_WORLD);
  101.     //MPI_Bcast(&L, 1, MPI_CHAR, 0, MPI_COMM_WORLD);
  102.  
  103.     MPI_BinomialBcast(&n, numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  104.     MPI_BinomialBcast(&L, numprocs, MPI_INT, 0, MPI_COMM_WORLD);
  105.  
  106.  
  107.     cadena = (char *) malloc(n*sizeof(char));
  108.     inicializaCadena(cadena, n);
  109.  
  110.     for(i=rank; i<n; i=i+numprocs){
  111.         if(cadena[i] == L){
  112.             count++;
  113.         }
  114.     }
  115.  
  116.  
  117.     //MPI_Reduce (&count, &recibir, 1, MPI_INT , MPI_SUM, 0, MPI_COMM_WORLD);
  118.     MPI_FlatreeColectiva(&count, &recibir, numprocs, MPI_INT , MPI_SUM, 0, MPI_COMM_WORLD);
  119.     if(rank==0) {
  120.         printf("El número de apariciones de la letra %c es %d\n", L, recibir);
  121.     }
  122.  
  123.     free(cadena);
  124.  
  125.     MPI_Finalize();
  126.  
  127.     exit(0);
  128. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement