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.