main.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include "polynomials.h"
  5. #define MAX 4
  6. typedef struct CPolynomArg {
  7. polynom_multiply_ptr vec;
  8. size_t start;
  9. size_t finish;
  10. } polynom_arg_t, *polynom_arg_ptr;
  11. static unsigned int count_threads = 1;
  12. static unsigned int num_thread = 1;
  13. static unsigned int offset_thread = 1;
  14. void* polynom_multiply_thread(void* pol_ptr);
  15. int program_read_polynoms(polynom_arg_ptr p);
  16. void polynom_arg_free(polynom_arg_ptr p);
  17. int main(void) {
  18. polynom_arg_t argt;
  19. pthread_t* threads_arr;
  20. argt.vec = (polynom_multiply_ptr) malloc(sizeof(polynom_multiply_t));
  21. argt.vec->size = 0;
  22. argt.vec->data = create_vector_2d(1);
  23. while (program_read_polynoms(&argt) != 1) {
  24. printf("%d\n", argt.vec->size);
  25. }
  26. count_threads = argt.vec->size / 2;
  27. polynom_arg_ptr argth = (polynom_arg_ptr) malloc(sizeof(polynom_arg_t) * count_threads);
  28. threads_arr = (pthread_t *) malloc(sizeof(pthread_t) * count_threads);
  29. int count_operations = 1;
  30. while (count_operations * 2 < argt.vec->size) {
  31. count_operations *= 2;
  32. }
  33. argth->vec = argt.vec;
  34. while (offset_thread != count_operations) {
  35. argth[0].start = 0;
  36. argth[0].finish = offset_thread;
  37. for (int i = 1; i < count_threads; ++i) {
  38. argth[i].vec = argt.vec;
  39. argth[i].start = argth[i - 1].start + 2 * offset_thread;
  40. argth[i].finish = argth[i - 1].finish + 2 * offset_thread;
  41. }
  42. for (int i = 0; i < count_threads; ++i) {
  43. pthread_create(&threads_arr[i], NULL, polynom_multiply_thread, &argth[i]);
  44. }
  45. for (int i = 0; i < count_threads; ++i) {
  46. pthread_join(threads_arr[i], NULL);
  47. }
  48. offset_thread *= 2;
  49. count_threads /= 2;
  50. }
  51. printf("%d\n", argt.vec->size);
  52. argth[0].start = 0;
  53. argth[0].finish = offset_thread;
  54. pthread_create(&threads_arr[0], NULL, polynom_multiply_thread, &argth[0]);
  55. pthread_join(threads_arr[0], NULL);
  56. for (int i = 0; i < argth[0].vec->data->data[0]->size; ++i) {
  57. printf("%d ", argth[0].vec->data->data[0]->data[i]);
  58. }
  59. printf("\n");
  60. polynom_arg_free(&argt);
  61. free(argth);
  62. free(threads_arr);
  63. return 0;
  64. }
  65. void* polynom_multiply_thread(void* pol_ptr) {
  66. polynom_arg_ptr p = (polynom_arg_t *) pol_ptr;
  67. polynom_ptr tmp;
  68. polynom_ptr p1 = polynom_create(p->vec->data->data[p->start]);
  69. polynom_ptr p2 = polynom_create(p->vec->data->data[p->finish]);
  70. tmp = polynom_multiply(p1, p2);
  71. vector_free(p->vec->data->data[p->start]);
  72. p->vec->data->data[p->start] = tmp->data;
  73. free(tmp);
  74. free(p1->data->data);
  75. free(p2->data->data);
  76. free(p1->data);
  77. free(p2->data);
  78. free(p1);
  79. free(p2);
  80. }
  81. void polynom_arg_free(polynom_arg_ptr p) {
  82. for (int i = 0; i < p->vec->data->size; ++i) {
  83. free(p->vec->data->data[i]->data);
  84. free(p->vec->data->data[i]);
  85. }
  86. free(p->vec->data->data);
  87. free(p->vec->data);
  88. free(p->vec);
  89. }
  90. int program_read_polynoms(polynom_arg_ptr p) {
  91. vector_t* vtmp = create_vector(MAX);
  92. char c;
  93. int num;
  94. int t = scanf("%d", &num);
  95. if (t > 0)
  96. vector_push_back(vtmp, num);
  97. else
  98. return 1;
  99. while ((c = getchar()) != '\n') {
  100. scanf("%d", &num);
  101. vector_push_back(vtmp, num);
  102. }
  103. polynom_insert(p->vec, vtmp);
  104. vector_free(vtmp);
  105. return 0;
  106. }