Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Есть код, написанный на с++ с применением openmp, оптимизация кода c++/ openmp 
:(
    Опции темы
Валерия123456
Дата 18.5.2018, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
_zorn_
Дата 18.5.2018, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 21.8.2007

Репутация: нет
Всего: 12



В чем вопрос ?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1092 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.