Advertisement
Guest User

Untitled

a guest
Jun 20th, 2019
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.97 KB | None | 0 0
  1. #include<omp.h>
  2. #include<stdio.h>
  3. #include <bits/stdc++.h>
  4. #include <list>
  5. #include <string>
  6.  
  7. using namespace std;
  8. int *primz = 0;
  9. int *nearPerfect = 0;
  10. int g_d = 0;
  11. int changedGlobal = 10;
  12. //Code für primzahlberechnung aus dem Internet
  13. void SieveOfEratosthenes(int num1, int num2) {
  14. bool pno[num2 + 1];
  15. memset(pno, true, sizeof(pno));
  16. for (int i = num1; i * i <= num2; i++) {
  17. if (pno[i] == true) {
  18. for (int j = i * 2; j <= num2; j += i)
  19. pno[j] = false;
  20. }
  21. }
  22. g_d = 0;
  23. for (int i = num1; i <= num2; i++) {
  24. if (pno[i])
  25. g_d++;
  26. }
  27.  
  28. printf("%d: jo\n", g_d);
  29. primz = new int[g_d];
  30. printf("%d: jo\n", g_d);
  31. g_d = 0;
  32. for (int i = num1; i <= num2; i++) {
  33. if (pno[i]) {
  34. primz[g_d] = i;
  35. g_d++;
  36. }
  37.  
  38. }
  39. #pragma omp critical
  40. {
  41. changedGlobal = g_d;
  42. }
  43.  
  44. printf("%d:DDDDDDDDDDDDDd \n", g_d);
  45. }
  46. int main(int argc, char* argv[]) {
  47. nearPerfect = new int[30000000](); //automatisch mit 0 gefüllt
  48. int id;
  49. int counter = 1; //array an stelle 0 wird nicht belegt
  50. int changeCounter = 0;
  51. int counterGive = 1;
  52. int counterRightSequence = 1;
  53. omp_set_num_threads(32);
  54. bool running = true;
  55. bool startBool = false;
  56. #pragma omp parallel private(id)shared(changedGlobal)
  57. {
  58. bool change = false;
  59. int *primz2 = 0;
  60. int internGlobal = 0;
  61. int t = 0;
  62. int z = 0;
  63. bool bool3 = true;
  64. bool calculation = true;
  65. list<int> mylist;
  66. id = omp_get_thread_num();
  67. if (id == 0) {
  68.  
  69. double start, end;
  70. start = omp_get_wtime();
  71. SieveOfEratosthenes(2, 100000);
  72. end = omp_get_wtime();
  73. printf("%f:30sekstart\n", end - start);
  74. printf("%d:30sekend\n", end);
  75.  
  76. #pragma omp critical
  77. {
  78. startBool = true;
  79. }
  80.  
  81. while (changeCounter != 30) {
  82. }
  83. delete primz; //freed memory
  84. primz = NULL;
  85. SieveOfEratosthenes(2, 1000000);
  86. changedGlobal = g_d;
  87. #pragma omp flush(changedGlobal)
  88.  
  89. while (changeCounter != 60) {
  90. }
  91. delete primz; //freed memory
  92. primz = NULL;
  93. SieveOfEratosthenes(2, 2000000);
  94. changedGlobal = g_d;
  95. #pragma omp flush(changedGlobal)
  96.  
  97. printf("%d:ajajajjajaejeajea\n", end);
  98.  
  99. startBool = true;
  100. #pragma omp flush(startBool)
  101. while (running) {
  102.  
  103. }
  104. printf("Thread %d verabschiedet sich \n", id);
  105. // SieveOfEratosthenes(2,100000);
  106.  
  107. } else if (id == 1) {
  108.  
  109. double start, end;
  110. start = omp_get_wtime();
  111. printf("%d:30sek\n", start);
  112. while ((end - start) < 30.0f) {
  113. end = omp_get_wtime();
  114. }
  115. #pragma omp atomic write
  116. running = false;
  117.  
  118. // #pragma omp atomic write slow
  119. startBool = false;
  120. #pragma omp flush (startBool)
  121.  
  122. printf("Thread %d verabschiedet sich \n", id);
  123. }
  124.  
  125. else {
  126. while (running) {
  127.  
  128. while (startBool) {
  129. #pragma omp critical (hshs)
  130. {
  131. t = counterGive;
  132. counterGive++;
  133.  
  134. }
  135. if (changedGlobal != internGlobal) {
  136. change = false;
  137. }
  138.  
  139. if (!change) {
  140. #pragma omp critical (hs)
  141. {
  142. primz2 = new int[g_d]; //schleife für größe des arrays
  143. for (int i = 0; i < g_d; i++) {
  144. primz2[i] = primz[i];
  145. }
  146. change = true;
  147. internGlobal = g_d;
  148. printf("%d %d:internGlobal\n", internGlobal,
  149. changeCounter);
  150. changeCounter++;
  151.  
  152. }
  153.  
  154. }
  155.  
  156. mylist.clear();
  157. calculation = true;
  158. z = -1;
  159.  
  160. if (t >= 30000000) {
  161. startBool = false;
  162. }
  163.  
  164. while (calculation) {
  165. // eine eins am ende noch addieren
  166. //wenn wir mehr zahlen als array elemente haben....
  167. z++;
  168.  
  169. //nimmt sich die
  170. int arrVar = primz2[z];
  171. if (arrVar < (t / 2) + 1) { //size of array
  172.  
  173. } else {
  174. calculation = false;
  175. }
  176.  
  177. if (t % arrVar == 0) {
  178. mylist.push_back(arrVar);
  179. int c = 2;
  180. bool3 = true;
  181. while (bool3) {
  182. if (arrVar * c >= (t / 2) + 1) {
  183. bool3 = false;
  184. } else if (t % (arrVar * c) == 0) {
  185. mylist.push_back(arrVar * c);
  186. }
  187.  
  188. c++;
  189. }
  190. }
  191.  
  192. }
  193.  
  194. mylist.sort();
  195. mylist.unique();
  196.  
  197. int erg = 1;
  198. for (auto v : mylist) {
  199. erg = erg + v;
  200. }
  201. int op = t - erg;
  202. if (op <= 0) {
  203. op = op * -1;
  204. }
  205.  
  206. #pragma omp critical (gff)
  207. {
  208. if (op <= 8) {
  209. nearPerfect[t] += t;
  210. } else {
  211.  
  212. nearPerfect[t] += 1;
  213. }
  214. }
  215.  
  216. #pragma omp critical (aaaa)
  217. {
  218. if (nearPerfect[counter] == 0) {
  219. } else if (nearPerfect[counter] == 1) {
  220. counter++;
  221. } else {
  222. std::cout << counter << " counter\n";
  223. counter++;
  224. }
  225. if (nearPerfect[counter] == 0) {
  226.  
  227. } else if (nearPerfect[counter] == 1) {
  228. counter++;
  229. } else {
  230. std::cout << counter << " counter\n";
  231. counter++;
  232. }
  233. }
  234.  
  235. }
  236.  
  237.  
  238. }
  239. printf("Thread %d verabschiedet sich \n", id);
  240. }
  241.  
  242. }
  243.  
  244. cout << counter << " counter";
  245. cout << counterGive << " counterGive";
  246. printf("Countermenge %d\n", changeCounter);
  247. return 0;
  248. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement