Compartilhamento falso - False sharing

Na ciência da computação , o falso compartilhamento é um padrão de uso de degradação do desempenho que pode surgir em sistemas com caches distribuídos e coerentes no tamanho do menor bloco de recursos gerenciado pelo mecanismo de cache. Quando um participante do sistema tenta acessar periodicamente dados que não estão sendo alterados por outra parte, mas esses dados compartilham um bloco de cache com dados que estão sendo alterados, o protocolo de cache pode forçar o primeiro participante a recarregar todo o bloco de cache, apesar da falta de necessidade lógica. O sistema de cache não está ciente da atividade dentro deste bloco e força o primeiro participante a suportar a sobrecarga do sistema de cache exigida pelo verdadeiro acesso compartilhado de um recurso.

Caches de CPU multiprocessador

De longe, o uso mais comum desse termo é em caches de CPU de multiprocessador moderno , onde a memória é armazenada em cache em linhas de uma pequena potência de tamanho de duas palavras (por exemplo, 64 bytes alinhados , contíguos ). Se dois processadores operam em dados independentes na mesma região de endereço de memória armazenável em uma única linha, os mecanismos de coerência de cache no sistema podem forçar toda a linha através do barramento ou se interconectar com cada gravação de dados, forçando travamentos de memória além de desperdiçar largura de banda do sistema . Em alguns casos, a eliminação do falso compartilhamento pode resultar em melhorias de desempenho de ordem de magnitude. O compartilhamento falso é um artefato inerente aos protocolos de cache sincronizados automaticamente e também pode existir em ambientes como sistemas de arquivos distribuídos ou bancos de dados, mas a prevalência atual é limitada a caches de RAM.

Exemplo

static struct {
    int x;
    int y; 
} f;

/* The two following functions run concurrently: */

int read_x(void) {
    return f.x;
}

void write_y(void) {
    ++f.y;
}

Aqui, read_xpode ser necessário reler xda memória principal (em vez do cache), embora write_ya modificação simultânea de yseja irrelevante.

Mitigação

Existem maneiras de mitigar os efeitos do falso compartilhamento. Por exemplo, o falso compartilhamento em caches de CPU pode ser evitado reordenando variáveis ​​ou adicionando preenchimento (bytes não usados) entre as variáveis. No entanto, algumas dessas alterações no programa podem aumentar o tamanho dos objetos, levando a um maior uso da memória. As transformações de dados em tempo de compilação também podem atenuar o falso compartilhamento. No entanto, algumas dessas transformações nem sempre são permitidas. Por exemplo, o padrão da linguagem de programação C ++ exige que os membros dos dados sejam dispostos de forma que os membros posteriores tenham endereços superiores.

Existem ferramentas para detectar falsos compartilhamentos. Existem também sistemas que detectam e reparam o falso compartilhamento na execução de programas. No entanto, esses sistemas incorrem em alguma sobrecarga de execução.

Referências

links externos