/**************************************************************************** * Filename: perform_test.c * * Description: * * Version: 1.0 * Created: 08/26/2012 10:09:11 AM * Revision: none * Compiler: gcc * * Author: Wang Wencan * Email: never.wencan@gmail.com * Company: HPC Tsinghua ***************************************************************************/ #include #include #include "mpi.h" #include "pnetcdf.h" #define LAT 4096 #define LON 2048 #define LOOP 10 #define VALN 50 #define ERR {if(err!=NC_NOERR)printf("Error at line=%d: %s\n", __LINE__, ncmpi_strerror(err));} int main(int argc, char** argv) { int rank, size, err; char *path = "./output/test"; int ncidp; int dim1,var1,i, j; MPI_Info info; int LAT_PROC, LON_PROC; MPI_Offset start[2],count[2]; int var[VALN]; char var_name[16]; size_t len = 10; MPI_Comm comm = MPI_COMM_WORLD; if(4 != argc) { printf("Usage : perform_test_pnetcdf LAT_PROC LON_PROC output_dir\n"); return -1; } MPI_Init(&argc, &argv); MPI_Comm_rank(comm, &rank); MPI_Comm_size(comm, &size); LAT_PROC = atoi(argv[1]); LON_PROC = atoi(argv[2]); assert(size == LAT_PROC * LON_PROC); start[0] = (rank % LAT_PROC) * (LAT / LAT_PROC); start[1] = (rank / LAT_PROC) * (LON / LON_PROC); count[0] = LAT / LAT_PROC; count[1] = LON / LON_PROC; double *fp = malloc(count[0] * count[1] *sizeof(double)); for( i = 0; i< count[0] * count[1]; i++) { fp[i] = i + rank * count[0] * count[1]; } for(i = 0; i < LOOP; i ++) { char fileName[100]; sprintf(fileName,"%s/pnetcdf-%d.nc", argv[3], i); int dimids[2]; //MPI_Info_create(&info); //MPI_Info_set(info, "romio_ds_write", "disable"); //MPI_Info_set(info, "ind_wr_buffer_size", "16777216"); //ncmpi_create(MPI_COMM_WORLD, fileName, NC_64BIT_OFFSET, info, &ncidp); err = ncmpi_create(MPI_COMM_WORLD, fileName, NC_64BIT_OFFSET, MPI_INFO_NULL, &ncidp); ERR int lat = LAT; err = ncmpi_def_dim(ncidp, "lat", lat,&dimids[0]); ERR err = ncmpi_def_dim(ncidp, "lon", LON,&dimids[1]); ERR err = ncmpi_def_var(ncidp,"time_v", NC_DOUBLE, 2,dimids,&var1); ERR for(j = 0; j < VALN; j++) { sprintf(var_name, "time_v%d", j); err = ncmpi_def_var(ncidp,var_name, NC_DOUBLE, 2,dimids, &var[j]); ERR } err = ncmpi_enddef(ncidp); ERR for(j = 0; j < VALN; j++) { err = ncmpi_put_vara_double_all(ncidp,var[j], start, count,fp); ERR } err = ncmpi_close(ncidp); ERR } //iofw_nc_put_vara_float(rank,ncidp,var1, 2,start, count,fp); //iofw_nc_put_vara_float(rank,ncidp,var1, 2,start, count,fp); free(fp); MPI_Finalize(); return 0; }