|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
18.05.2018, 10:15 | #1 |
Регистрация: 18.05.2018
Сообщений: 3
|
Оптимизация кода с++и openmp
Воопрос: Как можно оптимизировать данный код, так как последовательный код отрабатывает быстрее параллельного(
#include #include #include #include #include int main() { // Итерационный параметр = 1.1, параметр точности = 0.000001 double iteration_parameter = 1.1, accuracy_parameter = 0.000001; setlocale(0, ""); double** dataset; double *solution, *previous_solution; int num_rows = 5000, num_columns = 5000; ///*std::ifstream coefficient_file1("coefficients1024 .txt"); //coefficient_file1 >> num_rows >> num_columns;*/ solution = new double[num_rows]; previous_solution = new double[num_rows]; // Параллельная область 0: задача начального приближения // Начальное приближение = (0, ..0) omp_set_num_threads(1000); double time = omp_get_wtime(); #pragma omp parallel for for (int i = 0; i < num_rows; i++) solution[i] = 0; // !ПО0 dataset = new double*[num_rows]; // Параллельная область 1: динамическое выделение памяти под матрицу коэффициентов СЛАУ #pragma omp parallel for for (int i = 0; i < num_rows; i++) dataset[i] = new double[num_columns]; // !ПО1 for (int i = 0; i < num_rows; i++) for (int j = 0; j < num_columns; j++) ///*coefficient_file1 >> dataset[i][j]; //coefficient_file1.close();*/ if((i!=j)&&(j!=(num_rows-1)-i)) dataset[i][j] = 0; double achieved_accuracy; do {achieved_accuracy = 0; // Параллельная область 2: запись значения приближения на прошлом шаге #pragma omp parallel for for (int i = 0; i < num_rows; i++) { previous_solution[i] = solution[i]; } // !ПО2 for (int i = 0; i < num_rows; i++) { double sum1 = 0, sum2 = 0; // Параллельная область 3: поиск следующего solution #pragma omp parallel for reduction(+:sum1) { #pragma omp for reduction(+:sum1) nowait for (int j = 0; j <= i - 1; j++)//(int j = 1; j <= i - 1; j++) { sum1 += dataset[i][j] * solution[j]; ////sqrt(fabs((rand() % 1000000000 - 100000000000000 % 166345 + rand() % 100 * 200) % 3)); } #pragma omp parallel for reduction(+:sum2) for (int j = i + 1; j < num_rows; j++)//(int j = i + 1; j <= num_rows; j++) { sum2 += dataset[i][j] * previous_solution[j]; //sqrt(fabs((rand() % 1000000000 - 100000000000000 % 166345 + rand() % 100 * 200) % 3)); } // !ПО3 sum1 *= (-iteration_parameter); sum2 *= (-iteration_parameter); solution[i] = (sum1 + sum2 + (1 - iteration_parameter) * dataset[i][i] * previous_solution[i] + iteration_parameter * dataset[i][num_columns - 1]) / dataset[i][i]; } // Параллельная область 4: подсчёт достигнутой точности #pragma omp parallel for reduction(+:achieved_accuracy) for (int i = 0; i < num_rows; i++) { achieved_accuracy += (solution[i] - previous_solution[i]) * (solution[i] - previous_solution[i]); } // !ПО4 achieved_accuracy = sqrt(achieved_accuracy); //std::cout << achieved_accuracy << std::endl; } while (achieved_accuracy > accuracy_parameter); delete[] previous_solution; // Параллельная область 5: высвобождение динамически выделенной памяти #pragma omp parallel for for (int i = 0; i < num_rows; i++) delete[] dataset[i]; // !ПО5 delete[] dataset; double time2 = omp_get_wtime() - time; for (int i = 0; i < num_rows; i++) std::cout << solution[i] << ' '; delete[] solution; printf("\nВремя выполнения: %f сек. \n", time2); printf("Достигнута точность: %f.\n", achieved_accuracy); system("PAUSE"); } Последний раз редактировалось Валерия0987654321; 18.05.2018 в 17:15. |
18.05.2018, 10:42 | #2 |
Старожил
Регистрация: 15.02.2010
Сообщений: 15,709
|
И?.. Вопрос о чем? Тема о чем? Оформление кода где?
|
18.05.2018, 17:14 | #3 |
Регистрация: 18.05.2018
Сообщений: 3
|
Вопрос в том, как оптимизировать данную программу, так как последовательный код шустрее отрабатывает(
|
18.05.2018, 18:37 | #4 |
Старожил
Регистрация: 25.08.2011
Сообщений: 2,841
|
Ужас какой-то.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Оптимизация кода | AmunRas | Общие вопросы по Java, Java SE, Kotlin | 1 | 19.12.2017 22:47 |
Распараллеливание кусочка кода на Си (MPI && openMP) | Quew | Общие вопросы C/C++ | 0 | 02.02.2012 19:38 |
оптимизация кода | GerNick | Общие вопросы C/C++ | 3 | 24.12.2010 16:40 |
Оптимизация кода | viscas | PHP | 3 | 31.05.2009 16:04 |
Оптимизация кода | nusik | Общие вопросы Delphi | 2 | 21.05.2009 17:55 |