|
Модераторы: bsa |
|
Валерия123456 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 18.5.2018 Репутация: нет Всего: нет |
Воопрос: Как можно оптимизировать данный код, так как последовательный код отрабатывает быстрее параллельного(
#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"); } Это сообщение отредактировал(а) Валерия123456 - 18.5.2018, 17:16 |
|||
|
||||
_zorn_ |
|
|||
Эксперт Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 21.8.2007 Репутация: нет Всего: 12 |
В чем вопрос ?
|
|||
|
||||
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |