Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

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

И?.. Вопрос о чем? Тема о чем? Оформление кода где?
p51x вне форума Ответить с цитированием
Старый 18.05.2018, 17:14   #3
Валерия0987654321
 
Регистрация: 18.05.2018
Сообщений: 3
По умолчанию

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

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


Купить рекламу на форуме - 42 тыс руб за месяц



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