~ubuntu-branches/ubuntu/vivid/adios/vivid-proposed

« back to all changes in this revision

Viewing changes to src/write/adios_mpi_amr.c

  • Committer: Package Import Robot
  • Author(s): Alastair McKinstry
  • Date: 2014-06-16 23:06:38 UTC
  • mfrom: (15.1.8 sid)
  • Revision ID: package-import@ubuntu.com-20140616230638-cxryhot6b8ge32l6
Tags: 1.7.0-1
* New upstream release.
* Add adios.pc pkgconfig file. adios_config now uses this.

Show diffs side-by-side

added added

removed removed

Lines of Context:
40
40
 
41
41
static int adios_mpi_amr_initialized = 0;
42
42
 
43
 
#define is_aggregator(rank)  md->g_is_aggregator[rank]
 
43
//#define is_aggregator(rank)  md->g_is_aggregator[rank]
 
44
#define is_aggregator(rank)  (md->g_color2 == 0)
44
45
#define FREE(v) \
45
46
  if (v)        \
46
47
  {             \
94
95
    int g_have_mdf;
95
96
    int g_merging_pgs;
96
97
    int g_num_ost;
 
98
    int is_local_fs;
97
99
    int g_threading;
 
100
    int is_color_set; // whether 'color' is set from XML.
98
101
    int g_color1;
99
102
    int g_color2;
100
103
    MPI_Offset * g_offsets;
160
163
        char uuid[40];
161
164
};
162
165
 
 
166
#ifdef HAVE_FGR
 
167
#include "fgr.h"
 
168
#endif
 
169
 
163
170
static void trim_spaces (char * str)
164
171
{
165
172
    char * t = str, * p = NULL;
236
243
    return ost_list;
237
244
}
238
245
 
 
246
#ifdef HAVE_FGR
 
247
int find_myost (MPI_Comm comm)
 
248
{
 
249
    uint32_t * nids, * osts, myid;
 
250
    int i, nnids = get_unique_nids (comm, nids);
 
251
    osts = (uint32_t *) malloc (nnids * 4);
 
252
 
 
253
    if (fgr_nid2ost (nids, osts, nnids, ATLAS) == true)
 
254
    {
 
255
        uint32_t mynid = nid_atoi();
 
256
        for (i = 0; i < nnids; i++)
 
257
        {
 
258
            if (nids[i] == myid)
 
259
            {
 
260
                break;
 
261
            }
 
262
        }
 
263
 
 
264
        if (i == nnids)
 
265
        {
 
266
            // something is wrong
 
267
        }
 
268
 
 
269
        free (nids);
 
270
        free (osts);
 
271
    
 
272
        return i;
 
273
    }
 
274
    else
 
275
    {
 
276
        free (nids);
 
277
        free (osts);
 
278
        return -1;
 
279
    }
 
280
}
 
281
#endif
 
282
 
239
283
static void
240
284
//adios_mpi_amr_set_striping_unit(MPI_File fh, char *filename, char *parameters)
241
285
adios_mpi_amr_set_striping_unit(struct adios_MPI_data_struct * md, char *parameters)
242
286
{
243
 
    MPI_File fh = md->fh;
244
287
    char * filename = md->subfile_name;
245
 
    struct statfs fsbuf;
246
 
    int err = 0, flag;
 
288
    int err = 0;
247
289
    uint64_t striping_unit = 0;
248
290
    uint16_t striping_count = 0;
249
 
    char     value[64], *temp_string, *p_count,*p_size;
250
 
    int fd, old_mask, perm, n_ost_skipping, n_ost, n, i;
251
 
    MPI_Info info_used;
 
291
    char     *temp_string, *p_count,*p_size;
 
292
    int fd, old_mask, perm, n_ost_skipping, n_ost, n, i, should_striping;
 
293
    int random_offset_flag, name_len;
252
294
 
253
295
    temp_string = (char *) malloc (strlen (parameters) + 1);
254
296
    strcpy (temp_string, parameters);
255
297
    trim_spaces (temp_string);
256
298
 
257
 
    if (p_count = strstr (temp_string, "stripe_count"))
 
299
    if ( (p_count = strstr (temp_string, "striping")) )
 
300
    {
 
301
        char * p = strchr (p_count, '=');
 
302
        char * q = strtok (p, ";");
 
303
        if (!q)
 
304
            should_striping = atoi (q + 1);
 
305
        else
 
306
            should_striping = atoi (p + 1);
 
307
    }
 
308
    else
 
309
    {
 
310
        should_striping = 1;
 
311
    }
 
312
 
 
313
    if (should_striping == 0)
 
314
    {
 
315
        return;
 
316
    }
 
317
 
 
318
    strcpy (temp_string, parameters);
 
319
    trim_spaces (temp_string);
 
320
 
 
321
    if ( (p_count = strstr (temp_string, "stripe_count")) )
258
322
    {
259
323
        char * p = strchr (p_count, '=');
260
324
        char * q = strtok (p, ";");
272
336
    strcpy (temp_string, parameters);
273
337
    trim_spaces (temp_string);
274
338
 
275
 
    if (p_size = strstr (temp_string, "stripe_size"))
 
339
    if ( (p_count = strstr (temp_string, "random_offset")) )
 
340
    {
 
341
        char * p = strchr (p_count, '=');
 
342
        char * q = strtok (p, ";");
 
343
        if (!q)
 
344
            random_offset_flag = atoi (q + 1);
 
345
        else
 
346
            random_offset_flag = atoi (p + 1);
 
347
    }
 
348
    else
 
349
    {
 
350
        // By default, set stripe count to 1 to maximize concurrency.
 
351
        random_offset_flag = 0;
 
352
    }
 
353
 
 
354
    strcpy (temp_string, parameters);
 
355
    trim_spaces (temp_string);
 
356
 
 
357
    if ( (p_size = strstr (temp_string, "stripe_size")) )
276
358
    {
277
359
        char * p = strchr (p_size, '=');
278
360
        char * q = strtok (p, ";");
333
415
            i++;
334
416
        }
335
417
 
336
 
        lum.lmm_stripe_offset = i;
 
418
#ifdef HAVE_FGR
 
419
       int ost_id = find_myost (md->group_comm);
 
420
       if (ost_id >= 0)
 
421
       {
 
422
           lum.lmm_stripe_offset = ost_id;
 
423
       }
 
424
       else
 
425
       {
 
426
           lum.lmm_stripe_offset = (random_offset_flag ? -1 : i);
 
427
       }
 
428
#else
 
429
        lum.lmm_stripe_offset = (random_offset_flag ? -1 : i);
 
430
#endif
337
431
        ioctl (fd, LL_IOC_LOV_SETSTRIPE
338
432
              ,(void *) &lum
339
433
              );
351
445
static void
352
446
adios_mpi_amr_set_have_mdf (char * parameters, struct adios_MPI_data_struct * md)
353
447
{
354
 
    int err = 0, flag, i, aggr_group_size, remain, index;
355
 
    int nproc = md->size, rank = md->rank;
356
 
    char value[64], *temp_string, *p_count,*p_size;
 
448
    char *temp_string, *p_size;
357
449
 
358
450
    temp_string = (char *) malloc (strlen (parameters) + 1);
359
451
    strcpy (temp_string, parameters);
360
452
    trim_spaces (temp_string);
361
453
 
362
 
    if (p_size = strstr (temp_string, "have_metadata_file"))
 
454
    if ( (p_size = strstr (temp_string, "have_metadata_file")) )
363
455
    {
364
456
        char * p = strchr (p_size, '=');
365
457
        char * q = strtok (p, ";");
381
473
static void
382
474
adios_mpi_amr_set_aggregation_parameters(char * parameters, struct adios_MPI_data_struct * md)
383
475
{
384
 
    int err = 0, flag, i, aggr_group_size, remain, index;
 
476
    int i, aggr_group_size, remain, index;
385
477
    int nproc = md->size, rank = md->rank;
386
 
    char value[64], *temp_string, *p_count,*p_size;
 
478
    char *temp_string, *p_size;
387
479
 
388
480
    temp_string = (char *) malloc (strlen (parameters) + 1);
389
481
 
391
483
    strcpy (temp_string, parameters);
392
484
    trim_spaces (temp_string);
393
485
 
394
 
    if (p_size = strstr (temp_string, "num_ost"))
 
486
    if ( (p_size = strstr (temp_string, "num_ost")) )
395
487
    {
396
488
        char * p = strchr (p_size, '=');
397
489
        char * q = strtok (p, ";");
407
499
    strcpy (temp_string, parameters);
408
500
    trim_spaces (temp_string);
409
501
 
 
502
    if ( (p_size = strstr (temp_string, "local-fs")) )
 
503
    {
 
504
        char * p = strchr (p_size, '=');
 
505
        char * q = strtok (p, ";");
 
506
        if (!q)
 
507
            md->is_local_fs = atoi(q + 1);
 
508
        else
 
509
            md->is_local_fs = atoi(p + 1);
 
510
    }
 
511
    else
 
512
    {
 
513
        md->is_local_fs = 0;
 
514
    }
 
515
 
 
516
    strcpy (temp_string, parameters);
 
517
    trim_spaces (temp_string);
 
518
 
410
519
    // set up # of aggregators
411
 
    if (p_size = strstr (temp_string, "num_aggregators"))
 
520
    if ( (p_size = strstr (temp_string, "num_aggregators")) )
412
521
    {
413
522
        char * p = strchr (p_size, '=');
414
523
        char * q = strtok (p, ";");
429
538
        }
430
539
    }
431
540
 
432
 
    strcpy (temp_string, parameters);
433
 
    trim_spaces (temp_string);
434
 
 
435
 
    if (p_size = strstr (temp_string, "have_metadata_file"))
 
541
    // Get 'color' parameter. If 'color' is set,
 
542
    // the num_aggregators will be disregarded.
 
543
    // The actual # of aggregators will be caculated
 
544
    // according to color. 
 
545
    strcpy (temp_string, parameters);
 
546
    trim_spaces (temp_string);
 
547
 
 
548
    if ( (p_size = strstr (temp_string, "color")) )
 
549
    {
 
550
        char * p = strchr (p_size, '=');
 
551
        char * q = strtok (p, ";");
 
552
 
 
553
        md->is_color_set = 1;
 
554
        if (!q)
 
555
            md->g_color1 = atoi (q + 1);
 
556
        else
 
557
            md->g_color1 = atoi (p + 1);
 
558
    }
 
559
    else
 
560
    {
 
561
        // by default, use BG
 
562
        md->g_io_type = ADIOS_MPI_AMR_IO_BG;
 
563
    }
 
564
 
 
565
    strcpy (temp_string, parameters);
 
566
    trim_spaces (temp_string);
 
567
 
 
568
    if ( (p_size = strstr (temp_string, "have_metadata_file")) )
436
569
    {
437
570
        char * p = strchr (p_size, '=');
438
571
        char * q = strtok (p, ";");
452
585
    strcpy (temp_string, parameters);
453
586
    trim_spaces (temp_string);
454
587
 
455
 
    if (p_size = strstr (temp_string, "threading"))
 
588
    if ( (p_size = strstr (temp_string, "threading")) )
456
589
    {
457
590
        char * p = strchr (p_size, '=');
458
591
        char * q = strtok (p, ";");
473
606
 
474
607
    md->g_ost_skipping_list = allocOSTList (md->g_num_ost);
475
608
 
476
 
    if (p_size = strstr (temp_string, "osts_to_skip"))
 
609
    if ( (p_size = strstr (temp_string, "osts_to_skip")) )
477
610
    {
478
611
        char * p = strchr (p_size, '=');
479
612
        char * q = strtok (p, ";");
488
621
    strcpy (temp_string, parameters);
489
622
    trim_spaces (temp_string);
490
623
 
491
 
    if (p_size = strstr (temp_string, "aggregation_type"))
 
624
    if ( (p_size = strstr (temp_string, "aggregation_type")) )
492
625
    {
493
626
        char * p = strchr (p_size, '=');
494
627
        char * q = strtok (p, ";");
519
652
    }
520
653
    memset (md->g_is_aggregator, 0, nproc * sizeof(int));
521
654
 
522
 
    aggr_group_size = nproc / md->g_num_aggregators;
523
 
    remain = nproc - (int) aggr_group_size * md->g_num_aggregators;
524
 
 
525
 
    index = 0;
526
 
    for (i = 0; i < md->g_num_aggregators; i++)
527
 
    {
528
 
        md->g_is_aggregator[index] = 1;
529
 
 
530
 
        if (i < remain)
531
 
        {
532
 
            index += aggr_group_size + 1;
533
 
        }
534
 
        else
535
 
        {
536
 
            index += aggr_group_size;
537
 
        }
538
 
    }
539
 
 
540
 
    if (remain == 0)
541
 
    {
542
 
        md->g_color1 = rank / aggr_group_size;
543
 
        md->g_color2 = rank % aggr_group_size;
544
 
    }
545
 
    else
546
 
    {
547
 
        if (rank < (aggr_group_size + 1) * remain)
548
 
        {
549
 
            md->g_color1 = rank / (aggr_group_size + 1);
550
 
            md->g_color2 = rank % (aggr_group_size + 1);
551
 
        }
552
 
        else
553
 
        {
554
 
            md->g_color1 = remain + (rank - (aggr_group_size + 1) * remain) / aggr_group_size;
555
 
            md->g_color2 = (rank - (aggr_group_size + 1) * remain)% aggr_group_size;
556
 
        }
 
655
    if (!md->is_color_set)
 
656
    {
 
657
        aggr_group_size = nproc / md->g_num_aggregators;
 
658
        remain = nproc - (int) aggr_group_size * md->g_num_aggregators;
 
659
 
 
660
        index = 0;
 
661
        for (i = 0; i < md->g_num_aggregators; i++)
 
662
        {
 
663
            md->g_is_aggregator[index] = 1;
 
664
 
 
665
            if (i < remain)
 
666
            {
 
667
                index += aggr_group_size + 1;
 
668
            }
 
669
            else
 
670
            {
 
671
                index += aggr_group_size;
 
672
            }
 
673
        }
 
674
 
 
675
        if (remain == 0)
 
676
        {
 
677
            md->g_color1 = rank / aggr_group_size;
 
678
            md->g_color2 = rank % aggr_group_size;
 
679
        }
 
680
        else
 
681
        {
 
682
            if (rank < (aggr_group_size + 1) * remain)
 
683
            {
 
684
                md->g_color1 = rank / (aggr_group_size + 1);
 
685
                md->g_color2 = rank % (aggr_group_size + 1);
 
686
            }
 
687
            else
 
688
            {
 
689
                md->g_color1 = remain + (rank - (aggr_group_size + 1) * remain) / aggr_group_size;
 
690
                md->g_color2 = (rank - (aggr_group_size + 1) * remain)% aggr_group_size;
 
691
            }
 
692
        }
 
693
    }
 
694
    else // if color is set
 
695
    {
 
696
        MPI_Comm new_comm;
 
697
 
 
698
        MPI_Comm_split (md->group_comm, md->g_color1, md->rank, &new_comm);
 
699
        MPI_Comm_rank (new_comm, &md->g_color2);
557
700
    }
558
701
}
559
702
 
608
751
 
609
752
    while (total_written < len)
610
753
    {
611
 
        write_len = (to_write > INT32_MAX) ? INT32_MAX : to_write;
 
754
        write_len = (to_write > MAX_MPIWRITE_SIZE) ? MAX_MPIWRITE_SIZE : to_write;
612
755
        MPI_File_write (fh, buf_ptr, write_len, MPI_BYTE, &status);
613
756
        MPI_Get_count(&status, MPI_BYTE, &count);
614
757
        if (count != write_len)
720
863
                                         ,struct adios_index_struct_v1 * index
721
864
                                          )
722
865
{
723
 
    struct adios_index_process_group_struct_v1 * pg_root = index->pg_root;
 
866
    //struct adios_index_process_group_struct_v1 * pg_root = index->pg_root;
724
867
    struct adios_index_var_struct_v1 * vars_root = index->vars_root;
725
868
    struct adios_index_attribute_struct_v1 * attrs_root = index->attrs_root;
726
869
    int len;
754
897
}
755
898
 
756
899
 
757
 
void * adios_mpi_amr_do_mkdir (void * param)
 
900
void * adios_mpi_amr_do_mkdir (char * path)
758
901
{
759
 
    struct adios_file_struct * fd = (struct adios_file_struct *) param;
760
902
    // 4 bytes for ".dir" 
761
 
    char * dir_name = malloc (strlen (fd->name) + 4 + 1);
762
 
    sprintf (dir_name, "%s%s", fd->name, ".dir");
 
903
    char * dir_name = malloc (strlen (path) + 4 + 1);
 
904
    sprintf (dir_name, "%s%s", path, ".dir");
763
905
    
764
906
    mkdir (dir_name, S_IRWXU | S_IRWXG);
765
907
  
771
913
void * adios_mpi_amr_do_open_thread (void * param)
772
914
{
773
915
    struct adios_MPI_thread_data_open * td = (struct adios_MPI_thread_data_open *) param;
 
916
    int err;
774
917
 
775
918
    unlink (td->md->subfile_name);
776
919
    if (td->parameters)
779
922
 
780
923
    }
781
924
 
782
 
    MPI_File_open (MPI_COMM_SELF, td->md->subfile_name
783
 
                  ,MPI_MODE_WRONLY | MPI_MODE_CREATE
784
 
                  ,MPI_INFO_NULL
785
 
                  ,&td->md->fh
786
 
                  );
 
925
    err = MPI_File_open (MPI_COMM_SELF, td->md->subfile_name
 
926
                        ,MPI_MODE_WRONLY | MPI_MODE_CREATE
 
927
                        ,MPI_INFO_NULL
 
928
                        ,&td->md->fh
 
929
                        );
 
930
 
 
931
    if (err != MPI_SUCCESS)
 
932
    {
 
933
        char e [MPI_MAX_ERROR_STRING];
 
934
        int len = 0;
 
935
        memset (e, 0, MPI_MAX_ERROR_STRING);
 
936
        MPI_Error_string (err, e, &len);
 
937
        adios_error (err_file_open_error,
 
938
                     "MPI_AMR method: MPI open failed for %s: '%s'\n",
 
939
                     td->md->subfile_name, e);
 
940
    }
787
941
 
788
942
    return NULL;
789
943
}
840
994
    md->g_have_mdf = 1;
841
995
    md->g_merging_pgs = 0;
842
996
    md->g_num_ost = 0;
 
997
    md->is_local_fs = 0;
843
998
    md->g_threading = 0;
 
999
    md->is_color_set = 0;
844
1000
    md->g_color1 = 0;
845
1001
    md->g_color2 = 0;
846
1002
    md->g_offsets = 0;
849
1005
    md->g_io_type = ADIOS_MPI_AMR_IO_BG;
850
1006
 
851
1007
    adios_buffer_struct_init (&md->b);
 
1008
 
 
1009
#ifdef HAVE_FGR
 
1010
    if (fgr_init (0) == false)
 
1011
    {
 
1012
        adios_error (err_fgr, "fgr_init() error\n");
 
1013
    }
 
1014
#endif
852
1015
}
853
1016
 
854
1017
 
900
1063
    return 1;
901
1064
}
902
1065
 
 
1066
/*
903
1067
static
904
1068
void build_offsets (struct adios_bp_buffer_struct_v1 * b
905
1069
                   ,MPI_Offset * offsets, uint64_t size, char * group_name
930
1094
        pg_root = pg_root->next;
931
1095
    }
932
1096
}
 
1097
*/
933
1098
 
934
1099
enum ADIOS_FLAG adios_mpi_amr_should_buffer (struct adios_file_struct * fd
935
1100
                                            ,struct adios_method_struct * method
936
1101
                                            )
937
1102
{
938
 
    int i;
939
1103
    struct adios_MPI_data_struct * md = (struct adios_MPI_data_struct *)
940
1104
                                                      method->method_data;
941
1105
    char * name, * name_no_path, * ch;
942
 
    char * d_name;
943
1106
    int err;
944
 
    int sig;    // used for coordinating the MPI_File_open
945
 
 
946
 
    int previous;
947
 
    int current;
948
 
    int next;
949
 
    uint16_t flag;
 
1107
    //int sig;    // used for coordinating the MPI_File_open
950
1108
 
951
1109
    START_TIMER (ADIOS_TIMER_MPI_AMR_AD_SHOULD_BUFFER);
952
1110
 
953
1111
    name = malloc (strlen (method->base_path) + strlen (fd->name) + 1);
954
1112
    sprintf (name, "%s%s", method->base_path, fd->name);
955
1113
 
956
 
    if (md->rank == md->size - 1)
957
 
        next = -1;
958
 
    else
959
 
        next = md->rank + 1;
960
 
    previous = md->rank - 1;
961
 
    current = md->rank;
962
 
 
963
1114
    fd->base_offset = 0;
964
1115
 
965
1116
    switch (fd->mode)
975
1126
            if (md->rank == 0)
976
1127
            {
977
1128
                struct lov_user_md lum;
978
 
                struct obd_uuid uuids[1024], * uuidp;
979
 
                int f, rc;
 
1129
                int f;
980
1130
 
981
1131
                // open metadata file
982
 
                unlink (fd->name);
 
1132
                unlink (name);
983
1133
 
984
1134
                adios_mpi_amr_set_have_mdf (method->parameters, md);
985
1135
                if (md->g_have_mdf)
986
1136
                {
987
 
                    f = open(fd->name, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
 
1137
                    f = open(name, O_CREAT | O_RDWR | O_LOV_DELAY_CREATE, 0644);
988
1138
                    if (f == -1)
989
1139
                    {
990
 
                        adios_error (err_file_open_error,"MPI_AMR method: open() failed: %s\n", strerror(errno));
 
1140
//                        adios_error (err_file_open_error,"MPI_AMR method: open() failed: %s\n", strerror(errno));
 
1141
                        adios_error (err_file_open_error,"MPI_AMR method: open() failed: %s\n", name);
991
1142
                        return -1;
992
1143
                    }
993
1144
 
999
1150
 
1000
1151
                    ioctl (f, LL_IOC_LOV_SETSTRIPE ,(void *) &lum);
1001
1152
#ifdef HAVE_LUSTRE
1002
 
 
 
1153
                    struct obd_uuid uuids[1024];
 
1154
                    int rc;
1003
1155
                    md->g_num_ost = 1024;
1004
1156
                    rc = llapi_lov_get_uuids(f, uuids, &md->g_num_ost);
1005
1157
                    if (rc != 0)
1011
1163
#endif 
1012
1164
                    close (f);
1013
1165
 
1014
 
                    MPI_File_open (MPI_COMM_SELF, fd->name
 
1166
                    MPI_File_open (MPI_COMM_SELF, name
1015
1167
                                  ,MPI_MODE_WRONLY | MPI_MODE_CREATE
1016
1168
                                  ,MPI_INFO_NULL
1017
1169
                                  ,&md->mfh
1018
1170
                                  );
1019
1171
                }
1020
1172
 
1021
 
                adios_mpi_amr_do_mkdir (fd);
 
1173
//                adios_mpi_amr_do_mkdir (name);
1022
1174
            }
1023
1175
 
1024
1176
            MPI_Bcast (&md->g_num_ost, 1, MPI_INT, 0, md->group_comm);
1027
1179
            fd->pg_start_in_file = 0;
1028
1180
            adios_mpi_amr_set_aggregation_parameters (method->parameters, md);
1029
1181
 
 
1182
            if (is_aggregator (md->rank))
 
1183
            {
 
1184
                if (md->is_local_fs)
 
1185
                {
 
1186
                    adios_mpi_amr_do_mkdir (name);
 
1187
                }
 
1188
                else
 
1189
                {
 
1190
                    if (md->rank == 0)
 
1191
                    {
 
1192
                        adios_mpi_amr_do_mkdir (name);
 
1193
                    }
 
1194
                }
 
1195
            }
 
1196
 
1030
1197
            // Check if fd->name contains path
1031
 
            if (ch = strrchr (fd->name, '/'))
 
1198
            if ( (ch = strrchr (fd->name, '/')) )
1032
1199
            {
1033
1200
                name_no_path = malloc (strlen (ch + 1) + 1); 
1034
1201
                strcpy (name_no_path, ch + 1); 
1039
1206
                strcpy (name_no_path, fd->name);
1040
1207
            }
1041
1208
 
1042
 
            name = realloc (name, strlen (fd->name) + 5 + strlen (method->base_path) + strlen (name_no_path) + 1 + 10 + 1);
 
1209
            name = realloc (name, strlen (method->base_path) + strlen (fd->name) + 5 + strlen (name_no_path) + 1 + 10 + 1);
1043
1210
            // create the subfile name, e.g. restart.bp.1
1044
1211
            // 1 for '.' + 10 for subfile index + 1 for '\0'
1045
 
            sprintf (name, "%s%s%s%s.%d", fd->name, ".dir/", method->base_path, name_no_path, md->g_color1);
 
1212
            sprintf (name, "%s%s%s%s.%d", method->base_path, fd->name, ".dir/", name_no_path, md->g_color1);
1046
1213
            md->subfile_name = strdup (name);
1047
1214
            fd->subfile_index = (uint32_t)md->g_color1;
1048
1215
 
1126
1293
            adios_error (err_invalid_file_mode, "MPI_AGGREGATE method: Append mode is not supported.\n");
1127
1294
            break;
1128
1295
#if 0
 
1296
            int previous;
 
1297
            int current;
 
1298
            int next;
 
1299
 
 
1300
            if (md->rank == md->size - 1)
 
1301
                next = -1;
 
1302
            else
 
1303
                next = md->rank + 1;
 
1304
            previous = md->rank - 1;
 
1305
            current = md->rank;
 
1306
 
1129
1307
            int old_file = 1;
1130
1308
            adios_buffer_struct_clear (&md->b);
1131
1309
 
1601
1779
    v->data_size = buffer_size;
1602
1780
}
1603
1781
 
 
1782
/*
1604
1783
static void adios_mpi_amr_do_read (struct adios_file_struct * fd
1605
1784
                              ,struct adios_method_struct * method
1606
1785
                              )
1615
1794
    data.buffer = 0;
1616
1795
    data.buffer_len = 0;
1617
1796
 
1618
 
    switch (md->b.version & ADIOS_VERSION_NUM_MASK)
 
1797
    uint32_t version = md->b.version & ADIOS_VERSION_NUM_MASK;
 
1798
    switch (version)
1619
1799
    {
1620
1800
        case 1:
 
1801
        case 2:
1621
1802
        {
1622
1803
            // the three section headers
1623
1804
            struct adios_process_group_header_struct_v1 pg_header;
1700
1881
        default:
1701
1882
            adios_error (err_invalid_file_version, 
1702
1883
                    "MPI_AMR method read: file version unknown: %u\n",
1703
 
                    md->b.version);
 
1884
                    version);
1704
1885
            return;
1705
1886
    }
1706
1887
 
1707
1888
    adios_buffer_struct_clear (&md->b);
1708
1889
}
 
1890
*/
1709
1891
 
1710
1892
static
1711
1893
uint32_t adios_mpi_amr_calculate_attributes_size (struct adios_file_struct * fd)
1754
1936
            uint64_t buffer_size = 0;
1755
1937
            uint64_t buffer_offset = 0;
1756
1938
            uint64_t index_start = md->b.pg_index_offset, index_start1;
1757
 
            int * pg_sizes = 0, * disp = 0, * sendbuf = 0, * recvbuf = 0, * attr_sizes = 0;
 
1939
            int * pg_sizes = 0, * disp = 0;
1758
1940
            void * aggr_buff = 0, * recv_buff = 0;
1759
1941
            struct adios_MPI_thread_data_write write_thread_data;
1760
1942
            int i, new_rank, new_group_size, new_rank2, new_group_size2, max_data_size = 0, total_data_size = 0, total_data_size1 = 0;
1935
2117
            if (fd->shared_buffer == adios_flag_yes && !md->g_merging_pgs)
1936
2118
            {
1937
2119
                //printf ("do not merge pg\n");
1938
 
                struct adios_bp_buffer_struct_v1 b;
1939
 
                struct adios_process_group_header_struct_v1 pg_header;
1940
 
                struct adios_vars_header_struct_v1 vars_header;
1941
 
                int pg_size, header_size;
1942
 
                uint64_t vars_count_offset;
 
2120
                int pg_size;
1943
2121
                MPI_Request request;
1944
2122
                MPI_Status status;
1945
2123
 
1974
2152
                    if (2 * max_data_size > MAX_AGG_BUF)
1975
2153
                    {
1976
2154
                        log_warn ("MPI_AMR method (BG): The max allowed aggregation "
1977
 
                                "buffer is %llu bytes.\n"
1978
 
                                "But this ADIOS method needs %llu bytes for aggregation\n",
 
2155
                                "buffer is %d bytes.\n"
 
2156
                                "But this ADIOS method needs %d bytes for aggregation\n",
1979
2157
                                MAX_AGG_BUF, 2 * max_data_size);
1980
2158
                    }
1981
2159
 
1984
2162
                    if (aggr_buff == 0 || recv_buff == 0)
1985
2163
                    {
1986
2164
                        adios_error (err_no_memory, "MPI_AMR method (BG): Cannot allocate "
1987
 
                                    "2 x %llu bytes for aggregation buffers.\n", 
 
2165
                                    "2 x %d bytes for aggregation buffers.\n", 
1988
2166
                                    max_data_size);
1989
2167
                        return;
1990
2168
                    }
1994
2172
                    if (max_data_size > MAX_AGG_BUF)
1995
2173
                    {
1996
2174
                        log_warn ("MPI_AMR method (BG): The max allowed aggregation "
1997
 
                                  "buffer is %llu bytes.\n",
 
2175
                                  "buffer is %d bytes.\n",
1998
2176
                                  MAX_AGG_BUF);
1999
2177
                    }
2000
2178
 
2002
2180
                    if (recv_buff == 0)
2003
2181
                    {
2004
2182
                        adios_error (err_no_memory, "MPI_AMR method (BG): Cannot allocate "
2005
 
                                    "%llu bytes for receive buffer.\n", 
 
2183
                                    "%d bytes for receive buffer.\n", 
2006
2184
                                    max_data_size);
2007
2185
                        return;
2008
2186
                    }
2095
2273
                if (!is_aggregator(md->rank))
2096
2274
                {
2097
2275
                    uint64_t var_offset_to_add = 0, attr_offset_to_add = 0;
2098
 
                    uint64_t var_base_offset = 0, attr_base_offset = 0;
2099
 
 
2100
 
                    // change to relative offset
2101
 
                    if (md->index->vars_root)
2102
 
                    {
2103
 
                        var_base_offset = md->index->vars_root->characteristics [0].offset;
2104
 
                    }
2105
 
 
2106
 
                    if (md->index->attrs_root)
2107
 
                    {
2108
 
                        attr_base_offset = md->index->attrs_root->characteristics [0].offset;
2109
 
                    }
2110
2276
 
2111
2277
                    for (i = 0; i < new_rank; i++)
2112
2278
                    {
2349
2515
                // write out the metadata file from rank 0
2350
2516
                if (md->rank == 0)
2351
2517
                {
2352
 
                    MPI_File m_file;
2353
2518
                    char * global_index_buffer = 0;
2354
2519
                    uint64_t global_index_buffer_size = 0;
2355
2520
                    uint64_t global_index_buffer_offset = 0;
2405
2570
 
2406
2571
            md->g_num_aggregators = 0;
2407
2572
            md->g_have_mdf = 1;
 
2573
            md->is_color_set = 0;
2408
2574
            md->g_color1 = 0;
2409
2575
            md->g_color2 = 0;
2410
2576
 
2435
2601
    md->mfh = 0;
2436
2602
    md->req = 0;
2437
2603
    memset (&md->status, 0, sizeof (MPI_Status));
 
2604
    if (md->g_ost_skipping_list) {
 
2605
        free (md->g_ost_skipping_list);
 
2606
        md->g_ost_skipping_list = NULL;
 
2607
    }
2438
2608
 
2439
2609
    adios_clear_index_v1 (md->index);
2440
2610
    return;
2508
2678
 
2509
2679
                    if (count != md->vars_header_size)
2510
2680
                    {
2511
 
                        log_warn ("d:MPI_AMR method tried to write %llu, only wrote %d\n",
 
2681
                        log_warn ("d:MPI_AMR method tried to write %llu, only wrote %llu\n",
2512
2682
                                md->vars_header_size, count);
2513
2683
                    }
2514
2684
                }
2654
2824
            if (fd->shared_buffer == adios_flag_yes && !md->g_merging_pgs)
2655
2825
            {
2656
2826
                //printf ("do not merge pg\n");
2657
 
                struct adios_bp_buffer_struct_v1 b;
2658
 
                struct adios_process_group_header_struct_v1 pg_header;
2659
 
                struct adios_vars_header_struct_v1 vars_header;
2660
 
                int pg_size, header_size;
2661
 
                uint64_t vars_count_offset;
 
2827
                int pg_size;
2662
2828
 
2663
2829
                pg_size = fd->bytes_written;
2664
2830
                pg_sizes = (int *) malloc (new_group_size * 4);
2691
2857
                {
2692
2858
                    if (total_data_size > MAX_AGG_BUF)
2693
2859
                    {
2694
 
                        log_warn ("The max allowed aggregation buffer is %llu. Requested %llu.\n"
 
2860
                        log_warn ("The max allowed aggregation buffer is %d. Requested %d.\n"
2695
2861
                                "Need to increase the number of aggregators.\n",
2696
2862
                                MAX_AGG_BUF, total_data_size);
2697
2863
                    }
2699
2865
                    if (aggr_buff == 0)
2700
2866
                    {
2701
2867
                        adios_error (err_no_memory, 
2702
 
                                "MPI_AMR method (AG): Cannot allocate %llu bytes "
 
2868
                                "MPI_AMR method (AG): Cannot allocate %d bytes "
2703
2869
                                "for aggregation buffer.\n"
2704
2870
                                "Need to increase the number of aggregators.\n",
2705
2871
                                total_data_size);
2917
3083
                    STOP_TIMER (ADIOS_TIMER_MPI_AMR_COMM);
2918
3084
                }
2919
3085
 
2920
 
                uint64_t count = 0;
2921
3086
                if (is_aggregator(md->rank))
2922
3087
                {
2923
3088
#if 0
 
3089
                    uint64_t count = 0;
2924
3090
                    pthread_join (t, NULL);
2925
3091
          
2926
3092
                    write_thread_data.fh = &md->fh;
2965
3131
                if (!is_aggregator(md->rank))
2966
3132
                {
2967
3133
                    uint64_t var_offset_to_add = 0, attr_offset_to_add = 0;
2968
 
                    uint64_t var_base_offset = 0, attr_base_offset = 0;
2969
 
 
2970
 
                    // change to relative offset
2971
 
                    if (md->index->vars_root)
2972
 
                    {
2973
 
                        var_base_offset = md->index->vars_root->characteristics [0].offset;
2974
 
                    }
2975
 
 
2976
 
                    if (md->index->attrs_root)
2977
 
                    {
2978
 
                        attr_base_offset = md->index->attrs_root->characteristics [0].offset;
2979
 
                    }
2980
 
/*
2981
 
                    adios_mpi_amr_subtract_offset (var_base_offset
2982
 
                                                   ,var_base_offset
2983
 
                                                   ,md->index
2984
 
                                                   );
2985
 
*/
2986
3134
 
2987
3135
                    for (i = 0; i < new_rank; i++)
2988
3136
                    {
3298
3446
            // write out the metadata file from rank 0
3299
3447
            if (md->rank == 0)
3300
3448
            {
3301
 
                MPI_File m_file;
3302
3449
                char * global_index_buffer = 0;
3303
3450
                uint64_t global_index_buffer_size = 0;
3304
3451
                uint64_t global_index_buffer_offset = 0;
3364
3511
 
3365
3512
            md->g_num_aggregators = 0;
3366
3513
            md->g_have_mdf = 1;
 
3514
            md->is_color_set = 0;
3367
3515
            md->g_color1 = 0;
3368
3516
            md->g_color2 = 0;
3369
3517
 
3401
3549
    md->mfh = 0;
3402
3550
    md->req = 0;
3403
3551
    memset (&md->status, 0, sizeof (MPI_Status));
 
3552
    if (md->g_ost_skipping_list) {
 
3553
        free (md->g_ost_skipping_list);
 
3554
        md->g_ost_skipping_list = NULL;
 
3555
    }
3404
3556
 
3405
3557
    adios_clear_index_v1 (md->index);
3406
3558
}
3436
3588
                                                 method->method_data;
3437
3589
    adios_free_index_v1 (md->index);
3438
3590
 
 
3591
#ifdef HAVE_FGR
 
3592
    fgr_finalize ();
 
3593
#endif
3439
3594
    if (adios_mpi_amr_initialized)
3440
3595
        adios_mpi_amr_initialized = 0;
3441
3596
}