Como Projetar Chips de GPU
Chapter 4 Gpu Memory System Design

Capítulo 4: Projeto do Sistema de Memória GPU

As Unidades de Processamento Gráfico (GPUs) evoluíram para aceleradores altamente paralelos e programáveis, capazes de alcançar alto desempenho e eficiência energética em uma ampla gama de aplicações. O sistema de memória é um componente crítico das arquiteturas GPU modernas, pois deve fornecer aos inúmeros threads concorrentes acesso rápido aos dados. Neste capítulo, exploraremos os elementos-chave do projeto do sistema de memória GPU, incluindo as estruturas de memória de primeiro nível, a rede de interconexão on-chip, as unidades de partição de memória e as direções de pesquisa para futuros sistemas de memória GPU.

Estruturas de Memória de Primeiro Nível

As estruturas de memória de primeiro nível em uma GPU são responsáveis por fornecer acesso rápido a dados usados com frequência e reduzir o número de acessos aos níveis inferiores da hierarquia de memória. Essas estruturas geralmente incluem memória de scratchpad, cache de dados L1 e cache de textura L1.

Memória de Scratchpad e Cache de Dados L1

A memória de scratchpad, também conhecida como memória local no modelo de programação CUDA da NVIDIA ou memória local no OpenCL, é um espaço de memória de baixa latência gerenciado por software, compartilhado por todos os threads dentro de uma matriz de threads cooperativa (CTA) ou grupo de trabalho. A memória de scratchpad é tipicamente implementada usando uma estrutura SRAM com bancos para permitir acesso paralelo por vários threads.

A Figura 4.1 ilustra uma organização unificada de cache de dados L1 e memória de scratchpad, semelhante ao design usado nas arquiteturas Fermi e Kepler da NVIDIA [Minkin et al., 2012].

                                    Barramento de Endereços
                                          |
                                          v
                        Matriz de Dados (Configurável como Scratchpad ou Cache)
                                          |
                                          v  
                                    Barramento de Dados
                                          |
                                          v
                                 Unidade de Carga/Armazenamento
```Figura 4.1: Organização unificada da memória cache de dados L1 e da memória de scratchpad.

Os principais componentes deste design são:

1. **Matriz de Dados**: Uma estrutura SRAM altamente segmentada que pode ser configurada como memória de scratchpad ou cache de dados L1. Cada banco tem 32 bits de largura e possui seu próprio decodificador para acesso independente.

2. **Barramento de Endereços**: Distribui os endereços de memória da unidade de carga/armazenamento para os bancos apropriados na matriz de dados.

3. **Barramento de Dados**: Roteia os dados dos bancos para a unidade de carga/armazenamento, que então grava os dados no arquivo de registros.

4. **Unidade de Carga/Armazenamento**: Calcula os endereços de memória, aplica regras de coalescência e divide os acessos à memória em acessos coalescidos individuais.

Os acessos à memória de scratchpad ignoram a etapa de pesquisa de tags, pois a memória é mapeada diretamente. Os conflitos de banco são tratados dividindo os acessos conflitantes em vários ciclos, com as partes conflitantes sendo reexecutadas em ciclos subsequentes.

O cache de dados L1 é usado para armazenar um subconjunto do espaço de endereços de memória global. Os acessos ao cache de dados L1 envolvem uma pesquisa de tags para determinar se os dados solicitados estão presentes. O tamanho do bloco de cache é tipicamente de 128 bytes, que pode ser ainda dividido em setores de 32 bytes para corresponder ao tamanho mínimo de dados que podem ser lidos da memória DRAM gráfica (por exemplo, GDDR5) em um único acesso.

### Cache de Textura L1

A memória de textura é um espaço de memória somente leitura otimizado para localidade espacial e é comumente usado em cargas de trabalho gráficas. O cache de textura L1 é projetado para explorar a localidade espacial 2D presente nos acessos à textura.

A Figura 4.2 mostra uma organização típica do cache de textura L1.Aqui está a tradução em português deste arquivo markdown. Para o código, não traduzi o código, apenas os comentários.

Figura 4.2: Organização do cache de textura L1.

Os principais componentes do cache de textura L1 são:

  1. Mapeamento de Endereços: Converte as coordenadas de textura em endereços de cache.

  2. Matriz de Tags: Armazena as tags para cada linha de cache para determinar se os dados solicitados estão presentes.

  3. Matriz de Dados: Armazena os dados de textura reais.

  4. Filtragem de Textura: Realiza operações de interpolação e filtragem nos dados de textura buscados para gerar os texels filtrados finais.

O cache de textura L1 geralmente emprega uma organização baseada em blocos (tiles) para explorar a localidade espacial. O cache é dividido em blocos menores (por exemplo, 4x4 ou 8x8 texels), e cada bloco é armazenado de forma contígua para minimizar o número de linhas de cache acessadas para uma determinada busca de textura.

Cache Unificado de Textura e Dados

Arquiteturas de GPU recentes, como a Maxwell e a Pascal da NVIDIA, introduziram um cache unificado de textura e dados para melhorar a utilização do cache e reduzir o footprint total do cache [Heinrich et al., 2017]. Nesse design, o cache de dados L1 e o cache de textura L1 são combinados em um único cache físico, com a capacidade de alocar dinamicamente a capacidade entre os dois, com base nos requisitos da carga de trabalho.

A Figura 4.3 ilustra uma organização de cache unificado de textura e dados.


                              |
                              |                   |
                              v                   v
                           Matriz de Dados   Matriz de Dados de Textura

Figura 4.3: Organização unificada do cache de textura e de dados.

Os principais componentes do design de cache unificado são:

  1. Controlador de Cache: Recebe solicitações de memória e determina se elas devem ser atendidas pela partição de cache de dados ou pela partição de cache de textura.

  2. Partição de Cache de Dados: Lida com os acessos ao espaço de memória global, semelhante ao cache L1 de dados autônomo.

  3. Partição de Cache de Textura: Lida com os acessos à memória de textura, semelhante ao cache L1 de textura autônomo.

  4. Matriz de Dados: Uma matriz de dados compartilhada que armazena tanto os dados de memória global quanto os dados de textura.

O design de cache unificado permite uma melhor utilização da capacidade de cache disponível, pois os tamanhos das partições podem ser ajustados com base nos padrões de acesso da carga de trabalho. Essa flexibilidade pode levar a um melhor desempenho e eficiência energética em comparação com os caches L1 separados de tamanho fixo.

Rede de Interconexão On-Chip

A rede de interconexão on-chip é responsável por conectar os núcleos da GPU (também chamados de multiprocessadores de fluxo ou unidades de computação) às unidades de partição de memória. A interconexão deve fornecer alta largura de banda e baixa latência para suportar o paralelismo massivo nas cargas de trabalho da GPU.

As GPUs modernas geralmente empregam uma topologia de barramento cruzado ou de malha para a interconexão on-chip. Um barramento cruzado fornece conectividade total entre todos os núcleos e partições de memória, permitindo comunicação de alta largura de banda com o custo de maior área e consumo de energia. Uma topologia de malha, por outro lado, oferece uma solução mais escalável, conectando cada núcleo aos seus núcleos e partições de memória vizinhos, formando uma estrutura em grade.

A Figura 4.4 mostra um exemplo de uma interconexão em malha em uma GPU.

        Núcleo  Núcleo  Núcleo  Núcleo
         |       |       |       |  
        ——       ——      ——      ——
        |       ||      |
        Núcleo   Núcleo   Núcleo   Núcleo
         |      |      |      |
        ——     ——     ——     ——  
         |      |      |      |
        Núcleo   Núcleo   Núcleo   Núcleo
         |      |      |      |
        ——     ——     ——     ——
         |      |      |      |  
        Mem    Mem    Mem    Mem
        Part.  Part.  Part.  Part.

Figura 4.4: Interconexão em malha em uma GPU.

A interconexão em malha permite uma transferência de dados eficiente entre os núcleos e as partições de memória, minimizando a área e o consumo de energia. Algoritmos de roteamento avançados e mecanismos de controle de fluxo são empregados para garantir alto desempenho e evitar congestionamento.

Unidade de Partição de Memória

A unidade de partição de memória é responsável por lidar com as solicitações de memória dos núcleos da GPU e gerenciar a DRAM fora do chip. Cada partição de memória geralmente inclui um cache L2, suporte a operações atômicas e um agendador de acesso à memória.

Cache L2

O cache L2 é um cache compartilhado que fica entre os núcleos da GPU e a DRAM fora do chip. Seu principal objetivo é reduzir o número de acessos à DRAM de alta latência e alto consumo de energia, armazenando em cache os dados acessados com frequência.

Os caches L2 das GPUs geralmente são projetados como um cache de associação por conjunto, com escrita de volta, com uma grande capacidade (por exemplo, 2-4 MB) e alta largura de banda. O cache L2 é particionado entre várias partições de memória para permitir acesso paralelo e melhorar o desempenho.

A Figura 4.5 ilustra a organização de um cache L2 em uma partição de memória da GPU.

                            Solicitações de Memória
                                   |
                                   v
                             Controlador de Cache L2
                                   |
                                   v
                              Matriz de Tags
                                   |
                                   v
                              Matriz de Dados
                                   |
                                   v
                             Agendador de Memória
```Aqui está a tradução em português deste arquivo Markdown, com os comentários traduzidos, mas o código não traduzido:

                                   DRAM

Figura 4.5: Organização do cache L2 em uma partição de memória da GPU.

O controlador de cache L2 recebe solicitações de memória dos núcleos da GPU e verifica a matriz de tags para determinar se os dados solicitados estão presentes no cache. Em um acerto de cache, os dados são recuperados da matriz de dados e enviados de volta para o núcleo solicitante. Em uma falha de cache, a solicitação é encaminhada para o agendador de memória, que então busca os dados do DRAM.

Operações Atômicas

As operações atômicas são essenciais para a sincronização e comunicação entre threads em cargas de trabalho paralelas. As GPUs suportam uma variedade de operações atômicas, como adição atômica, mínimo, máximo e comparação-e-troca, que garantem a atomicidade quando vários threads acessam o mesmo local de memória simultaneamente.

As operações atômicas são tipicamente implementadas nas unidades de partição de memória para garantir execução de baixa latência e alta vazão. Unidades de hardware dedicadas, como unidades de operação atômica (AOUs), são empregadas para lidar eficientemente com solicitações atômicas.

A Figura 4.6 mostra um exemplo de uma unidade de operação atômica em uma partição de memória da GPU.

                            Solicitações Atômicas
                                   |
                                   v
                          Unidade de Operação Atômica
                                   |
                                   v
                            Cache L2/DRAM

Figura 4.6: Unidade de operação atômica em uma partição de memória da GPU.

A AOU recebe solicitações atômicas dos núcleos da GPU e realiza a operação solicitada no local de memória de destino. Se o local de memória estiver presente no cache L2, a AOU atualiza diretamente os dados do cache. Se o local de memória não estiver em cache, a AOU busca os dados do DRAM, realiza a operação atômica e, em seguida, grava o resultado de volta no DRAM.

Agendador de Acesso à Memória

O agendador de acesso à memória é responsável por gerenciar o fluxo deAqui está a tradução em português deste arquivo markdown. Para o código, não traduzi o código, apenas os comentários.

Solicitações de memória para a DRAM fora do chip. Seu objetivo principal é maximizar a utilização da largura de banda da DRAM, minimizando a latência dos acessos à memória.

Os programadores de memória da GPU empregam vários algoritmos de programação e otimizações para alcançar um alto desempenho. Algumas técnicas comuns incluem:

  1. Programação fora de ordem: Reordenação das solicitações de memória para maximizar os hits no buffer de linha e minimizar o overhead de pré-carga e ativação da DRAM.

  2. Paralelismo em nível de banco: Explorando o paralelismo disponível em vários bancos DRAM para permitir acesso concorrente a diferentes regiões de memória.

  3. Otimização da alternância de escrita para leitura: Minimizando a penalidade de latência incorrida ao alternar entre operações de escrita e leitura na DRAM.

  4. Intercalação de endereços: Distribuindo os acessos à memória entre diferentes canais, ranks e bancos para maximizar o paralelismo e evitar contenção.

A Figura 4.7 ilustra uma visão de alto nível de um programador de acesso à memória em uma partição de memória da GPU.

                            Solicitações de Memória
                                   |
                                   v
                           Programador de Memória
                                   |
                                   v
                    Canal   Canal   Canal   Canal
                      |         |         |         |
                      v         v         v         v
                    Rank      Rank      Rank      Rank
                      |         |         |         |
                      v         v         v         v  
                    Banco     Banco     Banco     Banco

Figura 4.7: Programador de acesso à memória em uma partição de memória da GPU.

O programador de memória recebe solicitações de memória do cache L2 e das unidades de operação atômica e decide quando e em que ordem emitir essas solicitações para a DRAM. Ao programar cuidadosamente os acessos à memória, o programador pode melhorar significativamente a utilização da largura de banda da DRAM e reduzir a latência média de acesso à memória.

PesquisaDireções para Sistemas de Memória GPU

À medida que as arquiteturas de GPU continuam a evoluir e as demandas das cargas de trabalho paralelas crescem, existem várias direções de pesquisa voltadas para melhorar o desempenho e a eficiência dos sistemas de memória GPU. Algumas das principais áreas de pesquisa incluem:

Agendamento de Acesso à Memória e Projeto de Rede de Interconexão

À medida que o número de núcleos e partições de memória nas GPUs continua a aumentar, o projeto do agendador de acesso à memória e da rede de interconexão torna-se crucial para alcançar um alto desempenho. A pesquisa nesta área se concentra no desenvolvimento de novos algoritmos de agendamento e topologias de interconexão que possam lidar de forma eficiente com o paralelismo massivo e os padrões complexos de acesso à memória das cargas de trabalho da GPU.

Por exemplo, Jia et al. [2012] propõem um algoritmo de agendamento de memória chamado "Staged Memory Scheduling" (SMS) que visa melhorar o paralelismo em nível de banco DRAM e reduzir a latência de acesso à memória. O SMS divide a fila de solicitações de memória em duas etapas: formação de lotes e agendamento de lotes. Na etapa de formação de lotes, as solicitações são agrupadas em lotes com base em seus endereços de banco e linha para explorar a localidade de linha. Na etapa de agendamento de lotes, os lotes são priorizados com base em sua idade e criticidade para garantir a equidade e reduzir os travamentos.

Outro exemplo é o trabalho de Kim et al. [2012], que propõe uma arquitetura de memória de alta largura de banda (HBM) para GPUs. O HBM empilha múltiplos chips DRAM uns sobre os outros e os conecta usando vias de silício (TSVs), permitindo uma largura de banda muito maior e uma latência menor em comparação com as memórias GDDR tradicionais. Os autores também propõem um novo projeto de controlador de memória que pode gerenciar de forma eficiente o paralelismo e a complexidade aumentados do HBM.

Eficácia do Cache

As GPUs empregam uma variedade de mecanismos de cache para reduzir o número de acessos à memória off-chip e melhorar o desempenho. No entanto, a eficácia desses caches pode variar significativamente, dependendo das características da carga de trabalho e do projeto do cache.Aqui está a tradução em português do arquivo Markdown, com os comentários do código traduzidos:

Pesquisas nesta área visam melhorar a eficácia dos caches de GPU por meio de técnicas como bypass de cache, compressão de cache e gerenciamento adaptativo de cache.

Por exemplo, Huangfu e Xie [2016] propõem um esquema de bypass de cache dinâmico para GPUs que usa uma heurística simples, mas eficaz, para determinar se uma solicitação de memória deve ser armazenada em cache ou ignorada com base em sua distância de reutilização. O esquema se adapta ao comportamento em tempo de execução do aplicativo e pode reduzir significativamente a poluição do cache e melhorar o desempenho.

Outro exemplo é o trabalho de Vijaykumar et al. [2015], que propõe uma arquitetura de cache comprimida para GPUs. Os autores observam que muitos aplicativos de GPU exibem uma redundância de dados significativa, que pode ser explorada para aumentar a capacidade efetiva dos caches. Eles propõem um novo esquema de compressão que pode alcançar altas taxas de compressão, com um mínimo de overhead de latência.

Priorização de Solicitações de Memória e Bypass de Cache

Em GPUs, as solicitações de memória de diferentes warps e threads podem ter níveis variados de criticidade e impacto no desempenho geral. Priorizar as solicitações críticas e ignorar as não críticas pode ajudar a reduzir a latência de memória e melhorar a utilização de recursos.

Pesquisas nesta área exploram técnicas para identificar e priorizar as solicitações de memória críticas, bem como mecanismos para ignorar seletivamente os caches.

Por exemplo, Jog et al. [2013] propõem um esquema de priorização de solicitações de memória chamado "Critical-Aware Warp Acceleration" (CAWA). O CAWA identifica os warps críticos que provavelmente irão travar o pipeline e prioriza suas solicitações de memória em relação às de warps não críticos. O esquema usa uma combinação de informações estáticas e dinâmicas, como o número de instruções dependentes e a idade do warp, para determinar a criticidade.

Lee et al. [2015] propõem um esquema de bypass de cache para GPUs que visa reduzir a poluição do cache e melhorar a pontualidade dos acessos à memória. O esquema usa uma abordagem baseada em PC (Program Counter) paraAqui está a tradução em português do arquivo Markdown, com os comentários do código traduzidos:

Mecanismo de previsão para identificar solicitações de memória que provavelmente não se beneficiarão do cache e as encaminhar diretamente para a hierarquia de memória de nível inferior. Os autores mostram que seu esquema pode melhorar significativamente o desempenho e a eficiência energética em comparação com uma GPU de linha de base sem bypass.

Explorando a Heterogeneidade Inter-Warp

As GPUs executam um grande número de warps concorrentemente para ocultar a latência de memória e alcançar um alto throughput. No entanto, diferentes warps podem exibir uma heterogeneidade significativa em termos de suas necessidades de recursos, padrões de acesso à memória e características de desempenho.

A pesquisa nesta área visa explorar essa heterogeneidade inter-warp para melhorar a alocação de recursos, o agendamento e o gerenciamento de memória em GPUs.

Por exemplo, Kayıran et al. [2014] propõem um esquema de gerenciamento de cache consciente da divergência em nível de warp que adapta dinamicamente as políticas de alocação e substituição de cache com base nas características de divergência de cada warp. Warps com alta divergência recebem mais recursos de cache para reduzir a divergência de memória, enquanto warps com baixa divergência recebem menos recursos para melhorar a utilização do cache.

Outro exemplo é o trabalho de Sethia et al. [2015], que propõe um projeto de controlador de memória que explora a heterogeneidade inter-warp para melhorar o paralelismo em nível de banco DRAM. Os autores observam que diferentes warps podem ter diferentes graus de paralelismo em nível de banco e propõem um algoritmo de agendamento de memória consciente de warp que prioriza os warps com alto paralelismo em nível de banco para reduzir a contenção de memória e melhorar o throughput do sistema.

Bypass de Cache Coordenado

O bypass de cache é uma técnica que permite que as solicitações de memória pule o cache e acessem diretamente a hierarquia de memória de nível inferior. Embora o bypass possa ajudar a reduzir a poluição do cache e melhorar a pontualidade dos acessos à memória, as decisões de bypass não coordenadas entre diferentes núcleos e partições de memória podem levar a um desempenho subótimo.

A pesquisa nesta área explora técnicas...Aqui está a tradução em português deste arquivo markdown. Para o código, não traduzi o código, apenas os comentários.

Uso de coordenação de decisões de bypass de cache através da GPU para melhorar o desempenho geral do sistema e a utilização de recursos.

