COMPUTAÇÃO PARALELA COM ARQUITETURA DE PROCESSAMENTO GRÁFICO CUDA APLICADA A UM CODIFICADOR DE VÍDEO H.264

Tamanho: px
Começar a partir da página:

Download "COMPUTAÇÃO PARALELA COM ARQUITETURA DE PROCESSAMENTO GRÁFICO CUDA APLICADA A UM CODIFICADOR DE VÍDEO H.264"

Transcrição

1 CENTRO UNIVERSITÁRIO UNIVATES CENTRO DE CIÊNCIAS EXATAS E TECNOLÓGICAS CURSO DE ENGENHARIA DE CONTROLE E AUTOMAÇÃO AUGUSTO LIMBERGER LENZ COMPUTAÇÃO PARALELA COM ARQUITETURA DE PROCESSAMENTO GRÁFICO CUDA APLICADA A UM CODIFICADOR DE VÍDEO H.64 Lajeado 0

2 AUGUSTO LIMBERGER LENZ COMPUTAÇÃO PARALELA COM ARQUITETURA DE PROCESSAMENTO GRÁFICO CUDA APLICADA A UM CODIFICADOR DE VÍDEO H.64 Trabalho de Conclusão de Curso apresentado ao Centro de Ciências Exatas e Tecnológicas do Centro Universitário UNIVATES, como parte dos requisitos para a obtenção do título de bacharel em Engenharia de Controle e Automação. Área de concentração: Computação paralela ORIENTADOR: Ronaldo Hüsemann Lajeado 0

3 AUGUSTO LIMBERGER LENZ COMPUTAÇÃO PARALELA COM ARQUITETURA DE PROCESSAMENTO GRÁFICO CUDA APLICADA A UM CODIFICADOR DE VÍDEO H.64 Este trabalho foi julgado adequado para a obtenção do título de bacharel em Engenharia de Controle e Automação do CETEC e aprovado em sua forma final pelo Orientador e pela Banca Examinadora. Orientador: Prof. Ronaldo Hüsemann, UNIVATES Doutor pelo PPGEE/UFRGS Porto Alegre, Brasil Banca Examinadora: Prof. Marcelo de Gomensoro Malheiros, UNIVATES Mestre pela FEEC/UNICAMP Campinas, Brasil Prof. Maglan Cristiano Diemer, UNIVATES Mestre pelo PPGCA/UNISINOS São Leopoldo, Brasil Coordenador do curso de Engenharia de Controle e Automação Prof. Rodrigo Wolff Porto Lajeado, Junho de 0.

4 Dedico este trabalho ao meu pai, Edu, e a minha mãe, Ivone, por acreditarem na importância da educação.

5 AGRADECIMENTOS À minha família, pelo apoio, incentivo e compreensão nos momentos difíceis, no transcorrer da realização desse trabalho e demais atividades da graduação. Ao professor Ronaldo Hüsemann, pela sua orientação, pelas oportunidades de trabalhar em projetos de pesquisa e pela amizade cultivada ao longo desse período. Aos colegas do Laboratório de Engenharia Aplicada: Anderson Giacomolli, Diego Schwingel e Marco Gobbi pelas contribuições no desenvolvimento desse trabalho. Aos colegas de curso, pela amizade e companhia durante o decorrer desta jornada. À Luisa por todo o amor, carinho e compreensão.

6 RESUMO Este trabalho investiga a utilização de processadores gráficos (GPUs) como coprocessadores em arquiteturas de computadores no contexto da codificação de vídeo. O objetivo específico é implementar módulos do codificador H.64 em tecnologia CUDA, presente nas placas de vídeo da empresa NVIDIA. Dessa forma, algoritmos paralelizáveis são executados na GPU de forma a acelerar a codificação e aliviar a carga da CPU principal. O primeiro estudo de caso foi a implementação do módulo computacional, situado no codificador intraquadro, que foi integrado ao software de referência para validação e testes. Os resultados obtidos apontam um ganho de cerca de 3,9 vezes no tempo de execução deste módulo para vídeos de alta definição. No segundo estudo de caso foi abordado o codificador interquadros através da estimação de movimento. Um algoritmo de busca adequado à arquitetura paralela em questão foi proposto e implementado, além da implementação do cálculo de SAD. Os resultados obtidos na estimação de movimento apontam para um aumento na velocidade de execução em torno de 5,7 vezes para vídeos de alta definição. Palavras-chaves: Codificação de Vídeo, Computação Paralela, GPGPU, CUDA.

7 ABSTRACT This work investigates the use of graphical processing units (GPUs) as co-processors for computer architectures in the context of video encoding. The specific goal is to implement modules of the H.64 encoder in CUDA, present in NVIDIA video cards. Thus, parallelizable algorithms have been implemented on the GPU to accelerate the encoding and reduce the load of the main CPU. The first case study was the implementation of computational module, situated in the intra-frame encoder, that was integrated into the reference software for validation and testing. The results show a speedup of 3.9 times in the execution of computational module for high-definition video. In the second case study, the inter-frame encoder was approached through motion estimation. A search algorithm suitable for parallel architecture was proposed and implemented, in addition to the SAD calculation. The results show a speedup of 5.7 times in the execution for high-definition videos. Keywords: Video Coding, Parallel Computing, GPGPU, CUDA.

8 SUMÁRIO INTRODUÇÃO...5 UNIDADE DE PROCESSAMENTO GRÁFICO...9. Histórico das GPUs Primeira geração Segunda geração Terceira Geração Quarta geração Quinta geração.... Pipeline gráfico tradicional....3 Processamento de propósito geral em GPU Visão Geral da CUDA Arquitetura de hardware Modelo de programação Função Kernel Hierarquia de threads Hierarquia de memória Detalhamento dos espaços de memória Registradores e memória local Memória compartilhada Memória global Memória de textura e superfície Memória de constantes CODIFICAÇÃO DE VÍDEO Vídeo digital Compressão de vídeo Introdução ao H Descrição do codec H Predição intraquadro Transformadas diretas e inversas Transformada discreta de cossenos Transformada de Hadamard Quantização Estimativa de movimento Algoritmos de busca Critérios de similaridade Compensação de movimento Trabalhos relacionados DESCRIÇÃO DO SISTEMA DESENVOLVIDO Codificação intraquadro Algoritmos de computação intra Implementação da DCT direta e inversa Implementação da Transformada de Hadamard Implementação da Quantização...60

9 4.3 Codificação interquadros Algorítimo de busca proposto Implementação da estimação de movimento RESULTADOS PRÁTICOS Integração com o software de referência Avaliação dos resultados no módulo computacional intra Avaliação do algoritmo de busca proposto Avaliação dos resultados da estimativa de movimento em GPU GPU profiling CONCLUSÃO...77

10 LISTA DE FIGURAS Figura Shader tradicional x shader unificado, adaptado de (IKEDA, 0)...4 Figura Escalabilidade da arquitetura CUDA, adaptada de (NVIDIA, 0a)...5 Figura 3 Cenários comuns de branch divergence, adaptada de (HAN; ABDELRAHMAN, 0)...6 Figura 4 Organização das threads, adaptada de (NVIDIA, 0a)...9 Figura 5 Fluxo típico de uma aplicação CUDA...30 Figura 6 Padrões de acesso coalescido (CONRAD, 00)...3 Figura 7 Acesso não coalescido (CONRAD, 00)...33 Figura 8 Estrutura do codificador H.64 (REDIESS, 006)...38 Figura 9 Modos de predição para blocos 6x6 de luminância. (AGOSTINI, 007)...39 Figura 0 Modos de predição para blocos 4x4 de luminância (AGOSTINI, 007)...40 Figura Bloco de entrada (a) e resultado da DCT (b) (RICHARDSON, 003)...4 Figura Macroblocos de crominância e luminância com componentes DC destacados (MAJOLO, 00)...44 Figura 3 Quadros consecutivos de vídeo (RICHARDSON, 003)...49 Figura 4 Na esquerda, o resíduo sem estimativa de movimento. Na direita, o resíduo com estimativa de movimento (RICHARDSON, 003)...49 Figura 5 Predição interquadro (DINIZ, 009)...50 Figura 6 Algoritmo de busca completa (PORTO, 0)...5 Figura 7 Large Diamond Search (LDS) e Small Diamond Search (SDS) (PORTO, 008)...5 Figura 8 Algoritmo de busca logarítmica (RICHARDSON, 00)...5 Figura 9 Processo de codificação intraquadro, adaptada de (DINIZ, 009)...57 Figura 0 Etapas do módulo computacional...58 Figura Arquitetura proposta para módulo computacional usando GPUs NVIDIA (HUSEMANN et al., 0b) Figura Relacionamento das threads com os componentes DC...60 Figura 3 Padrão de busca do algoritmo proposto...6 Figura 4 Procedimento de redução usado no cálculo de SAD, adaptado de (NVIDIA, 0)...64 Figura 5 Distribuição do tempo entre as etapas...76

11 LISTA DE CÓDIGOS Listagem Declaração e chamada de um kernel...8 Listagem Protótipo da função intrínseca usad...63 Listagem 3 Primeira etapa da redução...64

12 LISTA DE TABELAS Tabela Evolução da distribuição dos estágios entre CPU e GPU...3 Tabela Características dos espaços de memória na arquitetura CUDA séries G80 e G Tabela 3 Passos de quantização...46 Tabela 4 Valores de PF para cada posição...47 Tabela 5 Fator de multiplicação...47 Tabela 6 Complexidade dos módulos do codificador H Tabela 7 Principais características das duas placas utilizadas...66 Tabela 8 Comparação dos tempos de processamento para vídeos 4CIF...68 Tabela 9 Comparação dos tempos de processamento vídeo HD...68 Tabela 0 Avaliação do algoritmo de busca proposto para 3 Mbps...70 Tabela Avaliação do algoritmo de busca proposto para 4 Mbps...70 Tabela Avaliação do algoritmo de busca proposto para 5 Mbps...7 Tabela 3 Comparação dos desempenho em QCIF...7 Tabela 4 Comparação dos desempenho em CIF...73 Tabela 5 Comparação dos desempenho em 4CIF...73 Tabela 6 Comparação dos desempenho em 70p...74 Tabela 7 Comparação dos desempenho em 080p...75

13 LISTA DE ABREVIATURAS AMD Advanced Micro Devices ANSI American National Standards Institute API Application Programming Interface AVC Advanced Video Coding CAD Computer Aided Design CIF Common Intermediate Format CPU Central Unit Processing CUDA Compute Unified Device Architecture DC Direct Current DCT Discrete Cosine Transform DSP Digital Signal Processor DVD Digital Versatile Disc FS Full Search GLSL OpenGL Shading Language GPU Graphics Processing Unit GPGPU General Purpose GPU HD High Definition HLSL High Level Shader Language IBM International Business Machines IEC International Electro-technical Commission ISO International Organization for Standardization ITU-T International Telecommunication Union Telecommunication Standardization Sector JSVM Joint Scalable Video Model JVT Joint Video Team LDS Large Diamond Search LS Logarithmic Search MAE Mean Square Error MSE Mean Square Error

14 MC Compensação de movimento ME Estimativa de movimento MF Multiplication Factor MPEG Motion Picture Experts Group PC Personal Computer PCIe Peripheral Component Interconnect Express PF Post-Scaling Factor PGC Professional Graphics Controller QP Quantization Parameter RAM Random Access Memory RGB Red Green Blue SAD Sum of Absolute Differences SD Standard Definition SDS Small Diamond Search SGI Silicon Graphics International SIMD Single Instruction, Multiple Data SIMT Single-Instruction, Multiple-Thread SLI Scalable Link Interface SM Streaming Multiprocessor SP Scalar Processors SSE Streaming SIMD Extensions SVC Scalable Video Coding VRAM Video Random Access Memory

15 5 INTRODUÇÃO A capacidade de armazenar e transportar vídeo em formato digital tornou as aplicações que fazem uso desta tecnologia parte do cotidiano das pessoas. Atualmente, o vídeo digital está presente em televisores, Digital Versatile Discs (DVDs), videoconferência e sistemas de telemedicina (FUJITSU, 00). A codificação de vídeo é a técnica essencial que possibilita a utilização de vídeos de forma eficiente. Essa técnica permite a transformação do sinal de vídeo em uma representação comprimida, onde são eliminadas redundâncias, e, com isso reduzir a largura de banda necessária para transportar o vídeo ou o espaço em disco necessário para armazená-lo. O processo de decodificação recupera o sinal de vídeo original ou uma aproximação deste, de forma que possa ser visualizado em sua forma original (RICHARDSON, 003). A necessidade por técnicas de compressão de vídeo pode ser ilustrada pelo seguinte cenário. Considerando-se, por exemplo, um vídeo com standard definition (SD), que possui 70 x 480 pixeis, e utilizando o sistema de três cores primárias red green blue (RGB), com 8 bits de representação para cada cor e 30 quadros por segundo, seriam necessários aproximadamente 30 MB para armazenar apenas um segundo de vídeo. Dada esta necessidade, surgiram diversas formas de realizar a codificação. Pode-se dizer que a base das técnicas empregadas na maioria dos codificadores atuais foi estabelecida na norma H.6 da International Telecommunication Union Telecommunication Standardization Sector (ITU-T) definida em 989, da qual pode-se destacar como algoritmos principais a estimativa de movimento, transformada discreta de cosseno (DCT), quantização linear e codificação de entropia (GHANBARI, 003). Posteriormente, foi desenvolvido o padrão MPEG- pelo Motion Picture Experts Group (MPEG) e também adotado pela ITU-T, como uma norma conjunta das duas entidades e passando a ser chamado H.6/MPEG-, que tornou-se extremamente popular. O MPEG- foi empregado, por exemplo, nos DVDs e em diversos sistemas de televisão digital (MAJOLO, 00). Este padrão continuou popular ao longo dos anos, sendo largamente empregado ainda nos dias de hoje. A criação de técnicas inovadoras, como a codificação de cenas sintéticas e naturais em um modelo de codificação baseado em objetos independentes e a possibilidade de codificação realizada sobre objetos não necessariamente retangulares, resultou no padrão MPEG-4 (RICHARDSON, 003).

16 6 As entidades MPEG e ITU-T uniram novamente esforços para desenvolver um novo padrão de codificação. Este grupo de trabalho é conhecido como Joint Video Team (JVT). Como resultado surgiu o padrão chamado de Advanced Video Coding (AVC), publicado como a recomendação H.64 da ITU-T e como a parte dez do MPEG-4 (AGOSTINI, 007). A elaboração do codec H.64 foi feita com o aumento da eficiência da compressão sendo o principal objetivo, resultando em aumentos significativos nas taxas de compressão. No entanto, esta evolução levou inevitavelmente ao aumento dos requisitos de processamento para os dispositivos codificadores e decodificadores (RICHARDSON, 003). Os algoritmos empregados para codificação de vídeo requerem computação intensa, tornando necessárias técnicas computacionais sofisticadas e o uso de arquiteturas dedicadas que tornem possível a execução destes algoritmos em tempo real. Dentre as soluções que vêm sendo adotadas pode-se destacar a utilização de arquiteturas do tipo Single Instruction, Multiple Data (SIMD), Digital Signal Processor (DSP) e o desenvolvimento de coprocessadores dedicados em hardware (GREENE; TULJAPURKAR, 007). Uma alternativa recentemente explorada para aumento de desempenho de algoritmos é a utilização de unidades de processamento gráfico, ou Graphics Processing Unit (GPU), como plataformas para processamento de propósito geral. Este conceito, que é conhecido como General Purpose GPU (GPGPU), torna possível explorar o poder de processamento das placas aceleradoras de vídeo em aplicações que não necessariamente façam uso de recursos gráficos (CHEUNG et al., 00). As GPUs possuem uma arquitetura altamente paralela, capaz de executar a mesma operação em um grande número de elementos ao mesmo tempo. Esta forma de organização é apropriada ao seu objetivo original - processamento de gráficos em três dimensões (3D), mas também pode ser empregada na implementação de algoritmos úteis em diversos outros campos (IKEDA, 0). Nos últimos anos, foram criadas tecnologias para adequar a GPU ao processamento de propósito geral e facilitar o desenvolvimento de programas que possam fazer uso deste recurso. Um exemplo notável é a arquitetura de computação paralela da NVIDIA denominada Compute Unified Device Architecture (CUDA) (NVIDIA, 0d). Outros exemplos são: Advanced Micro Devices (AMD) Stream (AMD, 0), o framework OpenCL (KHRONOS, 0) e a application programming interface (API) Microsoft Direct Compute (MICROSOFT, 009). Acredita-se que a utilização de placas de vídeo como ferramenta de auxílio na tarefa de codificação de vídeo seja de grande interesse, dada a variedade de aplicações com vídeo

17 7 digital e a grande disseminação destes dispositivos em computadores pessoais. Portanto, este trabalho se propõe a investigar a utilização de GPUs, presentes nas placas de vídeo compatíveis com a tecnologia NVIDIA CUDA, como coprocessadores da Central Unit Processing (CPU) no contexto da codificação de vídeo. Mais especificamente, o objetivo é implementar módulos do codificador H.64 que possuam algoritmos paralelizáveis na GPU, de forma a acelerar a codificação e aliviar a carga da CPU principal. Desta forma, foi explorada a implementação de referência do codificador H.64 de forma a identificar pontos onde a utilização da arquitetura CUDA seja vantajosa. A partir dessa análise e da revisão da literatura, foram definidos dois módulos do codificador a serem trabalhados como estudos de caso: módulo computacional e módulo de estimação de movimento. O primeiro estudo de caso aborda o codificador intraquadros através da implementação dos algoritmos do módulo computacional: transformada discreta de cossenos direta e inversa, transformada de Hadamard direta e inversa, quantização e quantização inversa. Já o segundo estudo de caso aborda a codificação interquadros através da implementação de algoritmos da estimação de movimento: algoritmo de busca e cálculo de similaridade. Para tornar possível a validação e a avaliação dos módulos desenvolvidos foi realizada a integração com o codificador de referência do padrão H.64. Dessa forma, o software de referência serviu como base de comparação em termos do desempenho alcançado e a validação dos resultados será obtida através da comparação dos vídeos comprimidos gerados pelo software original com os vídeos obtidos pela versão paralela. A fim de embasar o desenvolvimento deste trabalho foram pesquisados trabalhos relacionados. Sprandlin et al. (009) por exemplo analisou a viabilidade de implementar um codificador MPEG- na arquitetura CUDA. Chan et al. (009), Cheung et al. (00) e Huang, Shen e Wu (009) por sua vez exploraram diferentes abordagens para acelerar a execução dos algoritmos de estimativa de movimento também utilizando CUDA. Monteiro et al. (0) realizaram a implementação do algoritmo de busca completa em CUDA, obtendo ganhos de velocidade de 600 vezes. Os trabalhos estudados apontam que a utilização da tecnologia CUDA pode trazer avanços à área de codificação de vídeo, de forma a tornar viável a execução em tempo real de complexas técnicas de codificação em vídeos de alta resolução. O texto desta monografia foi organizado da seguinte forma. O capítulo apresenta uma revisão de literatura acerca da evolução da arquitetura das GPUs que culminou no conceito de GPGPU. O capítulo 3 define os conceitos relacionados à codificação de vídeo, as

18 8 características básicas do padrão H.64 e uma descrição dos trabalhos relacionados estudados. O capítulo 4 formaliza a proposta de trabalho que guiou a execução das atividades. O capítulo 5 apresenta os estudos de caso realizados. Por fim, o capítulo 6 apresenta as conclusões obtidas e aponta possíveis trabalhos futuros.

19 9 UNIDADE DE PROCESSAMENTO GRÁFICO A Unidade de Processamento Gráfico é um processador dedicado à aceleração de aplicações gráficas. A arquitetura das GPUs difere substancialmente das tradicionais CPUs, pois direcionam-se a necessidades específicas, como processamento de dados 3D com ponto flutuante. Sua organização interna torna possível uma intensidade aritmética muito maior, através da execução de diversas operações iguais em dados independentes (OWNEW et al., 005). Essas características surgiram da necessidade de processar um grande número de pixeis para gerar uma imagem a ser exibida. Como cada pixel é independente dos demais é possível calcular os valores de vários pixeis simultaneamente. Esta arquitetura paralela possibilita portanto a execução de um grande número de operações por unidade de tempo.. Histórico das GPUs A ideia de se utilizar processadores especificamente para as tarefas relacionadas a vídeo remonta ao ano de 984 quando a International Business Machines (IBM) lançou a primeira placa de vídeo com microprocessador próprio (Intel 8088) de forma a amenizar a carga da CPU principal. Nesta época, o processador era empregado apenas para gerar os sinais de vídeo, a fim de possibilitar melhores taxas de atualização da tela. Essa solução, conhecida como Professional Graphics Controller (PGC), era destinada a custosos sistemas de Computer Aided Design (CAD) e não se disseminou para o mercado de massa (DUKE; WALL, 985). Em 986, a Texas Instruments lançou o processador TMS3400. Este chip, além de possuir uma memória dedicada para vídeo, chamada de Video Random Access Memory (VRAM) e suporte a display, foi um dos primeiros a apresentar um conjunto de instruções voltado ao processamento gráfico (GUTTAG et al., 988). Entretanto, no final dos anos 80 surgiram as primeiras placas de vídeo compatíveis com a arquitetura IBM-PC (Personal Computer), que possuíam implementações em hardware das primitivas gráficas de duas dimensões (D) e, por isso, tornaram-se conhecidas como placas aceleradoras D (CROW, 004). No início dos anos 90, a Silicon Graphics International (SGI), que era líder no mercado de gráficos 3D, criou a API OpenGL, que posteriormente tornou-se um padrão mantido por diversas entidades. O surgimento da OpenGL trouxe uma forma uniforme de acesso às diferentes placas gráficas e deixou aos fabricantes a responsabilidade de

20 0 desenvolver device drivers para os seus produtos. Posteriormente, a empresa Microsoft lançou o conjunto de APIs DirectX, que inclui a API Direct3D que tornou-se grande competidora da OpenGL. A possibilidade de escrever software utilizando uma API de alto nível compatível com uma grande diversidade de placas de vídeo teve um forte impacto no mercado para aplicativos gráficos (CROW, 004). No início da década de 90 começavam a se tornar comuns aplicativos com gráficos 3D que faziam uso do poder de processamento da CPU, criando uma demanda crescente por aceleração 3D em hardware. Por volta de 995, surgiram os primeiros produtos a implementar essa ideia: S3 ViRGE, ATI Rage, Matrox Mystique e 3dfx Voodoo. O passo seguinte à aceleração 3D foi o surgimento das GPUs, que ocorreu por volta de 998, acrescentando processamento gráfico 3D ao hardware. No entanto, nesse período o processamento gráfico ainda era realizado por funções fixas definidas no projeto da GPU. A partir desse ponto, a evolução pode ser definida em cinco gerações (IKEDA, 0)... Primeira geração No final da década de 90, haviam três grandes empresas no segmento: NVIDIA, ATI e 3Dfx (com seus respectivos produtos, RIVA TNT - NV5, Rage 8 e Voodoo3). Nos dispositivos dessa geração não havia processamento na placa além da rasterização, texturização e geração dos sinais para o monitor. A rasterização consiste na conversão de representações vetoriais de objetos 3D em uma representação matricial, também conhecida como raster. Já a texturização é responsável pela aplicação de uma textura às faces de um objeto tridimensional. A imagem 3D é sintetizada por um conjunto de polígonos (comumente triângulos), resultantes da projeção para um espaço bidimensional (AZEVEDO, 003)... Segunda geração Em 999, o lançamento da GeForce 56 (NV0) pela empresa NVIDIA, destacou-se pela introdução do pipeline gráfico, tornando a GPU responsável pela transformação e iluminação dos polígonos, especificados em coordenadas de mundo. Neste período a ATI lançou a família de produtos Radeon R00 com a tecnologia HyperZ, que permitia evitar cálculos desnecessários em pixeis não visíveis na projeção final. O pipeline gráfico é um modelo conceitual composto por estágios que aplicam uma série de algoritmos aos dados processados por uma GPU. Os dados de entrada são um

21 conjunto de vértices e os respectivos atributos. Após a execução de todos os estágios do pipeline, obtém-se a representação de uma imagem a ser exibida na tela. A adoção dessa arquitetura possibilitou um grande avanço nos jogos e aplicações gráficas em tempo real, pois boa parte das tarefas que antes eram feitas pela CPU foram levadas para o hardware da GPU. Esta arquitetura permitia uma certa flexibilidade ao desenvolvedor, que podia configurar os módulos da GPU (IKEDA, 0). A empresa 3DFX, por sua vez, lançou a tecnologia Scalable Link Interface (SLI), que permitia a conexão e utilização em paralelo de duas placas de vídeo. Posteriormente, a 3DFX foi adquirida pela NVIDIA, que passou a utilizar esta tecnologia em sua linha de produtos. Neste mesmo período, ATI e NVIDIA tinham produtos com características semelhantes dando início a uma concorrência acirrada (IKEDA, 0)...3 Terceira Geração Em 00, a NVIDIA lançou a primeira GPU programável GeForce 3 (NV0), que competiu diretamente com a Radeon 8500 (R00) lançada pela ATI. A introdução das técnicas de pixel shading e vertex shading foi a grande evolução desta geração (VIANA, 009). O pixel shading torna possível desenvolver programas capazes de manipular os pixeis após a rasterização, de forma a criar efeitos na imagem, como por exemplo, rugosidade ou desfoque. Já vertex shading possibilita a criação de programas capazes de manipular a estrutura dos vértices do modelo tridimensional (ou seja, antes de rasterização), para otimizar os modelos 3D ou alterar o modelo dinamicamente. Os programas desenvolvidos com essas duas técnicas são conhecidos como shaders. Ambas as técnicas são utilizadas a fim de obter maior realismo nas imagens sem sobrecarregar a CPU principal, pois os shaders são executados inteiramente pela GPU (ST-LAURENT, 004). A capacidade de processamento desta geração era limitada, sendo necessário utilizar a linguagem de montagem (assembly) da GPU. Entretanto, a partir desta fase a GPU começou a ser encarada com um hardware vetorial programável (VIANA, 009)...4 Quarta geração A quarta geração introduziu o tratamento de variáveis de ponto flutuante e uma maior flexibilidade na utilização de dados de textura. Nesse período, com início por volta de 003, a

22 concorrência foi intensa com o lançamento da série FX (NV30) e GeForce 6 pela NVIDIA e da série R300 e X pela ATI. Este foi um momento importante na evolução das placas de vídeo, devido a ser a primeira vez na história em que foi possível desenvolver, ainda que precariamente, aplicativos de propósito geral sobre tecnologias de GPU (NVIDIA, 009)...5 Quinta geração O ponto marcante das placas dessa geração são as arquiteturas elaboradas para explorar a computação paralela de propósito geral em GPUs. Pode-se dizer, portanto, que somente a partir de meados de 006 que a computação paralela em hardware gráfico tornouse de grande interesse no mercado, indo além da comunidade científica (IKEDA, 0). O conceito de desenvolvimento de programas de propósito geral para GPUs é um dos focos deste trabalho e, portanto, será detalhado a partir da Subseção.3.. Pipeline gráfico tradicional O processo executado por todo o pipeline pode ser dividido em duas etapas principais: processamento de geometria e renderização. A primeira etapa transforma as coordenadas dos objetos de três dimensões em representações de duas dimensões, apropriadas à exibição. A segunda etapa preenche a área entre as coordenadas D com pixeis que representam a superfície dos objetos. O estágio de geometria ainda pode ser subdividido em: transformações e iluminação (CROW, 004). Inicialmente, apenas a renderização era implementada em hardware, por ser uma operação simples e repetitiva, e as outras operações eram executadas pela CPU. Com a evolução no desenvolvimento das GPUs, cada vez mais tarefas foram alocadas às placas de vídeo, a fim de diminuir a carga da CPU (NVIDIA, 999). A ideia do pipeline é fazer com que cada um desses módulos opere em paralelo, ao invés de tratar um pixel de cada vez. Nas placas de vídeo modernas, o pipeline completo é replicado diversas vezes, de forma a obter maior vazão no processamento. Ao longo dos anos, mais etapas do pipeline foram sendo trazidas da CPU para a GPU, chegando ao cenário atual, onde apenas a lógica da aplicação e as computações da cena são executadas pela CPU principal. A Tabela lista os estágios do pipeline gráfico e a evolução da distribuição dos mesmos entre CPU e GPU.

23 3 As características do pipeline delinearam a arquitetura das GPUs. O fato de todos os pixeis necessitarem passar pelos mesmos módulos de execução levou as GPUs a adotarem arquiteturas paralelas. Tabela Evolução da distribuição dos estágios entre CPU e GPU. Estágio Lógica da aplicação CPU CPU CPU CPU Computações da cena CPU CPU CPU CPU Transformações CPU CPU CPU GPU Iluminação CPU CPU CPU GPU Criação dos triângulos CPU Processador gráfico Processador gráfico GPU Renderização Processador gráfico Processador gráfico Processador gráfico GPU Fonte: NVIDIA, Processamento de propósito geral em GPU O uso da GPU para processamento de propósito geral começou com a utilização de linguagens de shading, como Direct3D High Level Shader Language (HLSL) e OpenGL Shading Language (GLSL). Dessa forma, aplicações em diversas áreas foram aceleradas, no entanto exigindo que todos os algoritmos fossem adaptados para trabalhar com dados expressos em termos de vértices e texturas. Nas primeiras soluções, haviam outras limitações, como a impossibilidade de leituras e escritas em posições aleatórias da memória (NVIDIA, 009). O uso de chips e APIs gráficas neste contexto revelou um grande potencial na aceleração de algoritmos que possuam uma estrutura passível de paralelização, fazendo uso de hardware padrão presente em um grande número de computadores. O surgimento deste novo segmento resultou na criação de arquiteturas que tornam as GPUs mais apropriadas ao processamento geral e ao desvinculamento de seus ambientes de desenvolvimento das APIs gráficas tradicionais. A primeira arquitetura de GPGPU, também chamada de computação para GPU, foi criada pela empresa NVIDIA e será detalhada a seguir..4 Visão Geral da CUDA CUDA é a arquitetura de computação paralela de propósito geral que faz uso da capacidade de processamento presente nas GPUs da NVIDIA. A arquitetura CUDA provê um modelo de programação escalável baseado em três conceitos centrais: uma hierarquia de grupos de threads, memória compartilhada entre as threads e barreiras de sincronização.

24 4 Esses conceitos são expostos ao desenvolvedor como um conjunto de extensões à linguagem C (NVIDIA, 0a). A arquitetura CUDA definiu duas alterações principais na organização das GPUs: a unificação dos shaders (vertex e pixel shaders) e a criação de memória compartilhada. O componente resultante da união dos shaders é chamado stream processor (SP). Essas alterações transformaram as GPUs em dispositivos adequados ao processamento de propósito geral (HUANG; SHEN; WU, 009). A Figura ilustra a arquitetura unificada dos shaders em contraste aos shaders tradicionais. A unificação dos shaders transformou as unidades especializadas em processamento de vértices ou pixeis, por exemplo, em unidades de computação genérica interconectadas por um escalonador dinâmico que divide a carga de processamento entre as diversas unidades que compõe a GPU. Dessa forma, a utilização dos recursos de hardware foi flexibilizada. Figura Shader tradicional x shader unificado, adaptado de (IKEDA, 0). Os grupos de threads são escalonados para execução em um dos núcleos, sequencialmente ou simultaneamente, sem que seja necessário explicitar em qual núcleo o bloco será alocado. Desta forma, um mesmo programa poderá ser executado em GPUs com diferentes quantidade de núcleos e, ainda assim, fará uso de todo o poder de computação disponível. A Figura ilustra a execução de um mesmo programa em duas placas de vídeo, a da esquerda possui uma GPU com dois núcleos e a da direita com quatro núcleos. O programa em questão foi parametrizado para execução com oito blocos de threads. No primeiro caso, cada núcleo fica responsável pela execução de quatro blocos. Já no segundo caso, os oito

25 5 blocos são divididos entre os quatro núcleos disponíveis. Esse escalonamento é realizado internamente pela GPU e não é determinado pelo código da aplicação. Dessa forma, a arquitetura provê um ambiente escalável para a execução dos programas. Figura Escalabilidade da arquitetura CUDA, adaptada de (NVIDIA, 0a). A arquitetura CUDA já sofreu algumas alterações desde a sua concepção inicial. Algumas características foram sendo implementadas ao longo do tempo, a fim de aprimorar o desempenho das GPUs. Portanto, diferentes placas podem conter um conjunto de características diferentes. A fim de identificar as características presentes em um determinado dispositivo, todas as placas são categorizadas em compute capabilities identificados por um versionamento numérico. Os manuais da NVIDIA apresentam as características do hardware de acordo com essa numeração. Por exemplo, um determinada funcionalidade pode estar presente apenas nos dispositivos de compute capability.. Se a funcionalidade for descrita para o compute capability.x, significa que todos as placas com versão suportam-na, independentemente do outro algarismo..5 Arquitetura de hardware As placas de vídeo compatíveis com a tecnologia CUDA possuem um conjunto escalável de multiprocessadores, que são chamados streaming multiprocessors (SMs). Os SMs são compostos por uma série de processadores escalares (scalar processors SP), uma unidade de instrução multi thread e memória compartilhada. Os blocos de threads criados

26 6 pelo kernel são escalonados para execução em SMs com capacidade ociosa. As threads dentro de um mesmo bloco são executadas concorrentemente, pois cada thread é mapeada em um SP, com seus próprios registradores. A NVIDIA chamou essa arquitetura de SingleInstruction, Multiple-Thread (SIMT) (NVIDIA, 0a). O escalonador de threads separa-as em grupos, chamados warps. A cada ciclo de instrução um warp é selecionado para execução, então a mesma instrução é executada em todas as threads ativas neste warp (NVIDIA, 0c). Apesar de todas as threads começaram a execução no mesmo ponto do código, há a possibilidade de que haja ramificação na execução. Neste caso, nem todas as threads estarão ativas no mesmo momento, resultando na serialização da execução. Portanto, para que seja alcançada eficiência máxima na execução paralela das threads é necessário que não hajam ramificações no fluxo de execução (branch divergence) dentro de um mesmo warp (HAN; ABDELRAHMAN, 0). A Figura 3 apresenta três casos típicos onde ocorre a divergência no fluxo de execução. Na situação (a), o incremento executado dentro do bloco condicional faz com que os SPs destinados às threads que não executam o incremento fiquem inativos por alguns ciclos. O cenário (b) pode ser interpretado como duas instruções condicionais na sequência, com as mesmas implicações do exemplo anterior. No terceiro caso, o número de iterações executadas no laço pode diferir para cada thread. A diferença no número de iterações do laço para cada thread resultará que os SPs alocados para as threads com menor número de iterações ficarão inativos, enquanto os outros SPs executam as últimas iterações para as outras threads do mesmo warp (HAN; ABDELRAHMAN, 0). Figura 3 Cenários comuns de branch divergence, adaptada de (HAN; ABDELRAHMAN, 0). Esta arquitetura criada pela NVIDIA é similar às arquiteturas SIMD presentes em diversas CPUs, no entanto, existem diferenças importantes (REN et al. 00). Nas arquiteturas SIMD, diversos elementos de dados são salvos em um registrador. A largura dos

27 7 registradores, que determina o nível de paralelismo em nível de instrução, é exposta ao software. Na arquitetura SIMT, por outro lado, o paralelismo se dá pela execução de diversas threads que podem executar trechos de código distintos (NVIDIA, 0c). O comportamento específico da arquitetura SIMT pode ser ignorado pelo programador a fim de obter-se uma implementação meramente funcional de determinado algoritmo, mas através da adequação da implementação às características próprias do hardware (GPU) é possível obter maiores ganhos de desempenho. Analogamente, nas arquiteturas tradicionais é possível ignorar a largura das linhas de cache e, ainda assim, obter implementações funcionais. No entanto, quando almeja-se obter picos de desempenho essa informação precisa ser considerada (NVIDIA, 0c)..6 Modelo de programação O modelo de programação do CUDA permite que o programador crie um grande número de threads que executarão código escalar, ou seja, cada thread analisada isoladamente contém código que será executado sequencialmente, sem nenhum nível de paralelismo. O modelo de programação criado pela NVIDIA possibilita aos desenvolvedores criar aplicações paralelas com certo grau de facilidade, mesmo aqueles que não possuem grande familiaridade com arquiteturas paralelas (BAKHODA et al., 009). As características do modelo de programação são expostas ao programador através de uma extensão da linguagem de programação ANSI C (American National Standards Institute). Os três conceitos chave desse modelo são descritos nas subseções seguintes: kernel, hierarquia de threads e hierarquia de memória..6. Função Kernel A extensão da linguagem C criada pela NVIDIA possibilita a criação de funções que serão executadas na GPU. Para tanto, existem três palavras-chave: global, device e host. A primeira delas específica uma função que será executada na GPU, mas será chamada da CPU. Uma função com esta característica é chamada de kernel e cabe ao programador especificar quantas vezes esta função deve ser executada paralelamente. Para tanto, na chamada do kernel é definido o tamanho do grid, ou seja, a quantidade de blocos de threads (NVIDIA, 0). Na Listagem, a linha um contém o protótipo com a declaração de um kernel e a linha dois a chamada do kernel, com a especificação dos parâmetros de execução.

28 8 global kernel_function(char *buffer); kernel_function<<<dimgrid,dimblock,0,stream>>>(buffer); Listagem Declaração e chamada de um kernel. A palavra-chave device, por outro lado, declara uma função que será executada pela GPU e poderá ser invocada somente por código executado na própria GPU. Já a palavrachave host declara funções convencionais, ou seja, que são chamadas e executadas pela CPU. host é o qualificador padrão na declaração de funções, portanto, não precisa estar explícito no protótipo da função..6. Hierarquia de threads A organização das threads se dá na forma de blocos com uma, duas ou três dimensões. Esse arranjo torna simples a execução de cálculos em elementos de vetores, matrizes ou volumes. A identificação da thread que está sendo executada é possível através dos índices que identificam a posição da thread dentro do bloco. Os índices são disponibilizados ao programador através da variável tridimensional threadidx que contém três campos de inteiros sem sinal: x, y, z. Os blocos contém grupos de threads que são organizados em um grid, que também pode ter até três dimensões. O tamanho do grid é determinado a partir da quantidade de dados a serem manipulados ou pela quantidade de processadores. Os blocos são identificados dentro do grid de mesma forma que as threads dentro de um bloco. Para tanto, existe a variável blockidx, do tipo uint3. Já o tamanho dos blocos, ou seja, a quantidade de threads pode ser obtido através da variável blockdim. As variáveis threadidx, blockidx e blockdim são chamadas built-in, ou seja, elas são automaticamente acessíveis dentro do kernel, mesmo sem terem sido explicitamente declaradas. A execução dos blocos de threads poderá ocorrer em qualquer ordem, serialmente ou paralelamente. Portanto, a operação executada em um bloco não pode depender de resultados obtidos em outros blocos. Essa característica possibilita a escalabilidade do código, de forma a utilizar diferentes quantidades de núcleos de processamento disponíveis (NVIDIA, 0a). As threads que residem no mesmo bloco são executadas no mesmo SM podendo cooperar entre si através do compartilhamento de dados (pela memória compartilhada) e sincronização da execução com funções intrínsecas que servem como barreiras na execução,

29 9 de forma que a execução prossiga apenas quando todas as threads tenham finalizado a execução de uma determinada sequência de instruções. AFigura 4 ilustra a forma de organização hierárquica das threads. Figura 4 Organização das threads, adaptada de (NVIDIA, 0a).6.3 Hierarquia de memória CUDA expõe seu modelo de memória, que é composto por diferentes espaços de memória, tornando necessário ao desenvolvedor conhecer a arquitetura e definir onde cada conjunto de dados da aplicação deve residir. A correta utilização das diferentes memórias presentes na placa de vídeo, geralmente, tem implicação direta no desempenho do aplicativo. A Tabela apresenta um visão geral das memórias disponíveis na arquitetura CUDA. Pode-se observar que as memórias mais abundantes possuem uma latência elevada por estarem localizadas fora do chip. A quinta coluna da tabela define que as memórias de constantes e de texturas possuem acesso somente de leitura, ou seja, é possível escrever nestas memórias apenas através de código executado na CPU. A subseção seguinte apresenta um detalhamento de cada uma dessas memórias. O fluxo dos dados na aplicação geralmente segue o seguinte padrão: inicialmente os dados são copiados da memória RAM (random access memory) do computador (host) para a memória global da GPU (device), através do barramento Peripheral Component Interconnect Express (PCIe). Após essa cópia os dados já estão acessíveis às threads, no entanto, é comum realizar a transferência da memória global para a memória compartilhada de um SM, de forma a minimizar a quantidade de acessos à memória global. Dessa forma, a memória compartilhada é utilizada como um cache entre a memória global e o aplicativo, para reduzir os efeitos da alta latência no acesso a memória global.

30 30 Tabela Características dos espaços de memória na arquitetura CUDA séries G80 e G00. Memória Localização Tamanho Latência Somente leitura Escopo Registradores SM até 64 kb por SM ~ 0 ciclos não thread Local Placa de vídeo depende da global ciclos não thread Compartilhada SM 6 kb por SM >= 4 ciclos não Todas as threads em um bloco Global Placa de vídeo até 04 MB ciclos não Todas as threads + host Constante Placa de vídeo 64 kb ciclos sim Todas as threads + host sim Todas as threads + host Placa de depende da ciclos vídeo3 global Fonte: Adaptado de NVIDIA, 0b e Conrad, 00. Textura Após esta etapa, as threads manipulam os dados que estão na memória compartilhada, utilizando os registradores para armazenar variáveis de controle e resultados intermediários. Ao final do processamento, cada thread escreve o resultado da sua execução na memória global, a fim de tornar acessível ao host os resultados obtidos. Por fim, o host copia os resultados que estão na memória global de volta para a memória do computador. Figura 5 Fluxo típico de uma aplicação CUDA. Esta memória possui cache nos dispositivos.x. Esta memória possui cache em todos os dispositivos. 3 Esta memória possui cache em todos os dispositivos.

31 3.7 Detalhamento dos espaços de memória A seguir serão apresentados os detalhes relevantes de cada memória..7. Registradores e memória local Os registradores são utilizados para armazenar as variáveis automáticas (também chamadas de variáveis locais). Se não houver espaço suficiente, o compilador alocará as variáveis na memória local. Dessa forma, estruturas ou vetores (automáticos) grandes possivelmente serão alocados na memória local. Como a memória local está localizada fora do chip e não possui cache (em dispositivos.x), apresenta tempo acesso elevado (NVIDIA, 0b). A memória local é apenas uma abstração sobre a memória global, com escopo limitado a cada thread (IKEDA, 0). Portanto, a quantidade e o tamanho das variáveis automáticas podem influenciar diretamente o desempenho do aplicativo..7. Memória compartilhada A memória compartilhada está localizada dentro de cada multiprocessador, por isso, possui latência cerca de cem vezes menor do que a memória global ou local, porém o tamanho total desta memória é reduzido (NVIDIA, 0b). A memória compartilhada pode ser utilizada como uma memória cache explicitamente gerenciada, ou seja, cabe ao programador utilizar esse recurso para minimizar a quantidade de acessos a memória global. A memória compartilhada é organizada em bancos, ou seja, módulos que podem ser acessados simultaneamente, a fim de obter uma alta largura de banda. Essa arquitetura permite que diversas requisições, que acessem endereços localizados em diferentes bancos, possam ser atendidas ao mesmo tempo. Por outro lado, se uma requisição de acesso a memória contiver acessos em endereços localizados no mesmo banco haverá um conflito de acesso. Nessa situação, os acessos serão separados em requisições consecutivas separadas para que não contenham nenhum conflito (NVIDIA, 0a). A ocorrência de conflitos se dá quando mais de uma thread pertencente ao mesmo half-warp4 solicitam acesso a posições de memória que localizam-se em um mesmo banco. Há uma exceção no caso de todas as threads de um half-warp executarem uma leitura no mesmo endereço, neste caso o conteúdo lido é disponibilizado para todas as threads através de um broadcast. Em dispositivos com compute capability.x há também a possibilidade de 4 Half-warp é um grupo de threads, com metade do tamanho de um warp. Em dispositivos com compute capability.x, o half-warp é menor unidade escalonada pelo SM. Já em dispositivos com compute capability.x a menor unidade escalonada é o próprio warp.

32 3 multicast, onde o conteúdo lido é disponibilizado para um grupo de threads, mas não necessariamente para todas (NVIDIA, 0b)..7.3 Memória global A memória global está localizada na placa de vídeo, no entanto, não sendo integrada ao chip da GPU, possui alta latência no acesso. Esta memória pode ser acessada através de transações de 3, 64 ou 8 bytes, alinhadas. Isto é, o endereço do primeiro elemento manipulado precisa ser um múltiplo do tamanho do segmento (NVIDIA, 0a). As requisições de acesso à memória global efetuadas por um half-warp (em dispositivos com compute capability.x) ou por um warp (em dispositivos com compute capability.x) são combinadas resultando na menor quantidade de transações possível, que obedeça as regras de alinhamento impostas pela arquitetura de hardware (NVIDIA, 0b). As regras que definem o agrupamento dos acessos à memória global em transações variam entre dispositivos com diferentes compute capabilities. Inicialmente, a arquitetura da GPU impunha restrições mais severas no padrão de acesso que resultava na combinação de vários acessos em uma transação. Entretanto, as placas de vídeo mais recentes, que possuem compute capability.x, apresentam avanços nesse quesito. A Figura 6 ilustra padrões de acesso que permitem o acesso coalescido, ou seja, o acesso a várias posições de memória em apenas uma transação. Desta forma, os efeitos da latência de acesso são diluídos. A figura (a) exemplifica o acesso coalescido a variáveis float de quatro bytes. A figura (b) ilustra o acesso coalescido por um warp divergente, ou seja, neste caso nem todas as threads acessam as respectivas variáveis. Figura 6 Padrões de acesso coalescido (CONRAD, 00). A Figura 7, por outro lado, exemplifica padrões de acesso que não possibilitam o acesso coalescido. A figura (a) possui um padrão de acesso não sequencial, ou seja, as

33 33 threads não acessam as suas respectivas posições. Já a figura (b) apresenta um padrão de acesso sequencial. No entanto, o acesso é desalinhado o que impossibilita o coalescing. Figura 7 Acesso não coalescido (CONRAD, 00). Uma característica dos dispositivos com compute capability.x que pode amenizar o impacto da alta latência no acesso a memória global é a presença de dois níveis de cache (cache L e L) entre o SM e a memória global. O cache L é composto de linhas de 8 bytes que mapeiam segmentos alinhados na memória global. Já o cache L é composto por linhas de 3 bytes. O tamanho das linhas determinam o tamanho da transação que será usada para acessar os dados através do cache. Em certas circunstâncias pode ser vantajoso utilizar apenas o cache L, por exemplo, quando os acessos são dispersos na memória a utilização de cache com linhas mais estreitas resulta numa menor quantidade de leituras ou escritas desnecessárias. Por esse motivo, o compilador possui um parâmetro que permite definir se os acessos a memória global utilizarão os caches L e L ou apenas o L (NVIDIA, 0a)..7.4 Memória de textura e superfície A memória de textura ou superfície está localizada na memória da placa de vídeo e possui cache otimizado para acesso a dados que apresentem localidade espacial em duas dimensões, ou seja, dados localizados em posições próximas. Além disso, esse espaço de memória é projetado de forma a obter fluxos de leitura com latência constante. Dessa forma, uma leitura do cache reduz a largura de banda demandada, mas a latência se mantém constante (NVIDIA, 0a).

34 34 Quando um warp necessita de um dado que está presente no cache há um ganho significativo no tempo de leitura, caso o dado não esteja disponível no cache o tempo de acesso será o mesmo de uma leitura na memória global convencional. A memória de textura pode ser escrita a partir do host, mas do ponto de vista da GPU é uma memória somente de leitura..7.5 Memória de constantes A memória de constantes está localizada no dispositivo e possui memória cache. Possui acesso somente de leitura pela GPU. Além de ser usada explicitamente, em dispositivos com compute capability.x esta memória pode ser utilizada pelo compilador através de instruções específicas (NVIDIA, 0a).

35 35 3 CODIFICAÇÃO DE VÍDEO Um codificador de vídeo transforma o vídeo de sua forma original em uma representação comprimida, de forma a permitir uma utilização mais eficiente de recursos como largura de banda (nos sistemas de comunicação) e espaço (nos sistemas de armazenamento). A utilização do vídeo codificado requer um decodificador, que é o sistema capaz de realizar a conversão inversa, a fim de obter o vídeo na sua forma natural. O par codificador/decodificador é o que se chama codec (RICHARDSON, 00). 3. Vídeo digital O vídeo digital baseia-se na utilização de dados amostrados temporalmente e espacialmente. A partir da amostragem, obtém-se uma matriz retangular com valores que representam a informação visual que é composta por três componentes, devido às características fisiológicas do sistema visual humano (GONZALEZ, 000). A forma de representação das três componentes é chamado espaço de cores. Existem diversos espaços empregados em diferentes aplicações. Os monitores de vídeo utilizam o RGB, baseado nas componentes vermelha, verde e azul. Já os sistemas de televisão e os codificadores de vídeo utilizam o YCbCr, que define a luminância (Y), a crominância azul (Cb) e a crominância vermelha (Cr) (SHI; SUN, 008). A utilização do espaço de cores YCbCr associado com a subamostragem das crominâncias é realizada através de padrões de amostragem bem estabelecidos, como 4:4:4, 4:: e 4::0. Na amostragem 4:4:4 as crominâncias são mantidas intactas, portanto, todos os pixeis possuem uma amostra de cada componente (Y, Cb e Cr). No caso 4::, a amostragem das crominâncias possui a metade da resolução no sentido horizontal, ou seja, para cada quatro amostras de luminância existem duas amostras de cada crominância. Por fim, o formato 4::0 reduz a resolução tanto horizontalmente quanto verticalmente, ou seja, para cada quatro amostras de luminância é utilizada apenas uma amostra de cada crominância, obtendo 50% menos bits na representação, se comparado com o formato 4:4:4 (RICHARDSON, 003). A subamostragem é amplamente utilizada nos codificadores atuais, devido à redução do espaço de informação ocupado por esta técnica. Por exemplo, um vídeo em formato YCbCr 4::0 obtém uma taxa de compressão de 50% em relação a um vídeo em RGB ou YCbCr 4:4:4 com perdas de qualidade pouco significativas (AGOSTINI, 007).

36 36 3. Compressão de vídeo As técnicas de compressão com perdas são amplamente utilizadas nos codificadores de vídeo atuais, de forma a explorar as limitações do sistema de visão humano. Além disso, o olho humano possui sensibilidade diferenciada em relação a diferentes componentes ou características da imagem (GONZALEZ, 000). Entretanto, a representação digital de vídeos apresenta uma enorme quantidade de dados redundantes que possibilita a utilização de técnicas de codificação preditiva sem perdas. Os altos níveis de compactação obtidos pelos codecs atuais são possíveis com a combinação destas técnicas (com e sem perdas) (DINIZ, 009). Um codificador de vídeo, de forma geral, é composto por três partes principais: módulo temporal, módulo espacial e codificador de entropia. Cada um desses módulos é responsável por remover um tipo de redundância presente no vídeo (AGOSTINI, 007): a) Redundância Espacial: devida à correlação existente entre os pixeis ao longo de um quadro (por isso, chamada intraquadro). A remoção dessa redundância é realizada no domínio espacial e no domínio das frequências, pela predição intraquadro e quantização, respectivamente. A quantização é uma operação irreversível, pois gera perdas na codificação. No entanto, as perdas tendem a ser pouco significativas na qualidade visual da imagem. b) Redundância Temporal: se deve à correlação existente entre os diversos quadros (por isso, chamada interquadro) temporalmente adjacentes. Essas redundância pode ser visualizada como uma dimensão adicional da redundância espacial (GONZALEZ, 000). Esta correlação temporal é tratada pelo módulos de estimativa e compensação de movimento. c) Redundância Entrópica: relaciona-se com a probabilidade de ocorrência de determinados símbolos, sendo que quanto maior a probabilidade de ocorrência de um determinado símbolo, menos informação estará sendo codificada através dele. A codificação de entropia utiliza algoritmos de compressão sem perdas objetivando a codificação da maior quantidade de informação possível por símbolo. A entropia é a medida da quantidade média de informação codificada por símbolo (SHI; SUN, 007).

37 Introdução ao H.64 H.64 é um padrão internacional de codificação de vídeo para a indústria. É composto por um documento publicado pela ITU-T e ISO/IEC (como sendo a parte 0 do MPEG-4) que possui instruções que definem o formato do vídeo codificado. Além disso, é definido, em detalhes, o funcionamento de um decodificador capaz de decodificar o formato especificado (ITU-T, 003). Assim como em outros padrões de codificação, não são especificados os detalhes do codificador. A única restrição imposta na implementação do codificador, é que ele precisa gerar um bitstream (fluxo de vídeo codificado) conforme a especificação, de forma que possa ser decodificado corretamente por qualquer implementação do decodificador (RICHARDSON, 003). O H.64 define um conjunto de técnicas e ferramentas de compressão, o codificador pode optar por qual desses itens irá fazer uso. O padrão H.64 foi originalmente publicado em 003 e sofreu diversas revisões e atualizações desde então. Os conceitos básicos deste codec são os mesmos presentes no MPEG- e MPEG-4 Visual, no entanto, os avanços sugeridos proporcionam um aumento potencial na eficiência, qualidade e flexibilidade da compressão (RICHARDSON, 00). 3.4 Descrição do codec H.64 O codificador possui dois caminhos por onde os dados fluem: o caminho direto, através do qual é gerado a sequência de bytes que representa o vídeo codificado e o caminho de reconstrução do vídeo, através do qual o codificador monta os quadros decodificados a serem usados como referência. Inicialmente, cada macrobloco5 do quadro original a ser codificado é subtraído de um macrobloco de referência obtido pela predição intraquadro ou pela compensação/estimativa de movimento. Os macroblocos de referência utilizados são oriundos de quadros reconstruídos pelo caminho de reconstrução, que executa as operações identicamente a um decodificador (RICHARDSON, 003). Os macroblocos de diferenças (geralmente chamados de macroblocos de resíduos) são processados pelos módulos de transformadas e quantização. Os coeficientes quantizados e as informações de controle, que indicam as decisões tomadas pelo codificador, são repassadas ao codificador de entropia que irá reduzir o nível de redundância entrópica do fluxo de bits de saída (bitstream). Por fim, o vídeo codificado será colocado dentro de pacotes 5 Macrobloco é um bloco de 6x6 pixeis.

38 38 padronizados, referenciados como NAL (Network Abstraction Layer) (RICHARDSON, 003). As técnicas de compressão baseadas em predição de blocos da imagem fazem uso de blocos da vizinhança (temporal ou espacial) que foram codificados anteriormente ao bloco atual. Tanto o codificador quanto o decodificador executam o procedimento de compensação, de forma que o codificador utilize como quadro de referência o mesmo resultado que será obtido pelo decodificador. Portanto, o resultado quantizado será processado pelo bloco de quantização inversa e transformadas inversas. O resultado desta etapa será somado ao resultado da predição intraquadro ou interquadro e filtrado (para diminuir os efeitos do particionamento da imagem em blocos) e então formará a próxima imagem de referência, ou seja, uma versão decodificada do bloco original (RICHARDSON, 003). A Figura 8 apresenta os blocos constituintes do codificador H.64. Figura 8 Estrutura do codificador H.64 (REDIESS, 006) Predição intraquadro A predição intraquadro tem por objetivo diminuir a redundância espacial dentro um quadro. Sua característica principal é permitir a compressão de dados de cada quadro de forma auto contida, ou seja, cada quadro da sequência de vídeo pode ser processado de forma independente de todos os demais. Este procedimento é aplicado a todos elementos dos macroblocos no domínio espacial (AGOSTINI, 007). O padrão H.64 define a aplicação da predição intraquadro nos componentes de luminância e crominância dos macroblocos I (Intra), resultando em macroblocos preditos com base em amostras reconstruídas, ou seja, que já percorreram todo o caminho de reconstrução

39 39 do codificador. O resultado desta predição é subtraído do macrobloco original a fim de gerar um macrobloco de resíduos a serem codificados. Segundo a norma H.64, existem dois tipos de blocos I: de tamanho 4x4 e 6x6. No primeiro caso o conjunto de 6x6 amostras é processado separadamente em blocos de 4x4. Já no segundo caso, o macrobloco é tratado sem divisões. Para cara tipo de macrobloco I, existem vários modos de predição que visam atacar determinados padrões espaciais no quadro de vídeo. Por exemplo, as Figuras 9 e 0, apresentam os quatro modos de predição para macroblocos I 6x6 e os nove modos de predição para macroblocos I 4x4, respectivamente (RICHARDSON, 003). Figura 9 Modos de predição para blocos 6x6 de luminância. (AGOSTINI, 007) As crominâncias são processadas em blocos 8x8 e existem quatro modos de predição possíveis. No entanto, as duas crominâncias sempre utilizam o mesmo modo (RICHARDSON, 003). A decisão de qual modo de predição será empregado em cada macrobloco fica a cargo do codificador. Existem duas abordagens para a tomada desta decisão: algoritmos de busca completa (que calculam todos os modos possíveis a fim de encontrar qual fornece a melhor eficiência na compressão) e algoritmos rápidos (que baseiam-se em alguma heurística, usando informação do vídeo a ser codificado, de forma a diminuir a complexidade da decisão) (AGOSTINI, 007).

40 40 Figura 0 Modos de predição para blocos 4x4 de luminância (AGOSTINI, 007) Transformadas diretas e inversas A codificação por transformadas é uma técnica de compressão que explora a correlação entre os pixeis de uma imagem, sendo empregada tanto em codificação de imagens quanto codificação de vídeo. Este estágio do codificador converte blocos da imagem de entrada ou de resíduos da predição em outro domínio. O domínio para o qual os dados de entrada são convertidos deve conter a informação original separada em componentes descorrelacionadas e com a maior parte da energia do sinal concentrada em um pequeno número de componentes. Além disso, é necessário que a transformada seja reversível, de forma que seja possível voltar à representação original. A transformada adotada na maior parte dos codecs é a DCT bidimensional (SHI; SUN, 008). O padrão H.64 define a utilização de duas transformadas: DCT e Transformada de Hadamard. O codificador H.64 transforma e quantiza os blocos de coeficientes residuais. A transformada utilizada é uma versão aproximada da DCT, chamada core transform. Após esta etapa, em certos casos, é empregada a Transformada de Hadamard aos coeficientes DC6 obtidos na etapa anterior (RICHARDSON, 003). As seções seguintes apresentarão os detalhes de cada uma dessas transformadas. 6 Coeficientes DC são aqueles que possuem frequência zero.

41 Transformada discreta de cossenos A DCT é uma transformada derivada da Transformada de Fourier cujo objetivo é converter um bloco de dados de entrada para o domínio das frequências. A equação define a DCT (RICHARDSON, 003). Y =A X AT () Onde Y é a matriz de saída X é a matriz de entrada A é a matriz de coeficientes da transformada AT é a matriz A transposta A matriz A é definida pela Equação. Aij =C i cos j i n () Onde C i =0 = n (3) (4) C i 0 = n Onde i e j representam a posição do elemento na matriz (linha e coluna, respectivamente) e n representa o número de linhas ou colunas do bloco. A partir das Equações, 3 e 4 obtém-se a seguinte matriz de coeficientes para aplicar a transformada em blocos 4x4: A= [ cos 0 cos 8 cos 8 3 cos 8 cos 0 3 cos 8 6 cos 8 9 cos 8 cos 0 5 cos 8 0 cos 8 5 cos 8 cos 0 7 cos 8 4 cos 8 cos 8 ] (5) A Figura exemplifica o funcionamento desta transformada. É possível notar que o bloco resultante (b) possui as componentes mais significativas concentradas na parte superior esquerda do bloco.

42 4 Figura Bloco de entrada (a) e resultado da DCT (b) (RICHARDSON, 003). Como pode-se observar, implementações dessa transformada requerem o uso de aproximações de fatores irracionais. Se forem adotadas diferentes aproximações no codificador e no decodificador, pode haver uma certa discrepância entre predições usadas como referência, resultando distorção na saída do processo de decodificação. Padronizações anteriores, como o MPEG- ou MPEG-4 adotaram diferentes medidas para minimizar o impacto dessas aproximações. No entanto, o H.64 (e outros codecs recentes) abordaram esse problema definindo um algoritmo adequado à implementação com aritmética inteira com precisão limitada, de forma a eliminar a necessidade da utilização de valores aproximados. Além disso, a implementação das transformadas em aritmética inteira contribui para a diminuição do custo computacional das transformações (HUSEMANN et al., 00). A matriz da transformada definida em 5 pode ser reescrita da seguinte forma: [ a a a a A= b c c b a a a a c b b c ] (6) Onde a= (7) b= cos 8 (8) 3 c= cos 8 (9) Considerando-se as definições, 6, 7, 8 e 9 obtém-se:

