Поделиться через


/openmp (Включить поддержку OpenMP)

Приводит компилятору обрабатывать #pragma omp директивы в поддержку OpenMP.

Синтаксис

/openmp
/openmp:experimental
/openmp:llvm

/openmp

Замечания

#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 целевой среды выполнения LLVM OpenMP. Поддержка в настоящее время недоступна для рабочего кода, так как необходимые библиотеки DLL libomp не распространяемые. Параметр поддерживает те же директивы OpenMP 2.0, что /openmpи . Кроме того, он поддерживает все директивы SIMD, поддерживаемые параметром /openmp:experimental . Он также поддерживает неподписанные целые индексы параллельно для циклов в соответствии со стандартом OpenMP 3.0. Дополнительные сведения см. в разделе "Улучшенная поддержка OpenMP для C++ в Visual Studio".

Этот /openmp:llvm параметр поддерживает архитектуру x64. Начиная с Visual Studio 2019 версии 16.10, он также поддерживает архитектуры x86 и ARM64. Этот параметр несовместим с /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

  1. Откройте диалоговое окно Страницы свойств проекта. Подробнее см. в статье Настройка компилятора C++ и свойства сборки в Visual Studio.

  2. Разверните страницу свойств>конфигурации C/C++>Language.

  3. Измените свойство поддержки OpenMP.

Установка данного параметра компилятора программным способом

Пример

В следующем примере показаны некоторые эффекты запуска пула потоков и использование пула потоков после его запуска. При условии, что для запуска пула потоков требуется около 16 мс, одно ядро, двойной процессор. После этого для пула потоков немного дополнительных затрат.

При компиляции с помощью /openmpвторого вызова теста 2 никогда не выполняется больше времени, чем при компиляции с использованием /openmp-, так как запуск пула потоков отсутствует. На миллион итерации /openmp версия быстрее, чем /openmp- версия второго вызова test2. В 25 итераций /openmp-/openmp обе версии регистрируются меньше, чем степень детализации часов.

Если у вас есть только один цикл в приложении, и он выполняется менее чем в 15 мс (скорректировано на приблизительную нагрузку на компьютере), /openmp может не быть подходящим. Если это выше, вы можете рассмотреть возможность использования /openmp.

// cpp_compiler_options_openmp.cpp
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

volatile DWORD dwStart;
volatile int global = 0;

double test2(int num_steps) {
   int i;
   global++;
   double x, pi, sum = 0.0, step;

   step = 1.0 / (double) num_steps;

   #pragma omp parallel for reduction(+:sum) private(x)
   for (i = 1; i <= num_steps; i++) {
      x = (i - 0.5) * step;
      sum = sum + 4.0 / (1.0 + x*x);
   }

   pi = step * sum;
   return pi;
}

int main(int argc, char* argv[]) {
   double   d;
   int n = 1000000;

   if (argc > 1)
      n = atoi(argv[1]);

   dwStart = GetTickCount();
   d = test2(n);
   printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);

   dwStart = GetTickCount();
   d = test2(n);
   printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
}

См. также

Параметры компилятора MSVC
Синтаксис командной строки компилятора MSVC
OpenMP в MSVC