Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Новички в программировании > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 18.05.2018, 11:15   #1
Валерия0987654321
Новичок
 
Регистрация: 18.05.2018
Сообщений: 2
Репутация: 10
Печаль Оптимизация кода с++и 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 в 18:15.
Валерия0987654321 вне форума   Ответить с цитированием
Старый 18.05.2018, 11:42   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 11,049
Репутация: 1862

icq: 216409213
По умолчанию

И?.. Вопрос о чем? Тема о чем? Оформление кода где?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 18.05.2018, 18:14   #3
Валерия0987654321
Новичок
 
Регистрация: 18.05.2018
Сообщений: 2
Репутация: 10
По умолчанию

Вопрос в том, как оптимизировать данную программу, так как последовательный код шустрее отрабатывает(
Валерия0987654321 вне форума   Ответить с цитированием
Старый 18.05.2018, 19:37   #4
WorldMaster
Профессионал
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Адрес: Россия, Мурманск
Сообщений: 1,700
Репутация: 496

icq: 359393755
По умолчанию

Ужас какой-то.
__________________
ICQ - 359393755 E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
Если помог - нажми на весы
WorldMaster на форуме   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация кода AmunRas Общие вопросы по Java, Java SE, Kotlin 1 19.12.2017 23:47
Распараллеливание кусочка кода на Си (MPI && openMP) Quew Общие вопросы C/C++ 0 02.02.2012 19:38
оптимизация кода GerNick Общие вопросы C/C++ 3 24.12.2010 17:40
Оптимизация кода viscas PHP 3 31.05.2009 16:04
Оптимизация кода nusik Общие вопросы Delphi 2 21.05.2009 17:55


14:56.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru