I came across this today
MPI_ERR_COUNT Invalid count argument. Count arguments must be non-negative; a count of zero is often valid.
What does it mean by a count of zero is often valid? Does it mean that it is implementation dependent?
I came across this today
MPI_ERR_COUNT Invalid count argument. Count arguments must be non-negative; a count of zero is often valid.
What does it mean by a count of zero is often valid? Does it mean that it is implementation dependent?
I think you're reading too much into it. I think it means simply that depending on the user implementation, anything from 0 a random positive integer is a valid count. It's not hard to imagine a message tag that requires no parameters.
If a message tag requires no parameters, then it is valid to send only zero (and, in fact, possibly invalid to send more than that). You have to keep in mind that no parameters is not the same thing as no data, as the message tag is a "parameter" in and of its own.
It means that any function in MPI that requires a message data size to be specified accepts zero but that doesn't mean that it would lead to correct application code.
For example, MPI_Send accepts 0 as count and will always send an empty message that carries no data but still has an envelope and that can be received by any matching MPI_Recv. On the other hand if you specify 0 as the count in MPI_Recv you will get a message truncation error for any matching non-empty message that has arrived. That is 0 is almost never a valid (from the application point of view) count value for MPI_Recv although it is perfectly acceptable for MPI.
Zeroes are widely accepted in MPI since that enables one to write more symmetric code (e.g. code without lots of if (count != 0) ...
symmetric code argument ... Sometimes the information from the message envelope is all you need (to syncrhonize two processes for example).if-s in the code and thus it is more easy to read and understand it. Another example is the use of MPI_PROC_NULL to prevent rank-specific logic in border processes in a non-periodic Cartesian topology, e.g. "if I am not the highest rank, then send a message to rank+1" or "if I am not rank 0, then receive a message from rank-1".