Por exemplo, Li et al. [2015] propõem um esquema de bypass de cache coordenado para GPUs que usa um controlador de bypass centralizado para tomar decisões de bypass globais. O controlador coleta informações de tempo de execução de cada núcleo, como taxas de falhas de cache e padrões de acesso à memória, e usa essas informações para determinar a estratégia de bypass ideal para cada núcleo. Os autores mostram que seu esquema pode melhorar significativamente o desempenho e a eficiência energética em comparação com o bypass não coordenado.

Gerenciamento Adaptativo de Cache

A configuração ideal de cache para um aplicativo de GPU pode variar significativamente, dependendo de seus padrões de acesso à memória, tamanho do conjunto de trabalho e requisitos de recursos. Políticas estáticas de gerenciamento de cache, que são fixadas no momento do design, podem não ser capazes de se adaptar ao comportamento diverso e dinâmico de diferentes aplicativos.

A pesquisa nesta área explora técnicas para adaptar dinamicamente a configuração e as políticas de gerenciamento de cache com base no comportamento em tempo de execução do aplicativo.

Por exemplo, Wang et al. [2016] propõem um esquema de gerenciamento de cache adaptativo para GPUs que ajusta dinamicamente os tamanhos das partições de cache e as políticas de substituição com base nos padrões de acesso à memória do aplicativo. O esquema usa uma combinação de técnicas de hardware e software para monitorar o comportamento do cache e fazer ajustes dinâmicos para melhorar a utilização e o desempenho do cache.

Outro exemplo é o trabalho de Dai et al. [2018], que propõe uma abordagem baseada em aprendizado de máquina para o gerenciamento adaptativo de cache em GPUs. Os autores usam aprendizado por reforço para aprender automaticamente a configuração ideal de cache para cada aplicativo com base em seu comportamento em tempo de execução. As políticas aprendidas são então implementadas usando uma arquitetura de cache reconfigurável que pode se adaptar às necessidades específicas de cada aplicativo.

Priorização de Cache

Em GPUs, diferentes tipos deAqui está a tradução em português do arquivo markdown, com os comentários do código traduzidos:

Solicitações de memória, como solicitações de carga, armazenamento e textura, podem ter diferentes requisitos de latência e largura de banda. Priorizar certos tipos de solicitações sobre outros pode ajudar a melhorar o desempenho geral do sistema e a utilização de recursos.

A pesquisa nesta área explora técnicas para priorizar diferentes tipos de solicitações de memória na hierarquia de cache da GPU.

Por exemplo, Zhao et al. [2018] propõem um esquema de priorização de cache para GPUs que atribui diferentes prioridades a diferentes tipos de solicitações de memória com base em sua criticidade e sensibilidade à latência. O esquema usa uma combinação de informações estáticas e dinâmicas, como o tipo de instrução e o número de instruções dependentes, para determinar a prioridade de cada solicitação. Os autores mostram que seu esquema pode melhorar significativamente o desempenho e a eficiência energética em comparação com uma GPU básica sem priorização.

Colocação de Páginas de Memória Virtual

As GPUs tradicionalmente confiaram no gerenciamento manual de memória, onde o programador é responsável por alocar e desalocar memória explicitamente. No entanto, as GPUs recentes começaram a suportar memória virtual, o que permite que o sistema operacional gerencie automaticamente a alocação e a colocação de memória.

A pesquisa nesta área explora técnicas para otimizar a colocação de páginas de memória virtual em GPUs, a fim de melhorar a localidade de acesso à memória e reduzir a sobrecarga de tradução de endereços.

Por exemplo, Zheng et al. [2016] propõem um esquema de colocação de páginas para GPUs que visa melhorar a localidade de acesso à memória, colocando páginas que são acessadas com frequência juntas no mesmo canal ou banco de memória. O esquema usa uma combinação de técnicas de hardware e software para monitorar os padrões de acesso à memória do aplicativo e tomar decisões dinâmicas de colocação de páginas.

Outro exemplo é o trabalho de Ganguly et al. [2019], que propõe um esquema de gerenciamento de memória virtual para GPUs que visa reduzir a sobrecarga de tradução de endereços. O esquema usa uma combinação de técnicas de hardware e software.Aqui está a tradução em português deste arquivo markdown. Para o código, não traduzi o código, apenas os comentários.

Colocação de Dados

A colocação de dados na hierarquia de memória da GPU pode ter um impacto significativo na localidade de acesso à memória e no desempenho. Otimizar a colocação de dados pode ajudar a reduzir a latência da memória, melhorar a utilização do cache e aumentar a utilização da largura de banda da memória.

A pesquisa nesta área explora técnicas para otimizar a colocação de dados em GPUs com base nos padrões de acesso à memória e nos requisitos de recursos da aplicação.

Por exemplo, Agarwal et al. [2015] propõem um esquema de colocação de dados para GPUs que visa melhorar a localidade de acesso à memória, colocando dados que são acessados com frequência juntos no mesmo canal ou banco de memória. O esquema usa uma combinação de análise estática e dinâmica para determinar a colocação de dados ideal para cada aplicação.

Outro exemplo é o trabalho de Tang et al. [2017], que propõe um esquema de colocação de dados para GPUs que visa melhorar a utilização da largura de banda da memória, colocando dados em diferentes canais de memória com base em seus padrões de acesso. O esquema usa uma abordagem baseada em aprendizado de máquina para prever os padrões de acesso à memória da aplicação e tomar decisões de colocação de dados dinâmicas.

GPUs de Múltiplos Chips

À medida que as exigências de desempenho e energia das GPUs continuam a aumentar, os designs de chip único tradicionais podem não conseguir acompanhar a demanda. Os designs de múltiplos chips (MCM), onde vários chips de GPU são integrados em um único pacote, surgiram como uma solução promissora para este problema.

A pesquisa nesta área explora o design e a otimização de GPUs MCM, incluindo a arquitetura do sistema de memória, o design do interconector e o gerenciamento de recursos.

Por exemplo, Arunkumar et al. [2017] propõem um design de GPU MCM que usa um interconector de alta largura de banda e baixa latência para conectar vários chips de GPU. Os autores também propõem uma arquitetura de sistema de memória que aproveita técnicas, como prefetching do buffer de tradução de endereços (TLB) e compressão da tabela de páginas, para reduzir a latência e o overhead de largura de banda da tradução de endereços.Aqui está a tradução em português deste arquivo Markdown. Para o código, não traduzi o código, apenas os comentários.

O aumento da largura de banda e da capacidade do design MCM é usado para melhorar o desempenho e a eficiência energética.

Outro exemplo é o trabalho de Milic et al. [2018], que propõe um esquema de gerenciamento de recursos para GPUs MCM que visa melhorar a utilização de recursos e reduzir a sobrecarga de comunicação entre chips. O esquema usa uma combinação de técnicas de hardware e software para monitorar o uso de recursos e os padrões de comunicação do aplicativo e tomar decisões dinâmicas de alocação de recursos.

Conclusão

O sistema de memória é um componente crítico das arquiteturas modernas de GPU, e seu design e otimização podem ter um impacto significativo no desempenho e eficiência geral do sistema. À medida que as demandas das cargas de trabalho paralelas continuam a crescer, os pesquisadores estão explorando uma ampla gama de técnicas para melhorar o desempenho, a escalabilidade e a adaptabilidade dos sistemas de memória da GPU.

Algumas das principais direções de pesquisa nesta área incluem o agendamento de acesso à memória e o design de interconexão, a eficácia do cache, a priorização de solicitações de memória e o bypass de cache, a exploração da heterogeneidade entre warps, o bypass de cache coordenado, o gerenciamento adaptativo de cache, a priorização de cache, o posicionamento de páginas de memória virtual, o posicionamento de dados e os designs de módulos de vários chips.

Explorando essas e outras técnicas, os pesquisadores visam desenvolver sistemas de memória de GPU que possam acompanhar as crescentes demandas das cargas de trabalho paralelas, mantendo alto desempenho e eficiência energética. À medida que as GPUs continuam a evoluir e encontrar novas aplicações em áreas como aprendizado de máquina, computação científica e análise de dados, o design e a otimização de seus sistemas de memória permanecerão uma área importante de pesquisa e inovação.