You are on page 1of 6

REVISTA DO DETUA, VOL.

1, N 6, SETEMBRO 1996

Implementao de Algoritmo de Compresso e Descompresso de Dados para Modelo de Co-processamento baseado em FPGAs

Bruno Pimentel, Joel Arrais

Resumo O artigo descreve resultados obtidos no mbito de um projecto final do curso de LECT (Licenciatura em Engenharia de Computadores e Telemtica). O projecto consiste na concepo e optimizao de co-processadores baseados em FPGAs para a resoluo de tarefas computacionalmente intensivas (tais como, resoluo de problemas combinatrios, utilizando matrizes discretas). Tm j sido feitos estudos para abordar o problema da transferncia de grandes quantidades de dados para um coprocessador baseado numa FPGA e em receber os resultados, podendo estes ser armazenados de forma bastante compacta. Neste projecto, como forma de reduzir o tempo gasto na comunicao, foi implementada uma tcnica de compresso e descompresso de dados, atravs da qual, um computador anfitrio pode comprimir dados e transferilos para um co-processador baseado numa FPGA. Uma vez no co-processador, a informao pode ser manipulada directamente ou aps ser descomprimida. O artigo descreve os algoritmos de compresso e descompresso baseados no mtodo de Huffman, ligeiramente alterado, a sua implementao na linguagem C++ e os circuitos baseados em FPGAs que suportam a necessria descompresso. Todo o hardware foi concebido atravs da especificao na linguagem Handel-C e implementado na FPGA XC2V1000-4 da famlia Virtex-II, a qual integra a placa prottipo RC200 da Celoxica. Abstract The paper describes some results obtained within a final year project for LECT (Licenciatura em Engenharia de Computadores e Telemtica). The project is devoted to the design and optimization of FPGA-based co-processors for data extensive applications (such as solving combinatorial problems over discrete matrices). One particular problem that has been studied in detail is transferring high volume of data to an FPGA-based coprocessor and receiving the results from the co-processor, which can be coded very compactly. In order to reduce communication time, a technique of data compression/decompression has been employed in such a way that a host computer compresses data and transfers them to an FPGA-based co-processor. The latter either decompresses them or handles the compressed records. The paper describes compression/decompression algorithms based on the slightly modified Huffman method, their implementation in C++ language and FPGA-based circuits that provide for the relevant decompression. All hardware has been designed from specification in Handel-C and

implemented in FPGA XC2V1000-4 of Virtex-II family available on a RC200 prototyping board of Celoxica.

I. INTRODUO Na realizao de tarefas de grande complexidade, a utilizao de co-processadores com caractersticas mais adequadas tem como objectivo reduzir o tempo da sua realizao. Assim, para tirar partido da eficincia que o hardware permite, os computadores de uso geral podem ser ligados a plataformas de caractersticas reconfigurveis, como as que se baseiam em FPGA's (Field Programmable Gate Array). Perante tarefas que implicam grandes quantidades de dados, a largura de banda do canal de transferncia pode ser um factor limitativo da taxa de realizao das tarefas. Para no comprometer a utilidade do co-processamento, a comunicao pode tornar-se mais rpida atravs da compresso dos dados, num modelo como o ilustrado na fig. 1.

Fig. 1 Modelo de co-processamento

Depois de os dados comprimidos se encontrarem no coprocessador, existe a possibilidade de operar directamente sobre eles ou de os descomprimir previamente. No presente trabalho, foi abordada a segunda alternativa e, como co-processador, foi utilizada a placa RC200 [1,2] da Celoxica.

REVISTA DO DETUA, VOL. 1, N 6, SETEMBRO 1996

