<div dir="ltr"><div>Hello, </div><div><br></div><div>I am new to the MPI forum and I hope you can help me with my problem. </div><div><br></div><div>I am currently working on ROMIO developing a modification that enables the usage of locally attached SSDs as persistent cache in a HPC cluster. This extension is supposed to improve collective write operations performance, making them complete faster on local storage devices (scaling linearly with the number of aggregator nodes) and afterwards asynchronously flushing the local data to global file system while the application can progress with computation. </div><div><br></div><div>The extension uses the MPI Generalized request interface to provide non-blocking flushing of local data to global file system. I have added an ADIO_WriteContigLocal() function to the "common" ADIO driver that can be triggered by an apposite MPI hint (e.g. local_cache = enable) set by the application. The flushing of local data is started immediately after ADIOI_GEN_WriteStridedColl() returns to MPI_File_write_all(). The non-blocking syncing function starts a new pthread (I know this is not portable but the cluster I am using supports pthreads :-) ) and assigns it a file domain, which will be then read from the local file and written to the global file system. </div><div><br></div><div>When the file is finally closed, the implementation (still accordingly to the specific MPI hint) invokes an ADIO_CloseLocal() function which MPI_Wait(s) for all the pending generalized requests that have been started earlier. Finally, in ADIO_Close() I have a MPI_Barrier() to make sure that when MPI_File_close() returns all the file domains are consistent with the file in the global file system. </div><div><br></div><div>I am testing my code using IOR with the following configuration on a single node with 8 cores:</div><div><br></div><div><font face="courier new, monospace">$ mpiexec -np 8 ~/benchmarks/IOR/IOR -r -w -a MPIIO -b 1m -t 1m -c -s 5 -U ~/romio-totalview-dbg/ior.hints -o /work/ior11/testFile -H -V</font></div><div><br></div><div>Strangely, when I increment the number of segments to be written by each process (i.e. -s) above 4/5 I get that IOR aborts with errors. Follows an example:</div><div><br></div><div><div><font face="courier new, monospace">Command line used: ~/benchmarks/IOR/IOR -r -w -a MPIIO -b 1m -t 1m -c -s 5 -U ~/romio-totalview-dbg/ior.hints -o /work/ior11/testFile -H -V</font></div><div><font face="courier new, monospace">Machine: Linux xxxx128</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">Summary:</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>api                = MPIIO (version=3, subversion=0)</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>test filename      = /work/ior11/testFile</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>access             = single-shared-file</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">     </span>ordering in a file = sequential offsets</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>ordering inter file= no tasks offsets</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">     </span>clients            = 8 (8 per node)</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>repetitions        = 1</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>xfersize           = 1 MiB</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>blocksize          = 1 MiB</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>aggregate filesize = 40 MiB</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">hints passed to MPI_File_open() {</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>cb_buffer_size = 16777216</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>cb_nodes = 1</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>romio_cb_read = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">    </span>romio_cb_write = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   local</span>_cache = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      local</span>_cache_path = /tmp/ior_tmp_file</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      local</span>_cache_flush_flag = flush_immediate</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  local</span>_cache_discard_flag = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>romio_no_indep_rw = true</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">hints returned from opened file {</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>cb_buffer_size = 16777216</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>romio_cb_read = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">    </span>romio_cb_write = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>cb_nodes = 1</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>romio_no_indep_rw = true</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>romio_cb_pfr = disable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">    </span>romio_cb_fr_types = aar</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>romio_cb_fr_alignment = 1</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>romio_cb_ds_threshold = 0</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>romio_cb_alltoall = automatic</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">     </span>ind_rd_buffer_size = 4194304</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>ind_wr_buffer_size = 524288</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">       </span>romio_ds_read = automatic</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> </span>romio_ds_write = automatic</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">        local</span>_cache = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      local</span>_cache_flush_flag = flush_immediate</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  local</span>_cache_discard_flag = enable</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre"> local</span></font><span style="font-family:'courier new',monospace">_cache_path = /tmp/ior_tmp_file</span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">       </span>cb_config_list = *:1</font></div><div><font face="courier new, monospace">}</font></div><div><font face="courier new, monospace">Assertion failed in file ~/mpich2/src/mpi/coll/helper_fns.c at line 491: status->MPI_TAG == recvtag</font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 1 exited with status 1.</font></div><div><font face="courier new, monospace">(null)</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Barrier: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Barrier(428)......: MPI_Barrier(comm=0x84000001) failed</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(335).: Failure during collective</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(328).: </font></div><div><font face="courier new, monospace">MPIR_Barrier(292)......: </font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Barrier: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Barrier(428)......: MPI_Barrier(comm=0x84000001) failed</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(335).: Failure during collective</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(328).: </font></div><div><font face="courier new, monospace">MPIR_Barrier(292)......: </font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 4 exited with status 1.</font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Barrier: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Barrier(428)......: MPI_Barrier(comm=0x84000001) failed</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(335).: Failure during collective</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(328).: </font></div><div><font face="courier new, monospace">MPIR_Barrier(292)......: </font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Barrier: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Barrier(428)......: MPI_Barrier(comm=0x84000001) failed</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(335).: Failure during collective</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(328).: </font></div><div><font face="courier new, monospace">MPIR_Barrier(292)......: </font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 3 exited with status 1.</font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Barrier: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Barrier(428)......: MPI_Barrier(comm=0x84000000) failed</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(335).: Failure during collective</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(328).: </font></div><div><font face="courier new, monospace">MPIR_Barrier(292)......: </font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 5 exited with status 1.</font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">wait entry: 2a1ef18, 21f2790, 2a1e8e8, 21f4488</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Wait: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Wait(180)..........: MPI_Wait(request=0x21f4488, status=0x21f2138) failed</font></div><div><font face="courier new, monospace">MPIR_Wait_impl(77)......: </font></div><div><font face="courier new, monospace">MPIR_Grequest_query(447): user request query function returned error code 1601</font></div><div><font face="courier new, monospace">Fatal error in PMPI_Barrier: Other MPI error, error stack:</font></div><div><font face="courier new, monospace">PMPI_Barrier(428)......: MPI_Barrier(comm=0x84000000) failed</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(335).: Failure during collective</font></div><div><font face="courier new, monospace">MPIR_Barrier_impl(328).: </font></div><div><font face="courier new, monospace">MPIR_Barrier(292)......: </font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div><div><font face="courier new, monospace">MPIR_Barrier_intra(169): </font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 2 exited with status 1.</font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 7 exited with status 1.</font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 6 exited with status 1.</font></div><div><font face="courier new, monospace">PSIlogger: Child with rank 0 exited with status 1.</font></div><div><font face="courier new, monospace">mpid_irecv_done(101)...: read from socket failed - request state:recv(pde)done</font></div></div><div><br></div><div>I am using MPICH version 3.1 and I have enabled multi-thread support for it. Nevertheless, there seems to be some problem with MPI_Barrier() and MPI_Wait(). The MPI_Wait() error in particular seems to be related to the bug reported at this link: <a href="http://trac.mpich.org/projects/mpich/ticket/1849">http://trac.mpich.org/projects/mpich/ticket/1849</a>, which BTW I fixed accordingly but without any luck I would say. </div><div><br></div><div>To further provide some description of what is happening here: when I increment the number of segments, IOR will increment the number of calls to MPI_File_write_all() (made one after the other). For every collective write my extension keeps track of the new file domain and starts a new thread to "handle" it. Eventually, there might be a number of pthread (active at the same time) equal to the number of segments, which should not be a problem considering small numbers like 5 or 10. </div><div><br></div><div>Does anyone have a clue of what is going wrong here?</div><div><br></div><div>Many Thanks,</div><div><br></div><div>-- <br></div><div class="gmail_signature"><div dir="ltr">Giuseppe Congiu <strong>·</strong> Research Engineer II<br>
Seagate Technology, LLC<br>
office: +44 (0)23 9249 6082 <strong>·</strong> mobile: <br>
<a href="http://www.seagate.com" target="_blank">www.seagate.com</a><br></div></div>
</div>