10 #define _XOPEN_SOURCE 700 
   17 #include "sion_common.h" 
   18 #include "sion_const.h" 
   19 #include "sion_debug.h" 
   20 #include "sion_error_handler.h" 
   22 #include "sion_filedesc.h" 
   23 #include "sion_flags.h" 
   24 #include "sion_generic.h" 
   25 #include "sion_generic_apidesc.h" 
   26 #include "sion_generic_buddy.h" 
   27 #include "sion_generic_internal.h" 
   28 #include "sion_generic_mapped.h" 
   29 #include "sion_internal.h" 
   33   int apiid = SION_ID_UNDEF;
 
   34   _sion_generic_apidesc *sion_apidesc;
 
   36   sion_apidesc = _sion_generic_alloc_apidesc();
 
   38     return _sion_errorprint(
 
   39       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"_sion_generic_create_api: problems to alloc apidesc, aborting ...\n");
 
   41   _sion_generic_init_apidesc(sion_apidesc);
 
   44     return _sion_errorprint(
 
   45       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"_sion_generic_create_api: name for API not given, aborting ...\n");
 
   48   sion_apidesc->name = strdup(name);
 
   50   apiid = _sion_newvcd(sion_apidesc, SION_APIDESCRIPTOR);
 
   51   sion_apidesc->aid = apiid;
 
   52   sion_apidesc->level = SION_GENERIC_API_LEVEL_NONE;
 
   54   DPRINTFP((2, 
"_sion_generic_create_api", _SION_DEFAULT_RANK, 
"API created with name %s apiid=%d\n", sion_apidesc->name, apiid));
 
   61   _sion_generic_apidesc *sion_apidesc;
 
   62   int rc = SION_SUCCESS;
 
   64   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
   65     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_free_api: invalid sion_apidesc %d", aid);
 
   68   rc = _sion_generic_free_apidesc(sion_apidesc);
 
   75   _sion_generic_apidesc *sion_apidesc;
 
   76   int rc = SION_SUCCESS;
 
   78   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
   79     return _sion_errorprint(
 
   80       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_create_local_commgroup_cb: invalid sion_apidesc %d", aid);
 
   83   if (sion_apidesc->create_lcg_cb != NULL) {
 
   84     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
   85       "sion_generic_register_create_local_commgroup_cb: update_cb already registered for apiid=%d", aid);
 
   87   sion_apidesc->create_lcg_cb = create_lcg_cb;
 
   89   _sion_generic_update_api_level(sion_apidesc);
 
   91   DPRINTFP((2, 
"sion_generic_register_create_local_commgroup_cb", _SION_DEFAULT_RANK,
 
   92     "create_lcg_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
 
   99   _sion_generic_apidesc *sion_apidesc;
 
  100   int rc = SION_SUCCESS;
 
  102   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  103     return _sion_errorprint(
 
  104       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_free_local_commgroup_cb: invalid sion_apidesc %d", aid);
 
  107   if (sion_apidesc->free_lcg_cb != NULL) {
 
  108     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  109       "sion_generic_register_free_local_commgroup_cb: update_cb already registered for apiid=%d", aid);
 
  111   sion_apidesc->free_lcg_cb = free_lcg_cb;
 
  113   _sion_generic_update_api_level(sion_apidesc);
 
  115   DPRINTFP((2, 
"sion_generic_register_free_local_commgroup_cb", _SION_DEFAULT_RANK, 
"free_lcg_cb registered for apiid=%s (%d)\n",
 
  116     sion_apidesc->name, aid));
 
  123   _sion_generic_apidesc *sion_apidesc;
 
  124   int rc = SION_SUCCESS;
 
  126   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  127     return _sion_errorprint(
 
  128       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_barrier_cb: invalid sion_apidesc %d", aid);
 
  131   if (sion_apidesc->barrier_cb != NULL) {
 
  132     return _sion_errorprint(
 
  133       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_barrier_cb: barrier_cb already registered for apiid=%d", aid);
 
  135   sion_apidesc->barrier_cb = barrier_cb;
 
  137   _sion_generic_update_api_level(sion_apidesc);
 
  139   DPRINTFP((2, 
"sion_generic_register_barrier_cb", _SION_DEFAULT_RANK, 
"barrier_cb registered for apiid=%s (%d)\n",
 
  140     sion_apidesc->name, aid));
 
  147   _sion_generic_apidesc *sion_apidesc;
 
  148   int rc = SION_SUCCESS;
 
  150   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  151     return _sion_errorprint(
 
  152       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_bcastr_cb: invalid sion_apidesc %d", aid);
 
  155   if (sion_apidesc->bcastr_cb != NULL) {
 
  156     return _sion_errorprint(
 
  157       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_bcastr_cb: bcastr_cb already registered for apiid=%d", aid);
 
  159   sion_apidesc->bcastr_cb = bcastr_cb;
 
  161   _sion_generic_update_api_level(sion_apidesc);
 
  163   DPRINTFP((2, 
"sion_generic_register_bcastr_cb", _SION_DEFAULT_RANK, 
"bcastr_cb registered for apiid=%s (%d)\n",
 
  164     sion_apidesc->name, aid));
 
  171   _sion_generic_apidesc *sion_apidesc;
 
  172   int rc = SION_SUCCESS;
 
  174   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  175     return _sion_errorprint(
 
  176       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_gatherr_cb: invalid sion_apidesc %d", aid);
 
  179   if (sion_apidesc->gatherr_cb != NULL) {
 
  180     return _sion_errorprint(
 
  181       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_gatherr_cb: gatherr_cb already registered for apiid=%d", aid);
 
  183   sion_apidesc->gatherr_cb = gatherr_cb;
 
  185   _sion_generic_update_api_level(sion_apidesc);
 
  187   DPRINTFP((2, 
"sion_generic_register_gatherr_cb", _SION_DEFAULT_RANK, 
"gatherr_cb registered for apiid=%s (%d)\n",
 
  188     sion_apidesc->name, aid));
 
  195   _sion_generic_apidesc *sion_apidesc;
 
  196   int rc = SION_SUCCESS;
 
  198   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  199     return _sion_errorprint(
 
  200       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_gathervr_cb: invalid sion_apidesc %d", aid);
 
  203   if (sion_apidesc->gathervr_cb != NULL) {
 
  204     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  205       "sion_generic_register_gathervr_cb: gathervr_cb already registered for apiid=%d", aid);
 
  207   sion_apidesc->gathervr_cb = gathervr_cb;
 
  209   _sion_generic_update_api_level(sion_apidesc);
 
  211   DPRINTFP((2, 
"sion_generic_register_gathervr_cb", _SION_DEFAULT_RANK, 
"gathervr_cb registered for apiid=%s (%d)\n",
 
  212     sion_apidesc->name, aid));
 
  219   _sion_generic_apidesc *sion_apidesc;
 
  220   int rc = SION_SUCCESS;
 
  222   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  223     return _sion_errorprint(
 
  224       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_scatterr_cb: invalid sion_apidesc %d", aid);
 
  227   if (sion_apidesc->scatterr_cb != NULL) {
 
  228     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  229       "sion_generic_register_scatterr_cb: scatterr_cb already registered for apiid=%d", aid);
 
  231   sion_apidesc->scatterr_cb = scatterr_cb;
 
  233   _sion_generic_update_api_level(sion_apidesc);
 
  235   DPRINTFP((2, 
"sion_generic_register_scatterr_cb", _SION_DEFAULT_RANK, 
"scatterr_cb registered for apiid=%s (%d)\n",
 
  236     sion_apidesc->name, aid));
 
  243   _sion_generic_apidesc *sion_apidesc;
 
  244   int rc = SION_SUCCESS;
 
  246   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  247     return _sion_errorprint(
 
  248       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
 
  251   if (sion_apidesc->scattervr_cb != NULL) {
 
  252     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  253       "sion_generic_register_scattervr_cb: scattervr_cb already registered for apiid=%d", aid);
 
  255   sion_apidesc->scattervr_cb = scattervr_cb;
 
  257   _sion_generic_update_api_level(sion_apidesc);
 
  259   DPRINTFP((2, 
"sion_generic_register_scattervr_cb", _SION_DEFAULT_RANK, 
"scattervr_cb registered for apiid=%s (%d)\n",
 
  260     sion_apidesc->name, aid));
 
  266   int64_t gather_execute_cb(
const void *, int64_t, 
void *, 
int, 
int, 
int, 
int, int64_t process_cb(
const void *, int64_t *, 
int),
 
  267     void *, 
bool spec_iterator_cb(
void *, int64_t *)))
 
  269   _sion_generic_apidesc *sion_apidesc;
 
  270   int rc = SION_SUCCESS;
 
  272   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  273     return _sion_errorprint(
 
  274       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_gather_and_execute_cb: invalid sion_apidesc %d", aid);
 
  277   if (sion_apidesc->gather_execute_cb != NULL) {
 
  278     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  279       "sion_generic_register_gather_and_execute_cb: scattervr_cb already registered for apiid=%d", aid);
 
  281   sion_apidesc->gather_execute_cb = gather_execute_cb;
 
  283   _sion_generic_update_api_level(sion_apidesc);
 
  285   DPRINTFP((2, 
"sion_generic_register_gather_and_execute_cb", _SION_DEFAULT_RANK,
 
  286     "gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
 
  292   int64_t execute_scatter_cb(
void *, int64_t, 
void *, 
int, 
int, 
int, 
int, int64_t process_cb(
void *, int64_t *, 
int), 
void *,
 
  293     bool spec_iterator_cb(
void *, int64_t *)))
 
  295   _sion_generic_apidesc *sion_apidesc;
 
  296   int rc = SION_SUCCESS;
 
  298   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  299     return _sion_errorprint(
 
  300       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_execute_and_scatter_cb: invalid sion_apidesc %d", aid);
 
  303   if (sion_apidesc->execute_scatter_cb != NULL) {
 
  304     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  305       "sion_generic_register_execute_and_scatter_cb: scattervr_cb already registered for apiid=%d", aid);
 
  307   sion_apidesc->execute_scatter_cb = execute_scatter_cb;
 
  309   DPRINTFP((2, 
"sion_generic_register_execute_and_scatter_cb", _SION_DEFAULT_RANK,
 
  310     "gather_execute_cb registered for apiid=%s (%d)\n", sion_apidesc->name, aid));
 
  315 int sion_generic_register_get_multi_filename_cb(
int aid, 
char *get_multi_filename_cb(
const char *, 
int))
 
  317   _sion_generic_apidesc *sion_apidesc;
 
  320   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  321     return _sion_errorprint(-1, _SION_ERROR_RETURN, 
"sion_generic_register_get_multi_filename_cb: invalid sion_apidesc %d", aid);
 
  324   if (sion_apidesc->get_multi_filename_cb != NULL) {
 
  325     return _sion_errorprint(-1, _SION_ERROR_RETURN,
 
  326       "sion_generic_register_get_multi_filename_cb: get_multi_filename_cb already registered for apiid=%d", aid);
 
  328   sion_apidesc->get_multi_filename_cb = get_multi_filename_cb;
 
  330   _sion_generic_update_api_level(sion_apidesc);
 
  332   DPRINTFP((2, 
"sion_generic_register_get_multi_filename_cb", -1, 
"get_multi_filename_cb registered for apiid=%s (%d)\n",
 
  333     sion_apidesc->name, aid));
 
  338 int sion_generic_register_get_capability_cb(
int aid, 
int get_capability_cb(
void *))
 
  340   _sion_generic_apidesc *sion_apidesc;
 
  341   int rc = SION_SUCCESS;
 
  343   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  344     return _sion_errorprint(
 
  345       SION_NOT_SUCCESS, _SION_ERROR_RETURN, 
"sion_generic_register_get_capability_cb: invalid sion_apidesc %d", aid);
 
  348   if (sion_apidesc->get_capability_cb != NULL) {
 
  349     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  350       "sion_generic_register_get_capability_cb: get_capability_cb already registered for apiid=%d", aid);
 
  352   sion_apidesc->get_capability_cb = get_capability_cb;
 
  354   _sion_generic_update_api_level(sion_apidesc);
 
  356   DPRINTFP((2, 
"sion_generic_register_get_capability_cb", _SION_DEFAULT_RANK, 
"get_capability_cb registered for apiid=%s (%d)\n",
 
  357     sion_apidesc->name, aid));
 
  364   ONLY_DEBUG(
int grank);
 
  365   int rc = SION_SUCCESS;
 
  366   _sion_filedesc *sion_filedesc;
 
  367   _sion_generic_gendata *sion_gendata;
 
  368   _sion_generic_apidesc *sion_apidesc;
 
  370   DPRINTFTS(-1, 
"enter sion_generic_parclose");
 
  372   if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
 
  373     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_parclose: invalid sion_filedesc %d", sid);
 
  375   sion_gendata = sion_filedesc->dataptr;
 
  376   sion_apidesc = sion_gendata->apidesc;
 
  378   ONLY_DEBUG(grank = sion_gendata->grank);
 
  380   DPRINTFP((1, 
"sion_generic_parclose", grank, 
"enter parallel close of sid %d (%d file)\n", sid, sion_filedesc->nfiles));
 
  382   if (!sion_filedesc->usebuddy) {
 
  383     rc = _sion_parclose_generic(sid, sion_filedesc->rank, sion_filedesc->ntasks, _SION_INTERNAL_FLAG_NORMAL, sion_gendata, NULL);
 
  385     rc = _sion_parclose_generic_buddy(sid, sion_filedesc->rank, sion_filedesc->ntasks, sion_gendata);
 
  388   if (sion_apidesc->free_lcg_cb && sion_gendata->comm_data_local) {
 
  389     sion_apidesc->free_lcg_cb(sion_gendata->comm_data_local);
 
  394   sion_apidesc->barrier_cb(sion_gendata->comm_data_global);
 
  398   DPRINTFP((1, 
"sion_generic_parclose", grank, 
"leave parallel close of sid %d\n", sid));
 
  399   DPRINTFTS(-1, 
"leave sion_generic_parclose");
 
  408     *options = SION_GENERIC_MAPPED_OPTIONS_INIT;
 
  420   options->chunksizes = chunksizes;
 
  425   options->fsblksize = fsblksize;
 
  430   options->keyval_mode = keyval_mode;
 
  435   options->lowlevel_api = lowlevel_api;
 
  440   options->endianness = endianness;
 
  444   int gsize, 
int *nlocaltasks, 
int **globalranks, int64_t **chunksizes, 
int **mapping_filenrs, 
int **mapping_lranks,
 
  445   int32_t *fsblksize, FILE **fileptr)
 
  448   _sion_flags_store *flags_store = _sion_parse_flags(file_mode);
 
  450     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
 
  451       "sion_generic_paropen_mapped: could not parse file mode in %s, aborting ...\n", file_mode);
 
  453   sid = _sion_generic_paropen_mapped(aid, fname, flags_store, numFiles, gcommgroup, grank, gsize, nlocaltasks, globalranks,
 
  454     chunksizes, mapping_filenrs, mapping_lranks, fsblksize, fileptr);
 
  455   _sion_flags_destroy_store(&flags_store);
 
  459 int _sion_generic_paropen_mapped(
int aid, 
char *fname, 
const _sion_flags_store *flags_store, 
int *numFiles, 
void *gcommgroup,
 
  460   int grank, 
int gsize, 
int *nlocaltasks, 
int **globalranks, int64_t **chunksizes, 
int **mapping_filenrs, 
int **mapping_lranks,
 
  461   int32_t *fsblksize, FILE **fileptr)
 
  463   int rc, sid = SION_ID_UNDEF;
 
  464   _sion_filedesc *sion_filedesc;
 
  465   _sion_generic_apidesc *sion_apidesc;
 
  466   _sion_generic_gendata *sion_gendata;
 
  468   DPRINTFTS(grank, 
"enter sion_generic_paropen_mapped");
 
  469   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank,
 
  470     "enter generic parallel mapped open of file %s (global: %d of %d, nlocaltasks %d)\n", fname, grank, gsize, *nlocaltasks));
 
  472   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(sion_apidesc = _sion_vcdtovcon(aid))) {
 
  473     return _sion_errorprint(
 
  474       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
 
  477   if ((!sion_apidesc->create_lcg_cb) || (!sion_apidesc->free_lcg_cb) || (!sion_apidesc->barrier_cb) || (!sion_apidesc->bcastr_cb)
 
  478     || (!sion_apidesc->gatherr_cb) || (!sion_apidesc->gathervr_cb) || (!sion_apidesc->scatterr_cb)
 
  479     || (!sion_apidesc->scattervr_cb)) {
 
  480     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
 
  481       "sion_generic_paropen_mapped: API %s not correctly initalized, aborting", sion_apidesc->name);
 
  485   if ((grank < 0) || (grank >= gsize)) {
 
  486     return _sion_errorprint(
 
  487       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: global rank %d not valid (0..%d)", grank, gsize);
 
  491   sion_gendata = _sion_generic_alloc_gendata();
 
  493     return _sion_errorprint(
 
  494       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
 
  496   _sion_generic_init_gendata(sion_gendata);
 
  498   sion_gendata->aid = aid;
 
  499   sion_gendata->apidesc = sion_apidesc;
 
  500   sion_gendata->comm_data_global = gcommgroup;
 
  501   sion_gendata->grank = grank;
 
  502   sion_gendata->gsize = gsize;
 
  503   sion_gendata->lrank = -1;
 
  504   sion_gendata->lsize = -1;
 
  505   sion_gendata->filenumber = -1;
 
  506   sion_gendata->numfiles = -1;
 
  507   sion_gendata->comm_data_local = NULL;
 
  509   if (!(flags_store->mask & (_SION_FMODE_WRITE | _SION_FMODE_READ))) {
 
  510     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: unknown file mode");
 
  513   sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
 
  517   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"enter parallel mapped open\n"));
 
  518   rc = _sion_paropen_mapped_generic(sid, fname, flags_store->mask, numFiles, nlocaltasks, globalranks, chunksizes,
 
  519     mapping_filenrs, mapping_lranks, fsblksize, grank, gsize, _SION_INTERNAL_FLAG_NORMAL, fileptr, sion_gendata);
 
  520   sion_gendata->numfiles = *numFiles;
 
  525     (1, 
"sion_generic_paropen_mapped", sion_gendata->grank, 
"leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
 
  526       sion_gendata->numfiles, sion_gendata->lsize, sid, sion_gendata->grank));
 
  529   if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
 
  530     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid);
 
  534   sion_filedesc->dataptr = sion_gendata;
 
  538   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"leave parallel open of file %s sid=%d\n", fname, sid));
 
  539   DPRINTFTS(-1, 
"leave sion_generic_paropen_mapped");
 
  544 int sion_generic_paropen_mapped_with_options(
int aid, 
const char *fname, 
sion_open_mode mode, 
int numfiles, 
void *gcommgroup,
 
  545   int grank, 
int gsize, 
int ntasks, 
const int *globalranks, 
const int *filenumbers, 
const int *localranks,
 
  550   DPRINTFTS(grank, 
"enter sion_generic_paropen_mapped");
 
  551   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank,
 
  552     "enter generic parallel mapped open of file %s (global: %d of %d, ntasks %d)\n", fname, grank, gsize, ntasks));
 
  554   _sion_generic_apidesc *apidesc;
 
  555   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(apidesc = _sion_vcdtovcon(aid))) {
 
  556     return _sion_errorprint(
 
  557       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_register_scattervr_cb: invalid sion_apidesc %d", aid);
 
  560   if ((!apidesc->create_lcg_cb) || (!apidesc->free_lcg_cb) || (!apidesc->barrier_cb) || (!apidesc->bcastr_cb)
 
  561     || (!apidesc->gatherr_cb) || (!apidesc->gathervr_cb) || (!apidesc->scatterr_cb) || (!apidesc->scattervr_cb)) {
 
  562     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
 
  563       "sion_generic_paropen_mapped: API %s not correctly initalized, aborting", apidesc->name);
 
  567   if ((grank < 0) || (grank >= gsize)) {
 
  568     return _sion_errorprint(
 
  569       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: global rank %d not valid (0..%d)", grank, gsize);
 
  573   _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
 
  575     return _sion_errorprint(
 
  576       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: problems to alloc gendata, aborting ...\n");
 
  578   _sion_generic_init_gendata(gendata);
 
  581   gendata->apidesc = apidesc;
 
  582   gendata->comm_data_global = gcommgroup;
 
  583   gendata->grank = grank;
 
  584   gendata->gsize = gsize;
 
  587   gendata->filenumber = -1;
 
  588   gendata->numfiles = numfiles;
 
  589   gendata->comm_data_local = NULL;
 
  591   int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
 
  595   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"enter parallel mapped open\n"));
 
  596   int rc = _sion_paropen_mapped_generic_with_options(
 
  597     sid, fname, mode, &gendata->numfiles, ntasks, globalranks, filenumbers, localranks, grank, gsize, gendata, &options);
 
  601   DPRINTFP((1, 
"sion_generic_paropen_mapped", gendata->grank, 
"leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
 
  602     gendata->numfiles, gendata->lsize, sid, gendata->grank));
 
  605   _sion_filedesc *filedesc;
 
  606   if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
 
  607     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen_mapped: invalid sion_filedesc %d", sid);
 
  611   filedesc->dataptr = gendata;
 
  615   DPRINTFP((1, 
"sion_generic_paropen_mapped", grank, 
"leave parallel open of file %s sid=%d\n", fname, sid));
 
  616   DPRINTFTS(-1, 
"leave sion_generic_paropen_mapped");
 
  621 int sion_generic_parclose_mapped(
int sid)
 
  623   int grank, gsize, rc;
 
  624   _sion_filedesc *sion_filedesc;
 
  625   _sion_generic_gendata *sion_gendata;
 
  627   DPRINTFTS(-1, 
"enter sion_generic_parclose_mapped");
 
  628   if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
 
  629     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_parclose_mapped: invalid sion_filedesc %d", sid);
 
  631   sion_gendata = sion_filedesc->dataptr;
 
  633   grank = sion_gendata->grank;
 
  634   gsize = sion_gendata->gsize;
 
  636   DPRINTFP((1, 
"sion_generic_parclose_mapped", grank, 
"enter parallel close of sid %d\n", sid));
 
  638   DPRINTFP((1, 
"sion_generic_parclose_mapped", grank, 
"closing %d file(s)\n", sion_filedesc->nfiles));
 
  640   rc = _sion_parclose_mapped_generic(sid, grank, gsize, sion_gendata);
 
  644   _sion_generic_free_gendata(sion_gendata);
 
  646   DPRINTFP((1, 
"sion_generic_parclose_mapped", grank, 
"leave parallel close of sid %d\n", sid));
 
  647   DPRINTFTS(-1, 
"leave sion_generic_parclose_mapped");
 
  652 int _sion_generic_get_and_distribute_info_from_file(_sion_generic_gendata *sion_gendata, 
const char *fname)
 
  655   int rc = SION_SUCCESS;
 
  657   int mapping_size = -1;
 
  658   int32_t *mapping = NULL;
 
  660   _sion_generic_apidesc *sion_apidesc;
 
  662   sion_apidesc = sion_gendata->apidesc;
 
  664   if (sion_gendata->grank == 0) {
 
  666     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"before open\n"));
 
  667     sid = _sion_open_read(fname, _SION_READ_MASTER_ONLY_OF_MULTI_FILES, &SION_OPTIONS_INIT);
 
  669       DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"after open\n"));
 
  670       rc = 
sion_get_mapping(sid, &mapping_size, &mapping, &sion_gendata->numfiles);
 
  671       DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"sion file %d files\n",
 
  672         sion_gendata->numfiles));
 
  674       sion_gendata->numfiles = -1;
 
  679   sion_apidesc->bcastr_cb(&sion_gendata->numfiles, sion_gendata->comm_data_global, 
_SION_INT32, 1, 0);
 
  681   if ((sion_gendata->grank == 0) && (sion_gendata->numfiles > 1)) {
 
  682     if (mapping_size != sion_gendata->gsize) {
 
  683       return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  684         "_sion_generic_get_and_distribute_info_from_file: Incorrect sum of ntasks of files %d <> %d\n", mapping_size,
 
  685         sion_gendata->gsize);
 
  689   if (sion_gendata->numfiles < 0) {
 
  690     return _sion_errorprint(SION_NOT_SUCCESS, _SION_ERROR_RETURN,
 
  691       "_sion_generic_get_and_distribute_info_from_file: could not get numfiles from sion file\n");
 
  694   if (sion_gendata->numfiles > 1) {
 
  695     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"before scatter\n"));
 
  696     if (sion_gendata->grank == 0) {
 
  697       for (t = 0; t < mapping_size; t++) {
 
  698         DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"  %d -> (%d,%d)\n", t,
 
  699           mapping[t * 2], mapping[t * 2 + 1]));
 
  703     sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, 
_SION_INT32, 2, 0);
 
  704     sion_gendata->filenumber = lpos[0];
 
  705     sion_gendata->lrank = lpos[1];
 
  706     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"after scatter filenum+lrank (%d,%d)\n",
 
  707       sion_gendata->filenumber, sion_gendata->lrank));
 
  709     if (sion_gendata->grank == 0) {
 
  710       tasksinfile = malloc(sion_gendata->numfiles * 
sizeof(
int));
 
  711       if (tasksinfile == NULL) {
 
  712         return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
 
  713           "_sion_generic_get_and_distribute_info_from_file: Cannot allocate memory for tasksinfile counter vector");
 
  715       for (t = 0; t < sion_gendata->numfiles; t++) {
 
  718       for (t = 0; t < mapping_size; t++) {
 
  719         tasksinfile[mapping[t * 2]]++; 
 
  721       for (t = 0; t < mapping_size; t++) {
 
  722         mapping[t * 2 + 1] = tasksinfile[mapping[t * 2]]; 
 
  725     sion_apidesc->scatterr_cb(mapping, lpos, sion_gendata->comm_data_global, 
_SION_INT32, 2, 0);
 
  726     sion_gendata->lsize = lpos[1];
 
  727     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank, 
"after scatter lsize (%d, %d of %d)\n",
 
  728       sion_gendata->filenumber, sion_gendata->lrank, sion_gendata->lsize));
 
  730     if (sion_gendata->grank == 0) {
 
  736     sion_gendata->filenumber = 0;
 
  737     sion_gendata->lrank = sion_gendata->grank;
 
  738     sion_gendata->lsize = sion_gendata->gsize;
 
  739     DPRINTFP((1, 
"_sion_generic_get_and_distribute_info_from_file", sion_gendata->grank,
 
  740       "only one file -> filenumber=%d lRank=%d\n", sion_gendata->filenumber, sion_gendata->lrank));
 
  743   if (sion_gendata->grank == 0) {
 
  746       _sion_close_sid(sid);
 
  753 int sion_generic_parreinit(
int sid, int64_t chunksize)
 
  755   int grank, gsize, rc;
 
  756   _sion_filedesc *sion_filedesc;
 
  757   _sion_generic_gendata *sion_gendata;
 
  759   if ((sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(sion_filedesc = _sion_vcdtovcon(sid))) {
 
  760     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_parreinit: invalid sion_filedesc %d", sid);
 
  762   sion_gendata = sion_filedesc->dataptr;
 
  764   grank = sion_gendata->grank;
 
  765   gsize = sion_gendata->gsize;
 
  767   DPRINTFP((1, 
"sion_generic_parreinit", grank, 
"enter parallel reinit of sid %d\n", sid));
 
  769   rc = _sion_parreinit_generic(sid, chunksize, grank, gsize, sion_gendata);
 
  771   DPRINTFP((1, 
"sion_generic_parreinit", grank, 
"leave parallel reinit of sid %d\n", sid));
 
  780     *options = SION_GENERIC_OPTIONS_INIT;
 
  792   options->chunksize = chunksize;
 
  797   options->fsblksize = fsblksize;
 
  802   options->keyval_mode = keyval_mode;
 
  812   options->buddylevel = buddylevel;
 
  817   options->collsize = -1;
 
  822   options->collsize = size;
 
  827   if (options->collsize == 0) {
 
  828     options->collsize = -1;
 
  830   options->collective_merge = 
true;
 
  835   options->lowlevel_api = lowlevel_api;
 
  840   options->endianness = endianness;
 
  848   DPRINTFTS(grank, 
"enter sion_generic_paropen");
 
  849   DPRINTFP((1, 
"sion_generic_paropen", grank,
 
  850     "enter generic parallel open of FILE %s (global: %d of %d, local: %d of %d, file: %d of %d )\n", fname, grank, gsize, lrank,
 
  851     lsize, filenumber, numfiles));
 
  853   _sion_generic_apidesc *apidesc;
 
  854   if ((aid < 0) || (_sion_vcdtype(aid) != SION_APIDESCRIPTOR) || !(apidesc = _sion_vcdtovcon(aid))) {
 
  855     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_register_scattervr_cb: invalid apidesc %d", aid);
 
  858   if ((apidesc->level != SION_GENERIC_API_LEVEL_STD) && (apidesc->level != SION_GENERIC_API_LEVEL_FULL)) {
 
  859     return _sion_errorprint(
 
  860       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: API %s not correctly initalized, aborting", apidesc->name);
 
  864   if ((grank < 0) || (grank >= gsize)) {
 
  865     return _sion_errorprint(
 
  866       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: global rank %d not valid (0..%d)", grank, gsize);
 
  871   if (strstr(fname, 
".def") != NULL) {
 
  872     options.fsblksize = 65536;
 
  873     options.chunksize = 65536;
 
  876   DPRINTFP((1, 
"sion_generic_paropen", grank, 
"setting fsblksize = %d for file %s\n", options.fsblksize, fname));
 
  879   _sion_generic_gendata *gendata = _sion_generic_alloc_gendata();
 
  881     return _sion_errorprint(
 
  882       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: problems to alloc gendata, aborting ...\n");
 
  884   _sion_generic_init_gendata(gendata);
 
  887   gendata->apidesc = apidesc;
 
  888   gendata->comm_data_global = gcommgroup;
 
  889   gendata->comm_data_local = NULL;
 
  890   gendata->grank = grank;
 
  891   gendata->gsize = gsize;
 
  894     if ((lrank < 0) || (lrank >= lsize)) {
 
  895       return _sion_errorprint(
 
  896         SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: local rank %d not valid (0..%d)", lrank, lsize);
 
  898     gendata->lrank = lrank;
 
  899     gendata->lsize = lsize;
 
  901     if ((filenumber < 0) || (filenumber >= numfiles)) {
 
  902       return _sion_errorprint(
 
  903         SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: file number %d not valid (0..%d)", filenumber, numfiles);
 
  905     gendata->filenumber = filenumber;
 
  906     gendata->numfiles = numfiles;
 
  911     DPRINTFP((1, 
"sion_generic_paropen", grank, 
"READ: buddylevel=%d\n", options.buddylevel));
 
  914     if (!options.buddylevel) {
 
  915       int rc = _sion_generic_get_and_distribute_info_from_file(gendata, fname);
 
  916       if (rc != SION_SUCCESS) {
 
  917         return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN,
 
  918           "sion_generic_paropen: error in _sion_generic_get_and_distribute_info_from_file");
 
  923       gendata->lrank = lrank;
 
  924       gendata->lsize = lsize;
 
  926       if ((filenumber < 0) || (filenumber >= numfiles)) {
 
  927         return _sion_errorprint(
 
  928           SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: file number %d not valid (0..%d)", filenumber, numfiles);
 
  930       gendata->filenumber = filenumber;
 
  931       gendata->numfiles = numfiles;
 
  935     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: unknown file mode");
 
  939   int rc = apidesc->create_lcg_cb(&gendata->comm_data_local, gendata->comm_data_global, gendata->grank, gendata->gsize,
 
  940     gendata->lrank, gendata->lsize, gendata->filenumber, gendata->numfiles);
 
  942     return _sion_errorprint(
 
  943       SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_paropen_generic: error in create_local_commgroup callback function");
 
  948     (apidesc->get_multi_filename_cb ? apidesc->get_multi_filename_cb : _sion_get_multi_filename)(fname, gendata->filenumber);
 
  950   int sid = _sion_newvcd(NULL, SION_FILEDESCRIPTOR);
 
  952   if (!options.buddylevel) {
 
  956     DPRINTFP((1, 
"sion_generic_paropen", grank, 
"call parallel open of %d files (current name %s)\n", gendata->numfiles, nfname));
 
  957     rc = _sion_paropen_generic_one_file(sid, nfname, mode, gendata->numfiles, gendata->filenumber, gendata->lrank, gendata->lsize,
 
  958       gendata->grank, _SION_INTERNAL_FLAG_NORMAL, gendata, NULL, &options);
 
  962     DPRINTFP((1, 
"sion_generic_paropen", gendata->grank, 
"leave parallel open of %d files #tasks=%d sid=%d globalrank=%d\n",
 
  963       gendata->numfiles, gendata->lsize, sid, gendata->grank));
 
  970       (1, 
"sion_generic_paropen", grank, 
"call parallel buddy open of %d files (current name %s)\n", gendata->numfiles, nfname));
 
  971     rc = _sion_paropen_generic_buddy(sid, fname, mode, gendata->numfiles, gendata->filenumber, gendata->lrank, gendata->lsize,
 
  972       gendata->grank, gendata, &options);
 
  977       (1, 
"sion_generic_paropen", gendata->grank, 
"leave parallel buddy open of %d files #tasks=%d sid=%d globalrank=%d rc=%d\n",
 
  978         gendata->numfiles, gendata->lsize, sid, gendata->grank, rc));
 
  982   _sion_filedesc *filedesc;
 
  983   if ((rc < 0) || (sid < 0) || (_sion_vcdtype(sid) != SION_FILEDESCRIPTOR) || !(filedesc = _sion_vcdtovcon(sid))) {
 
  984     DPRINTFP((1, 
"sion_generic_paropen", gendata->grank, 
"invalid rc %d or filedesc %d", rc, sid));
 
  985     return _sion_errorprint(SION_ID_NOT_VALID, _SION_ERROR_RETURN, 
"sion_generic_paropen: invalid rc %d or filedesc %d", rc, sid);
 
  992   DPRINTFP((1, 
"sion_generic_paropen", grank, 
"leave parallel open of file %s sid=%d\n", fname, sid));
 
  993   DPRINTFTS(-1, 
"leave sion_generic_paropen");
 
int sion_get_mapping(int sid, int *mapping_size, int32_t **mapping, int *numfiles)
Returns pointers to the internal field mapping.
sion_open_mode
specifies for what type of access to open a file
sion_lowlevel_api
specifies a low-level API to use for file system access
sion_endianness
declares the endianness of user data written to a file
#define _SION_INT32
a 32 bit signed integer
sion_keyval_mode
specifies whether to use SIONlib's key-value mechanism for accessing file content and if so in what m...
@ SION_OPEN_WRITE
open the file for writing only
@ SION_OPEN_READ
open the file for reading only
void sion_generic_mapped_options_set_endianness(sion_generic_mapped_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
void sion_generic_options_set_collective(sion_generic_options *options)
Enable collective I/O.
void sion_generic_options_set_collective_size(sion_generic_options *options, int32_t size)
Enable collective I/O.
void sion_generic_options_set_fsblksize(sion_generic_options *options, int32_t fsblksize)
Set the file system block size to assume.
void sion_generic_options_set_buddy(sion_generic_options *options)
Enable buddy checkpointing mechanism.
sion_generic_mapped_options * sion_generic_mapped_options_new()
Allocates and initializes an instance of sion_generic_mapped_options
int sion_generic_free_api(int aid)
free new api
void sion_generic_mapped_options_set_lowlevel_api(sion_generic_mapped_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
int sion_generic_register_scattervr_cb(int aid, sion_scattervr_cb cb)
register callback for communication
void sion_generic_mapped_options_set_chunksizes(sion_generic_mapped_options *options, int64_t *chunksizes)
Set the chunk size of all logical files opened by a task.
int sion_generic_register_barrier_cb(int aid, sion_barrier_cb cb)
register callback for communication
void sion_generic_options_set_collective_merge(sion_generic_options *options)
Use collective merging.
int sion_generic_paropen_mapped(int aid, char *fname, const char *file_mode, int *numFiles, void *gcommgroup, int grank, int gsize, int *nlocaltasks, int **globalranks, int64_t **chunksizes, int **mapping_filenrs, int **mapping_lranks, int32_t *fsblksize, FILE **fileptr)
int sion_generic_paropen(int aid, const char *fname, sion_open_mode mode, void *gcommgroup, int grank, int gsize, int filenumber, int numfiles, int lrank, int lsize, const sion_generic_options *options_)
Open a SIONlib file through a generic interface.
int sion_generic_register_scatterr_cb(int aid, sion_scatterr_cb cb)
register callback for communication
void sion_generic_options_set_endianness(sion_generic_options *options, sion_endianness endianness)
Set the endianness for the contents of a container.
void sion_generic_options_set_chunksize(sion_generic_options *options, int64_t chunksize)
Set the chunk size of a logical file in the container.
int sion_generic_create_api(char *name)
Create new api.
void sion_generic_options_set_buddylevel(sion_generic_options *options, int32_t buddylevel)
Enable buddy checkpointing mechanism.
int sion_generic_register_gathervr_cb(int aid, sion_gathervr_cb cb)
register callback for communication
void sion_generic_mapped_options_set_fsblksize(sion_generic_mapped_options *options, int32_t fsblksize)
Set the file system block size to assume.
int sion_generic_register_bcastr_cb(int aid, sion_bcastr_cb cb)
register callback for communication
struct sion_generic_options sion_generic_options
Holds non-essential arguments for sion_generic_paropen().
void sion_generic_options_set_lowlevel_api(sion_generic_options *options, sion_lowlevel_api lowlevel_api)
Set the low-level API to use for opening a container.
void sion_generic_mapped_options_set_keyval_mode(sion_generic_mapped_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
int sion_generic_register_create_local_commgroup_cb(int aid, sion_create_lcg_cb cb)
register callback to create local communication group
int sion_generic_register_gatherr_cb(int aid, sion_gatherr_cb cb)
register callback for communication
int sion_generic_register_gather_and_execute_cb(int aid, sion_gather_execute_cb cb)
register callback for communication
void sion_generic_options_set_keyval_mode(sion_generic_options *options, sion_keyval_mode keyval_mode)
Set the key-value mode to use for a container.
struct sion_generic_mapped_options sion_generic_mapped_options
Holds non-essential arguments for sion_generic_paropen_mapped().
void sion_generic_options_delete(sion_generic_options *options)
Delete an instance of sion_generic_options
void sion_generic_mapped_options_delete(sion_generic_mapped_options *options)
Delete an instance of sion_generic_mapped_options
int sion_generic_parclose(int sid)
Close a SIONlib file.
int sion_generic_register_execute_and_scatter_cb(int aid, sion_execute_scatter_cb cb)
register callback for communication
sion_generic_options * sion_generic_options_new()
Allocates and initializes an instance of sion_generic_options
int sion_generic_register_free_local_commgroup_cb(int aid, sion_free_lcg_cb cb)
register callback to free local communication group