Partilhar via


/OpenMP (Ativar OpenMP 2.0 suporte)

Faz com que o compilador a processar #pragma omp.

/openmp

Comentários

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

Um aplicativo compilado com /openmp e usando o OpenMP Libraries 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 detectará o processo é compilado com /openmp e se o aplicativo está sendo carregado em um tempo de execução não-padrão. For more information, see appdomain, /CLR (common Language Runtime Compilation), and 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 também podem ser disparadas nas seguintes situações:

  • Se seu aplicativo é compilado com /clr, mas não com /openmp, que é 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 o Regasm. exe (Regasm. exe (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.

Microsoft aconselha que você realmente gravar /openmp os aplicativos que permite chamadores parcialmente confiáveis, usando a AllowPartiallyTrustedCallersAttribute, ou qualquer código CLR acessar atributos de segurança.

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

  1. Abra o projeto Property Pages caixa de diálogo. For details, see 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 esta opção de compilador programaticamente

Exemplo

O exemplo a seguir mostra alguns dos efeitos de inicialização de 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 que embora há um custo muito pouco o ThreadPool.

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

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

Definindo opções do compilador