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?

Foi útil?

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.
  • 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.
  • 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top