Point-to-Point Communication
Standard,
Síncrono
Síncrono,
Buffered,
Completion Completion
Ready (modos de comunicar)
Completion
ou
após
sempre
sempre
buffered
conclusão
independentemente independentemente
da recepção da recepção
da recepção
Modos de comunicação: blocking ou non-blocking
Exemplos simples podem ser vistos AQUI
STANDARD SEND
MPI_Send (&buf, count, datatype, dest, tag, comm)
não devem assumir completion antes de o receive ser iniciado
não devem assumir completion após o receive ser iniciado
processos devem preferencialmente receptores
SEND SÍNCRONO
MPI_Ssend (&buf, count, datatype, dest, tag, comm)
(blocking send síncrono) a usar quando o emissor quer ter a certeza
que a mensagem foi recebida
BUFFERED SEND
MPI_Bsend (&buf, count, datatype, dest, tag, comm)
blocking buffered send
completion imediato
MPI_Buffer_attach (&buffer, size)
MPI_Buffer_detach (&buffer, size)
onde size é o tamanho em bytes do buffer a usar
int MPI_Get_count(MPI_Status *status,
MPI_Datatype datatype,
int *count);
READY SEND
MPI_Rsend (&buf, count, datatype, dest, tag, comm)
blocking ready send
a comunicação pressupõe que está já activo um receive.
Se não estiver activo o receive correspondente, o resultado é indefinido.
Iteração
Iteração
actualiza linhas fantasma;
inicializa o envio das linhas fronteira
actualiza u(x,y)
inicializa a recepção linhas fronteira
actualiza u(x,y) nas linhas interiores
espera pelo completion do envio
espera pelo completion do receive
actualiza última e primeira linhas de u(x,y)
NONBLOCKING STANDARD SEND
MPI_Isend(void *buf,
int count,
MPI_Datatype datatype,
int dest,
int tag,
MPI_Comm comm,
MPI_Request *request)
typedef int MPI_Request;
Send Síncrono
MPI_Iisend
Buffered Send
MPI_Bsend
Ready Send
MPI_Rsend
Receive
MPI_Irecv
MPI_Wait( MPI_Request *request, MPI_Status *status)
MPI_Waitall(int count, MPI_Request *array_of_requests,
MPI_Status *array_of_status)
MPI_Waitany(int count, MPI_Request *array_of_requests, int *index,
MPI_Status *status)
MPI_Waitsome(int incount, MPI_Request *array_of_request, int *outcount,
int *array_of_indices, MPI_Status *array_of_status)
MPI_Test( MPI_Request *request, int *flag, MPI_Status *status)
MPI_Testall( int count, MPI_Request *array_of_requests, int * flag,
MPI_Status *array_of_statuses )
MPI_Testany( int count, MPI_Request *array_of_requests, int *index
int *flag, MPI_Status *status)
MPI_Testsome( int incount, MPI_Request *array_of_requests,
int *outcount, int *array_of_indices, MPI_Status *array_of_status )
Exercício
Modifique os programa para a resolução da equação de Poisson para utilizar
cada um dos tipos de comunicação possível apresentados e compare as
suas performances quando N = 1000.
Download

ppt - Nautilus