Как включить openmp в visual studio 2019

Обновлено: 08.07.2024

Visual Studio settings

Вышесказанное означает, что мы можем взять обыкновенный последовательный код на языке Си/Си++ и начать его постепенно распараллеливать. Для этого нам достаточно включить в проекте поддержку OpenMP. В среде Visual Studio 2005/2008 зайдите в свойства проекта и выберете вкладку C/C++ / Language, как показано на рисунке 1.

Рисунок 1 — Вкладка Visual Studio с настройками проекта, где можно включить поддержку OpenMP

Select platform

Не забудьте также выбрать платформы и конфигурации, в которых вы планируете использовать OpenMP. Как показано на рисунке 2, мы выбрали все конфигурации (debug, release) и все платформы (Win32, x64).

Рисунок 2 — Выбор конфигураций и платформ, для которых мы устанавливаем параметры

OpenMP ON

Поддержка OpenMP включается опцией «OpenMP Support» как показано на рисунке 3.

Рисунок 3 — Поддержка OpenMP включена

Вот и все подготовительные шаги, которые необходимы, чтобы начать осваивать технологию OpenMP и распараллеливать программный код. Знакомство с OpenMP мы начнем со следующей заметки. Сейчас мы продолжим знакомство с инструментами. Дело в том, что хотя возможностей Visual Studio 2005/2008 достаточно чтобы разрабатывать параллельные OpenMP программы, это слишком спартанские условия. Для полноценной работы разумно воспользоваться Intel Parallel Studio. Я не сотрудник Intel и за рекламу инструментов мне никто не платит. Parallel Studio действительно удобный и крайне полезный инструмент для разработки параллельных приложений. Рекомендую на основании собственного опыта.

Parallel Studio Toolbars

Дистрибутив Intel Parallel Studio занимает порядка 460 Мбайт и доступен для скачивания с сайта Intel. При этом полная функциональность Parallel Studio будет доступна в течении одного пробного месяца, что вполне достаточно, чтобы познакомиться с принципами работы и поэкспериментировать с параллельным кодом. Parallel Studio интегрируется внутрь Visual Studio 2005/2008, добавляя дополнительные пункты меню и в панель инструментов (смотри рисунок 4).

Рисунок 4 — Панели инструментов, добавляемые Intel Parallel Studio в Visual Studio

В следующих параллельных заметках мы будем использовать инструмент IntelParallel Inspector из комплекта Intel Parallel Studio для проверки создаваемого параллельного кода на наличие параллельных ошибок. А также Intel Parallel Amplifier для оптимизации. Компилятор Intel Parallel Composer нам не обязателен, но мы будем компилировать OpenMP приложения им. В качестве преимущества можно назвать поддержку Intel Parallel Composer версии стандарта OpenMP 3.0, в то время как компилятор из Visual Studio 2005/2008 поддерживает только OpenMP 2.0. Также Intel C++ дает некоторые дополнительные возможности по статическому анализу параллельного кода, о чем можно прочитать в статье.

Select Intel C++

Для компиляции приложения с использованием Parallel Composer следует сделать активным компилятором Intel C++. Это можно осуществить используя кнопку «Use Intel C++» на панели инструментов, как показано на рисунке 5.

Рисунок 5 — Выбор компилятора Intel C++

Set Environment

Попробуйте просто перезапустить Visual Studio, чтобы в силу вступили изменения которые прописывает Parallel Studio в среду окружения. Если и это не поможет, воспользуйтесь ручной установкой окружения, запустив соответствующие командные фалы. Они доступны из меню пуск, как показано на рисунке 7.

Рисунок 7 — Установка настроек среды

Закончим пока на этом первое знакомство с инструментами. Скачивайте и устанавливайте Intel Parallel Studio. Попробуйте собрать какую-нибудь свою простую программу с использованием Intel C++.

Прежде чем приступить к изучению методики распараллеливания программ с помощью технологии OpenMP рассмотрим инструментарий, который нам потребуется. А потребуется нам в первую очередь Visual Studio 2005/2008 и Intel® Parallel Studio.

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image1.jpg

