Advertisement
Guest User

Untitled

a guest
Dec 9th, 2019
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. /*
  2. * Experiment.cpp
  3. *
  4. * Created on: 16 maj 2016
  5. * Author: oramus
  6. */
  7.  
  8. #include <stdlib.h>
  9. #include <iostream>
  10. #include <omp.h>
  11.  
  12. #include "Experiment.h"
  13. #include "Distribution.h"
  14.  
  15. #define DEBUG_ON_
  16.  
  17. using namespace std;
  18.  
  19. struct drand48_data drand_buf;
  20. #pragma omp threadprivate(drand_buf)
  21. long **localHistograms;
  22. bool *used;
  23. #pragma omp threadprivate(used)
  24.  
  25. Experiment::Experiment(int balls, int drawsNumber)
  26. {
  27. this->balls = balls;
  28. this->drawsNumber = drawsNumber;
  29.  
  30. hmax = 0; // wyznaczamy maksymalna sume
  31. hmin = 0; // i najmniejsza sume
  32. for (int i = 0; i < drawsNumber; i++)
  33. {
  34. hmax += balls - i;
  35. hmin += i + 1; // 1 + 2 + 3 + ... liczba losowan
  36. }
  37.  
  38. cout << "Histogram min: " << hmin << " max: " << hmax << endl;
  39.  
  40. histogram = new long[hmax + 1];
  41. for (long i = 0; i < hmax + 1; i++)
  42. histogram[i] = 0;
  43.  
  44. #pragma omp parallel
  45. {
  46. srand48_r(1202107158 + omp_get_thread_num() * 1999, &drand_buf);
  47. used = new bool[balls];
  48. #pragma omp single
  49. {
  50. localHistograms = new long *[omp_get_num_threads()];
  51. for (long i = 0; i < omp_get_num_threads(); i++)
  52. localHistograms[i] = new long[hmax + 1];
  53. }
  54. }
  55. }
  56.  
  57. void Experiment::clearUsed(bool *used)
  58. {
  59. for (int i = 0; i < balls; i++)
  60. used[i] = false;
  61. }
  62.  
  63. long Experiment::singleExperimentResult()
  64. {
  65. // cout << "Wykonywanie single przez: " << omp_get_thread_num() << endl;
  66. long sum = 0;
  67. int ball;
  68. double p;
  69. double probability;
  70. double ballRand;
  71. clearUsed(used);
  72. for (int i = 0; i < drawsNumber;)
  73. {
  74.  
  75. //cout << x << endl;
  76. drand48_r(&drand_buf, &ballRand);
  77. ball = 1 + (int)((double)balls * ballRand);
  78. if (used[ball - 1])
  79. continue;
  80.  
  81. p = Distribution::getProbability(i + 1, ball); // pobieramy prawdopodobienstwo wylosowania tej kuli
  82.  
  83. drand48_r(&drand_buf, &probability);
  84. if (probability < p) // akceptacja wyboru kuli z zadanym prawdopodobienstwem
  85. {
  86. #ifdef DEBUG_ON
  87. cout << "Dodano kule o numerze " << ball << endl;
  88. #endif
  89. used[ball - 1] = true;
  90. sum += ball; // kule maja numery od 1 do balls wlacznie
  91. i++;
  92. }
  93. }
  94.  
  95. /// cout << "Suma = " << sum << endl;
  96. return sum;
  97. }
  98.  
  99. Result *Experiment::calc(long experiments)
  100. {
  101. long maxID = 0;
  102. long maxN = 0;
  103. double sum = 0.0;
  104. long values = 0;
  105. #pragma omp parallel
  106. {
  107. long threadCount = omp_get_num_threads();
  108. long *threadHistogram = localHistograms[omp_get_thread_num()];
  109. for (long i = 0; i < hmax + 1; i++)
  110. threadHistogram[i] = 0;
  111.  
  112. #pragma omp for schedule(dynamic)
  113. for (long l = 0; l < experiments; l++)
  114. threadHistogram[singleExperimentResult()]++;
  115.  
  116. long localMaxN = 0;
  117. long localMaxID = 0;
  118. long localValues = 0;
  119. double localSum = 0;
  120. #pragma omp for nowait
  121. for (long l = 0; l <= hmax; l++)
  122. {
  123. for (long k = 0; k < threadCount; k++)
  124. {
  125. histogram[l] += localHistograms[k][l];
  126. }
  127. localSum += l * histogram[l];
  128. localValues += histogram[l];
  129. if (localMaxN < histogram[l])
  130. {
  131. localMaxN = histogram[l];
  132. localMaxID = l;
  133. }
  134. }
  135.  
  136. #pragma omp critical
  137. {
  138. sum += localSum;
  139. values += localValues;
  140. if (localMaxN > maxN)
  141. {
  142. maxN = localMaxN;
  143. maxID = localMaxID;
  144. }
  145. }
  146. }
  147. // indeks to wartosc, histogram -> liczba wystapien
  148. return new Result(maxID, maxN, sum / values, values);
  149. }
  150.  
  151. Experiment::~Experiment()
  152. {
  153. delete[] histogram;
  154. #pragma omp parallel
  155. {
  156. delete[] localHistograms[omp_get_thread_num()];
  157. delete[] used;
  158. }
  159. delete[] localHistograms;
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement