Compartilhar via


/OpenMP (Ativar OpenMP 2.0 suporte)

Causes the compiler to process #pragmaOMP.

/openmp

Comentários

#pragma omp é usado para especificar As diretivas OpenMP e Cláusulas OpenMP. If /openmp não foi especificado em uma compilação, o compilador ignora cláusulas OpenMP e diretivas. Função do OpenMP chamadas são processadas pelo compilador mesmo se /openmp não foi especificado.

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

Aplicativos compilados com /openmp e /clr pode ser executado somente em um processo de domínio do aplicativo único; vários domínios do aplicativo não são suportados. Isto é, quando o construtor de módulo (.cctor) é executado, ele detectará que 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 linguagem tempo de execução compilação) e Inicialização de assemblies mistos.

Se você tentar carregar um aplicativo compilado com /openmp e /clr para um domínio do 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, é carregado em um domínio do aplicativo não-padrão mas onde o processo inclui um aplicativo que foi compilado com /openmp.

  • Se você passar o seu /clr aplicativo para um utilitário, sistema autônomo o regasm.exe)Ferramenta de registro do conjunto (RegAsm.exe)), que carrega seus assemblies de destino em um domínio do aplicativo não-padrão.

segurança de acesso do código do common linguagem tempo de execução não funciona em regiões OpenMP.Se você aplicar um CLR segurança de acesso do código atributo fora de uma região paralela, ele não será em vigor na região paralela.

Microsoft aconselha que não gravam /openmp aplicativos que permite parcialmente confiável chamadores, usando AllowPartiallyTrustedCallersAttribute, ou qualquer atributos de segurança de acesso de código CLR.

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

  1. em aberto propriedade Páginas caixa de diálogo.Para obter detalhes, consulte:Como: Abrir o Projeto Propriedade Páginas.

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

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

  4. selecionar o linguagem página de propriedades.

  5. Modificar o Suporte OpenMPpropriedade .

Para conjunto esta opção do compilador por meio de programação

Exemplo

O exemplo a seguir mostra alguns dos efeitos da inicialização do pool de threads em vez de usar o pool de threads depois que ele inicializado.Assumindo um x64 de núcleo único, o pool de threads do processador dual leva aproximadamente 16ms para inicialização.Depois disso entanto há muito pouco custo para o pool de threads.

Quando você compilar com /openmp, a segunda telefonar para teste2 nunca é executado mais que se você compilar com /openmp-, pois não há nenhum pool de threads inicialização. Em um milhão de iterações o /openmp versão é mais rápido do que o /openmp- versão para a segunda telefonar teste2 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 ele é executado em menos de 15 ms (ajustado para a sobrecarga aproximada em sua computador), /openmp pode não ser apropriado, mas nada mais do que o caso, 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

Opções de compilador configuração