A. Objectivos O trabalho desenvolvido visa, fundamentalmente, os seguintes objectivos: Seleccionar o algoritmo de compresso e descompresso a implementar; Implementar o algoritmo de compresso seleccionado em C++; Implementar um mecanismo de suporte recursividade em hardware na linguagem Handel-C [3]; Implementar o algoritmo de descompresso em Handel-C, recorrendo recursividade. Para alm dos objectivos propostos, aps a concluso do compressor em C++, foi realizado um descompressor compatvel na mesma linguagem, para testar a primeira aplicao. Os fluxos de operaes de alto nvel que descrevem o funcionamento de algumas componentes desenvolvidas so ilustrados atravs de diagramas de actividades, de acordo com o especificado na UML (Unified Modeling Language) [4]. II. COMPRESSO / DESCOMPRESSO DE DADOS Na escolha do algoritmo a implementar [5,6], foram considerados trs requisitos: ser eficiente, de modo a fornecer factores de compresso elevadas; ser simples, para comprimir e descomprimir em tempo reduzido; ser implementvel em hardware com recursos limitados. Foi adoptada a verso adaptativa do algoritmo de compresso de Huffman [7], por verificar estes requisitos em medida considervel. No sentido de melhorar o factor de compresso, este algoritmo foi objecto de algumas adaptaes, nomeadamente a integrao de um mecanismo que tira partido da redundncia inerente s repeties consecutivas de determinadas sequncias de bits do ficheiro original. O mecanismo consiste em detectar estes casos, indicar a sequncia de bits em causa, uma nica vez, e indicar o nmero de repeties. Assim, na contagem das ocorrncias, apenas so consideradas as ocorrncias no consecutivas. Em seguida, descrito o funcionamento da aplicao desenvolvida, ilustrando todos os passos envolvidos na criao dos ficheiros comprimidos. Considerando o exemplo do ficheiro na fig. 2-a, o primeiro passo consiste em determinar o nmero de ocorrncias e o tamanho da sequncia mais longa de repeties consecutivas de cada caracter, criando a tabela de frequncia presente na fig. 2-b. Seguidamente, para cada caracter, criado um n com o respectivo nmero de ocorrncias. Recorrendo ao algoritmo de ordenao considerado em [8], gerada uma rvore (fig. 3-c) cuja organizao exprime a ordenao dos ns por nmero de ocorrncias: ramo esquerdo para valores menores ou iguais; ramo direito para valores maiores. Esta rvore, designada de rvore de ordenao, permite obter a rvore

a) Ficheiro Original
1000011 1000010 1000011 1000100 1000100 1000100
B A B C C C

b)

Tabela de Frequncia 1000010 1000011 1000100 A 1 1 B 2 1 C 1 3

Sequncia de bits original Caracter representado N. de ocorrncias no consecutivas Tamanho da maior sequncia de repeties consecutivas

c)

rvore de Ordenao A 1 C 1 B 2

d)

AC 2 A 1 C 1

B 2

f) e)
AC 2 B 2

rvore de Huffman: ABC 3 0 AC 2 0 1 C 1 1 B 2

A 1

C 1

A 1

g)

Tabela de Codificao:
Caracter: Codificao:

h)

Ficheiro Comprimido: B 1 A B CCC C x3

A B C

00 1 01

00 1 01 11

Fig. 2 Exemplo de aplicao do algoritmo de compresso

de Huffman, atravs de algumas transformaes cuja descrio se segue. Nas figs. 2-c, 2-d, 2-e e 2-f, as ligaes que representam os ramos das rvores de ordenao e de Huffman esto representadas por linhas contnuas e descontnuas, respectivamente. O processo cclico e o primeiro passo consiste em retirar da rvore de ordenao os dois ns com menor valor. Estes ns so agregados num novo n, ao qual se atribui o valor da soma dos nmeros de ocorrncias dos ns anteriores, obtendo um ramo na rvore de Huffman (figs. 2-c e 2-d). O novo n inserido na rvore de ordenao (fig. 2-e) e todo este conjunto de operaes repetido at que existam apenas ligaes da rvore de Huffman (fig. 2-f). Este mtodo de transformao descrito com maior detalhe e acompanhado de um exemplo mais complexo, por V. Sklyarov, no artigo FPGA-based implementation of recursive algorithms [9]. Fazendo uso dos valores 0 e 1, para distinguir o ramos da esquerda e da direita em cada n da rvore de Huffman, possvel construir a tabela de codificao dos caracteres apresentada na fig. 2-g. Para tal, extrada a sequncia de valores que se obtm no caminho desde a raiz at folha de cada caracter. Como exemplo, a codificao 01 para o

REVISTA DO DETUA, VOL. 1, N 6, SETEMBRO 1996

caracter C justifica-se pelo facto de a folha correspondente se encontrar no ramo direito do n AC que, por sua vez, pertence ao ramo esquerdo do n ABC. Finalmente, recorrendo tabela de codificao, possvel realizar a traduo dos caracteres originais pelos cdigos correspondentes. Na descompresso, realizada a traduo no sentido inverso, utilizando, novamente, a tabela de codificao. Em caso de sequncia de repeties consecutivas, lido o tamanho da mesma, de modo a poder reconstitui-la. III. IMPLEMENTAO DE COMPRESSO / DESCOMPRESSO
EM SOFTWARE

A. Compressor O processo de compresso constitudo pelas seguintes fases: definio da codificao a utilizar atravs da anlise do ficheiro original, exportao da rvore de Huffman e traduo efectiva do ficheiro. Como referido, a codificao atribuda a cada smbolo do ficheiro original baseia-se no nmero de vezes que nele ocorre. Assim, feita uma primeira leitura para o levantamento desta informao e para verificar o maior nmero de ocorrncias consecutivas (NOC) de cada smbolo. Os NOCs mximos vo ser utilizados na determinao do nmero de bits necessrio para armazenar o tamanho das repeties consecutivas de cada smbolo, que foram detectadas nos dados comprimidos. O diagrama de actividades que consta da fig. 4 descreve o funcionamento desta anlise.
Fim

At aqui, foi considerado o caracter como elemento bsico da compresso, cujo tamanho oito bits. No entanto, foi introduzido o conceito de smbolo, enquanto elemento bsico de compresso de tamanho no prdefinido, possibilitando uma eventual optimizao do factor de compresso. A verso adaptativa realiza uma optimizao ao algoritmo de Huffman original, atravs da definio da codificao individual dos smbolos para cada ficheiro a comprimir. Uma vez que esta codificao necessria ao descomprimir, definiu-se que a rvore de Huffman gerada na compresso seria includa no incio do ficheiro, ficando toda a informao necessria descompresso a ele confinada. Sendo assim, antes de iniciar a implementao do algoritmo, especificou-se o formato a utilizar no armazenamento da rvore, assegurando a compatibilidade entre as componentes. Para especificar a estrutura de armazenamento da rvore de Huffman no ficheiro comprimido, foi utilizada a norma BNF (Backus Naur Form) [10]. Na fig. 3 apresentada uma verso simplificada da especificao definida, tendo alguns parmetros sido concretizados. Segundo esta especificao, a rvore de Huffman constituda por um ramo, podendo cada ramo conter uma folha ou um par de ramos. As folhas so constitudas por um smbolo e pelo nmero de bits que vo indicar o nmero mximo de repeties consecutivas. Neste exemplo, foram atribudos quatro bits para o tamanho mximo de repeties consecutivas e oito para o de smbolo.

[Sim] Incio

Fim do ficheiro?

[No]

Ler Smbolo

Smbolo actual igual ao anterior?


[No]

[Sim]

Limpar NOC no caso de Smbolo novo

[No]

Incrementar Nmero de Ocorrencias do Smbolo NOC maior do que o armazenado como mximo?

[Sim]

Actualizar NOC Mximo do Smbolo anterior

Incrementar NOC do Smbolo

Fig. 4 Diagrama de actividades do processo de anlise do ficheiro original

<Bit>::=0|1 <Simbolo>::=<Bit><Bit><Bit><Bit><Bit><Bit><Bit><Bit> <TamanhoRepeticao>::=<Bit><Bit><Bit><Bit> <Folha>::=<TamanhoRepetio><Simbolo> <Ramo>::=0<Folha>|1<Ramo><Ramo> <ArvoreHuffman>::=<Ramo>


Fig. 3 Estrutura de armazenamento da rvore de Huffman

Iterativamente at ao fim do ficheiro, lido um smbolo que comparado com o anterior. Se estes smbolos forem iguais, o NOC actual (varivel auxiliar) incrementado; se se tratar de um novo smbolo, incrementa-se o nmero de ocorrncias deste. De seguida, o NOC actual comparado com o NOC mximo do smbolo em causa (armazenado na tabela de frequncia). No caso de o primeiro ser superior, o segundo actualizado. No passo seguinte, o NOC actual inicializado, no caso de se tratar de um smbolo novo, uma vez que se trata do comeo de uma nova sequncia. A informao obtida da anterior anlise do ficheiro de entrada utilizada para a criao da rvore de ordenao. Para tal, cada smbolo com nmero de ocorrncias positivo d origem a um n que inserido na rvore de ordenao [8]. Como ilustrado nas figs. 2c-f, esta rvore convertida na rvore de Huffman, a partir da qual se extrai a codificao de cada smbolo, populando a tabela de codificao.

