Compartilhar via


Comparando o Runtime de simultaneidade para outros modelos de simultaneidade

Este documento descreve as diferenças entre os recursos e os modelos de programação do Runtime de simultaneidade e outras tecnologias. Compreendendo como os benefícios do Runtime de simultaneidade é comparar os benefícios de outros modelos de programação, você pode selecionar a tecnologia que melhor atende às necessidades de seus aplicativos.

Se você estiver usando outro modelo de programação, como o pool de threads do Windows ou OpenMP, existem situações em que pode ser apropriado migrar para o Runtime de simultaneidade. Por exemplo, o tópico Migrando do OpenMP para o Runtime de simultaneidade descreve quando pode ser apropriado migrar do OpenMP para o Runtime de simultaneidade. No entanto, se você estiver satisfeito com o desempenho do aplicativo e o suporte de depuração atual, migração não é necessária.

Você pode usar os recursos e benefícios de produtividade do Runtime de simultaneidade para complementar o seu aplicativo que usa outro modelo de concorrência. O Runtime de simultaneidade não garante o balanceamento de carga quando vários agendadores de tarefa competem os mesmos recursos de computação. No entanto, quando não se sobrepõem a cargas de trabalho, esse efeito é mínimo.

Seções

  • Comparando o agendamento preventivo cooperativo de agendamento

  • Comparando o Runtime de simultaneidade para a API do Windows

  • Comparando o Runtime de simultaneidade para OpenMP

Comparando o agendamento preventivo cooperativo de agendamento

Modelo preventivo e cooperativo de modelos de programação são duas formas comuns de habilitar várias tarefas compartilhar recursos de computação, por exemplo, processadores ou segmentos de hardware.

Agendamento preventivo e cooperativo

Agendamento preventivo é um mecanismo de round-robin, baseado em prioridade, que dá a cada acesso exclusivo da tarefa a um recurso de computação para um determinado período de tempo e, em seguida, alterna para outra tarefa. Agendamento preventivo é comum em sistemas operacionais de multitarefa, como o Windows. Planejamento cooperativo é um mecanismo que permite a cada acesso exclusivo da tarefa a um recurso de computação até que o término da tarefa ou tarefa gera o seu acesso ao recurso. O Runtime de simultaneidade usa o agendamento cooperativo junto com o Agendador preemptivo do sistema operacional para alcançar a utilização máxima dos recursos de processamento.

Diferenças entre os agendadores preventivos e cooperativos

Preemptiva agendadores de busca dar acesso igual de vários threads recursos para garantir que cada thread faz o andamento de computação. Em computadores que têm muitos recursos de computação, garantir acesso amigável se torna menos problemático; No entanto, garantindo a utilização eficiente dos recursos fica mais problemático.

Um programador e preventivo de modo de kernel requer o código do aplicativo para se depender do sistema operacional para tomar decisões de planejamento. Inversamente, um programador cooperativo de modo de usuário permite que o código do aplicativo tomar decisões de seus próprio agendamento. Como o agendamento cooperativo permite muitas decisões de planejamento deve ser feito pelo aplicativo, reduz muito a sobrecarga associada a sincronização do modo kernel. Normalmente, um Agendador cooperativo adia as decisões de planejamento para o kernel do sistema operacional quando não tem nenhum outro trabalho agendar. Um Agendador cooperativo também adia para o Agendador do sistema operacional, quando há uma operação de bloqueio é comunicada ao kernel, mas que a operação não for comunicada ao Agendador do modo de usuário. Em sistemas operacionais que suportam segmentos (UMS) agendáveis do modo de usuário, o Agendador do Runtime de simultaneidade converte essas operações de bloqueio cooperativo bloqueio de operações.

O agendamento de cooperação e eficiência

Um programador preventivo, todo o trabalho que tem o mesmo nível de prioridade é igual. Normalmente, um Agendador preemptivo agenda threads na ordem em que são criados. Além disso, um Agendador preemptivo oferece todos os threads uma fatia de tempo de uma forma de rodízio, com base na prioridade do thread. Embora esse mecanismo fornece imparcialidade (todos os threads torna o progresso progressivo), ele tem algum custo de eficiência. Por exemplo, muitos algoritmos de computação intensivos não exigem a imparcialidade. Em vez disso, é importante que as tarefas relacionadas terminar no geral menos tempo. Cooperativo de agendamento permite que um aplicativo para agendar o trabalho com mais eficiência. Por exemplo, considere um aplicativo que tenha muitos segmentos. Agendamento de threads que não compartilham os recursos para execução simultânea pode reduzir a sobrecarga de sincronização e, assim, aumentar a eficiência. Outra maneira de agendar tarefas eficiente é executar pipelines de tarefas (onde cada tarefa atua na saída do anterior) no mesmo processador para que a entrada de cada estágio de pipeline já foi carregada no cache de memória.

Usando o agendamento juntos preventivo e cooperativo

Planejamento cooperativo não resolve todos os problemas de agendamento. Por exemplo, tarefas bastante produz a outras tarefas podem consumir todos os recursos de computação disponíveis e impedir que outras tarefas fazendo progresso. O Runtime de simultaneidade usa os benefícios da eficiência do planejamento cooperativo para complementar as garantias de imparcialidade de agendamento preventivo. Por padrão, o Runtime de simultaneidade oferece um Agendador cooperativo que utiliza um algoritmo de roubo de trabalho para distribuir o trabalho entre recursos de computação de forma eficiente. No entanto, o Agendador do Runtime de simultaneidade também depende o Agendador preemptivo do sistema operacional razoavelmente distribuir recursos entre os aplicativos. Você também pode criar agendadores personalizados e políticas do Agendador em seus aplicativos para produzir um controle refinado sobre a execução da thread.

go to top

Comparando o Runtime de simultaneidade para a API do Windows

A Microsoft Windows application programming interface, que é normalmente conhecida como API do Windows (e anteriormente conhecida como Win32), fornece um modelo de programação que permite a simultaneidade em seus aplicativos. O Runtime de simultaneidade é construído sobre a API do Windows para fornecer modelos de programação adicionais que não estão disponíveis no sistema operacional subjacente.

O Runtime de simultaneidade amplia o modelo de thread da API do Windows para realizar o trabalho paralelo. Ele também usa o gerenciamento de memória de API do Windows e os mecanismos de armazenamento local de segmento. No Windows 7 e Windows Server 2008 R2, ele usa o suporte à API do Windows para threads agendáveis para os usuários e computadores que têm mais de 64 segmentos de hardware. O Runtime de simultaneidade amplia o modelo de API do Windows, fornecendo um Agendador de tarefas cooperativo e um algoritmo de roubo de trabalho para maximizar o uso de recursos de computação e permitindo que várias instâncias do Agendador simultâneas.

Para obter mais informações sobre a API do Windows, consulte Visão geral da API do Windows.

Linguagens de programação

A API do Windows usa a linguagem de programação c para expor o modelo de programação. O Runtime de simultaneidade fornece uma interface de programação do C++ que aproveita os recursos mais recentes na linguagem C++. Por exemplo, as funções de lambda fornecem um mecanismo sucinto e de tipo seguro para definir funções de trabalho paralelas. Para obter mais informações sobre os recursos mais recentes do C++ que o Runtime de simultaneidade usa, consulte Visão geral do Runtime de simultaneidade.

Threads e Pools de threads

O mecanismo de simultaneidade central da API do Windows é a thread. Você normalmente usa o CreateThread a função criar threads. Embora os threads são relativamente fáceis de criar e usar, o sistema operacional aloca uma quantidade significativa de tempo e outros recursos para gerenciá-los. Além disso, embora cada thread é garantido para receber o mesmo tempo de execução como qualquer outro thread no mesmo nível de prioridade, o associado sobrecarga exige que você crie tarefas suficientemente grandes. Para tarefas menores ou mais refinadas, a sobrecarga associada a simultaneidade pode pesar sobre o benefício de executar as tarefas em paralelo.

Pools de threads são uma maneira de reduzir o custo de gerenciamento de threads. Pools de threads personalizado e a implementação de pool de segmentos é fornecida pela API do Windows, ambos permitem que os itens de trabalho pequenos para serem executados em paralelo com eficiência. O pool de threads do Windows mantém os itens em uma fila first-in, First-out (FIFO). Cada item de trabalho é iniciado na ordem em que foi adicionado ao pool.

O Runtime de simultaneidade implementa um algoritmo de roubo de trabalho para estender o FIFO de mecanismo de agendamento. O algoritmo move as tarefas que ainda não iniciaram threads que executam o itens de trabalho. Embora o algoritmo de roubo de trabalho pode equilibrar as cargas de trabalho, ele também pode causar itens de trabalho a ser reorganizado. Esse processo de reordenação pode causar um item de trabalho Iniciar em uma ordem diferente, que ele foi enviado. Isso é útil com algoritmos recursivos, onde há uma melhor chance de que os dados são compartilhados entre as tarefas mais recentes do que entre os mais antigos. Obter novos itens para executar a primeira significa menos erros de cache e possivelmente menos falhas de página.

