A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Multiplicação Matriz-Vector Y i = A ij X j Solução II > A divida por colunas > X dividido por blocos N ( N/P multiplicações + (N/P-1) somas ) Soma Colectiva.

Apresentações semelhantes


Apresentação em tema: "Multiplicação Matriz-Vector Y i = A ij X j Solução II > A divida por colunas > X dividido por blocos N ( N/P multiplicações + (N/P-1) somas ) Soma Colectiva."— Transcrição da apresentação:

1 Multiplicação Matriz-Vector Y i = A ij X j Solução II > A divida por colunas > X dividido por blocos N ( N/P multiplicações + (N/P-1) somas ) Soma Colectiva N = k*P Y calculado em ~ 2N 2 T vf / P + comunicações =

2 Exercício Implemente a multiplicação de uma matriz por um vector usando a decomposição discutida no slide anterior. int MPI_Allreduce ( void *sendbuf, void *recvbuf, int count, MPI_Datatype datatype, MPI_Op op, MPI_Comm comm )

3 Derived Data Types Tipos Básicos pré-definidos

4 Dados não estão em endereços de memória sucessivos Dados não são todos do mesmo tipo Recurso ao envio de várias mensagens e/ou buffers temporários maiores overheads Envio de uma Submatriz for (i=0; i

5 PACKING utilização de um buffer contíguo definido pelo utilizador MPI_PACKED = tipo de dados a enviar MPI_Pack(void *inbuf, int incount, MPI_Datatype datatype, void *outbuf, int outcount, int *position, MPI_Comm comm) MPI_Pack_size(int incount, MPI_Datatype datatype, MPI_Comm comm, int *sizee) MPI_Pack_size( n*m, MPI_DOUBLE, MPI_COMM_WORLD, buffersize); buffer = malloc( (unsigned) buffersize ); conta = 0; for (i=1; i <= n; i++){ MPI_Pack(A[shift_linha+i][shift_coluna], m, MPI_DOUBLE, buffer, buffersize, count, MPI_COMM_WORLD); conta++;} MPI_Send(buffer, count, MPI_PACKED, dest, tag, MPI_COMM_WORLD);

6 MPI_Recv(buffer, length, MPI_PACKED, source, tag, MPI_COMM_WORLD, &status); posicao = 0; for (i=1; i <= n; i++){ MPI_Unpack( buffer, length, &posicao, &A[shift_linha+i][shift_coluna], m, MPI_DOUBLE, MPI_COMM_WORLD); posicao++; } MPI_Unpack(void *inbuf, int insize, int *position, void *outbuf, int outcount, MPI_Datatype datatype, MPI_Comm comm)

7 Packing on the fly elimina a operação de packing e a necessidade de utilização de um buffer intermédio i) Contrução do derived datatype: MPI_Type_contiguous, MPI_Type_vector, MPI_Type_hvector, MPI_Type_indexed, MPI_Type_hindexed, MPI_Type_struct ii) commit o datatype: MPI_Type_commit MPI_Type_free(datatype)datatype = MPI_DATATYPE_NULL

8 MPI_Type_contiguous( int count, MPI_Datatype oldtype, MPI_Datatype *newtype) MPI_Type_commit( MPI_Datatype *datatype) MPI_Type_free(MPI_Datatype *datatype) double a[size][size], b[size]; MPI_Datatype linha;... MPI_Type_contiguous( size, MPI_DOUBLE, &linha); MPI_Type_commit(&linha);... MPI_Send(&a[i][0], 1, linha,... );... MPI_Recv( b, size, MPI_DOUBLE,... );... MPI_Type_free(&linha);

9 MPI_Type_vector( int count, int blocklength, int stride, MPI_Datatype oldtype, MPI_Datatype *newtype ) stride blocklength Count = 3 double a[size][size], b[size]; Datatype coluna;... MPI_Type_vector( size, 1, size, MPI_DOUBLE, &coluna); MPI_Type_commit(&coluna);... MPI_Send( &a[0][i], 1, coluna,... ); MPI_Recv( b, size, MPI_DOUBLE, MPI_Type_free(&coluna);

10 MPI_Type_indexed( int count, int *array_of_blocklengths, int *array_of_displacements, MPI_DATAtyoe oldtype, MPI_Datatype *newtype int blocklengths[2], displacements[2]; double a[16], b[6]; MPI_Datatype indexado; blocklengths[0] = 4; blocklengths[1] = 2; displacements[0] = 5; displacements[1] = 12;... MPI_Type_indexed(2, blocklengths, displacements, MPI_DOUBLE, &indexado); MPI_Type_commit(&indexado);... MPI_Send(a, 1, indexado,...); /* envia a[5]-a[8] + a[12]-a[13] */... MPI_Recv( b, 6, MPI_DOUBLE,... )

11 MPI_Type_struct( int count, int *array_of_blocklengths, MPI_Aint *array_of_displacements, MPI_Datatype *array_of_types, MPI_Datatype *newtype); MPI_Type_get_extent( MPI_Datatype datatype, MPI_Aint *lb, MPI_Aint *extent ); typedef long MPI_Aint; lb = lower bound = mínimo dos displacements extent = onde está o endereço do próximo bloco de dados

12 Typedef struct{ double x, y, z; double velocidade; int n, tipo; } particula; particula p[NElementos], particulas[NElementos]; MPI_Datatype tipoparticula, oldtypes[2]; int blockounts[2]; MPI_Aint offsets[2], extent, lb; /* coordenadas e velocidade */ offsets[0] = 0; oldtypes[0] = MPI_DOUBLE; blockcounts[0] = 4; MPI_Type_get_extent( MPI_DOUBLE, &lb, &extent); /* incluir o número e o tipo */ offsets[1] = 4*extent; oldtypes[1] = MPI_INT;blockcounts[1] = 2; MPI_Type_struct( 2, blockcounts, offsets, oldtypes, &tipoparticula ); MPI_Type_commit( &tipoparticula ); MPI_Send(particulas, Nelementos, tipoparticula,... ) MPI_Recv(p, Nelementos, tipoparticula,... )


Carregar ppt "Multiplicação Matriz-Vector Y i = A ij X j Solução II > A divida por colunas > X dividido por blocos N ( N/P multiplicações + (N/P-1) somas ) Soma Colectiva."

Apresentações semelhantes


Anúncios Google