43 43 [ ][ a a a a T b c c b Y =A X A = X a a a a c b b c a b a c a c a b a c a b a b a c ] (0) que pode ser fatorada em: Y =A X AT = C X C T E [ ] a [ ][ ] () ab Y = a ab ab b 4 ab b² 4 a ab a² ab ab b² 4 ab b² 4 () Onde significa que cada elemento da matriz C X CT é multiplicado pelo elemento correspondente na matriz E. Essa multiplicação ponto-a-ponto não é efetivamente calculada na implementação da DCT, no entanto, estes fatores de escala são compensados durante a quantização. Os fatores a e b da matriz E são aproximados para simplificar a implementação. a= (3) (4) b= 5 A DCT inversa é necessária para transformar os dados para o seu domínio original, tanto no decodificador quanto no laço de realimentação do codificador. A DCT inversa é definida pela Equação 5. X =AT Y A Onde X é a matriz recuperada Y é a matriz transformada A é a matriz de coeficientes da transformada AT é a matriz A transposta (5)

44 44 As mesmas considerações feitas na transformada direta são aplicadas à transformada inversa, de forma a obter a operação inversa equivalente, resultando na Equação 6. A multiplicação ponto-a-ponto, analogamente, será compensada na quantização inversa. [ ][ ] T X =A X A= X (6) Transformada de Hadamard O padrão H.64 define a aplicação da transformada de Hadamard aos coeficientes DC dos blocos após o cálculo da DCT, de forma aumentar a compressão em áreas homogêneas (RICHARDSON, 003). Por exemplo, um macrobloco de luminâncias (6 blocos de 4x4 amostras) resulta em um bloco 4x4 de componentes DC a serem processadas pela transformada de Hadamard. No caso de um macrobloco de crominâncias, o bloco de componentes DC é x, devido à utilização de subamostragem nas crominâncias. A Figura destaca os componentes DC dentro dos macroblocos de crominância (a) e luminância (b). Figura Macroblocos de crominância e luminância com componentes DC destacados (MAJOLO, 00). A definição matricial da transformada de Hadamard, aplicada às amostras de luminância, é apresentada na Equação 7.

45 45 [ ] [ Y L = X L ] (7) Onde XL é matriz 4x4 dos coeficientes DC resultantes da execução da DCT em um bloco de 6x6 luminâncias; YL é a matriz com os resultados obtidos pela transformada de Hadamard. Quando aplicada às amostras de crominâncias, a transformada é definida pela Equação 8. [ ] [ Y L= X C ] (8) Onde XC é a matriz com os valores DC resultantes da DCT aplicada às crominâncias YL é a matriz que contém o resultado da transformada. A equação da transformada inversa de Hadamard (para blocos 4x4 de luminâncias) é obtida através da manipulação da Equação 7, resultando em: [ ][ X L = Y L 8 ] (9) A divisão por oito na Equação 9 não é realizada no cálculo da Hadamard inversa, no entanto, é compensado durante a quantização inversa. O mesmo procedimento aplicado à Equação 8 resulta na equação para transformada inversa de Hadamard aplicada aos blocos x de crominâncias. X C= [ ] [ YC ] (0) Quantização O padrão H.64 conta com um módulo quantizador escalar. A quantização dos coeficientes obtidos pelas transformadas resulta na redução da informação e, consequentemente, na compressão dos dados. A quantização consiste, basicamente, de uma divisão por valor inteiro, de maneira a reduzir a faixa dos valores (RICHARDSON, 003).

46 46 A equação básica que define a quantização é: FQ ij =round X ij Qstep () Onde FQ é o resultado da quantização; X é o valor a ser quantizado; Qstep é o passo de quantização; round é uma função que aproxima o valor para o inteiro mais próximo. O parâmetro Qstep determina a intensidade da quantização, ou seja, quanto maior o Qstep maior a compressão atingida e, consequentemente, maior a perda de informação gerada no arredondamento. A determinação do valor do Qstep é um passo importante na configuração do codificador (MAJOLO, 00). A determinação do Qstep é realizada indiretamente através de uma tabela com 5 valores que podem ser assumidos pelo Qstep, que são indexados pelo Quantization Parameter (QP). A relação entre o Qstep e QP é a seguinte: para cada incremento de seis unidades do QP, o Qstep é multiplicado por dois. Essa relação é apresentada na Tabela 3. A utilização desta tabela foi adotada a fim de evitar a necessidade de operações custosas como, cálculos com ponto flutuante e divisões (RICHARDSON, 003). Tabela 3 Passos de quantização. QP 0 3 Qstep 0,65 0,6875 0,85 0,875 4 QP Qstep ,5,5,37,6,75,5, Fonte: RICHARDSON, 003 Como foi mencionado na subseção sobre a transformada DCT, uma multiplicação escalar oriunda daquela transformada não é implementada, precisando ser compensada durante a quantização. Essa compensação é feita através da variável Post-Scaling Factor (PF), definida pela Tabela 4, resultando na Equação. As variáveis a e b são definidas nas Equações 3 e 4. FQ ij =round X ij PF Qstep ()

47 47 Tabela 4 Valores de PF para cada posição. Posição (i, j) (0,0), (,0), (0,) e (,) (,), (,3), (3,) e (3,3) Outras PF a² b²/4 ab/ Fonte: RICHARDSON, 003. Para fins de substituir divisões por deslocamento de bits, o termo PF / Qstep na Equação pode ser substituído por: PF MF = qbits Qstep (3) Onde MF é o fator de multiplicação definido na Tabela 5; qbits é definido por QP 6 sendo floor a função que realiza o arredondamento para baixo. qbits=5 floor (4) A equação final, em aritmética inteira, é expressa por: FQ ij = X ij MF f qbits (5) sign FQ ij =sign X ij (6) Onde f é qbits/3 para blocos da predição intra e qbits/6 para blocos da predição inter; >> é o descolocamento binário para direita; sign é a função que acessa o sinal do número. Tabela 5 Fator de multiplicação. Posições Posições QP (0,0), (,0), (,) e (0,) (,), (,3), (3,) e (3,3) Outras posições Fonte: RICHARDSON, 003. Por fim, apresenta-se a definição da quantização inversa, que serve para recuperar o valor anterior. Como a quantização é um procedimento que causa perdas, o valor recuperado é uma aproximação do valor original, que depende do parâmetro QP. Este parâmetro terá o

48 48 mesmo valor na quantização direta e inversa. A equação da quantização inversa para os componentes AC7 de luminâncias é definida em 7. X ' ij =FQ ij V ij QP /6 (7) Onde X'ij é o valor recuperado; FQij é o valor quantizado; Vij é uma constante definida em 8; QP é o parâmetro de quantização. V ij =Qstep PF ij 64 (8) A quantização inversa para os componentes DC é expressa pela equação 9. X ' ij =FQ ij V 0,0 floor QP /6 para QP >= X ' ij =[ FQ ij V 0,0 floor QP /6 ] QP /6 para QP < (9) Onde floor é operação que arredonda o número para baixo; >> é deslocamento binário para direita Estimativa de movimento A estimação de movimento trabalha no modelo temporal do vídeo com o objetivo de encontrar e remover dados redundantes em quadros temporalmente adjacentes, algo relativamente comuns em sequências de vídeo naturais. A partir do modelo temporal, aproveitam-se as similaridades entres os quadros baseando-se em dados previamente processados a fim de obter um quadro estimado (RICHARDSON, 00). A Figura 3 apresenta dois quadros temporalmente consecutivos no vídeo. Já a Figura 4a ilustra a similaridade entre os dois quadros através da codificação diferencial, ou seja, o quadro é obtido através da simples subtração entre os dois quadros originais. Nas figuras, o tom acinzentado predominante indica as regiões em que não há diferença entre os dois quadros, o que pode ser explorado para reduzir a quantidade de dados realmente necessários para construir a segunda imagem a partir da primeira. A utilização das técnicas de estimação de movimento possibilitam reduzir os resíduos obtidos pela codificação diferencial. A Figura 4b ilustra o resíduo obtido após a realização da estimação de movimento. 7 Coeficientes AC são aqueles que possuem frequência diferente de zero.

49 49 (a) (b) Figura 3 Quadros consecutivos de vídeo (RICHARDSON, 003). (a) (b) Figura 4 Na esquerda, o resíduo sem estimativa de movimento. Na direita, o resíduo com estimativa de movimento (RICHARDSON, 003). A obtenção da estimativa de movimento se dá pela determinação de qual bloco dos quadros de referência mais se assemelha ao macrobloco que está sendo processado, a fim de que possa-se codificar apenas a diferença entre o bloco atual e o bloco selecionado e um vetor de movimento que define a posição da região usada na predição. Este vetor é incluído no bitstream de forma a permitir ao decodificador a realização do processo inverso (compensação de movimento) (PORTO, 008). A estimação de movimento baseia-se em algoritmos de busca, que visam encontrar o bloco que possui a maior similaridade com o bloco atual (melhor casamento), e em critérios de similaridade que serão detalhados nas subseções seguintes. A Figura 5 ilustra o procedimento de estimativa de movimento, que em conjunto com a compensação de movimento constitui a predição interquadro. Segundo (PURI; CHEN; LUTHRA, 004) o codificador interquadros é o módulo que contém a maior complexidade computacional em um codificador de vídeo. O padrão H.64/AVC inovou na predição interquadro ao inserir a possibilidade de blocos de tamanho variável, interpolação de valores intermediários (atingindo resolução de

50 50 meio ou quarto de pixel) e utilização de múltiplos quadros de referência (incluindo quadros futuros) (RICHARDSON, 003). Figura 5 Predição interquadro (DINIZ, 009) Algoritmos de busca Os algoritmos de busca especificam como a busca pelo bloco com maior similaridade será realizada dentro de uma área de tamanho pré-definido chamada janela de busca. Em geral, os algoritmos mais utilizados são os baseados em blocos de pixeis (em oposição aos baseados em objetos). A escolha de um algoritmo de busca é extremamente importante, pois tem impacto significativo, tanto na eficiência da compressão, quanto na complexidade computacional do codificador (PORTO, 0). Os algoritmos de busca podem ser divididos em algoritmos ótimos e rápidos: os algoritmos ótimos obtém o vetor de movimento correspondente ao bloco com maior similaridade em relação ao bloco atual através da análise de todos os possíveis candidatos. Por outro lado, os algoritmos rápidos obtém uma diminuição do tempo de busca através de heurísticas que diminuem a quantidade de candidatos a serem analisados, ao custo de obterem um vetor de movimento subótimo (PORTO, 008). O algoritmo Full Search (FS) é um algoritmo ótimo, pois compara a similaridade de todos os possíveis blocos dentro da janela de busca. A iteração sobre todos os candidatos pode ser de diversas formas, começando no canto superior esquerdo e finalizando no canto inferior direito ou realizando uma busca em formato de espiral ao redor de uma posição central, por

51 5 exemplo. Os diferentes blocos candidatos são obtidos através do deslocamento da borda do bloco em uma amostra, conforme ilustrado na Figura 6. Figura 6 Algoritmo de busca completa (PORTO, 0) O algoritmo FS dificilmente é empregado em aplicações práticas que requerem codificação em tempo real de altas resoluções, a menos que seja utilizada uma arquitetura desenvolvida especialmente para este fim. Este algoritmo não possui dependência de dados, portanto, é possível explorar um grande nível de paralelismo (SOARES, 007). Os algoritmos rápidos tentam obter bons vetores de movimentos mesmo sem fazer uma busca exaustiva, ou seja, sem testar todos os possíveis blocos. Dentre as diversas formas de realizar a busca propostas na literatura, a seguir serão abordados dois algoritmos de interesse no contexto deste trabalho: Diamond Search (DS) e Logarithmic Search (LS). O algoritmo DS é um algoritmo rápido que realiza a busca em um formato de diamante. Este formato determina a posição dos blocos considerados candidatos dentro da janela de busca. Usualmente, esse algoritmo emprega dois padrões de busca: Large Diamond Search (LDS) e Small Diamond Search (SDS) (ZHU; MA, 000). Inicialmente a LDS compara as similaridades entre o bloco atual e nove blocos candidatos ao redor da posição central da janela de busca. Se o bloco que resultar no menor resíduo não estiver no centro do diamante, esta etapa será repetida com base em uma nova posição central localizada no melhor bloco encontrado. Este procedimento se repete até que o bloco de maior similaridade esteja na posição central. Num segundo momento, a SDS realiza um refinamento ao redor da posição determinada na etapa anterior. Para tanto, é realizada a comparação entre a similaridade da posição central e de quatro blocos vizinhos. A Figura 7

52 5 ilustra este procedimento. As posições L fazem parte do diamante grande e S do diamante pequeno. Figura 7 Large Diamond Search (LDS) e Small Diamond Search (SDS) (PORTO, 008) O algoritmo LS, inicialmente, compara o bloco atual com cinco blocos candidatos: a posição (0, 0) e quatro blocos a S pixeis da origem na horizontal e na vertical, onde S é o valor do passo inicial. Na etapa seguinte, a origem é posicionada no melhor bloco encontrado na etapa anterior e o procedimento é repetido nessa nova posição. Quando o melhor casamento ocorrer na posição central o valor do passo é dividido por dois, até que o passo chegue ao valor um. Na sequência, as oito posições ao redor do bloco anteriormente selecionado são testadas. O bloco com menor similaridade nesta etapa resulta no vetor de movimento para a realização da predição. A Figura 8 ilustra o funcionamento do algoritmo LS com o passo S valendo dois inicialmente. No exemplo dado, para cada iteração da busca o bloco com maior similaridade é destacado em negrito. Figura 8 Algoritmo de busca logarítmica (RICHARDSON, 00). A quantidade de iterações executadas na LDS depende do vídeo em questão, o que dificulta a análise do desempenho. Entretanto, o algoritmo DS diminui, em média, cerca de 50 vezes o número de blocos candidatos a terem a similaridade calculada e comparada, em relação ao algoritmo de busca completa (PORTO, 0). No padrão de busca LS ocorre a

53 53 mesma situação: o número de comparações necessárias depende da quantidade de iterações efetuadas e varia em cada caso. Uma técnica muitas vezes empregada conjuntamente a algoritmos de busca rápidos como DS e LS é a determinação de uma posição inicial para a busca diferente de (0, 0) através de vetores de movimento previamente obtidos (TOURAPIS, 00). Por exemplo, pode-se determinar a posição inicial da busca baseando-se nos vetores de movimento encontrados nos blocos adjacentes do quadro atual. Essa ideia explora a localidade espacial, ou seja, o fato de que blocos vizinhos tendem a ter movimentação semelhante. No entanto, dessa forma cria-se uma dependência de dados entre os blocos de um mesmo quadro, o que dificulta a utilização de paralelismo em nível de bloco. Uma outra alternativa é escolher a posição inicial de busca a partir de dados proveniente de quadros previamente processados, ou seja, a exploração da localidade temporal. Essa ideia baseia-se na premissa de que o mesmo bloco em quadros temporalmente adjacentes possuam movimentação semelhante. Essa abordagem cria uma dependência de dados entre os quadros, mas, possibilita o paralelismos em nível de blocos dentro de um mesmo quadro Critérios de similaridade Os critérios de similaridade são usados para determinar o grau de semelhança entre dois blocos de pixeis. Diversos critérios foram propostos na literatura: Mean Square Error (MSE), Mean Absolute Error (MAE), Sum of Absolute Differences (SAD) entre outros (RICHARDSON, 00). A Equação 30 define o cálculo do SAD, que é usualmente empregado na estimativa de movimento devido a sua simplicidade e em resultar em uma boa aproximação da energia do bloco (PORTO, 0). N N SAD= C ij Rij i =0 j=0 Onde N é o tamanho do bloco Cij é o pixel na posição (i,j) do bloco atual Rij é o pixel na posição (i,j) do bloco de referência (30)