Da perspectiva do sistema operacional, o roubo de trabalho é injusta. No entanto, quando um aplicativo implementa um algoritmo ou a tarefa seja executada em paralelo, honestidade entre as subtarefas não é sempre importante. O que faz a diferença é a rapidez com que a tarefa geral for concluída. Para outros algoritmos FIFO é a estratégia apropriada de agendamento.

Comportamento de vários sistemas operacionais

No Windows XP e Windows Vista, os aplicativos que usam o Runtime de simultaneidade se comportam da mesma forma, exceto que o desempenho de pilha é aprimorado no Windows Vista.

No Windows 7 e Windows Server 2008 R2, o sistema operacional mais oferece suporte a simultaneidade e escalabilidade. Por exemplo, esses sistemas operacionais oferecem suporte a computadores que têm mais de 64 segmentos de hardware. Um aplicativo existente que usa a API do Windows deve ser modificado para aproveitar esses novos recursos. No entanto, um aplicativo que usa o Runtime de simultaneidade automaticamente utiliza estes recursos e não requer modificações.

Windows 7 e o Windows Server 2008 R2 adicionam suporte para threads (UMS) agendáveis do modo de usuário. Threads UMS permitem agendadores de modo de usuário e o kernel agendar o trabalho com mais eficiência. Embora UMS não desista preempção, aumenta a eficiência, permitindo que os aplicativos e bibliotecas executar o planejamento cooperativo sem transições de kernel. UMS também oferece controle volta para o aplicativo quando um thread estiver bloqueado no kernel, para que o aplicativo possa realizar o trabalho adicional durante o restante da fatia de tempo. O Runtime de simultaneidade usa automaticamente a UMS agendamento quando é suportada pelo sistema operacional. Para obter mais informações sobre UMS, consulte O agendamento de modo de usuário.

go to top

Comparando o Runtime de simultaneidade para OpenMP

O Runtime de simultaneidade permite uma variedade de modelos de programação. Esses modelos podem se sobrepor ou complementar os modelos de outras bibliotecas. Esta seção compara o Runtime de simultaneidade para OpenMP.

O modelo de programação do 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 são adequadas para algoritmos paralelos, são iterativos; ou seja, eles executam iteração paralela em uma matriz de dados. OpenMP é mais eficiente quando o grau de paralelismo é predeterminado e coincide com os recursos disponíveis no sistema. O modelo OpenMP é uma correspondência especialmente bom para a computação de alto desempenho, onde o muito grandes problemas computacionais são distribuídos entre os recursos de processamento de um único computador. Nesse cenário, o ambiente de hardware é conhecido e o desenvolvedor pode esperar razoavelmente tem acesso exclusivo a recursos de computação, quando o algoritmo é executado.

No entanto, outros, menos restritos ambientes de computação pode não ser uma boa correspondência para OpenMP. Por exemplo, os problemas de recursiva (como, por exemplo, o algoritmo quicksort ou pesquisando uma árvore de dados) são mais difíceis de implementar usando OpenMP. O Runtime de simultaneidade complementa os recursos do OpenMP fornecendo a Biblioteca paralela de padrões (PPL) e o Biblioteca de agentes assíncronos. Ao contrário do OpenMP, o Runtime de simultaneidade fornece um Agendador dinâmico que se adapta aos recursos disponíveis e ajusta o grau de paralelismo, como alterar a cargas de trabalho.

Muitos dos recursos no Runtime de simultaneidade podem ser estendidos. Você também pode combinar os recursos existentes para compor novas. Como OpenMP depende das diretivas de compilador, ele não pode ser estendido facilmente.

Para obter mais informações sobre como compara a Runtime de simultaneidade OpenMP e como migrar o código do OpenMP existente para usar o Runtime de simultaneidade, consulte Migrando do OpenMP para o Runtime de simultaneidade.

go to top

Consulte também

Referência

Visão geral da API do Windows

Conceitos

Runtime de simultaneidade

Visão geral do Runtime de simultaneidade

Biblioteca paralela de padrões (PPL)

Biblioteca de agentes assíncronos

Outros recursos

OpenMP in Visual C++

Histórico de alterações

Date

History

Motivo

Julho de 2010

Adicionadas informações sobre migração e interoperabilidade.

Aprimoramento de informações.