Alguém já tentou memória transacional para C ++?
-
01-07-2019 - |
Pergunta
Eu estava verificando o site da Intel "whatif" e seu compilador transacional memória (cada thread tem que fazer commits atômicas ou reverter a memória do sistema, como um faria Banco de Dados).
Parece um caminho promissor para substituir fechaduras e semáforos, mas não consigo encontrar muitos testemunhos. Alguém aqui tem alguma entrada?
Solução
Eu não usei compilador da Intel, no entanto, Herb Sutter teve alguns comentários interessantes sobre isso ...
A partir Sutter Fala: O Futuro da Concorrência
Você vê um monte de interesse e uso da memória transacional, ou é o conceito muito difícil para a maioria dos desenvolvedores de entender?
Ele ainda não é possível responder que está a usá-lo porque ele não foi trazido ao mercado ainda. Intel tem um protótipo de software compilador de memória transacional. Mas se a pergunta é "É muito difícil para os desenvolvedores de usar?" a resposta é que eu certamente espero que não. A questão toda é que é maneira mais fácil do que fechaduras. É a única coisa importante no horizonte de pesquisa que mantém a esperança de reduzir muito o nosso uso de bloqueios. Ele nunca irá substituir fechaduras completamente, mas é a nossa única grande esperança para substituí-los parcialmente.
Existem algumas limitações. Em particular, alguns I / O é inerentemente não transacional-você não pode tomar um bloco atômica que pede ao utilizador para o seu nome e ler o nome do console, e apenas automaticamente abort e tente novamente o bloco se entrar em conflito com outra operação; o usuário pode dizer a diferença se você levá-lo duas vezes. memória transacional é ótimo para coisas que é memória apenas tocar, no entanto.
Todas as grandes hardware e software fornecedor eu conheço tem várias ferramentas de memória transacional em P & D. Há conferências e trabalhos acadêmicos sobre respostas teóricas para as perguntas básicas. Nós não estamos na fase Modelo T ainda onde podemos enviá-lo para fora. Você provavelmente vai ver protótipos cedo, limitadas em que você não pode fazer sem limites de memória de onde transacional só podem ler e escrever, digamos, 100 posições de memória. Isso ainda é muito útil para permitir mais algoritmos sem bloqueio, no entanto.
Outras dicas
Dr. Dobb teve um artigo sobre o conceito ano passado: Programação Transacional por Calum Grant - http: //www.ddj .com / CPP / 202802978
Ele inclui alguns exemplos, comparações e conclusões usando sua biblioteca exemplo.
Eu construí a biblioteca STM combinatória em cima de algumas idéias de programação funcional. Ele não requer qualquer suporte de compilador (só que usa C ++ 17), não traz uma nova sintaxe. Em geral, adota a interface do STM biblioteca de Haskell.
Assim, a minha biblioteca tem várias propriedades agradáveis:
- Monadically combinatória. Toda a transação é um cálculo dentro da Mônada costume
STML
nomeado. Você pode combinar transações monádicas em mais grandes transações monádicas. - As transações são separados do modelo de dados. Você constrói o seu modelo de dados em simultâneo com variáveis ??transacionais (
TVars
) e operações de execução sobre ele. - Há
retry
combinator. Ele permite que você execute novamente a transação. Muito útil para construir operações de curto e compreensível. - Existem diferentes combinadores monádicas para expressar computações em breve.
- Há
Context
. Cada cálculo deve ser executado em algum contexto, não no tempo de execução global. Então você pode ter muitos contextos diferentes, se você precisar de vários grupos MCT independente. - A implementação é bastante simples conceitualmente. Pelo menos, a implementação referência em Haskell é assim, mas teve que reinventar várias abordagens para C ++ implementação devido à falta de um bom suporte de programação funcional.
Os shows biblioteca muito agradável estabilidade e robustez, mesmo se considerarmos que experimental. Além disso, a minha abordagem abre uma série de possibilidades para melhorar a biblioteca por desempenho, funcionalidades, abrangência, etc.
Para demonstrar o seu trabalho, eu já resolveu a tarefa Dining Philosophers
. Você pode encontrar o código nos links abaixo. transação de exemplo:
STML<bool> takeFork(const TVar<Fork>& tFork)
{
STML<bool> alreadyTaken = withTVar(tFork, isForkTaken);
STML<Unit> takenByUs = modifyTVar(tFork, setForkTaken);
STML<bool> success = sequence(takenByUs, pure(true));
STML<bool> fail = pure(false);
STML<bool> result = ifThenElse(alreadyTaken, fail, success);
return result;
};
Atualizar Eu escrevi um tutorial, você pode encontrá-lo aqui .
A Sun Microsystems anunciou que eles estão lançando um novo processador no próximo ano, de codinome Rock, que tem suporte de hardware para memória transacional. Ele terá algumas limitações, mas é um bom primeiro passo que deve tornar mais fácil para os programadores para substituir fechaduras / mutexes com transações e esperar um bom desempenho fora dele.
Para uma conversa interessante sobre o assunto, dado por Mark Moir, um dos pesquisadores da Sun trabalhando em Transactional Memória e Rock, confira este link
Para obter mais informações e anúncios da Sun Rock and Transactional memória em geral, este link .
O obrigatória wikipedia entrada :)
Finalmente, este link , na Universidade de Wisconsin-Madison, contém uma bibliografia da maioria das pesquisas que tem sido e está sendo feito sobre transacional memória, se é relacionado ao hardware ou software relacionado.
Em alguns casos, eu posso ver isso como sendo útil e mesmo necessário.
No entanto, mesmo se o processador tem instruções especiais que tornam esse processo mais fácil ainda há uma grande sobrecarga em comparação a um mutex ou semáforo. Dependendo de como ele é implementado pode também performance em tempo real impacto (que quer interrompe parada, ou impedi-los de escrever em suas áreas compartilhadas).
A minha expectativa é que, se esta foi implementada, ela só seria necessário para partes de um determinado espaço de memória, porém, e assim o impacto poderá ser limitado.
-Adam