Weitere ähnliche Inhalte Ähnlich wie Programação Multicore: Como sobreviver a esta revolução usando o Pinguim? (20) Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?1. Paulo Ricardo Paz Vital – Software Engineer
21 de Julho de 2010 – Fórum Internacional de Software Livre 2010
Programação Multicore:
Como sobreviver a esta revolução usando o Pinguim?
© 2010 IBM Corporation
2. Agenda
■ Introdução
– A emergência do Software Multicore
– O que é Paralelismo?
■ Plataformas de concorrência
– MPI
– Pthreads
– OpenMP
■ Linguagens específicas
– X10
– Outras linguagens
■ Aplicações para programação multicore
– Anjuta
– Eclipse
– GDB
2 © 2010 IBM Corporation
3. Esta palestra NÃO é
■ Aula sobre arquitetura de computadores
■ Solucionadora de seus problemas de concorrência
■ Sessão avançada de programação concorrente
3 © 2010 IBM Corporation
4. Introdução
■ Lei de Moore (Gordon E. Moore, Eletronics Magazine, 16 de Abril de 1965):
“O número de transistores numa mesma área de semicondutor dobra a cada (18) 24 meses”
4 © 2010 IBM Corporation
5. Introdução
■ Problemas:
– Minituarização chegando ao limite
– Dissipação do calor
■ Soluções:
– Novas tecnologias de gravação em chip
– Mais de um núcleo, ou seja, multicore
■ Fim da Lei de Moore:
– Carl Anderson, IBM Fellow
– Desenvolvimento de sistemas que exigem menos recursos do processador
– Alto custo de pesquisa de novas tecnologias
■ Mas o que a adição de mais cores trouxe para a computação?
5 © 2010 IBM Corporation
6. Introdução
■ Programação sequencial:
– Software executa em apenas uma CPU
– Problema é quebrado em uma série de instruções
– Instruções são executadas uma após a outra
– Somente uma instruções pode estar executando em certo momento
6 © 2010 IBM Corporation
7. Introdução
■ Programação paralela:
– Software pode executar em múltiplos CPUs
– Problema é quebado em partes que podem ser resolvidas concorrentemente
– Cada parte é quebrada em uma série de instruções
– Instruções de cada parte executam simultaneamente em diferentes CPUs
7 © 2010 IBM Corporation
9. MPI
■ MPI (Message Passing Interface) é uma biblioteca de subrotinas de comunicação
utilizadas em ambientes de memória distribuída, máquinas paralelas massivas, NOWs
(network of workstations) e redes heterogêneas.
■ Informações passadas da memória local do processo para a memória principal do
processo remoto
■ Paralelismo explícito, ou seja, o desenvolvedor é responsável pela distribuição
■ API predominante no desenvolvimento de aplicações para clusters científicos
■ Diversas Implementações:
– OpenMPI - http://www.open-mpi.org/
– LAM/MPI - http://www.lam-mpi.org/
– Los Alamos MPI - http://public.lanl.gov/lampi/
– MPICH - http://www-unix.mcs.anl.gov/mpi/mpich/
– MPICH2 - http://www-unix.mcs.anl.gov/mpi/mpich2/
9 © 2010 IBM Corporation
10. MPI
■ Estrutura básica de um código MPI
/* 1st: launch the MPI processes on each node */
MPI_Init(&argc,&argv);
/* 2nd: request a thread id (rank) from the MPI master process, which has tid == 0 */
MPI_Comm_rank(MPI_COMM_WORLD, &tid);
/* 3rd: this is often useful, get the number of threads or processes launched by MPI */
MPI_Comm_size(MPI_COMM_WORLD, &nthreads);
/* 4th: finalize the MPI processes */
MPI_Finalize();
10 © 2010 IBM Corporation
11. MPI
■ Uso:
– #include <mpi.h>
– Inicializar MPI utilizando estrutura anterior
■ Compilação:
– mpicc -g -o <binario> <codigo_fonte>.c
– mpic++ -g -o <binario> <codigo_fonte>.cpp
■ Execução:
– mpirun -np <num_proc> <binario>
11 © 2010 IBM Corporation
12. MPI
■ Olá MPI
■ Olá MPI v2
12 © 2010 IBM Corporation
13. Pthreads
■ POSIX Threads é um padrão POSIX que define uma API para criar e manipular threads
■ Conjunto de tipos e chamadas para linguagem de programação C
■ Características:
– Threads co-existem em um mesmo processo, compartilhando recursos, mas
escalonadas separadamente pelo sistema operacional
– Somente o mínimo necessário de recursos são replicados entre as threads.
■ Criando threads:
– pthread_create (thread, attr, start_routine, args)
– pthread_exit (status)
■ Unindo e desunindo threads:
– pthread_join (thread_id, status)
– pthread_detach (thread_id, status)
■ Mutex
– pthread_mutex_init (mutex, attr) pthread_mutex_destroy (mutex)
– pthread_mutex_lock (mutex) pthread_mutex_unlock (mutex)
13 © 2010 IBM Corporation
14. Pthreads
■ Race Condition
Thread 01 Thread 02 Saldo
Lê Saldo: $1000 $1000
Lê Saldo: $1000 $1000
Deposito: $200 $1000
Deposito: $200 $1000
Atualiza Saldo: $1000+$200 $1200
Atualiza Saldo: $1000+$200 $1200
14 © 2010 IBM Corporation
15. Pthreads
■ Uso:
– #include <pthread.h>
– pthread_create(....)
■ Compilação:
– gcc -g -o <binario> <codigo_fonte>.c -pthread
15 © 2010 IBM Corporation
16. Pthreads
■ Olá Mundo
■ Olá Mundo com argumentos
■ Join – exemplo
■ Mutex - exemplo
16 © 2010 IBM Corporation
17. OpenMP
■ Biblioteca de mais alto nível para programação paralela
■ Suporta memória compartilhada
■ C/C++ e Fortran
■ Programador possui controle total sobre a execução paralela
■ Características
– Utiliza #pragmas para definir as regiões paralelas
– Detecta automaticamente o número de processadores
■ Restrições
– Programador necessita fornecer os #pragmas
– Não existe detecção de conflitos
– Exige compilador – não é apenas uma biblioteca
17 © 2010 IBM Corporation
18. OpenMP
■ Uso:
– #pragma omp parallel ...
■ Compilação:
– gcc -g -o <binario> <codigo_fonte>.c -fopenmp
18 © 2010 IBM Corporation
19. OpenMP
■ Olá FISL
■ Produto de pontos
■ ImageMagick
19 © 2010 IBM Corporation
21. X10
■ Linguagem desenvolvida pela IBM Research em cooperação com a academia
■ Parte do projeto IBM PERCS
■ Projeto Open Source
■ Objetivo:
– Simples
– Seguro
– Escalável
– Universal
■ Alvos:
– Computação científica
– Análise de negócios
■ Compiladores:
– Java
– C++
21 © 2010 IBM Corporation
22. X10
■ Instalação:
– Download do x10-2.0.4_linux_{x86, x86_64, ppc}.tgz
– Desempacotamento
– Editar a variável JAVA_HOME para onde estiver bin/java
■ Uso:
– Criação de arquivo *.x10
– Definição de classe, como em Java e/ou C++, no mesmo nome do arquivo
– Utilização das bibliotecas X10 como pacotes
■ Compilação:
– <path_instalação>/bin/x10c <arquivo>.x10
■ Execução:
– <path_instalação>/bin/x10 <classe>
22 © 2010 IBM Corporation
23. X10
■ Tipos e Inferência de Tipos
– val sum = 1 + 1;
– val sum <: Int = 1 + 1;
■ Lugares (places)
– Lugar corresponde a um processo ou processador
– Alguns dados são globais, podem ser lidos por qualquer lugar
– Alguns dados são não-globais: existe somente em um lugar
– Todo dado não-global existe precisamente em um lugar: home
– Variável here é sempre vinculada ao lugar atual (linha de código executando)
– ! - forma de dizer que um objeto home está em here
– val p : Person! = new Person()
– Somente pode usar dados não-globais no lugar onde foi definido
23 © 2010 IBM Corporation
24. X10
■ Concorrencia:
– Activities: similar a threads ou processos
– Podem existir várias atividades em um simples lugar (processador único)
– Se existem diversos lugares, cada um terá diferentes atividades executando
– Comando async S gera uma nova atividade que executa e pára S
– A nova atividade está localizada no mesmo lugar que o gerador e valor de here
■ Atomicidade:
– atomic S
– Nenhuma outra atividade pode ser executada enquanto S não terminar
■ Funções:
– (args) => resultado
■ Loops:
– for ((i) in a .. b)
24 © 2010 IBM Corporation
25. X10
■ Olá FISL
■ Bom Lugar
■ Olá Mundo Concorrente
■ Olá Mundo Atômico
■ Somatória Paralela
25 © 2010 IBM Corporation
26. Outras linguagens
■ Unified Parallel C (UPC)
■ OpenCL
■ CUDA
■ Charm++
■ Haskell
26 © 2010 IBM Corporation
28. Anjuta DevStudio
■ IDE 'oficial' do GNOME
■ Desenvolvimento em C, C++, Python
■ Extensivel a plugins:
– Gvim
– gerenciamento de projetos
– Valgrind
– Gprof
■ Gerenciador de arquivos integrado
■ Wizard de projetos: autogen
■ Editor de código fonte: Scintilla e
GtkSourceView
■ Glade e depuradores integrados
■ Gerador de classes
■ Controle de versão: git e subversion
28 © 2010 IBM Corporation
30. Eclipse IDE
■ Framework de desenvolvimento baseado em Java
– Inicialmente desenvolvido pela IBM
– Open Source (Eclipse Public License - EPL)
■ Extensível a plugins:
– C/C++
– PHP
– Python
– Controle de versão: subversion, git, CVS
– Depuração
■ Eclipse Classic 3.6.0 (Helios)
– http://www.eclipse.org/downloads/
■ C/C++ Development Tooling (CDT) 7.0 for Eclipse Helios
– http://www.eclipse.org/cdt/downloads.php
■ Parallel Tools Platform (PTP) 4.0.1 for Eclipse Helios
– http://www.eclipse.org/ptp/downloads.php
30 © 2010 IBM Corporation
32. GDB – The GNU Debugger
■ Depurador do projeto GNU para sistemas Unix
■ Suporta múltiplas linguagens: C, C++, Fortran, Pascal, etc
■ Suporte a depuração remota
■ DDD – DataDisplay Debugger: front-end para o gdb
32 © 2010 IBM Corporation
33. Repositório – Onde encontrar mais informações?
■ IBM Linux Technology Center
– http://www-03.ibm.com/linux/ltc/index.html
■ IBM developerWorks
– http://www.ibm.com/developerworks
■ X10
– http://x10-lang.org
■ Anjuta DevStudio
– http://www.anjuta.org
■ Eclipse IDE
– http://www.eclipse.org
■ GDB / DDD
– http://www.gnu.org/software/gdb
– http://www.gnu.org/software/ddd
33 © 2010 IBM Corporation
34. Repositório – Onde encontrar mais informações?
■ MPI
– OpenMPI - http://www.open-mpi.org/
– LAM/MPI - http://www.lam-mpi.org/
– Los Alamos MPI - http://public.lanl.gov/lampi/
– MPICH - http://www-unix.mcs.anl.gov/mpi/mpich/
– MPICH2 - http://www-unix.mcs.anl.gov/mpi/mpich2/
■ Pthreads
– https://computing.llnl.gov/tutorials/pthreads/
■ OpenMP
– http://openmp.org
– https://computing.llnl.gov/tutorials/openMP/
34 © 2010 IBM Corporation
35. Perguntas ???
Paulo Ricardo Paz Vital,
Software Engineer
IBM Linux Technology Center
pvital@br.ibm.com
paulo@vital.eng.br
http://www.vital.eng.br
35 © 2010 IBM Corporation