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
Documentos relacionados
1 Introduç˜ao 2 Contêineres - FACOM
// replacing
inicio = v.begin();
fim = v.end();
replace(inicio, fim, 4, -1);
cout << endl << "Substituindo 4 por -1: " << endl;
for (vector