<font size=2 face="sans-serif">In light of this discussion could someone
perhaps update the wiki page on striping_unit </font><a href="http://trac.mcs.anl.gov/projects/parallel-netcdf/wiki/StripingUnitHint"><font size=2 face="sans-serif">http://trac.mcs.anl.gov/projects/parallel-netcdf/wiki/StripingUnitHint</font></a>
<br>
<br><font size=2 face="sans-serif">It is the section titled &quot;Example
scenario&quot; that I find confusing. They set the striping_unit to 1/32
of the block size (128kB of 4MiB) to reserve space for an &quot;<i>enormous
header while still making it possible to avoid a few unaligned file system
accesses</i>&quot; </font>
<br>
<br><font size=2 face="sans-serif">Cheers,</font>
<br>
<br><font size=2 face="sans-serif">/Nils</font>
<br><font size=2 face="sans-serif">______________________________________________<br>
Nils Smeds, &nbsp;IBM Deep Computing / World Wide Coordinated Tuning Team<br>
IT Specialist, Mobile phone: +46-70-793 2639<br>
Fax. +46-8-793 9523<br>
Mail address: IBM Sweden; Loc. 5-03; 164 92 Stockholm; SWEDEN</font>
<br>
<br>
<br>
<br><font size=1 color=#5f5f5f face="sans-serif">From: &nbsp; &nbsp; &nbsp;
&nbsp;</font><font size=1 face="sans-serif">Wei-keng Liao &lt;wkliao@ece.northwestern.edu&gt;</font>
<br><font size=1 color=#5f5f5f face="sans-serif">To: &nbsp; &nbsp; &nbsp;
&nbsp;</font><font size=1 face="sans-serif">parallel-netcdf@lists.mcs.anl.gov</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Date: &nbsp; &nbsp; &nbsp;
&nbsp;</font><font size=1 face="sans-serif">03/10/2011 01:26 AM</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Subject: &nbsp; &nbsp;
&nbsp; &nbsp;</font><font size=1 face="sans-serif">Re: pnetCDF
performance issues</font>
<br><font size=1 color=#5f5f5f face="sans-serif">Sent by: &nbsp; &nbsp;
&nbsp; &nbsp;</font><font size=1 face="sans-serif">parallel-netcdf-bounces@lists.mcs.anl.gov</font>
<br>
<hr noshade>
<br>
<br>
<br><tt><font size=2>&gt;&gt; 1) What should the defaults be so that users
get good performance &quot;out of the box&quot;?<br>
<br>
In term of performance, setting the header alignment size to the file striping
size<br>
gives the best performance. But, we also need to consider the file size.
Say, if a user<br>
create a file with a few small arrays each of size a few KBs and the file
system<br>
striping size is 4 MB, do we want to enforce this default alignment? (as
it produces<br>
a lot of used space.)<br>
<br>
Proposed solution below.<br>
<br>
<br>
&gt;&gt; 2) Can/should pnetCDF diagnose poor choices and inform the user?<br>
<br>
The only diagnosis I can think of is to see if a user's choice matches<br>
the file system striping size. (Match means the hints &quot;nc_header_align_size&quot;<br>
chosen by the user being a multiple of striping size.)<br>
<br>
As for informing users a poor choice, Rob's suggestion is fine. I personally<br>
think a feedback from the I/O library (or other stack) is very useful.<br>
 <br>
<br>
&gt;&gt; 3) Can/should MPI-IO &quot;fix&quot; this by exploiting the MPI-IO
semantics<br>
&gt;&gt; to permit converting writes to be aligned (e.g., by caching)?<br>
<br>
In MPI collective I/Os, writes from the aggregators are aligned with the<br>
striping size, if the striping size can be obtained from the system. Currently,
the<br>
ROMIO drivers for PVFS and Lustre are collecting the striping info into<br>
the hints. PnetCDF can use those info to choose a right header alignment
size.<br>
<br>
As for independent I/Os, no alignment is done.<br>
<br>
If the striping info cannot be obtained, pnetcdf currently is using 512
bytes<br>
for the file header alignment size.<br>
<br>
&gt;&gt; <br>
&gt;&gt; Of these, (1) is the most important for pnetCDF, particularly
as<br>
&gt;&gt; users compare approaches.<br>
&gt; <br>
<br>
<br>
I propose the following way to pick a default value.<br>
<br>
if ROMIO can obtain the file striping size<br>
then<br>
 &nbsp; &nbsp; &nbsp;if the total aggregate array size is at least N times
