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

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

Multiplicação Matriz-Vector

Apresentações semelhantes


Apresentação em tema: "Multiplicação Matriz-Vector"— Transcrição da apresentação:

1 Multiplicação Matriz-Vector
Yi = Aij Xj 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 ~ 2N2 Tvf / P + comunicações 1 2 3 4 =

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<n; ++i) MPI_Send( &a[shift_linha + i][shift_coluna], m, MPI_DOUBLE, dest, tag, MPI_COMM_WORLD);

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 Count = 3 blocklength 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"

Apresentações semelhantes


Anúncios Google