Created
May 20, 2020 17:24
-
-
Save MrPanch/5f67b40738b30bbfc557d4f325993a9c to your computer and use it in GitHub Desktop.
Revisions
-
MrPanch created this gist
May 20, 2020 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,101 @@ #include <iostream> #include <fstream> #include <sstream> #include <math.h> #include <thread> #include <future> #include "parallel_thread.h" #include "Sole.hpp" #include "file_write.h" struct InitialSCalculation { size_t task_number; Sole* sole; int proc_num; // количество процессов size_t size; std::vector<std::vector<double>>& Rs; std::vector<std::vector<double>>& S; }; double First_part(InitialSCalculation task) { int k_min = task.size/task.proc_num * task.task_number; int k_max = task.size/task.proc_num * (task.task_number + 1); if (task.task_number == task.proc_num - 1) k_max = task.size - 1; // Считаем R для каждой строчки for ( int i = k_min; i < k_max; ++i){ if (i == k_min){ task.Rs[i][0] = task.sole->GetA(i); task.Rs[i][2] = 1; continue; // ЧЕКНИ ЗДЕСЬ ПЛЗ. Я ЖЕ НЕ ЕБУСЬ В ГЛАЗА } task.Rs[i][0] = task.sole->GetA(i); task.Rs[i][2] = 1; task.Rs[i][1] = -task.sole->GetB(i)*task.sole->GetC(i-1); } // Считаем S для данного набора строчке task.S[task.task_number][0] = task.Rs[k_max-1][0]; task.S[task.task_number][1] = task.Rs[k_max-1][1]; task.S[task.task_number][2] = task.Rs[k_max-1][2]; task.S[task.task_number][3] = task.Rs[k_max-1][3]; for (int i = k_max-2; i >= k_min; --i){ task.S[task.task_number] = matrix_mult(task.S[task.task_number], task.Rs[i]); } } struct FinalCalculation{ size_t task_number; int proc_num; // количество процессов size_t size; std::vector<double> final_S; std::vector<std::vector<double>>& Rs; // с предыдущего шага без зименений std::vector<std::future<double>>& d; std::vector<std::future<double>>& l; }; double Second_part(FinalCalculation task){ int k_min = task.size/task.proc_num * task.task_number; int k_max = task.size/task.proc_num * (task.task_number + 1); if (task.task_number == task.proc_num - 1) k_max = task.size - 1; for (int i = k_min; i < k_max; ++i){ task.final_S = matrix_mult(task.final_S, task.Rs[i]); // если понадобится то создам копию task.d[i] = (task.final_S[0] + task.final_S[1]) / (task.final_S[2] + task.final_S[3]); // в чём ошибка? } } int main(int argc, char** argv) { Sole sole(40); int n = 8; // количество потоков std::vector<std::future<double>> d_global(sole.GetHeight()); std::vector<std::future<double>> l_global(sole.GetHeight()); std::vector<std::future<double>> y_global(sole.GetHeight()); std::vector<std::future<double>> x_global(sole.GetHeight()); std::vector<double> final_S; std::vector<std::vector<double>> Rs_global(sole.GetHeight(), std::vector<double>(4, 0)); std::vector<std::vector<double>> S_global(n, std::vector<double>(4, 0)); std::vector<std::future<double>> first_iteration(n); std::vector<std::future<double>> second_iteration(n); for (size_t i = 0; i < n; ++i) { //А разве size_t может принимать значения меньше еденицы? InitialSCalculation task_data{i, &sole , n,sole.GetHeight(), Rs_global, S_global /*d_global, l_global, y_global, x_global*/}; } for (size_t i = 0; i < n; ++i){ FinalCalculation task2_data{i, n, sole.GetHeight(),final_S, Rs_global, d_global, l_global }; } return 0; } /* * to test Thomas A = 2 -1 0 5 4 2 0 1 -3 , f = 3 6 2 * */