Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <thread>
  5. #include <string>
  6. #include <omp.h>
  7. #include <conio.h>
  8. #include <stdio.h>
  9. #include <time.h>
  10. #include <Windows.h>
  11. #include <thread>
  12. #include <chrono>
  13.  
  14.  
  15. using namespace std;
  16. using namespace std::chrono;
  17.  
  18. string dFile1 = "ProjektasDuom1.txt";
  19. string dFile2 = "ProjektasDuom2.txt";
  20. string dFile3 = "ProjektasDuom3.txt";
  21. string dFile4 = "ProjektasDuom4.txt";
  22. string dFile5 = "ProjektasDuom5.txt";
  23.  
  24. string rFile = "ProjektasRes.txt";
  25. /*
  26. Selection sort lygiagretus metodas
  27. @param a - rikiuojamas skaičių masyvas
  28. @param amount - masyvo dydis
  29. @param n - giju skaicius
  30. */
  31. int* SelectionSortParallel(int a[], int amount, int n);
  32. /*
  33. Dvieju elementu sukeitimo vietomis metodas
  34. @param a - pirmas skaičius
  35. @param b - antras skaičius
  36. */
  37. void Swap(int *a, int *b);
  38. /*
  39. Burbulo rikiavimo metodas, kuris baigia rikiuoti masyva
  40. @param arr - skaiciu masyvas
  41. @param n - masyvo dydis
  42. */
  43. void BubbleSort(int arr[], int n);
  44. /*
  45. Duomenų skaitymo metodas
  46. @param arr - skaiciu masyvas
  47. @param amount - masyvo dydis
  48. @param dataFile - duomenų failas
  49. */
  50. void ReadData(int arr[], int amount,string dataFile);
  51. /*
  52. Duomenų spausdinimo metodas
  53. @param arr - skaiciu masyvas
  54. @param amount - masyvo dydis
  55. @param resFile - rezultatų failas
  56. */
  57. void WriteData(int arr[], int amount, string resFile);
  58. /*
  59. Rezultatų spausdinimo metodas
  60. @param arr - skaiciu masyvas
  61. @param amount - masyvo dydis
  62. @param resFile - rezultatų failas
  63. */
  64. void WriteRes(int arr[], int amount, string resFile);
  65.  
  66. int main()
  67. {
  68. int amount1 = 10;
  69. int amount2 = 100;
  70. int amount3 = 1000;
  71. int amount4 = 10000;
  72. int amount5 = 20000;
  73. int* res = new int[amount5];
  74. int* a = new int[amount5];
  75. for (int i = 1; i < 9; i++) {
  76. ReadData(a, amount5, dFile5);
  77. WriteData(a, amount5, rFile);
  78. auto start = high_resolution_clock::now();
  79. res = SelectionSortParallel(a, amount5, i);
  80. auto stop = high_resolution_clock::now();
  81. auto trukme = duration_cast<microseconds>(stop - start);
  82. printf("Duomenu kiekis : %d Giju skaicius : %d ",amount5,i);
  83. printf("Trukme milisekundemis : %d\n", trukme);
  84. WriteRes(res, amount5, rFile);
  85. }
  86. return 0;
  87. }
  88. //duomenų skaitymo funkcija
  89. void ReadData(int arr[], int amount, string dataFile)
  90. {
  91. ifstream F(dataFile);
  92. for (int i = 0; i < amount; i++)
  93. F >> arr[i];
  94. F.close();
  95. }
  96. //duomenų išvedimo funkcija
  97. void WriteData(int arr[], int amount, string resFile)
  98. {
  99. ofstream R(resFile);
  100. R << "Duomenys" << endl;
  101. R << string(15, '-') << endl;
  102. R << setw(4) << left << "Nr." << setw(5) << left << "Skaicius" << endl;
  103. for (int i = 0; i < amount; i++)
  104. R << setw(4) << left << to_string(i + 1) + ")" << setw(5) << left << arr[i] << endl;
  105. R << string(15, '-') << endl;
  106. R.close();
  107. }
  108. //rezultatų išvedimo funkcija
  109. void WriteRes(int arr[], int amount, string resFile)
  110. {
  111. ofstream R(resFile, ios::app);
  112. R << setw(10) << left << "Rezultatai" << endl;
  113. for (int i = 0; i < amount; i++) {
  114. R << setw(6) << left << to_string(i + 1) + ")" << setw(5) << left << arr[i] << endl;
  115. }
  116. R << string(15, '-') << endl;
  117. R.close();
  118. }
  119. //lygiagretus selection sort rikiavimo algoritmo metodas
  120. int* SelectionSortParallel(int a[], int amount, int n)
  121. {
  122. int i, j;
  123. int tnr, min;
  124. bool canSwap = false;
  125. #pragma omp parallel num_threads(n) private(i,j,tnr)
  126. {
  127. tnr = omp_get_thread_num();
  128.  
  129.  
  130. for (i = 0; i < amount - 1; i++) {
  131. min = i;
  132. canSwap = true;
  133. //naudojamas užtikrinti sinchronizacijai - visos gijos turi įvykdyti šitą kodo dalį, kad būtu einama toliau
  134. #pragma omp barrier
  135.  
  136. #pragma omp for
  137. for (j = i + 1; j < amount; j++)
  138. {
  139. //printf("Dabar dirba %d-ia gija\n", me);
  140.  
  141. if (a[j] < a[min]) {
  142.  
  143. min = j;
  144.  
  145. //printf("I am %d processing %d,%d\n", me, i, j);
  146. }
  147.  
  148. }
  149. //naudojamas, kad tik viena gija tuo pačiu metu galėtų keisti elementus vietom
  150. #pragma omp critical(swap)
  151. if (canSwap)
  152. {
  153. Swap(&a[min], &a[i]);
  154. canSwap = false;
  155. //printf("%d, ", arr[i]);
  156. }
  157. #pragma omp barrier
  158. }
  159. }
  160. BubbleSort(a, amount);
  161. return a;
  162. }
  163. //duomenų sukeitimo funkcija
  164. void Swap(int *a, int *b)
  165. {
  166. int temp = *a;
  167. *a = *b;
  168. *b = temp;
  169. }
  170. //bubble sort rikiavimo algoritmas, kuris pabaigia rikiuoti duomenis
  171. void BubbleSort(int arr[], int n)
  172. {
  173. int i, j;
  174. for (i = 0; i < n - 1; i++)
  175. for (j = 0; j < n - i - 1; j++)
  176. if (arr[j] > arr[j + 1])
  177. Swap(&arr[j], &arr[j + 1]);
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement