Compartilhar via


/openmp (habilitar suporte a OpenMP 2.0)

Faz com que o compilador processa #pragmaomp.

/openmp

Comentários

#pragma omp é usado para especificar Diretivas (OpenMP) e Cláusulas OpenMP. Se /openmp não é especificado em uma compilação, o compilador ignora as cláusulas e políticas OpenMP. as chamadas deFunção OpenMP são processados pelo compilador /openmp mesmo se não for especificado.

Um aplicativo compilado com /openmp e a utilização de OpenMP Bibliotecas só pode ser executado no Windows 2000 ou em sistemas operacionais mais tarde.

Os aplicativos criados com /openmp e /clr só podem ser executados em um único processo de domínio do aplicativo; vários domínios de aplicativo não têm suporte. Ou seja, quando o construtor de módulo (.cctor) é executado, o detectará o processo é criado com /openmp e se o aplicativo estiver sendo carregado no tempo de execução não padrão. Para obter mais informações, consulte appdomain, /clr (compilação do Common Language Runtime) e Inicialização de assemblies mistos.

Se você tentar carregar um aplicativo compilado com /openmp e /clr em um domínio de aplicativo não padrão, uma exceção será lançada de TypeInitializationException fora do depurador e uma exceção de OpenMPWithMultipleAppdomainsException será gerada no depurador.

Essas exceções também podem ser geradas nas seguintes situações:

  • Se seu aplicativo compilado com /clr, mas não com /openmp, é carregado em um domínio de aplicativo não padrão mas em que o processo inclui um aplicativo que foi compilado com /openmp.

  • Se você passa o aplicativo de /clr a um utilitário, como regasm.exe (Regasm.exe (Ferramenta de Registro de Assembly)), que carrega os assemblies de destino em um domínio de aplicativo não padrão.

A segurança de acesso do código de Common Language Runtime não funciona em regiões OpenMP. Se você aplicar um atributo de segurança de acesso do código CLR de fora de uma região em paralelo, não será aplicado na região paralela.

A Microsoft recomenda não gravar aplicativos de /openmp que permite chamadores parcialmente confiáveis, usando AllowPartiallyTrustedCallersAttribute, ou todos os atributos de segurança de acesso do código do CLR.

Para definir esta opção do compilador no ambiente de desenvolvimento do Visual Studio

  1. Abra a caixa de diálogo Páginas de Propriedade do projeto. Para obter detalhes, consulte Como abrir páginas de propriedade do projeto.

  2. Expanda o nó Propriedades de Configuração.

  3. Expanda o nó de C/C++ .

  4. Selecione a página de propriedades de Idioma .

  5. Modifique a propriedade de Suporte OpenMP .

Para definir essa opção do compilador via programação

Exemplo

O exemplo a seguir mostra alguns dos efeitos de inicialização de threadpool na utilização de threadpool depois que iniciou acima. Supondo x64, núcleo único processador, vezes que o threadpool assume 16ms a inicialização. Depois que embora haja um custo muito pequenos para o threadpool.

Quando você compila com /openmp, o segundo chamada para test2 nunca é executado por mais tempo que se você compila com /openmp-, pois não há inicialização de threadpool. Em milhões de iterações a versão de /openmp é mais rápida que a versão de /openmp- para o segundo chamada para test2, e 25 iterações as versões de /openmp- e de /openmp registram menor que a granularidade do relógio.

Isso se você tiver apenas um loop em seu aplicativo e executa em menor que 15ms (ajustado para a sobrecarga aproximada em seu computador), /openmp não pode ser apropriado, mas se nada for maior que o, talvez queira considerar o uso /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);
}

Consulte também

Referência

Opções do compilador

Definindo opções do compilador