Guest User

Untitled

a guest
May 21st, 2018
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.84 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "mpi.h"
  4.  
  5. /* Funkciju prototipai */
  6. void SukurtiSkaicius(long int [], int, int, int);
  7. void NuoseklusRikiavimas(long int [], int);
  8. int MinPozicija(long int [], int);
  9.  
  10. int main(int argc, char* argv[]) {
  11. long int * big_array; // Bendras masyvas
  12. long int * local_array; // Masyvas kiekvienam procesui
  13. int n=0; // Bendro masyvo kiekis
  14. int nProc; // Masyvo kiekis procesui
  15. int p; // Procesu skaicius
  16. int my_rank; // Proceso numeris
  17. int i; // ciklams
  18. double start, stop; // Skaiciavimo pradzia, pabaiga
  19.  
  20. MPI_Init(&argc, &argv);
  21. MPI_Comm_size(MPI_COMM_WORLD, &p); // Nustatome procesu skaiciu
  22. MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); // Nustatome proceso numeri
  23.  
  24. n = atoi(argv[1]); // Pirmas argumentas - masyvo dydis
  25.  
  26. if (my_rank == 0) {
  27.  
  28. start = MPI_Wtime(); // Pradedame laiko skaiciavima
  29.  
  30. /* Tikrinam parametru tikslinguma */
  31. if (n%p != 0) {
  32. fprintf(stderr,"Procesu skaicius turi lygiai isdalinti masyvo elementu skaiciu.\n");
  33. MPI_Abort( MPI_COMM_WORLD, 2 );
  34. exit(1);
  35. }
  36.  
  37. /* Tikrinam ar priskirta atmintis bendram masyvui */
  38. big_array = new long int[n];
  39. if (big_array==NULL) {
  40. fprintf(stderr, "Nepavyko sukurti bendro masyvo\n");
  41. MPI_Abort( MPI_COMM_WORLD, 3 );
  42. exit(0);
  43. }
  44. printf("\nViso elementu = %d; Kiekvienas procesas rikiuos po %d elementu.\n",
  45. n, n/p);
  46. SukurtiSkaicius(big_array, n, n/p, p);
  47. }
  48.  
  49. nProc = n/p;
  50.  
  51. /* Tikrinam ar priskirta atmintis vietiniam masyvui */
  52. local_array = new long int[nProc];
  53. if (local_array==NULL) {
  54. fprintf(stderr, "Nepavyko sukurti vietinio masyvo\n");
  55. MPI_Abort( MPI_COMM_WORLD, 4 );
  56. exit(0);
  57. }
  58.  
  59. /* Naudojam MPI_Scatter, kuris kiekvienam procesui i local_array nusiuncia po nProc elementu */
  60. MPI_Scatter(big_array, nProc, MPI_LONG, local_array, nProc, MPI_LONG, 0, MPI_COMM_WORLD);
  61.  
  62. NuoseklusRikiavimas(local_array, nProc);
  63.  
  64. /* Naudojam MPI_Gather, kuris is kiekvieno proceso i big_array nusiuncia po nProc elementu is local_array */
  65. MPI_Gather(local_array, nProc, MPI_LONG, big_array, nProc, MPI_LONG, 0, MPI_COMM_WORLD);
  66.  
  67. stop = MPI_Wtime(); // Stabdome laiko skaiciavima
  68.  
  69. if (my_rank==0) {
  70. printf("\nPo rikiavimo:\n");
  71. for(i=0; i<n; i++) printf("%7ld %c", big_array[i], i%8==7 ? '\n' : ' '); // Surikiuoto masyvo spausdinimas
  72. printf("\n\nLaikas sugaistas rikiuojant masyva su %d procesu = %lf ms\n",
  73. p, (stop - start)/0.001);
  74. }
  75.  
  76. delete []local_array;
  77. if (my_rank==0) delete []big_array;
  78. MPI_Finalize();
  79. }
  80.  
  81.  
  82. void SukurtiSkaicius(long int big_array[], int n, int nProc, int p)
  83. {
  84. /* Is anksto sugrupuojam elementus i kibirelius(buckets) */
  85. int i, q;
  86.  
  87. /* big_array elementai bus sugrupuoti taip jog kiekvienam procesui teks kibirelis, kuriame */
  88. /* bus reiksmes nekonfliktuojancios su kituose kibireliuose esanciomis reiksmemis, tuomet */
  89. /* panaudojus MPI_Scatter funkcija mes siuos elementus isdalinsime procesams */
  90. //printf("Pries rikiavima:\n");
  91. for (q = 0; q < p; q++) {
  92. //printf("\nP%d: ", q);
  93. for (i = 0; i < nProc; i++) {
  94. big_array[q*nProc+i] = rand() % (2*n/p) + (q*2*n/p);
  95. //printf("%7ld %s", big_array[q*nProc+i], i%8==7 ? "\n " :
  96. // " ");
  97. }
  98. //printf("\n");
  99. }
  100. //printf("\n");
  101. }
  102.  
  103.  
  104. void NuoseklusRikiavimas(long int masyvas[], int size)
  105. {
  106. /* Naudojame selection sort ir surikiuojame elementus nuo maziausio iki didziausio */
  107. int efektDydis, minpos;
  108. long int temp;
  109.  
  110. for(efektDydis = size; efektDydis > 1; efektDydis--) {
  111. minpos = MinPozicija(masyvas, efektDydis);
  112. temp = masyvas[minpos];
  113. masyvas[minpos] = masyvas[efektDydis-1];
  114. masyvas[efektDydis-1] = temp;
  115. }
  116. }
  117.  
  118. /* Grazina maziausio elemento pozicija */
  119. int MinPozicija(long int masyvas[], int efektDydis)
  120. {
  121. int i, minpos = 0;
  122.  
  123. for (i=0; i<efektDydis; i++)
  124. minpos = masyvas[i] > masyvas[minpos] ? i: minpos;
  125. return minpos;
  126. }
Add Comment
Please, Sign In to add comment