fork download
  1. library(Rmpi)
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <mpi.h>
  5. #include <limits.h>
  6.  
  7. #define ARRAY_SIZE 8000000
  8. #define RANGE 1000000000
  9.  
  10. int main(int argc, char *argv[]) {
  11. int rank, size, i;
  12. int *array = NULL;
  13. int local_min = INT_MAX;
  14. int overall_min;
  15. int segment_size;
  16.  
  17. MPI_Init(&argc, &argv);
  18. MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  19. MPI_Comm_size(MPI_COMM_WORLD, &size);
  20.  
  21. if (size != 8) {
  22. if (rank == 0) {
  23. fprintf(stderr, "This program is designed to run with 8 processes.\n");
  24. }
  25. MPI_Finalize();
  26. return 1;
  27. }
  28.  
  29. segment_size = ARRAY_SIZE / size;
  30.  
  31. if (rank == 0) {
  32. array = (int *)malloc(sizeof(int) * ARRAY_SIZE);
  33. for (i = 0; i < ARRAY_SIZE; i++) {
  34. array[i] = rand() % (RANGE + 1);
  35. }
  36. }
  37.  
  38. int *sub_array = (int *)malloc(sizeof(int) * segment_size);
  39.  
  40. MPI_Bcast(array, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD);
  41.  
  42. // Calculate the local minimum
  43. for (i = 0; i < segment_size; i++) {
  44. int idx = rank * segment_size + i;
  45. if (array[idx] < local_min) {
  46. local_min = array[idx];
  47. }
  48. }
  49.  
  50. // Gather all local minima at root
  51. MPI_Gather(&local_min, 1, MPI_INT, sub_array, 1, MPI_INT, 0, MPI_COMM_WORLD);
  52.  
  53. if (rank == 0) {
  54. overall_min = INT_MAX;
  55. for (i = 0; i < size; i++) {
  56. if (sub_array[i] < overall_min) {
  57. overall_min = sub_array[i];
  58. }
  59. }
  60.  
  61. // Validate the result by finding the minimum sequentially
  62. int true_min = INT_MAX;
  63. for (i = 0; i < ARRAY_SIZE; i++) {
  64. if (array[i] < true_min) {
  65. true_min = array[i];
  66. }
  67. }
  68.  
  69. printf("Overall minimum found by MPI: %d\n", overall_min);
  70. printf("True minimum found by sequential search: %d\n", true_min);
  71. }
  72.  
  73. if (array != NULL) {
  74. free(array);
  75. }
  76. free(sub_array);
  77.  
  78. MPI_Finalize();
  79. return 0;
  80. }
  81.  
Success #stdin #stdout #stderr 0.26s 40628KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error in library(Rmpi) : there is no package called ‘Rmpi’
Execution halted