3234 long contiguous_size;
3235 MPI_Datatype dataType[2];
3236 MPI_Aint tmp1, type_size;
3239 int *rp_lb_addr = NULL;
3240 int *rp_ub_addr = NULL;
3241 int *rp_step_addr = NULL;
3243 size_t array_type_size;
3247 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
3248 MPI_Comm_size(MPI_COMM_WORLD, &nproc);
3251 fprintf(stderr,
"IO:START(xmp_file_set_view_all): rank=%d\n", rank);
3255 if (pstXmp_file == NULL) {
return 1001; }
3256 if (apd == NULL) {
return 1002; }
3257 if (rp == NULL) {
return 1004; }
3258 if (disp < 0) {
return 1005; }
3261 if (tempd == NULL){
return 1006; }
3265 rp_dims = _xmp_range_get_dims(rp);
3266 rp_lb_addr = _xmp_range_get_lb_addr(rp);
3267 rp_ub_addr = _xmp_range_get_ub_addr(rp);
3268 rp_step_addr = _xmp_range_get_step_addr(rp);
3269 if (!rp_lb_addr || !rp_ub_addr || !rp_step_addr){
return 1007; }
3270 #define RP_DIMS (rp_dims)
3271 #define RP_LB(i) (rp_lb_addr[(i)])
3272 #define RP_UB(i) (rp_ub_addr[(i)])
3273 #define RP_STEP(i) (rp_step_addr[(i)])
3276 if (array_ndims !=
RP_DIMS) {
return 1008; }
3279 fprintf(stderr,
"VIEW(%d/%d) dims=%d\n", rank, nproc,
RP_DIMS);
3283 MPI_Type_contiguous(array_type_size, MPI_BYTE, &dataType[0]);
3286 for (i =
RP_DIMS - 1; i >= 0; i--)
3289 int par_upper_i = xmp_array_gclubound_tmp(apd, i+1);
3292 fprintf(stderr,
"xmp_file_set_view_all: myrank=%d: i=%d: "
3293 "align_manner_i=%d bw_i=%d par_lower_i=%d par_upper_i=%d\n",
3298 xmp_array_gclubound_tmp(apd, i+1));
3302 mpiRet =MPI_Type_get_extent(dataType[0], &tmp1, &type_size);
3303 if (mpiRet != MPI_SUCCESS) {
return -1009; }
3305 int byte_dataType0; MPI_Type_size(dataType[0], &byte_dataType0);
3307 fprintf(stderr,
"xmp_file_set_view_all: rank=%d: i=%d align_manner_i=%d type_size=%ld byte_dataType0=%d\n",
3308 rank, i, align_manner_i, (
long)type_size, byte_dataType0);
3312 fprintf(stderr,
"VIEW(%d/%d) (lb,ub,step)=(%d,%d,%d)\n",
3314 fprintf(stderr,
"VIEW(%d/%d) (par_lower,par_upper)=(%d,%d)\n",
3315 rank, nproc, par_lower_i, par_upper_i);
3325 mpiRet = MPI_Type_contiguous(contiguous_size, dataType[0], &dataType[1]);
3328 MPI_Type_free(&dataType[0]);
3329 dataType[0] = dataType[1];
3332 if (mpiRet != MPI_SUCCESS) {
return 1010; }
3335 fprintf(stderr,
"VIEW(%d/%d) NOT_ALIGNED\n", rank, nproc);
3336 fprintf(stderr,
"VIEW(%d/%d) contiguous_size=%d\n", rank, nproc, contiguous_size);
3354 else if (par_upper_i <
RP_LB(i))
3356 contiguous_size = space_size = 0;
3359 else if (par_lower_i >
RP_UB(i))
3361 contiguous_size = space_size = 0;
3368 = (par_lower_i >
RP_LB(i)) ?
3374 = (par_upper_i <
RP_UB(i)) ?
3375 par_upper_i :
RP_UB(i);
3378 contiguous_size = (upper - lower) /
RP_STEP(i) + 1;
3394 mpiRet = MPI_Type_contiguous(contiguous_size, dataType[0], &dataType[1]);
3397 MPI_Type_free(&dataType[0]);
3400 if (mpiRet != MPI_SUCCESS) {
return 1012; }
3403 int byte_datatype1; MPI_Aint lb_datatype1, extent_datatype1;
3404 MPI_Type_size(dataType[1], &byte_datatype1);
3405 MPI_Type_get_extent(dataType[1], &lb_datatype1, &extent_datatype1);
3406 if (extent_datatype1 + space_size > total_size){
3407 _XMP_fatal(
"xmp_file_set_view_all (block): data type is incorrect");
3418 if (mpiRet != MPI_SUCCESS) {
return 1013; }
3421 MPI_Type_free(&dataType[1]);
3423 int byte_dataType0; MPI_Aint lb_dataType0, extent_dataType0;
3424 MPI_Type_size(dataType[0], &byte_dataType0);
3425 MPI_Type_get_extent(dataType[0], &lb_dataType0, &extent_dataType0);
3427 fprintf(stderr,
"set_view_all: after block: myrank=%d: byte_dataType0=%d lb=%ld extent=%ld ; space_size=%ld total_size=%ld\n",
3428 rank, byte_dataType0, (
long)lb_dataType0, (
long)extent_dataType0,
3429 space_size, total_size);
3432 fprintf(stderr,
"VIEW(%d/%d) ALIGN_BLOCK\n", rank, nproc );
3433 fprintf(stderr,
"VIEW(%d/%d) type_size=%ld\n", rank, nproc , (
long)type_size);
3434 fprintf(stderr,
"VIEW(%d/%d) contiguous_size=%ld\n", rank, nproc , contiguous_size);
3435 fprintf(stderr,
"VIEW(%d/%d) space_size=%ld\n", rank, nproc , space_size);
3436 fprintf(stderr,
"VIEW(%d/%d) total_size=%ld\n", rank, nproc , total_size);
3437 fprintf(stderr,
"VIEW(%d/%d) (lower,upper)=(%d,%d)\n", rank, nproc , lower, upper);
3438 fprintf(stderr,
"\n");
3450 else if (par_lower_i <
RP_UB(i))
3452 contiguous_size = space_size = 0;
3455 else if (par_upper_i >
RP_LB(i))
3457 contiguous_size = space_size = 0;
3464 = (par_upper_i <
RP_LB(i)) ?
3470 = (par_lower_i >
RP_UB(i)) ?
3471 par_lower_i :
RP_UB(i);
3474 contiguous_size = (upper - lower) /
RP_STEP(i) + 1;
3484 mpiRet = MPI_Type_contiguous(contiguous_size, dataType[0], &dataType[1]);
3491 MPI_Type_free(&dataType[0]);
3494 if (mpiRet != MPI_SUCCESS) {
return 1015; }
3497 int byte_datatype1; MPI_Aint lb_datatype1, extent_datatype1;
3498 MPI_Type_size(dataType[1], &byte_datatype1);
3499 MPI_Type_get_extent(dataType[1], &lb_datatype1, &extent_datatype1);
3500 if (extent_datatype1 + space_size > total_size){
3501 _XMP_fatal(
"xmp_file_set_view_all (block): data type is incorrect");
3512 if (mpiRet != MPI_SUCCESS) {
return 1016; }
3515 MPI_Type_free(&dataType[1]);
3518 fprintf(stderr,
"VIEW(%d/%d) ALIGN_BLOCK\n", rank, nproc);
3519 fprintf(stderr,
"VIEW(%d/%d) contiguous_size=%ld\n", rank, nproc, contiguous_size);
3520 fprintf(stderr,
"VIEW(%d/%d) space_size=%ld\n", rank, nproc, space_size);
3521 fprintf(stderr,
"VIEW(%d/%d) total_size=%ld\n", rank, nproc, total_size);
3522 fprintf(stderr,
"VIEW(%d/%d) (lower,upper)=(%d,%d)\n", rank, nproc, lower, upper);
3532 _XMP_fatal(
"xmp_file_set_view_all: invalid block width");
3535 _XMP_fatal(
"xmp_file_set_view_all: invalid block width for cyclic distribution");
3539 int ierr = _xmp_io_set_view_block_cyclic(par_lower_i , par_upper_i , bw_i , cycle_i ,
3543 if (ierr != MPI_SUCCESS) {
return -1017; }
3544 MPI_Type_free(&dataType[0]);
3545 dataType[0] = dataType[1];
3550 _XMP_fatal(
"xmp_file_set_view_all: invalid align manner");
3556 mpiRet = MPI_Type_commit(&dataType[0]);
3559 if (mpiRet != MPI_SUCCESS) {
return 1019; }
3564 MPI_Type_size(dataType[0], &byte_dataType0);
3566 fprintf(stderr,
"set_view_all: myrank=%d: byte_dataType0=%d\n", rank, byte_dataType0);
3568 if (byte_dataType0 > 0){
3569 mpiRet = MPI_File_set_view(pstXmp_file->fh,
3576 mpiRet = MPI_File_set_view(pstXmp_file->fh,
3585 MPI_Type_free(&dataType[0]);
3588 if (mpiRet != MPI_SUCCESS) {
return 1020; }
3591 fprintf(stderr,
"IO:END (xmp_file_set_view_all): rank=%d\n", rank);