fork download
  1. #include <mpi.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5.  
  6. int main(int argc, char** argv) {
  7. int rank, size;
  8. int number;
  9. int* numbers = NULL;
  10. int group_size = 0;
  11. int group_sum = 0;
  12.  
  13. // Inicializar MPI
  14. MPI_Init(&argc, &argv);
  15. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  16. MPI_Comm_size(MPI_COMM_WORLD, &size);
  17.  
  18. // Semilla para números aleatorios
  19. srand(time(NULL) + rank);
  20. number = rand() % 101; // Generar un número aleatorio entre 0 y 100
  21.  
  22. // Determinar el tamaño del grupo
  23. // Contar cuántos procesos tienen números < 50 y cuántos >= 50
  24. int count_less_than_50 = 0;
  25. int count_greater_equal_50 = 0;
  26.  
  27. MPI_Allreduce(&number, &count_less_than_50, 1, MPI_INT, MPI_SUM, MPI_COMM_WORLD);
  28. for (int i = 0; i < size; i++) {
  29. if (number < 50) {
  30. count_less_than_50++;
  31. } else {
  32. count_greater_equal_50++;
  33. }
  34. }
  35.  
  36. // Crear un nuevo comunicador basado en el grupo
  37. MPI_Comm group_comm;
  38. if (number < 50) {
  39. MPI_Comm_create_group(MPI_COMM_WORLD, MPI_GROUP_NULL, 0, &group_comm);
  40. } else {
  41. MPI_Comm_create_group(MPI_COMM_WORLD, MPI_GROUP_NULL, 0, &group_comm);
  42. }
  43.  
  44. // Recopilar números en el grupo correspondiente
  45. if (number < 50) {
  46. int* sendbuf = (int*)malloc(count_less_than_50 * sizeof(int));
  47. int* recvbuf = (int*)malloc(count_less_than_50 * sizeof(int));
  48.  
  49. // Enviar y recibir números del grupo
  50. MPI_Gather(&number, 1, MPI_INT, sendbuf, 1, MPI_INT, 0, group_comm);
  51. MPI_Reduce(sendbuf, recvbuf, count_less_than_50, MPI_INT, MPI_SUM, 0, group_comm);
  52.  
  53. // Sumar los números en el proceso de menor rango
  54. if (rank == 0) {
  55. for (int i = 0; i < count_less_than_50; i++) {
  56. group_sum += recvbuf[i];
  57. }
  58. printf("Proceso %d: Suma de números menores que 50: %d
  59. ", rank, group_sum);
  60. }
  61.  
  62. free(sendbuf);
  63. free(recvbuf);
  64. } else {
  65. int* sendbuf = (int*)malloc(count_greater_equal_50 * sizeof(int));
  66. int* recvbuf = (int*)malloc(count_greater_equal_50 * sizeof(int));
  67.  
  68. // Enviar y recibir números del grupo
  69. MPI_Gather(&number, 1, MPI_INT, sendbuf, 1, MPI_INT, 0, group_comm);
  70. MPI_Reduce(sendbuf, recvbuf, count_greater_equal_50, MPI_INT, MPI_SUM, 0, group_comm);
  71.  
  72. // Sumar los números en el proceso de menor rango
  73. if (rank == 0) {
  74. for (int i = 0; i < count_greater_equal_50; i++) {
  75. group_sum += recvbuf[i];
  76. }
  77. printf("Proceso %d: Suma de números mayores o iguales a 50: %d
  78. ", rank, group_sum);
  79. }
  80.  
  81. free(sendbuf);
  82. free(recvbuf);
  83. }
  84.  
  85. // Finalizar MPI
  86. MPI_Finalize();
  87. return 0;
  88. }
  89.  
Success #stdin #stdout #stderr 0.27s 40452KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: unexpected symbol in "int main"
Execution halted