[mpich-discuss] MPI_Waitsome and MPI_Getcount incorrect

Rajeev Thakur thakur at mcs.anl.gov
Tue Dec 22 10:48:21 CST 2009


I am not able to reproduce this problem when running MPICH2 1.2.1 with 2 processes on a single machine.

Rajeev 

> -----Original Message-----
> From: mpich-discuss-bounces at mcs.anl.gov 
> [mailto:mpich-discuss-bounces at mcs.anl.gov] On Behalf Of Tamás Faragó
> Sent: Wednesday, December 16, 2009 7:48 AM
> To: mpich-discuss at mcs.anl.gov
> Subject: [mpich-discuss] MPI_Waitsome and MPI_Getcount incorrect
> 
> My actual problem, why I initiated the previous post at 
> http://lists.mcs.anl.gov/pipermail/mpich-discuss/2009-December
> /006187.html
> ([mpich-discuss] MPI_GET_COUNT behaviour unclear).
> 
> See the very simple source code below. I initialise two 
> persistent requests, then run a Waitsome on both of them and 
> getting the top-level datatypes received. With Waitsome the 
> second one returns MPI_UNDEFINED, no idea why. Waitall 
> correctly returns 1 in both cases.
> What is going on, is it my fault and can it be solved?
> 
> I have also uploaded the source code to 
> http://www.liacs.nl/~tfarago/test.cpp
> NOTE: right now the tags are all the same, but even if 
> different tags are given to the sending and receiving side 
> (eg 0 and 1), the outcoume is the same. From the output it 
> can be seen that even if MPI_GET_COUNT returns some kind of 
> an error the program's behaviour is still correct.
> NOTE: also, strangely I cannot get Waitsome to return both 
> completed requests, not even if I let the client sleep/idle 
> for several seconds.
> 
> ---CODE--
> #include <stdarg.h>
> #include <stdio.h>
> #include <mpi.h>
> 
> #pragma comment(lib, "cxx.lib")
> #pragma comment(lib, "mpi.lib")
> 
> void __cdecl debug(const char* msg, ...) {
> 	va_list va;
> 	va_start(va, msg);
> 	vfprintf(stderr, msg, va);
> 	fputs("\n", stderr);
> 	fflush(stderr);
> }
> 
> int main() {
> 	MPI::Init();
> 	int my_node = MPI::COMM_WORLD.Get_rank();
> 
> 	int a, b;
> 	MPI::Prequest req[2];
> 	a = 0; b = 0;
> 	if (my_node == 0) {
> 		a = 1; b = 2;
> 		req[0] = MPI::COMM_WORLD.Send_init(&a, 1, 
> MPI::INT, 1, 0);
> 		req[1] = MPI::COMM_WORLD.Send_init(&b, 1, 
> MPI::INT, 1, 0);
> 	} else {
> 		size_t size = MPI::INT.Pack_size(1, MPI::COMM_WORLD);
> 
> 		req[0] = MPI::COMM_WORLD.Recv_init(&a, size, 
> MPI::INT, 0, MPI::ANY_TAG);
> 		req[1] = MPI::COMM_WORLD.Recv_init(&b, size, 
> MPI::INT, 0, MPI::ANY_TAG);	
> 	}
> 
> 	MPI::Prequest::Startall(2, req);
> 
> 	if (my_node == 0) {
> 		debug("host: a %d, b %d", a, b);
> 	} else {
> 		debug("client before: a %d, b %d", a, b);
> 		int array_of_indeces[2];
> 		MPI::Status array_of_statuses[2];
> 		MPI::Datatype array_of_types[2];
> 		array_of_types[0] = MPI::INT;
> 		array_of_types[1] = MPI::INT;
> #if 1
> 		for (;;) {
> 			/* wait for one, or multiple requests 
> to finish */
> 			int outcount = 
> MPI::Request::Waitsome(2, req, array_of_indeces, array_of_statuses);
> 			if (outcount == MPI_UNDEFINED) break; 
> /* no active handles */
> 
> 			debug("received count: %d", outcount);
> 			for (outcount--; outcount >= 0; --outcount) {
> 				size_t index = 
> array_of_indeces[outcount];
> 
> 				debug("MPI_Waitsome index %d", index);
> 				int recv_count = 
> array_of_statuses[index].Get_count(array_of_types[index]);
> 				debug("MPI_GET_COUNT %d", recv_count);
> 			}
> 		}
> #else
> 		MPI::Prequest::Waitall(2, req, array_of_statuses);
> 
> 		for (int outcount = 2; outcount > 0; --outcount) {
> 			int recv_count =
> array_of_statuses[outcount-1].Get_count(array_of_types[outcount-1]);
> 			debug("MPI_GET_COUNT %d", recv_count);
> 		}
> #endif
> 		debug("client after: a %d, b %d", a, b);
> 	}
> 
> 	debug("done, waiting....");
> 	MPI::COMM_WORLD.Barrier();
> 	debug("finalize");
> 	MPI::Finalize();
> 	return 0;
> }
> ---CODE---



More information about the mpich-discuss mailing list