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. |
Tópicos Relacionados
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