software-and-computer-engineering
Compreender o papel da arquitetura da memória na eficiência do processador Dsp
Table of Contents
Os processadores de sinais digitais (DSPs) são microprocessadores especializados projetados para lidar com tarefas de processamento de sinais em tempo real com eficiência excepcional. Diferentemente de CPUs de finalidade geral que priorizam o agendamento de tarefas e a previsão de ramificações, os DSPs são projetados para operações aritméticas determinísticas de alta produtividade – operações de multiplicação de acumulação (MAC) – em dados de streaming. O fator mais importante que determina se um DSP pode manter seu desempenho teórico é sua arquitetura de memória. O subsistema de memória determina a rapidez com que os operandos podem ser obtidos a partir do armazenamento, como os resultados intermediários são tamponados e como os dados finais são escritos. Um descompasso entre as unidades aritméticas do processador e o sistema de memória cria um gargalo de garrafa, atrasando o o o oleoduto e desperdiçando o poder. Este artigo fornece uma profunda profundidade abrangente na arquitetura de memória dos DSPs modernos, explicando os diferentes tipos de memória usados, os modelos arquitetônicos que os governam, estratégias hierárquicas avançadas e o impacto direto no desempenho da aplicação real. Entender estes princípios são essenciais para arquitetos de sistemas, engenheiros de software incorporados e engenheiros de hardware
O papel fundamental da memória no processamento de sinais de cargas de trabalho
As cargas de trabalho de processamento de sinais são fundamentalmente intensivas em dados. Algoritmos como filtros de resposta de impulso finito (FIR), transformadas de Fourier rápidas (FFTs), convoluções e multiplicação de matriz operam em grandes matrizes de dados amostrados. Estes algoritmos exibem um padrão de acesso previsível e repetitivo: uma sequência de coeficientes (armazenados na memória) é multiplicada repetidamente com amostras de dados recebidas. A unidade lógica aritmética (ALU) de um DSP pode executar uma operação MAC em um único ciclo de relógio, mas somente se o coeficiente e a amostra de dados estiverem disponíveis simultaneamente. Se o subsistema de memória não conseguir fornecer os dois operandos por ciclo, as paragens de tubulação e as reduções de rendimento efetivas.
Além disso, restrições em tempo real exigem que o processamento mantenha a taxa de amostragem. Para áudio a 48 kHz, o processador deve completar seu algoritmo em aproximadamente 20 microssegundos. Para vídeo a 30 frames por segundo com resolução de 1080p, esse requisito torna-se dezenas de milissegundos por frame – e muitas vezes muito mais apertado para processamento de subframe. A latência e largura de banda da memória ditam diretamente se esses prazos podem ser cumpridos. Além da velocidade bruta, o consumo de energia é uma preocupação crítica. Cada acesso à memória consome energia, e acessos de memória fora do chip podem ser ordens de magnitude mais caras do que acessos em chip. Portanto, uma arquitetura de memória eficiente minimiza a necessidade de sair do chip, maximizando o uso de memória rápida e de baixa potência no chip.
Tipos de memória de núcleo em sistemas DSP
Memória do Registo
Os registros são a memória mais rápida em qualquer DSP. Normalmente implementados como flip-flops ou pequenos arrays SRAM dentro do núcleo do processador, os registros mantêm operandos que estão sendo ativamente calculados. A maioria dos núcleos DSP têm um conjunto dedicado de acumuladores (por exemplo, registros de 40 bits ou 64 bits para evitar o transbordamento em operações MAC) e um conjunto de registros de endereços para aritmética do ponteiro. A latência de acesso é um ciclo de relógio ou menos, mas a capacidade total é muito pequena – geralmente menos de 256 bytes. A alocação de registro está inteiramente sob controle do programador (ou otimização do compilador), e o uso eficiente do registro é uma marca de código DSP de alto desempenho.
Memória da 'Cache'
A memória de cache é uma pequena e rápida SRAM que armazena cópias de dados ou instruções frequentemente acessados da memória principal. DSPs podem incluir caches de instruções separadas (I-cache) e caches de dados (D-cache) para evitar contencioso. No entanto, caches introduzem imprevisibilidade – uma falha de cache pode atrasar o pipeline por dezenas ou centenas de ciclos – o que é problemático para sistemas em tempo real. Como resultado, muitas aplicações DSP de alta confiabilidade desabilitam caches ou usam-nas apenas em um modo de "bloqueio", onde código crítico e dados são fixados em cache. Quando caches são usados, seu tamanho, associatividade e tamanho de linha afetam drasticamente taxas de sucesso. Os caches DSP típicos variam de 4 KB a 512 KB por nível, com níveis zero a dois (L0, L1, L2).
SRAM On-Chip (Memória do Scratchpad)
A memória estática de RAM (SRAM) no chip, frequentemente chamada memória de scratchpad, fornece armazenamento previsível e de baixa latência diretamente no processador. Ao contrário das caches, a memória de scratchpad é explicitamente gerenciada por software - os dados devem ser movidos para dentro e para fora pelo programador ou compilador. Este comportamento determinístico faz do scratchpad a escolha preferida para o processamento de sinais em tempo real, onde o pior tempo de execução (WCET) deve ser conhecido. O SRAM no chip pode ser particionado em vários bancos, cada um acessível por diferentes unidades funcionais em paralelo. Os tamanhos típicos variam de 32 KB a vários megabytes, dependendo da família DSP (por exemplo, a série Texas Instruments C6000 fornece até 8 MB de SRAM on- chip).
Memória externa (DRAM/Flash)
A memória externa, geralmente DDR SDRAM (especialmente LPDDR para dispositivos móveis/embedded), fornece grande capacidade - gigabytes - ao custo de alta latência (dez de nanossegundos a 100+ ns) e maior energia por acesso. Para muitas aplicações DSP, a memória externa possui grandes arrays de dados que excedem o armazenamento em chip, tais como quadros de vídeo, buffers de áudio ou tabelas de pesquisa. Memória flash (NOR ou NAND) é usada para armazenar código de programa e dados constantes que persistem em ciclos de energia. Aceder à memória externa requer o uso de controladores de memória que gerenciam a arbitragem de barramento, ciclos de atualização e ordenação de dados. DSPs avançados possuem múltiplas interfaces de memória externa (por exemplo, EMIF, DDR2/4, LPDDR4) para aumentar a largura de banda disponível.
Modelos de Arquitetura de Memória em DSPs
Arquitetura de Harvard
A arquitetura Harvard separa a memória de instruções e a memória de dados em ônibus fisicamente distintos, permitindo o acesso simultâneo a ambos durante um único ciclo de relógio. Um DSP típico com arquitetura Harvard pode obter uma instrução da memória do programa (frequentemente flash on-chip ou SRAM) enquanto lê duas palavras de dados da memória de dados - uma para o coeficiente e outra para a amostra. Esta é a base da execução MAC de um único ciclo. A maioria dos DSPs modernos (por exemplo, Dispositivos Analógicos SHARC, TI C55x, C6000) usam uma arquitetura Harvard modificada onde as instruções e os ônibus de dados são separados, mas podem ser interligados para flexibilidade.
Arquitetura Von Neumann
A arquitetura von Neumann (ou Princeton) usa um único espaço de memória compartilhado para instruções e dados, servido por um único ônibus. Isso simplifica o design do sistema e o mapeamento de memória, mas cria um gargalo fundamental (muitas vezes chamado de “borga de von Neumann”). Num contexto DSP, von Neumann puro raramente é visto porque não pode fornecer tanto uma instrução como dois operandos de dados por ciclo. No entanto, alguns DSPs de baixo custo ou microcontroladores usados para tarefas de processamento de sinais simples (como o Cortex- M4F) empregam um mapa de memória tipo von Neumann com ônibus separados apenas para memória fortemente acoplada. O trade-off é desempenho reduzido, mas custo de silício menor.
Arquitetura Harvard Modificada (com Instruções e Caches de Dados)
Para colmatar a lacuna entre o paralelismo de Harvard e a flexibilidade de von Neumann, muitos DSPs implementam uma arquitetura Harvard modificada. Isto usa ônibus de instruções e dados separados no nível central, mas a hierarquia de memória (incluindo caches e memória principal) é unificada. Por exemplo, uma cache de instruções L1 fica no barramento de instruções, e uma cache de dados L1 fica no barramento de dados, mas ambos fornecem suas linhas de uma cache L2 compartilhada ou memória externa. Isto permite que o núcleo obtenha instruções e dados em paralelo com as caches, enquanto a memória de suporte está unificada para simplicidade. Esta arquitetura é usada em DSP+ARM SoCs de alto desempenho, como o TI OMAP ou Qualcomm Hexagon.
Implicações VLIW e SIMD
Os processadores de Word de Instrução Muito Longa (VLIW), como o TI C6000, embalam múltiplas operações numa instrução (por exemplo, dois MACs mais carga/armazenamento). Para manter o paralelismo VLIW, a arquitetura de memória deve fornecer portas de memória suficientes para alimentar todas as unidades funcionais. Isto significa frequentemente vários bancos de memória, cada uma com a sua própria porta de leitura. Por exemplo, o C6000 tem duas bases de memória de dados (A-side e B-side) conectadas a duas vias de dados, permitindo cargas simultâneas de ambos os bancos. Da mesma forma, as unidades SIMD (Single Instruction Multiple Data) requerem barragens de dados largas (por exemplo, 128- bits ou 512- bits) para carregar várias palavras de dados num ciclo. As arquiteturas de memória devem ser adaptadas para corresponder à largura da localização de dados.
Hierarquias e Estratégias Avançadas da Memória
Multi-Nível Cache e Scratchpad Híbridos
DSPs modernos combinam frequentemente uma pequena 'cache' L1 (por exemplo, 16 KB de instrução + 16 KB de dados) com uma SRAM L2 maior (por exemplo, 256 KB) que pode ser configurada como 'cache' ou 'scratchpad'. Por exemplo, o núcleo TI C66x permite particionar a memória L2 entre 'cache' e 'SRAM' numa base de blocos a blocos. Esta abordagem híbrida dá ao desenvolvedor o controlo sobre os dados mais críticos de desempenho, permitindo que os dados menos críticos beneficiem da 'cache'. O L2 também pode ser partilhado entre vários núcleos num DSP multicore.
Motores DMA (Acesso Directo à Memória)
Os controladores DMA são integrais à eficiência da memória DSP. Eles permitem que as transferências de dados entre memória externa e memória on- chip ocorram sem intervenção da CPU. Um padrão típico é usar um esquema de duplo buffer (ping- pong): enquanto o DSP processa dados do buffer A, o DMA preenche o buffer B da memória externa, e uma vez que o processamento em A é feito, a troca de funções. Isto oculta a latência do acesso à memória externa e mantém o oleoduto DSP ocupado. As funcionalidades DMA, tais como endereçamento 2D, comprimento da passada e prioridade programável, permitem o tratamento eficiente de arrays multidimensionais (por exemplo, quadros de vídeo).
Banco de Memória e Interleaving
Para fornecer alta largura de banda, o SRAM on- chip é frequentemente dividido em vários bancos (por exemplo, 8 ou 16). Cada banco tem sua própria porta de leitura/escrita, de modo que vários acessos simultâneos são possíveis desde que eles se destinem a diferentes bancos. Interleaving - espalhando endereços sucessivos entre bancos - reduz conflitos bancários para padrões de acesso sequenciais (comum em loops DSP). Por exemplo, um SRAM de 512 KB pode ser organizado como 8 bancos de 64 KB cada, com endereços modulo 8 distribuídos entre bancos. Para um filtro FIR, os coeficientes de um banco e amostras de outro podem ser lidos em paralelo. Controladores avançados de memória também suportam churning e mitigação de martelos de linha em DRAM externo.
Buffers de circuito (Suporte de circuito de cabeça-azero)
Muitos DSPs incluem buffers de memória pequenos e rápidos projetados especificamente para loops de software. Um buffer de loops pode segurar um pequeno kernel (por exemplo, instruções 128 a 2048) que é executado repetidamente sem obter da memória principal. Combinado com modos de endereçamento para buffers circulares, isso elimina o acesso de memória em cima para loops apertados — uma ocorrência comum no processamento de sinal. Por exemplo, o TI C5500 tem uma cache de instruções de 4 KB que também pode funcionar como buffer de loops. Esta arquitetura reduz drasticamente o consumo de energia porque o barramento principal de memória está inativo durante a execução do loop.
Coerência de cache em DSPs Multicore
Quando vários núcleos DSP compartilham dados (por exemplo, em um radar ou aplicação MIMO), protocolos de coerência de cache evitam dados obsoletos. São usados os serviços de espionagem de hardware ou coerência gerenciada por software (por exemplo, usando os invalidados de cache). Alguns DSPs evitam caches totalmente a favor do scratpad para contornar a sobrecarga de coerência. Por exemplo, o MSC8156 (agora NXP) do Freescale usa uma abordagem "sem cache" com um SRAM compartilhado de 512 KB. O trade-off é um esforço maior do programador para gerenciar movimentos de dados, mas o comportamento determinístico em tempo real.
Impacto da arquitetura da memória nas principais métricas de desempenho
A arquitetura de memória influencia diretamente quatro métricas de desempenho críticas: rendimento (operações por segundo), latência (tempo até o primeiro resultado), consumo de energia e determinismo em tempo real. Para ilustrar, considere um filtro FIR de comprimento N. Com uma arquitetura de memória ideal (Harvard + duas portas de leitura + acesso de ciclo único), cada torneira requer um ciclo para carga de coeficiente, um para carga de amostra e um para MAC – efetivamente três ciclos por torneira. Usando uma instrução de dupla carga, que pode ser reduzida para um ciclo por torneira. Se a memória não puder fornecer ambos os operandos cada ciclo, a taxa de transferência cai proporcionalmente. Para 1000-tap FIR a 48 kHz de amostragem, a taxa de transferência necessária é de 48 milhões de MACs por segundo – facilmente atingida por um DSP de 100 MHz com largura de banda de memória adequada.
Para o processamento FFT, o algoritmo Cooley-Tukey envolve operações de borboletas que lêem dois valores complexos e um fator twiddle, e depois escreve dois resultados. Com uma única porta de memória, isto requer quatro leituras e duas gravações por borboleta, levando pelo menos seis ciclos. Com uma arquitetura de banco duplo (um para dados, um para coeficientes), as leituras podem ser sobrepostas, reduzindo para três ciclos por borboleta. Escalas de consumo de energia aproximadamente linearmente com acessos de memória por operação. Uma hierarquia de memória bem ajustada pode reduzir acessos totais por um fator de 10- 100 em comparação com implementações ingênuas que constantemente obtêm da memória externa.
Em telecomunicações, algoritmos de detecção de símbolos (Viterbi, MLSE) requerem um amplo retrocesso com acesso aleatório às métricas de estado. Aqui, SRAM com baixa latência é essencial para manter a taxa de símbolo em tempo real. Uma única falha de cache pode causar uma violação de tempo, então os designers frequentemente prendem a tabela de métricas de estado no scratpad.
Considerações de projeto para engenheiros de sistema
Ao projetar um sistema baseado em DSP, os engenheiros devem particionar os dados do aplicativo através da hierarquia de memória. As principais decisões incluem:
- Posição de dados: Quais arrays são colocados no SRAM on-chip vs DRAM externo? Normalmente, o conjunto de trabalho para o algoritmo mais frequentemente executado (por exemplo, coeficientes de filtro, variáveis de estado) deve se encaixar na memória on-chip. Tabelas menos acessadas (por exemplo, tabelas de procura para comparação) podem residir fora do chip.
- Mapeamento de memória: Use os registros de atributos de memória do DSP para definir políticas de cache (por exemplo, write-through, write-back, non-cacheable). Para dados compartilhados, use não cacheable ou aloque em SRAM compartilhado para evitar problemas de coerência.
- Usando scripts de linker: Defina seções de memória no arquivo de comando do linker. Por exemplo, coloque .text em SRAM interno para execução rápida, e .data em DRAM externo para buffers grandes. Alguns DSPs suportam DMA para copiar dados críticos do flash para SRAM durante o arranque.
- Duplo buffer com DMA: Alocar dois buffers no SRAM on-chip. Configure um canal DMA para preencher um enquanto o DSP processa o outro. Certifique-se de que o tamanho da transferência DMA e os endereços de origem/destinação estão alinhados com as larguras do barramento para maximizar a taxa de transferência.
- Choosing externa memory:] Para alta largura de banda, considere LPDDR4 ou HBM (alta largura de banda) para aplicações intensivas em memória como radar ou banda base 5G. Para baixa potência, use flash NOR serial para código e execute-in-place (XIP) se o DSP suporta.
- Gerenciamento de energia: Use o gating de relógio em bancos de memória que não estão em uso (por exemplo, interfaces externas ociosas podem ser colocadas em auto-refrescas). Muitos DSPs permitem escala de tensão para SRAM on-chip para reduzir a potência dinâmica.
Instruções futuras em arquitetura de memória DSP
Aplicações DSP emergentes, como inferência de aprendizagem profunda em dispositivos de borda, processamento de vídeo 4K/8K em tempo real e requisitos de memória de impulso definidos por software (SDR). Várias tendências são visíveis:
- 3D stacked memory (HBM, HBM2E): Já usado em GPUs de alto nível, a HBM está sendo integrada em DSPs e FPGAs para sistemas que requerem largura de banda maciça (até 460 GB/s por pilha). A proximidade reduz a latência e a potência.
- Memória não volátil no chip (eNVM): Tecnologias emergentes como MRAM ou ReRAM podem substituir o SRAM on-chip para armazenamento de código, reduzindo o tempo de inicialização e eliminando a necessidade de flash externo. Essas memórias são quase tão rápidas quanto o SRAM, mas retêm dados sem energia.
- Aceleradores de rede neurais com memória de peso local: Os DSPs projetados para inferência de IA incluem um buffer de peso local (frequentemente SRAM ou SRAM-like) que pode conter matrizes de peso para evitar leituras repetidas de memória externa. Isto é análogo a um scratpad, mas otimizado para padrões de convolução.
- Hierarquias de memória adaptativas: Os futuros DSPs podem implantar memória reconfigurável (por exemplo, eFPGA com memória incorporada) que pode ser reuso como cache, scratpad ou FIFO dependendo da carga de trabalho. Isso permitiria a otimização do tempo de execução.
- Cache gerenciado por software:** Algumas arquiteturas de pesquisa propõem substituir cache de hardware por memórias controladas por software por seções críticas, mantendo cache para seções não críticas.Essa abordagem híbrida poderia oferecer o melhor de ambos os mundos.
Conclusão
A arquitetura de memória é a espinha dorsal da eficiência do processador DSP. Uma compreensão profunda dos trade-offs entre registro, cache, SRAM on-chip e memória externa permite que os designers de sistema minimizem a latência de acesso de dados, maximizem a produtividade e reduzam o consumo de energia. A escolha do modelo de arquitetura (Harvard vs Harvard vs von Neumann modificado), o uso de estratégias avançadas como DMA, buffers bancários e loops, e a partição cuidadosa de dados através da hierarquia de memória são todos passos essenciais para alcançar metas de processamento de sinais em tempo real. À medida que as aplicações se tornam mais exigentes, com taxas de quadros mais elevadas, larguras de banda mais amplas e algoritmos mais complexos, projetos de memória inovadores como HBM, NVM on-chip e hierarquias adaptativas continuarão a impulsionar o desempenho do DSP. Engenheiros que dominam esses princípios serão bem equipados para projetar sistemas que são poderosos e eficientes.