|
| 1 | +[PnetCDF](https://parallel-netcdf.github.io) Version 1.13.0 Release Notes (March 29, 2024) |
| 2 | +------------------------------------------------------------------------------ |
| 3 | + |
| 4 | +* New features |
| 5 | + + A single read/write request made by an MPI process is now allowed to be of |
| 6 | + size larger than 2 GiB. Such large requests will be passed to the MP-IO |
| 7 | + library. This feature makes use of "the large count feature" introduced in |
| 8 | + MPI standard 4.0, which includes `MPI_XXX_c` APIs whose arguments are of |
| 9 | + type `MPI_Count`. `MPI_Count` can be an 8-byte integer type, enabling large |
| 10 | + MPI operations. As some MPI libraries today have begun implementing MPI |
| 11 | + 4.0, PnetCDF now can rely on the MPI libraries to support large single |
| 12 | + requests. When the MPI library used to build PnetCDF does not support large |
| 13 | + requests, the MPI errors are returned. Because of this change, the PnetCDF |
| 14 | + configure option `--enable-large-single-req` is thus deprecated. |
| 15 | + See [PR #131](https://github.com/Parallel-NetCDF/PnetCDF/pull/131) |
| 16 | + + Flexible APIs now can operate as high-level APIs, when argument `bufcount` |
| 17 | + is set to `NC_COUNT_IGNORE` and `buftype` is set to an MPI predefined data |
| 18 | + type. See [PR #82](https://github.com/Parallel-NetCDF/PnetCDF/pull/82). |
| 19 | + Below is a write example from a buffer of type float. |
| 20 | + ``` |
| 21 | + ncmpi_put_vara_all(ncid, varid, start, count, buf, NC_COUNT_IGNORE, MPI_FLOAT); |
| 22 | + ``` |
| 23 | + is equivalent to |
| 24 | + ``` |
| 25 | + ncmpi_put_vara_float_all(ncid, varid, start, count, buf); |
| 26 | + ``` |
| 27 | +
|
| 28 | +* New Limitations |
| 29 | + + Hint `nc_header_read_chunk_size`, introduced in version 1.4.0, is now |
| 30 | + limited to `NC_MAX_INT`. As PnetCDF reads file header in chunks, this hint |
| 31 | + can be used to customize the chunk size. The default is 256 KB. |
| 32 | + See [4209056](https://github.com/Parallel-NetCDF/PnetCDF/commit/4209056e9a66465421f7ce9f1b44518923638b04) |
| 33 | +
|
| 34 | +* Configure options |
| 35 | + + `--enable-large-single-req` is deprecated and removed, as PnetCDF now |
| 36 | + allows a single reqd/write request of size larger than 2 GiB. |
| 37 | + + `--disable-file-sync` is deprecated and removed. This configure option |
| 38 | + alone was not able to provide a sufficient data consistency. Users are |
| 39 | + suggested to call `ncmpi_sync` and `MPI_Barrier` to achieve a desired |
| 40 | + consistency, as suggested by MPI standard. |
| 41 | + + A new option `--enable-install-examples` installs the example programs |
| 42 | + under folder `${prefix}/pnetcdf_examples` along with run script files. An |
| 43 | + example is `${prefix}/pnetcdf_examples/C/run_c_examples.sh`. The default of |
| 44 | + this option is `disabled`. |
| 45 | + See [PR #91](https://github.com/Parallel-NetCDF/PnetCDF/pull/91) |
| 46 | + + Add three new environment variables `SEQ_CFLAGS`, `SEQ_LDFLAGS` and |
| 47 | + `SEQ_LIBS` for setting the compile, link, and library flags, respectively |
| 48 | + to be used to build the sequential utility programs, i.e. `cdfdiff`, |
| 49 | + `ncoffsets`, `ncvalidator`, and `pnetcdf_version`. |
| 50 | + See [PR #122](https://github.com/Parallel-NetCDF/PnetCDF/pull/122) |
| 51 | +
|
| 52 | +* Configure updates: |
| 53 | + + Upgrade `config.guess` and `config.sub` to 2024-01-01. |
| 54 | + See [PR #116](https://github.com/Parallel-NetCDF/PnetCDF/pull/116) |
| 55 | + + FLASH-IO benchmark - add compile flag "-fallow-argument-mismatch" for GNU |
| 56 | + Fortran 10 and later. |
| 57 | + See [PR #114](https://github.com/Parallel-NetCDF/PnetCDF/pull/114) |
| 58 | + + Handle the case when MPICC environment variable is not set and `--with-mpi` |
| 59 | + is not used. See commit |
| 60 | + [6142135](https://github.com/Parallel-NetCDF/PnetCDF/commit/61421356ecd38878a4ef46771ed6520d4257251f) |
| 61 | + + Upgrade Autotools version requirement to autoconf 2.71, automake 1.16.5, and |
| 62 | + libtool 2.4.6. (Note this change affects PnetCDF developers only.) |
| 63 | + See [PR #95](https://github.com/Parallel-NetCDF/PnetCDF/pull/95) |
| 64 | + Thanks to Blaise Bourdin for pointing out in |
| 65 | + [Issue #94](https://github.com/Parallel-NetCDF/PnetCDF/issues/94) |
| 66 | + that configure failed when using Intel OneAPI 2022.2.0 compilers. The fix |
| 67 | + is to use autoconf 2.70 and newer. |
| 68 | +
|
| 69 | +* New constants |
| 70 | + + `NC_COUNT_IGNORE` - This is used in flexible APIs. When argument `bufcount` |
| 71 | + is `NC_COUNT_IGNORE`, `buftype` must be a predefine MPI datatype and the |
| 72 | + APIs operate as the high-level APIs. Fortran equivalents are |
| 73 | + `NF_COUNT_IGNORE` and `NF90_COUNT_IGNORE`. |
| 74 | + See [PR #92](https://github.com/Parallel-NetCDF/PnetCDF/pull/92) |
| 75 | +
|
| 76 | +* API semantics updates |
| 77 | + + File open flag `NC_SHARE` is now deprecated. It is still defined, but takes |
| 78 | + no effect. |
| 79 | + See [PR #119](https://github.com/Parallel-NetCDF/PnetCDF/pull/119) |
| 80 | + + `NC_SHARE` alone is not sufficient to provide data consistency for accessing |
| 81 | + a shared file in parallel and thus is now deprecated. PnetCDF follows the |
| 82 | + file consistency defined in MPI standard, which only addresses the case |
| 83 | + when all file accesses are relative to a specific file handle created from |
| 84 | + a collective open, and thus `NC_SHARE` becomes invalid. See |
| 85 | + doc/README.consistency.md for more information. |
| 86 | +
|
| 87 | +* New PnetCDF hints |
| 88 | + + `nc_hash_size_dim` sets the hash table size for dimension names. |
| 89 | + Default: 256 |
| 90 | + + `nc_hash_size_var` sets the hash table size for variable names. |
| 91 | + Default: 256 |
| 92 | + + `nc_hash_size_gattr` sets the hash table size for global attribute names. |
| 93 | + Default: 64 |
| 94 | + + `nc_hash_size_vattr` sets the hash table size for variable attribute names. |
| 95 | + Default: 8 |
| 96 | + + The above 4 new hints can be used to set different hash table sizes for |
| 97 | + dimensions, variables, and attributes. Hashing tables are used for quick |
| 98 | + data object name lookup. It can be useful for files containing a large |
| 99 | + number of dimensions, variables, and attributes. For instance, when the |
| 100 | + number of variables to be defined is large and the number of attributes per |
| 101 | + variable is small, increasing the value of `nc_hash_size_var` can speed up |
| 102 | + the variable definition and inquiring time. On the other hand, setting a |
| 103 | + smaller value for hint `nc_hash_size_vattr` can reduce memory footprint. |
| 104 | + See [PR #132](https://github.com/Parallel-NetCDF/PnetCDF/pull/132). |
| 105 | +
|
| 106 | +* Updated utility programs |
| 107 | + + `ncvalidator` - When the file size is larger or smaller than what is |
| 108 | + calculated based on the metadata stored in the file header, the file may |
| 109 | + still be a valid netCDF file. |
| 110 | + * The larger-than-expected case can happen if opening an existing file that |
| 111 | + contains no variable. Deleting a global attribute already defined in the |
| 112 | + file will reduce the file header size. In this case, the file is still a |
| 113 | + valid netCDF file. Such mismatch will be detected and the file size |
| 114 | + truncated to the header size. |
| 115 | + See [PR #99](https://github.com/Parallel-NetCDF/PnetCDF/pull/99) |
| 116 | + * The smaller-than-expected case can happen if the last variable is |
| 117 | + partially written. The expected file size is calculated based on the full |
| 118 | + sizes of all variables. In this case, the file is still a valid netCDF |
| 119 | + file, and `ncvalidator` will report a warning, rather than an error. |
| 120 | + * Print the dimension size of a variable on stdout when its size is larger |
| 121 | + than the limitation allowed by the file format. See commit |
| 122 | + [5584d44](https://github.com/Parallel-NetCDF/PnetCDF/commit/5584d44a433a68966b0be601e7a73e939c695dbf) |
| 123 | + + Add file src/utils/README.md which gives short descriptions of the utility |
| 124 | + programs and collapsible bullets to display their manual pages. |
| 125 | +
|
| 126 | +* Other updates: |
| 127 | + + When file header extent size grows, PnetCDF now uses a movement unit per |
| 128 | + process of size up to 64 MiB. |
| 129 | + See [PR #137](https://github.com/Parallel-NetCDF/PnetCDF/pull/137) |
| 130 | + + Since version 1.1.0, PnetCDF has been using file striping size, if |
| 131 | + obtainable from the MPI-IO hint `striping_unit`, to align the starting file |
| 132 | + offset of the data section. This offset is also referred to as the file |
| 133 | + header extent, which can be larger than the header size to allow header to |
| 134 | + grow when new data objects are added. Starting from this release, file |
| 135 | + stripe size is no longer used for setting the starting offset of the data |
| 136 | + section. This is because automatically setting file header extent using the |
| 137 | + file striping size may grow the file header unexpectedly when adding new |
| 138 | + objects to an existing file. |
| 139 | + See [PR #124](https://github.com/Parallel-NetCDF/PnetCDF/pull/124) and |
| 140 | + [PR #125](https://github.com/Parallel-NetCDF/PnetCDF/pull/125). |
| 141 | + + Use unsigned int to perform byte swap. |
| 142 | + See [PR #113](https://github.com/Parallel-NetCDF/PnetCDF/pull/113). |
| 143 | + + Silence Intel icc compilation warnings: when CFLAGS contains |
| 144 | + "-Wimplicit-const-int-float-conversion" and "-Wstringop-overread". |
| 145 | + See [PR #110](https://github.com/Parallel-NetCDF/PnetCDF/pull/110). |
| 146 | + + In all previous PnetCDF's implementations, file header is always written/ |
| 147 | + read by rank 0 using MPI independent APIs. This can nullify ROMIO hint |
| 148 | + `romio_no_indep_rw` if set by the user. To warrant no independent read/ |
| 149 | + write user hint, PnetCDF now checks hint `romio_no_indep_rw` and if set to |
| 150 | + `true`, then all file header I/Os are made through MPI collective I/O |
| 151 | + calls, where only rank 0 makes non-zero length requests while all others |
| 152 | + zero length (in order to participate the collective calls). See |
| 153 | + [PR #104](https://github.com/Parallel-NetCDF/PnetCDF/pull/104) and |
| 154 | + [PR #138](https://github.com/Parallel-NetCDF/PnetCDF/pull/138). |
| 155 | + + In all prior versions, the file name was checked whether it contains |
| 156 | + character ':'. The prefix name ending with ':' is considered by ROMIO as |
| 157 | + the file system type name. The prefix name, if found, is then stripped, so |
| 158 | + the file name can be used in the POSIX function calls internally. However, |
| 159 | + the prefix was not checked against the file system type names recognized |
| 160 | + by ROMIO. Starting from this release, the prefix is checked against the |
| 161 | + known file system type names to ROMIO. If the prefix is not one of the |
| 162 | + recognized types, e.g. "ufs", "nfs", "xfs", "pvfs2", "gpfs", "panfs", |
| 163 | + "lustre", "daos", "testfs", "ime", or "quobyte", then the prefix name is |
| 164 | + not stripped. This change is for the case when the file name contains ':', |
| 165 | + but it is not for specifying the file system type. See |
| 166 | + [PR #79](https://github.com/Parallel-NetCDF/PnetCDF/pull/79) and |
| 167 | + [MPICH PR 5951](https://github.com/pmodels/mpich/pull/5951). |
| 168 | +
|
| 169 | +* Bug fixes |
| 170 | + + Return I/O hints that are actually used. See commit |
| 171 | + [0dcf628](https://github.com/Parallel-NetCDF/PnetCDF/commit/0dcf6284106e42faa5e8fb9ab1aa5d52917ff892). |
| 172 | + + Fix residual values of `v_align` and `r_align` when re-entering the define |
| 173 | + mode multiple times. |
| 174 | + See [PR #126](https://github.com/Parallel-NetCDF/PnetCDF/pull/126). |
| 175 | + + Fix Fortran API `nf90mpi_Inq_buffer_size` which should call |
| 176 | + `nfmpi_inq_buffer_size` internally. |
| 177 | + See [PR #111](https://github.com/Parallel-NetCDF/PnetCDF/pull/111). |
| 178 | + + Fix `ncmpi_inq_num_rec_vars()` and `ncmpi_inq_num_fix_vars()` when opening |
| 179 | + an existing file. See |
| 180 | + [PR #103](https://github.com/Parallel-NetCDF/PnetCDF/pull/103). |
| 181 | + + `ncmpidiff` - when checking the dimensions defined in the second files |
| 182 | + whether are also defined in the first file. See commit |
| 183 | + [88cd9c1](https://github.com/Parallel-NetCDF/PnetCDF/commit/88cd9c187b9b3dc9018b066e905a10d0c74488f8). |
| 184 | + + Use Fortran subroutine `Get_Environment_Variable` instead of `getenv` if it |
| 185 | + is available. See commits |
| 186 | + [a0b8aca](https://github.com/Parallel-NetCDF/PnetCDF/commit/a0b8acabc3bf7a7a35d878c9db2afb71942bb7a9), and |
| 187 | + [b796759](https://github.com/Parallel-NetCDF/PnetCDF/commit/b796759f5a8e1749e7c168e05fe1665a35e2a2a1). |
| 188 | +
|
| 189 | +* New test program |
| 190 | + + test/largefile/large_attr.c - tests attributes of size > 2 GiB. |
| 191 | + + test/largefile/tst_hash_large_ndims.c - tests hashing performance when |
| 192 | + the number of dimensions is large. |
| 193 | + + test/largefile/tst_hash_large_nvars.c - tests hashing performance when |
| 194 | + the number of variables is large. |
| 195 | + + test/largefile/tst_hash_large_ngattr.c - tests hashing performance when |
| 196 | + the number of global attributes is large. |
| 197 | + + test/largefile/large_header.c - tests file header size larger than 2 GiB. |
| 198 | + + test/largefile/large_reqs.c - tests a single read/write request of size |
| 199 | + larger than 2 GiB. |
| 200 | + + test/testcases/tst_redefine.c - tests multiple entries of `ncmpi__enddef` |
| 201 | + [PR #126](https://github.com/Parallel-NetCDF/PnetCDF/pull/126). |
| 202 | + + test/testcases/tst_symlink.c - tests `NC_CLOBBER` on a symbolic link. |
| 203 | + + test/testcases/tst_del_attr.c - tests delete attributes. See |
| 204 | + [PR #99](https://github.com/Parallel-NetCDF/PnetCDF/pull/99). |
| 205 | + + test/testcases/test_get_varn.c - tests `get_varn` API. See |
| 206 | + [PR #90](https://github.com/Parallel-NetCDF/PnetCDF/pull/90). |
| 207 | + + test/testcases/flexible_var.c - tests flexible var API |
| 208 | + + test/testcases/flexible_api.f - tests flexible API when `bufcount == -1` |
| 209 | + + test/testcases/scalar.c - adds tests for scalar variables using nonblocking |
| 210 | + APIs. See commit |
| 211 | + [07ff7b1](https://github.com/search?q=repo%3AParallel-NetCDF%2FPnetCDF+07ff7b1&type=commits) |
| 212 | + + test/nonblocking/test_bputf.f90, test/nonblocking/test_bputf77.f - |
| 213 | + add tests of APIs `inq_buffer_usage` and `inq_buffer_size`. See commit |
| 214 | + [94ce438](https://github.com/Parallel-NetCDF/PnetCDF/commit/94ce438262fe7fcade031dcae1a677a827549bb3) |
| 215 | +
|
| 216 | +* Clarifications |
| 217 | + + Hints `nc_header_align_size` and `nc_record_align_size` are to align the |
| 218 | + file header extent and starting file offset of the record variable section, |
| 219 | + respectively. |
| 220 | + + Hint `nc_record_align_size` is not to align the offsets of individual |
| 221 | + record variables. |
| 222 | + + Prior to version 1.13.0, hint `nc_var_align_size` is used to align the |
| 223 | + starting file offsets of individual fixed-size variables. This design was |
| 224 | + to reduce file lock contention in MPI collective I/O operations. Beginning |
| 225 | + from this release (version 1.13.0), this hint is used to align only the |
| 226 | + starting file offset of the entire data section, not individual variables. |
| 227 | + The reason of such change is because PnetCDF nonblocking APIs can aggregate |
| 228 | + multiple I/O requests and MPI-IO today has been optimized to align I/O to |
| 229 | + file striping boundaries, which makes aligning starting offsets of |
| 230 | + individual variables less effective and may create large empty space in the |
| 231 | + file. |
| 232 | + + Using `NC_CLOBBER` in `ncmpi_create()` can be expensive if the file already |
| 233 | + exists. When the existing file is a regular file, PnetCDF will delete it |
| 234 | + with a call to `unlink()` first and re-created it. Calling `unlink()` may |
| 235 | + be expensive for some parallel file systems. When the existing file is a |
| 236 | + symbolic link, PnetCDF will call `truncate()` or `MPI_File_set_size()` to |
| 237 | + truncate the file size to zero. Calling `truncate()` may also be very |
| 238 | + expensive on some file systems, e.g. Lustre. Sporadically a long time spent |
| 239 | + on `unlink()` and `truncate()` was observed on Perlmutter at NERSC. |
| 240 | +
|
0 commit comments