/openmp (Enable OpenMP Support)
Causes the compiler to process #pragma omp directives in support of OpenMP.
Syntax
/openmp
/openmp:experimental
/openmp:llvm
Remarks
#pragma omp is used to specify Directives and Clauses. If /openmp isn’t specified in a compilation, the compiler ignores OpenMP clauses and directives. OpenMP Function calls are processed by the compiler even if /openmp isn’t specified.
The C++ compiler currently supports the OpenMP 2.0 standard. However, Visual Studio 2019 also now offers SIMD functionality. To use SIMD, compile by using the /openmp:experimental option. This option enables both the usual OpenMP features, and OpenMP SIMD features not available when using the /openmp switch.
Starting in Visual Studio 2019 version 16.9, you can use the experimental /openmp:llvm option instead of /openmp to target the LLVM OpenMP runtime. Support currently isn’t available for production code, since the required libomp DLLs aren’t redistributable. The option supports the same OpenMP 2.0 directives as /openmp . And, it supports all the SIMD directives supported by the /openmp:experimental option. It also supports unsigned integer indices in parallel for loops according to the OpenMP 3.0 standard. For more information, see Improved OpenMP Support for C++ in Visual Studio.
Currently, the /openmp:llvm option only works on the x64 architecture. The option isn’t compatible with /clr or /ZW .
Applications compiled by using both /openmp and /clr can only be run in a single application domain process. Multiple application domains aren’t supported. That is, when the module constructor ( .cctor ) is run, it detects if the process is compiled using /openmp , and if the app is loaded into a non-default runtime. For more information, see appdomain , /clr (Common Language Runtime Compilation), and Initialization of Mixed Assemblies.
If you attempt to load an app compiled using both /openmp and /clr into a non-default application domain, a TypeInitializationException exception is thrown outside the debugger, and a OpenMPWithMultipleAppdomainsException exception is thrown in the debugger.
These exceptions can also be raised in the following situations:
If your application is compiled using /clr but not /openmp , and is loaded into a non-default application domain, where the process includes an app compiled using /openmp .
If you pass your /clr app to a utility, such as regasm.exe, which loads its target assemblies into a non-default application domain.
The common language runtime’s code access security doesn’t work in OpenMP regions. If you apply a CLR code access security attribute outside a parallel region, it won’t be in effect in the parallel region.
Microsoft doesn’t recommend that you write /openmp apps that allow partially trusted callers. Don’t use AllowPartiallyTrustedCallersAttribute, or any CLR code access security attributes.
To set this compiler option in the Visual Studio development environment
Open the project’s Property Pages dialog box. For details, see Set C++ compiler and build properties in Visual Studio.
Expand the Configuration Properties > C/C++ > Language property page.
Modify the OpenMP Support property.
To set this compiler option programmatically
- See OpenMP.
Example
The following sample shows some of the effects of thread pool startup versus using the thread pool after it has started. Assuming an x64, single core, dual processor, the thread pool takes about 16 ms to start up. After that, there’s little extra cost for the thread pool.
When you compile using /openmp , the second call to test2 never runs any longer than if you compile using /openmp- , as there’s no thread pool startup. At a million iterations, the /openmp version is faster than the /openmp- version for the second call to test2. At 25 iterations, both /openmp- and /openmp versions register less than the clock granularity.
If you have only one loop in your application and it runs in less than 15 ms (adjusted for the approximate overhead on your machine), /openmp may not be appropriate. If it’s higher, you may want to consider using /openmp .
Параллельные заметки №2 – инструментарий для OpenMP
Прежде чем приступить к изучению методики распараллеливания программ с помощью технологии OpenMP рассмотрим инструментарий, который нам потребуется. А потребуется нам в первую очередь Visual Studio 2005/2008 и Intel Parallel Studio.
Преимущество технологии OpenMP заключается в том, что взяв код последовательной программы, можно распараллелить его без существенной модификации. Это достигается расстановкой специальных директив. Конечно, на практике придется не только вставлять директивы, но и править сам код приложения, но этих изменений будет гораздо меньше, чем если использовать альтернативные технологии, такие как MPI.
Вышесказанное означает, что мы можем взять обыкновенный последовательный код на языке Си/Си++ и начать его постепенно распараллеливать. Для этого нам достаточно включить в проекте поддержку OpenMP. В среде Visual Studio 2005/2008 зайдите в свойства проекта и выберете вкладку C/C++ / Language, как показано на рисунке 1.
Рисунок 1 — Вкладка Visual Studio с настройками проекта, где можно включить поддержку OpenMP
Не забудьте также выбрать платформы и конфигурации, в которых вы планируете использовать OpenMP. Как показано на рисунке 2, мы выбрали все конфигурации (debug, release) и все платформы (Win32, x64).
Рисунок 2 — Выбор конфигураций и платформ, для которых мы устанавливаем параметры
Поддержка OpenMP включается опцией «OpenMP Support» как показано на рисунке 3.
Рисунок 3 — Поддержка OpenMP включена
Следующим шагом является подключение заголовочного файла «omp.h». Часто рационально поместить «#include <omp.h>» в stdafx.h, чтобы он был виден во всем проекте.
Вот и все подготовительные шаги, которые необходимы, чтобы начать осваивать технологию 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).
Рисунок 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++ дает некоторые дополнительные возможности по статическому анализу параллельного кода, о чем можно прочитать в статье.
Для компиляции приложения с использованием Parallel Composer следует сделать активным компилятором Intel C++. Это можно осуществить используя кнопку «Use Intel C++» на панели инструментов, как показано на рисунке 5.
Рисунок 5 — Выбор компилятора Intel C++
Теперь для сборки приложения будет использоваться компилятор Intel C++. Да, если после компиляции и запуска приложения вы увидите сообщение, подобное тому что показано на рисунке 6, то не расстраивайтесь.
Рисунок 6 — Ошибка запуска тестового приложения после перекомпиляции с использованием Intel C++
Попробуйте просто перезапустить Visual Studio, чтобы в силу вступили изменения которые прописывает Parallel Studio в среду окружения. Если и это не поможет, воспользуйтесь ручной установкой окружения, запустив соответствующие командные фалы. Они доступны из меню пуск, как показано на рисунке 7.
Рисунок 7 — Установка настроек среды
Закончим пока на этом первое знакомство с инструментами. Скачивайте и устанавливайте Intel Parallel Studio. Попробуйте собрать какую-нибудь свою простую программу с использованием Intel C++.
/openmp (Включить поддержку OpenMP)
Заставляет компилятор обрабатывать #pragma omp директивы для поддержки OpenMP.
Синтаксис
/openmp
/openmp:experimental
/openmp:llvm
Remarks
#pragma omp используется для указания директив и предложений. Если /openmp параметр не указан при компиляции, компилятор игнорирует предложения и директивы OpenMP. Вызовы функций OpenMP обрабатываются компилятором, даже если /openmp не указаны.
Компилятор C++ в настоящее время поддерживает стандарт OpenMP 2,0. однако Visual Studio 2019 теперь также предлагает функции SIMD. Чтобы использовать SIMD, Скомпилируйте с помощью /openmp:experimental параметра. Этот параметр включает как обычные функции OpenMP, так и функции OpenMP SIMD, недоступные при использовании /openmp параметра.
начиная с Visual Studio 2019 версии 16,9 можно использовать экспериментальный /openmp:llvm вариант вместо /openmp для целевой среды выполнения OpenMP LLVM. В настоящее время поддержка в рабочем коде недоступна, так как требуемые библиотеки DLL либомп не являются распространяемыми. Параметр поддерживает те же директивы OpenMP 2,0, что /openmp и. И поддерживают все директивы SIMD, поддерживаемые /openmp:experimental параметром. Он также поддерживает параллельные индексы целых чисел без знака в соответствии со стандартом OpenMP 3,0. Дополнительные сведения см. в разделе Улучшенная поддержка OpenMP для C++ в Visual Studio.
/openmp:llvm В настоящее время параметр работает только в архитектуре x64. Параметр несовместим с /clr или /ZW .
Приложения, скомпилированные с помощью /openmp и, /clr могут выполняться только в одном процессе домена приложения. Несколько доменов приложений не поддерживаются. Это значит, что при запуске конструктора модуля ( .cctor ) он обнаруживает, компилируется ли процесс с помощью /openmp , и если приложение загружается в среду выполнения, не используемую по умолчанию. Дополнительные сведения см appdomain . в статьях, /clr (компиляция среды CLR)и Инициализация смешанных сборок.
При попытке загрузить приложение, скомпилированное с помощью /openmp и, и /clr в домен приложения, не заданный по умолчанию, TypeInitializationException исключение создается вне отладчика, и OpenMPWithMultipleAppdomainsException в отладчике создается исключение.
Эти исключения также могут возникать в следующих ситуациях.
Значение, если приложение компилируется с использованием /clr , но не /openmp и загружается в домен приложения, не заданный по умолчанию, где процесс включает приложение, скомпилированное с помощью /openmp .
При передаче /clr приложения в служебную программу, например regasm.exe, которая загружает целевые сборки в домен приложения, не используемый по умолчанию.
Управление доступом для кода среды CLR не работает в регионах OpenMP. Если атрибут управления доступом для кода CLR применяется за пределами параллельной области, он не будет действовать в параллельной области.
Корпорация Майкрософт не рекомендует создавать /openmp приложения, допускающие частично доверенные вызывающие объекты. Не используйте AllowPartiallyTrustedCallersAttribute или любые атрибуты управления доступом для кода CLR.
Установка данного параметра компилятора в среде разработки Visual Studio
Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.
>Разверните страницу свойстваязыкаC/C++>язык .
Измените свойство поддержки OpenMP .
Установка данного параметра компилятора программным способом
- См. раздел OpenMP.
Пример
В следующем примере показаны некоторые эффекты запуска пула потоков по сравнению с использованием пула потоков после его запуска. При условии, что 64-разрядная, одноядерная, Двухъядерный процессор, пул потоков занимает около 16 мс для запуска. После этого пул потоков будет немного излишним.
При компиляции с помощью /openmp второй вызов test2 никогда не выполняется дольше, чем при компиляции с помощью /openmp- , так как отсутствует запуск пула потоков. В миллионах итераций /openmp версия выполняется быстрее, чем /openmp- версия второго вызова test2. При 25 итерациях обе /openmp- /openmp версии регистрируются меньше, чем степень гранулярности часов.
Если в приложении имеется только один цикл и оно выполняется менее чем на 15 мс (оно корректируется на приблизительную нагрузку на компьютер), /openmp может быть неприемлемо. Если это более высокое значение, можно использовать /openmp .