Форум программистов, компьютерный форум CyberForum.ru

Как добиться ускорения OpenMP C++ - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как правильно задекларировать функцию на Dev C++? http://www.cyberforum.ru/cpp/thread1725360.html
у меня windows xp.Делаю простую консольку на с,для вывода графика функции на консоль.Сам графический режим работает. initgraph(&gdriver,&gmode,PATHTODRIVER); //Нужно ли или просто пустые кавычки поставить вместо PATHTODRIVER //построение графика фукции //у = 2sin(x)ev,a #include <graphics.h> #include <stdio.h> #include <conio.h>
C++ Как обратится к звуковой карте? Решил все-таки создать тему.... Итак, у меня есть аудиофайл (к примеру wave) мне нужно сравнить его со звуком на out-путе звуковой карты, т.е. любой звук который будет воспроизводится на компьютере, будет сравниватся с аудиофайлом ПоБиТнО. Как сравнить два файла, которые просто валяются на диске, сделаю без проблем. А вот как же мне обратится именно к звуковой карте? ( или может подскажете... http://www.cyberforum.ru/cpp/thread1724722.html
Кодирование сверточным кодом C++
кто может написать программу кодирования сверточным кодом? Ну или хотя бы кодирование любым кодом, чтобы можно было закодировать док.
C# or C++ C++
Здравствуйте, мне интересно почему на C# обычно пишут интерфейс программы, а на C++ саму логику программы. Почему нельзя использовать тотже C++ Gui вместо C#?
C++ Проверка либы http://www.cyberforum.ru/cpp/thread1724269.html
Здравствуйте. Нужно мне воспользоваться OCCI (оракловским С++ апи). Скачал для этого нужные либы с их сайта, файлы .lib закинул в MinGW/lib (использую CodeBlocks), dll в каталог с проектом, пробую компилить, однако линковщик ругается (undefined reference) на статические функции (именно на 2 статические функции, если их закомментировать, и оставить создание ссылки на класс из этой же библиотеки и...
C++ Потеря значения итератора после push_back() Подскажите, как получить указатель на элемент вектора так, чтобы после изменения вектора указатель на элемент не затерся. std::vector<int> a; a.push_back(12); std::vector<int>::iterator it; it = a.begin(); int b = it; a.push_back(13); //Тут interator теряет связь с вектором int c = it; //Ошибка подробнее

Показать сообщение отдельно
Petrolion
24 / 24 / 7
Регистрация: 02.02.2016
Сообщений: 124
03.05.2016, 20:02
Хотел уточнить, в какой среде используете OMP?
MS VS нужно в свойствах проекта еще разрешить, иначе балласт.
Сколько ядер доступно в системе? Если ядер меньше 3 то omp_set_num_threads(3); бесполезен.
Не обязательно заходить в параллельную секцию, чтобы выполнить параллельный for. Вход-выход в секцию занимает время. Уж если зашли, так не выходите.
Но в вашем случае потери должны быть минимальны. И для вашего же случая k настолько мало, что накладные расходы по созданию и завершению процесса могут превысить полезный эффект. (Шла бы речь о k = 100; или более...). Так что ваши догадки правильные.
Попробуйте изменить алгоритм загрузив параллельные потоки, при минимальном их создании/удалении.
Например оптимизировать с 83 по 97 строки кода:
C++
1
2
3
4
5
6
7
8
9
10
11
12
F0 = func(t,y);
#pragma omp for
     for (int i=0; i<k; i++)
          for (int j=0; j<nx; j++)
          {
                 u[i][j] = y[j] + tk[i]*F0[j];
                 if (i == k-1)
                 {
                        uk[j] = u[k-1][j];
                        u0[j] = y[j];
                 }
          }
И т.д.
(Кстати, имхо, в 84 строке у вас ошибка. Почему не рушатся данные или не ругается ваш компилятор...)
А ваша функция быстрее будет работать с другой оптимизацией:
C++
1
2
3
4
5
6
7
8
9
10
11
double* func(double t , double* x)
{ //***** Функция вычисления правой части дифференциального уравнения
  // x(1) - psi, x(2) - theta, x(3) - fi
  double *z = new double[3];
  double si22 = 0.1*sin(2*M_PI*2*t);
  double si23 = 0.152*sin(2*M_PI*3*t);
  z[0] = (si22*cos(x[2]) - si23*sin(x[2])) / cos(x[1]);
  z[1] = si22*sin(x[2]) + si23*cos(x[2]);
  z[2] = 0.052*sin(2*M_PI*1*t) - (si22*cos(x[2]) - si23*sin(x[2]))*tan(x[1]); 
  return z;
}
Добавлено через 28 минут
Кажется здесь вы неэффективно используете reduction.
Цитата Сообщение от Annie Moro Посмотреть сообщение
#pragma omp parallel for reduction(+:norm_uk)
for (int j=0; j<nx; j++){
norm_uk += uk[j]*uk[j];
}
#pragma omp parallel for reduction(+:norm_u)
for (int j=0; j<nx; j++){
norm_u *+= u[k-1][j]*u[k-1][j];
}
Т.к. временные издержки ее создания превышают даже издержки создания параллельной секции. А для цикла всего из 3-х элементов.... в трехпоточной секции... да еще последовательно два таких цикла...
Судите сами.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru