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
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
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
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
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
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
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
Plataformas de Concorrência




8                                 © 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/




9                                                                                         © 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();
10                                                                                   © 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>




11                                                            © 2010 IBM Corporation
MPI



 ■   Olá MPI
 ■   Olá MPI v2




12                © 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)

13                                                                                   © 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
14                                                               © 2010 IBM Corporation
Pthreads



 ■   Uso:
            – #include <pthread.h>
            – pthread_create(....)
 ■   Compilação:
           – gcc -g -o <binario> <codigo_fonte>.c -pthread




15                                                           © 2010 IBM Corporation
Pthreads



 ■   Olá Mundo
 ■   Olá Mundo com argumentos
 ■   Join – exemplo
 ■   Mutex - exemplo




16                              © 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




17                                                                 © 2010 IBM Corporation
OpenMP



 ■   Uso:
            – #pragma omp parallel ...
 ■   Compilação:
           – gcc -g -o <binario> <codigo_fonte>.c -fopenmp




18                                                           © 2010 IBM Corporation
OpenMP



 ■   Olá FISL
 ■   Produto de pontos
 ■   ImageMagick




19                       © 2010 IBM Corporation
Linguagens específicas




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


21                                                                           © 2010 IBM Corporation
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
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
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
X10



 ■   Olá FISL
 ■   Bom Lugar
 ■   Olá Mundo Concorrente
 ■   Olá Mundo Atômico
 ■   Somatória Paralela




25                           © 2010 IBM Corporation
Outras linguagens



 ■   Unified Parallel C (UPC)
 ■   OpenCL
 ■   CUDA
 ■   Charm++
 ■   Haskell




26                              © 2010 IBM Corporation
Aplicações para programação multicore




27                                      © 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
28                                          © 2010 IBM Corporation
Anjuta DevStudio




29                 © 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


30                                                                © 2010 IBM Corporation
Eclipse IDE




31            © 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




32                                                                © 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



33                                                         © 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/




34                                                               © 2010 IBM Corporation
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

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

  • 1.
    Paulo Ricardo PazVital – 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
  • 8.
    Plataformas de Concorrência 8 © 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
  • 20.
    Linguagens específicas 20 © 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
  • 27.
    Aplicações para programaçãomulticore 27 © 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
  • 29.
    Anjuta DevStudio 29 © 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
  • 31.
    Eclipse IDE 31 © 2010 IBM Corporation
  • 32.
    GDB – TheGNU 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 – Ondeencontrar 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 – Ondeencontrar 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