REVISTA DO DETUA, VOL. 1, N 6, SETEMBRO 1996

A exportao da rvore de Huffman consiste na invocao de uma funo recursiva, reinvocando-se para exportar cada um dos ramos at s folhas, e verificando o formato que foi previamente especificado (fig. 3). Por ltimo, realizada a traduo dos smbolos do ficheiro original para a codificao definida, atravs de uma segunda leitura. O diagrama de actividades que consta da fig. 5 descreve os passos envolvidos neste processo. Cada smbolo lido comparado com o anterior para verificar se se trata da mesma sequncia de repetio. Em caso afirmativo, o NOC incrementado e passa-se ao smbolo seguinte. Ao detectar-se uma nova sequncia, so exportados a codificao do smbolo anterior e o NOC obtido, sendo ambos actualizados para a sequncia seguinte.
Fim

Fim

[Sim]

Incio

Fim do ficheiro?

[No]

Ler Cdigo

Envolve NOC?
[Sim] [No]

[No]

NOC positivo?

[Sim]

Ler NOC

NOC = 1

Decrementar NOC

Escrever Smbolo associado ao Cdigo

Fig. 6 - Diagrama de actividades do processo de traduo na descompresso


Smbolo actual igual ao anterior?
[Sim]

[Sim] Incio

Fim do ficheiro?

[No]

Ler Smbolo

IV. IMPLEMENTAO DE DESCOMPRESSO EM HARDWARE


[No]

Limpar NOC para o Smbolo actual

[No]

Incrementar NOC do Smbolo actual

Fim do ficheiro? Exportar NOC do Smbolo anterior


[Sim]

Exportar Codificao do Smbolo anterior

Fig. 5 - Diagrama de actividades do processo de traduo na compresso

B. Descompressor O processo de descompresso constitudo pela importao da rvore de Huffman e pela traduo dos cdigos nos smbolos do ficheiro original. A importao da rvore de Huffman consiste em interpretar a sequncia binria que precede os dados comprimidos, no ficheiro. Para tal, usada uma funo recursiva, que se reinvoca para a importao de cada um dos ramos, at s folhas, tendo em conta o formato especificado para o efeito (rever fig. 3). A tabela de codificao, obtida com a interpretao da rvore de Huffman, utilizada na reconstituio dos smbolos originais. Este processo, ilustrado na fig. 6, inicia-se com a leitura de um cdigo que corresponde a um smbolo. Se esse smbolo envolver NOC, lido o seu valor do ficheiro comprimido; caso contrrio, assume-se que unitrio. Por ltimo, o smbolo em causa repetido no ficheiro de sada o nmero de vezes indicado pelo valor de NOC. O ciclo repete-se at que o ficheiro comprimido termine.

Esta etapa consiste na implementao do algoritmo de descompresso apresentado anteriormente para a placa RC200, a qual possui a FPGA Virtex II XC2V1000-4. Para isso, desenvolveu-se um algoritmo em Handel-C [3] que realiza uma descompresso idntica que foi feita em C++. Porm, os algoritmos criados numa e noutra linguagem revelam diferenas significativas. Estas diferenas assentam no facto de se passar de um paradigma orientado aos objectos para um paradigma funcional e de especificao de hardware. A possibilidade de execuo de operaes em paralelo permitiu optimizar o processo de descompresso, aumentando a velocidade de execuo. No entanto, a diferena mais significativa entre as duas implementaes proveio da utilizao do modelo RHFSM (Recursive Hierarquichal Finite State Machine) [11]. Com este modelo, ultrapassou-se a ausncia de mecanismos de suporte recursividade das linguagens de especificao de hardware. O captulo V aborda a implementao deste modelo. O funcionamento global do circuito descompressor est ilustrado na fig. 7. O cabealho do ficheiro comprimido (fig. 7-a) lido atravs do Gestor de Leitura, para o parser que interpreta a rvore de Huffman e reconstri a Tabela de Codificao (figs. 7-a, 7-c, 7-d e 7-e). A segunda fase da descompresso consiste em ler os dados comprimidos atravs do Gestor de Leitura e traduzi-los nos caracteres originais, recorrendo Tabela de Codificao (figs. 7-b, 7c e 7-f). Os caracteres obtidos so escritos, reconstituindo o ficheiro original, atravs do Gestor de Escrita (figs. 7-h e 7-g). V. IMPLEMENTAO DO MODELO RHFSM Tal como referido anteriormente, a linguagem Handel-C no disponibiliza mecanismos que suportem recursividade. Assim, o parser do descompressor

