[mpich-discuss] MPI_Waitsome and MPI_Getcount incorrect

jayesh at mcs.anl.gov jayesh at mcs.anl.gov
Mon Jan 4 09:43:06 CST 2010


Hi,
 There is a bug in your code which results in accessing invalid indices of the status array.
 Please modify the for loop in your code as below and let us know if it works for you.

####################################################################

		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 (int index=0; index<outcount; index++) {
				/* size_t index = array_of_indeces[outcount]; */
                int req_index = array_of_indeces[index];

                debug("Request %d completed", req_index);
				int recv_count = array_of_statuses[index].Get_count(array_of_types[req_index]);
				debug("MPI_GET_COUNT %d", recv_count);
			}
		}

####################################################################

Regards,
Jayesh

----- Original Message -----
From: "Tamás Faragó" <fafarago at gmail.com>
To: mpich-discuss at mcs.anl.gov
Sent: Monday, December 28, 2009 3:55:51 AM GMT -06:00 US/Canada Central
Subject: Re: [mpich-discuss] MPI_Waitsome and MPI_Getcount incorrect

Sorry for the late reply but I was out of the country for a week. I am
using MPICH2 1.2.1 on a WinXP SP3 machine running an Intel Core i5
CPU. This is the output I get when running the application (mpiexec -n
2 -l test3.exe)

[1]client before: a 0, b 0
[0]host: a 1, b 2
[0]done, waiting....
[1]received count: 1
[1]MPI_Waitsome index 0
[1]MPI_GET_COUNT 1
[1]received count: 1
[1]MPI_Waitsome index 1
[1]MPI_GET_COUNT -32766
[1]client after: a 1, b 2
[1]done, waiting....
[0]finalize
[1]finalize

On 22/12/2009, Rajeev Thakur <thakur at mcs.anl.gov> wrote:
> 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---
>
> _______________________________________________
> mpich-discuss mailing list
> mpich-discuss at mcs.anl.gov
> https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss
>
_______________________________________________
mpich-discuss mailing list
mpich-discuss at mcs.anl.gov
https://lists.mcs.anl.gov/mailman/listinfo/mpich-discuss


More information about the mpich-discuss mailing list