of striping size, (say N=4)<br>
 &nbsp; &nbsp; &nbsp;then pnetcdf uses the file striping size as the header
alignment size<br>
 &nbsp; &nbsp; &nbsp;else 512 bytes is used<br>
else<br>
 &nbsp; &nbsp; &nbsp;use 512 bytes<br>
<br>
(Note that the header size is calculated at the call to ncmpi_enddef. In
the meantime,<br>
 the number of arrays and their sizes are also known.)<br>
<br>
Wei-keng<br>
<br>
&gt; <br>
<br>
<br>
<br>
&gt; One:<br>
&gt; <br>
&gt; pnetcdf could stat the file system, but take a peek at ROMIO's file<br>
&gt; system detection code for the state of portable statfs. &nbsp;today,<br>
&gt; perhaps it is less of a problem than when that code was written a<br>
&gt; decade ago. &nbsp;What I mean to say is: &quot;does there exist a
portable way<br>
&gt; to determine alignment&quot;? &nbsp; st_blksize is probably our best
bet, but on<br>
&gt; Lustre it's actually more important not to align blocks but to hit
the<br>
&gt; same OST.<br>
&gt; <br>
&gt; Just because it's hard doesn't mean we shouldn't do it, of course...<br>
&gt; <br>
&gt; HDF5 has this problem too: both libraries would benefit from an MPI-IO<br>
&gt; interface to &quot;file system features&quot;: alignment and &quot;optimum
tranfer<br>
&gt; size&quot; come to mind. &nbsp;others no doubt.<br>
&gt; <br>
&gt; two:<br>
&gt; <br>
&gt; pnetcdf has two ways to get information back to the caller: the return<br>
&gt; code and the info object. &nbsp;A read-only &quot;pnetcdf_how_we_doin&quot;
hint<br>
&gt; might do the trick.<br>
&gt; <br>
&gt; three:<br>
&gt; <br>
&gt; some MPI-IO implementations do fix this, as long as collective I/O
is<br>
&gt; used. &nbsp;The MPI-IO on BlueGene, for example, always forces collective<br>
&gt; I/O (even if operations are not overlapping), then aligns file domains<br>
&gt; to block size boundaries. &nbsp;I know, I just complained about how<br>
&gt; un-portable st_blksize can be but 'ad_bgl' gets to make some<br>
&gt; simplifying assumptions.<br>
&gt; <br>
&gt; ROMIO, at least recent versions, can also do some file domain magic<br>
&gt; - &quot;romio_min_fdomain_size&quot; will enforce a lower bound on
the amount of<br>
&gt; &nbsp;I/O an aggregator will do.<br>
&gt; <br>
&gt; - set the &quot;striping_unit&quot; hint and ROMIO will ensure file
domain<br>
&gt; &nbsp;boundaries are aligned to a multiple of that value.<br>
&gt; <br>
&gt; ==rob<br>
&gt; <br>
&gt; -- <br>
&gt; Rob Latham<br>
&gt; Mathematics and Computer Science Division<br>
&gt; Argonne National Lab, IL USA<br>
&gt; <br>
<br>
</font></tt>
<br><font size=2 face="sans-serif"><br>
<br>
Såvida annat inte anges ovan: / Unless stated otherwise above:<br>
IBM Svenska AB<br>
Organisationsnummer: 556026-6883<br>
Adress: 164 92 Stockholm<br>
</font>