Pergunta

Quando meu programa executa uma operação de carga com a semântica Acquire / operação de armazenamento com a semântica de libertação ou talvez um-fence completo, ele invalida o cache do CPU.
A minha pergunta é esta: que parte do cache é realmente invalidada? somente a linha de cache que realizou a variável que eu usei adquirir / release? ou talvez todo o cache é invalidado? (L1 + L2 + L3 .. e assim por diante?). Existe uma diferença neste assunto quando eu uso semântica aquisição / liberação, ou quando eu uso um-fence cheia?

Foi útil?

Solução

Eu não sou um especialista sobre isso, mas me deparei com este documento, talvez seja útil http://www.rdrop.com/users/ paulmck / escalabilidade / papel / whymb.2009.04.05a.pdf

Outras dicas

Quando você executa uma carga sem cercas ou semáforos, então o valor carregado poderiam vir de qualquer lugar, ou seja, caches, registros (por meio de otimizações do compilador), ou RAM ... mas a partir de sua pergunta, você já sabia disso .

Na maioria das implementações mutex, quando você adquirir um mutex, uma cerca é sempre aplicado, quer explicitamente (por exemplo, mfence, barreira, etc.) ou implicitamente (por exemplo, bloqueio prefixo para travar o autocarro em x86). Isso faz com que o cache linhas de todos os caches no caminho para ser invalidado.

Note que todo o cache não é invalidado, apenas os respectivos cache-linhas para o local de memória. Isto também inclui as linhas para o mutex (que é normalmente implementado como um valor na memória).

É claro, existem específicas de arquitetura detalhes, mas é assim que funciona em geral.

Observe também que esta não é a única razão para caches invalidar, pois pode haver operações em uma CPU que precisariam caches em um outro para ser invalidado. Fazendo uma pesquisa no Google por "cache coerência protocolos" irá fornecer-lhe um monte de informações sobre este assunto.

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