Ticket #664 (closed bug: fixed)
FW: Problem with MPI_Type_commit() and assert insegment_ops.c
| Reported by: | "Rajeev Thakur" <thakur@…> | Owned by: | rross |
|---|---|---|---|
| Priority: | major | Milestone: | mpich2-1.1.1 |
| Component: | mpich2 | Keywords: | |
| Cc: | jratt@… |
Description
_____
From: mpich2-dev-bounces@mcs.anl.gov
[mailto:mpich2-dev-bounces@mcs.anl.gov] On Behalf Of Joe Ratterman
Sent: Tuesday, June 09, 2009 3:14 PM
To: MPICH2 Dev
Subject: [mpich2-dev] Problem with MPI_Type_commit() and assert
insegment_ops.c
The specifics of this test come from an MPI excerciser that gathered
(using MPIR_Gather) a variety of types, including MPI_SHORT_INT. The
way that gather is implemented, it created and then sent a struct
datatype of the tmp-data from the software tree and the local-data. I
pulled out the important bits, and got this test-case. It asserts on
PPC32 Linux 1.1 and BGP 1.1rc0, but runs fine on 1.0.7. The
addresses/displacements are fake, but were originally based on the
actual values used inside MPIR_Gather. It does the type-create on the
first two types just to show that it doesn't always fail.
Error message:
Creating addr=[0x1,0x2] types=[8c000003,4c00010d] struct_displs=[1,2]
blocks=[256,256] MPI_BOTTOM=(nil)
foo:25
Assertion failed in file segment_ops.c at line 994: *lengthp > 0
internal ABORT - process 0
Code
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mpi.h>
void foo(void *sendbuf,
MPI_Datatype sendtype,
void *recvbuf,
MPI_Datatype recvtype)
{
int blocks[2];
MPI_Aint struct_displs[2];
MPI_Datatype types[2], tmp_type;
blocks[0] = 256;
struct_displs[0] = (size_t)sendbuf;
types[0] = sendtype;
blocks[1] = 256;
struct_displs[1] = (size_t)recvbuf;
types[1] = MPI_BYTE;
printf("Creating addr=[%p,%p] types=[%x,%x] struct_displs=[%x,%x]
blocks=[%d,%d] MPI_BOTTOM=%p\n",
sendbuf, recvbuf, types[0], types[1], struct_displs[0],
struct_displs[1], blocks[0], blocks[1], MPI_BOTTOM);
MPI_Type_create_struct(2, blocks, struct_displs, types, &tmp_type);
printf("%s:%d\n", __func__, __LINE__);
MPI_Type_commit(&tmp_type);
printf("%s:%d\n", __func__, __LINE__);
MPI_Type_free (&tmp_type);
puts("Done");
}
int main()
{
MPI_Init(NULL, NULL);
foo((void*)0x1,
MPI_FLOAT_INT,
(void*)0x2,
MPI_BYTE);
sleep(1);
foo((void*)0x1,
MPI_DOUBLE_INT,
(void*)0x2,
MPI_BYTE);
sleep(1);
foo((void*)0x1,
MPI_SHORT_INT,
(void*)0x2,
MPI_BYTE);
MPI_Finalize();
return 0;
}
I don't know anything about how this might be fixed, but we are looking
into it as well.
Thanks,
Joe Ratterman
jratt@us.ibm.com
Attachments
Change History
Note: See
TracTickets for help on using
tickets.
