• Nenhum resultado encontrado

A plataforma ASC (A Stream Compiler), apresentada em [58], se propõe a disponibilizar

um compilador capaz de minimizar o tempo de projeto e desenvolvimento de aplicações em FPGA. O autor argumenta que as ferramentas CAD para este fim não foram capazes de acompanhar a evolução do próprio hardware do FPGA.

A plataforma ataca este problema provendo uma interface de desenvolvimento no nível de software, no entanto, mantendo o desempenho esperado para uma solução manu- almente customizada. ASC melhora a produtividade permitindo que o projetista otimize sua implementação no nível algorítmico, no nível de arquitetura, no nível aritmético e no nível de gates, todos na mesma descrição em C++. O compilador simplifica a exploração de espaço de projeto transformando a tarefa de descrição de hardware em um processo de desenvolvimento de software utilizando apenas ‘gcc’ e ‘make’ para obter o netlist do hardware.

O autor argumenta que o desenvolvimento de aceleradores de hardware eficientes para aplicações específicas consiste em várias tarefas desafiadoras. Primeiramente têm-se a definição do caminho de dados (datapath). Nesta definição do caminho de dados existem quatro graus de liberdade: a arquitetura do sistema, a microarquitetura, as unidades funcionais e o nível de programabilidade e granularidade da configuração. Segundo, é

3.2. ASC: UM COMPILADOR DE APLICAÇÕES EM STREAM PARA COMPUTAÇÃO COM FPGAS

necessário definir a arquitetura de memória ideal. A hierarquia de memória num sistema baseado em acelerador pode utilizar desde registradores on-chip, passando por memórias estáticas (SRAM) on-chip e off-chip, até o nível de pentes de memória dinâmica (DRAM), embarcados na placa onde encontra-se o dispositivo FPGA. A utilização eficiente destes recursos de memória é essencial para se obter a melhor performance do sistema. Terceiro, o desenvolvimento das rotinas de comunicação entre o processador e o acelerador em hardware. É essencial que estas rotinas sejam o mais otimizadas possíveis, de forma a garantir que o gargalo na execução da aplicação não esteja no software. Quarto, o desenvolvimento das estruturas de controle do caminhos de dados. Quinto, a escolha de uma interface de comunicação entre o dispositivo acelerador e o processador que maximize a taxa de transferência de dados. Esta divisão de tarefas influenciou fortemente o desenvolvimento desta tese. O ambiente ASC é capaz de automatizar os passos quatro e cinco deixando o programador livre para focar nos três primeiros passos.

Como mencionado anteriormente, o ambiente ASC se propõe a oferecer um ambiente de desenvolvimento em alto nível, no entanto, conservando o desempenho de uma solução customizada. Para isso, é necessário que a ferramenta ofereça ao desenvolvedor um certo grau de flexibilidade que o permita explorar o espaço de projeto. Neste sentido, ASC permite ao desenvolvedor explorar o espaço de projeto de duas maneiras. Primeiro, é possível explorar alternativas ao caminho de dados no nível da microarquitetura. As descrições em ASC produzem implementações com alternativas de caminho de dados que podem ser exploradas de forma a atender trade-offs definidos pelo usuário. Segundo, o ambiente é capaz de gerar automaticamente os blocos de controle, as rotinas de execução do algoritmo e as interfaces de comunicação entre a CPU e o dispositivo acelerador. Tudo baseado em configurações realizadas pelo usuário. Estas configurações permitem que o usuário explore diferentes alternativas de arquitetura sem se preocupar em ter que realizar o árduo trabalho de implementação em baixo nível. É possível, por exemplo, definir uma hierarquia de memória no alto nível e todas as estruturas necessárias ao funcionamento desta hierarquia serão gerados automaticamente.

A parametrização oferecida pelas descrições em ASC permite que o desenvolvedor explore trade-offs como: área do FPGA, latência, troughput e precisão dos operadores aritméticos. Como ASC trata-se de uma biblioteca de C++, ela pode ser compilada por um compilador C++ padrão sem problema algum. A arquitetura do ambiente ASC é

dividida em alguns níveis de abstração que podem ser visualizados na Figura3.4.

A primeira camada, que recebe o nome de camada de análise do algoritmo (algorithm analysis layer), trata-se de uma etapa totalmente manual. As principais tarefas associadas

IMPLEMENTAÇÃO DE SOLUÇÕES EM PLATAFORMAS FPGAS

Fonte: Mencer, O. (2006). ASC: a stream compiler for computing with FPGAs

Figura 3.4 Níveis de abstração do ambiente ASC

a esta camada são: definir a hierarquia de memória adequada a aplicação; desenrolar loops para paralelizar execução de tarefas; análise da precisão aritmética ideal para o problema em questão; transformações de estruturas de dados; e a definição da arquitetura inicial. Resumidamente, esta etapa consiste no entendimento do algoritmo e na definição de como uma arquitetura de hardware (FPGA) pode solucionar este problema de forma eficiente. A segunda é a camada de geração da arquitetura (architecture generation layer). Nesta camada o usuário descreve a arquitetura projetada na camada anterior em linguagem ASC. A terceira camada, a camada de geração de módulos (module generation layer), mapeia a descrição realizada em ASC para uma biblioteca integrada, conhecida como