54 Compensação de movimento A compensação de movimento tem por objetivo encontrar, a partir do vetor de movimento obtido pela estimação de movimento, os blocos mais semelhantes com o atual dentre os blocos previamente codificados para obter o bloco predito. Para tanto, a compensação de movimento necessita obter os parâmetros gerados pela estimação de movimento (AZEVEDO, 006). O vídeo será, inicialmente, reconstruído com base no quadro predito. Em seguida, serão corrigidas as diferenças entre o quadro original e o quadro estimado, utilizando o quadro residual. 3.5 Trabalhos relacionados Sprandlin et al. (009) avaliaram a viabilidade de paralelizar a implementação de referência do codificador MPEG-, utilizando a tecnologia CUDA, e obtiveram significativos ganhos de velocidade em partes específicas da implementação. No entanto, esses resultados são severamente diluídos se analisado o aplicativo como um todo. Foi destacada a importância de minimizar as transferências de dados entre a CPU e a placa de vídeo, pois a alta latência e a pequena largura de banda do barramento PCIe foram apontadas como fatores que limitaram os resultados. Chan et al. (009) demonstraram a viabilidade de implementar o algoritmo piramidal de estimação de movimento do padrão H.64 utilizando CUDA. O resultado obtido foi uma diminuição de 56 vezes no tempo gasto na execução do algoritmo, no entanto, foi utilizada uma aproximação do vetor predito a fim de eliminar interdependências que diminuiriam o nível de paralelismo alcançável. Ren et al. (00) propuseram duas implementações do módulo de predição-intra do codificador H.64 em GPU. Na primeira implementação, foram eliminados dois modos de predição a fim de alcançar um maior paralelismo em nível de blocos 4x4. A outra alternativa explora o paralelismo em nível de macrobloco. No entanto, para eliminar as dependências entre macroblocos vizinhos é necessária uma alteração no algoritmo (com consequências insignificantes na qualidade em vídeos de alta definição). Os ganhos obtidos nas duas implementações propostas ficaram em torno de cinco vezes em relação à implementação de referência. Huang, Shen e Wu (009) estudaram a utilização de CPUs multi núcleo em conjunto com GPUs, atuando como coprocessadores, para a implementação de um codificador de vídeo

55 55 H.64/SVC (extensão do H.64/AVC com técnicas de codificação escalável). Foi estudada a divisão das tarefas entre as duas arquiteturas (CPUs e GPUs) e a transição de dados entre elas. Os resultados obtidos apontaram que a execução do algoritmo de busca completa na estimativa de movimento na GPU resultou em melhor desempenho se comparado à implementação utilizando CPU multi núcleo. Cheung et al. (00) investigaram o uso de GPUs para codificação e decodificação de vídeo. Este trabalho faz uma revisão da literatura acerca da estruturação e particionamento dos módulos entre CPU e GPU. Por fim, é implementada a estimativa de movimento do H.64 na GPU, através da qual é explorado o trade-off entre os ganhos de velocidade e a qualidade obtida. Os experimentos levam a resultados de execução cerca de três vezes mais rápida com a utilização da GPU e foi destacada a importância de expor o máximo paralelismo de dados possível à GPU. Monteiro et al. (0) exploraram o uso da arquitetura CUDA no contexto da estimativa de movimento, obtendo um ganho de velocidade de 600 vezes na implementação do algoritmo de busca completa.

56 56 4 DESCRIÇÃO DO SISTEMA DESENVOLVIDO O aumento na complexidade computacional no padrão H.64 em relação aos padrões anteriores é significante. Essa característica torna desafiadora a implementação de um sistema capaz de executar a codificação em tempo real, especialmente para vídeos de alta resolução (DINIZ, 009). Inserido nesse contexto, o presente trabalho consiste na investigação da utilização de GPUs, presentes nas placas de vídeo da NVIDIA, como coprocessadores no contexto da codificação de vídeo. Para tanto, utilizou-se a tecnologia NVIDIA CUDA, apresentada no segundo capítulo deste trabalho. Um ponto importante foi a identificação dos algoritmos de codificação de vídeo que são apropriados à implementação em arquiteturas paralelas. Por isso, faz-se necessária a revisão de literatura apresentada previamente e o estudo da implementação de referência do codificador H.64. A complexidade computacional dos diversos módulos do codificador H.64 foi analisada em diversos trabalhos encontrados na literatura. Em geral, as análises consideram o tempo de processamento necessário por cada módulo, o que equivale aproximadamente ao número de operações executadas (HOROWITZ, 003). A Tabela 6 apresenta o percentual da complexidade computacional dos principais módulos do H.64, segundo a avaliação de Zhang et al. (005). Tabela 6 Complexidade dos módulos do codificador H.64. Módulo ME / MC T / Q / T- / Q- Predição intraquadro Filtro Outros Complexidade % 8,78 5,49 5,9 0,8 6,6 Fonte: ZHANG et al., 003. Pode-se notar claramente que a parcela mais significativa localiza-se na estimativa e compensação de movimento. Essas técnicas situam-se na predição interquadro, ou seja, exploram as redundâncias temporais do vídeo. Por outro lado, na exploração das redundâncias espaciais dentro de um quadro do vídeo, destacam-se as transformadas e quantização diretas e inversas (que juntas compõe o que pode ser chamado de módulo computacional) e a própria predição intraquadro. O desenvolvimento deste trabalho foi dividido em duas etapas: o estudo dos algoritmos relacionados à codificação intraquadro e codificação interquadro.

57 57 4. Codificação intraquadro A arquitetura do codificador intra é apresentada pela Figura 9, que também ilustra a relação do módulo computacional com as demais etapas do processo. Figura 9 Processo de codificação intraquadro, adaptada de (DINIZ, 009). O módulo computacional está localizado no laço de codificação intra. A predição-intra depende dos dados oriundos dos estágios T/Q/T-/Q-, o que inviabiliza a implementação de um pipeline entre estas etapas. Por este motivo o módulo computacional adiciona uma latência ao codificador intraquadro. Uma alternativa para diminuir essa latência é a exploração do paralelismo encontrado nos algoritmos de computação intra (AGOSTINI, 007). Portanto, no contexto deste trabalho, optou-se por explorar, dentre os estágios da codificação intraquadro, o paralelismo no módulo computacional. 4. Algoritmos de computação intra Os blocos de transformadas e quantização diretas e inversas em conjunto compõe o módulo computacional. Este módulo é uma das ferramentas de codificação que explora as redundâncias espaciais dentro de um quadro do vídeo. No contexto deste estudo de caso, foi implementada uma função kernel responsável por processar os 6 blocos 4x4 que compõe um macrobloco de luminâncias. A Figura 0 apresenta as etapas que são executadas sequencialmente por esta função. As três primeiras etapas fazem parte do processo de codificação e resultam na matriz de coeficientes que é fornecida ao codificador de entropia. Já as três últimas etapas fazem parte do laço de realimentação, fornecendo os macroblocos de referência a serem utilizados pela predição intra.

58 58 Figura 0 Etapas do módulo computacional. A solução proposta explora dois tipos de paralelismo. O primeiro deles se deve à paralelização das operações executadas dentro de cada algoritmo. Isto é possível devido à independência de cada posição da matriz em relação as demais. Já o segundo tipo de paralelismo refere-se a diferentes tarefas dentro do laço de codificação, mais especificamente o fornecimento de um macrobloco quantizado ao codificador de entropia enquanto o módulo computacional já está processando os próximos macroblocos. A implementação proposta organiza a execução do kernel em blocos com 6x6x threads, ou seja, os blocos tridimensionais da arquitetura CUDA foram diretamente mapeados para os macroblocos da imagem. Já as dimensões do grid, que definem a quantidade de blocos, são calculadas de acordo com o tamanho do vídeo que estiver sendo codificado. A Figura apresenta uma visão geral do funcionamento do kernel proposto. Figura Arquitetura proposta para módulo computacional usando GPUs NVIDIA (HUSEMANN et al., 0b). Um ponto importante é a minimização da quantidade de acessos à memória global devido à alta latência deste acessos. Por este motivo, a memória compartilhada, que possui acesso mais veloz, foi utilizada como uma espécie de cache. Dessa forma, cada bloco de threads quando alocado para execução em um SM copia um macrobloco da memória global. Como cada thread copia o seu respectivo elemento do macrobloco, essas cópias podem ser combinadas em um menor número de transações de acesso à memória global. Após isto, a memória global só é acessada novamente para disponibilizar os dados de saída.

Organização e Arquitetura de Computadores I. de Computadores

Organização e Arquitetura de Computadores I. de Computadores Universidade Federal de Campina Grande Departamento de Sistemas e Computação Curso de Bacharelado em Ciência da Computação Organização e Arquitetura de I Organização Básica B de (Parte V, Complementar)

Leia mais

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware

O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware 1 2 Revisão de Hardware 2.1 Hardware O hardware é a parte física do computador, como o processador, memória, placamãe, entre outras. Figura 2.1 Sistema Computacional Hardware 2.1.1 Processador O Processador

Leia mais

PARALELIZAÇÃO DE APLICAÇÕES NA ARQUITETURA CUDA: UM ESTUDO SOBRE VETORES 1

PARALELIZAÇÃO DE APLICAÇÕES NA ARQUITETURA CUDA: UM ESTUDO SOBRE VETORES 1 PARALELIZAÇÃO DE APLICAÇÕES NA ARQUITETURA CUDA: UM ESTUDO SOBRE VETORES 1 DUTRA, Evandro Rogério Fruhling 2 ; VARINI, Andre Luis 2 ; CANAL, Ana Paula 2 1 Trabalho de Iniciação Científica _UNIFRA 2 Ciência

Leia mais

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia

BACHARELADO EM SISTEMAS DE INFORMAÇÃO EaD UAB/UFSCar Sistemas de Informação - prof. Dr. Hélio Crestana Guardia O Sistema Operacional que você usa é multitasking? Por multitasking, entende-se a capacidade do SO de ter mais de um processos em execução ao mesmo tempo. É claro que, num dado instante, o número de processos

Leia mais

1. NÍVEL CONVENCIONAL DE MÁQUINA

1. NÍVEL CONVENCIONAL DE MÁQUINA 1. NÍVEL CONVENCIONAL DE MÁQUINA Relembrando a nossa matéria de Arquitetura de Computadores, a arquitetura de Computadores se divide em vários níveis como já estudamos anteriormente. Ou seja: o Nível 0

Leia mais

7 Processamento Paralelo

7 Processamento Paralelo 7 Processamento Paralelo Yes, of course, who has time? Who has time? But then if we do not ever take time, how can we ever have time? (The Matrix) 7.1 Introdução Classificação de Sistemas Paralelos Diversas

Leia mais

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias:

3/9/2010. Ligação da UCP com o barramento do. sistema. As funções básicas dos registradores nos permitem classificá-los em duas categorias: Arquitetura de Computadores Estrutura e Funcionamento da CPU Prof. Marcos Quinet Universidade Federal Fluminense P.U.R.O. Revisão dos conceitos básicos O processador é o componente vital do sistema de

Leia mais

BARRAMENTO DO SISTEMA

BARRAMENTO DO SISTEMA BARRAMENTO DO SISTEMA Memória Principal Processador Barramento local Memória cachê/ ponte Barramento de sistema SCSI FireWire Dispositivo gráfico Controlador de vídeo Rede Local Barramento de alta velocidade

Leia mais

7.Conclusão e Trabalhos Futuros

7.Conclusão e Trabalhos Futuros 7.Conclusão e Trabalhos Futuros 158 7.Conclusão e Trabalhos Futuros 7.1 Conclusões Finais Neste trabalho, foram apresentados novos métodos para aceleração, otimização e gerenciamento do processo de renderização

Leia mais

Paralelismo. Computadores de alto-desempenho são utilizados em diversas áreas:

Paralelismo. Computadores de alto-desempenho são utilizados em diversas áreas: Computadores de alto-desempenho são utilizados em diversas áreas: - análise estrutural; - previsão de tempo; - exploração de petróleo; - pesquisa em fusão de energia; - diagnóstico médico; - simulações

Leia mais

SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA

SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA SISTEMAS OPERACIONAIS CAPÍTULO 3 CONCORRÊNCIA 1. INTRODUÇÃO O conceito de concorrência é o princípio básico para o projeto e a implementação dos sistemas operacionais multiprogramáveis. O sistemas multiprogramáveis

Leia mais

CAPÍTULO 2 CARACTERÍSTICAS DE E/S E PORTA PARALELA

CAPÍTULO 2 CARACTERÍSTICAS DE E/S E PORTA PARALELA 8 CAPÍTULO 2 CARACTERÍSTICAS DE E/S E PORTA PARALELA A porta paralela, também conhecida por printer port ou Centronics e a porta serial (RS-232) são interfaces bastante comuns que, apesar de estarem praticamente

Leia mais

Codificação/Compressão de Vídeo. Tópico: Vídeo (Codificação + Compressão)

Codificação/Compressão de Vídeo. Tópico: Vídeo (Codificação + Compressão) Tópico: Vídeo (Codificação + Compressão) Um vídeo pode ser considerado como uma seqüência de imagens estáticas (quadros). Cada um desses quadros pode ser codificado usando as mesmas técnicas empregadas

Leia mais

Arquiteturas RISC. (Reduced Instructions Set Computers)

Arquiteturas RISC. (Reduced Instructions Set Computers) Arquiteturas RISC (Reduced Instructions Set Computers) 1 INOVAÇÕES DESDE O SURGIMENTO DO COMPU- TADOR DE PROGRAMA ARMAZENADO (1950)! O conceito de família: desacoplamento da arquitetura de uma máquina

Leia mais

Sistemas Distribuídos

Sistemas Distribuídos Sistemas Distribuídos Modelo Cliente-Servidor: Introdução aos tipos de servidores e clientes Prof. MSc. Hugo Souza Iniciando o módulo 03 da primeira unidade, iremos abordar sobre o Modelo Cliente-Servidor

Leia mais

Sistema de Computação

Sistema de Computação Sistema de Computação Máquinas multinível Nível 0 verdadeiro hardware da máquina, executando os programas em linguagem de máquina de nível 1 (portas lógicas); Nível 1 Composto por registrados e pela ALU

Leia mais

Sistemas Operativos. Threads. 3º ano - ESI e IGE (2011/2012) Engenheiro Anilton Silva Fernandes (afernandes@unipiaget.cv)

Sistemas Operativos. Threads. 3º ano - ESI e IGE (2011/2012) Engenheiro Anilton Silva Fernandes (afernandes@unipiaget.cv) Sistemas Operativos Threads 3º ano - ESI e IGE (2011/2012) Engenheiro Anilton Silva Fernandes (afernandes@unipiaget.cv) Dos Processos para os Threads O conceito de thread foi introduzido na tentativa de

Leia mais

Bruno Pereira Evangelista. www.brunoevangelista.com

Bruno Pereira Evangelista. www.brunoevangelista.com Bruno Pereira Evangelista www.brunoevangelista.com 2 Introdução Shaders Pipeline de Renderização Evolução dos Shaders Como Programar Shaders Programando Shaders com XNA Ferramentas Conclusões 3 Durante

Leia mais

Informática I. Aula 5. http://www.ic.uff.br/~bianca/informatica1/ Aula 5-13/05/2006 1

Informática I. Aula 5. http://www.ic.uff.br/~bianca/informatica1/ Aula 5-13/05/2006 1 Informática I Aula 5 http://www.ic.uff.br/~bianca/informatica1/ Aula 5-13/05/2006 1 Ementa Histórico dos Computadores Noções de Hardware e Software Microprocessadores Sistemas Numéricos e Representação

Leia mais

Capítulo 3. Avaliação de Desempenho. 3.1 Definição de Desempenho

Capítulo 3. Avaliação de Desempenho. 3.1 Definição de Desempenho 20 Capítulo 3 Avaliação de Desempenho Este capítulo aborda como medir, informar e documentar aspectos relativos ao desempenho de um computador. Além disso, descreve os principais fatores que influenciam

Leia mais

Disciplina: Introdução à Informática Profª Érica Barcelos

Disciplina: Introdução à Informática Profª Érica Barcelos Disciplina: Introdução à Informática Profª Érica Barcelos CAPÍTULO 4 1. ARQUITETURA DO COMPUTADOR- HARDWARE Todos os componentes físicos constituídos de circuitos eletrônicos interligados são chamados

Leia mais

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann

NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann Universidade Federal de Santa Maria NOTAS DE AULA Prof. Antonio Carlos Schneider Beck Filho (UFSM) Prof. Júlio Carlos Balzano de Mattos (UFPel) Arquitetura de Von Neumann O modelo (ou arquitetura) de von

Leia mais

Técnicas de Manutenção de Computadores

Técnicas de Manutenção de Computadores Técnicas de Manutenção de Computadores Professor: Luiz Claudio Ferreira de Souza Processadores É indispensável em qualquer computador, tem a função de gerenciamento, controlando todas as informações de

Leia mais

Arquitetura de Computadores - Arquitetura RISC. por Helcio Wagner da Silva

Arquitetura de Computadores - Arquitetura RISC. por Helcio Wagner da Silva Arquitetura de Computadores - Arquitetura RISC por Helcio Wagner da Silva Introdução RISC = Reduced Instruction Set Computer Elementos básicos: Grande número de registradores de propósito geral ou uso

Leia mais

Unidade 13: Paralelismo:

Unidade 13: Paralelismo: Arquitetura e Organização de Computadores 1 Unidade 13: Paralelismo: SMP e Processamento Vetorial Prof. Daniel Caetano Objetivo: Apresentar os conceitos fundamentais da arquitetura SMP e alguns detalhes

Leia mais

3. Arquitetura Básica do Computador

3. Arquitetura Básica do Computador 3. Arquitetura Básica do Computador 3.1. Modelo de Von Neumann Dar-me-eis um grão de trigo pela primeira casa do tabuleiro; dois pela segunda, quatro pela terceira, oito pela quarta, e assim dobrando sucessivamente,

Leia mais

Arquitetura de Computadores Paralelismo, CISC X RISC, Interpretação X Tradução, Caminho de dados

Arquitetura de Computadores Paralelismo, CISC X RISC, Interpretação X Tradução, Caminho de dados Arquitetura de Computadores Paralelismo, CISC X RISC, Interpretação X Tradução, Caminho de dados Organização de um Computador Típico Memória: Armazena dados e programas. Processador (CPU - Central Processing

Leia mais

Tecnologia PCI express. Introdução. Tecnologia PCI Express

Tecnologia PCI express. Introdução. Tecnologia PCI Express Tecnologia PCI express Introdução O desenvolvimento de computadores cada vez mais rápidos e eficientes é uma necessidade constante. No que se refere ao segmento de computadores pessoais, essa necessidade

Leia mais

Máquinas Multiníveis

Máquinas Multiníveis Infra-Estrutura de Hardware Máquinas Multiníveis Prof. Edilberto Silva www.edilms.eti.br edilms@yahoo.com Sumário Conceitos básicos Classificação de arquiteturas Tendências da tecnologia Família Pentium

Leia mais

OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora

OpenGL. Uma Abordagem Prática e Objetiva. Marcelo Cohen Isabel Harb Manssour. Novatec Editora OpenGL Uma Abordagem Prática e Objetiva Marcelo Cohen Isabel Harb Manssour Novatec Editora Capítulo 1 Introdução A Computação Gráfica é uma área da Ciência da Computação que se dedica ao estudo e ao desenvolvimento

Leia mais

Placas de Vídeo. Prof. Alexandre Beletti Ferreira

Placas de Vídeo. Prof. Alexandre Beletti Ferreira Placas de Vídeo Prof. Alexandre Beletti Ferreira Introdução Dispositivo responsável pela comunicação entre a placa mãe e o monitor de vídeo para reproduzir imagens. Dispositivo básico de output. Converte

Leia mais

1. CAPÍTULO COMPUTADORES

1. CAPÍTULO COMPUTADORES 1. CAPÍTULO COMPUTADORES 1.1. Computadores Denomina-se computador uma máquina capaz de executar variados tipos de tratamento automático de informações ou processamento de dados. Os primeiros eram capazes

Leia mais

29/3/2011. Primeira unidade de execução (pipe U): unidade de processamento completa, capaz de processar qualquer instrução;

29/3/2011. Primeira unidade de execução (pipe U): unidade de processamento completa, capaz de processar qualquer instrução; Em 1993, foi lançada a primeira versão do processador Pentium, que operava a 60 MHz Além do uso otimizado da memória cache (tecnologia já amadurecida) e da multiplicação do clock, o Pentium passou a utilizar

Leia mais

Sistemas Computacionais II Professor Frederico Sauer

Sistemas Computacionais II Professor Frederico Sauer Sistemas Computacionais II Professor Frederico Sauer Livro-texto: Introdução à Organização de Computadores 4ª edição Mário A. Monteiro Livros Técnicos e Científicos Editora. Atenção: Este material não

Leia mais

Unidade Central de Processamento (CPU) Processador. Renan Manola Introdução ao Computador 2010/01

Unidade Central de Processamento (CPU) Processador. Renan Manola Introdução ao Computador 2010/01 Unidade Central de Processamento (CPU) Processador Renan Manola Introdução ao Computador 2010/01 Componentes de um Computador (1) Computador Eletrônico Digital É um sistema composto por: Memória Principal

Leia mais

Processos e Threads (partes I e II)

Processos e Threads (partes I e II) Processos e Threads (partes I e II) 1) O que é um processo? É qualquer aplicação executada no processador. Exe: Bloco de notas, ler um dado de um disco, mostrar um texto na tela. Um processo é um programa

Leia mais

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP)

Hardware (Nível 0) Organização. Interface de Máquina (IM) Interface Interna de Microprogramação (IIMP) Hardware (Nível 0) Organização O AS/400 isola os usuários das características do hardware através de uma arquitetura de camadas. Vários modelos da família AS/400 de computadores de médio porte estão disponíveis,

Leia mais

Figura 1 - O computador

Figura 1 - O computador Organização e arquitectura dum computador Índice Índice... 2 1. Introdução... 3 2. Representação da informação no computador... 4 3. Funcionamento básico dum computador... 5 4. Estrutura do processador...

Leia mais

Notas da Aula 17 - Fundamentos de Sistemas Operacionais

Notas da Aula 17 - Fundamentos de Sistemas Operacionais Notas da Aula 17 - Fundamentos de Sistemas Operacionais 1. Gerenciamento de Memória: Introdução O gerenciamento de memória é provavelmente a tarefa mais complexa de um sistema operacional multiprogramado.

Leia mais

Capacidade = 512 x 300 x 20000 x 2 x 5 = 30.720.000.000 30,72 GB

Capacidade = 512 x 300 x 20000 x 2 x 5 = 30.720.000.000 30,72 GB Calculando a capacidade de disco: Capacidade = (# bytes/setor) x (méd. # setores/trilha) x (# trilhas/superfície) x (# superfícies/prato) x (# pratos/disco) Exemplo 01: 512 bytes/setor 300 setores/trilha

Leia mais

Memória cache. Prof. Francisco Adelton

Memória cache. Prof. Francisco Adelton Memória cache Prof. Francisco Adelton Memória Cache Seu uso visa obter uma velocidade de acesso à memória próxima da velocidade das memórias mais rápidas e, ao mesmo tempo, disponibilizar no sistema uma

Leia mais

Aula 26: Arquiteturas RISC vs. CISC

Aula 26: Arquiteturas RISC vs. CISC Aula 26: Arquiteturas RISC vs CISC Diego Passos Universidade Federal Fluminense Fundamentos de Arquiteturas de Computadores Diego Passos (UFF) Arquiteturas RISC vs CISC FAC 1 / 33 Revisão Diego Passos

Leia mais

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira

IFPE. Disciplina: Sistemas Operacionais. Prof. Anderson Luiz Moreira IFPE Disciplina: Sistemas Operacionais Prof. Anderson Luiz Moreira SERVIÇOS OFERECIDOS PELOS SOS 1 Introdução O SO é formado por um conjunto de rotinas (procedimentos) que oferecem serviços aos usuários

Leia mais

Sistemas Operacionais Processos e Threads

Sistemas Operacionais Processos e Threads Sistemas Operacionais Processos e Threads Prof. Marcos Monteiro, MBA http://www.marcosmonteiro.com.br contato@marcosmonteiro.com.br 1 Estrutura de um Sistema Operacional 2 GERÊNCIA DE PROCESSOS Um processo

Leia mais

Sistemas Operacionais Gerência de Dispositivos

Sistemas Operacionais Gerência de Dispositivos Universidade Estadual de Mato Grosso do Sul UEMS Curso de Licenciatura em Computação Sistemas Operacionais Gerência de Dispositivos Prof. José Gonçalves Dias Neto profneto_ti@hotmail.com Introdução A gerência

Leia mais

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert:

BRAlarmExpert. Software para Gerenciamento de Alarmes. BENEFÍCIOS obtidos com a utilização do BRAlarmExpert: BRAlarmExpert Software para Gerenciamento de Alarmes A TriSolutions conta com um produto diferenciado para gerenciamento de alarmes que é totalmente flexível e amigável. O software BRAlarmExpert é uma

Leia mais

Compressão com perdas

Compressão com perdas Compressão com perdas Codificação por transformadas e o padrão JPEG Anderson L Menezes Leonardo G Tampelini Maxiwell S Garcia Introdução Um método é dito com perdas (lossy data) quando a informação obtida

Leia mais

5. EXPERIÊNCIAS E ANÁLISE DOS RESULTADOS. 5.1 - Os Programas de Avaliação

5. EXPERIÊNCIAS E ANÁLISE DOS RESULTADOS. 5.1 - Os Programas de Avaliação 36 5. EXPERIÊNCIAS E ANÁLISE DOS RESULTADOS 5.1 - Os Programas de Avaliação Programas de avaliação convencionais foram utilizados para análise de diversas configurações da arquitetura. Estes programas

Leia mais

Quadro de consulta (solicitação do mestre)

Quadro de consulta (solicitação do mestre) Introdução ao protocolo MODBUS padrão RTU O Protocolo MODBUS foi criado no final dos anos 70 para comunicação entre controladores da MODICON. Por ser um dos primeiros protocolos com especificação aberta

Leia mais

Introdução à Organização de Computadores Entrada e Saída. Sistemas da Computação Prof. Rossano Pablo Pinto, Msc. rossano at gmail com 2 semestre 2007

Introdução à Organização de Computadores Entrada e Saída. Sistemas da Computação Prof. Rossano Pablo Pinto, Msc. rossano at gmail com 2 semestre 2007 Introdução à Organização de Computadores Entrada e Saída Sistemas da Computação Prof. Rossano Pablo Pinto, Msc. rossano at gmail com 2 semestre 2007 Tópicos Processadores Memória Principal Memória Secundária

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais Gerência de processos Controle e descrição de processos Edson Moreno edson.moreno@pucrs.br http://www.inf.pucrs.br/~emoreno Sumário Representação e controle de processos pelo SO Estrutura

Leia mais

Ao longo do presente capítulo será apresentada uma descrição introdutória da tecnologia FPGA e dos módulos básicos que a constitui.

Ao longo do presente capítulo será apresentada uma descrição introdutória da tecnologia FPGA e dos módulos básicos que a constitui. 3 Tecnologia FPGA Ao longo do presente capítulo será apresentada uma descrição introdutória da tecnologia FPGA e dos módulos básicos que a constitui. 3.1. FPGA: Histórico, linguagens e blocos Muitos dos

Leia mais

ORGANIZAÇÃO DE COMPUTADORES MÓDULO 8

ORGANIZAÇÃO DE COMPUTADORES MÓDULO 8 ORGANIZAÇÃO DE COMPUTADORES MÓDULO 8 Índice 1. A Organização do Computador - Continuação...3 1.1. Processadores - II... 3 1.1.1. Princípios de projeto para computadores modernos... 3 1.1.2. Paralelismo...

Leia mais

Capítulo 4. MARIE (Machine Architecture Really Intuitive and Easy)

Capítulo 4. MARIE (Machine Architecture Really Intuitive and Easy) Capítulo 4 João Lourenço Joao.Lourenco@di.fct.unl.pt Faculdade de Ciências e Tecnologia Universidade Nova de Lisboa 2007-2008 MARIE (Machine Architecture Really Intuitive and Easy) Adaptado dos transparentes

Leia mais

Dadas a base e a altura de um triangulo, determinar sua área.

Dadas a base e a altura de um triangulo, determinar sua área. Disciplina Lógica de Programação Visual Ana Rita Dutra dos Santos Especialista em Novas Tecnologias aplicadas a Educação Mestranda em Informática aplicada a Educação ana.santos@qi.edu.br Conceitos Preliminares

Leia mais

TRABALHO COM GRANDES MONTAGENS

TRABALHO COM GRANDES MONTAGENS Texto Técnico 005/2013 TRABALHO COM GRANDES MONTAGENS Parte 05 0 Vamos finalizar o tema Trabalho com Grandes Montagens apresentando os melhores recursos e configurações de hardware para otimizar a abertura

Leia mais

SIS17-Arquitetura de Computadores

SIS17-Arquitetura de Computadores Sistema de Computação SIS17-Arquitetura de Computadores Apresentação da Disciplina Peopleware Hardware Software Carga Horária: 40 horas 2 Computadores atuais Unidade Central de Processamento Entrada Computadores

Leia mais

Capítulo 8 Arquitetura de Computadores Paralelos

Capítulo 8 Arquitetura de Computadores Paralelos Capítulo 8 Arquitetura de Computadores Paralelos Necessidade de máquinas com alta capacidade de computação Aumento do clock => alta dissipação de calor Velocidade limitada dos circuitos => velocidade da

Leia mais

INSTITUTO DE EMPREGO E FORMAÇÃO PROFISSIONAL, I.P.

INSTITUTO DE EMPREGO E FORMAÇÃO PROFISSIONAL, I.P. INSTITUTO DE EMPREGO E FORMAÇÃO PROFISSIONAL, I.P. Centro de Emprego e Formação Profissional da Guarda Curso: Técnico de Informática Sistemas (EFA-S4A)-NS Trabalho Realizado Por: Igor_Saraiva nº 7 Com

Leia mais

1 http://www.google.com

1 http://www.google.com 1 Introdução A computação em grade se caracteriza pelo uso de recursos computacionais distribuídos em várias redes. Os diversos nós contribuem com capacidade de processamento, armazenamento de dados ou

Leia mais

1.1. Organização de um Sistema Computacional

1.1. Organização de um Sistema Computacional 1. INTRODUÇÃO 1.1. Organização de um Sistema Computacional Desde a antiguidade, o homem vem desenvolvendo dispositivos elétricoeletrônicos (hardware) que funciona com base em instruções e que são capazes

Leia mais

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO

Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Conceitos básicos e serviços do Sistema Operacional Prof. Marcos Ribeiro Quinet de Andrade Universidade Federal Fluminense - UFF Pólo Universitário de Rio das Ostras - PURO Tipos de serviço do S.O. O S.O.

Leia mais

Visão Geral de Hardwares de Renderização e Ferramentas de Avaliação. Carlos Eduardo Rodrigues

Visão Geral de Hardwares de Renderização e Ferramentas de Avaliação. Carlos Eduardo Rodrigues Visão Geral de Hardwares de Renderização e Ferramentas de Avaliação Carlos Eduardo Rodrigues Motivação Os chips gráficos monolíticos da década de 80 evoluíram bastante, e hoje são denominados GPUs (Graphics

Leia mais

Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA

Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA Desenvolvendo uma Arquitetura de Componentes Orientada a Serviço SCA RESUMO Ricardo Della Libera Marzochi A introdução ao Service Component Architecture (SCA) diz respeito ao estudo dos principais fundamentos

Leia mais

ISO/IEC 12207: Gerência de Configuração

ISO/IEC 12207: Gerência de Configuração ISO/IEC 12207: Gerência de Configuração Durante o processo de desenvolvimento de um software, é produzida uma grande quantidade de itens de informação que podem ser alterados durante o processo Para que

Leia mais

Cálculo Aproximado do número PI utilizando Programação Paralela

Cálculo Aproximado do número PI utilizando Programação Paralela Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Cálculo Aproximado do número PI utilizando Programação Paralela Grupo 17 Raphael Ferras Renan Pagaiane Yule Vaz SSC-0143 Programação

Leia mais

ARQUITETURA DE COMPUTADORES - 1866

ARQUITETURA DE COMPUTADORES - 1866 7 Unidade Central de Processamento (UCP): O processador é o componente vital do sistema de computação, responsável pela realização das operações de processamento e de controle, durante a execução de um

Leia mais

FACULDADE DE ENGENHARIA DE COMPUTAÇÃO. PROJETO FINAL I e II PLANO DE TRABALHO <NOME DO TRABALHO> <Nome do Aluno> <Nome do Orientador>

FACULDADE DE ENGENHARIA DE COMPUTAÇÃO. PROJETO FINAL I e II PLANO DE TRABALHO <NOME DO TRABALHO> <Nome do Aluno> <Nome do Orientador> FACULDADE DE ENGENHARIA DE COMPUTAÇÃO PROJETO FINAL I e II PLANO DE TRABALHO O Trabalho de Conclusão de Curso (TCC) a ser desenvolvido

Leia mais

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia.

Na medida em que se cria um produto, o sistema de software, que será usado e mantido, nos aproximamos da engenharia. 1 Introdução aos Sistemas de Informação 2002 Aula 4 - Desenvolvimento de software e seus paradigmas Paradigmas de Desenvolvimento de Software Pode-se considerar 3 tipos de paradigmas que norteiam a atividade

Leia mais

Fundamentos de Hardware

Fundamentos de Hardware Fundamentos de Hardware Curso Técnico em Informática SUMÁRIO PLACAS DE EXPANSÃO... 3 PLACAS DE VÍDEO... 3 Conectores de Vídeo... 4 PLACAS DE SOM... 6 Canais de Áudio... 7 Resolução das Placas de Som...

Leia mais

Curso de Instalação e Gestão de Redes Informáticas

Curso de Instalação e Gestão de Redes Informáticas ESCOLA PROFISSIONAL VASCONCELLOS LEBRE Curso de Instalação e Gestão de Redes Informáticas LIGADORES DE VIDEO: VGA, DVI, S-VIDEO E COMPONENTE VIDEO José Vitor Nogueira Santos FT2-0749 Mealhada, 2009 Introdução

Leia mais

Organização de Computadores 1

Organização de Computadores 1 Organização de Computadores 1 SISTEMA DE INTERCONEXÃO (BARRAMENTOS) Prof. Luiz Gustavo A. Martins Arquitetura de von Newmann Componentes estruturais: Memória Principal Unidade de Processamento Central

Leia mais

Um Driver NDIS Para Interceptação de Datagramas IP

Um Driver NDIS Para Interceptação de Datagramas IP Um Driver NDIS Para Interceptação de Datagramas IP Paulo Fernando da Silva psilva@senior.com.br Sérgio Stringari stringari@furb.br Resumo. Este artigo apresenta o desenvolvimento de um driver NDIS 1 para

Leia mais

CISC RISC Introdução A CISC (em inglês: Complex Instruction Set Computing, Computador com um Conjunto Complexo de Instruções), usada em processadores Intel e AMD; suporta mais instruções no entanto, com

Leia mais

O processador é composto por: Unidade de controlo - Interpreta as instruções armazenadas; - Dá comandos a todos os elementos do sistema.

O processador é composto por: Unidade de controlo - Interpreta as instruções armazenadas; - Dá comandos a todos os elementos do sistema. O processador é composto por: Unidade de controlo - Interpreta as instruções armazenadas; - Dá comandos a todos os elementos do sistema. Unidade aritmética e lógica - Executa operações aritméticas (cálculos);

Leia mais

Visão Geral da Arquitetura de Computadores. Prof. Elthon Scariel Dias

Visão Geral da Arquitetura de Computadores. Prof. Elthon Scariel Dias Visão Geral da Arquitetura de Computadores Prof. Elthon Scariel Dias O que é Arquitetura de Computadores? Há várias definições para o termo arquitetura de computadores : É a estrutura e comportamento de

Leia mais

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software

PROCESSO DE DESENVOLVIMENTO DE SOFTWARE. Modelos de Processo de Desenvolvimento de Software PROCESSO DE DESENVOLVIMENTO DE SOFTWARE Introdução Modelos de Processo de Desenvolvimento de Software Os modelos de processos de desenvolvimento de software surgiram pela necessidade de dar resposta às

Leia mais

Microarquiteturas Avançadas

Microarquiteturas Avançadas Univ ersidade Federal do Rio de Janei ro Info rmátic a DCC/IM Arquitetura de Computadores II Microarquiteturas Avançadas Gabrie l P. Silva Introdução As arquiteturas dos processadores têm evoluído ao longo

Leia mais

FACULDADE PITÁGORAS DISCIPLINA: ARQUITETURA DE COMPUTADORES

FACULDADE PITÁGORAS DISCIPLINA: ARQUITETURA DE COMPUTADORES FACULDADE PITÁGORAS DISCIPLINA: ARQUITETURA DE COMPUTADORES Prof. Ms. Carlos José Giudice dos Santos cpgcarlos@yahoo.com.br www.oficinadapesquisa.com.br Conceito de Computador Um computador digital é

Leia mais

Bits internos e bits externos. Barramentos. Processadores Atuais. Conceitos Básicos Microprocessadores. Sumário. Introdução.

Bits internos e bits externos. Barramentos. Processadores Atuais. Conceitos Básicos Microprocessadores. Sumário. Introdução. Processadores Atuais Eduardo Amaral Sumário Introdução Conceitos Básicos Microprocessadores Barramentos Bits internos e bits externos Clock interno e clock externo Memória cache Co-processador aritmético

Leia mais

LICENCIATURA EM COMPUTAÇÃO PROCESSADOR TEGRA 2

LICENCIATURA EM COMPUTAÇÃO PROCESSADOR TEGRA 2 LICENCIATURA EM COMPUTAÇÃO PROCESSADOR TEGRA 2 SANTO AMARO 2011 ANGELO RAMOS JACKELINE BARBOSA JEANDERVAL SANTOS PROCESSADOR TEGRA 2 Trabalho apresentado ao Instituto Federal de Ciências e Tecnologia da

Leia mais

COMPUTAÇÃO GRÁFICA REPRESENTAÇÃO DE IMAGENS

COMPUTAÇÃO GRÁFICA REPRESENTAÇÃO DE IMAGENS COMPUTAÇÃO GRÁFICA REPRESENTAÇÃO DE IMAGENS Curso: Tecnológico em Análise e Desenvolvimento de Sistemas Disciplina: COMPUTAÇÃO GRÁFICA 4º Semestre Prof. AFONSO MADEIRA ARQUITETURA GRÁFICA Frame-buffer

Leia mais

Multiplexador. Permitem que vários equipamentos compartilhem um único canal de comunicação

Multiplexador. Permitem que vários equipamentos compartilhem um único canal de comunicação Multiplexadores Permitem que vários equipamentos compartilhem um único canal de comunicação Transmissor 1 Receptor 1 Transmissor 2 Multiplexador Multiplexador Receptor 2 Transmissor 3 Receptor 3 Economia

Leia mais

Sistemas Operacionais

Sistemas Operacionais Sistemas Operacionais SISTEMAS COM MÚLTIPLOS PROCESSADORES LIVRO TEXTO: CAPÍTULO 13, PÁGINA 243 Prof. Pedro Luís Antonelli Anhanguera Educacional INTRODUÇÃO Arquiteturas que possuem duas ou mais CPUs interligadas

Leia mais

Metodologias de Desenvolvimento de Sistemas. Analise de Sistemas I UNIPAC Rodrigo Videschi

Metodologias de Desenvolvimento de Sistemas. Analise de Sistemas I UNIPAC Rodrigo Videschi Metodologias de Desenvolvimento de Sistemas Analise de Sistemas I UNIPAC Rodrigo Videschi Histórico Uso de Metodologias Histórico Uso de Metodologias Era da Pré-Metodologia 1960-1970 Era da Metodologia

Leia mais

Scalable Vector Graphics. Kadu Neves Rafael Rocha

Scalable Vector Graphics. Kadu Neves Rafael Rocha Scalable Vector Graphics Kadu Neves Rafael Rocha Roteiro Introdução Vantagens do Uso do SVG Perfis SVG A especificaçào JSR-226 Exemplos Introdução Scalable Vector Graphics é um padrão aberto para descrever

Leia mais

Arquitetura de processadores: RISC e CISC

Arquitetura de processadores: RISC e CISC Arquitetura de processadores: RISC e CISC A arquitetura de processador descreve o processador que foi usado em um computador. Grande parte dos computadores vêm com identificação e literatura descrevendo

Leia mais

RISC X CISC - Pipeline

RISC X CISC - Pipeline RISC X CISC - Pipeline IFBA Instituto Federal de Educ. Ciencia e Tec Bahia Curso de Analise e Desenvolvimento de Sistemas Arquitetura de Computadores 25 e 26/30 Prof. Msc. Antonio Carlos Souza Referências

Leia mais

Prof. Esp. Lucas Cruz

Prof. Esp. Lucas Cruz Prof. Esp. Lucas Cruz O hardware é qualquer tipo de equipamento eletrônico utilizado para processar dados e informações e tem como função principal receber dados de entrada, processar dados de um usuário

Leia mais

Componentes do Computador e. aula 3. Profa. Débora Matos

Componentes do Computador e. aula 3. Profa. Débora Matos Componentes do Computador e modelo de Von Neumann aula 3 Profa. Débora Matos O que difere nos componentes que constituem um computador? Princípios básicos Cada computador tem um conjunto de operações e

Leia mais

HARDWARE GRÁFICO. Adair Santa Catarina Curso de Ciência da Computação Unioeste Campus de Cascavel PR

HARDWARE GRÁFICO. Adair Santa Catarina Curso de Ciência da Computação Unioeste Campus de Cascavel PR HARDWARE GRÁFICO Adair Santa Catarina Curso de Ciência da Computação Unioeste Campus de Cascavel PR Mar/2012 Introdução Características do hardware Funcionalidades do hardware gráfico Influência da área

Leia mais

Introdução às arquiteturas paralelas e taxonomia de Flynn

Introdução às arquiteturas paralelas e taxonomia de Flynn Introdução às arquiteturas paralelas e taxonomia de Flynn OBJETIVO: definir computação paralela; o modelo de computação paralela desempenhada por computadores paralelos; e exemplos de uso da arquitetura

Leia mais

MUDANÇAS NA ISO 9001: A VERSÃO 2015

MUDANÇAS NA ISO 9001: A VERSÃO 2015 MUDANÇAS NA ISO 9001: A VERSÃO 2015 Está em andamento o processo de revisão da Norma ISO 9001: 2015, que ao ser concluído resultará na mudança mais significativa já efetuada. A chamada família ISO 9000

Leia mais

28/9/2010. Paralelismo no nível de instruções Processadores superescalares

28/9/2010. Paralelismo no nível de instruções Processadores superescalares Arquitetura de Computadores Paralelismo no nível de instruções Processadores superescalares Prof. Marcos Quinet Universidade Federal Fluminense P.U.R.O. Processadores superescalares A partir dos resultados

Leia mais

Hardware de Computadores

Hardware de Computadores Placa Mãe Hardware de Computadores Introdução Placa-mãe, também denominada mainboard ou motherboard, é uma placa de circuito impresso eletrônico. É considerado o elemento mais importante de um computador,

Leia mais

Conceitos de Banco de Dados

Conceitos de Banco de Dados Conceitos de Banco de Dados Autor: Luiz Antonio Junior 1 INTRODUÇÃO Objetivos Introduzir conceitos básicos de Modelo de dados Introduzir conceitos básicos de Banco de dados Capacitar o aluno a construir

Leia mais

AULA4: PROCESSADORES. Figura 1 Processadores Intel e AMD.

AULA4: PROCESSADORES. Figura 1 Processadores Intel e AMD. AULA4: PROCESSADORES 1. OBJETIVO Figura 1 Processadores Intel e AMD. Conhecer as funcionalidades dos processadores nos computadores trabalhando suas principais características e aplicações. 2. INTRODUÇÃO

Leia mais

Programação de Sistemas

Programação de Sistemas Programação de Sistemas Introdução à gestão de memória Programação de Sistemas Gestão de memória : 1/16 Introdução (1) A memória central de um computador é escassa. [1981] IBM PC lançado com 64KB na motherboard,

Leia mais

5 Mecanismo de seleção de componentes

5 Mecanismo de seleção de componentes Mecanismo de seleção de componentes 50 5 Mecanismo de seleção de componentes O Kaluana Original, apresentado em detalhes no capítulo 3 deste trabalho, é um middleware que facilita a construção de aplicações

Leia mais

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi

Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi 5 Conclusão Esta dissertação apresentou duas abordagens para integração entre a linguagem Lua e o Common Language Runtime. O objetivo principal da integração foi permitir que scripts Lua instanciem e usem

Leia mais