REVISTA DO DETUA, VOL. 1, N 6, SETEMBRO 1996

a)

Ficheiro Comprimido

b)

c)

Gestor de Leitura do Ficheiro Comprimido

d)
Parser da rvore de Huffman

e)
Tabela de Codificao

f)
Tradutor Cdigo/Caracter

mquina de estados finitos hierrquica. Como foi referido, a finalidade do parser interpretar a rvore de Huffman que se encontra no incio do ficheiro, armazenada de acordo com o definido em cdigo BNF (fig. 3). Para uma anlise pormenorizada da implementao do parser, o cdigo Handel-C respectivo est disponvel no site da WebCT [12]. No entanto, oportuno abordar uma perspectiva global do seu funcionamento. Na fig. 8 descrito o fluxo do parser, atravs dos estados e transies que compem o mdulo implementado. O processo iniciado, invocando este mdulo (fig. 8).
Mdulo z0 a0

g)
Ficheiro Descomprimido

Gestor de Escrita no Ficheiro Descomprimido

Begin

h)

a2 x1
[0]

z0

Fig. 7 Circuito descompressor em Handel-C


[1]

a3 a1 z0

desenvolvido em Handel-C foi implementado, recorrendo a um mtodo baseado no modelo RHFSM [11]. A. Biblioteca de suporte ao modelo RHFSM O modelo RHFSM baseia-se na concepo dos mdulos recursivos do algoritmo na forma de mquinas de estados finitos, nas quais se atribui a execuo de um subconjunto atmico de instrues a cada estado. A sua utilizao implica a fuso do cdigo til com as funes que gerem os dados de suporte s transies. Para permitir alguma abstraco no que diz respeito a esta gesto, foi criada uma biblioteca simples e reutilizvel, denominada RHFSM, que inclui sete primitivas em Handel-C de suporte s transies entre estados e mdulos: - RHFSM_init( ), que inicia os dados internos para se estar apto a usar a RHFSM; - RHFSM_go_to( next_state ), que permite transitar para o estado next_state do mdulo activo; - RHFSM_jump_to( next_module, next_state ), que permite transitar para o estado next_state do mdulo next_module; - RHFSM_end_module( ), que permite a sada do mdulo activo, regressando ao mdulo anterior ou terminando a RHFSM; - RHFSM_state( ), que devolve o estado activo; - RHFSM_module( ), que devolve o mdulo activo; - RHFSM_done( ), que indica se a RHFSM terminou. B. Concepo da RHFSM do parser Estando o suporte recursividade definido, o passo seguinte consistiu em modelar o parser na forma de uma

a4

a5 End

Fig. 8 - Mdulo da RHFSM do parser

No estado a0, lido um n do ficheiro comprimido. Na condio x1, verificado se o n uma folha ou um ramo. No caso de ser folha, transita-se para o estado a1, no qual se extrai o nmero de bits para o NOC e o smbolo que foram armazenados na folha. Seguidamente, transita-se para o estado terminal a5, aps o qual, se retorna ao nvel hierrquico superior. Se na condio x1, por outro lado, se verificar que o n lido representa um ramo, transita-se para o estado a2. Neste estado, reinvocado o mdulo z0, descendo-se de nvel hierrquico, para realizar o parsing do ramo esquerdo do n. Aps regressar desta sub-tarefa, retoma-se o nvel hierrquico anterior e transita-se para o estado a3. Neste estado, repete-se a invocao do mdulo z0, para realizar o parsing do ramo direito. Ao concluir-se a importao do segundo ramo deste n, regressa-se ao estado a4, realizando algumas operaes auxiliares, e transita-se para o estado terminal a5.

REVISTA DO DETUA, VOL. 1, N 6, SETEMBRO 1996

10