PAM-Blox II [59]. Em seguida, na camada Gate level to netlist, os módulos descritos em

PAM-Blox II são traduzidos para PamDC [16], uma biblioteca em C++ capaz de realizar

projeto em FPGAs em nível de gates, simulação, e geração de netlists em formato EDIF.

3.2.1 Geração da arquitetura em ASC

A geração da arquitetura consiste em transformar uma descrição da arquitetura em ASC para uma estrutura que consiste em um caminho de dados, controle e interfaces. ASC possui uma estrutura de módulos parametrizáveis que recebe o nome de arquitetura em stream. Todos estes módulos da biblioteca são totalmente descritos em C++ através de tipos e operadores customizados, assim como, uma série de macros e chamada de funções.

3.2. ASC: UM COMPILADOR DE APLICAÇÕES EM STREAM PARA COMPUTAÇÃO COM FPGAS

int i, a[SIZE], b[SIZE]; for (i = 0; i<SIZE; i++) { b[i] = a[i] + 1; }

(a) Código em C

STREAM START;

HWint a(IN, 32), b(OUT, 32); STREAM_LOOP(SIZE);

STREAM_OPTIMIZE = THROUGHPUT; b = a + 1;

STREAM END;

(b) Código em ASC

Figura 3.5 Exemplo de um código que realiza o incremento dos valores de um vetor

incremento dos valores de um vetor. Na Figura 3.5(a) o código em C onde todos os

valores do vetor são acessados e incrementados através de um laço (for). Em uma estru-

tura em stream, descrita em ASC na Figura3.5(b), as declarações STREAM_START e

STREAM_ENDdefinem o escopo da estrutura que está sendo criada. Em seguida, são

declarados os streams de entrada e saída de dados. O tipo utilizado, HWint, garantirá que estes vetores de dados sejam enviados e armazenados na memória do dispositivo co-processador como valores inteiros. O stream ‘a’ trata-se de um vetor de entrada com largura de bits igual a 32. O stream ‘b’ um vetor de saída de mesma largura de bits. Ao iniciar-se o processamento, os dados do vetor ‘a’ serão enviados da memória do processador host para a memória do co-processador. Durante o processamento os dados de saída são armazenados na memória do co-processador numa região alocada para o vetor ‘b’. Por fim, os dados do vetor ‘b’ são transferidos de volta para a memória do processador host. A diretiva STREAM_LOOP(SIZE) por sua vez é responsável por controlar o laço. Ao informar o número de iterações que existiria em uma execução seqüencial convencional, é possível saber a quantidade de dados que irá fluir pelo pi- peline da estrutura em stream. A diretiva STREAM_OPTIMIZE = THROUGHPUT é responsável por definir que tipo de otimização será realizada. ASC permite otimização de taxa de transferência (THROUGHPUT), latência (LATENCY) e área (AREA). Se não for informado, o compilador assume taxa de transferência como otimização padrão. Por fim, a linha b = a + 1 realiza o incremento do vetor. A arquitetura gerada pelo código

ASC da Figura3.5(b)pode ser visualizado na Figura3.6.

+

FIFO de entrada FIFO de saída a b 1

Figura 3.6 Arquitetura gerada através de ASC para incremento de um vetor.

IMPLEMENTAÇÃO DE SOLUÇÕES EM PLATAFORMAS FPGAS

múltiplas saídas. A cada ciclo de clock um grupo de entradas flui através da implementa- ção do DFG. Contudo, para que o DFG esteja devidamente sincronizado, é necessário a inserção de FIFOs para atrasar corretamente os dados que alimentam os elementos computacionais existentes. ASC possui um escalonador responsável por realizar este sincronismo. As operações presentes no DFG que foram traduzidas do código C++ são escalonadas inserindo FIFOs de atraso entre os produtores e consumidores de dados a fim de garantir que os operandos de cada uma das operações cheguem sincronizados aos seus respectivos elementos computacionais no grafo.

Para validação do ambiente o autor implementou diversos algoritmos baseados em stream. Para validação da exploração de espaço de projeto (latência x taxa de transferência x área) foram utilizados: os algoritmos de compressão de wavelet; codificação Kasumi, parte do padrão de comunicação sem fio 3G; e algumas funções elementares como seno, cosseno e rotações. Para avaliação de desempenho foram implementados os algoritmos de codificação IDEA e um algoritmo de compressão de dados sem perdas. Os resultados

obtidos realmente validaram a proposta do ambiente e podem ser encontrados em [58].

3.2.2 Considerações sobre o ambiente ASC

A ferramenta acadêmica ASC inspirou várias características do ambiente fastRTM. Ela fornece um ambiente de alto nível, baseado em C++, onde são descritos os algoritmos. O ambiente também disponibiliza estruturas para exploração de espaço de projeto porém, de maneira manual. É possível definir diferentes caminhos de dados e avaliar o desempenho das alternativas. Um dos pontos fortes da linguagem é a geração automática do código para a plataforma FPGA a partir do modelo criado no alto nível. Apesar do ambiente apresentado neste trabalho prever esta funcionalidade, ela ainda não foi implementada. Por outro lado, o ambiente ASC não fornece estimativas de desempenho e não possibilita a exploração de espaço de projeto automatizada.