© 2010 IBM Corporation
Programação Multicore:Como sobreviver a esta revolução usando o Pinguim?
Paulo Ricardo Paz Vital – Software Engineer21 de Julho de 2010 – Fórum Internacional de Software Livre 2010
2 © 2010 IBM Corporation
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
3 © 2010 IBM Corporation
Esta palestra NÃO é
■ Aula sobre arquitetura de computadores
■ Solucionadora de seus problemas de concorrência
■ Sessão avançada de programação concorrente
4 © 2010 IBM Corporation
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”
5 © 2010 IBM Corporation
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?
6 © 2010 IBM Corporation
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
7 © 2010 IBM Corporation
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
8 © 2010 IBM Corporation
Plataformas de Concorrência
9 © 2010 IBM Corporation
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/
10 © 2010 IBM Corporation
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();
11 © 2010 IBM Corporation
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>
12 © 2010 IBM Corporation
MPI
■ Olá MPI
■ Olá MPI v2
13 © 2010 IBM Corporation
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)
14 © 2010 IBM Corporation
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
15 © 2010 IBM Corporation
Pthreads
■ Uso:– #include <pthread.h>– pthread_create(....)
■ Compilação:– gcc -g -o <binario> <codigo_fonte>.c -pthread
16 © 2010 IBM Corporation
Pthreads
■ Olá Mundo
■ Olá Mundo com argumentos
■ Join – exemplo
■ Mutex - exemplo
17 © 2010 IBM Corporation
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
18 © 2010 IBM Corporation
OpenMP
■ Uso:– #pragma omp parallel ...
■ Compilação:– gcc -g -o <binario> <codigo_fonte>.c -fopenmp
19 © 2010 IBM Corporation
OpenMP
■ Olá FISL
■ Produto de pontos
■ ImageMagick
20 © 2010 IBM Corporation
Linguagens específicas
21 © 2010 IBM Corporation
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++
22 © 2010 IBM Corporation
■ 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>
X10
23 © 2010 IBM Corporation
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
24 © 2010 IBM Corporation
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)
25 © 2010 IBM Corporation
X10
■ Olá FISL
■ Bom Lugar
■ Olá Mundo Concorrente
■ Olá Mundo Atômico
■ Somatória Paralela
26 © 2010 IBM Corporation
Outras linguagens
■ Unified Parallel C (UPC)
■ OpenCL
■ CUDA
■ Charm++
■ Haskell
27 © 2010 IBM Corporation
Aplicações para programação multicore
28 © 2010 IBM Corporation
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
29 © 2010 IBM Corporation
Anjuta DevStudio
30 © 2010 IBM Corporation
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
31 © 2010 IBM Corporation
Eclipse IDE
32 © 2010 IBM Corporation
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
33 © 2010 IBM Corporation
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
34 © 2010 IBM Corporation
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/
35 © 2010 IBM Corporation
Perguntas ???
Paulo Ricardo Paz Vital, Software Engineer
IBM Linux Technology Center
[email protected]@vital.eng.br
http://www.vital.eng.br
Top Related