CONCLUSES O recurso a co-processadores baseados em FPGAs constitui uma alternativa relevante na reduo do tempo de execuo de tarefas computacionalmente intensivas. Quando o volume de dados envolvido nestas tarefas grande, importante que a comunicao entre o computador anfitrio e o co-processador no atrase o processo. Neste contexto, a compresso de dados surge como uma forma de optimizar a largura de banda do canal de transmisso. Foi desenvolvida em C++ uma aplicao de compresso com vista a correr no computador de uso geral anfitrio. Para testar esta aplicao, foi implementado tambm um descompressor, utilizando a mesma linguagem. Como co-processador a utilizar no mbito do projecto, foi adoptada a placa RC200, que integra a FPGA Virtex II XC2V1000-4. O Handel-C foi a linguagem utilizada para especificar o circuito descompressor a ser utilizado por este co-processador. Escolheu-se a verso adaptativa do algoritmo de compresso e descompresso de Huffman, por apresentar factores de compresso elevados e simplicidade e ainda porque a sua implementao em hardware no implica demasiados recursos. Integrou-se um mecanismo adicional que consiste em substituir repeties consecutivas de sequncias de bits por um nico identificador de sequncia e um indicador do nmero de repeties, resultando em factores de compresso superiores. O processo de compresso completo inclui a anlise dos dados a comprimir, a gerao da codificao a utilizar, a exportao desta codificao para o ficheiro comprimido e a traduo efectiva dos dados para o mesmo destino. A descompresso consiste em importar a codificao e em reconstituir os dados originais, atravs de uma traduo inversa realizada na compresso. Foi especificado em BNF o formato de armazenamento da rvore de Huffman, da qual se extrai a codificao utilizada. Esta especificao foi tida em conta na implementao das aplicaes de software - compressor e descompressor - e do circuito descompressor para a placa RC200, assegurando, deste modo, a compatibilidade entre estes componentes. Qualquer das implementaes compreende operaes que envolvem rvores binrias, pelo que foram concebidas com cariz recursivo. Por no haver linguagens de especificao de hardware com mecanismos de suporte recursividade, foi adoptado o modelo RHFSM na implementao do circuito de parsing que extrai a rvore de Huffman do ficheiro comprimido. Criou-se um conjunto de primitivas para manipular os dados que suportam as transies de estado das RHFSMs obtidas. Trata-se de uma biblioteca reutilizvel que oferece um nvel de abstraco mais elevado. Futuramente, para colmatar o objectivo da implementao do modelo de co-processsamento adoptado, ser desenvolvido um circuito para a resoluo

de problemas combinatrios, a correr na placa RC200, e um mecanismo de transferncia atravs da porta paralela. REFERNCIAS
[1] RC200 Hardware and Instalation Manual, Celoxica, 2003. [2] RC200 Platform Support Library Reference Manual, Celoxica, 2003. [3] Handel-C Language Reference Manual, Celoxica, 2002. [4] M. Fowler, K. Scott, UML Distilled: A Brief Guide to the Standard Object Modeling Language, 2nd Edition, Addison Wesley, pp. 129139. [5] Data compression information [Online, em Janeiro de 2003]: http://datacompression.info. [6] Archive compression tests, [Online, http://compression.ca/. em Janeiro de 2004]:

[7] Lossless Data Compression, [Online, em Janeiro de 2003]: http://www.data-compression.com/lossless.html#huff. [8] Brian W. Kernighan, Dennis M. Ritchie, The C Programming Language, Prentice Hall, 1988. [9] V. Sklyarov, FPGA-based Implementation of Recursive

Algorithms, Elsevier Journal Microprocessors and Microsystems, Abril, 2004. [10]. BNF Notation, [Online, em Janeiro de 2003]:

http://cui.unige.ch/dbresearch/Enseignement/analyseinfo/AboutBNF.html. [11] V. Sklyarov, Hierarchical Finite-State Machines and Their Use for Digital Control, IEEE Transactions on VLSI Systems, 1999, Vol. 7, No 2, pp. 222-228. [12] Web Course Tools para a disciplina de Computao Reconfigurvel leccionada na Universidade de Aveiro, [Online]: http://webct.ua.pt.

AGRADECIMENTO Os autores agradecem ao Prof. Valery Sklyarov pela orientao na realizao deste trabalho.