main.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include <omp.h>
  2. #include <iostream>
  3. #include <cmath>
  4. #include <list>
  5. #include <tuple>
  6. //#include <chrono>
  7. #include <cstdlib>
  8. #include "data_format.hpp"
  9. #include "data_output.hpp"
  10. #include "function.hpp"
  11. #include "integral_calc.hpp"
  12. void calc_test(std::list<trip_t>&, Interval_t&, double, size_t, bool);
  13. int main(int argc, char* argv[]){
  14. freopen("input.txt", "r", stdin);
  15. size_t threads_num = (argc < 2)? 4 : atoi(argv[1]);
  16. size_t test_count = 0;
  17. Interval_t main_interval;
  18. double param = 0;
  19. std::list<double> increase_count_list;
  20. std::cin >> main_interval.inf;
  21. std::cin >> main_interval.sup;
  22. std::cin >> param;
  23. std::cin >> test_count;
  24. for(int i = 0; i < test_count; ++i){
  25. double calc_param = 0;
  26. std::cin >> calc_param;
  27. increase_count_list.push_back((calc_param >=1)? calc_param : 1.0 / calc_param);
  28. }
  29. std::cout << "MAX threads num: " << omp_get_max_threads() << '\n';
  30. omp_set_num_threads(threads_num);
  31. #pragma omp parallel master
  32. std::cout << "Threads num in parallel area: " << omp_get_num_threads() << '\n';
  33. #pragma omp parallel
  34. {
  35. #pragma omp critical
  36. std::cout << "Number of each thread: " << omp_get_thread_num() << '\n';
  37. }
  38. std::endl(std::cout);
  39. bool mode = false;
  40. do{
  41. if(!mode)
  42. // Static schedule, chunk = 10, 100, 1000
  43. std::cout << "Schedule: static\n";
  44. else
  45. // Dynamic schedule, chunk = 10, 100, 1000
  46. std::cout << "Schedule: dynamic\n";
  47. for(int j = 10; j <= 1000; j *= 10){
  48. std::cout << "Chunk: " << j << '\n';
  49. std::list<trip_t> integral_list;
  50. for(int i = 0; i < test_count; ++i){
  51. main_interval.increase_count = increase_count_list.front();
  52. increase_count_list.push_back(increase_count_list.front());
  53. increase_count_list.pop_front();
  54. calc_test(integral_list, main_interval, param, j, mode);
  55. }
  56. print_table_2(integral_list);
  57. }
  58. mode = !mode;
  59. }while(mode);
  60. return 0;
  61. }
  62. void calc_test(std::list<trip_t>& integral_list, Interval_t& main_interval, double param, size_t chunk,bool flag){
  63. double integral_val = 0;
  64. //auto t_start = std::chrono::high_resolution_clock::now();
  65. double t_start = omp_get_wtime();
  66. integral_val = integral_calc(param, main_interval, chunk, flag);
  67. double exact_val = primal(main_interval.sup, param) - primal(main_interval.inf, param);
  68. double err = fabsl(integral_val - exact_val) / fabsl(integral_val);
  69. //const auto t_end = std::chrono::high_resolution_clock::now();
  70. //double difftime = std::chrono::duration<double>(t_end - t_start).count();
  71. double difftime = omp_get_wtime() - t_start;
  72. integral_list.push_back(std::make_tuple(main_interval.increase_count, err, difftime));
  73. }