Всем привет, сегодня я расскажу как заставить наши простые программки работать быстрее. Понятное дело что любую программу можно ускорить более эффективным алгоритмом, но что если решения эффективнее 3 вложенных циклов не находится? Тогда на помощь приходит параллельное программирование и вспомогательная библиотека OpenMp, доступная в Visual Studio из коробки. Для начала создадим новый пустой проект: Скрин Далее необходимо зайти в настройки проекта: Скрин Затем необходимо выбрать: Congiguration->All Configurations Platform->All platforms C/C++ ---> Language ---> Open MP Support ---> Yes. Все Показано на скрине ниже: Скрин Все мы настроили проект теперь можно переходить к программированию: Самое главное что необходимо усвоить это то, что все распараллеливание выполняется с помощью препроцессорных директив таких как: #pragma omp parallel num_threads(4) Код #pragma omp parallel num_threads(4) Часть строки #pragma omp является обязательной, а за ней следует дальнейшие указания для нашей программы. Директива parallel создает параллельный регион для следующего за ней структурированного блока, например: #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; } Код #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; } Скриншот времени выполнения А теперь тот же самый код без строки: #pragma omp parallel for num_threads(4) Скриншот времени выполнения Прирост производительности около 10-15 мс только в этой простенькой программе, в более сложных системах прирост может быть критическим, если тема будет актуальной то продолжу рассказывать об OpenMP, расскажу о типичных ошибках, синхронизации потоков и прочем. Ждите.
PabIoEscobar, Нет, я серьезно. Мне вот совсем не смешно. Я хочу открыть пэйнт, чтобы порисовать там, а мой ПК открывает тысячу вкладок, потому, что я держал клавишу мыши слишком долго для его восприятия