Advertisement
Guest User

Untitled

a guest
Apr 19th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. #include <time.h>
  2. #include <intrin.h>
  3. #include <omp.h>
  4. #include <iostream>
  5.  
  6. #define _CRT_SECURE_NO_WARNINGS
  7.  
  8. using namespace std;
  9. #define SIZE_DARR 100000000
  10. double arr[SIZE_DARR];
  11.  
  12. __int64 hz_cpu() { // замер частоты
  13. clock_t t_clock;
  14. __int64 t_tsc;
  15. t_clock = clock() + CLOCKS_PER_SEC;
  16. t_tsc = __rdtsc(); // взять TSC
  17. while (clock() < t_clock); // отсчет одной секунды
  18. return (__rdtsc() - t_tsc); // частота в герцах
  19. }
  20.  
  21. int mhz_cpu() {
  22. clock_t clock_tick1, clock_tick2;
  23. __int64 cpu_tick1, cpu_tick2;
  24. int rdtsc_tick;
  25. double usec; // время в микросекундах
  26. clock_tick1 = clock();
  27. while ((clock_tick2 = clock()) == clock_tick1); // пропуск остатка текущего тика clock
  28. cpu_tick1 = __rdtsc(); // взять TSC
  29. while (clock() == clock_tick2); // отсчет одного тика clock
  30. cpu_tick2 = __rdtsc() - cpu_tick1; // сколько натикал счетчик TSC за один тик clock
  31. // вычисляем частоту в мегагерцах
  32. usec = 1000000.0 / CLOCKS_PER_SEC; // время одного тика clock в микросекундах
  33. return int(cpu_tick2 / usec);
  34. }
  35.  
  36. void my_func(__int64 count) { // заполняет массив синусами
  37. for (__int64 i = 0; i < count; i++)
  38. arr[i] = asin((double)((i / count) % 100007));
  39. }
  40.  
  41. int main() {
  42. setlocale(LC_CTYPE, "rus"); // кириллизация
  43. double a, b, result = 0, h;
  44. __int64 t_start, time = 0, freq, minTime = 100000000000000;
  45.  
  46. cout << "Введите a: "; cin >> a;
  47. cout << "\nВведите b: "; cin >> b;
  48.  
  49. my_func(SIZE_DARR);
  50. //h = (b - a) / n;
  51. omp_set_dynamic(0);
  52. cout << "proc = " << omp_get_num_procs() << "\n";
  53. cout << "threads = " << omp_get_num_threads() << "\n";
  54.  
  55. for (int flow = 1; flow <= 8; flow++) {// количество потоков
  56. cout << "\n\nflow = " << flow << "\n_______________" << "\n_______________";
  57.  
  58. for (int n = 100; n <= 1000000; n *= 10) { //гранулярность задачи 10-1000000
  59. h = (b - a) / n;
  60.  
  61. for (int z = 0; z < 5; z++) {
  62. //t_start = __rdtsc();
  63. # pragma omp parallel reduction(+:result) num_threads(flow)
  64. {
  65. t_start = __rdtsc();
  66. for (int i = 1; i < n; i++) {
  67. result += asin((a + i * h) - h / 2);
  68. }
  69. }
  70.  
  71. time = __rdtsc() - t_start;
  72. freq = 1000000.0 * mhz_cpu();
  73. time = 1000000000.0 * time / freq;
  74. if (time < minTime)
  75. minTime = time;
  76. result *= h;
  77. }
  78.  
  79. cout << "\ncountN = " << n;
  80. cout << "\ntime = " << minTime << " мс.\n____________\n";
  81. minTime = 100000000000000;
  82. }
  83.  
  84. }
  85. system("pause");
  86. return 0;
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement