Ralph Castain wrote:
I probably wasn't clear - see below
On Nov 14, 2008, at 6:31 PM, Eugene Loh wrote:
Ralph Castain wrote:
I have two examples so far:
1. using a ramdisk, /tmp was set to 10MB. OMPI was run on a single
node, 2ppn, with btl=openib,sm,self. The program started, but
segfaulted on the first MPI_Send. No warnings were printed.
Interesting. So far as I can tell, the actual memory consumption
(total number of allocations in the mmapped segment) for 2 local
processes should be a little more than half a Mbyte. The bulk of
that would be from fragments (chunks). There are
btl_sm_free_list_num=8 per process, each of
btl_sm_max_frag_size=32K. So, that's 8x2x32K=512Kbyte. Actually, a
little bit more. Anyhow, that accounts for most of the allocations,
I think. Maybe if you're sending a lot of data, more gets allocated
at MPI_Send time. I don't know.
While only < 1 Mbyte is needed, however, mpool_sm_min_size=128M will
be mapped.
Right - so then it sounds to me like this would fail (which it did)
since /tmp was fixed to 10M - and the mpool would be much too large
given a minimum size of 128M. Right?
That makes sense to me.
My analysis of how little of the mapped segment will actually be used is
probably irrelevent.
Here is what I think should happen:
*) The lowest ranking process on the node opens and ftruncates the
file. Since there isn't enough space, the ftruncate fails. This is in
mca_common_sm_mmap_init() in ompi/mca/common/sm/common_sm_mmap.c.
*) The value sm_inited==0 is broadcast from this process to all other
local processes.
*) Nobody tries to mmap the file.
*) On each local process, mca_common_sm_mmap_init() returns a NULL map
to mca_mpool_sm_init(). This, incidentally, is the function where the
size of the backing file is determined, bounded by those max/min parameters.
*) In turn, mca_mpool_sm_init() returns a NULL value.
*) Therefore, sm_btl_first_time_init() returns OMPI_ERROR.
*) Therefore, mca_btl_sm_add_procs() goes into "CLEANUP" and returns
OMPI_ERROR.
*) Therefore, mca_bml_r2_add_procs() gives up on this BTL and tries to
establish connections otherwise.
I'm a little clear what should happen next. But, to reiterate, all
local processes should fail and indicate to the BML that the sm BTL
wasn't going to work for them.
It doesn't make sense that this case would fail, but the next case
should run. Are you sure this is related to the SM backing file?
Sorry, let me take that back. It does make some sense that the first
case would fail. The possible exception is if the connections fall over
to another BTL (openib, I presume).
What's weird is that the second case runs.
2. again with a ramdisk, /tmp was reportedly set to 16MB
(unverified - some uncertainty, could be have been much larger).
OMPI was run on multiple nodes, 16ppn, with btl=openib,sm,self.
The program ran to completion without errors or warning. I don't
know the communication pattern - could be no local comm was
performed, though that sounds doubtful.
This case -did- run successfully. However, what puzzled me is that it
seems like it shouldn't have run because the 128M minimum was still
much larger than the available 16M.
Right. Weird.
One point that was made on an earlier thread - I don't know if either
of these cases had a tmpfs file system. I will try to find out. My
guess is "no" based on what I have been told so far - i.e., in both
cases, I was told that /tmp's size was "fixed", but that might not be
technically accurate.
As to whether we are sure about this being an SM backing file issue:
no, we can't say with absolute certainty. However, I can offer two
points of validation:
1. the test that failed (#1) ran perfectly when we set btl=^sm
2. the test that failed (#1) ran perfectly again after we increased /
tmp to 512M
The test that did not fail (#2) has never failed for sm reasons as
far as we know. We have had IB problems on occasion, but we believe
that is unrelated to this issue.
My point here was simply that I have two cases, one that failed and
one that didn't, that seem to me to be very similar. I don't
understand the difference in behavior, and am concerned that users
will be surprised - and spend a lot of energy trying to figure out
what happened. The possibility Tim M raised about the tmpfs may
explain the difference (if #2 used tmpfs and #1 didn't), and I will
check that ASAP.
I share your surprise.
Incidentally, does the MPI program test the return value from MPI_Init?
Another thing I've wondered about is if OMPI fails in MPI_Init() and
correctly indicates this to the user, but the user doesn't check the
MPI_Init() return value.
User: You were broken!
OMPI: Yes, I know! I TOLD you I was broken, but you didn't listen.