Вышесказанное означает, что мы можем взять обыкновенный последовательный код на языке Си/Си++ и начать его постепенно распараллеливать. Для этого нам достаточно включить в проекте поддержку OpenMP. В среде Visual Studio 2005/2008 зайдите в свойства проекта и выберете вкладку C/C++ / Language, как показано на рисунке 1.

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image2.jpg

Рисунок 1 - Вкладка Visual Studio с настройками проекта, где можно включить поддержку OpenMP

Не забудьте также выбрать платформы и конфигурации, в которых вы планируете использовать OpenMP. Как показано на рисунке 2, мы выбрали все конфигурации (debug, release) и все платформы (Win32, x64).

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image3.jpg

Рисунок 2 - Выбор конфигураций и платформ, для которых мы устанавливаем параметры

Поддержка OpenMP включается опцией "OpenMP Support" как показано на рисунке 3.

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image4.jpg

Рисунок 3 - Поддержка OpenMP включена

Вот и все подготовительные шаги, которые необходимы, чтобы начать осваивать технологию OpenMP и распараллеливать программный код. Знакомство с OpenMP мы начнем со следующей заметки. Сейчас мы продолжим знакомство с инструментами. Дело в том, что хотя возможностей Visual Studio 2005/2008 достаточно чтобы разрабатывать параллельные OpenMP программы, это слишком спартанские условия. Для полноценной работы разумно воспользоваться Intel® Parallel Studio. Я не сотрудник Intel и за рекламу инструментов мне никто не платит. Parallel Studio действительно удобный и крайне полезный инструмент для разработки параллельных приложений. Рекомендую на основании собственного опыта.

Дистрибутив Intel® Parallel Studio занимает порядка 460 Мбайт и доступен для скачивания с сайта Intel. При этом полная функциональность Parallel Studio будет доступна в течении одного пробного месяца, что вполне достаточно, чтобы познакомиться с принципами работы и поэкспериментировать с параллельным кодом. Parallel Studio интегрируется внутрь Visual Studio 2005/2008, добавляя дополнительные пункты меню и в панель инструментов (смотри рисунок 4).

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image5.jpg

В следующих параллельных заметках мы будем использовать инструмент Intel®Parallel Inspector из комплекта Intel® Parallel Studio для проверки создаваемого параллельного кода на наличие параллельных ошибок. А также Intel® Parallel Amplifier для оптимизации. Компилятор Intel® Parallel Composer нам не обязателен, но мы будем компилировать OpenMP приложения им. В качестве преимущества можно назвать поддержку Intel® Parallel Composer версии стандарта OpenMP 3.0, в то время как компилятор из Visual Studio 2005/2008 поддерживает только OpenMP 2.0. Также Intel C++ дает некоторые дополнительные возможности по статическому анализу параллельного кода, о чем можно прочитать в статье.

Для компиляции приложения с использованием Parallel Composer следует сделать активным компилятором Intel C++. Это можно осуществить используя кнопку "Use Intel C++" на панели инструментов, как показано на рисунке 5.

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image6.jpg

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image7.jpg

Попробуйте просто перезапустить Visual Studio, чтобы в силу вступили изменения которые прописывает Parallel Studio в среду окружения. Если и это не поможет, воспользуйтесь ручной установкой окружения, запустив соответствующие командные фалы. Они доступны из меню пуск, как показано на рисунке 7.

0058_Parallel_notes_N2_-_toolkit_for_OpenMP_ru/image8.jpg

Закончим пока на этом первое знакомство с инструментами. Скачивайте и устанавливайте Intel® Parallel Studio. Попробуйте собрать какую-нибудь свою простую программу с использованием Intel C++.

Библиотека OpenMP часто используется в математических вычислениях, т.к. позволяет очень быстро и без особого труда распараллелить вашу программу. При этом, идеология OpenMP не очень хорошо подойдет, скажем, при разработке серверного ПО (для этого существуют более подходящие инструменты).

Этой библиотеке посвящено множество книг и статей. Наиболее популярными являются книги Антонова [3] и Гергеля [4], мной также был написан ряд статей (поверхностных) по этой теме [5,6], и ряд примеров программ на нашем форуме [7]. На мой взгляд, у этих книг есть ряд недостатков (которые я, конечно, исправляю):

