Compartilhar via


/OpenMP (Habilitar OpenMP 2.0 suporte)

Faz com que o compilador a processar #pragmaOMP.

/openmp

Comentários

#pragma ompé usado para especificar Diretivas OpenMP e Cláusulas OpenMP.Se /openmp não for especificado em uma compilação, o compilador ignora as cláusulas de OpenMP e diretivas.Função OpenMP chamadas são processadas pelo mesmo se compilador /openmp não for especificado.

Um aplicativo compilado com /openmp e usando o Bibliotecas OpenMP só pode ser executado no Windows 2000 ou sistemas operacionais posteriores.

Aplicativos compilados com /openmp e /clr só pode ser executado em um processo de domínio único aplicativo; Não há suporte para vários domínios de aplicativo.Ou seja, quando o construtor de módulo (. cctor) é executado, ele irá detectar o processo é compilado com /openmp e se o aplicativo estiver sendo carregado em um tempo de execução não-padrão.Para obter mais informações, consulte AppDomain, /CLR (common Language Runtime Compilation) 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, um TypeInitializationException exceção será lançada fora do depurador e será lançada uma exceção OpenMPWithMultipleAppdomainsException no depurador.

Essas exceções podem ser disparadas também 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 onde o processo inclui um aplicativo que foi compilado com /openmp.

  • Se você passar o /clr aplicativo para um utilitário, como, por exemplo, regasm (Regasm (ferramenta de registro de Assembly)), que carrega seus assemblies de destino em um domínio de aplicativo não-padrão.

Segurança de acesso ao código do common language runtime não funciona em regiões do OpenMP.Se você aplicar um atributo de segurança de acesso de código CLR fora de uma região paralela, ele não terá efeito na região paralela.

A Microsoft solicitará que você não escreva /openmp aplicativos que permite parcialmente confiável chamadores, usando a AllowPartiallyTrustedCallersAttribute, ou quaisquer atributos de segurança de acesso de código CLR.

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

  1. Abra o projeto Páginas de propriedades caixa de diálogo.Para obter detalhes, consulte:Como: abrir páginas de propriedades do projeto.

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

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

  4. Selecione o idioma página de propriedades.

  5. Modificar o Suporte OpenMP propriedade.

Para definir essa opção de compilador programaticamente

Exemplo

O exemplo a seguir mostra alguns dos efeitos da inicialização do threadpool versus usando o threadpool após ele ser iniciado.Assumindo um x64 de núcleo único, o threadpool de processador dual leva aproximadamente 16 ms para inicialização.Depois no entanto há um custo muito pouco o ThreadPool.

Quando você compila com /openmp, a segunda chamada para test2 nunca é executado mais tempo do que se você compila com /openmp-, que não haja nenhuma inicialização threadpool.Em um milhão de iterações a /openmp versão é mais rápido que o /openmp- versão para a segunda chamada test2 e a 25 iterações /openmp- e /openmp registro de versões menores do que a granularidade do relógio.

Portanto, se você tiver apenas um loop em seu aplicativo e ele é executado em menos de 15 ms (ajustado para a sobrecarga aproximada em sua máquina), /openmp pode não ser apropriado, mas se for nada mais do que isso, você talvez queira considerar o uso de /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

Configurando opções de compilador