Professional Documents
Culture Documents
1. Introduca o
O crescente desempenho dos processadores de computadores modernos deve-se ao uso de
numero cada vez maior de cores, unidades de processamento vetorial e GPUs. Desenvolver programas que explorem os recursos de processamento paralelo dessas arquiteturas
de modo a obter maior desempenho e uma tarefa bastante complexa. Nesse artigo exploraremos o uso da GPU para acelerar o processo de compressao de arquivos de texto
utilizando a codificaca o de Huffman.
A codificaca o de Huffman e um metodo de compressao que usa as probabilidades de ocorrencia dos smbolos no conjunto de dados a ser comprimido para determinar
codigos de tamanho variavel para cada smbolo. Ele foi desenvolvido em 1952 por David
A. Huffman que era, na e poca, estudante de doutorado no MIT, e foi publicado no artigo
A Method for the Construction of Minimum-Redundancy Codes.
2. A codificaca o
ASCII (American Standard Code for Information Interchange) e um padrao de
codificaca o de caracteres usado por muitas linguagens de programaca o. Neste padrao,
cada caracter e codificado com o mesmo numero de bits por caracter (e.x., 8 bits).
Desta maneira, ha 256 possveis combinaco es para representar os caracteres em ASCII
[Costa 2009]. A codificaca o de Huffman compacta os dados usando um numero menor
de bits para codificar caracteres que ocorrem mais frequentemente de maneira que nem
todos os caracteres precisem ser codificados com 8 bits. Considerando a cadeia de caracteres papaie usando a codificaca o ASCII (8 bits por caracter), esses 5 caracteres seriam
escritos no arquivo utilizando 40 bits (5 x 8 bits). Utilizando a codificaca o de Huffman
os mesmos 5 caracteres seriam escritos utilizando apenas 8 bits (Desconsiderando outros
bits de controle do algoritmo), ou seja para esses exemplo o arquivo teria seu tamanho
reduzido 5 vezes, essa codificaca o sera explicada mais a frente.
A codificaca o de Huffman pode ser subdividida em:
Histograma;
Construca o da Arvore
de Huffman;
Construca o da Tabela de Codigo Variavel;
2.1. Histograma
Para construca o do Histograma e necessario a contagem da quantidade dos caracteres
do arquivo original. O algoritmo sequencial para a contagem de frequencia e relativamente simples, cada caracter e contabilizado e armazenado em um vetor de 256 posico es
(quantidade de caracteres da Tabela ASCII), basta entao percorrer o arquivo e a cada
caracter encontrado e necessario acrescentar +1 na posica o correspondente do vetor de
frequencias. Ao final da execuca o do algoritmo teremos um vetor com as frequencias de
cada caracter, o Histograma.
Figura 2. Arvore
de Huffman
da tabela de codigo
Figura 3. pseudo-codigo
da construcao
variavel
3. Paralelismo
Entendido o funcionamento do algoritmo de codificaca o de Huffman passamos agora para
parte na qual tentaremos otimiza-lo utilizando paralelismo com GPU usando a arquitetura
CUDA. Nesse artigo paralelizamos uma parte do algoritmo, a construca o do histograma.
Embora simples de descrever e compreender, histogramas de dados, aparece em
muitos problemas da computaca o. Alem da compressao de dados ele e usado em algo-
do histograma em CPU
Figura 4. Construcao
do histograma em CUDA
Figura 5. Primeira implementacao
do histograma em CUDA
Figura 6. Segunda implementacao
Depois de zerar o histograma, o proximo passo e muito similar ao nosso histograma GPU original. As u nicas diferencas aqui sao que usamos a buffer temporario de
memoria compartilhada em vez de um buffer de memoria global e que precisamos de
uma chamada subsequente para syncthreads() para garantir a u ltima das nossas gravaco es
foram cometidos.
Fase 2
O u ltimo passo no nosso exemplo histograma com memoria compartilhada requer
a fusao dos histogramas temporarios de cada bloco com o histograma da memoria global.
Ao utilizar a memoria compartilhada notamos uma grande melhora no desempenho em relaca o ao tempo de execuca o tanto para implementaca o sequencial tanto para as
outras implementaco es utilizando a GPU.
4. Resultados Obtidos
Os testes foram realizados em uma maquina com placa grafica Nvidia Tesla K40c, velocidade de clock do processador de 3.0 GHz e memoria 12GB. As configuraco es da CPU:
processador i5-4590, velocidade clock 3.3GHz , 4 nucleos e 8GB de memoria RAM.
Foram feitos 3 testes e seguem abaixo em tabela:
5. Conclusao
O resultados obtidos em nossa implementaca o foram mais do que satisfatorios, para um
arquivo com tamanho 2,6MB a implementaca o utilizando GPU conseguiu obter um tempo
de execuca o de 0,007639 s enquanto a implementaca o de CPU obteve 0.205299 s, ou seja,
o codigo de GPU mostrou um speedup de 26,87x sobre o de CPU.
Referencias
Costa, P. D. (2009).
A codificaca o de Huffman.
Disponvel
em:
http://www.inf.ufes.br/
pdcosta/ensino/2009-1-estruturas-dedados/material/CodificacaoHuffman.pdf.
Gupta, N. (2016). Computing Histogram on CUDA. Disponvel em: http://cudaprogramming.blogspot.com.br/2013/03/computing-histogram-on-cuda-cudacode8 .html.
SuperComputingBlog (2009).
Atomic Operations.
Disponvel
http://supercomputingblog.com/cuda/cuda-tutorial-4-atomic-operations/.
em: