CMP 167– Programação com Objetos Distribuídos
Prof. Cláudio Geyer
Eduarda Monteiro
Porto Alegre, Julho de 2012
Algoritmo Paralelo para Estimação de Movimento
2
Sumário Introdução
Conceitos Básicos
Implementação
Resultados
Conclusão
Conceitos Básicos
Compressão de Vídeos Digitais
3
Quadro Blocos
Particionamento em blocos 16x16 16x8 4x88x8 4x4
x
y
Número de Pixels
Vídeo
Tn
Tn+1
Tn+2
Tn+3
Conceitos Básicos
Compressão de Vídeos Digitais
4
Predição INTER
Conceitos Básicos Diagrama de Blocos de um Codificador de
Vídeo
5
Quadro deReferência
+Quadro Atual(reconstruído
)IT
Compensação de Movimento
Codificação de Entropia
Predição INTRA
IQ
- T QQuadro Atual
(original)
Filtro
Estimação de Movimento
Conceitos Básicos
• Estimação de Movimento (ME)– Codificação de vídeo visa eliminar informações
redundantes;
– Explora a redundância temporal;• Alta correlação entre quadros consecutivos;
– Busca similaridades entre quadros vizinhos em um vídeo.• Procura em um (ou mais) quadros de referência
(previamente reconstruído) um bloco que se assemelha com o bloco do quadro atual – Melhor Casamento.
– Um vetor de movimento é gerado para cada bloco atual.
6
Conceitos Básicos Estimação de Movimento (ME)
7 Implementação e Análise de Algoritmos para ME em
Processadores Paralelos tipo GPU
Quadro de Referência Quadro Atual
Vetor de Movimento
Área de Busca
Conceitos Básicos
• Estimação de Movimento (ME)– Métrica de Comparação
• SAD (Sum of Absolute Differences)
– Emprega o uso de algoritmos para encontrar as similaridades existentes: • Algoritmos de Busca:
– Diversos algoritmos podem ser encontrados na literatura:» Full Search (FS)
8
Conceitos Básicos Estimação de Movimento
Algoritmo Full Search (FS) Exaustivo – maior custo computacional; Busca realizada de modo que os blocos se desloquem
pixel a pixel dentro da área de busca; Resultados ótimos
9
Conceitos Básicos Full Search
10
Quadro de Referência Quadro Atual
Vetor de Movimento
Área de Busca
11
Conceitos Básicos OpenMP
Paralelismo Explícito Anotações são realizadas pelo programador.
Memória Compartilhada Baseado em Threads
Variáveis podem ser: Compartilhadas: acesso por todas as threads Protegidas: duplicadas para cada thread.__________________________________________________
1. #include <omp.h>2. main() {3. 4. int var1, var2, var3;5. 6. parte_sequencial_1();7. #pragma omp parallel private(var1,var2) shared(var3) 8.{9.. parte_paralela(); // executada pelas threads10. ...11. }12. parte_sequencial_2(); }__________________________________________________
Implementação
12
Ideia GeralEntrada: Sequencia de Vídeo em diferentes formatos YUV Objetivo: Estimação de Movimento para diferentes áreas de busca de diversas dimensões
1: largura argumento {largura do quadro};2: altura argumento {altura do quadro}3: TamanhoAreaBusca argumento {dimensao da area de busca}4: NumQuadros 2 5: TamanhoBloco 4; 6:7: image sequencia de video 8: AreaBusca TamanhoAreaBusca x TamanhoAreaBusca {alocação da area de busca}9: Bloco Atual TamanhoBloco x TamanhoBloco {alocação bloco atual};10: PARA cada bloco atual do quadro11: carrega Bloco Atual12: carrega AreaBusca13:14: Realiza SAD;15:16: FIM PARA17: retorna Vetores Movimento
13
Implementação Versão OpenMP
1. SAD TamanhoBloco * TamanhoBloco * INT_MAX; {vetor que armazena menores valores de SAD}2. SAD_vector AreaBuscaL* AreaBuscaB; {vetor que armazena blocos candidatos}3. Num_Threads 4;4. Chunk_Full_Search floor(log(Search Area Size));5. Chunk_Full_Decision floor(log(Search Area Size * Search Area Size);
6: #pragma omp parallel 7: seta numero de threads;8: #pragma omp for schedule (Static, Chunk_Full_Search)9: PARA cada pixel que compoe a area de busca - Largura10: #pragma omp parallel for schedule (Static, Chunk_Full_Search) private (indices) shared (SAD_vector)11: PARA cada pixel que compoe a area de busca - Largura12: acc = acumulador de valores de SAD;13: PARA cada pixel que compoe o bloco - Altura14: PARA cada pixel que compoe o bloco - Altura15: acc acc + abs (blocoCandidato[indices] – BlocoAtual[indices];16: fim PARA17: fim PARA18: SAD_vector [ indices] acc;19: fim PARA20: fim PARA
21: #pragma omp parallel for schedule (Static, Chunk_Decision)22: PARA cada elemento do vetor de SAD23: if SAD_vector[k] < SAD_vector[k+1] then24: SAD = SAD_vector[k];25: else 26: SAD = SAD_vector[k+1];27: fim PARA
14
Implementação Versão OpenMP
1. SAD TamanhoBloco * TamanhoBloco * INT_MAX; {vetor que armazena menores valores de SAD}2. SAD_vector AreaBuscaL* AreaBuscaB; {vetor que armazena blocos candidatos}3. Num_Threads 4;4. Chunk_Full_Search floor(log(Search Area Size));5. Chunk_Full_Decision floor(log(Search Area Size * Search Area Size);
6: #pragma omp parallel 7: seta numero de threads;8: #pragma omp for schedule (Static, Chunk_Full_Search)9: PARA cada pixel que compoe a area de busca - Largura10: #pragma omp parallel for schedule (Static, Chunk_Full_Search) private (indices) shared (SAD_vector)11: PARA cada pixel que compoe a area de busca - Largura12: acc = acumulador de valores de SAD;13: PARA cada pixel que compoe o bloco - Altura14: PARA cada pixel que compoe o bloco - Altura15: acc acc + abs (blocoCandidato[indices] – BlocoAtual[indices];16: fim PARA17: fim PARA18: SAD_vector [ indices] acc;19: fim PARA20: fim PARA
21: #pragma omp parallel for schedule (Static, Chunk_Decision)22: PARA cada elemento do vetor de SAD23: if SAD_vector[k] < SAD_vector[k+1] then24: SAD = SAD_vector[k];25: else 26: SAD = SAD_vector[k+1];27: fim PARA
Região Paralela
15
Implementação Versão OpenMP
1. SAD TamanhoBloco * TamanhoBloco * INT_MAX; {vetor que armazena menores valores de SAD}2. SAD_vector AreaBuscaL* AreaBuscaB; {vetor que armazena blocos candidatos}3. Num_Threads 4;4. Chunk_Full_Search floor(log(Search Area Size));5. Chunk_Full_Decision floor(log(Search Area Size * Search Area Size);
6: #pragma omp parallel 7: seta numero de threads;8: #pragma omp for schedule (Static, Chunk_Full_Search)9: PARA cada pixel que compoe a area de busca - Largura10: #pragma omp parallel for schedule (Static, Chunk_Full_Search) private (indices) shared (SAD_vector)11: PARA cada pixel que compoe a area de busca - Largura12: acc = acumulador de valores de SAD;13: PARA cada pixel que compoe o bloco - Altura14: PARA cada pixel que compoe o bloco - Altura15: acc acc + abs (blocoCandidato[indices] – BlocoAtual[indices];16: fim PARA17: fim PARA18: SAD_vector [ indices] acc;19: fim PARA20: fim PARA
21: #pragma omp parallel for schedule (Static, Chunk_Decision)22: PARA cada elemento do vetor de SAD23: if SAD_vector[k] < SAD_vector[k+1] then24: SAD = SAD_vector[k];25: else 26: SAD = SAD_vector[k+1];27: fim PARA
Divisão da área debusca entre as threads
16
Implementação Versão OpenMP
1. SAD TamanhoBloco * TamanhoBloco * INT_MAX; {vetor que armazena menores valores de SAD}2. SAD_vector AreaBuscaL* AreaBuscaB; {vetor que armazena blocos candidatos}3. Num_Threads 4;4. Chunk_Full_Search floor(log(Search Area Size));5. Chunk_Full_Decision floor(log(Search Area Size * Search Area Size);
6: #pragma omp parallel 7: seta numero de threads;8: #pragma omp for schedule (Static, Chunk_Full_Search)9: PARA cada pixel que compoe a area de busca - Largura10: #pragma omp parallel for schedule (Static, Chunk_Full_Search) private (indices) shared (SAD_vector)11: PARA cada pixel que compoe a area de busca - Largura12: acc = acumulador de valores de SAD;13: PARA cada pixel que compoe o bloco - Altura14: PARA cada pixel que compoe o bloco - Altura15: acc acc + abs (blocoCandidato[indices] – BlocoAtual[indices];16: fim PARA17: fim PARA18: SAD_vector [ indices] acc;19: fim PARA20: fim PARA
21: #pragma omp parallel for schedule (Static, Chunk_Decision)22: PARA cada elemento do vetor de SAD23: if SAD_vector[k] < SAD_vector[k+1] then24: SAD = SAD_vector[k];25: else 26: SAD = SAD_vector[k+1];27: fim PARA
Divisão de tarefaentre as threads
17
Implementação Experimentos:
CPU: Intel Quad-core 2.4GHz
Área Paralelizada: Resolução do Quadro utilizada:
352x288 (CIF)
Bloco: Área de Busca (16x16, 32x32, 64x64, 128x128, 240x240).
Thread: Um bloco do quadro atual (4x4 pixels). Total de 4 threads – OpenMP
Média de 30 execuções para cada dimensão área de busca
18
Resultados OpenMP x Sequencial – Tempo de
Processamento (s)
16x16 32x32 64x64 128x128 240x2400
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
OpenMP Sequencial
19
Resultados OpenMP x Sequencial – Tempo de
Processamento (s)
16x16 32x32 64x64 128x128 240x2400
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
Área de Busca
Tem
po d
e P
rocessam
ento
20
Resultados OpenMP x Sequencial – Tempo de
Processamento (s)
16x16 32x32 64x64 128x128 240x2400
0.02
0.04
0.06
0.08
0.1
0.12
0.14
0.16
0.18
Área de Busca
Tem
po d
e P
rocessam
ento
21
Resultados OpenMP – Speed-up
16x16 32x32 64x64 128x128 240x2400.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
1
Speed-up OpenMP
Área de Busca
Speed-u
p
22
Resultados OpenMP – Speed-up
16x16 32x32 64x64 128x128 240x2400.55
0.6
0.65
0.7
0.75
0.8
0.85
0.9
0.95
1
Speed-up OpenMP
Área de Busca
Speed-u
p • Crescimento Maior Volume de
dados
23
Resultados OpenMP x MPI – Tempo de Processamento
16x16 32x32 64x64 128x128 240x2400
20
40
60
80
100
120
MPI - 4 Processos OpenMP
Área de Busca
Tem
po d
e P
rocessam
ento
24
Resultados OpenMP x MPI – Tempo de Processamento
16x16 32x32 64x64 128x128 240x2400
20
40
60
80
100
120
MPI - 4 Processos OpenMP
Área de Busca
Tem
po d
e P
rocessam
ento MPI Comunicação
25
Resultados OpenMP x MPI – Speed-up
16x16 32x32 64x64 128x128 240x2400.25
0.35
0.45
0.55
0.65
0.75
0.85
0.95
1.05
Speed-up MPI - 4 Processos Speed-up OpenMP - 4 Threads
Área de Busca
Speed-u
p
26
Resultados OpenMP x MPI – Speed-up
16x16 32x32 64x64 128x128 240x2400.25
0.35
0.45
0.55
0.65
0.75
0.85
0.95
1.05
Speed-up MPI - 4 Processos Speed-up OpenMP - 4 Threads
Área de Busca
Speed-u
p
Comportamento Coerente
27
Conclusões Compressão de Vídeo: Algoritmo FullSearch para
Estimação de Movimento;
Aplicação: Exaustiva; Massivamente paralela: independência de dados;
Comparação Sequencial x OpenMP: Pouco ganho – OpenMP Custo / threads x Volume de Execução
Comparação OpenMP x MPI OpenMP – melhor desempenho MPI: comunicação.
CMP 167– Programação com Objetos Distribuídos
Prof. Cláudio Geyer
Eduarda Monteiro
Porto Alegre, Julho de 2012
Algoritmo Paralelo para Estimação de Movimento