Técnicas de orientação ao objeto para computação científica paralela Instituto de Física de São Carlos - IFSC Universidade de São Paulo - USP Técnicas de orientação ao objeto para computação científica paralela Francisco Aparecido Rodrigues Orientador: Gonzalo Travieso
Introdução
INTRODUÇÃO Introdução MOTIVAÇÃO A construção de programas paralelos que ofereçam alto desempenho é complexa A interface de uso que muitas bibliotecas numéricas paralelas oferecem é pouco amigável OBJETIVOS Desenvolver uma biblioteca paralela que ofereça alto desempenho e que possua uma interface amigável INTRODUÇÃO
INTRODUÇÃO Computação paralela Os computadores paralelos são usados para suprir as necessidades que os computadores seqüenciais não conseguem. “Um computador paralelo é uma coleção de elementos de processamento que se comunicam e cooperam na resolução de grandes problemas de forma rápida” (Almasi) INTRODUÇÃO
Clusters Grupo de computadores completos interconectados com sistema operacional distribuído Oferecem Escalabilidade absoluta Escalabilidade incremental Alta disponibilidade Melhor relação custo desempenho INTRODUÇÃO
INTRODUÇÃO Desenvolvimento de softwares paralelos Maneira mais comum: Utilizando uma linguagem seqüencial conjuntamente com uma biblioteca paralela que permita a troca de mensagens. PVM – Paralell Virtual Machine MPI – Message Passing Interface INTRODUÇÃO
Bibliotecas Paralelas
MPI MPI – Message Passing Interface Padrão de biblioteca de passagem de mensagem para sistemas paralelos. Baseado na troca de mensagem entre processadores através das diretivas send/receive O MPI é baseado em 4 conceitos: Processos Comunicadores Mensagens Tipos de dados O programador deve especificar: Instante em que uma comunicação deve ocorrer Quais tipos de dados devem ser enviados A comunicação é bloqueante ou não? MPI
BIBLIOTECAS NUMÉRICAS BLAS (Basic Linear Algebra Subprogram) LAPACK (Linear Algebra Package) Biblioteca de Álgebra Linear para cálculo de problemas de autovalores, sistemas lineares e problemas de mínimos quadrados para workstations e sistemas SPMD, SCALAPACK (Scalabe LAPACK) Biblioteca de Álgebra Linear análoga ao LAPACK para computadores de memória distribuída. BIBLIOTECAS NUMÉRICAS
ScaLAPACK Características Bibliotecas de rotinas similares às do LAPACK Escrito em FORTRAN Utiliza passagem de mensagem via MPI ou PVM Oferece alta perfomance em rotinas de álgebra linear em computadores MIMD Necessita de duas blibliotecas adicionais: PBLAS (Parallel BLAS) Contém rotinas básicas de álgebra linear para processamento paralelo BLACS (Basic Linear Algebra Communication Subprogram) Biblioteca de rotinas sícronas de send/receive que usam passagem de mensagem ScaLAPACK
ScaLAPACK Estrutura ScaLAPACK PBLAS LAPACK BLACS BLAS MPI/PVM GLOBAL LOCAL LAPACK BLACS BLAS ScaLAPACK MPI/PVM
Grade de processadores ScaLAPACK
ScaLAPACK Exemplo P0 P1 P2 P3 Distribuição da Matriz Distribuição em blocos 1 x 1 Exemplo: N = 16 e P = 4 Grade: 2 X 2 P0 P1 MATRIZ GRADE A11 A12 A13 A14 A21 A22 A23 A24 A31 A32 A33 A34 A41 A42 A43 A44 A11 A13 A12 A14 A31 A33 A32 A34 A21 A23 A22 A24 A41 A43 A42 A44 ScaLAPACK P2 P3
ScaLAPACK Utilização Passos para chamar as rotinas 1 - Inicializar a grade de processadores CALL SLINIT( ... ) CALL BLACS_GRIDINFO( ...) 2 - Distribuir a matriz na grade de processadores e inicializar os descritores de array CALL DESCINIT( ... ) 3 - Chamar a rotina do ScaLAPACK CALL PDSYEVX( ... ) 4 - Liberar a grade de processos CALL BLACS_EXIT( ... ) ScaLAPACK
ScaLAPACK Rotinas Divididas em três grupos Driver Routines Resolvem um problema completamente. Equações lineares, problemas de mínimos quadrados, problemas de autovalores, etc. Computational Routines Realizam uma computação distinta Equações lineares, fatorização ortogonal e problemas de mínimos quadrados (fatorização QR, LQ, QR com pivotamento, fatorização ortogonal completa), etc. Auxiliary routines Rotinas usadas nas subtarefas e algoritimos de particionamento ScaLAPACK
ScaLAPACK PXYYZZZ Nomenclatura das rotinas P: A primeira letra é para diferenciar das rotinas do LAPACK X: A segunda letra indica o tipo de dado S : Real D : Double C : Complex Z : Double Complex YY: As duas próximas indicam o tipo da matriz : Ex: SY – simétrica HE – hermitiana TR – triangular ZZZ: As três últimas indicam a computação Exemplos: PDTRSVX – rotina para resolver sistemas de equações lineares com matrizes triangulares PDSYEVX – rotina para calcular autovalores e autovetores de uma matriz simétrica double PSGEBRD – rotina que realiza uma redução bidiagonal de uma matriz geral single ScaLAPACK
Orientação ao Objeto
Orientação ao Objeto Conceitos O termo orientação a objetos significa organizar o mundo real como uma coleção de objetos que incorporam estrutura de dados e um conjunto de operações que manipulam estes dados. Todas as linguagens orientadas a objetos possuem três características básicas: Encapsulação Herança Polimorfismo Orientação ao Objeto
Orientação ao objeto Classes É um tipo de dado, como os já conhecidos, para declarar variáveis Uma variável de uma classe é chamada de Objeto. Definir uma classe não cria um objeto, assim como um tipo de variável NÃO é uma variável Orientação ao objeto
Orientação ao Objeto Objetos É uma entidade lógica que contém dados e código para manipular esses dados Class Carros { Cambio, acelerador, voltante, ... public: Acelerar ( ); Frear ( ); Trocar_marcha ( ); Virar_esquerda ( ); }; Class Carros BMW; Orientação ao Objeto
VEÍCULOS (SUPERCLASSE) Herança É o processo em que um objeto pode adquirir as características de outro objeto Acelerar Frear Virar para esq. ... VEÍCULOS (SUPERCLASSE) CLASSE CARROS CLASSE MOTOS Orientação ao Objeto
Orientação ao Objeto Matrizes e objetos Matrizes podem ser representadas como uma abstração de problemas de álgebra linear Uma matriz específica seria um objeto da classe e as operações sobre elas os métodos da classe Orientação ao Objeto
Biblioteca desenvolvida
POOLALi Parallel Object Oriented Linear Algebra Oferece rotinas para matrizes: Simétricas com simples precisão Simétricas com dupla precisão Hermitianas com simples precisão Hermitianas com dupla precisão POOLALi
POOLALi Características Métodos oferecidos Acesso por índice global / local Cálculo de autovalores e/ou autovetores Atribuição e redistribuição de matrizes Adição de matrizes Subtração de matrizes Multiplicação de matrizes Facilidades oferecidas Interface amigável Encapsulação dos dados, ou seja, interface independente da implementação Simplificação de uso POOLALi
POOLALi Interface e métodos template<typename elem_type, typename precision_type> class DistMat { public: DistMat ( const int M, const int N, const Grid &g, const int MB = 1, const int NB = 1 ); DistMat ( const DistMat<elem_type,precision_type> &A ); elem_type *local_matrix(); int rows(); int cols(); int block_rows(); int block_cols(); int local_rows(); int local_cols(); elem_type &operator()( const int I, const int J ); elem_type &local( const int i, const int j ); virtual void eigen( precision_type *eigenval) = 0; virtual void eigen( precision_type *eigenval, int il, int iu) = 0; ... virtual ~DistMat(); }; POOLALi
POOLALi Interface e métodos class FloatSymmetric : public DistMat<float,float> { public: FloatSymmetric (const FloatSymmetric &A) DistMat<float,float>(A); FloatSymmetric(const int M, const int N, Grid &g,const int MB = 1, const int NB = 1 ):DistMat<float,float>(M,N,g,MB,NB); FloatSymmetric &operator=( FloatSymmetric A ); friend FloatSymmetric operator+( FloatSymmetric A, FloatSymmetric B); friend FloatSymmetric operator-( FloatSymmetric A, friend FloatSymmetric operator*( FloatSymmetric A, void eigen( float *eigenval ); void eigen( float *eigenval, int il, int iu ); void eigen( float *eigenval, float vl, float vu ); void eigen( float *eigenval, DistMat<float,float> &eigenvec ); void eigen( float *eigenval, DistMat<float,float> &eigenvec, int il, int iu ); float vl, float vu ); ~FloatSymmetric(){}; } POOLALi
Análise de desempenho
Análise de desempenho Problema de física do estado sólido Algoritmo Iniciar a grade de processadores Distribuir a matriz hamiltoniana Diagonalizar a matriz Liberar a grade de processadores Objetivo Comparar o código desenvolvido usando o ScaLAPACK e a biblioteca POOLALi Análise de desempenho
Análise de desempenho Inicialização da grade de processadores Utilizando o ScaLAPACK int main(int argc, char *argv[]) { int rank, nprocs, zero = 0, context, less_one = -1; int nprow, npcol, myrow, mycol; char erre = 'R'; MPI_Init(&argc,&argv); blacs_pinfo__(&rank,&nprocs); blacs_get__(&less_one, &zero, &context); nprow = (int) sqrt(nprocs); while (( nprow!=1 ) && ((nprocs \ nprow) != 0)) nprow--; npcol = (int) (nprocs/nprow); blacs_gridinit__(&context, &erre, &nprow, &npcol); blacs_gridinfo__(&context, &nprow, &npcol, &myrow, &mycol); blacs_exit__(&zero); return 0; } Análise de desempenho
Análise de desempenho Inicialização da grade de processadores Utilizando a POOLALi #include "grid.h" int main(int argc, char *argv[]) { Parallel p(argc, argv); Grid g(p); return 0; } Análise de desempenho
Análise de desempenho Distribuição da matriz Utilizando o ScaLAPACK // ... definição dos valores associados à matriz ... // I, J -> Global // i,j -> local for( I = 0; I < N; I++) { for( J = 0; J < N; J++) .... value = Hamilton(I,J,n); l = (int)(floor( I/(nprow*mb) ) ); m = (int)(floor( J/(npcol*nb) ) ); x = I % mb; y = J % nb; i = l*mb + x; j = m*nb + y; if ( ( j*lrow + i ) < lrow*lcol ) ml[ j*lrow + i] = value; ... } Análise de desempenho
Análise de desempenho Distribuição da matriz Utilizando a POOLALi #include "lib/grid.h" #include "lib/dsymmetric.h" ... DoubleSymmetric Matrix(N,N,g,8,8), for( int I = 0; I < N; I++) { for( int J=0; J< N; J++) Matrix(I,J) = Hamilton(I,J,n); } Análise de desempenho
Análise de desempenho Diagonalização da matriz Utilizando o ScaLAPACK ... // declaração das variáveis de entrada na função static int lwork = -1, liwork = -1; double *work, tmpwork; int *iwork, tmpiwork; ifail = new int[n]; iclustr = new int[2*nprow*npcol]; gap = new double[nprow*npcol]; pdsyevx_(&jobz, &range, &uplo, &n, ml, &ia, &ja, desca, &vl, &vu, &il, &iu, &abstol,&n_aut, &n_vec, eigenval, &orfac, z, &iz, &jz, descz, &tmpwork, &lwork, &tmpiwork, &liwork, ifail, iclustr, gap, &info); lwork = int(2*tmpwork); liwork =tmpiwork; work = new double[lwork]; iwork = new int[liwork]; &vu, &il, &iu, &abstol,&n_aut, &n_vec, eigenval,&orfac,z, &iz, &jz, descz, work, &lwork, iwork, &liwork, ifail, iclustr, gap, &info); ... Análise de desempenho
Análise de desempenho Diagonalização da matriz Utilizando a POOLALi #include "lib/grid.h" #include "lib/dsymmetric.h" ... DoubleSymmetric Matrix(N,N,g,8,8), Vec(N,N,g,8,8); double *eigenval; eigenval = new (double)[N]; Matrix.eigen(eigenval, Vec); Análise de desempenho
Comparação de desempenho Análise de desempenho
Comparação de desempenho Análise de desempenho
Comparação de desempenho Análise de desempenho
Conclusão
Conclusões Conclusões A utilização de orientação ao objeto ofereceu: Alto nível de abstração Interface amigável Nomenclatura dos métodos é mais intuitiva que as rotinas do ScaLAPACK Não ofereceu perda de desempenho em relação ao ScaLAPACK Conclusões
Conclusões Trabalhos futuros Extensão da POOLALi para todos os métodos oferecidos pelo ScaLAPACK Sistemas Lineares, problemas de mínimos quadrados, fatorização LU, inversão matricial, etc Criação de classes para outros tipos de matrizes De banda, tridiagonais, ortogonais, triangulares, unitárias, esparsas Implementação de métodos não oferecidos pelo ScaLAPACK Equações diferenciais, estatística, visão, etc. Conclusões