Bibliotecas para Computação Científica

Transcrição

Bibliotecas para Computação Científica
Bibliotecas para Computação Científica
José Matos, Miguel D. Costa
16 de Dezembro de 2010
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
1 / 23
Dentro ou fora?
Uso de bibliotecas
Desenvolvimento próprio
Oportunidade de aprendizagem
Sabemos o que se passa lá
dentro
Concentramo-nos no que
precisamos
Temos de a manter e
desenvolver nós
Não haverá quem conheça
melhor essa área específica?
José Matos, Miguel D. Costa ()
Usadas/testadas por muita
gente
Desenvolvidas por peritos?
Funcionalidades adicionais
Podemos influenciar o
desenvolvimento?
Demasiado genérico / curva de
aprendizagem inclinada?
...
Computação científica e C++
16 de Dezembro de 2010
2 / 23
Licenças
Open source
Proprietárias
Acesso ao código
Performance?
Genéricas
Suporte?
Personalização
Personalização?
Custo?
Custo?
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
3 / 23
Em C/Fortran
GSL: Gnu Scientific Library
FFTW: Fastest Fourier Transform in the West
BLAS: Basic Linear Algebra Subprograms
LAPACK: Linear Algebra PACKage
ATLAS: Automatically Tuned Linear Algebra Software
...
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
4 / 23
Optimizadas por Arquitectura
BLAS, Lapack, FFTs, Rngs, etc.
Intel Math Kernel Library
AMD Core Math Library
NVidia Cuda Library
AMD CML-GPU
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
5 / 23
STL
STL: Standard Template Library
Design
algoritmos - contentores - iteradores
Contentores
sequenciais
vector, deque, list
associativos
set, multiset, map e multimap
Algoritmos
sort, copy, find, etc..
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
6 / 23
STL Hello World (1)
#include
#include
#include
#include
#include
<iostream>
<vector>
<list>
<string>
<algorithm>
using namespace std;
// escolher vector ou lista
typedef vector<string> contentor;
//typedef list<string> contentor;
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
7 / 23
STL Hello World (2)
int main() {
contentor frase;
frase.push_back("Hello"); frase.push_back(" ");
frase.push_back("World"); frase.push_back("!"); frase.push_back("\n");
for (contentor::iterator it = frase.begin(); it != frase.end(); ++it)
cout << *it;
string hello = "Hello"; string goodbye = "Goodbye";
replace(frase.begin(), frase.end(), hello, goodbye);
for (contentor::iterator it = frase.begin(); it != frase.end(); ++it)
cout << *it;
return 0; }
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
8 / 23
Boost
Technology Preview
Templates (quase exclusivamente)
Mais de 80 bibliotecas
Alguns exemplos:
accumulators: médias, momentos, etc.
array: vector com tamanho conhecido em tempo de compilação
bimap: mapas bidireccionais
filesystem: ler directórios e ficheiros de forma independente do sistema
operativo
multi_array: arrays multidimensionais
program_options: processar opções de linha de comandos
python: interoperabilidade entre C++ e python
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
9 / 23
Boost Hello World
#include <iostream>
#include <string>
#include <boost/tokenizer.hpp>
using namespace std;
using namespace boost;
int main() {
string frase = "Hello world!";
tokenizer<> palavras(frase);
for(tokenizer<>::iterator it=palavras.begin(); it != palavras.end(); ++it)
cout << *it << endl;
return 0; }
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
10 / 23
Outros
Tvmet
Blitz++
Eigen
...
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
11 / 23
Cálculo Simbólico
SymbolicC++
Ev3
Ginac
...
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
12 / 23
Outras áreas
Cálculo Financeiro:
QuantLib, ..
Investigação Operacional
GaLib, Coin-Or, ...
Interfaces gráficos:
Qt, ...
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
13 / 23
No entanto
Não tentem fazer tudo com C++
O python, por exemplo, serve bem para gerir, visualizar e tratar dados
Algumas bibliotecas Python relevantes
Numpy
SciPy
Matplotlib
Mayavi
Sage
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
14 / 23
Computação Paralela
Tipos de Paralelismo
bit level
instruction level
data
task
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
15 / 23
Fontes de Paralelismo
Podemos encontrar oportunidades de paralelização em
muitos parâmetros
muitas tarefas
muitos dados
...
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
16 / 23
Quando paralelizar?
Paralelizar implica
comunicação e sincronização
programação adicional
debugging adicional
optimização adicional
e tudo isto custa tempo.
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
17 / 23
Computação Distribuída
Se o problema puder ser distribuído, e.g.,
médias sobre a desordem
processamento de sinal
variação com parâmetros (temperatura, concentração, etc.)
qualquer divisão entre tarefas independentes
então não vale a pena paralelizar, é mais eficiente distribuir.
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
18 / 23
Computação Paralela
Quanto à localização da memória
Memória Partilhada (e.g. múltiplos núcleos/processadores por
motherboard)
Memória Distribuída (e.g. clusters, nodos ligados por algum tipo de
rede)
Quanto ao acesso à memória
Threads partilham memória, não é preciso comunicar explicitamente
Processos têm memória independente, é necessário comunicar
explicitamente
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
19 / 23
Threads versus Processos
Threads
POSIX threads (fork, ...)
OpenMP
Processos
PVM
MPI
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
20 / 23
OpenMP Hello World
#include <omp.h>
#include <iostream>
using namespace std;
int main() {
int nthreads = omp_get_max_threads();
int thread_id;
#pragma omp parallel private(thread_id) {
thread_id = omp_get_thread_num();
cout << "Hello world from thread = ";
cout << thread_id << " of " << nthreads; cout << endl;
}
return 0; }
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
21 / 23
MPI Hello World
#include <mpi.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
int rank, size;
MPI_Init(&argc, &argv);
MPI_Comm_rank (MPI_COMM_WORLD, &rank);
MPI_Comm_size (MPI_COMM_WORLD, &size);
cout << "Hello world from process " << rank;
cout << " of " << size << endl;
MPI_Finalize();
return 0; }
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
22 / 23
Para saber mais
www.cplusplus.com
www.boost.org
www.openmp.org
www.open-mpi.org
www.nvidia.com/cuda
www.amd.com/stream
...
José Matos, Miguel D. Costa ()
Computação científica e C++
16 de Dezembro de 2010
23 / 23