Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
В чем вопрос ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)