1/*
2Copyright 2009, UCAR/Unidata
3See COPYRIGHT file for copying and redistribution conditions.
4
5This program tests netcdf-4 parallel I/O.
6
7$Id: tst_parallel.c,v 1.7 2009/08/19 15:58:57 ed Exp $
8*/
9
10/* Defining USE_MPE causes the MPE trace library to be used (and you
11 * must also relink with -llmpe -lmpe). This causes clog2 output to be
12 * written, which can be converted to slog2 (by the program
13 * clog2TOslog2) and then used in the analysis program jumpshot. */
14/*#define USE_MPE 1*/
15
16#include <nc_tests.h>
17#include "err_macros.h"
18#include <mpi.h>
19#ifdef USE_MPE
20#include <mpe.h>
21#endif /* USE_MPE */
22#define FILE "tst_parallel.nc"
23#define NDIMS 3
24#define DIMSIZE 24
25#define QTR_DATA (DIMSIZE * DIMSIZE / 4)
26#define NUM_PROC 4
27#define NUM_SLABS 10
28
29int
30main(int argc, char **argv)
31{
32    /* MPI stuff. */
33    int mpi_namelen;
34    char mpi_name[MPI_MAX_PROCESSOR_NAME];
35    int mpi_sizempi_rank;
36    MPI_Comm comm = MPI_COMM_WORLD;
37    MPI_Info info = MPI_INFO_NULL;
38
39    /* Netcdf-4 stuff. */
40    int ncidv1iddimids[NDIMS];
41    size_t start[NDIMS], count[NDIMS];
42
43    int data[DIMSIZE * DIMSIZE], ires;
44    int slab_data[DIMSIZE * DIMSIZE / 4]; /* one slab */
45    char file_name[NC_MAX_NAME + 1];
46
47#ifdef USE_MPE
48    int s_inite_inits_definee_defines_writee_writes_closee_close;
49#endif /* USE_MPE */
50
51    /* Initialize MPI. */
52    MPI_Init(&argc,&argv);
53    MPI_Comm_size(MPI_COMM_WORLD, &mpi_size);
54    MPI_Comm_rank(MPI_COMM_WORLD, &mpi_rank);
55    MPI_Get_processor_name(mpi_name, &mpi_namelen);
56    /*printf("mpi_name: %s size: %d rank: %d\n", mpi_name,
57      mpi_size, mpi_rank);*/
58
59#ifdef USE_MPE
60    MPE_Init_log();
61    s_init = MPE_Log_get_event_number();
62    e_init = MPE_Log_get_event_number();
63    s_define = MPE_Log_get_event_number();
64    e_define = MPE_Log_get_event_number();
65    s_write = MPE_Log_get_event_number();
66    e_write = MPE_Log_get_event_number();
67    s_close = MPE_Log_get_event_number();
68    e_close = MPE_Log_get_event_number();
69    MPE_Describe_state(s_inite_init, "Init", "red");
70    MPE_Describe_state(s_definee_define, "Define", "yellow");
71    MPE_Describe_state(s_writee_write, "Write", "green");
72    MPE_Describe_state(s_closee_close, "Close", "purple");
73    MPE_Start_log();
74    MPE_Log_event(s_init, 0, "start init");
75#endif /* USE_MPE */
76
77    if (mpi_rank == 1)
78    {
79       printf("\n*** tst_parallel testing very basic parallel access.\n");
80       printf("*** tst_parallel testing whether we can create file for parallel access and write to it...");
81    }
82
83    /* Create phony data. We're going to write a 24x24 array of ints,
84       in 4 sets of 144. */
85    /*printf("mpi_rank*QTR_DATA=%d (mpi_rank+1)*QTR_DATA-1=%d\n",
86      mpi_rank*QTR_DATA, (mpi_rank+1)*QTR_DATA);*/
87    for (i = mpi_rank * QTR_DATAi < (mpi_rank + 1) * QTR_DATAi++)
88       data[i] = mpi_rank;
89    for (i = 0; i < DIMSIZE * DIMSIZE / 4; i++)
90       slab_data[i] = mpi_rank;
91
92#ifdef USE_MPE
93    MPE_Log_event(e_init, 0, "end init");
94    MPE_Log_event(s_define, 0, "start define file");
95#endif /* USE_MPE */
96
97    /* Create a parallel netcdf-4 file. */
98    /*nc_set_log_level(3);*/
99    sprintf(file_name, "%s/%s", TEMP_LARGEFILE);
100    if ((res = nc_create_par(file_nameNC_NETCDF4|NC_MPIIOcomm,
101      info, &ncid))) ERR;
102
103    /* Create three dimensions. */
104    if (nc_def_dim(ncid, "d1", DIMSIZEdimids)) ERR;
105    if (nc_def_dim(ncid, "d2", DIMSIZE, &dimids[1])) ERR;
106    if (nc_def_dim(ncid, "d3", NUM_SLABS, &dimids[2])) ERR;
107
108    /* Create one var. */
109    if ((res = nc_def_var(ncid, "v1", NC_INTNDIMSdimids, &v1id))) ERR;
110
111    /* Write metadata to file. */
112    if ((res = nc_enddef(ncid))) ERR;
113
114#ifdef USE_MPE
115    MPE_Log_event(e_define, 0, "end define file");
116    if (mpi_rank)
117       sleep(mpi_rank);
118#endif /* USE_MPE */
119
120    /* Set up slab for this process. */
121    start[0] = mpi_rank * DIMSIZE/mpi_size;
122    start[1] = 0;
123    count[0] = DIMSIZE/mpi_size;
124    count[1] = DIMSIZE;
125    count[2] = 1;
126    /*printf("mpi_rank=%d start[0]=%d start[1]=%d count[0]=%d count[1]=%d\n",
127      mpi_rank, start[0], start[1], count[0], count[1]);*/
128
129    if (nc_var_par_access(ncidv1idNC_COLLECTIVE)) ERR;
130/*    if (nc_var_par_access(ncid, v1id, NC_INDEPENDENT)) ERR;*/
131
132    for (start[2] = 0; start[2] < NUM_SLABSstart[2]++)
133    {
134#ifdef USE_MPE
135       MPE_Log_event(s_write, 0, "start write slab");
136#endif /* USE_MPE */
137
138       /* Write slabs of phoney data. */
139       if (nc_put_vara_int(ncidv1idstartcountslab_data)) ERR;
140#ifdef USE_MPE
141       MPE_Log_event(e_write, 0, "end write file");
142#endif /* USE_MPE */
143    }
144
145#ifdef USE_MPE
146    MPE_Log_event(s_close, 0, "start close file");
147#endif /* USE_MPE */
148
149    /* Close the netcdf file. */
150    if ((res = nc_close(ncid))) ERR;
151
152#ifdef USE_MPE
153    MPE_Log_event(e_close, 0, "end close file");
154#endif /* USE_MPE */
155
156    /* Delete this large file. */
157    remove(file_name);
158
159    /* Shut down MPI. */
160    MPI_Finalize();
161
162    if (mpi_rank == 1)
163    {
164       SUMMARIZE_ERR;
165       FINAL_RESULTS;
166    }
167    return 0;
168}


HyperKWIC - Version 7.20DA executed at 11:37 on 27 Oct 2017 | Polyhedron Solutions - INTERNAL USE | COMMERCIAL (Any O/S) SN 4AKIed