| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Есть код, написанный на с++ с применением openmp, |
| Автор: Валерия123456 18.5.2018, 09:56 |
| Воопрос: Как можно оптимизировать данный код, так как последовательный код отрабатывает быстрее параллельного( #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"); } |
| Автор: _zorn_ 18.5.2018, 16:20 |
| В чем вопрос ? |