O documento apresenta uma palestra sobre programação paralela em sistemas embarcados usando a Raspberry Pi 2. Ele discute o uso do Linux embarcado, Single Board Computers como a Raspberry Pi 2, programação paralela usando bibliotecas como OpenMP e TBB, e demonstra a multiplicação de matrizes de forma sequencial e paralela. Os resultados mostram um ganho de desempenho de aproximadamente 4 vezes ao usar programação paralela em comparação com a abordagem sequencial.
2. Globalcode – Open4education
Slide 2 de 40
Sobre o Palestrante
Qualificação
Engenheiro de Computação pela USP de São Carlos
MBA em Gestão de TI pela UNIFRAN
Mestrando em Processamento de Sinais e
Instrumentação pela USP de São Carlos - EESC
Atuação
Professor Universitário – UNIFRAN
Desenvolvedor e Consultor
Articulista do Portal Embarcados
3. Globalcode – Open4education
Slide 3 de 40
Agenda
1. Linux Embarcado
2. Single Board Computers
3. Raspberry Pi 2
4. Programação Paralela
5. Sistema Linux
6. Bibliotecas
7. Demonstração
8. Resultados
9. Considerações Finais
4. Globalcode – Open4education
Slide 4 de 40
1 – Linux Embarcado
É o uso do Kernel Linux, juntamente com bibliotecas,
drivers e demais arquivos, adaptados para
dispositivos embarcados.
Com SoCs multicores Kernel para Linux
Embarcado também passou por adaptações para
suportar SMP – Multiprocessamento Simétrico.
O Kernel suportar é uma coisa. As aplicações
usarem, é outra coisa...
6. Globalcode – Open4education
Slide 6 de 40
“Computadores de placa única”
Preço baixo – Normalmente a partir de $ 35
Baixo consumo – 5 a 20 W.
Crescente poder de processamento:
Modelos recentes SoCs Multicore: 2 a 8 núcleos
Como usar esse poderio computacional?
2 - Single Board Computers
7. Globalcode – Open4education
Slide 7 de 40
3 - Raspberry Pi 2
Raspberry Pi 2 Modelo B
900MHz quad-core ARM Cortex-A7 CPU
1GB RAM
4 Portas USB
40 pinos GPIO
Saída HDMI
Conexão com rede Ethernet
Entrada para cartão MicroSD
GPU VideoCore IV 3D
Preço: $ 35,00
8. Globalcode – Open4education
Slide 8 de 40
4 - Programação Paralela
Uso eficaz de recursos computacionais que permitem a
execução paralela de comandos.
Task Based – Tratam de paralelizar sequências de
ações – tarefas.
Data Based – Tratam de distribuir os dados para
processamento.
9. Globalcode – Open4education
Slide 9 de 40
Uma ação sequencial Pode-se tornar uma ação paralela
Ganho de desempenho:
•Faz a mesma coisa
•Só que em menos tempo
4 - Programação Paralela
Dividir para conquistar!
10. Globalcode – Open4education
Slide 10 de 40
4 - Programação Paralela
Aplicações
Visão Computacional
Inteligência Artificial
Robótica
Jogos
Computação de alto desempenho
Enfim: Tudo que tenha um processamento matemático
pesado, executando em máquinas capazes de executar
várias tarefas simultaneamente!
11. Globalcode – Open4education
Slide 11 de 40
4 - Programação Paralela
Uso de Threads.
Uso de MPI.
Uso de Bibliotecas (TBB e OpenMP).
Uso de coprocessadores para SIMD.
Gestão de tarefas e suas prioridades em nível de
Sistema Operacional.
Vamos focar em Bibliotecas e gestão de tarefas...
12. Globalcode – Open4education
Slide 12 de 40
5 - Sistema Linux
Alocação de tarefa em núcleos
O sistema pode, determinadamente, alocar tarefas em
um ou mais núcleos.
É uma “mão na roda” para sistemas multicore.
Ex: Você pode ter 4 aplicações, cada qual rodando
separadamente em 1 núcleo, num ambiente com 4
núcleos.
13. Globalcode – Open4education
Slide 13 de 40
5 - Sistema Linux
Alocação de tarefa em núcleos
Linux taskset.
$ taskset –c <núcleo> aplicação
Para a Raspberry Pi 2, que possui 4 núcleos, os valores
possíveis para <núcleo> são 0,1,2 e 3.
Vamos “forçar” a execução do programa minhaApp, no
diretório corrente, nos núcleos 0 e 1:
$ taskset –c 0,1 ./minhaApp
14. Globalcode – Open4education
Slide 14 de 40
5 - Sistema Linux
O taskset é útil para gerenciar tarefas e sua
execução em um ou mais núcleos.
Porém...
O taskset é feito manualmente, e pode não ter a melhor
abordagem para distribuir a tarefa entre os núcleos
É preciso algo mais...
15. Globalcode – Open4education
Slide 15 de 40
6 - Bibliotecas
Principais:
OpenMP – Biblioteca para Fortran, C e C++.
Mantida pela OpenMP Architecture Review Board
Consórcio formado por empresas como IBM, AMD,
Intel, dentre outras.
16. Globalcode – Open4education
Slide 16 de 40
6 - Bibliotecas
Principais:
TBB – Biblioteca para código em C++
Desenvolvida pela Intel.
O desenvolvedor cria tasks – tarefas
São controladamente paralelizáveis.
17. Globalcode – Open4education
Slide 17 de 40
6 - Bibliotecas
Abstraem o “árduo” processo de paralelização de
tarefas por meio de threads.
Possuem uma API que realiza o trabalho duro,
bastando o desenvolvedor adaptar a aplicação.
19. Globalcode – Open4education
Slide 19 de 40
6 - Bibliotecas - OpenMP
API para coordenação de tarefas multi-threads em
ambiente com memória compartilhada.
Composta de 3 elementos principais:
Diretivas de compilação
Biblioteca com rotinas para código em execução
Variáveis de ambiente
20. Globalcode – Open4education
Slide 20 de 40
6 - Bibliotecas - OpenMP
Já vem instalado por padrão na distribuição
Raspbian 2015-05-05
Por que será...?
Instalação em caso contrário:
Quase lá.
$ sudo apt-get install gcc g++ make libgomp1
21. Globalcode – Open4education
Slide 21 de 40
6 - Bibliotecas - OpenMP
Como disse anteriormente...
Multithread
Beleza, vários núcleos em uso!
Memória compartilhada
Cuidado!
Uma variável pode ser usada por várias threads...
22. Globalcode – Open4education
Slide 22 de 40
6 - Bibliotecas - OpenMP
É importante destacar que a biblioteca facilita o
trabalho, e muito.
Adaptar o código para paralelização é uma tarefa
do desenvolvedor.
Conhecer os recursos da API.
Saber tratar regiões de código paralelizáveis ou não
Tratar adequadamente variáveis compartilhadas,
situações críticas, dentre outros.
23. Globalcode – Open4education
Slide 23 de 40
Problema Alvo
Multiplicação de matrizes
Vários laços de repetição aninhados
Vamos paralelizar?
26. Globalcode – Open4education
Slide 26 de 40
OpenMP - Multiplicação de Matrizes:
Compilação do código para OpenMP:
$ g++ -O2 matrix-omp.cpp -fopenmp -o matrix-omp
Execução
$ ./matrix-omp
27. Globalcode – Open4education
Slide 27 de 40
6 - Biblioteca - TBB
Não está disponível nos repositórios oficiais do
Raspbian.
Pode ser baixada/instalada pelo OpenCV durante
processo de compilação da biblioteca (OpenCV).
Ou instalada manualmente...
28. Globalcode – Open4education
Slide 28 de 40
6 - Biblioteca - TBB
Instalação – download dos seguintes pacotes:
libtbb2_4.2~20140122-5_armhf.deb
libtbb-dev_4.2~20140122-5_armhf.deb
Do repositório:
ftp://ftp.us.debian.org/debian/pool/main/t/tbb
29. Globalcode – Open4education
Slide 29 de 40
6 - Biblioteca - TBB
Instalação da forma:
Modificar arquivo:
/usr/include/tbb/machine/gcc_armv7.h
Comentando as linhas:
E deixando a seguinte linha como:
$ sudo dpkg –i libtbb2_4.2~20140122-5_armhf.deb
$ sudo dpkg –i libtbb-dev_4.2~20140122-5_armhf.deb
33. #if !(__ARM_ARCH_7A__)
34. #error compilation requires an ARMv7-a architecture.
35. #endif
56. #define __TBB_full_memory_fence() 0xffff0fa0
36. Globalcode – Open4education
Slide 36 de 40
8 - Resultados
• Execução com OpenMP
root@raspberrypi:/home/pi# time ./matrix-omp
real 0m10.640s
user 0m42.330s
sys 0m0.020s
• Execução com TBB:
root@raspberrypi:/home/pi# time ./matrix-tbb
real 0m10.651s
user 0m42.350s
sys 0m0.020s
• Execução sem paralelismo
root@raspberrypi:/home/pi# time ./matrix
real 0m40.552s
user 0m40.530s
sys 0m0.010s
• Tempo entre OpenMP e TBB
Quase idêntico!
• Fator de escala:
Aproximadamente 4x!
37. Globalcode – Open4education
Slide 37 de 40
9 – Considerações Finais
Fonte: HPC Wire - http://www.hpcwire.com/2015/03/02/a-comparison-of-heterogeneous-and-
manycore-programming-models/
38. Globalcode – Open4education
Slide 38 de 40
9 – Considerações Finais
Tabela 1 - Tabela com características de código para as implementações
paralelas de Mandelbrot.
Fonte: TRISTAM, Waide; BRADSHAW, Karen. Investigating the Performance and
Code Characteristics of Three Parallel Programming Models for C++
39. Globalcode – Open4education
Slide 39 de 40
9 – Considerações Finais
Na realização dos testes, foi medido o tempo total
de execução.
Isso inclui o tempo gasto com inicialização das variáveis.
OpenMP é a API mais prática
Provoca menos alterações no código anteriormente
sequencial.
Resultados obtidos com TBB e OpenMP são muito
próximos.
Então... Uso fica a critério do desenvolvedor