Загрузка...

Делаем Наши Программы Быстрее

Тема в разделе C/C++ создана пользователем ILLICIT_inactive550572 13 авг 2018. 495 просмотров

  1. ILLICIT_inactive550572
    ILLICIT_inactive550572 Автор темы 13 авг 2018 Вы скоро сдохните от желания выделиться... 32 13 авг 2018
    Всем привет, сегодня я расскажу как заставить наши простые программки работать быстрее.
    Понятное дело что любую программу можно ускорить более эффективным алгоритмом, но что если решения эффективнее 3 вложенных циклов не находится?
    Тогда на помощь приходит параллельное программирование и вспомогательная библиотека OpenMp, доступная в Visual Studio из коробки.
    Для начала создадим новый пустой проект:
    [IMG]
    Далее необходимо зайти в настройки проекта:
    [IMG]
    Затем необходимо выбрать:
    • Congiguration->All Configurations
    • Platform->All platforms
    • C/C++ ---> Language ---> Open MP Support ---> Yes.
    Все Показано на скрине ниже:
    [IMG]
    Все мы настроили проект теперь можно переходить к программированию:
    Самое главное что необходимо усвоить это то, что все распараллеливание выполняется с помощью препроцессорных директив таких как:
    Код
    #pragma omp parallel num_threads(4)
    Часть строки #pragma omp является обязательной, а за ней следует дальнейшие указания для нашей программы.
    Директива parallel создает параллельный регион для следующего за ней структурированного блока, например:
    Код
    #pragma omp parallel [другие директивы]
    структурированный блок
    Структурированный блок это нечто наподобие цикла for, все что внутри него будет распараллелено.
    Директива num_threads(n) говорит о том сколько потоков будет использоваться, в моем случае это 4.

    Вот некий пример кода с использованием OpenMp:
    Код

    #include <iostream>
    #include <ctime>

    using namespace std;

    int main()
    {

    unsigned int cl1 = clock();
    int sum = 0;
    #pragma omp parallel for num_threads(4)
    for (int i = 1; i < 1000000; ++i)
    {
    sum += sum % i;
    sum += sum / i;
    }
    unsigned int cl2 = clock();
    cout << sum << endl;
    cout << "Work Time: " << cl2 - cl1 << "ms" << endl;
    system("pause");
    return 0;
    }
    [IMG]
    А теперь тот же самый код без строки: #pragma omp parallel for num_threads(4)
    [IMG]
    Прирост производительности около 10-15 мс только в этой простенькой программе, в более сложных системах прирост может быть критическим, если тема будет актуальной то продолжу рассказывать об OpenMP, расскажу о типичных ошибках, синхронизации потоков и прочем. Ждите.
     
  2. dec0d3d
    dec0d3d 16 авг 2018 14 25 фев 2017
    В stl есть ещё модуль thread
     
  3. San32_inactive330533
    San32_inactive330533 22 авг 2018 Заблокирован(а) 1 9 мар 2018
    А как заставить их работать медленнее? Очень нужно
     
  4. PabIoEscobar
  5. San32_inactive330533
    San32_inactive330533 22 авг 2018 Заблокирован(а) 1 9 мар 2018
    PabIoEscobar, у меня просто ПК слишком быстрый. Я хочу его замедлить, а то не поспеваю за ним вообще
     
  6. sQueaky
    sQueaky 22 авг 2018 Плати за жизнь 14 16 авг 2018
    Respect
     
  7. PabIoEscobar
  8. PabIoEscobar
    вообще из за этого с пк нечего не случится?)
     
  9. San32_inactive330533
    San32_inactive330533 22 авг 2018 Заблокирован(а) 1 9 мар 2018
    PabIoEscobar, Нет, я серьезно. Мне вот совсем не смешно. Я хочу открыть пэйнт, чтобы порисовать там, а мой ПК открывает тысячу вкладок, потому, что я держал клавишу мыши слишком долго для его восприятия
     
  10. PabIoEscobar
  11. ILLICIT_inactive550572
    ILLICIT_inactive550572 Автор темы 22 авг 2018 Вы скоро сдохните от желания выделиться... 32 13 авг 2018
    это же не оффтопик блять:facepalm:
     
  12. KitsuneDev
    KitsuneDev 3 сен 2018 628 27 дек 2017
Загрузка...
Top