The following are known errors or changes that we have made
to the specification.
1. (Fixed in IJSA version) Removal of complex data types from reduce operations.
Changes:
- page 113, line 36, remove `` Complex.''
- page 115, line 42, remove the entire line containing MPI_2COMPLEX.
- page 209, line 12, remove the line containing MPI_2COMPLEX.
2. (Fixed in IJSA version) MPI_Status passed as pointer
everywhere (an issue for the C binding only). Changes:
- page 21, line 16, should say: MPI_Status *status
- page 73, line 33, should say: MPI_Status *status
- page 52, line 6, should say: MPI_Status *status
- page 211, line 24, should say: MPI_Status *status
- page 212, line 26, should say: MPI_Status *status
- page 213, line 35, should say: MPI_Status *status
3. (Fixed in IJSA version) Pointers to storage area should be of type
MPI_Aint, rather than int. Changes:
- page 68, line 27, should say: MPI_Aint *extent
- page 68, line 39, should say: MPI_Aint *size
- page 70, line 15, should say: MPI_Aint *displacement
- page 70, line 26, should say: MPI_Aint *displacement
- page 213, line 24, should say: MPI_Aint *extent
- page 213, line 25, should say: MPI_Aint *size
- page 213, line 29, should say: MPI_Aint *displacement
- page 213, line 30, should say: MPI_Aint *displacement
4. (Fixed in IJSA version)
- page 83, lines 36, 42, 48, change "outcount" to "outsize"
- page 84, lines 1, 4, change "OUTCOUNT" to "OUTSIZE"
- page 221, lines 8, 11, change "OUTCOUNT" to "OUTSIZE"
5. (Fixed in IJSA version)
In section 3.2.2, the sentence fragment:
should be
6. The wording of the description of MPI_GROUP_RANGE_EXCL is confusing
but I haven't decided what to change it to, yet. The function prototypes are
correct, I believe.
7. The example on page 148. The example would be more illustrious if
MPI_Reduce(...,MPI_SUM, 1, commslave) -> MPI_Reduce(...,MPI_SUM, 0, commslave)
The communicator commslave is composed of the group grprem which is
MPI_GROUP_WORLD without process 0. As such,
grprem is numbered from 0
to (Numprocs - 2) where Numprocs is the size of MPI_GROUP_WORLD.
Making the reduce go to process 0 makes the renumbering clear. It
also makes it work for only 2 nodes - the current code fails since
grprem would only have one node/process.
8. (Fixed in IJSA version)
- page 150, line 16, should say: MPI_Comm comm
9. Page 151. This example seems to imply that MPI_Comm_rank returns
MPI_UNDEFINED in ma and mb if the calling process is not in comm_a or
comm_b, respectively. 142 says nothing about this. If this was the
intent (that is would return MPI_UNDEFINED) then the text about
MPI_COMM_RANK should say this. This comment might also apply to
MPI_GROUP_RANK on 135 if we want it to act the same. Their being
the same is implied in the comments in the text.
10. Page 159. It would be a little cleaner to add:
MPI_Comm_free(&myComm);
This is done for Example 2 on page 160.
11. Page 162 Instead of (MPI_Comm) 0 I think it should be MPI_COMM_NULL.
145:8 says MPI_Comm_split returns MPI_COMM_NULL when it has funny
cases. I don't recall reading 0 and NULL were the same for this
case.
12. Page 162.
MPI_Attr_keyval_create -> MPI_Keyval_create
as per page 166. Same comment applies to page 170.
13. Page 165.
MPI_Intercomm_create(local_leader, local_comm, buffer[0],new_world, ..) ->
MPI_Intercomm_create(local_comm, local_leader, new_world, buffer[0], ..)
as defined on 157.
14. Page 167 It seems to me that the Fortran definition needs IERROR.
167 says that it returns MPI_SUCCESS if it works. Only the C
version seems to have a way to return this.
The same comment applies to: 167 for DELETE_FUNCTION
15. Page 167 Do we want MPI_NULL_FN, MPI_DUP_FN in Appendix A? It is a
function but some are listed
16. Page 167 MPI_KEYVAL_INVALID seems to be missing from Appendix A.
17. Page 169, line 38, A null Rational should be removed.
18. Page 170 MPI_Abort takes a comm and error code, not string as defined
Page 197.
19. Page 171
MPI_Comm comm -> MPI_Comm *comm.
See definition on 167.
And, For the same reason,
int keyval -> int *keyval
And
gop_stuff_copier(..., gop_stuff, extra) ->
gop_stuff_copier(..., extra, gop_stuff_in, gop_stuff_out, flag)
per definition on page 166.
And
MPI_Comm comm -> MPI_Comm *comm
And
int keyval -> int *keyval.
Also need to add *flag for above change
gop_stuff_type *gop_stuff -> gop_stuff_type *gop_stuff_in, **gop_stuff_out
And, I think we need to add the line:
*gop_stuff_out = gop_stuff_in;
Right now, the routine does not appear to copy anything; only
increments the reference count.
And, need to make
gop_stuff -> gop_stuff_in
if you make the other changes.
20. Page 215, line 31:
int MPI_Comm_compare( MPI_Comm comm1, comm2, int *result )
should be
int MPI_Comm_compare( MPI_Comm comm1, MPI_Comm comm2, int *result )
21. Page 142, line 39. The sentence should read:
MPI_IDENT results if and only if comm1 and comm2 are
handles to the same object (identical groups and same contexts) or
both are null.
22.
- page 47 Example 3.14, line 35
CALL MPI_IRECV(a(i,1), n, MPI_REAL, 0, tag,
should be replaced with
CALL MPI_IRECV(a(i,1), n, MPI_REAL, i, tag,
- page 47 Example 3.14, line 41
CALL MPI_IRECV(a(1,index), n, MPI_REAL, 0, tag,
should be replaced with
CALL MPI_IRECV(a(1, index), n, MPI_REAL, index, tag,
- page 48, Example 3.15, line 11
CALL MPI_IRECV(a(i,1), n, MPI_REAL, 0, tag,
should be replaced with
CALL MPI_IRECV(a(i,1), n, MPI_REAL, i, tag,
- page 48, Example 3.15, line 19
CALL MPI_IRECV(a(1, index_list(i)), n, MPI_REAL, 0, tag,
comm, request_list(i), ierr)
should be replaced with
CALL MPI_IRECV(a(1, index_list(i)), n, MPI_REAL, index_list(i), tag,
comm, request_list(index_list(i)), ierr)