35
© 2010 IBM Corporation Programação Multicore: Como sobreviver a esta revolução usando o Pinguim? 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?

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

© 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

Page 2: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 3: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 4: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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”

Page 5: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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?

Page 6: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 7: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 8: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

8 © 2010 IBM Corporation

Plataformas de Concorrência

Page 9: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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/

Page 10: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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();

Page 11: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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>

Page 12: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

12 © 2010 IBM Corporation

MPI

■ Olá MPI

■ Olá MPI v2

Page 13: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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)

Page 14: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 15: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

15 © 2010 IBM Corporation

Pthreads

■ Uso:– #include <pthread.h>– pthread_create(....)

■ Compilação:– gcc -g -o <binario> <codigo_fonte>.c -pthread

Page 16: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

16 © 2010 IBM Corporation

Pthreads

■ Olá Mundo

■ Olá Mundo com argumentos

■ Join – exemplo

■ Mutex - exemplo

Page 17: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 18: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

18 © 2010 IBM Corporation

OpenMP

■ Uso:– #pragma omp parallel ...

■ Compilação:– gcc -g -o <binario> <codigo_fonte>.c -fopenmp

Page 19: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

19 © 2010 IBM Corporation

OpenMP

■ Olá FISL

■ Produto de pontos

■ ImageMagick

Page 20: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

20 © 2010 IBM Corporation

Linguagens específicas

Page 21: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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++

Page 22: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 23: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 24: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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)

Page 25: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

25 © 2010 IBM Corporation

X10

■ Olá FISL

■ Bom Lugar

■ Olá Mundo Concorrente

■ Olá Mundo Atômico

■ Somatória Paralela

Page 26: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

26 © 2010 IBM Corporation

Outras linguagens

■ Unified Parallel C (UPC)

■ OpenCL

■ CUDA

■ Charm++

■ Haskell

Page 27: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

27 © 2010 IBM Corporation

Aplicações para programação multicore

Page 28: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 29: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

29 © 2010 IBM Corporation

Anjuta DevStudio

Page 30: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 31: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

31 © 2010 IBM Corporation

Eclipse IDE

Page 32: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 33: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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

Page 34: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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/

Page 35: Programação Multicore: Como sobreviver a esta revolução usando o Pinguim?

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