A serialização de acessos simultâneos à memória global para um endereço ocorre quando há níveis de cache L1 e L2?

StackOverflow https://stackoverflow.com//questions/20014054

  •  21-12-2019
  •  | 
  •  

Pergunta

Com base no que sei, quando os threads de um warp acessam o mesmo endereço na memória global, as solicitações são serializadas, por isso é melhor usar memória constante.A serialização de acessos simultâneos à memória global acontece quando a GPU está equipada com níveis de cache L1 e L2 (na arquitetura Fermi e Kepler)?Em outras palavras, quando threads de um warp acessam o mesmo endereço de memória global, 31 threads de um warp se beneficiam da existência de cache porque 1 thread já solicitou esse endereço?O que acontece quando o acesso é de leitura e também quando o acesso é de escrita?

Foi útil?

Solução

Acessos globais simultâneos ao mesmo endereço por threads no mesmo warp no Fermi e no Kepler não são serializados.A leitura warp possui um mecanismo de transmissão que satisfaz todas essas leituras a partir de uma única leitura de cacheline sem impacto no desempenho.O desempenho é o mesmo de uma leitura totalmente unida.Isso é verdade independentemente das especificações do cache; por exemplo, é verdade mesmo se o cache L1 estiver desabilitado.

O desempenho de gravações simultâneas não é especificado (AFAIK), mas comportamentalmente, as gravações simultâneas sempre são serializadas e a ordem é indefinida.

EDITAR respondendo às perguntas adicionais abaixo:

  1. Mesmo que todos os threads no warp gravem o mesmo valor no mesmo endereço, ele será serializado?Não existe um mecanismo de transmissão por gravação que reconheça tal situação?

Não existe um mecanismo de transmissão de gravação que analise todas as gravações simultâneas para ver se são todas iguais e, em seguida, execute alguma ação com base nisso.A resposta correta é que as gravações acontecem em ordem não especificada e as características de desempenho são indefinidas.Obviamente, se todos os valores que estão sendo escritos forem iguais, você pode ter certeza de que o valor que vai parar no local será esse valor.Mas se você está perguntando se a atividade de gravação está resumida em um único ciclo ou requer vários ciclos para ser concluída, esse comportamento real é indefinido (não documentado) e, de fato, poderia variam de uma arquitetura para outra (por exemplo, cc1.x pode serializar de tal forma que todas as escritas sejam executadas, enquanto cc2.x pode "serializar" de tal forma que uma escrita "ganha" e todas as outras são descartado, não consumindo ciclos reais.) Novamente, o desempenho não é documentado/não especificado, mas o observável por programa comportamento é definido.

2 Com esse mecanismo de broadcast que você explicou, a única diferença entre o acesso por broadcast à memória constante e o acesso por broadcast à memória global é que o primeiro pode rotear o acesso até a memória global, mas o último possui um hardware dedicado e é mais rápido, certo?

__constant__ A memória usa o cache constante, que é uma peça de hardware dedicada que está disponível por SM, e armazena em cache uma seção específica da memória global em um somente leitura moda.Este cache de HW é física e logicamente separado do cache L1 (se existir e estiver habilitado) e do cache L2.Para Fermi e além, ambos os mecanismos suportam transmissão na leitura, e para cache constante, este é o padrão de acesso preferido, porque o cache constante só pode atender a um acesso de leitura por ciclo (ou seja,não suporta um cacheline inteiro lido por um warp.) Qualquer um dos mecanismos pode "acertar" no cache (se presente) ou "errar" e acionar uma leitura global.Na primeira leitura de um determinado local (ou linha de cache), nenhum outro cache terá os dados solicitados e, portanto, "perderá" e acionará uma leitura de memória global, para atender o acesso.Depois disso, em ambos os casos, as leituras subsequentes serão atendidas fora do cache, assumindo que os dados relevantes não sejam removidos nesse ínterim.Para os primeiros dispositivos cc1.x, o cache de memória constante era muito valioso, pois esses primeiros dispositivos não tinham cache L1.Para Fermi e além, a principal razão para usar o cache constante seria se os dados identificáveis(ou seja,somente leitura) e padrões de acesso (mesmo endereço por warp) estiverem disponíveis, então usar o cache constante impedirá que essas leituras viajem através de L1 e possivelmente expulsem outros dados.Na verdade, você está aumentando um pouco a área ocupada em cache, acima do que o L1 pode suportar sozinho.

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