Вычислительные системы. Идеология OpenMP


рис.2 директива omp parallel

openmp_race_condition

Программа описывает переменную value , общую для всех потоков. Каждый поток увеличивает значение переменной, а затем выводит полученное значение на экран. Я запустил ее на двухъядерном компьютере, получил следующие результаты:
Проблема гонки потоков OpenMP

Для ряда операций более эффективно использовать директиву atomic , чем критическую секцию. Она ведет себя также, но работает чуть быстрее. Применять ее можно для операций префиксного/постфиксного инкремента/декремента и операции типа X BINOP = EXPR , где BINOP представляет собой не перегруженный оператор +, *, -, /, &, ^, |, <<, >> . Пример использования такой директивы:

Разделение задач между потоками

Параллельный цикл

Параллельный цикл позволяет задать опцию schedule , изменяющую алгоритм распределения итераций между потоками. Всего поддерживается 3 таких алгоритма. Далее полагаем, что у нас p потоков выполняют n итераций:

В статье про параллельный цикл также описаны опции nowait и reduction . Первая из них очень редко даст ощутимый выигрыш, а вторую я рекомендую использовать как можно чаще (вместо критических секций). В той статье reduction использовалась во всех примерах и за счет этого удалось избежать явного использования критических секций, однако это удается не всегда и поэтому стоит знать что у нее внутри. Итак, параллельно вычислить сумму элементов массива можно так:

Такой подход используется постоянно, поэтому я рекомендую внимательно рассмотреть этот код. Чуть более сложным примером является параллельный поиск максимума/минимума [9]. В качестве задачи для проверки усвоения материала предлагаю попробовать построить гистограмму (например для изображения).

Параллельные задачи (parallel tasks)

Иногда такую ситуацию нелегко обнаружить, например, на нашем форуме можно найти параллельную реализацию решения СЛАУ методом Крамера, при этом параллельно вычисляется n определителей. Функция вычисления определителя вызывает функцию сведения матрицы к треугольному виду, которая может быть распараллелена.

Параллельные секции

Механизм параллельных секций видится мне достаточно низкоуровневым. Тем не менее, он полезен в ряде случаев. Как было отмечено выше, параллельный цикл можно применять только в случаях, если итерации цикла не зависят друг от друга, т.е. тут нельзя:

Заключение и дополнительная литература

Введение в параллельные вычисления: настройка OpenMP в Microsoft Visual Studio

Каталог статей


В настоящее время я изучаю курс параллельного программирования, в котором используется среда OpenMP. OpenMP - это набор решений для управляемой обработки компиляции, который получил широкое распространение при разработке многопроцессорного программирования в параллельных системах с общей памятью. Я уверен, что многие люди будут его использовать.
Когда новички начнут работать с OpenMP, они столкнутся с проблемами конфигурации среды. Здесь я использую обычно используемый компилятор Microsoft Visual Studio для настройки операционной среды OpenMP, чтобы помочь вам решить проблемы конфигурации OpenMP. .

Процесс установки опускается, и введение начинается после установки. В качестве примера приведу профессиональную версию Visual Studio 2019.

Сначала создайте новый проект, вот консольное приложение C ++.


После создания вы можете найти Обозреватель решений и увидеть созданный вами проект.


следующийЩелкните правой кнопкой мышиЩелкните созданный проект или проект на верхней панели задач, выберитеАтрибуты。

После открытия страницы свойств щелкнитеC/C++ —> Язык, Измените следующую конфигурацию, как показано на рисунке, а затем нажмите ** «Применить», «ОК» **.


В результате, если вы выведете «hello, world» с тем же количеством строк, что и количество потоков компьютера, конфигурация должна быть успешной.

(Напоминание: если есть только одна строка вывода, высока вероятностьНе являетсяПотому что на вашем компьютере только один поток 😜)


Мой вывод:


Результат:

Хотя при этом не достигается оптимальный эффект ускорения многопоточности, все же очевидно, что по мере увеличения количества процессов время выполнения значительно сокращается.

Читайте также: