Como testar e comparar implementações mutex

12

Como o título diz: Como você testa e compara adequadamente diferentes implementações de mutexes em c ++?

Essencialmente, eu escrevi minha própria classe std :: mutex like para um projeto rodando em um núcleo 2, armv7, com o objetivo de minimizar a sobrecarga no caso não contestado. Agora, estou pensando em usar o referido mutex em mais lugares e também em arquiteturas diferentes, mas antes de fazer isso, gostaria de garantir que

  • está realmente correto
  • não há nenhum caso patológico em que ele tenha um desempenho muito pior do que um std :: mutex padrão.

Obviamente, escrevi alguns testes de unidade básicos e micro-benchmarks e tudo parece funcionar, mas no código multiencadeado "parece funcionar" não me dá grande conforto.

  • Então, existem técnicas de análise estática ou dinâmica estabelecidas?
  • Quais são as armadilhas comuns ao escrever testes de unidade para classes mutex?
  • Quais são os casos típicos que devemos observar (em termos de desempenho)?

Só estou usando tipos de biblioteca padrão para a implementação, que inclui operações de carregamento e armazenamento não-consistentes e consistentes em atômicas. No entanto, estou interessado principalmente em conselhos agnósticos de implementação, pois também gostaria de usar o mesmo equipamento de teste para outras implementações.

MikeMB
fonte
2
Eu sei que não é necessário, mas eu apreciaria se os downvoters comentassem qual é o problema com esta pergunta. Eu sou novo no SE e não estou familiarizado com os aspectos específicos deste site.
MikeMB
3
Não é o eleitor que recusou, mas vou dizer que este site é particularmente ruim para votos anônimos em questões perfeitamente boas. Parece-me que muitas pessoas votam com base no que eu chamaria de razões "religiosas". Dito isso, uma possibilidade é que você esteja pedindo recomendações sobre ferramentas, as quais, acredito, são desaprovadas aqui. Mas isso é apenas um palpite. E muitas pessoas discutiram essas ferramentas em outras questões, então faça disso o que quiser.
user1118321
4
De fato, confira esta meta post intitulada "Voto negativo, porque não concordamos com a abordagem ou a lógica de asker".
user1118321
@ user1118321: esse meta post não se encaixa nessa pergunta, já que o IMHO não tem nenhuma suposição falha nessa questão. No entanto, dois dos três votos que vejo atualmente estão usando o motivo próximo predefinido de "solicitação de recurso de terceiros". MikeMB, você pode tentar editar sua pergunta e remover essas partes, mas no formulário atual, acho que a comunidade também pode fechá-la por ser muito ampla. Se você restringir o foco da pergunta e perguntar especificamente o que você deseja testar e o que você tentou até agora, poderá aumentar a chance de sobrevivência da sua pergunta.
Doc Brown
Um problema com esta pergunta é que "As perguntas que nos pedem para encontrar ou recomendar ferramentas, bibliotecas, linguagens de programação, recursos (incluindo livros, blogs, tutoriais e exemplos) ou projetos a serem executados estão fora de tópico aqui, pois atraem respostas opinativas que não terá um valor duradouro para os outros ".
David Hammen

Respostas:

1

A questão é complexa:

Algumas fontes de complexidade incluem:

  • Quantas alternâncias de contexto estão ocorrendo: isso é muito importante, dependendo da plataforma em que esses testes são executados. Algumas plataformas lidam com isso melhor do que outras
  • São as funções em que os mutexes são testados de forma embutida ou não. ou seja, o mutex tem bom desempenho apenas em códigos bem otimizados ou otimizáveis.
  • Esses mutexes são projetados para a localidade do cache. As falhas no cache reduzem significativamente o desempenho ou causam mais alternâncias de contexto. antes e depois da inserção do mutex.
  • O próprio mutex causará perda da localidade do cache. ou seja, os dados do estado mutex são alocados dinamicamente.
  • Esses mutexes terão bom desempenho onde as alternâncias de contexto estiverem contidas no mutex. ie io, malloc etc.
  • O mutex terá bom desempenho se o tempo do kernel estiver contido na alocação e desalocação de memória dinâmica mutex.ie.
  • O desempenho é mantido quando executado nas VMs
  • A destruição ou construção do mutex é cara, ou seja, os dados do estado estão localizados na memória dinâmica
Christiaan Pretorius
fonte
1
Não tenho certeza se concordo com a parte de construção / destruição. Se um programa estiver criando e destruindo seus mutexes o tempo todo, há (imho) algo errado no design do design. Mas, caso contrário, obrigado pelas dicas.
MikeMB
-1

Sua ideia é muito interessante: uma referência de conformidade contra a qual uma implementação mutex poderia ser testada.

Infelizmente, até onde pude ver, não há um padrão de conformidade amplamente conhecido para implementações de mutex. Então, acho que você tem em suas mãos o problema muito interessante de criar uma proposta para esse benchmark de conformidade.

E, desde que você se envolveu na criação de uma implementação de benchmark, você é o cara.

Se você me der uma sugestão, talvez possa começar esta pesquisa com o padrão POSIX para encadeamentos de um lado e com algum estudo da literatura teórica do processamento simultâneo, como CSP ou Communicating Sequential Processes. Esse tipo de artigo geralmente lida com os problemas concorrentes clássicos, como os Filósofos do Jantar.

Uma implementação deles pode ser uma parte interessante do seu benchmark de conformidade, eu acho.

Hilton Fernandes
fonte
3
Não diminuí a votação, mas isso não parece responder a nenhuma das minhas perguntas.
MikeMB
Obrigado por não reduzir a votação. E desculpe por não responder suas perguntas. Você se importaria se eu perguntasse se você está pensando em criar uma referência de conformidade para mutexes?
Hilton Fernandes
Improvável. E mesmo se, eu o cuidado único padrão que é sobre o padrão c ++ (embora isso possa ser o mesmo que posix com relação a mutexes)
MikeMB
Para qualificar minha declaração anterior: Se eu apresentar um bom conjunto de testes para o meu próprio mutex, provavelmente o tornarei código-fonte aberto, mas duvido muito que ele tenha a qualidade ou seja completo o suficiente para se tornar um verdadeiro referência de "conformidade" - isso pode ser algo que é melhor tratado pela análise estática de qualquer maneira.
MikeMB
Concordo com você que não existe um bom conjunto de testes para primitivas mutex. Suponho que deva vir de três fontes distintas: a teoria do processamento simultâneo, a especificação de um mutex POSIX e algoritmos simultâneos expressos usando mutexes. Você concorda com aquilo ?
Hilton Fernandes