Partilhar via


Migrando do OpenMP para o Concurrency Runtime

O Concurrency Runtime permite uma variedade de modelos de programação. Estes modelos podem sobrepor-se ou complementar os modelos de outras bibliotecas. Os documentos nesta seção comparam o OpenMP com o Concurrency Runtime e fornecem exemplos sobre como migrar o código OpenMP existente para usar o Concurrency Runtime.

O modelo de programação OpenMP é definido por um padrão aberto e tem ligações bem definidas para as linguagens de programação Fortran e C/C++. As versões 2.0 e 2.5 do OpenMP, que são suportadas pelo compilador Microsoft C++, são adequadas para algoritmos paralelos que são iterativos; ou seja, eles executam iteração paralela sobre uma matriz de dados. O OpenMP 3.0 suporta tarefas não iterativas, além de tarefas iterativas.

OpenMP é mais eficiente quando o grau de paralelismo é pré-determinado e corresponde aos recursos disponíveis no sistema. O modelo OpenMP é uma combinação especialmente boa para computação de alto desempenho, onde problemas computacionais muito grandes são distribuídos pelos recursos de processamento de um computador. Nesse cenário, o ambiente de hardware geralmente é fixo e o desenvolvedor pode razoavelmente esperar ter acesso exclusivo a todos os recursos de computação quando o algoritmo é executado.

No entanto, ambientes de computação menos restritos podem não ser uma boa combinação para o OpenMP. Por exemplo, problemas recursivos (como o algoritmo quicksort ou a pesquisa de uma árvore de dados) são mais difíceis de implementar usando OpenMP 2.0 e 2.5. O Concurrency Runtime complementa os recursos do OpenMP fornecendo a Biblioteca de Agentes Assíncronos e a Biblioteca de Padrões Paralelos (PPL). A Biblioteca de Agentes Assíncronos suporta o paralelismo de tarefas de grão grosso; a biblioteca PPL suporta tarefas paralelas mais refinadas. O Concurrency Runtime fornece a infraestrutura necessária para executar operações em paralelo para que você possa se concentrar na lógica do seu aplicativo. No entanto, como o Concurrency Runtime permite uma variedade de modelos de programação, sua sobrecarga de agendamento pode ser maior do que outras bibliotecas de simultaneidade, como OpenMP. Portanto, recomendamos que você teste o desempenho incrementalmente ao converter seu código OpenMP existente para usar o Concurrency Runtime.

Quando migrar do OpenMP para o Concurrency Runtime

Pode ser vantajoso migrar o código OpenMP existente para usar o Concurrency Runtime nos seguintes casos.

Processos Vantagens do Concurrency Runtime
Você precisa de uma estrutura de programação simultânea extensível. Muitos dos recursos no Concurrency Runtime podem ser estendidos. Você também pode combinar recursos existentes para compor novos. Como o OpenMP depende de diretivas de compilador, ele não pode ser facilmente estendido.
O seu pedido beneficiaria do bloqueio cooperativo. Quando uma tarefa é bloqueada porque requer um recurso que ainda não está disponível, o Concurrency Runtime pode executar outras tarefas enquanto a primeira tarefa aguarda o recurso.
Seu aplicativo se beneficiaria do balanceamento dinâmico de carga. O Concurrency Runtime usa um algoritmo de agendamento que ajusta a alocação de recursos de computação à medida que as cargas de trabalho mudam. No OpenMP, quando o agendador aloca recursos de computação para uma região paralela, essas alocações de recursos são fixadas ao longo da computação.
Você precisa de suporte para tratamento de exceções. O PPL permite capturar exceções dentro e fora de uma região paralela ou loop. No OpenMP, você deve manipular a exceção dentro da região paralela ou loop.
Você precisa de um mecanismo de cancelamento. O PPL permite que os aplicativos cancelem tarefas individuais e árvores paralelas de trabalho. OpenMP requer que o aplicativo implemente seu próprio mecanismo de cancelamento.
Você necessita de código paralelo para terminar em um contexto diferente do que aquele em que começa. O Concurrency Runtime permite iniciar uma tarefa em um contexto e, em seguida, aguardar ou cancelar essa tarefa em outro contexto. No OpenMP, todo o trabalho paralelo deve terminar no contexto a partir do qual começa.
Você precisa de suporte aprimorado de depuração. O Visual Studio fornece as janelas Pilhas paralelas e Tarefas paralelas para que você possa depurar mais facilmente aplicativos multithreaded.

Para obter mais informações sobre o suporte de depuração para o Concurrency Runtime, consulte Utilização da janela 'Tarefas', Utilização da janela 'Pilhas Paralelas' e Guia passo a passo: Depuração de uma aplicação paralela.

Quando não migrar do OpenMP para o ambiente de execução de concorrência

Os casos a seguir descrevem quando pode não ser apropriado migrar o código OpenMP existente para usar o Concurrency Runtime.

Processos Explicação
Seu aplicativo já atende aos seus requisitos. Se estiver satisfeito com o desempenho da aplicação e o suporte de depuração atual, a migração pode não ser apropriada.
Os corpos de ciclos paralelos executam pouco trabalho. A sobrecarga do agendador de tarefas na Concurrency Runtime pode não compensar os benefícios de executar o corpo do ciclo em paralelo, especialmente quando o corpo do ciclo é relativamente pequeno.
A sua candidatura está escrita em C. Como o Concurrency Runtime usa muitos recursos C++, ele pode não ser adequado quando você não pode escrever código que permita que o aplicativo C o use totalmente.

Como Converter um loop paralelo OpenMP para usar o Tempo de Execução com Simultaneidade

Dado um loop básico que utiliza as diretivas parallel e for do OpenMP, demonstra como convertê-lo para usar o algoritmo do Concurrency Runtime concurrency::parallel_for.

Como: Converter um loop OpenMP que usa cancelamento para usar o tempo de execução de simultaneidade
Dada uma construção OpenMP parallel for que não requer que todas as iterações sejam executadas, demonstra-se como convertê-la para utilizar o mecanismo de cancelamento do Concurrency Runtime.

Como: Converter um loop OpenMP que usa o tratamento de exceção para usar o tempo de execução de simultaneidade
Dado um ciclo paralelo OpenMP para que executa o tratamento de exceções, explicar como convertê-lo para usar o mecanismo de manipulação de exceções do Concurrency Runtime.

Como: Converter um loop OpenMP que utiliza uma variável de redução para usar o tempo de execução paralelo
Dado um loop paralelofor do OpenMP que usa a cláusula reduction, demonstra como convertê-lo para usar o Concurrency Runtime.

Ver também

Runtime de Concorrência
OpenMP
Biblioteca de Padrões Paralelos (PPL)
Biblioteca de agentes assíncronos