Partilhar via


Migrando de OpenMP no Runtime de Simultaneidade

O Runtime de Simultaneidade habilita uma variedade de modelos de programação. Esses modelos podem se sobrepor ou complementar os modelos de outras bibliotecas. Os documentos nesta seção comparam o OpenMP ao Runtime de Simultaneidade e dão exemplos sobre como migrar o código OpenMP existente para usar o Runtime de Simultaneidade.

O modelo de programação OpenMP é definido por um padrão aberto e tem associações bem definidas para as linguagens de programação Fortran e C/C++. As versões 2.0 e 2.5 do OpenMP, compatíveis com o compilador do Microsoft C++, são adequadas para algoritmos paralelos iterativos; ou seja, executam iteração paralela em uma matriz de dados. O OpenMP 3.0 dá suporte a tarefas não iterativas, além de tarefas iterativas.

O OpenMP é mais eficiente quando o grau de paralelismo é predeterminado e corresponde aos recursos disponíveis no sistema. O modelo OpenMP é uma correspondência especialmente boa para computação de alto desempenho, em que problemas computacionais muito grandes são distribuídos entre os recursos de processamento de um computador. Nesse cenário, o ambiente de hardware geralmente é corrigido 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 correspondência 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 o OpenMP 2.0 e 2.5. O Runtime de Simultaneidade complementa os recursos do OpenMP fornecendo a Biblioteca de Agentes Assíncronos e a PPL (Biblioteca de Padrões Paralelos). A Biblioteca de Agentes Assíncronos dá suporte ao paralelismo de tarefas com granularidade bruta; o PPL dá suporte a tarefas paralelas mais refinadas. O Runtime de Simultaneidade fornece a infraestrutura necessária para executar operações em paralelo para que você possa se concentrar na lógica do aplicativo. No entanto, como o Runtime de Simultaneidade permite uma variedade de modelos de programação, sua sobrecarga de agendamento pode ser maior do que outras bibliotecas simultâneas, como OpenMP. Portanto, recomendamos que você teste o desempenho incrementalmente ao converter o código OpenMP para usar o Runtime de Simultaneidade.

Quando migrar do OpenMP para o Runtime de Simultaneidade

Pode ser vantajoso migrar o código OpenMP para usar o Runtime de Simultaneidade nos casos a seguir.

Ocorrências Vantagens do Runtime de Simultaneidade
Você precisa de uma estrutura de programação simultânea extensível. Muitos dos recursos no Runtime de Simultaneidade podem ser estendidos. Você também pode combinar recursos existentes para compor novos. Como o OpenMP depende de diretivas do compilador, ele não pode ser facilmente estendido.
Seu aplicativo se beneficiaria do bloqueio cooperativo. Quando uma tarefa é bloqueada porque requer um recurso que ainda não está disponível, o Runtime de Simultaneidade pode executar outras tarefas enquanto a primeira tarefa aguarda o recurso.
Seu aplicativo se beneficiaria do balanceamento de carga dinâmico. O Runtime de Simultaneidade 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 corrigidas em toda a computação.
Você precisa de suporte para tratamento de exceções. O PPL permite capturar exceções dentro e fora de uma região ou loop paralelo. No OpenMP, você deve lidar com a exceção dentro da região ou loop paralelo.
Você precisa de um mecanismo de cancelamento. O PPL permite que os aplicativos cancelem tarefas individuais e árvores paralelas de trabalho. O OpenMP requer que o aplicativo implemente um mecanismo de cancelamento próprio.
Você precisa que o código paralelo seja concluído em um contexto diferente daquele no qual ele é iniciado. O Runtime de Simultaneidade permite que você inicie uma tarefa em um contexto e aguarde ou cancele essa tarefa em outro contexto. No OpenMP, todo o trabalho paralelo deve ser concluído no contexto do qual ele é iniciado.
Você precisa de suporte avançado para depuração. O Visual Studio fornece as janelas Pilhas Paralelas e Tarefas Paralelas para que você possa depurar aplicativos multithread mais facilmente.

Para mais informações sobre o suporte de depuração para o Runtime de Simultaneidade, confira Como usar a janela Tarefas, Como usar a janela Pilhas Paralelas e Guia passo a passo: Como depurar um aplicativo paralelo.

Quando não migrar do OpenMP para o Runtime de Simultaneidade

Os casos a seguir descrevem quando talvez não seja apropriado migrar o código OpenMP para usar o Runtime de Simultaneidade.

Ocorrências Explicação
Seu aplicativo já atende aos seus requisitos. Se você estiver satisfeito com o desempenho do aplicativo e o suporte à depuração atual, a migração poderá não ser apropriada.
Seus corpos de loop paralelo executam pouco trabalho. A sobrecarga do agendador de tarefas do Runtime de Simultaneidade pode não superar os benefícios de executar o corpo do loop em paralelo, especialmente quando o corpo do loop é relativamente pequeno.
Seu aplicativo é gravado em C. Como o Runtime de Simultaneidade usa muitos recursos C++, ele pode não ser adequado quando você não pode escrever código que permite que o aplicativo C o use totalmente.

Como converter um loop OpenMP paralelo para loop para usar o runtime de simultaneidade

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

Como converter um loop OpenMP que usa cancelamento para usar o runtime de simultaneidade
Dado um loop parallelfor do OpenMP que não exige que todas as iterações sejam executadas, demonstra como convertê-lo para usar o mecanismo de cancelamento de Runtime de Simultaneidade.

Como converter um loop OpenMP que usa tratamento de exceções para usar o runtime de simultaneidade
Dado um loop parallelfor do OpenMP que executa o tratamento de exceção, demonstra como convertê-lo para usar o mecanismo de tratamento de exceção do Runtime de Simultaneidade.

Como converter um loop OpenMP que usa uma variável de redução para usar o runtime de simultaneidade
Dado um loop Parallelfor do OpenMP que usa a cláusula de redução, demonstra como convertê-la para usar o Runtime de Simultaneidade.

Confira também

Runtime de Simultaneidade
OpenMP
Biblioteca de padrões paralelos (PPL)
Biblioteca de agentes assíncronos