Fixes trac:1370, #1147
Update the version of ROMIO to that which was contained in MPICH2-1.0.7, plus a few patches from the upstream ROMIO maintainers (because OMPI uses a few code paths in ROMIO that MPICH2 does not; there were a few compile bugs in the ROMIO from MPICH2-1.0.7). Added an info MCA param to be able to tell which version of ROMIO is contained in OMPI: io_romio_version. Many, many thanks to romio-maint@mcs.anl.gov for all their help in integrating this new version of ROMIO into Open MPI. This commit was SVN r19045. The following Trac tickets were found above: Ticket 1370 --> https://svn.open-mpi.org/trac/ompi/ticket/1370
Этот коммит содержится в:
родитель
0735d6f1c2
Коммит
63b63d48c3
2
NEWS
2
NEWS
@ -60,7 +60,7 @@ Trunk (not on release branches yet)
|
|||||||
- Remove use of STL from C++ bindings.
|
- Remove use of STL from C++ bindings.
|
||||||
- Added support for Platform/LSF job launchers. Must be Platform LSF
|
- Added support for Platform/LSF job launchers. Must be Platform LSF
|
||||||
v7.0.2 or later.
|
v7.0.2 or later.
|
||||||
- Updated ROMIO with the version from MPICH2 1.0.5p4
|
- Updated ROMIO with the version from MPICH2 1.0.7
|
||||||
- Added RDMA capable one-sided component (called rdma), which
|
- Added RDMA capable one-sided component (called rdma), which
|
||||||
can be used with BTL components that expose a full one-sided
|
can be used with BTL components that expose a full one-sided
|
||||||
interface.
|
interface.
|
||||||
|
@ -220,8 +220,8 @@ int mca_io_base_request_alloc(ompi_file_t *file,
|
|||||||
/*
|
/*
|
||||||
* Free a module-specific IO MPI_Request
|
* Free a module-specific IO MPI_Request
|
||||||
*/
|
*/
|
||||||
void mca_io_base_request_free(ompi_file_t *file,
|
OMPI_DECLSPEC void mca_io_base_request_free(ompi_file_t *file,
|
||||||
mca_io_base_request_t *req)
|
mca_io_base_request_t *req)
|
||||||
{
|
{
|
||||||
/* Put the request back on the per-module freelist, since it's
|
/* Put the request back on the per-module freelist, since it's
|
||||||
been initialized for that module */
|
been initialized for that module */
|
||||||
@ -295,7 +295,7 @@ mca_io_base_request_progress_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
OMPI_DECLSPEC void
|
||||||
mca_io_base_request_progress_add(void)
|
mca_io_base_request_progress_add(void)
|
||||||
{
|
{
|
||||||
#if OMPI_ENABLE_PROGRESS_THREADS
|
#if OMPI_ENABLE_PROGRESS_THREADS
|
||||||
@ -319,7 +319,7 @@ mca_io_base_request_progress_add(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
OMPI_DECLSPEC void
|
||||||
mca_io_base_request_progress_del(void)
|
mca_io_base_request_progress_del(void)
|
||||||
{
|
{
|
||||||
OPAL_THREAD_ADD32(&mca_io_base_request_num_pending, -1);
|
OPAL_THREAD_ADD32(&mca_io_base_request_num_pending, -1);
|
||||||
|
@ -114,8 +114,8 @@ extern "C" {
|
|||||||
*
|
*
|
||||||
* For optimization reasons, \em no error checking is performed.
|
* For optimization reasons, \em no error checking is performed.
|
||||||
*/
|
*/
|
||||||
void mca_io_base_request_free(ompi_file_t *file,
|
OMPI_DECLSPEC void mca_io_base_request_free(ompi_file_t *file,
|
||||||
mca_io_base_request_t *req);
|
mca_io_base_request_t *req);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -135,12 +135,12 @@ extern "C" {
|
|||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void mca_io_base_request_progress_add(void);
|
OMPI_DECLSPEC void mca_io_base_request_progress_add(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void mca_io_base_request_progress_del(void);
|
OMPI_DECLSPEC void mca_io_base_request_progress_del(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finalize the request progress code
|
* Finalize the request progress code
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
@ -28,12 +29,14 @@ AC_DEFUN([MCA_io_romio_POST_CONFIG], [
|
|||||||
# MCA_io_romio_CONFIG([action-if-found], [action-if-not-found])
|
# MCA_io_romio_CONFIG([action-if-found], [action-if-not-found])
|
||||||
# -----------------------------------------------------------
|
# -----------------------------------------------------------
|
||||||
AC_DEFUN([MCA_io_romio_CONFIG],[
|
AC_DEFUN([MCA_io_romio_CONFIG],[
|
||||||
|
OMPI_VAR_SCOPE_PUSH([io_romio_flags io_romio_flags_define io_romio_happy io_romio_save_LIBS])
|
||||||
AC_ARG_ENABLE([io-romio],
|
AC_ARG_ENABLE([io-romio],
|
||||||
[AC_HELP_STRING([--disable-io-romio],
|
[AC_HELP_STRING([--disable-io-romio],
|
||||||
[Disable the ROMIO MPI-IO component])])
|
[Disable the ROMIO MPI-IO component])])
|
||||||
AC_ARG_WITH([io-romio-flags],
|
AC_ARG_WITH([io-romio-flags],
|
||||||
[AC_HELP_STRING([--with-io-romio-flags=FLAGS],
|
[AC_HELP_STRING([--with-io-romio-flags=FLAGS],
|
||||||
[Pass FLAGS to the ROMIO distribution configuration script])])
|
[Pass FLAGS to the ROMIO distribution configuration script])])
|
||||||
|
AC_DEFINE_UNQUOTED([MCA_io_romio_USER_CONFIGURE_FLAGS], ["$with_io_romio_flags"], [Set of user-defined configure flags given to ROMIOs configure script via --with-io-romio-flags])
|
||||||
AC_MSG_CHECKING([if want ROMIO component])
|
AC_MSG_CHECKING([if want ROMIO component])
|
||||||
AS_IF([test "$enable_io_romio" = "no"],
|
AS_IF([test "$enable_io_romio" = "no"],
|
||||||
[AC_MSG_RESULT([no])
|
[AC_MSG_RESULT([no])
|
||||||
@ -73,7 +76,10 @@ AC_DEFUN([MCA_io_romio_CONFIG],[
|
|||||||
[AS_IF([test ! -z $build], [io_romio_flags="$io_romio_flags --build=$build"])
|
[AS_IF([test ! -z $build], [io_romio_flags="$io_romio_flags --build=$build"])
|
||||||
AS_IF([test ! -z $host], [io_romio_flags="$io_romio_flags --host=$host"])
|
AS_IF([test ! -z $host], [io_romio_flags="$io_romio_flags --host=$host"])
|
||||||
AS_IF([test ! -z $target], [io_romio_flags="$io_romio_flags --target=$target"])])
|
AS_IF([test ! -z $target], [io_romio_flags="$io_romio_flags --target=$target"])])
|
||||||
io_romio_flags="$io_romio_flags CFLAGS="'"'"$CFLAGS"'"'" CPPFLAGS="'"'"$CPPFLAGS"'"'" FFLAGS="'"'"$FFLAGS"'"'" LDFLAGS="'"'"$LDFLAGS"'"'" --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=open_mpi"
|
io_romio_flags_define="$io_romio_flags CFLAGS='$CFLAGS' CPPFLAGS='$CPPFLAGS' FFLAGS='$FFLAGS' LDFLAGS='$LDFLAGS' --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=open_mpi --disable-aio"
|
||||||
|
AC_DEFINE_UNQUOTED([MCA_io_romio_COMPLETE_CONFIGURE_FLAGS], ["$io_romio_flags_define"], [Complete set of command line arguments given to ROMIOs configure script])
|
||||||
|
|
||||||
|
io_romio_flags="$io_romio_flags CFLAGS="'"'"$CFLAGS"'"'" CPPFLAGS="'"'"$CPPFLAGS"'"'" FFLAGS="'"'"$FFLAGS"'"'" LDFLAGS="'"'"$LDFLAGS"'"'" --$io_romio_shared-shared --$io_romio_static-static $io_romio_flags $io_romio_prefix_arg --with-mpi=open_mpi --disable-aio"
|
||||||
|
|
||||||
ompi_show_subtitle "Configuring ROMIO distribution"
|
ompi_show_subtitle "Configuring ROMIO distribution"
|
||||||
OMPI_CONFIG_SUBDIR([ompi/mca/io/romio/romio],
|
OMPI_CONFIG_SUBDIR([ompi/mca/io/romio/romio],
|
||||||
@ -98,4 +104,5 @@ AC_DEFUN([MCA_io_romio_CONFIG],[
|
|||||||
[AC_MSG_ERROR([ROMIO distribution did not configure successfully])],
|
[AC_MSG_ERROR([ROMIO distribution did not configure successfully])],
|
||||||
[AC_MSG_WARN([ROMIO distribution did not configure successfully])])
|
[AC_MSG_WARN([ROMIO distribution did not configure successfully])])
|
||||||
$2])])])
|
$2])])])
|
||||||
|
OMPI_VAR_SCOPE_POP
|
||||||
])
|
])
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
@ -18,7 +19,9 @@
|
|||||||
|
|
||||||
include $(top_srcdir)/Makefile.options
|
include $(top_srcdir)/Makefile.options
|
||||||
|
|
||||||
SUBDIRS = include adio mpi-io
|
# Left out common/dataloop -- it's not enabled in MPICH2-1.0.7.
|
||||||
|
|
||||||
|
SUBDIRS = include adio mpi-io
|
||||||
DIST_SUBDIRS = $(SUBDIRS) doc util
|
DIST_SUBDIRS = $(SUBDIRS) doc util
|
||||||
|
|
||||||
EXTRA_DIST = README COPYRIGHT README_OMPI
|
EXTRA_DIST = README COPYRIGHT README_OMPI
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
ROMIO: A High-Performance, Portable MPI-IO Implementation
|
ROMIO: A High-Performance, Portable MPI-IO Implementation
|
||||||
|
|
||||||
Version 2005-06-09
|
Version 2008-03-09
|
||||||
|
|
||||||
Major Changes in this version:
|
Major Changes in this version:
|
||||||
------------------------------
|
------------------------------
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
@ -20,6 +21,22 @@ include $(top_srcdir)/Makefile.options
|
|||||||
|
|
||||||
# Conditionals whether to build each subdir or not
|
# Conditionals whether to build each subdir or not
|
||||||
|
|
||||||
|
if BUILD_BGL
|
||||||
|
BGL_DIR = ad_bgl
|
||||||
|
BGL_LIB = ad_bgl/libadio_bgl.la
|
||||||
|
else
|
||||||
|
BGL_DIR =
|
||||||
|
BGL_LIB =
|
||||||
|
endif
|
||||||
|
|
||||||
|
if BUILD_BGLOCKLESS
|
||||||
|
BGLOCKLESS_DIR = ad_bglockless
|
||||||
|
BGLOCKLESS_LIB = ad_bglockless/libadio_bglockless.la
|
||||||
|
else
|
||||||
|
BGLOCKLESS_DIR =
|
||||||
|
BGLOCKLESS_LIB =
|
||||||
|
endif
|
||||||
|
|
||||||
if BUILD_GRIDFTP
|
if BUILD_GRIDFTP
|
||||||
GRIDFTP_DIR = ad_gridftp
|
GRIDFTP_DIR = ad_gridftp
|
||||||
GRIDFTP_LIB = ad_gridftp/libadio_gridftp.la
|
GRIDFTP_LIB = ad_gridftp/libadio_gridftp.la
|
||||||
@ -28,12 +45,21 @@ GRIDFTP_DIR =
|
|||||||
GRIDFTP_LIB =
|
GRIDFTP_LIB =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if BUILD_HFS
|
# 8 July 2008: romio-maint@mcs.anl.gov says that this is deprecated
|
||||||
HFS_DIR = ad_hfs
|
#if BUILD_HFS
|
||||||
HFS_LIB = ad_hfs/libadio_hfs.la
|
#HFS_DIR = ad_hfs
|
||||||
|
#HFS_LIB = ad_hfs/libadio_hfs.la
|
||||||
|
#else
|
||||||
|
#HFS_DIR =
|
||||||
|
#HFS_LIB =
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if BUILD_LUSTRE
|
||||||
|
LUSTRE_DIR = ad_lustre
|
||||||
|
LUSTRE_LIB = ad_lustre/libadio_lustre.la
|
||||||
else
|
else
|
||||||
HFS_DIR =
|
LUSTRE_DIR =
|
||||||
HFS_LIB =
|
LUSTRE_LIB =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if BUILD_NFS
|
if BUILD_NFS
|
||||||
@ -69,13 +95,14 @@ PFS_DIR =
|
|||||||
PFS_LIB =
|
PFS_LIB =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if BUILD_PIOFS
|
# 8 July 2008: romio-maint@mcs.anl.gov says that this is deprecated
|
||||||
PIOFS_DIR = ad_piofs
|
#if BUILD_PIOFS
|
||||||
PIOFS_LIB = ad_piofs/libadio_piofs.la
|
#PIOFS_DIR = ad_piofs
|
||||||
else
|
#PIOFS_LIB = ad_piofs/libadio_piofs.la
|
||||||
PIOFS_DIR =
|
#else
|
||||||
PIOFS_LIB =
|
#PIOFS_DIR =
|
||||||
endif
|
#PIOFS_LIB =
|
||||||
|
#endif
|
||||||
|
|
||||||
if BUILD_PVFS
|
if BUILD_PVFS
|
||||||
PVFS_DIR = ad_pvfs
|
PVFS_DIR = ad_pvfs
|
||||||
@ -126,21 +153,20 @@ XFS_LIB =
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
SUBDIRS = common include \
|
SUBDIRS = common include \
|
||||||
$(GRIDFTP_DIR) $(HFS_DIR) $(NFS_DIR) $(NTFS_DIR) $(PANFS_DIR) \
|
$(BG_DIR) $(BGLOCKLESS_DIR) \
|
||||||
$(PFS_DIR) $(PIOFS_DIR) $(PVFS_DIR) $(PVFS2_DIR) $(SFS_DIR) \
|
$(GRIDFTP_DIR) $(LUSTRE_DIR) $(NFS_DIR) $(NTFS_DIR) $(PANFS_DIR) \
|
||||||
|
$(PFS_DIR) $(PVFS_DIR) $(PVFS2_DIR) $(SFS_DIR) \
|
||||||
$(TESTFS_DIR) $(UFS_DIR) $(XFS_DIR)
|
$(TESTFS_DIR) $(UFS_DIR) $(XFS_DIR)
|
||||||
DIST_SUBDIRS = common include \
|
DIST_SUBDIRS = common include \
|
||||||
ad_gridftp ad_hfs ad_nfs ad_ntfs ad_panfs ad_pfs ad_piofs ad_pvfs \
|
ad_bgl ad_bglockless ad_gridftp ad_lustre ad_nfs ad_ntfs \
|
||||||
ad_pvfs2 ad_sfs ad_testfs ad_ufs ad_xfs
|
ad_panfs ad_pfs ad_pvfs ad_pvfs2 ad_sfs ad_testfs ad_ufs ad_xfs
|
||||||
|
|
||||||
# Library
|
# Library
|
||||||
noinst_LTLIBRARIES = libadio.la
|
noinst_LTLIBRARIES = libadio.la
|
||||||
libadio_la_SOURCES =
|
libadio_la_SOURCES =
|
||||||
libadio_la_LIBADD = \
|
libadio_la_LIBADD = \
|
||||||
common/libadio_common.la \
|
common/libadio_common.la \
|
||||||
$(GRIDFTP_LIB) $(HFS_LIB) $(NFS_LIB) $(NTFS_LIB) $(PANFS_LIB) \
|
$(BG_LIB) $(BGLOCKLESS_LIB) \
|
||||||
$(PFS_LIB) $(PIOFS_LIB) $(PVFS_LIB) $(PVFS2_LIB) $(SFS_LIB) \
|
$(GRIDFTP_LIB) $(LUSTRE_LIB) $(NFS_LIB) $(NTFS_LIB) $(PANFS_LIB) \
|
||||||
|
$(PFS_LIB) $(PVFS_LIB) $(PVFS2_LIB) $(SFS_LIB) \
|
||||||
$(TESTFS_LIB) $(UFS_LIB) $(XFS_LIB)
|
$(TESTFS_LIB) $(UFS_LIB) $(XFS_LIB)
|
||||||
libadio_la_DEPENDENCIES = \
|
|
||||||
$(libadio_la_LIBADD)
|
|
||||||
|
|
||||||
|
58
ompi/mca/io/romio/romio/adio/ad_bgl/.state-cache
Обычный файл
58
ompi/mca/io/romio/romio/adio/ad_bgl/.state-cache
Обычный файл
@ -0,0 +1,58 @@
|
|||||||
|
<dir>
|
||||||
|
<file name="ad_bgl_getsh.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_fcntl.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_tuning.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_pset.h" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_aggrs.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_wrcoll.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_aggrs.h" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_pset.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_setsh.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_close.c" info="1206398065"/>
|
||||||
|
<file name="ad_bgl.h" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_read.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_rdcoll.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_open.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_tuning.h" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_write.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl_hints.c" info="1205188711"/>
|
||||||
|
<file name="ad_bgl.c" info="1205188711"/>
|
||||||
|
</dir>
|
||||||
|
<data>
|
||||||
|
<fileinfo name="ad_bgl_getsh.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_fcntl.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_tuning.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_pset.h">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_aggrs.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_wrcoll.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_aggrs.h">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_pset.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_setsh.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_close.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl.h">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_read.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_rdcoll.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_open.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_tuning.h">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_write.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl_hints.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_bgl.c">
|
||||||
|
</fileinfo>
|
||||||
|
</data>
|
47
ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.in
Обычный файл
47
ompi/mca/io/romio/romio/adio/ad_bgl/Makefile.in
Обычный файл
@ -0,0 +1,47 @@
|
|||||||
|
CC = @CC@
|
||||||
|
AR = @AR@
|
||||||
|
LIBNAME = @LIBNAME@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
CC_SHL = @CC_SHL@
|
||||||
|
SHLIBNAME = @SHLIBNAME@
|
||||||
|
|
||||||
|
INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I${srcdir}/../include -I../include -I../../include -I${srcdir}/../../../../include -I../../../../include @CPPFLAGS@
|
||||||
|
CFLAGS = @CFLAGS@ $(INCLUDE_DIR) -DBGL_OPTIM_STEP1_2=1 -DBGL_OPTIM_STEP1_1=1
|
||||||
|
|
||||||
|
C_COMPILE_SHL = $(CC_SHL) @CFLAGS@ $(INCLUDE_DIR)
|
||||||
|
|
||||||
|
@VPATH@
|
||||||
|
|
||||||
|
AD_BGL_OBJECTS = \
|
||||||
|
ad_bgl_open.o ad_bgl_close.o \
|
||||||
|
ad_bgl_fcntl.o \
|
||||||
|
ad_bgl_read.o ad_bgl_write.o ad_bgl_getsh.o ad_bgl_setsh.o \
|
||||||
|
ad_bgl.o ad_bgl_aggrs.o ad_bgl_pset.o ad_bgl_hints.o \
|
||||||
|
ad_bgl_rdcoll.o ad_bgl_wrcoll.o ad_bgl_tuning.o
|
||||||
|
|
||||||
|
default: $(LIBNAME)
|
||||||
|
@if [ "@ENABLE_SHLIB@" != "none" ] ; then \
|
||||||
|
$(MAKE) $(SHLIBNAME).la ;\
|
||||||
|
fi
|
||||||
|
|
||||||
|
.SUFFIXES: $(SUFFIXES) .p .lo
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
.c.lo:
|
||||||
|
$(C_COMPILE_SHL) -c $<
|
||||||
|
@mv -f $*.o $*.lo
|
||||||
|
|
||||||
|
$(LIBNAME): $(AD_BGL_OBJECTS)
|
||||||
|
$(AR) $(LIBNAME) $(AD_BGL_OBJECTS)
|
||||||
|
|
||||||
|
AD_BGL_LOOBJECTS=$(AD_BGL_OBJECTS:.o=.lo)
|
||||||
|
$(SHLIBNAME).la: $(AD_BGL_LOOBJECTS)
|
||||||
|
$(AR) $(SHLIBNAME).la $(AD_BGL_LOOBJECTS)
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
-@for file in ${AD_BGL_OBJECTS:.o=.c} ; do \
|
||||||
|
gcov -b -f $$file ; done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -f *.o *.lo
|
57
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl.c
Обычный файл
57
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl.c
Обычный файл
@ -0,0 +1,57 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
|
||||||
|
/* adioi.h has the ADIOI_Fns_struct define */
|
||||||
|
#include "adioi.h"
|
||||||
|
|
||||||
|
struct ADIOI_Fns_struct ADIO_BGL_operations = {
|
||||||
|
ADIOI_BGL_Open, /* Open */
|
||||||
|
ADIOI_BGL_ReadContig, /* ReadContig */
|
||||||
|
ADIOI_BGL_WriteContig, /* WriteContig */
|
||||||
|
#if BGL_OPTIM_STEP1_2
|
||||||
|
ADIOI_BGL_ReadStridedColl, /* ReadStridedColl */
|
||||||
|
ADIOI_BGL_WriteStridedColl, /* WriteStridedColl */
|
||||||
|
#else
|
||||||
|
ADIOI_GEN_ReadStridedColl, /* ReadStridedColl */
|
||||||
|
ADIOI_GEN_WriteStridedColl, /* WriteStridedColl */
|
||||||
|
#endif
|
||||||
|
ADIOI_GEN_SeekIndividual, /* SeekIndividual */
|
||||||
|
ADIOI_BGL_Fcntl, /* Fcntl */
|
||||||
|
#if BGL_OPTIM_STEP1_1
|
||||||
|
ADIOI_BGL_SetInfo, /* SetInfo */
|
||||||
|
#else
|
||||||
|
ADIOI_GEN_SetInfo, /* SetInfo */
|
||||||
|
#endif
|
||||||
|
ADIOI_BGL_ReadStrided, /* ReadStrided */
|
||||||
|
ADIOI_BGL_WriteStrided, /* WriteStrided */
|
||||||
|
ADIOI_BGL_Close, /* Close */
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
|
#warning Consider BG support for NFS before enabling this.
|
||||||
|
ADIOI_GEN_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
||||||
|
#else
|
||||||
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
|
#endif
|
||||||
|
ADIOI_GEN_IODone, /* ReadDone */
|
||||||
|
ADIOI_GEN_IODone, /* WriteDone */
|
||||||
|
ADIOI_GEN_IOComplete, /* ReadComplete */
|
||||||
|
ADIOI_GEN_IOComplete, /* WriteComplete */
|
||||||
|
ADIOI_GEN_IreadStrided, /* IreadStrided */
|
||||||
|
ADIOI_GEN_IwriteStrided, /* IwriteStrided */
|
||||||
|
ADIOI_GEN_Flush, /* Flush */
|
||||||
|
ADIOI_GEN_Resize, /* Resize */
|
||||||
|
ADIOI_GEN_Delete, /* Delete */
|
||||||
|
};
|
94
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl.h
Обычный файл
94
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl.h
Обычный файл
@ -0,0 +1,94 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl.h
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AD_BGL_INCLUDE
|
||||||
|
#define AD_BGL_INCLUDE
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include "adio.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_AIO_H
|
||||||
|
#include <aio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int ADIOI_BGL_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
||||||
|
int wr, void *handle);
|
||||||
|
|
||||||
|
void ADIOI_BGL_Open(ADIO_File fd, int *error_code);
|
||||||
|
|
||||||
|
void ADIOI_BGL_Close(ADIO_File fd, int *error_code);
|
||||||
|
|
||||||
|
void ADIOI_BGL_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_BGL_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
#if 0
|
||||||
|
void ADIOI_BGL_IwriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Request *request, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_BGL_IreadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Request *request, int
|
||||||
|
*error_code);
|
||||||
|
int ADIOI_BGL_ReadDone(ADIO_Request *request, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
int ADIOI_BGL_WriteDone(ADIO_Request *request, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_BGL_ReadComplete(ADIO_Request *request, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_BGL_WriteComplete(ADIO_Request *request, ADIO_Status *status,
|
||||||
|
int *error_code);
|
||||||
|
#endif
|
||||||
|
void ADIOI_BGL_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_BGL_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
|
||||||
|
|
||||||
|
void ADIOI_BGL_WriteStrided(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_BGL_ReadStrided(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
|
||||||
|
void ADIOI_BGL_ReadStridedColl(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
|
||||||
|
void ADIOI_BGL_WriteStridedColl(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
|
||||||
|
void ADIOI_BGL_Get_shared_fp(ADIO_File fd, int size, ADIO_Offset *shared_fp, int *error_code);
|
||||||
|
void ADIOI_BGL_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code);
|
||||||
|
|
||||||
|
|
||||||
|
#include "ad_bgl_tuning.h"
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
970
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c
Обычный файл
970
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.c
Обычный файл
@ -0,0 +1,970 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_aggrs.c
|
||||||
|
* \brief The externally used function from this file is is declared in ad_bgl_aggrs.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "adio.h"
|
||||||
|
#include "adio_cb_config_list.h"
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "ad_bgl_pset.h"
|
||||||
|
#include "ad_bgl_aggrs.h"
|
||||||
|
|
||||||
|
|
||||||
|
int aggrsInPsetSize=0;
|
||||||
|
int *aggrsInPset=NULL;
|
||||||
|
|
||||||
|
/* forward declaration */
|
||||||
|
static void
|
||||||
|
ADIOI_BGL_compute_agg_ranklist_serial ( ADIO_File fd,
|
||||||
|
const ADIOI_BGL_ConfInfo_t *confInfo,
|
||||||
|
ADIOI_BGL_ProcInfo_t *all_procInfo,
|
||||||
|
int *aggrsInPset );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO.
|
||||||
|
* The parameters are
|
||||||
|
* . the number of aggregators (proxies) : fd->hints->cb_nodes
|
||||||
|
* . the ranks of the aggregators : fd->hints->ranklist
|
||||||
|
* By compute these two parameters in a BGL-PSET-aware way, the default 2-phase collective IO of
|
||||||
|
* ADIO can work more efficiently.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
ADIOI_BGL_gen_agg_ranklist(ADIO_File fd, int n_aggrs_per_pset)
|
||||||
|
{
|
||||||
|
int r, s;
|
||||||
|
ADIOI_BGL_ProcInfo_t *procInfo, *all_procInfo;
|
||||||
|
ADIOI_BGL_ConfInfo_t *confInfo;
|
||||||
|
|
||||||
|
MPI_Comm_size( fd->comm, &s );
|
||||||
|
MPI_Comm_rank( fd->comm, &r );
|
||||||
|
|
||||||
|
/* Collect individual BGL personality information */
|
||||||
|
confInfo = ADIOI_BGL_ConfInfo_new ();
|
||||||
|
procInfo = ADIOI_BGL_ProcInfo_new ();
|
||||||
|
ADIOI_BGL_persInfo_init( confInfo, procInfo, s, r, n_aggrs_per_pset );
|
||||||
|
|
||||||
|
/* Gather BGL personality infomation onto process 0 */
|
||||||
|
// if (r == 0)
|
||||||
|
all_procInfo = ADIOI_BGL_ProcInfo_new_n (s);
|
||||||
|
if(s > aggrsInPsetSize)
|
||||||
|
{
|
||||||
|
if(aggrsInPset) ADIOI_Free(aggrsInPset);
|
||||||
|
aggrsInPset = (int *) ADIOI_Malloc (s *sizeof(int));
|
||||||
|
aggrsInPsetSize = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MPI_Gather( (void *)procInfo, sizeof(ADIOI_BGL_ProcInfo_t), MPI_BYTE,
|
||||||
|
(void *)all_procInfo, sizeof(ADIOI_BGL_ProcInfo_t), MPI_BYTE,
|
||||||
|
0,
|
||||||
|
fd->comm );
|
||||||
|
|
||||||
|
/* Compute a list of the ranks of chosen IO proxy CN on process 0 */
|
||||||
|
if (r == 0) {
|
||||||
|
ADIOI_BGL_compute_agg_ranklist_serial (fd, confInfo, all_procInfo, aggrsInPset);
|
||||||
|
// ADIOI_BGL_ProcInfo_free (all_procInfo);
|
||||||
|
}
|
||||||
|
ADIOI_BGL_ProcInfo_free (all_procInfo);
|
||||||
|
|
||||||
|
/* Send the info of IO proxy CN to all processes and keep the info in fd->hints struct.
|
||||||
|
Declared in adio_cb_config_list.h */
|
||||||
|
ADIOI_cb_bcast_rank_map(fd);
|
||||||
|
|
||||||
|
/* Broadcast the BGL-GPFS related file domain info */
|
||||||
|
MPI_Bcast( (void *)aggrsInPset,
|
||||||
|
fd->hints->cb_nodes * sizeof(int), MPI_BYTE,
|
||||||
|
0,
|
||||||
|
fd->comm );
|
||||||
|
|
||||||
|
ADIOI_BGL_persInfo_free( confInfo, procInfo );
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the purpose of abstracting out this routine is to make it easy for trying different proxy-selection criteria.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
ADIOI_BGL_select_agg_in_pset (const ADIOI_BGL_ConfInfo_t *confInfo,
|
||||||
|
ADIOI_BGL_ProcInfo_t *pset_procInfo,
|
||||||
|
int nCN_in_pset,
|
||||||
|
int *tmp_ranklist)
|
||||||
|
{
|
||||||
|
/* first implementation, based on their rank order. */
|
||||||
|
|
||||||
|
int i, j, k;
|
||||||
|
|
||||||
|
/* The number of aggregators in the PSET is proportional to the CNs in the PSET */
|
||||||
|
int nAggrs = nCN_in_pset * confInfo->aggRatio;
|
||||||
|
if (nAggrs < ADIOI_BGL_NAGG_PSET_MIN) nAggrs = ADIOI_BGL_NAGG_PSET_MIN;
|
||||||
|
|
||||||
|
/* for not virtual-node-mode, pick aggregators in this PSET based on the order of the global rank */
|
||||||
|
if (!confInfo->isVNM)
|
||||||
|
{
|
||||||
|
for (i=0; i<nAggrs; i++) tmp_ranklist[i] = pset_procInfo[i].rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for virtual-node-mode, first pick aggregators among CPU-0 */
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Try to pick from CPU-0 first, then CPU-1, then ... CPU-n */
|
||||||
|
j = 0;
|
||||||
|
for (k=0; k < confInfo->cpuidSize; k++){
|
||||||
|
for (i=0; i< nCN_in_pset ; i++) {
|
||||||
|
if (pset_procInfo[i].cpuid == k)
|
||||||
|
tmp_ranklist[j++] = pset_procInfo[i].rank;
|
||||||
|
if ( j >= nAggrs) break;
|
||||||
|
}
|
||||||
|
if ( j >= nAggrs) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nAggrs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pick IO aggregators based on the under PSET organization and stores the ranks of the proxy CNs in tmp_ranklist.
|
||||||
|
* The first order of tmp_ranklist is : PSET number
|
||||||
|
* The secondary order of the list is determined in ADIOI_BGL_select_agg_in_pset() and thus adjustable.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
ADIOI_BGL_compute_agg_ranklist_serial_do (const ADIOI_BGL_ConfInfo_t *confInfo,
|
||||||
|
ADIOI_BGL_ProcInfo_t *all_procInfo,
|
||||||
|
int *aggrsInPset,
|
||||||
|
int *tmp_ranklist)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
|
||||||
|
/* a list of the numbers of all the PSETS */
|
||||||
|
int *psetNumList = (int *) ADIOI_Malloc ( confInfo->nProcs * sizeof(int) );
|
||||||
|
|
||||||
|
/* sweep through all processes' records, collect the numbers of all the PSETS.
|
||||||
|
* The reason for not doing MIN, MAX is that the owned PSETs may not have contiguous numbers */
|
||||||
|
int n_psets=0;
|
||||||
|
for (i=0; i<confInfo->nProcs; i++) {
|
||||||
|
|
||||||
|
ADIOI_BGL_ProcInfo_t *info_p = all_procInfo+i;
|
||||||
|
|
||||||
|
int exist = 0;
|
||||||
|
for (j=n_psets-1; j>=0; j--)
|
||||||
|
if (info_p->psetNum == psetNumList[j]) { exist=1; break; }
|
||||||
|
|
||||||
|
if (!exist) {
|
||||||
|
psetNumList [n_psets] = info_p->psetNum;
|
||||||
|
n_psets ++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* bucket sort: put the CN nodes into ordered buckets, each of which represents a PSET */
|
||||||
|
|
||||||
|
/* bucket space for bucket sort */
|
||||||
|
ADIOI_BGL_ProcInfo_t *sorted_procInfo = ADIOI_BGL_ProcInfo_new_n ( n_psets * confInfo->virtualPsetSize );
|
||||||
|
int *PsetIdx = (int *) ADIOI_Malloc ( n_psets * sizeof(int) );
|
||||||
|
AD_BGL_assert ( (PsetIdx != NULL) );
|
||||||
|
|
||||||
|
/* initialize bucket pointer */
|
||||||
|
for (i=0; i<n_psets; i++) {
|
||||||
|
PsetIdx[i] = i*confInfo->virtualPsetSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sort */
|
||||||
|
for (i=0; i<confInfo->nProcs; i++) {
|
||||||
|
int pset_id = all_procInfo[i].psetNum;
|
||||||
|
|
||||||
|
for (j=n_psets-1; j>=0; j--) if (pset_id == psetNumList[j]) break;
|
||||||
|
AD_BGL_assert ( (j >= 0) ); /* got to find a PSET bucket */
|
||||||
|
|
||||||
|
sorted_procInfo[ PsetIdx[j] ++ ] = all_procInfo[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
ADIOI_Free(psetNumList);
|
||||||
|
|
||||||
|
/* select a number of CN aggregators from each Pset */
|
||||||
|
int naggs = 0;
|
||||||
|
for (i=0; i<n_psets; i++) {
|
||||||
|
|
||||||
|
/* the number of CN in this PSET -- may not be a full PSET */
|
||||||
|
int nCN_in_pset = PsetIdx[i] - i*confInfo->virtualPsetSize;
|
||||||
|
|
||||||
|
/* select aggregators and put them into tmp_ranklist contiguously. */
|
||||||
|
int local_naggs = ADIOI_BGL_select_agg_in_pset( confInfo,
|
||||||
|
sorted_procInfo + i*confInfo->virtualPsetSize,
|
||||||
|
nCN_in_pset,
|
||||||
|
tmp_ranklist + naggs);
|
||||||
|
aggrsInPset[i+1] = local_naggs;
|
||||||
|
|
||||||
|
naggs += local_naggs;
|
||||||
|
}
|
||||||
|
aggrsInPset[0] = n_psets;
|
||||||
|
|
||||||
|
/* leave */
|
||||||
|
ADIOI_Free ( PsetIdx );
|
||||||
|
ADIOI_BGL_ProcInfo_free ( sorted_procInfo );
|
||||||
|
return naggs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* compute aggregators ranklist and put it into fd->hints struct
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ADIOI_BGL_compute_agg_ranklist_serial ( ADIO_File fd,
|
||||||
|
const ADIOI_BGL_ConfInfo_t *confInfo,
|
||||||
|
ADIOI_BGL_ProcInfo_t *all_procInfo,
|
||||||
|
int *aggrsInPset )
|
||||||
|
{
|
||||||
|
# define DEBUG 0
|
||||||
|
# if DEBUG
|
||||||
|
int i;
|
||||||
|
# endif
|
||||||
|
int naggs;
|
||||||
|
int *tmp_ranklist;
|
||||||
|
|
||||||
|
/* compute the ranklist of IO aggregators and put into tmp_ranklist */
|
||||||
|
tmp_ranklist = (int *) ADIOI_Malloc (confInfo->nProcs * sizeof(int));
|
||||||
|
|
||||||
|
# if DEBUG
|
||||||
|
for (i=0; i<confInfo->nProcs; i++)
|
||||||
|
printf( "\tcpuid %1d, rank = %6d\n", all_procInfo[i].cpuid, all_procInfo[i].rank );
|
||||||
|
# endif
|
||||||
|
|
||||||
|
naggs =
|
||||||
|
ADIOI_BGL_compute_agg_ranklist_serial_do (confInfo, all_procInfo, aggrsInPset, tmp_ranklist);
|
||||||
|
|
||||||
|
# define VERIFY 0
|
||||||
|
# if VERIFY
|
||||||
|
printf( "\tconfInfo = %3d,%3d,%3d,%3d,%3d,%3d,%.4f; naggs = %d\n",
|
||||||
|
confInfo->PsetSize ,
|
||||||
|
confInfo->numPsets ,
|
||||||
|
confInfo->isVNM ,
|
||||||
|
confInfo->virtualPsetSize ,
|
||||||
|
confInfo->nProcs ,
|
||||||
|
confInfo->nAggrs ,
|
||||||
|
confInfo->aggRatio ,
|
||||||
|
naggs );
|
||||||
|
# endif
|
||||||
|
|
||||||
|
# if DEBUG
|
||||||
|
for (i=0; i<naggs; i++)
|
||||||
|
printf( "\taggr %-4d = %6d\n", i, tmp_ranklist[i] );
|
||||||
|
# endif
|
||||||
|
|
||||||
|
/* copy the ranklist of IO aggregators to fd->hints */
|
||||||
|
if(fd->hints->ranklist != NULL) ADIOI_Free (fd->hints->ranklist);
|
||||||
|
|
||||||
|
fd->hints->cb_nodes = naggs;
|
||||||
|
fd->hints->ranklist = (int *) ADIOI_Malloc (naggs * sizeof(int));
|
||||||
|
memcpy( fd->hints->ranklist, tmp_ranklist, naggs*sizeof(int) );
|
||||||
|
|
||||||
|
/* */
|
||||||
|
ADIOI_Free( tmp_ranklist );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Compute a dynamic access range based file domain partition among I/O aggregators,
|
||||||
|
* which align to the GPFS block size
|
||||||
|
* Divide the I/O workload among "nprocs_for_coll" processes. This is
|
||||||
|
* done by (logically) dividing the file into file domains (FDs); each
|
||||||
|
* process may directly access only its own file domain.
|
||||||
|
* Additional effort is to make sure that each I/O aggregator get
|
||||||
|
* a file domain that aligns to the GPFS block size. So, there will
|
||||||
|
* not be any false sharing of GPFS file blocks among multiple I/O nodes.
|
||||||
|
*/
|
||||||
|
void ADIOI_BGL_GPFS_Calc_file_domains(ADIO_Offset *st_offsets,
|
||||||
|
ADIO_Offset *end_offsets,
|
||||||
|
int nprocs,
|
||||||
|
int nprocs_for_coll,
|
||||||
|
ADIO_Offset *min_st_offset_ptr,
|
||||||
|
ADIO_Offset **fd_start_ptr,
|
||||||
|
ADIO_Offset **fd_end_ptr,
|
||||||
|
ADIO_Offset *fd_size_ptr,
|
||||||
|
void *fs_ptr)
|
||||||
|
{
|
||||||
|
ADIO_Offset min_st_offset, max_end_offset, *fd_start, *fd_end, *fd_size;
|
||||||
|
int i, aggr;
|
||||||
|
static char myname[] = "ADIOI_BGL_GPFS_Calc_file_domains";
|
||||||
|
__blksize_t blksize = 1048576; /* default to 1M */
|
||||||
|
if(fs_ptr && ((ADIOI_BGL_fs*)fs_ptr)->blksize) /* ignore null ptr or 0 blksize */
|
||||||
|
blksize = ((ADIOI_BGL_fs*)fs_ptr)->blksize;
|
||||||
|
/* FPRINTF(stderr,"%s(%d): Blocksize=%ld\n",myname,__LINE__,blksize);*/
|
||||||
|
|
||||||
|
/* find the range of all the requests */
|
||||||
|
min_st_offset = st_offsets [0];
|
||||||
|
max_end_offset = end_offsets[0];
|
||||||
|
for (i=1; i<nprocs; i++) {
|
||||||
|
min_st_offset = ADIOI_MIN(min_st_offset, st_offsets[i]);
|
||||||
|
max_end_offset = ADIOI_MAX(max_end_offset, end_offsets[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// printf( "_calc_file_domains, min_st_offset, max_ = %qd, %qd\n", min_st_offset, max_end_offset );
|
||||||
|
|
||||||
|
/* determine the "file domain (FD)" of each process, i.e., the portion of
|
||||||
|
the file that will be "owned" by each process */
|
||||||
|
|
||||||
|
ADIO_Offset gpfs_ub = (max_end_offset +blksize-1) / blksize * blksize - 1;
|
||||||
|
ADIO_Offset gpfs_lb = min_st_offset / blksize * blksize;
|
||||||
|
ADIO_Offset gpfs_ub_rdoff = (max_end_offset +blksize-1) / blksize * blksize - 1 - max_end_offset;
|
||||||
|
ADIO_Offset gpfs_lb_rdoff = min_st_offset - min_st_offset / blksize * blksize;
|
||||||
|
ADIO_Offset fd_gpfs_range = gpfs_ub - gpfs_lb + 1;
|
||||||
|
|
||||||
|
int naggs = nprocs_for_coll;
|
||||||
|
fd_size = (ADIO_Offset *) ADIOI_Malloc(nprocs_for_coll * sizeof(ADIO_Offset));
|
||||||
|
*fd_start_ptr = (ADIO_Offset *) ADIOI_Malloc(nprocs_for_coll * sizeof(ADIO_Offset));
|
||||||
|
*fd_end_ptr = (ADIO_Offset *) ADIOI_Malloc(nprocs_for_coll * sizeof(ADIO_Offset));
|
||||||
|
fd_start = *fd_start_ptr;
|
||||||
|
fd_end = *fd_end_ptr;
|
||||||
|
|
||||||
|
ADIO_Offset n_gpfs_blk = fd_gpfs_range / blksize;
|
||||||
|
ADIO_Offset nb_cn_small = n_gpfs_blk/naggs;
|
||||||
|
ADIO_Offset naggs_large = n_gpfs_blk - naggs * (n_gpfs_blk/naggs);
|
||||||
|
ADIO_Offset naggs_small = naggs - naggs_large;
|
||||||
|
|
||||||
|
for (i=0; i<naggs; i++)
|
||||||
|
if (i < naggs_small) fd_size[i] = nb_cn_small * blksize;
|
||||||
|
else fd_size[i] = (nb_cn_small+1) * blksize;
|
||||||
|
|
||||||
|
/* FPRINTF(stderr,"%s(%d): "
|
||||||
|
"gpfs_ub %llu, "
|
||||||
|
"gpfs_lb %llu, "
|
||||||
|
"gpfs_ub_rdoff %llu, "
|
||||||
|
"gpfs_lb_rdoff %llu, "
|
||||||
|
"fd_gpfs_range %llu, "
|
||||||
|
"n_gpfs_blk %llu, "
|
||||||
|
"nb_cn_small %llu, "
|
||||||
|
"naggs_large %llu, "
|
||||||
|
"naggs_small %llu, "
|
||||||
|
"\n",
|
||||||
|
myname,__LINE__,
|
||||||
|
gpfs_ub ,
|
||||||
|
gpfs_lb ,
|
||||||
|
gpfs_ub_rdoff,
|
||||||
|
gpfs_lb_rdoff,
|
||||||
|
fd_gpfs_range,
|
||||||
|
n_gpfs_blk ,
|
||||||
|
nb_cn_small ,
|
||||||
|
naggs_large ,
|
||||||
|
naggs_small
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
fd_size[0] -= gpfs_lb_rdoff;
|
||||||
|
fd_size[naggs-1] -= gpfs_ub_rdoff;
|
||||||
|
|
||||||
|
/* compute the file domain for each aggr */
|
||||||
|
ADIO_Offset offset = min_st_offset;
|
||||||
|
for (aggr=0; aggr<naggs; aggr++) {
|
||||||
|
fd_start[aggr] = offset;
|
||||||
|
fd_end [aggr] = offset + fd_size[aggr] - 1;
|
||||||
|
offset += fd_size[aggr];
|
||||||
|
}
|
||||||
|
|
||||||
|
*fd_size_ptr = fd_size[0];
|
||||||
|
*min_st_offset_ptr = min_st_offset;
|
||||||
|
|
||||||
|
ADIOI_Free (fd_size);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* deprecated
|
||||||
|
*
|
||||||
|
void ADIOI_BGL_GPFS_Calc_file_domain0(ADIO_Offset *st_offsets,
|
||||||
|
ADIO_Offset *end_offsets,
|
||||||
|
int nprocs,
|
||||||
|
int nprocs_for_coll,
|
||||||
|
ADIO_Offset *min_st_offset_ptr,
|
||||||
|
ADIO_Offset **fd_start_ptr,
|
||||||
|
ADIO_Offset **fd_end_ptr,
|
||||||
|
ADIO_Offset *fd_size_ptr)
|
||||||
|
{
|
||||||
|
ADIO_Offset min_st_offset, max_end_offset, *fd_start, *fd_end, *fd_size;
|
||||||
|
int i;
|
||||||
|
static int GPFS_BSIZE=1048576;
|
||||||
|
* find the range of all the requests *
|
||||||
|
min_st_offset = st_offsets [0];
|
||||||
|
max_end_offset = end_offsets[0];
|
||||||
|
for (i=1; i<nprocs; i++) {
|
||||||
|
min_st_offset = ADIOI_MIN(min_st_offset, st_offsets[i]);
|
||||||
|
max_end_offset = ADIOI_MAX(max_end_offset, end_offsets[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
* determine the "file domain (FD)" of each process, i.e., the portion of
|
||||||
|
the file that will be "owned" by each process *
|
||||||
|
|
||||||
|
* GPFS specific, pseudo starting/end point has to round to GPFS_BSIZE *
|
||||||
|
ADIO_Offset gpfs_ub = (max_end_offset +GPFS_BSIZE-1) / GPFS_BSIZE * GPFS_BSIZE - 1;
|
||||||
|
ADIO_Offset gpfs_lb = min_st_offset / GPFS_BSIZE * GPFS_BSIZE;
|
||||||
|
ADIO_Offset gpfs_ub_rdoff = (max_end_offset +GPFS_BSIZE-1) / GPFS_BSIZE * GPFS_BSIZE - 1 - max_end_offset;
|
||||||
|
ADIO_Offset gpfs_lb_rdoff = min_st_offset - min_st_offset / GPFS_BSIZE * GPFS_BSIZE;
|
||||||
|
ADIO_Offset fd_gpfs_range = gpfs_ub - gpfs_lb + 1;
|
||||||
|
|
||||||
|
* all computation of partition is based on the rounded pseudo-range *
|
||||||
|
ADIO_Offset fds_ub = (fd_gpfs_range +nprocs_for_coll-1) / nprocs_for_coll;
|
||||||
|
ADIO_Offset fds_lb = fd_gpfs_range / nprocs_for_coll;
|
||||||
|
int naggs = nprocs_for_coll;
|
||||||
|
int npsets = aggrsInPset[0]; * special meaning for element 0 *
|
||||||
|
fd_size = (ADIO_Offset *) ADIOI_Malloc(naggs * sizeof(ADIO_Offset));
|
||||||
|
*fd_start_ptr = (ADIO_Offset *) ADIOI_Malloc(naggs * sizeof(ADIO_Offset));
|
||||||
|
*fd_end_ptr = (ADIO_Offset *) ADIOI_Malloc(naggs * sizeof(ADIO_Offset));
|
||||||
|
fd_start = *fd_start_ptr;
|
||||||
|
fd_end = *fd_end_ptr;
|
||||||
|
|
||||||
|
* some pre-computation to determine rough ratio of when to up-fit, when to low-fit *
|
||||||
|
* 1. get the estimated data per pset *
|
||||||
|
* 2. determine a factor between up and down *
|
||||||
|
int avg_aggrsInPset = (naggs +npsets-1)/npsets;
|
||||||
|
ADIO_Offset avg_bytes_perPset = fd_gpfs_range / npsets;
|
||||||
|
ADIO_Offset resid = avg_bytes_perPset % GPFS_BSIZE;
|
||||||
|
ADIO_Offset downr = GPFS_BSIZE - resid;
|
||||||
|
int small = (resid < downr);
|
||||||
|
int ratio = downr == 0 ? npsets + 2 : (resid +downr-1)/downr;
|
||||||
|
if (small) ratio = resid == 0 ? npsets + 2 : (downr +resid-1)/resid;
|
||||||
|
|
||||||
|
|
||||||
|
* go through aggrsInfo of all PSETs *
|
||||||
|
ADIO_Offset fd_range = fd_gpfs_range;
|
||||||
|
int aggr = 0, pset;
|
||||||
|
for (pset=0; pset<npsets; pset++) {
|
||||||
|
|
||||||
|
ADIO_Offset fds_try = fds_lb;
|
||||||
|
int my_naggs = aggrsInPset[pset+1];
|
||||||
|
ADIO_Offset fds_pset;
|
||||||
|
|
||||||
|
* Last pset will deal with the residuals *
|
||||||
|
if (pset == npsets-1)
|
||||||
|
fds_pset = fd_range;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int cond1 = ((pset+1) % ratio == 0);
|
||||||
|
int cond2 = ((pset+1) % ratio != 0);
|
||||||
|
|
||||||
|
if (small) {
|
||||||
|
int temp = cond1; cond1 = cond2; cond2 = temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cond1) {
|
||||||
|
fds_pset = fds_try * my_naggs;
|
||||||
|
if (fds_pset % GPFS_BSIZE) // align to GPFS_BSIZE
|
||||||
|
fds_pset = ((fds_pset +GPFS_BSIZE-1)/GPFS_BSIZE) * GPFS_BSIZE;
|
||||||
|
}
|
||||||
|
if (cond2)
|
||||||
|
{
|
||||||
|
fds_try = fds_ub;
|
||||||
|
fds_pset = fds_try * my_naggs;
|
||||||
|
if (fds_pset % GPFS_BSIZE) // align to GPFS_BSIZE
|
||||||
|
fds_pset = (fds_pset / GPFS_BSIZE) * GPFS_BSIZE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
* for aggrs in each PSET, divide evenly the data range *
|
||||||
|
#define CN_ALIGN 1
|
||||||
|
#if !CN_ALIGN
|
||||||
|
fd_range -= fds_pset;
|
||||||
|
if ( pset == 0 ) fds_pset -= gpfs_lb_rdoff;
|
||||||
|
if ( pset == npsets-1 ) fds_pset -= gpfs_ub_rdoff;
|
||||||
|
int p;
|
||||||
|
for (p=0; p<my_naggs; p++) {
|
||||||
|
fd_size[aggr] = (fds_pset +my_naggs-1) / my_naggs;
|
||||||
|
if (p== my_naggs-1)
|
||||||
|
fd_size[aggr] -= (fd_size[aggr]*my_naggs - fds_pset);
|
||||||
|
|
||||||
|
aggr++;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
ADIO_Offset avg_bytes_perP = fds_pset / my_naggs;
|
||||||
|
ADIO_Offset resid2 = avg_bytes_perP % GPFS_BSIZE;
|
||||||
|
ADIO_Offset downr2 = GPFS_BSIZE - resid2;
|
||||||
|
int small2 = (resid2 < downr2);
|
||||||
|
int ratio2 = downr2 == 0 ? my_naggs + 2 : (resid2 +downr2-1)/downr2;
|
||||||
|
if (small2) ratio2 = resid2 == 0 ? my_naggs + 2 : (downr2 +resid2-1)/resid2;
|
||||||
|
ADIO_Offset accu = 0;
|
||||||
|
int p;
|
||||||
|
for (p=0; p<my_naggs; p++) {
|
||||||
|
int cond1 = ((p+1) % ratio2 == 0);
|
||||||
|
int cond2 = ((p+1) % ratio2 != 0);
|
||||||
|
if (small2) {
|
||||||
|
int temp = cond1; cond1 = cond2; cond2 = temp;
|
||||||
|
}
|
||||||
|
fd_size[aggr] = avg_bytes_perP;
|
||||||
|
if (cond2) fd_size[aggr] = ((fd_size[aggr] +GPFS_BSIZE-1)/GPFS_BSIZE) * GPFS_BSIZE;
|
||||||
|
if (cond1) fd_size[aggr] = ((fd_size[aggr] )/GPFS_BSIZE) * GPFS_BSIZE;
|
||||||
|
if (p== my_naggs-1)
|
||||||
|
fd_size[aggr] = (fds_pset - accu);
|
||||||
|
|
||||||
|
accu += fd_size[aggr];
|
||||||
|
fd_range -= fd_size[aggr];
|
||||||
|
aggr++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
* after scheduling, the first and the last region has to remove the round-off effect *
|
||||||
|
|
||||||
|
#if CN_ALIGN
|
||||||
|
fd_size[0] -= gpfs_lb_rdoff;
|
||||||
|
fd_size[naggs-1] -= gpfs_ub_rdoff;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
* compute the file domain for each aggr *
|
||||||
|
ADIO_Offset offset = min_st_offset;
|
||||||
|
for (aggr=0; aggr<naggs; aggr++) {
|
||||||
|
fd_start[aggr] = offset;
|
||||||
|
fd_end [aggr] = offset + fd_size[aggr] - 1;
|
||||||
|
offset += fd_size[aggr];
|
||||||
|
}
|
||||||
|
|
||||||
|
*
|
||||||
|
printf( "\t%6d : %12qd:%12qd, %12qd:%12qd:%12qd, %12qd:%12qd:%12qd\n",
|
||||||
|
naggs,
|
||||||
|
min_st_offset,
|
||||||
|
max_end_offset,
|
||||||
|
fd_start[0],
|
||||||
|
fd_end [0],
|
||||||
|
fd_size [0],
|
||||||
|
fd_start[naggs-1],
|
||||||
|
fd_end [naggs-1],
|
||||||
|
fd_size [naggs-1] );
|
||||||
|
*
|
||||||
|
|
||||||
|
|
||||||
|
*fd_size_ptr = fd_size[0];
|
||||||
|
*min_st_offset_ptr = min_st_offset;
|
||||||
|
|
||||||
|
ADIOI_Free (fd_size);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When a process is an IO aggregator, this will return its index in the aggrs list.
|
||||||
|
* Otherwise, this will return -1
|
||||||
|
*/
|
||||||
|
int ADIOI_BGL_Aggrs_index( ADIO_File fd, int myrank )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
for (i=0; i<fd->hints->cb_nodes; i++)
|
||||||
|
if (fd->hints->ranklist[i] == myrank) return i;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is more general aggregator search function which does not base on the assumption
|
||||||
|
* that each aggregator hosts the file domain with the same size
|
||||||
|
*/
|
||||||
|
int ADIOI_BGL_Calc_aggregator(ADIO_File fd,
|
||||||
|
ADIO_Offset off,
|
||||||
|
ADIO_Offset min_off,
|
||||||
|
ADIO_Offset *len,
|
||||||
|
ADIO_Offset fd_size,
|
||||||
|
ADIO_Offset *fd_start,
|
||||||
|
ADIO_Offset *fd_end)
|
||||||
|
{
|
||||||
|
int rank_index, rank;
|
||||||
|
ADIO_Offset avail_bytes;
|
||||||
|
|
||||||
|
AD_BGL_assert ( (off <= fd_end[fd->hints->cb_nodes-1] && off >= min_off && fd_start[0] >= min_off ) );
|
||||||
|
|
||||||
|
/* binary search --> rank_index is returned */
|
||||||
|
int ub = fd->hints->cb_nodes;
|
||||||
|
int lb = 0;
|
||||||
|
rank_index = fd->hints->cb_nodes / 2;
|
||||||
|
while ( off < fd_start[rank_index] || off > fd_end[rank_index] ) {
|
||||||
|
if ( off > fd_end [rank_index] ) {
|
||||||
|
lb = rank_index;
|
||||||
|
rank_index = (rank_index + ub) / 2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if ( off < fd_start[rank_index] ) {
|
||||||
|
ub = rank_index;
|
||||||
|
rank_index = (rank_index + lb) / 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// printf ("ADIOI_BGL_Calc_aggregator: rank_index = %d\n", rank_index );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* remember here that even in Rajeev's original code it was the case that
|
||||||
|
* different aggregators could end up with different amounts of data to
|
||||||
|
* aggregate. here we use fd_end[] to make sure that we know how much
|
||||||
|
* data this aggregator is working with.
|
||||||
|
*
|
||||||
|
* the +1 is to take into account the end vs. length issue.
|
||||||
|
*/
|
||||||
|
avail_bytes = fd_end[rank_index] + 1 - off;
|
||||||
|
if (avail_bytes < *len && avail_bytes > 0) {
|
||||||
|
/* this file domain only has part of the requested contig. region */
|
||||||
|
|
||||||
|
*len = avail_bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* map our index to a rank */
|
||||||
|
/* NOTE: FOR NOW WE DON'T HAVE A MAPPING...JUST DO 0..NPROCS_FOR_COLL */
|
||||||
|
rank = fd->hints->ranklist[rank_index];
|
||||||
|
|
||||||
|
return rank;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ADIOI_BGL_Calc_my_req() overrides ADIOI_Calc_my_req for the default implementation
|
||||||
|
* is specific for static file domain partitioning.
|
||||||
|
*
|
||||||
|
* ADIOI_Calc_my_req() calculate what portions of the access requests
|
||||||
|
* of this process are located in the file domains of various processes
|
||||||
|
* (including this one)
|
||||||
|
*/
|
||||||
|
void ADIOI_BGL_Calc_my_req(ADIO_File fd, ADIO_Offset *offset_list, int *len_list,
|
||||||
|
int contig_access_count, ADIO_Offset
|
||||||
|
min_st_offset, ADIO_Offset *fd_start,
|
||||||
|
ADIO_Offset *fd_end, ADIO_Offset fd_size,
|
||||||
|
int nprocs,
|
||||||
|
int *count_my_req_procs_ptr,
|
||||||
|
int **count_my_req_per_proc_ptr,
|
||||||
|
ADIOI_Access **my_req_ptr,
|
||||||
|
int **buf_idx_ptr)
|
||||||
|
{
|
||||||
|
int *count_my_req_per_proc, count_my_req_procs, *buf_idx;
|
||||||
|
int i, l, proc;
|
||||||
|
ADIO_Offset fd_len, rem_len, curr_idx, off;
|
||||||
|
ADIOI_Access *my_req;
|
||||||
|
|
||||||
|
|
||||||
|
*count_my_req_per_proc_ptr = (int *) ADIOI_Calloc(nprocs,sizeof(int));
|
||||||
|
count_my_req_per_proc = *count_my_req_per_proc_ptr;
|
||||||
|
/* count_my_req_per_proc[i] gives the no. of contig. requests of this
|
||||||
|
process in process i's file domain. calloc initializes to zero.
|
||||||
|
I'm allocating memory of size nprocs, so that I can do an
|
||||||
|
MPI_Alltoall later on.*/
|
||||||
|
|
||||||
|
buf_idx = (int *) ADIOI_Malloc(nprocs*sizeof(int));
|
||||||
|
/* buf_idx is relevant only if buftype_is_contig.
|
||||||
|
buf_idx[i] gives the index into user_buf where data received
|
||||||
|
from proc. i should be placed. This allows receives to be done
|
||||||
|
without extra buffer. This can't be done if buftype is not contig. */
|
||||||
|
|
||||||
|
/* initialize buf_idx to -1 */
|
||||||
|
for (i=0; i < nprocs; i++) buf_idx[i] = -1;
|
||||||
|
|
||||||
|
/* one pass just to calculate how much space to allocate for my_req;
|
||||||
|
* contig_access_count was calculated way back in ADIOI_Calc_my_off_len()
|
||||||
|
*/
|
||||||
|
for (i=0; i < contig_access_count; i++) {
|
||||||
|
|
||||||
|
/* When there is no data being processed, bypass this loop */
|
||||||
|
if (len_list[i] == 0) continue;
|
||||||
|
|
||||||
|
off = offset_list[i];
|
||||||
|
fd_len = len_list[i];
|
||||||
|
/* note: we set fd_len to be the total size of the access. then
|
||||||
|
* ADIOI_Calc_aggregator() will modify the value to return the
|
||||||
|
* amount that was available from the file domain that holds the
|
||||||
|
* first part of the access.
|
||||||
|
*/
|
||||||
|
proc = ADIOI_BGL_Calc_aggregator(fd, off, min_st_offset, &fd_len, fd_size,
|
||||||
|
fd_start, fd_end);
|
||||||
|
count_my_req_per_proc[proc]++;
|
||||||
|
|
||||||
|
/* figure out how much data is remaining in the access (i.e. wasn't
|
||||||
|
* part of the file domain that had the starting byte); we'll take
|
||||||
|
* care of this data (if there is any) in the while loop below.
|
||||||
|
*/
|
||||||
|
rem_len = len_list[i] - fd_len;
|
||||||
|
|
||||||
|
while (rem_len > 0) {
|
||||||
|
off += fd_len; /* point to first remaining byte */
|
||||||
|
fd_len = rem_len; /* save remaining size, pass to calc */
|
||||||
|
proc = ADIOI_BGL_Calc_aggregator(fd, off, min_st_offset, &fd_len,
|
||||||
|
fd_size, fd_start, fd_end);
|
||||||
|
|
||||||
|
count_my_req_per_proc[proc]++;
|
||||||
|
rem_len -= fd_len; /* reduce remaining length by amount from fd */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now allocate space for my_req, offset, and len */
|
||||||
|
|
||||||
|
*my_req_ptr = (ADIOI_Access *)
|
||||||
|
ADIOI_Malloc(nprocs*sizeof(ADIOI_Access));
|
||||||
|
my_req = *my_req_ptr;
|
||||||
|
|
||||||
|
count_my_req_procs = 0;
|
||||||
|
for (i=0; i < nprocs; i++) {
|
||||||
|
if (count_my_req_per_proc[i]) {
|
||||||
|
my_req[i].offsets = (ADIO_Offset *)
|
||||||
|
ADIOI_Malloc(count_my_req_per_proc[i] * sizeof(ADIO_Offset));
|
||||||
|
my_req[i].lens = (int *)
|
||||||
|
ADIOI_Malloc(count_my_req_per_proc[i] * sizeof(int));
|
||||||
|
count_my_req_procs++;
|
||||||
|
}
|
||||||
|
my_req[i].count = 0; /* will be incremented where needed
|
||||||
|
later */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now fill in my_req */
|
||||||
|
curr_idx = 0;
|
||||||
|
for (i=0; i<contig_access_count; i++) {
|
||||||
|
|
||||||
|
/* When there is no data being processed, bypass this loop */
|
||||||
|
if (len_list[i] == 0) continue;
|
||||||
|
|
||||||
|
off = offset_list[i];
|
||||||
|
fd_len = len_list[i];
|
||||||
|
proc = ADIOI_BGL_Calc_aggregator(fd, off, min_st_offset, &fd_len, fd_size,
|
||||||
|
fd_start, fd_end);
|
||||||
|
|
||||||
|
/* for each separate contiguous access from this process */
|
||||||
|
if (buf_idx[proc] == -1) buf_idx[proc] = (int) curr_idx;
|
||||||
|
|
||||||
|
l = my_req[proc].count;
|
||||||
|
curr_idx += (int) fd_len; /* NOTE: Why is curr_idx an int? Fix? */
|
||||||
|
|
||||||
|
rem_len = len_list[i] - fd_len;
|
||||||
|
|
||||||
|
/* store the proc, offset, and len information in an array
|
||||||
|
* of structures, my_req. Each structure contains the
|
||||||
|
* offsets and lengths located in that process's FD,
|
||||||
|
* and the associated count.
|
||||||
|
*/
|
||||||
|
my_req[proc].offsets[l] = off;
|
||||||
|
my_req[proc].lens[l] = (int) fd_len;
|
||||||
|
my_req[proc].count++;
|
||||||
|
|
||||||
|
while (rem_len > 0) {
|
||||||
|
off += fd_len;
|
||||||
|
fd_len = rem_len;
|
||||||
|
proc = ADIOI_BGL_Calc_aggregator(fd, off, min_st_offset, &fd_len,
|
||||||
|
fd_size, fd_start, fd_end);
|
||||||
|
|
||||||
|
if (buf_idx[proc] == -1) buf_idx[proc] = (int) curr_idx;
|
||||||
|
|
||||||
|
l = my_req[proc].count;
|
||||||
|
curr_idx += fd_len;
|
||||||
|
rem_len -= fd_len;
|
||||||
|
|
||||||
|
my_req[proc].offsets[l] = off;
|
||||||
|
my_req[proc].lens[l] = (int) fd_len;
|
||||||
|
my_req[proc].count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef AGG_DEBUG
|
||||||
|
for (i=0; i<nprocs; i++) {
|
||||||
|
if (count_my_req_per_proc[i] > 0) {
|
||||||
|
FPRINTF(stdout, "data needed from %d (count = %d):\n", i,
|
||||||
|
my_req[i].count);
|
||||||
|
for (l=0; l < my_req[i].count; l++) {
|
||||||
|
FPRINTF(stdout, " off[%d] = %Ld, len[%d] = %d\n", l,
|
||||||
|
my_req[i].offsets[l], l, my_req[i].lens[l]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#if 0
|
||||||
|
for (i=0; i<nprocs; i++) {
|
||||||
|
FPRINTF(stdout, "buf_idx[%d] = 0x%x\n", i, buf_idx[i]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*count_my_req_procs_ptr = count_my_req_procs;
|
||||||
|
*buf_idx_ptr = buf_idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ADIOI_Calc_others_req
|
||||||
|
*
|
||||||
|
* param[in] count_my_req_procs Number of processes whose file domain my
|
||||||
|
* request touches.
|
||||||
|
* param[in] count_my_req_per_proc count_my_req_per_proc[i] gives the no. of
|
||||||
|
* contig. requests of this process in
|
||||||
|
* process i's file domain.
|
||||||
|
* param[in] my_req A structure defining my request
|
||||||
|
* param[in] nprocs Number of nodes in the block
|
||||||
|
* param[in] myrank Rank of this node
|
||||||
|
* param[out] count_others_req_proc_ptr Number of processes whose requests lie in
|
||||||
|
* my process's file domain (including my
|
||||||
|
* process itself)
|
||||||
|
* param[out] others_req_ptr Array of other process' requests that lie
|
||||||
|
* in my process's file domain
|
||||||
|
*/
|
||||||
|
void ADIOI_BGL_Calc_others_req(ADIO_File fd, int count_my_req_procs,
|
||||||
|
int *count_my_req_per_proc,
|
||||||
|
ADIOI_Access *my_req,
|
||||||
|
int nprocs, int myrank,
|
||||||
|
int *count_others_req_procs_ptr,
|
||||||
|
ADIOI_Access **others_req_ptr)
|
||||||
|
{
|
||||||
|
/* determine what requests of other processes lie in this process's
|
||||||
|
file domain */
|
||||||
|
|
||||||
|
/* count_others_req_procs = number of processes whose requests lie in
|
||||||
|
this process's file domain (including this process itself)
|
||||||
|
count_others_req_per_proc[i] indicates how many separate contiguous
|
||||||
|
requests of proc. i lie in this process's file domain. */
|
||||||
|
|
||||||
|
int *count_others_req_per_proc, count_others_req_procs;
|
||||||
|
int i;
|
||||||
|
ADIOI_Access *others_req;
|
||||||
|
|
||||||
|
/* Parameters for MPI_Alltoallv */
|
||||||
|
int *scounts, *sdispls, *rcounts, *rdispls;
|
||||||
|
|
||||||
|
/* Parameters for MPI_Alltoallv. These are the buffers, which
|
||||||
|
* are later computed to be the lowest address of all buffers
|
||||||
|
* to be sent/received for offsets and lengths. Initialize to
|
||||||
|
* the highest possible address which is the current minimum.
|
||||||
|
*/
|
||||||
|
void *sendBufForOffsets=(void*)0xFFFFFFFF,
|
||||||
|
*sendBufForLens =(void*)0xFFFFFFFF,
|
||||||
|
*recvBufForOffsets=(void*)0xFFFFFFFF,
|
||||||
|
*recvBufForLens =(void*)0xFFFFFFFF;
|
||||||
|
|
||||||
|
/* first find out how much to send/recv and from/to whom */
|
||||||
|
|
||||||
|
/* Send 1 int to each process. count_my_req_per_proc[i] is the number of
|
||||||
|
* requests that my process will do to the file domain owned by process[i].
|
||||||
|
* Receive 1 int from each process. count_others_req_per_proc[i] is the number of
|
||||||
|
* requests that process[i] will do to the file domain owned by my process.
|
||||||
|
*/
|
||||||
|
count_others_req_per_proc = (int *) ADIOI_Malloc(nprocs*sizeof(int));
|
||||||
|
/* cora2a1=timebase(); */
|
||||||
|
MPI_Alltoall(count_my_req_per_proc, 1, MPI_INT,
|
||||||
|
count_others_req_per_proc, 1, MPI_INT, fd->comm);
|
||||||
|
/* total_cora2a+=timebase()-cora2a1; */
|
||||||
|
|
||||||
|
/* Allocate storage for an array of other nodes' accesses of our
|
||||||
|
* node's file domain. Also allocate storage for the alltoallv
|
||||||
|
* parameters.
|
||||||
|
*/
|
||||||
|
*others_req_ptr = (ADIOI_Access *)
|
||||||
|
ADIOI_Malloc(nprocs*sizeof(ADIOI_Access));
|
||||||
|
others_req = *others_req_ptr;
|
||||||
|
|
||||||
|
scounts = ADIOI_Malloc(nprocs*sizeof(int));
|
||||||
|
sdispls = ADIOI_Malloc(nprocs*sizeof(int));
|
||||||
|
rcounts = ADIOI_Malloc(nprocs*sizeof(int));
|
||||||
|
rdispls = ADIOI_Malloc(nprocs*sizeof(int));
|
||||||
|
|
||||||
|
/* If process[i] has any requests in my file domain,
|
||||||
|
* initialize an ADIOI_Access structure that will describe each request
|
||||||
|
* from process[i]. The offsets, lengths, and buffer pointers still need
|
||||||
|
* to be obtained to complete the setting of this structure.
|
||||||
|
*/
|
||||||
|
count_others_req_procs = 0;
|
||||||
|
for (i=0; i<nprocs; i++) {
|
||||||
|
if (count_others_req_per_proc[i]) {
|
||||||
|
others_req[i].count = count_others_req_per_proc[i];
|
||||||
|
|
||||||
|
others_req[i].offsets = (ADIO_Offset *)
|
||||||
|
ADIOI_Malloc(count_others_req_per_proc[i]*sizeof(ADIO_Offset));
|
||||||
|
others_req[i].lens = (int *)
|
||||||
|
ADIOI_Malloc(count_others_req_per_proc[i]*sizeof(int));
|
||||||
|
|
||||||
|
if ( (unsigned)others_req[i].offsets < (unsigned)recvBufForOffsets )
|
||||||
|
recvBufForOffsets = others_req[i].offsets;
|
||||||
|
if ( (unsigned)others_req[i].lens < (unsigned)recvBufForLens )
|
||||||
|
recvBufForLens = others_req[i].lens;
|
||||||
|
|
||||||
|
others_req[i].mem_ptrs = (MPI_Aint *)
|
||||||
|
ADIOI_Malloc(count_others_req_per_proc[i]*sizeof(MPI_Aint));
|
||||||
|
|
||||||
|
count_others_req_procs++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
others_req[i].count = 0;
|
||||||
|
others_req[i].offsets = NULL;
|
||||||
|
others_req[i].lens = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now send the calculated offsets and lengths to respective processes */
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Exchange the offsets */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
/* Determine the lowest sendBufForOffsets/Lens */
|
||||||
|
for (i=0; i<nprocs; i++)
|
||||||
|
{
|
||||||
|
if ( (my_req[i].count) &&
|
||||||
|
((unsigned)my_req[i].offsets <= (unsigned)sendBufForOffsets) )
|
||||||
|
sendBufForOffsets = my_req[i].offsets;
|
||||||
|
|
||||||
|
if ( (my_req[i].count) &&
|
||||||
|
((unsigned)my_req[i].lens <= (unsigned)sendBufForLens) )
|
||||||
|
sendBufForLens = my_req[i].lens;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Calculate the displacements from the sendBufForOffsets/Lens */
|
||||||
|
for (i=0; i<nprocs; i++)
|
||||||
|
{
|
||||||
|
// Send these offsets to process i.
|
||||||
|
scounts[i] = count_my_req_per_proc[i];
|
||||||
|
if ( scounts[i] == 0 )
|
||||||
|
sdispls[i] = 0;
|
||||||
|
else
|
||||||
|
sdispls[i] = ( (unsigned)my_req[i].offsets -
|
||||||
|
(unsigned)sendBufForOffsets ) / sizeof(ADIO_Offset);
|
||||||
|
|
||||||
|
// Receive these offsets from process i.
|
||||||
|
rcounts[i] = count_others_req_per_proc[i];
|
||||||
|
if ( rcounts[i] == 0 )
|
||||||
|
rdispls[i] = 0;
|
||||||
|
else
|
||||||
|
rdispls[i] = ( (unsigned)others_req[i].offsets -
|
||||||
|
(unsigned)recvBufForOffsets ) / sizeof(ADIO_Offset);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exchange the offsets */
|
||||||
|
MPI_Alltoallv(sendBufForOffsets,
|
||||||
|
scounts, sdispls, ADIO_OFFSET,
|
||||||
|
recvBufForOffsets,
|
||||||
|
rcounts, rdispls, ADIO_OFFSET,
|
||||||
|
fd->comm);
|
||||||
|
|
||||||
|
/************************/
|
||||||
|
/* Exchange the lengths */
|
||||||
|
/************************/
|
||||||
|
|
||||||
|
for (i=0; i<nprocs; i++)
|
||||||
|
{
|
||||||
|
// Send these lengths to process i.
|
||||||
|
scounts[i] = count_my_req_per_proc[i];
|
||||||
|
if ( scounts[i] == 0 )
|
||||||
|
sdispls[i] = 0;
|
||||||
|
else
|
||||||
|
sdispls[i] = ( (unsigned)my_req[i].lens -
|
||||||
|
(unsigned)sendBufForLens ) / sizeof(int);
|
||||||
|
|
||||||
|
// Receive these offsets from process i.
|
||||||
|
rcounts[i] = count_others_req_per_proc[i];
|
||||||
|
if ( rcounts[i] == 0 )
|
||||||
|
rdispls[i] = 0;
|
||||||
|
else
|
||||||
|
rdispls[i] = ( (unsigned)others_req[i].lens -
|
||||||
|
(unsigned)recvBufForLens ) / sizeof(int);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Exchange the lengths */
|
||||||
|
MPI_Alltoallv(sendBufForLens,
|
||||||
|
scounts, sdispls, MPI_INT,
|
||||||
|
recvBufForLens,
|
||||||
|
rcounts, rdispls, MPI_INT,
|
||||||
|
fd->comm);
|
||||||
|
|
||||||
|
/* Clean up */
|
||||||
|
ADIOI_Free(count_others_req_per_proc);
|
||||||
|
ADIOI_Free (scounts);
|
||||||
|
ADIOI_Free (sdispls);
|
||||||
|
ADIOI_Free (rcounts);
|
||||||
|
ADIOI_Free (rdispls);
|
||||||
|
|
||||||
|
*count_others_req_procs_ptr = count_others_req_procs;
|
||||||
|
}
|
98
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.h
Обычный файл
98
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_aggrs.h
Обычный файл
@ -0,0 +1,98 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_aggrs.h
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* File: ad_bgl_aggrs.h
|
||||||
|
*
|
||||||
|
* Declares functions specific for BG/L - GPFS parallel I/O solution. The implemented optimizations are:
|
||||||
|
* . Aligned file-domain partitioning, integrated in 7/28/2005
|
||||||
|
*
|
||||||
|
* In addition, following optimizations are planned:
|
||||||
|
* . Integrating multiple file-domain partitioning schemes
|
||||||
|
* (corresponding to Alok Chouhdary's persistent file domain work).
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AD_BGL_AGGRS_H_
|
||||||
|
#define AD_BGL_AGGRS_H_
|
||||||
|
|
||||||
|
#include "adio.h"
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
extern int *aggrsInPset; /* defined in ad_bgl_aggrs.c */
|
||||||
|
|
||||||
|
|
||||||
|
/* File system (BGL) specific information -
|
||||||
|
hung off of ADIOI_FileD file descriptor (fd->fs_ptr) at open */
|
||||||
|
typedef struct ADIOI_BGL_fs_s {
|
||||||
|
__blksize_t blksize;
|
||||||
|
} ADIOI_BGL_fs;
|
||||||
|
|
||||||
|
/* generate a list of I/O aggregators that utilizes BGL-PSET orginization. */
|
||||||
|
int ADIOI_BGL_gen_agg_ranklist(ADIO_File fd, int n_aggrs_per_pset);
|
||||||
|
|
||||||
|
/* overriding ADIOI_Calc_file_domains() to apply 'aligned file domain partitioning'. */
|
||||||
|
void ADIOI_BGL_GPFS_Calc_file_domains(ADIO_Offset *st_offsets,
|
||||||
|
ADIO_Offset *end_offsets,
|
||||||
|
int nprocs,
|
||||||
|
int nprocs_for_coll,
|
||||||
|
ADIO_Offset *min_st_offset_ptr,
|
||||||
|
ADIO_Offset **fd_start_ptr,
|
||||||
|
ADIO_Offset **fd_end_ptr,
|
||||||
|
ADIO_Offset *fd_size_ptr,
|
||||||
|
void *fs_ptr);
|
||||||
|
|
||||||
|
/* a utilitiy function for debugging */
|
||||||
|
int ADIOI_BGL_Aggrs_index(ADIO_File fd, int myrank );
|
||||||
|
|
||||||
|
/* overriding ADIOI_Calc_aggregator() for the default implementation is specific for
|
||||||
|
static file domain partitioning */
|
||||||
|
int ADIOI_BGL_Calc_aggregator(ADIO_File fd,
|
||||||
|
ADIO_Offset off,
|
||||||
|
ADIO_Offset min_off,
|
||||||
|
ADIO_Offset *len,
|
||||||
|
ADIO_Offset fd_size,
|
||||||
|
ADIO_Offset *fd_start,
|
||||||
|
ADIO_Offset *fd_end);
|
||||||
|
|
||||||
|
/* overriding ADIOI_Calc_my_req for the default implementation is specific for
|
||||||
|
static file domain partitioning */
|
||||||
|
void ADIOI_BGL_Calc_my_req ( ADIO_File fd, ADIO_Offset *offset_list, int *len_list,
|
||||||
|
int contig_access_count, ADIO_Offset
|
||||||
|
min_st_offset, ADIO_Offset *fd_start,
|
||||||
|
ADIO_Offset *fd_end, ADIO_Offset fd_size,
|
||||||
|
int nprocs,
|
||||||
|
int *count_my_req_procs_ptr,
|
||||||
|
int **count_my_req_per_proc_ptr,
|
||||||
|
ADIOI_Access **my_req_ptr,
|
||||||
|
int **buf_idx_ptr);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ADIOI_Calc_others_req
|
||||||
|
*
|
||||||
|
* param[in] count_my_req_procs Number of processes whose file domain my
|
||||||
|
* request touches.
|
||||||
|
* param[in] count_my_req_per_proc count_my_req_per_proc[i] gives the no. of
|
||||||
|
* contig. requests of this process in
|
||||||
|
* process i's file domain.
|
||||||
|
* param[in] my_req A structure defining my request
|
||||||
|
* param[in] nprocs Number of nodes in the block
|
||||||
|
* param[in] myrank Rank of this node
|
||||||
|
* param[out] count_others_req_proc_ptr Number of processes whose requests lie in
|
||||||
|
* my process's file domain (including my
|
||||||
|
* process itself)
|
||||||
|
* param[out] others_req_ptr Array of other process' requests that lie
|
||||||
|
* in my process's file domain
|
||||||
|
*/
|
||||||
|
void ADIOI_BGL_Calc_others_req(ADIO_File fd, int count_my_req_procs,
|
||||||
|
int *count_my_req_per_proc,
|
||||||
|
ADIOI_Access *my_req,
|
||||||
|
int nprocs, int myrank,
|
||||||
|
int *count_others_req_procs_ptr,
|
||||||
|
ADIOI_Access **others_req_ptr);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AD_BGL_AGGRS_H_ */
|
52
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_close.c
Обычный файл
52
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_close.c
Обычный файл
@ -0,0 +1,52 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_open.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "ad_bgl_aggrs.h"
|
||||||
|
|
||||||
|
void ADIOI_BGL_Close(ADIO_File fd, int *error_code)
|
||||||
|
{
|
||||||
|
int err, derr=0;
|
||||||
|
static char myname[] = "ADIOI_BGL_CLOSE";
|
||||||
|
|
||||||
|
#ifdef PROFILE
|
||||||
|
MPE_Log_event(9, 0, "start close");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
err = close(fd->fd_sys);
|
||||||
|
if (fd->fd_direct >= 0)
|
||||||
|
{
|
||||||
|
derr = close(fd->fd_direct);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef PROFILE
|
||||||
|
MPE_Log_event(10, 0, "end close");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* FPRINTF(stderr,"%s(%d):'%s'. Free %#X\n",myname,__LINE__,fd->filename,(int)fd->fs_ptr);*/
|
||||||
|
if (fd->fs_ptr != NULL) {
|
||||||
|
ADIOI_Free(fd->fs_ptr);
|
||||||
|
fd->fs_ptr = NULL;
|
||||||
|
}
|
||||||
|
fd->fd_sys = -1;
|
||||||
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
|
if (err == -1 || derr == -1)
|
||||||
|
{
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
57
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_fcntl.c
Обычный файл
57
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_fcntl.c
Обычный файл
@ -0,0 +1,57 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_fcntl.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
/* #ifdef MPISGI
|
||||||
|
#include "mpisgi2.h"
|
||||||
|
#endif */
|
||||||
|
|
||||||
|
void ADIOI_BGL_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct,
|
||||||
|
int *error_code)
|
||||||
|
{
|
||||||
|
static char myname[] = "ADIOI_BGL_FCNTL";
|
||||||
|
|
||||||
|
switch(flag) {
|
||||||
|
case ADIO_FCNTL_GET_FSIZE:
|
||||||
|
fcntl_struct->fsize = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
if (fd->fp_sys_posn != -1)
|
||||||
|
lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
||||||
|
if (fcntl_struct->fsize == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ADIO_FCNTL_SET_DISKSPACE:
|
||||||
|
ADIOI_GEN_Prealloc(fd, fcntl_struct->diskspace, error_code);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ADIO_FCNTL_SET_ATOMICITY:
|
||||||
|
fd->atomicity = (fcntl_struct->atomicity == 0) ? 0 : 1;
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
default:
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_ARG,
|
||||||
|
"**flag", "**flag %d", flag);
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
}
|
84
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_getsh.c
Обычный файл
84
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_getsh.c
Обычный файл
@ -0,0 +1,84 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_getsh.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
|
||||||
|
/* returns the current location of the shared_fp in terms of the
|
||||||
|
no. of etypes relative to the current view, and also increments the
|
||||||
|
shared_fp by the number of etypes to be accessed (incr) in the read
|
||||||
|
or write following this function. */
|
||||||
|
|
||||||
|
void ADIOI_BGL_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp,
|
||||||
|
int *error_code)
|
||||||
|
{
|
||||||
|
ADIO_Offset new_fp;
|
||||||
|
int err;
|
||||||
|
MPI_Comm dupcommself;
|
||||||
|
static char myname[] = "ADIOI_BGL_GET_SHARED_FP";
|
||||||
|
|
||||||
|
if (fd->shared_fp_fd == ADIO_FILE_NULL) {
|
||||||
|
MPI_Comm_dup(MPI_COMM_SELF, &dupcommself);
|
||||||
|
fd->shared_fp_fd = ADIO_Open(MPI_COMM_SELF,
|
||||||
|
dupcommself,
|
||||||
|
fd->shared_fp_fname,
|
||||||
|
fd->file_system,
|
||||||
|
fd->fns,
|
||||||
|
ADIO_CREATE | ADIO_RDWR | ADIO_DELETE_ON_CLOSE,
|
||||||
|
0,
|
||||||
|
MPI_BYTE,
|
||||||
|
MPI_BYTE,
|
||||||
|
MPI_INFO_NULL,
|
||||||
|
ADIO_PERM_NULL,
|
||||||
|
error_code);
|
||||||
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
|
*shared_fp = 0;
|
||||||
|
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
err = read(fd->shared_fp_fd->fd_sys, shared_fp, sizeof(ADIO_Offset));
|
||||||
|
/* if the file is empty, the above read may return error
|
||||||
|
(reading beyond end of file). In that case, shared_fp = 0,
|
||||||
|
set above, is the correct value. */
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
|
||||||
|
err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
||||||
|
if (err == 0) {
|
||||||
|
err = read(fd->shared_fp_fd->fd_sys, shared_fp,
|
||||||
|
sizeof(ADIO_Offset));
|
||||||
|
}
|
||||||
|
if (err == -1) {
|
||||||
|
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
new_fp = *shared_fp + incr;
|
||||||
|
|
||||||
|
err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
||||||
|
if (err == 0) {
|
||||||
|
err = write(fd->shared_fp_fd->fd_sys, &new_fp, sizeof(ADIO_Offset));
|
||||||
|
}
|
||||||
|
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
338
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_hints.c
Обычный файл
338
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_hints.c
Обычный файл
@ -0,0 +1,338 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_hints.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "adio.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "ad_bgl_pset.h"
|
||||||
|
#include "ad_bgl_aggrs.h"
|
||||||
|
|
||||||
|
#define ADIOI_BGL_CB_BUFFER_SIZE_DFLT "16777216"
|
||||||
|
#define ADIOI_BGL_IND_RD_BUFFER_SIZE_DFLT "4194304"
|
||||||
|
#define ADIOI_BGL_IND_WR_BUFFER_SIZE_DFLT "4194304"
|
||||||
|
#define ADIOI_BGL_NAGG_IN_PSET_HINT_NAME "bgl_nodes_pset"
|
||||||
|
|
||||||
|
/* Compute the aggregator-related parameters that are required in 2-phase collective IO of ADIO. */
|
||||||
|
extern int
|
||||||
|
ADIOI_BGL_gen_agg_ranklist(ADIO_File fd, int n_proxy_per_pset);
|
||||||
|
|
||||||
|
void ADIOI_BGL_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
|
||||||
|
{
|
||||||
|
/* if fd->info is null, create a new info object.
|
||||||
|
Initialize fd->info to default values.
|
||||||
|
Initialize fd->hints to default values.
|
||||||
|
Examine the info object passed by the user. If it contains values that
|
||||||
|
ROMIO understands, override the default. */
|
||||||
|
|
||||||
|
MPI_Info info;
|
||||||
|
char *value;
|
||||||
|
int flag, intval, tmp_val, nprocs, nprocs_is_valid = 0;
|
||||||
|
static char myname[] = "ADIOI_GEN_SETINFO";
|
||||||
|
|
||||||
|
int did_anything = 0;
|
||||||
|
|
||||||
|
if (fd->info == MPI_INFO_NULL) MPI_Info_create(&(fd->info));
|
||||||
|
info = fd->info;
|
||||||
|
|
||||||
|
/* Note that fd->hints is allocated at file open time; thus it is
|
||||||
|
* not necessary to allocate it, or check for allocation, here.
|
||||||
|
*/
|
||||||
|
|
||||||
|
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
||||||
|
AD_BGL_assert ((value != NULL));
|
||||||
|
|
||||||
|
/* initialize info and hints to default values if they haven't been
|
||||||
|
* previously initialized
|
||||||
|
*/
|
||||||
|
if (!fd->hints->initialized) {
|
||||||
|
|
||||||
|
did_anything = 1;
|
||||||
|
|
||||||
|
/* buffer size for collective I/O */
|
||||||
|
MPI_Info_set(info, "cb_buffer_size", ADIOI_BGL_CB_BUFFER_SIZE_DFLT);
|
||||||
|
fd->hints->cb_buffer_size = atoi(ADIOI_BGL_CB_BUFFER_SIZE_DFLT);
|
||||||
|
|
||||||
|
/* default is to let romio automatically decide when to use
|
||||||
|
* collective buffering
|
||||||
|
*/
|
||||||
|
MPI_Info_set(info, "romio_cb_read", "enable");
|
||||||
|
fd->hints->cb_read = ADIOI_HINT_ENABLE;
|
||||||
|
MPI_Info_set(info, "romio_cb_write", "enable");
|
||||||
|
fd->hints->cb_write = ADIOI_HINT_ENABLE;
|
||||||
|
|
||||||
|
if ( fd->hints->cb_config_list != NULL ) ADIOI_Free (fd->hints->cb_config_list);
|
||||||
|
fd->hints->cb_config_list = NULL;
|
||||||
|
|
||||||
|
/* number of processes that perform I/O in collective I/O */
|
||||||
|
MPI_Comm_size(fd->comm, &nprocs);
|
||||||
|
nprocs_is_valid = 1;
|
||||||
|
sprintf(value, "%d", nprocs);
|
||||||
|
MPI_Info_set(info, "cb_nodes", value);
|
||||||
|
fd->hints->cb_nodes = -1;
|
||||||
|
|
||||||
|
/* hint indicating that no indep. I/O will be performed on this file */
|
||||||
|
MPI_Info_set(info, "romio_no_indep_rw", "false");
|
||||||
|
fd->hints->no_indep_rw = 0;
|
||||||
|
/* deferred_open derrived from no_indep_rw and cb_{read,write} */
|
||||||
|
fd->hints->deferred_open = 0;
|
||||||
|
|
||||||
|
/* buffer size for data sieving in independent reads */
|
||||||
|
MPI_Info_set(info, "ind_rd_buffer_size", ADIOI_BGL_IND_RD_BUFFER_SIZE_DFLT);
|
||||||
|
fd->hints->ind_rd_buffer_size = atoi(ADIOI_BGL_IND_RD_BUFFER_SIZE_DFLT);
|
||||||
|
|
||||||
|
/* buffer size for data sieving in independent writes */
|
||||||
|
MPI_Info_set(info, "ind_wr_buffer_size", ADIOI_BGL_IND_WR_BUFFER_SIZE_DFLT);
|
||||||
|
fd->hints->ind_wr_buffer_size = atoi(ADIOI_BGL_IND_WR_BUFFER_SIZE_DFLT);
|
||||||
|
|
||||||
|
if(fd->file_system == ADIO_UFS)
|
||||||
|
{
|
||||||
|
/* default for ufs/pvfs is to disable data sieving */
|
||||||
|
MPI_Info_set(info, "romio_ds_read", "disable");
|
||||||
|
fd->hints->ds_read = ADIOI_HINT_DISABLE;
|
||||||
|
MPI_Info_set(info, "romio_ds_write", "disable");
|
||||||
|
fd->hints->ds_write = ADIOI_HINT_DISABLE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* default is to let romio automatically decide when to use data
|
||||||
|
* sieving
|
||||||
|
*/
|
||||||
|
MPI_Info_set(info, "romio_ds_read", "automatic");
|
||||||
|
fd->hints->ds_read = ADIOI_HINT_AUTO;
|
||||||
|
MPI_Info_set(info, "romio_ds_write", "automatic");
|
||||||
|
fd->hints->ds_write = ADIOI_HINT_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd->hints->initialized = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* add in user's info if supplied */
|
||||||
|
if (users_info != MPI_INFO_NULL) {
|
||||||
|
MPI_Info_get(users_info, "cb_buffer_size", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag && ((intval=atoi(value)) > 0)) {
|
||||||
|
tmp_val = intval;
|
||||||
|
|
||||||
|
MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm);
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (tmp_val != intval) {
|
||||||
|
MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname,
|
||||||
|
"cb_buffer_size",
|
||||||
|
error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
MPI_Info_set(info, "cb_buffer_size", value);
|
||||||
|
fd->hints->cb_buffer_size = intval;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* new hints for enabling/disabling coll. buffering on
|
||||||
|
* reads/writes
|
||||||
|
*/
|
||||||
|
MPI_Info_get(users_info, "romio_cb_read", MPI_MAX_INFO_VAL, value, &flag);
|
||||||
|
if (flag) {
|
||||||
|
if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) {
|
||||||
|
MPI_Info_set(info, "romio_cb_read", value);
|
||||||
|
fd->hints->cb_read = ADIOI_HINT_ENABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) {
|
||||||
|
/* romio_cb_read overrides no_indep_rw */
|
||||||
|
MPI_Info_set(info, "romio_cb_read", value);
|
||||||
|
MPI_Info_set(info, "romio_no_indep_rw", "false");
|
||||||
|
fd->hints->cb_read = ADIOI_HINT_DISABLE;
|
||||||
|
fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC"))
|
||||||
|
{
|
||||||
|
MPI_Info_set(info, "romio_cb_read", value);
|
||||||
|
fd->hints->cb_read = ADIOI_HINT_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_val = fd->hints->cb_read;
|
||||||
|
|
||||||
|
MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm);
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (tmp_val != fd->hints->cb_read) {
|
||||||
|
MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname,
|
||||||
|
"romio_cb_read",
|
||||||
|
error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
MPI_Info_get(users_info, "romio_cb_write", MPI_MAX_INFO_VAL, value, &flag);
|
||||||
|
if (flag) {
|
||||||
|
if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) {
|
||||||
|
MPI_Info_set(info, "romio_cb_write", value);
|
||||||
|
fd->hints->cb_write = ADIOI_HINT_ENABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE"))
|
||||||
|
{
|
||||||
|
/* romio_cb_write overrides no_indep_rw, too */
|
||||||
|
MPI_Info_set(info, "romio_cb_write", value);
|
||||||
|
MPI_Info_set(info, "romio_no_indep_rw", "false");
|
||||||
|
fd->hints->cb_write = ADIOI_HINT_DISABLE;
|
||||||
|
fd->hints->no_indep_rw = ADIOI_HINT_DISABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "automatic") ||
|
||||||
|
!strcmp(value, "AUTOMATIC"))
|
||||||
|
{
|
||||||
|
MPI_Info_set(info, "romio_cb_write", value);
|
||||||
|
fd->hints->cb_write = ADIOI_HINT_AUTO;
|
||||||
|
}
|
||||||
|
|
||||||
|
tmp_val = fd->hints->cb_write;
|
||||||
|
|
||||||
|
MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm);
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (tmp_val != fd->hints->cb_write) {
|
||||||
|
MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname,
|
||||||
|
"romio_cb_write",
|
||||||
|
error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* new hint for specifying no indep. read/write will be performed */
|
||||||
|
MPI_Info_get(users_info, "romio_no_indep_rw", MPI_MAX_INFO_VAL, value, &flag);
|
||||||
|
if (flag) {
|
||||||
|
if (!strcmp(value, "true") || !strcmp(value, "TRUE")) {
|
||||||
|
/* if 'no_indep_rw' set, also hint that we will do
|
||||||
|
* collective buffering: if we aren't doing independent io,
|
||||||
|
* then we have to do collective */
|
||||||
|
MPI_Info_set(info, "romio_no_indep_rw", value);
|
||||||
|
MPI_Info_set(info, "romio_cb_write", "enable");
|
||||||
|
MPI_Info_set(info, "romio_cb_read", "enable");
|
||||||
|
fd->hints->no_indep_rw = 1;
|
||||||
|
fd->hints->cb_read = 1;
|
||||||
|
fd->hints->cb_write = 1;
|
||||||
|
tmp_val = 1;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "false") || !strcmp(value, "FALSE")) {
|
||||||
|
MPI_Info_set(info, "romio_no_indep_rw", value);
|
||||||
|
fd->hints->no_indep_rw = 0;
|
||||||
|
tmp_val = 0;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* default is above */
|
||||||
|
tmp_val = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm);
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (tmp_val != fd->hints->no_indep_rw) {
|
||||||
|
MPIO_ERR_CREATE_CODE_INFO_NOT_SAME(myname,
|
||||||
|
"romio_no_indep_rw",
|
||||||
|
error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
/* new hints for enabling/disabling data sieving on
|
||||||
|
* reads/writes
|
||||||
|
*/
|
||||||
|
MPI_Info_get(users_info, "romio_ds_read", MPI_MAX_INFO_VAL, value,
|
||||||
|
&flag);
|
||||||
|
if (flag) {
|
||||||
|
if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) {
|
||||||
|
MPI_Info_set(info, "romio_ds_read", value);
|
||||||
|
fd->hints->ds_read = ADIOI_HINT_ENABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) {
|
||||||
|
MPI_Info_set(info, "romio_ds_read", value);
|
||||||
|
fd->hints->ds_read = ADIOI_HINT_DISABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC"))
|
||||||
|
{
|
||||||
|
MPI_Info_set(info, "romio_ds_read", value);
|
||||||
|
fd->hints->ds_read = ADIOI_HINT_AUTO;
|
||||||
|
}
|
||||||
|
/* otherwise ignore */
|
||||||
|
}
|
||||||
|
MPI_Info_get(users_info, "romio_ds_write", MPI_MAX_INFO_VAL, value,
|
||||||
|
&flag);
|
||||||
|
if (flag) {
|
||||||
|
if (!strcmp(value, "enable") || !strcmp(value, "ENABLE")) {
|
||||||
|
MPI_Info_set(info, "romio_ds_write", value);
|
||||||
|
fd->hints->ds_write = ADIOI_HINT_ENABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "disable") || !strcmp(value, "DISABLE")) {
|
||||||
|
MPI_Info_set(info, "romio_ds_write", value);
|
||||||
|
fd->hints->ds_write = ADIOI_HINT_DISABLE;
|
||||||
|
}
|
||||||
|
else if (!strcmp(value, "automatic") || !strcmp(value, "AUTOMATIC"))
|
||||||
|
{
|
||||||
|
MPI_Info_set(info, "romio_ds_write", value);
|
||||||
|
fd->hints->ds_write = ADIOI_HINT_AUTO;
|
||||||
|
}
|
||||||
|
/* otherwise ignore */
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Info_get(users_info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag && ((intval = atoi(value)) > 0)) {
|
||||||
|
MPI_Info_set(info, "ind_wr_buffer_size", value);
|
||||||
|
fd->hints->ind_wr_buffer_size = intval;
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Info_get(users_info, "ind_rd_buffer_size", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag && ((intval = atoi(value)) > 0)) {
|
||||||
|
MPI_Info_set(info, "ind_rd_buffer_size", value);
|
||||||
|
fd->hints->ind_rd_buffer_size = intval;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset( value, 0, MPI_MAX_INFO_VAL+1 );
|
||||||
|
MPI_Info_get(users_info, ADIOI_BGL_NAGG_IN_PSET_HINT_NAME, MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag && ((intval = atoi(value)) > 0)) {
|
||||||
|
|
||||||
|
did_anything = 1;
|
||||||
|
MPI_Info_set(info, ADIOI_BGL_NAGG_IN_PSET_HINT_NAME, value);
|
||||||
|
fd->hints->cb_nodes = intval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* associate CB aggregators to certain CNs in every involved PSET */
|
||||||
|
if (did_anything) {
|
||||||
|
ADIOI_BGL_gen_agg_ranklist(fd, fd->hints->cb_nodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* deferred_open won't be set by callers, but if the user doesn't
|
||||||
|
* explicitly disable collecitve buffering (two-phase) and does hint that
|
||||||
|
* io w/o independent io is going on, we'll set this internal hint as a
|
||||||
|
* convenience */
|
||||||
|
if ( ( (fd->hints->cb_read != ADIOI_HINT_DISABLE)
|
||||||
|
&& (fd->hints->cb_write != ADIOI_HINT_DISABLE)
|
||||||
|
&& fd->hints->no_indep_rw ) )
|
||||||
|
{
|
||||||
|
fd->hints->deferred_open = 1;
|
||||||
|
} else {
|
||||||
|
/* setting romio_no_indep_rw enable and romio_cb_{read,write}
|
||||||
|
* disable at the same time doesn't make sense. honor
|
||||||
|
* romio_cb_{read,write} and force the no_indep_rw hint to
|
||||||
|
* 'disable' */
|
||||||
|
MPI_Info_set(info, "romio_no_indep_rw", "false");
|
||||||
|
fd->hints->no_indep_rw = 0;
|
||||||
|
fd->hints->deferred_open = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADIOI_Free(value);
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
114
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_open.c
Обычный файл
114
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_open.c
Обычный файл
@ -0,0 +1,114 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_open.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "ad_bgl_aggrs.h"
|
||||||
|
|
||||||
|
void ADIOI_BGL_Open(ADIO_File fd, int *error_code)
|
||||||
|
{
|
||||||
|
int perm, old_mask, amode;
|
||||||
|
static char myname[] = "ADIOI_BGL_OPEN";
|
||||||
|
|
||||||
|
/* set internal variables for tuning environment variables */
|
||||||
|
ad_bgl_get_env_vars();
|
||||||
|
|
||||||
|
if (fd->perm == ADIO_PERM_NULL) {
|
||||||
|
old_mask = umask(022);
|
||||||
|
umask(old_mask);
|
||||||
|
perm = old_mask ^ 0666;
|
||||||
|
}
|
||||||
|
else perm = fd->perm;
|
||||||
|
|
||||||
|
amode = 0;
|
||||||
|
if (fd->access_mode & ADIO_CREATE)
|
||||||
|
amode = amode | O_CREAT;
|
||||||
|
if (fd->access_mode & ADIO_RDONLY)
|
||||||
|
amode = amode | O_RDONLY;
|
||||||
|
if (fd->access_mode & ADIO_WRONLY)
|
||||||
|
amode = amode | O_WRONLY;
|
||||||
|
if (fd->access_mode & ADIO_RDWR)
|
||||||
|
amode = amode | O_RDWR;
|
||||||
|
if (fd->access_mode & ADIO_EXCL)
|
||||||
|
amode = amode | O_EXCL;
|
||||||
|
|
||||||
|
fd->fd_sys = open(fd->filename, amode, perm);
|
||||||
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
|
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
|
||||||
|
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
|
||||||
|
if(fd->fd_sys != -1)
|
||||||
|
{
|
||||||
|
struct stat64 bgl_stat;
|
||||||
|
int rc = stat64(fd->filename,&bgl_stat);
|
||||||
|
if (rc >= 0)
|
||||||
|
{
|
||||||
|
/* store the blksize in the file system specific storage */
|
||||||
|
AD_BGL_assert(fd->fs_ptr == NULL);
|
||||||
|
fd->fs_ptr = (ADIOI_BGL_fs*) ADIOI_Malloc(sizeof(ADIOI_BGL_fs));
|
||||||
|
((ADIOI_BGL_fs*)fd->fs_ptr)->blksize = bgl_stat.st_blksize;
|
||||||
|
/* FPRINTF(stderr,"%s(%d):Successful stat '%s'. Blocksize=%ld\n",myname,__LINE__,fd->filename,bgl_stat.st_blksize);*/
|
||||||
|
}
|
||||||
|
/* else
|
||||||
|
FPRINTF(stderr,"%s(%d):Stat '%s' failed with rc=%d, errno=%d\n",myname,__LINE__,fd->filename,rc,errno);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd->fd_sys == -1) {
|
||||||
|
if (errno == ENAMETOOLONG)
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_BAD_FILE,
|
||||||
|
"**filenamelong",
|
||||||
|
"**filenamelong %s %d",
|
||||||
|
fd->filename,
|
||||||
|
strlen(fd->filename));
|
||||||
|
else if (errno == ENOENT)
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_NO_SUCH_FILE,
|
||||||
|
"**filenoexist",
|
||||||
|
"**filenoexist %s",
|
||||||
|
fd->filename);
|
||||||
|
else if (errno == ENOTDIR || errno == ELOOP)
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_BAD_FILE,
|
||||||
|
"**filenamedir",
|
||||||
|
"**filenamedir %s",
|
||||||
|
fd->filename);
|
||||||
|
else if (errno == EACCES) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_ACCESS,
|
||||||
|
"**fileaccess",
|
||||||
|
"**fileaccess %s",
|
||||||
|
fd->filename );
|
||||||
|
}
|
||||||
|
else if (errno == EROFS) {
|
||||||
|
/* Read only file or file system and write access requested */
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_READ_ONLY,
|
||||||
|
"**ioneedrd", 0 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
109
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.c
Обычный файл
109
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.c
Обычный файл
@ -0,0 +1,109 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_pset.c
|
||||||
|
* \brief Definition of functions associated to structs ADIOI_BGL_ProcInfo_t and ADIOI_BGL_ConfInfo_t
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "ad_bgl_pset.h"
|
||||||
|
#include "mpidimpl.h"
|
||||||
|
|
||||||
|
ADIOI_BGL_ProcInfo_t *
|
||||||
|
ADIOI_BGL_ProcInfo_new()
|
||||||
|
{
|
||||||
|
ADIOI_BGL_ProcInfo_t *p = (ADIOI_BGL_ProcInfo_t *) ADIOI_Malloc (sizeof(ADIOI_BGL_ProcInfo_t));
|
||||||
|
AD_BGL_assert ((p != NULL));
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
ADIOI_BGL_ProcInfo_t *
|
||||||
|
ADIOI_BGL_ProcInfo_new_n( int n )
|
||||||
|
{
|
||||||
|
ADIOI_BGL_ProcInfo_t *p = (ADIOI_BGL_ProcInfo_t *) ADIOI_Malloc (n * sizeof(ADIOI_BGL_ProcInfo_t));
|
||||||
|
AD_BGL_assert ((p != NULL));
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADIOI_BGL_ProcInfo_free( ADIOI_BGL_ProcInfo_t *info )
|
||||||
|
{
|
||||||
|
if (info != NULL) ADIOI_Free (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
ADIOI_BGL_ProcInfo_set(ADIOI_BGL_ProcInfo_t *info, const DCMF_Hardware_t *hw, int r)
|
||||||
|
{
|
||||||
|
info->psetNum = hw->idOfPset;
|
||||||
|
info->xInPset = hw->xCoord;
|
||||||
|
info->yInPset = hw->yCoord;
|
||||||
|
info->zInPset = hw->zCoord;
|
||||||
|
info->cpuid = hw->tCoord;
|
||||||
|
info->rank = r;
|
||||||
|
info->rankInPset = hw->rankInPset;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ADIOI_BGL_ConfInfo_t *
|
||||||
|
ADIOI_BGL_ConfInfo_new ()
|
||||||
|
{
|
||||||
|
ADIOI_BGL_ConfInfo_t *p = (ADIOI_BGL_ConfInfo_t *) ADIOI_Malloc (sizeof(ADIOI_BGL_ConfInfo_t));
|
||||||
|
AD_BGL_assert ((p != NULL));
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
ADIOI_BGL_ConfInfo_set(ADIOI_BGL_ConfInfo_t *info, const DCMF_Hardware_t *hw, int s, int n_aggrs)
|
||||||
|
{
|
||||||
|
info->PsetSize = hw->sizeOfPset;
|
||||||
|
info->numPsets = (hw->xSize * hw->ySize *
|
||||||
|
hw->zSize) / hw->sizeOfPset;
|
||||||
|
info->isVNM = (hw->tSize != 1);
|
||||||
|
info->cpuidSize = hw->tSize;
|
||||||
|
info->virtualPsetSize = hw->sizeOfPset * hw->tSize;
|
||||||
|
info->nProcs = s;
|
||||||
|
|
||||||
|
/* More complicated logic maybe needed for nAggrs specification */
|
||||||
|
info->nAggrs = n_aggrs;
|
||||||
|
if ( info->nAggrs <=0 || MIN(info->nProcs, info->virtualPsetSize) < info->nAggrs )
|
||||||
|
info->nAggrs = ADIOI_BGL_NAGG_PSET_DFLT;
|
||||||
|
if ( info->nAggrs > info->virtualPsetSize ) info->nAggrs = info->virtualPsetSize;
|
||||||
|
|
||||||
|
info->aggRatio = 1. * info->nAggrs / info->virtualPsetSize;
|
||||||
|
if (info->aggRatio > 1) info->aggRatio = 1.;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADIOI_BGL_ConfInfo_free( ADIOI_BGL_ConfInfo_t *info )
|
||||||
|
{
|
||||||
|
if (info != NULL) ADIOI_Free (info);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADIOI_BGL_persInfo_init(ADIOI_BGL_ConfInfo_t *conf,
|
||||||
|
ADIOI_BGL_ProcInfo_t *proc,
|
||||||
|
int s, int r, int n_aggrs)
|
||||||
|
{
|
||||||
|
DCMF_Hardware_t hw;
|
||||||
|
DCMF_Hardware(&hw);
|
||||||
|
|
||||||
|
ADIOI_BGL_ConfInfo_set (conf, &hw, s, n_aggrs);
|
||||||
|
ADIOI_BGL_ProcInfo_set (proc, &hw, r);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ADIOI_BGL_persInfo_free( ADIOI_BGL_ConfInfo_t *conf, ADIOI_BGL_ProcInfo_t *proc )
|
||||||
|
{
|
||||||
|
ADIOI_BGL_ConfInfo_free( conf );
|
||||||
|
ADIOI_BGL_ProcInfo_free( proc );
|
||||||
|
}
|
80
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.h
Обычный файл
80
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_pset.h
Обычный файл
@ -0,0 +1,80 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_pset.h
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* File: ad_bgl_pset.h
|
||||||
|
*
|
||||||
|
* Defines two structures that keep BG/L PSET specific information and their public interfaces:
|
||||||
|
* . ADIOI_BGL_ProcInfo_t object keeps specific information to each process
|
||||||
|
* . ADIOI_BGL_ConfInfo_t object keeps general information for the whole communicator, only kept
|
||||||
|
* on process 0.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AD_BGL_PSET_H_
|
||||||
|
#define AD_BGL_PSET_H_
|
||||||
|
|
||||||
|
/* Keeps specific information to each process, will be exchanged among processes */
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
int psetNum; /* which PSET I am in */
|
||||||
|
int rank; /* my rank */
|
||||||
|
int xInPset; /* my relative coordinates in my PSET */
|
||||||
|
int yInPset;
|
||||||
|
int zInPset;
|
||||||
|
int cpuid; /* my CPU id -- for virtual node mode (t coord)*/
|
||||||
|
int rankInPset; /* my relative rank in my PSET */
|
||||||
|
|
||||||
|
} ADIOI_BGL_ProcInfo_t __attribute__((aligned(16)));
|
||||||
|
|
||||||
|
|
||||||
|
/* Keeps general information for the whole communicator, only on process 0 */
|
||||||
|
typedef struct {
|
||||||
|
|
||||||
|
int PsetSize;
|
||||||
|
int nAggrs;
|
||||||
|
int numPsets;
|
||||||
|
int isVNM;
|
||||||
|
int virtualPsetSize;
|
||||||
|
int nProcs;
|
||||||
|
float aggRatio;
|
||||||
|
int cpuidSize; /* how many cpu ids? (t size) */
|
||||||
|
|
||||||
|
} ADIOI_BGL_ConfInfo_t __attribute__((aligned(16)));
|
||||||
|
|
||||||
|
|
||||||
|
#undef MIN
|
||||||
|
#define MIN(a,b) ((a<b ? a : b))
|
||||||
|
|
||||||
|
|
||||||
|
/* Default is to choose 8 aggregator nodes in each 32 CN pset.
|
||||||
|
Also defines default ratio of aggregator nodes in each a pset.
|
||||||
|
For Virtual Node Mode, the ratio is 8/64 */
|
||||||
|
#define ADIOI_BGL_NAGG_PSET_MIN 1
|
||||||
|
#define ADIOI_BGL_NAGG_PSET_DFLT 8
|
||||||
|
#define ADIOI_BGL_PSET_SIZE_DFLT 32
|
||||||
|
|
||||||
|
|
||||||
|
/* public funcs for ADIOI_BGL_ProcInfo_t objects */
|
||||||
|
ADIOI_BGL_ProcInfo_t * ADIOI_BGL_ProcInfo_new();
|
||||||
|
ADIOI_BGL_ProcInfo_t * ADIOI_BGL_ProcInfo_new_n( int n );
|
||||||
|
void ADIOI_BGL_ProcInfo_free( ADIOI_BGL_ProcInfo_t *info );
|
||||||
|
|
||||||
|
|
||||||
|
/* public funcs for ADIOI_BGL_ConfInfo_t objects */
|
||||||
|
ADIOI_BGL_ConfInfo_t * ADIOI_BGL_ConfInfo_new ();
|
||||||
|
void ADIOI_BGL_ConfInfo_free( ADIOI_BGL_ConfInfo_t *info );
|
||||||
|
|
||||||
|
|
||||||
|
/* public funcs for a pair of ADIOI_BGL_ConfInfo_t and ADIOI_BGL_ProcInfo_t objects */
|
||||||
|
void ADIOI_BGL_persInfo_init( ADIOI_BGL_ConfInfo_t *conf,
|
||||||
|
ADIOI_BGL_ProcInfo_t *proc,
|
||||||
|
int s, int r, int n_aggrs );
|
||||||
|
void ADIOI_BGL_persInfo_free( ADIOI_BGL_ConfInfo_t *conf,
|
||||||
|
ADIOI_BGL_ProcInfo_t *proc );
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AD_BGL_PSET_H_ */
|
1309
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_rdcoll.c
Обычный файл
1309
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_rdcoll.c
Обычный файл
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
496
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_read.c
Обычный файл
496
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_read.c
Обычный файл
@ -0,0 +1,496 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_read.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
|
||||||
|
#include "ad_bgl_tuning.h"
|
||||||
|
|
||||||
|
void ADIOI_BGL_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int *error_code)
|
||||||
|
{
|
||||||
|
int err=-1, datatype_size, len;
|
||||||
|
static char myname[] = "ADIOI_BGL_READCONTIG";
|
||||||
|
|
||||||
|
#if BGL_PROFILE
|
||||||
|
/* timing */
|
||||||
|
double io_time, io_time2;
|
||||||
|
|
||||||
|
if (bglmpio_timing) {
|
||||||
|
io_time = MPI_Wtime();
|
||||||
|
bglmpio_prof_cr[ BGLMPIO_CIO_DATA_SIZE ] += len;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MPI_Type_size(datatype, &datatype_size);
|
||||||
|
len = datatype_size * count;
|
||||||
|
|
||||||
|
#if BGL_PROFILE
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
if (fd->fp_sys_posn != offset)
|
||||||
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cr[ BGLMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2);
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cr[ BGLMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
/* individual file pointer not updated */
|
||||||
|
}
|
||||||
|
else { /* read from curr. location of ind. file pointer */
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
if (fd->fp_sys_posn != fd->fp_ind)
|
||||||
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cr[ BGLMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2);
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cr[ BGLMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_ind += err;
|
||||||
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* BGL_PROFILE */
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
|
if (fd->fp_sys_posn != offset)
|
||||||
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
/* individual file pointer not updated */
|
||||||
|
}
|
||||||
|
else { /* read from curr. location of ind. file pointer */
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
if (fd->fp_sys_posn != fd->fp_ind)
|
||||||
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_ind += err;
|
||||||
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* BGL_PROFILE */
|
||||||
|
|
||||||
|
#if BGL_PROFILE
|
||||||
|
if (bglmpio_timing) bglmpio_prof_cr[ BGLMPIO_CIO_T_MPIO_RW ] += (MPI_Wtime() - io_time);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**io", "**io %s", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
MPIR_Status_set_bytes(status, datatype, err);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define ADIOI_BUFFERED_READ \
|
||||||
|
{ \
|
||||||
|
if (req_off >= readbuf_off + readbuf_len) { \
|
||||||
|
readbuf_off = req_off; \
|
||||||
|
readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));\
|
||||||
|
lseek(fd->fd_sys, readbuf_off, SEEK_SET);\
|
||||||
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\
|
||||||
|
err = read(fd->fd_sys, readbuf, readbuf_len);\
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
} \
|
||||||
|
while (req_len > readbuf_off + readbuf_len - req_off) { \
|
||||||
|
partial_read = (int) (readbuf_off + readbuf_len - req_off); \
|
||||||
|
tmp_buf = (char *) ADIOI_Malloc(partial_read); \
|
||||||
|
memcpy(tmp_buf, readbuf+readbuf_len-partial_read, partial_read); \
|
||||||
|
ADIOI_Free(readbuf); \
|
||||||
|
readbuf = (char *) ADIOI_Malloc(partial_read + max_bufsize); \
|
||||||
|
memcpy(readbuf, tmp_buf, partial_read); \
|
||||||
|
ADIOI_Free(tmp_buf); \
|
||||||
|
readbuf_off += readbuf_len-partial_read; \
|
||||||
|
readbuf_len = (int) (partial_read + ADIOI_MIN(max_bufsize, \
|
||||||
|
end_offset-readbuf_off+1)); \
|
||||||
|
lseek(fd->fd_sys, readbuf_off+partial_read, SEEK_SET);\
|
||||||
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\
|
||||||
|
err = read(fd->fd_sys, readbuf+partial_read, readbuf_len-partial_read);\
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
} \
|
||||||
|
memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void ADIOI_BGL_ReadStrided(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code)
|
||||||
|
{
|
||||||
|
/* offset is in units of etype relative to the filetype. */
|
||||||
|
|
||||||
|
ADIOI_Flatlist_node *flat_buf, *flat_file;
|
||||||
|
int i, j, k, err=-1, brd_size, frd_size=0, st_index=0;
|
||||||
|
int bufsize, num, size, sum, n_etypes_in_filetype, size_in_filetype;
|
||||||
|
int n_filetypes, etype_in_filetype;
|
||||||
|
ADIO_Offset abs_off_in_filetype=0;
|
||||||
|
int filetype_size, etype_size, buftype_size, req_len, partial_read;
|
||||||
|
MPI_Aint filetype_extent, buftype_extent;
|
||||||
|
int buf_count, buftype_is_contig, filetype_is_contig;
|
||||||
|
ADIO_Offset userbuf_off;
|
||||||
|
ADIO_Offset off, req_off, disp, end_offset=0, readbuf_off, start_off;
|
||||||
|
char *readbuf, *tmp_buf, *value;
|
||||||
|
int flag, st_frd_size, st_n_filetypes, readbuf_len;
|
||||||
|
int new_brd_size, new_frd_size, err_flag=0, info_flag, max_bufsize;
|
||||||
|
|
||||||
|
static char myname[] = "ADIOI_BGL_READSTRIDED";
|
||||||
|
|
||||||
|
if (fd->hints->ds_read == ADIOI_HINT_DISABLE) {
|
||||||
|
/* if user has disabled data sieving on reads, use naive
|
||||||
|
* approach instead.
|
||||||
|
*/
|
||||||
|
/*FPRINTF(stderr, "ADIOI_GEN_ReadStrided_naive(%d):\n", __LINE__);*/
|
||||||
|
ADIOI_GEN_ReadStrided_naive(fd,
|
||||||
|
buf,
|
||||||
|
count,
|
||||||
|
datatype,
|
||||||
|
file_ptr_type,
|
||||||
|
offset,
|
||||||
|
status,
|
||||||
|
error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/*FPRINTF(stderr, "%s(%d):\n",myname, __LINE__);*/
|
||||||
|
|
||||||
|
ADIOI_Datatype_iscontig(datatype, &buftype_is_contig);
|
||||||
|
ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
|
||||||
|
|
||||||
|
MPI_Type_size(fd->filetype, &filetype_size);
|
||||||
|
if ( ! filetype_size ) {
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Type_extent(fd->filetype, &filetype_extent);
|
||||||
|
MPI_Type_size(datatype, &buftype_size);
|
||||||
|
MPI_Type_extent(datatype, &buftype_extent);
|
||||||
|
etype_size = fd->etype_size;
|
||||||
|
|
||||||
|
bufsize = buftype_size * count;
|
||||||
|
|
||||||
|
/* get max_bufsize from the info object. */
|
||||||
|
|
||||||
|
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
||||||
|
MPI_Info_get(fd->info, "ind_rd_buffer_size", MPI_MAX_INFO_VAL, value,
|
||||||
|
&info_flag);
|
||||||
|
max_bufsize = atoi(value);
|
||||||
|
ADIOI_Free(value);
|
||||||
|
|
||||||
|
if (!buftype_is_contig && filetype_is_contig) {
|
||||||
|
|
||||||
|
/* noncontiguous in memory, contiguous in file. */
|
||||||
|
|
||||||
|
ADIOI_Flatten_datatype(datatype);
|
||||||
|
flat_buf = ADIOI_Flatlist;
|
||||||
|
while (flat_buf->type != datatype) flat_buf = flat_buf->next;
|
||||||
|
|
||||||
|
off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind :
|
||||||
|
fd->disp + etype_size * offset;
|
||||||
|
|
||||||
|
start_off = off;
|
||||||
|
end_offset = off + bufsize - 1;
|
||||||
|
readbuf_off = off;
|
||||||
|
readbuf = (char *) ADIOI_Malloc(max_bufsize);
|
||||||
|
readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));
|
||||||
|
|
||||||
|
/* if atomicity is true, lock (exclusive) the region to be accessed */
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
lseek(fd->fd_sys, readbuf_off, SEEK_SET);
|
||||||
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);
|
||||||
|
err = read(fd->fd_sys, readbuf, readbuf_len);
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);
|
||||||
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
|
for (j=0; j<count; j++)
|
||||||
|
for (i=0; i<flat_buf->count; i++) {
|
||||||
|
userbuf_off = j*buftype_extent + flat_buf->indices[i];
|
||||||
|
req_off = off;
|
||||||
|
req_len = flat_buf->blocklens[i];
|
||||||
|
ADIOI_BUFFERED_READ
|
||||||
|
off += flat_buf->blocklens[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;
|
||||||
|
|
||||||
|
ADIOI_Free(readbuf); /* malloced in the buffered_read macro */
|
||||||
|
|
||||||
|
if (err_flag) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
else { /* noncontiguous in file */
|
||||||
|
|
||||||
|
/* filetype already flattened in ADIO_Open */
|
||||||
|
flat_file = ADIOI_Flatlist;
|
||||||
|
while (flat_file->type != fd->filetype) flat_file = flat_file->next;
|
||||||
|
disp = fd->disp;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
offset = fd->fp_ind; /* in bytes */
|
||||||
|
n_filetypes = -1;
|
||||||
|
flag = 0;
|
||||||
|
while (!flag) {
|
||||||
|
n_filetypes++;
|
||||||
|
for (i=0; i<flat_file->count; i++) {
|
||||||
|
if (disp + flat_file->indices[i] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent + flat_file->blocklens[i]
|
||||||
|
>= offset) {
|
||||||
|
st_index = i;
|
||||||
|
frd_size = (int) (disp + flat_file->indices[i] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent
|
||||||
|
+ flat_file->blocklens[i] - offset);
|
||||||
|
flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
n_etypes_in_filetype = filetype_size/etype_size;
|
||||||
|
n_filetypes = (int) (offset / n_etypes_in_filetype);
|
||||||
|
etype_in_filetype = (int) (offset % n_etypes_in_filetype);
|
||||||
|
size_in_filetype = etype_in_filetype * etype_size;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
for (i=0; i<flat_file->count; i++) {
|
||||||
|
sum += flat_file->blocklens[i];
|
||||||
|
if (sum > size_in_filetype) {
|
||||||
|
st_index = i;
|
||||||
|
frd_size = sum - size_in_filetype;
|
||||||
|
abs_off_in_filetype = flat_file->indices[i] +
|
||||||
|
size_in_filetype - (sum - flat_file->blocklens[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* abs. offset in bytes in the file */
|
||||||
|
offset = disp + (ADIO_Offset) n_filetypes*filetype_extent + abs_off_in_filetype;
|
||||||
|
}
|
||||||
|
|
||||||
|
start_off = offset;
|
||||||
|
|
||||||
|
/* Calculate end_offset, the last byte-offset that will be accessed.
|
||||||
|
e.g., if start_offset=0 and 100 bytes to be read, end_offset=99*/
|
||||||
|
|
||||||
|
st_frd_size = frd_size;
|
||||||
|
st_n_filetypes = n_filetypes;
|
||||||
|
i = 0;
|
||||||
|
j = st_index;
|
||||||
|
off = offset;
|
||||||
|
frd_size = ADIOI_MIN(st_frd_size, bufsize);
|
||||||
|
while (i < bufsize) {
|
||||||
|
i += frd_size;
|
||||||
|
end_offset = off + frd_size - 1;
|
||||||
|
|
||||||
|
if (j < (flat_file->count - 1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
off = disp + flat_file->indices[j] + (ADIO_Offset) n_filetypes*filetype_extent;
|
||||||
|
frd_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if atomicity is true, lock (exclusive) the region to be accessed */
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
/* initial read into readbuf */
|
||||||
|
readbuf_off = offset;
|
||||||
|
readbuf = (char *) ADIOI_Malloc(max_bufsize);
|
||||||
|
readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));
|
||||||
|
|
||||||
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, offset, SEEK_SET, readbuf_len);
|
||||||
|
err = read(fd->fd_sys, readbuf, readbuf_len);
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, offset, SEEK_SET, readbuf_len);
|
||||||
|
|
||||||
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
|
if (buftype_is_contig && !filetype_is_contig) {
|
||||||
|
|
||||||
|
/* contiguous in memory, noncontiguous in file. should be the most
|
||||||
|
common case. */
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
j = st_index;
|
||||||
|
off = offset;
|
||||||
|
n_filetypes = st_n_filetypes;
|
||||||
|
frd_size = ADIOI_MIN(st_frd_size, bufsize);
|
||||||
|
while (i < bufsize) {
|
||||||
|
if (frd_size) {
|
||||||
|
/* TYPE_UB and TYPE_LB can result in
|
||||||
|
frd_size = 0. save system call in such cases */
|
||||||
|
/* lseek(fd->fd_sys, off, SEEK_SET);
|
||||||
|
err = read(fd->fd_sys, ((char *) buf) + i, frd_size);*/
|
||||||
|
|
||||||
|
req_off = off;
|
||||||
|
req_len = frd_size;
|
||||||
|
userbuf_off = i;
|
||||||
|
ADIOI_BUFFERED_READ
|
||||||
|
}
|
||||||
|
i += frd_size;
|
||||||
|
|
||||||
|
if (off + frd_size < disp + flat_file->indices[j] +
|
||||||
|
flat_file->blocklens[j] + (ADIO_Offset) n_filetypes*filetype_extent)
|
||||||
|
off += frd_size;
|
||||||
|
/* did not reach end of contiguous block in filetype.
|
||||||
|
no more I/O needed. off is incremented by frd_size. */
|
||||||
|
else {
|
||||||
|
if (j < (flat_file->count - 1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
|
off = disp + flat_file->indices[j] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent;
|
||||||
|
frd_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* noncontiguous in memory as well as in file */
|
||||||
|
|
||||||
|
ADIOI_Flatten_datatype(datatype);
|
||||||
|
flat_buf = ADIOI_Flatlist;
|
||||||
|
while (flat_buf->type != datatype) flat_buf = flat_buf->next;
|
||||||
|
|
||||||
|
k = num = buf_count = 0;
|
||||||
|
i = (int) (flat_buf->indices[0]);
|
||||||
|
j = st_index;
|
||||||
|
off = offset;
|
||||||
|
n_filetypes = st_n_filetypes;
|
||||||
|
frd_size = st_frd_size;
|
||||||
|
brd_size = flat_buf->blocklens[0];
|
||||||
|
|
||||||
|
while (num < bufsize) {
|
||||||
|
size = ADIOI_MIN(frd_size, brd_size);
|
||||||
|
if (size) {
|
||||||
|
/* lseek(fd->fd_sys, off, SEEK_SET);
|
||||||
|
err = read(fd->fd_sys, ((char *) buf) + i, size); */
|
||||||
|
|
||||||
|
req_off = off;
|
||||||
|
req_len = size;
|
||||||
|
userbuf_off = i;
|
||||||
|
ADIOI_BUFFERED_READ
|
||||||
|
}
|
||||||
|
|
||||||
|
new_frd_size = frd_size;
|
||||||
|
new_brd_size = brd_size;
|
||||||
|
|
||||||
|
if (size == frd_size) {
|
||||||
|
/* reached end of contiguous block in file */
|
||||||
|
if (j < (flat_file->count - 1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
off = disp + flat_file->indices[j] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent;
|
||||||
|
|
||||||
|
new_frd_size = flat_file->blocklens[j];
|
||||||
|
if (size != brd_size) {
|
||||||
|
i += size;
|
||||||
|
new_brd_size -= size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == brd_size) {
|
||||||
|
/* reached end of contiguous block in memory */
|
||||||
|
|
||||||
|
k = (k + 1)%flat_buf->count;
|
||||||
|
buf_count++;
|
||||||
|
i = (int) (buftype_extent*(buf_count/flat_buf->count) +
|
||||||
|
flat_buf->indices[k]);
|
||||||
|
new_brd_size = flat_buf->blocklens[k];
|
||||||
|
if (size != frd_size) {
|
||||||
|
off += size;
|
||||||
|
new_frd_size -= size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num += size;
|
||||||
|
frd_size = new_frd_size;
|
||||||
|
brd_size = new_brd_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;
|
||||||
|
|
||||||
|
ADIOI_Free(readbuf); /* malloced in the buffered_read macro */
|
||||||
|
|
||||||
|
if (err_flag) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd->fp_sys_posn = -1; /* set it to null. */
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
MPIR_Status_set_bytes(status, datatype, bufsize);
|
||||||
|
/* This is a temporary way of filling in status. The right way is to
|
||||||
|
keep track of how much data was actually read and placed in buf
|
||||||
|
by ADIOI_BUFFERED_READ. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!buftype_is_contig) ADIOI_Delete_flattened(datatype);
|
||||||
|
}
|
68
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_setsh.c
Обычный файл
68
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_setsh.c
Обычный файл
@ -0,0 +1,68 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_setsh.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
|
||||||
|
/* set the shared file pointer to "offset" etypes relative to the current
|
||||||
|
view */
|
||||||
|
|
||||||
|
/*
|
||||||
|
This looks very similar to ADIOI_GEN_Set_shared_fp, except this
|
||||||
|
function avoids locking the file twice. The generic version does
|
||||||
|
|
||||||
|
Write lock
|
||||||
|
ADIO_WriteContig
|
||||||
|
Unlock
|
||||||
|
|
||||||
|
For BGL, ADIOI_BGL_WriteContig does a lock before writing to disable
|
||||||
|
caching. To avoid the lock being called twice, this version for BGL does
|
||||||
|
|
||||||
|
Write lock
|
||||||
|
Lseek
|
||||||
|
Write
|
||||||
|
Unlock
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
void ADIOI_BGL_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
MPI_Comm dupcommself;
|
||||||
|
static char myname[] = "ADIOI_BGL_SET_SHARED_FP";
|
||||||
|
|
||||||
|
if (fd->shared_fp_fd == ADIO_FILE_NULL) {
|
||||||
|
MPI_Comm_dup(MPI_COMM_SELF, &dupcommself);
|
||||||
|
fd->shared_fp_fd = ADIO_Open(MPI_COMM_SELF, dupcommself,
|
||||||
|
fd->shared_fp_fname,
|
||||||
|
fd->file_system, fd->fns,
|
||||||
|
ADIO_CREATE | ADIO_RDWR | ADIO_DELETE_ON_CLOSE,
|
||||||
|
0, MPI_BYTE, MPI_BYTE, MPI_INFO_NULL,
|
||||||
|
ADIO_PERM_NULL, error_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
|
|
||||||
|
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
||||||
|
err = write(fd->shared_fp_fd->fd_sys, &offset, sizeof(ADIO_Offset));
|
||||||
|
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
104
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.c
Обычный файл
104
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.c
Обычный файл
@ -0,0 +1,104 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_tuning.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------
|
||||||
|
* ad_bgl_tuning.c
|
||||||
|
*
|
||||||
|
* defines global variables and functions for performance tuning and
|
||||||
|
* functional debugging.
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "ad_bgl_tuning.h"
|
||||||
|
#include "mpi.h"
|
||||||
|
|
||||||
|
int bglmpio_timing;
|
||||||
|
int bglmpio_timing2;
|
||||||
|
int bglmpio_comm;
|
||||||
|
int bglmpio_tunegather;
|
||||||
|
int bglmpio_tuneblocking;
|
||||||
|
|
||||||
|
double bglmpio_prof_cw [BGLMPIO_CIO_LAST];
|
||||||
|
double bglmpio_prof_cr [BGLMPIO_CIO_LAST];
|
||||||
|
|
||||||
|
/* set internal variables for tuning environment variables */
|
||||||
|
void ad_bgl_get_env_vars() {
|
||||||
|
char *x;
|
||||||
|
|
||||||
|
bglmpio_comm = 0;
|
||||||
|
x = getenv( "BGLMPIO_COMM" );
|
||||||
|
if (x) bglmpio_comm = atoi(x);
|
||||||
|
bglmpio_timing = 0;
|
||||||
|
x = getenv( "BGLMPIO_TIMING" );
|
||||||
|
if (x) bglmpio_timing = atoi(x);
|
||||||
|
bglmpio_timing2 = 0;
|
||||||
|
x = getenv( "BGLMPIO_TIMING2" );
|
||||||
|
if (x) bglmpio_timing2 = atoi(x);
|
||||||
|
bglmpio_tunegather = 1;
|
||||||
|
x = getenv( "BGLMPIO_TUNEGATHER" );
|
||||||
|
if (x) bglmpio_tunegather = atoi(x);
|
||||||
|
bglmpio_tuneblocking = 1;
|
||||||
|
x = getenv( "BGLMPIO_TUNEBLOCKING" );
|
||||||
|
if (x) bglmpio_tuneblocking = atoi(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* report timing breakdown for MPI I/O collective call */
|
||||||
|
void ad_bgl_wr_timing_report( int rw, ADIO_File fd, int myrank, int nprocs )
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (bglmpio_timing) {
|
||||||
|
|
||||||
|
double *bglmpio_prof_org = bglmpio_prof_cr;
|
||||||
|
if (rw) bglmpio_prof_org = bglmpio_prof_cw;
|
||||||
|
|
||||||
|
double bglmpio_prof_avg[ BGLMPIO_CIO_LAST ];
|
||||||
|
double bglmpio_prof_max[ BGLMPIO_CIO_LAST ];
|
||||||
|
|
||||||
|
MPI_Reduce( bglmpio_prof_org, bglmpio_prof_avg, BGLMPIO_CIO_LAST, MPI_DOUBLE, MPI_SUM, 0, fd->comm );
|
||||||
|
MPI_Reduce( bglmpio_prof_org, bglmpio_prof_max, BGLMPIO_CIO_LAST, MPI_DOUBLE, MPI_MAX, 0, fd->comm );
|
||||||
|
|
||||||
|
if (myrank == 0) {
|
||||||
|
|
||||||
|
for (i=0; i<BGLMPIO_CIO_LAST; i++) bglmpio_prof_avg[i] /= nprocs;
|
||||||
|
|
||||||
|
if (bglmpio_timing2) {
|
||||||
|
bglmpio_prof_avg[ BGLMPIO_CIO_B_POSI_RW ] = bglmpio_prof_avg[ BGLMPIO_CIO_DATA_SIZE ] * nprocs /
|
||||||
|
bglmpio_prof_max[ BGLMPIO_CIO_T_POSI_RW ];
|
||||||
|
bglmpio_prof_avg[ BGLMPIO_CIO_B_MPIO_RW ] = bglmpio_prof_avg[ BGLMPIO_CIO_DATA_SIZE ] * nprocs /
|
||||||
|
bglmpio_prof_max[ BGLMPIO_CIO_T_MPIO_RW ];
|
||||||
|
} else {
|
||||||
|
|
||||||
|
bglmpio_prof_avg[ BGLMPIO_CIO_B_POSI_RW ] = 0;
|
||||||
|
bglmpio_prof_avg[ BGLMPIO_CIO_B_MPIO_RW ] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bglmpio_prof_avg[ BGLMPIO_CIO_B_MPIO_CRW ] = bglmpio_prof_avg[ BGLMPIO_CIO_DATA_SIZE ] * nprocs /
|
||||||
|
bglmpio_prof_max[ BGLMPIO_CIO_T_MPIO_CRW ];
|
||||||
|
|
||||||
|
printf("\tTIMING-1 %1s , ", (rw ? "W" : "R") );
|
||||||
|
printf( "SZ: %12.4f , ", bglmpio_prof_avg[ BGLMPIO_CIO_DATA_SIZE ] * nprocs );
|
||||||
|
printf( "SK-a: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_SEEK ] );
|
||||||
|
printf( "SK-m: %10.3f , ", bglmpio_prof_max[ BGLMPIO_CIO_T_SEEK ] );
|
||||||
|
printf( "LC-a: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_LCOMP ] );
|
||||||
|
printf( "GA-m: %10.3f , ", bglmpio_prof_max[ BGLMPIO_CIO_T_GATHER ] );
|
||||||
|
printf( "AN-a: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_PATANA ] );
|
||||||
|
printf( "FD-a: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_FD_PART ] );
|
||||||
|
printf( "MY-a: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_MYREQ ] );
|
||||||
|
printf( "OT-m: %10.3f , ", bglmpio_prof_max[ BGLMPIO_CIO_T_OTHREQ ] );
|
||||||
|
printf( "EX-m: %10.3f , ", bglmpio_prof_max[ BGLMPIO_CIO_T_DEXCH ] );
|
||||||
|
printf("\tTIMING-2 %1s , ", (rw ? "W" : "R") );
|
||||||
|
printf( "PXT-m: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_POSI_RW ] );
|
||||||
|
printf( "MPT-m: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_MPIO_RW ] );
|
||||||
|
printf("MPTC-m: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_T_MPIO_CRW ] );
|
||||||
|
printf( "PXB: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_B_POSI_RW ] );
|
||||||
|
printf( "MPB: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_B_MPIO_RW ] );
|
||||||
|
printf( "MPBC: %10.3f , ", bglmpio_prof_avg[ BGLMPIO_CIO_B_MPIO_CRW ] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
94
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.h
Обычный файл
94
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_tuning.h
Обычный файл
@ -0,0 +1,94 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_tuning.h
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------
|
||||||
|
* ad_bgl_tuning.h
|
||||||
|
*
|
||||||
|
* declares global variables and macros for performance tuning and
|
||||||
|
* functional debugging.
|
||||||
|
*---------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef AD_BGL_TUNING_H_
|
||||||
|
#define AD_BGL_TUNING_H_
|
||||||
|
|
||||||
|
#include "adio.h"
|
||||||
|
|
||||||
|
#define AD_BGL_assert( a ) if (!(a)) { \
|
||||||
|
fprintf( stderr, "AD_BGL_assert, file=%s, line=%d\n", __FILE__, __LINE__ ); \
|
||||||
|
MPI_Abort( MPI_COMM_WORLD, 1 ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------
|
||||||
|
* Global variables for the control of
|
||||||
|
* 1. timing
|
||||||
|
* 2. select specific optimizations
|
||||||
|
*-----------------------------------------*/
|
||||||
|
|
||||||
|
/* timing fields */
|
||||||
|
enum {
|
||||||
|
BGLMPIO_CIO_DATA_SIZE=0,
|
||||||
|
BGLMPIO_CIO_T_SEEK,
|
||||||
|
BGLMPIO_CIO_T_LCOMP, /* time for ADIOI_Calc_my_off_len(), local */
|
||||||
|
BGLMPIO_CIO_T_GATHER, /* time for previous MPI_Allgather, now Allreduce */
|
||||||
|
BGLMPIO_CIO_T_PATANA, /* time for a quick test if access is contiguous or not, local */
|
||||||
|
BGLMPIO_CIO_T_FD_PART, /* time for file domain partitioning, local */
|
||||||
|
BGLMPIO_CIO_T_MYREQ, /* time for ADIOI_BGL_Calc_my_req(), local */
|
||||||
|
BGLMPIO_CIO_T_OTHREQ, /* time for ADIOI_Calc_others_req(), short Alltoall */
|
||||||
|
BGLMPIO_CIO_T_DEXCH, /* time for I/O data exchange */
|
||||||
|
BGLMPIO_CIO_T_POSI_RW,
|
||||||
|
BGLMPIO_CIO_B_POSI_RW,
|
||||||
|
BGLMPIO_CIO_T_MPIO_RW, /* time for ADIOI_BGL_WriteContig() */
|
||||||
|
BGLMPIO_CIO_B_MPIO_RW,
|
||||||
|
BGLMPIO_CIO_T_MPIO_CRW, /* time for ADIOI_BGL_WriteStridedColl() */
|
||||||
|
BGLMPIO_CIO_B_MPIO_CRW,
|
||||||
|
BGLMPIO_CIO_LAST
|
||||||
|
};
|
||||||
|
|
||||||
|
extern double bglmpio_prof_cw [BGLMPIO_CIO_LAST];
|
||||||
|
extern double bglmpio_prof_cr [BGLMPIO_CIO_LAST];
|
||||||
|
|
||||||
|
|
||||||
|
/* corresponds to environment variables to select optimizations and timing level */
|
||||||
|
extern int bglmpio_timing;
|
||||||
|
extern int bglmpio_timing2;
|
||||||
|
extern int bglmpio_comm;
|
||||||
|
extern int bglmpio_tunegather;
|
||||||
|
extern int bglmpio_tuneblocking;
|
||||||
|
|
||||||
|
|
||||||
|
/* set internal variables for tuning environment variables */
|
||||||
|
void ad_bgl_get_env_vars();
|
||||||
|
|
||||||
|
/* report timing breakdown for MPI I/O collective call */
|
||||||
|
void ad_bgl_timing_crw_report( int rw, ADIO_File fd, int myrank, int nprocs );
|
||||||
|
|
||||||
|
/* note:
|
||||||
|
* T := timing;
|
||||||
|
* CIO := collective I/O
|
||||||
|
*/
|
||||||
|
#define BGLMPIO_T_CIO_RESET( LEVEL, RW ) \
|
||||||
|
if (bglmpio_timing_cw_level >= LEVEL) { \
|
||||||
|
int i; \
|
||||||
|
for ( i = 0; i < BGLMPIO_T_LAST; i ++ ) \
|
||||||
|
bglmpio_prof_c##RW [ i ] = 0; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BGLMPIO_T_CIO_REPORT( LEVEL, RW, FD, MYRANK, NPROCS ) \
|
||||||
|
if (bglmpio_timing_cw_level >= LEVEL) { \
|
||||||
|
ad_bgl_timing_crw_report ( RW, FD, MYRANK, NPROCS ); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define BGLMPIO_T_CIO_SET_GET( LEVEL, RW, DOBAR, ISSET, ISGET, VAR1, VAR2 ) \
|
||||||
|
if (bglmpio_timing_cw_level >= LEVEL) { \
|
||||||
|
if ( DOBAR ) MPI_Barrier( fd->comm ); \
|
||||||
|
double temp = MPI_Wtime(); \
|
||||||
|
if ( ISSET ) bglmpio_prof_c##RW [ VAR1 ] = temp; \
|
||||||
|
if ( ISGET ) bglmpio_prof_c##RW [ VAR2 ] = temp - bglmpio_prof_c##RW [ VAR2 ] ; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* AD_BGL_TUNING_H_ */
|
1451
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c
Обычный файл
1451
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_wrcoll.c
Обычный файл
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
546
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_write.c
Обычный файл
546
ompi/mca/io/romio/romio/adio/ad_bgl/ad_bgl_write.c
Обычный файл
@ -0,0 +1,546 @@
|
|||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/* (C)Copyright IBM Corp. 2007, 2008 */
|
||||||
|
/* ---------------------------------------------------------------- */
|
||||||
|
/**
|
||||||
|
* \file ad_bgl_write.c
|
||||||
|
* \brief ???
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_bgl.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
|
||||||
|
#include "ad_bgl_tuning.h"
|
||||||
|
|
||||||
|
void ADIOI_BGL_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int *error_code)
|
||||||
|
{
|
||||||
|
int err=-1, datatype_size, len;
|
||||||
|
static char myname[] = "ADIOI_BGL_WRITECONTIG";
|
||||||
|
|
||||||
|
#if BGL_PROFILE
|
||||||
|
/* timing */
|
||||||
|
double io_time, io_time2;
|
||||||
|
|
||||||
|
if (bglmpio_timing) {
|
||||||
|
io_time = MPI_Wtime();
|
||||||
|
bglmpio_prof_cw[ BGLMPIO_CIO_DATA_SIZE ] += len;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
MPI_Type_size(datatype, &datatype_size);
|
||||||
|
len = datatype_size * count;
|
||||||
|
|
||||||
|
#if BGL_PROFILE
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
if (fd->fp_sys_posn != offset)
|
||||||
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cw[ BGLMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2);
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cw[ BGLMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
/* individual file pointer not updated */
|
||||||
|
}
|
||||||
|
else { /* write from curr. location of ind. file pointer */
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
if (fd->fp_sys_posn != fd->fp_ind)
|
||||||
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cw[ BGLMPIO_CIO_T_SEEK ] += (MPI_Wtime() - io_time2);
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
if (bglmpio_timing2) io_time2 = MPI_Wtime();
|
||||||
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
if (bglmpio_timing2) bglmpio_prof_cw[ BGLMPIO_CIO_T_POSI_RW ] += (MPI_Wtime() - io_time2);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_ind += err;
|
||||||
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else /* BGL_PROFILE */
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
|
if (fd->fp_sys_posn != offset)
|
||||||
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
/* individual file pointer not updated */
|
||||||
|
}
|
||||||
|
else { /* write from curr. location of ind. file pointer */
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
if (fd->fp_sys_posn != fd->fp_ind)
|
||||||
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
|
fd->fp_ind += err;
|
||||||
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* BGL_PROFILE */
|
||||||
|
|
||||||
|
#if BGL_PROFILE
|
||||||
|
if (bglmpio_timing) bglmpio_prof_cw[ BGLMPIO_CIO_T_MPIO_RW ] += (MPI_Wtime() - io_time);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
MPIR_Status_set_bytes(status, datatype, err);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define ADIOI_BUFFERED_WRITE \
|
||||||
|
{ \
|
||||||
|
if (req_off >= writebuf_off + writebuf_len) { \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
writebuf_off = req_off; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
err = read(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
if (err == -1) { \
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, \
|
||||||
|
MPIR_ERR_RECOVERABLE, myname, \
|
||||||
|
__LINE__, MPI_ERR_IO, \
|
||||||
|
"**ioRMWrdwr", 0); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
write_sz = (int) (ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off)); \
|
||||||
|
memcpy(writebuf+req_off-writebuf_off, (char *)buf +userbuf_off, write_sz);\
|
||||||
|
while (write_sz != req_len) { \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
req_len -= write_sz; \
|
||||||
|
userbuf_off += write_sz; \
|
||||||
|
writebuf_off += writebuf_len; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
err = read(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
if (err == -1) { \
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, \
|
||||||
|
MPIR_ERR_RECOVERABLE, myname, \
|
||||||
|
__LINE__, MPI_ERR_IO, \
|
||||||
|
"**ioRMWrdwr", 0); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
write_sz = ADIOI_MIN(req_len, writebuf_len); \
|
||||||
|
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* this macro is used when filetype is contig and buftype is not contig.
|
||||||
|
it does not do a read-modify-write and does not lock*/
|
||||||
|
#define ADIOI_BUFFERED_WRITE_WITHOUT_READ \
|
||||||
|
{ \
|
||||||
|
if (req_off >= writebuf_off + writebuf_len) { \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
writebuf_off = req_off; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
} \
|
||||||
|
write_sz = (int) (ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off)); \
|
||||||
|
memcpy(writebuf+req_off-writebuf_off, (char *)buf +userbuf_off, write_sz);\
|
||||||
|
while (write_sz != req_len) { \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
req_len -= write_sz; \
|
||||||
|
userbuf_off += write_sz; \
|
||||||
|
writebuf_off += writebuf_len; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
write_sz = ADIOI_MIN(req_len, writebuf_len); \
|
||||||
|
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ADIOI_BGL_WriteStrided(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code)
|
||||||
|
{
|
||||||
|
/* offset is in units of etype relative to the filetype. */
|
||||||
|
|
||||||
|
ADIOI_Flatlist_node *flat_buf, *flat_file;
|
||||||
|
int i, j, k, err=-1, bwr_size, fwr_size=0, st_index=0;
|
||||||
|
int bufsize, num, size, sum, n_etypes_in_filetype, size_in_filetype;
|
||||||
|
int n_filetypes, etype_in_filetype;
|
||||||
|
ADIO_Offset abs_off_in_filetype=0;
|
||||||
|
int filetype_size, etype_size, buftype_size, req_len;
|
||||||
|
MPI_Aint filetype_extent, buftype_extent;
|
||||||
|
int buf_count, buftype_is_contig, filetype_is_contig;
|
||||||
|
ADIO_Offset userbuf_off;
|
||||||
|
ADIO_Offset off, req_off, disp, end_offset=0, writebuf_off, start_off;
|
||||||
|
char *writebuf, *value;
|
||||||
|
int flag, st_fwr_size, st_n_filetypes, writebuf_len, write_sz;
|
||||||
|
int new_bwr_size, new_fwr_size, err_flag=0, info_flag, max_bufsize;
|
||||||
|
static char myname[] = "ADIOI_BGL_WRITESTRIDED";
|
||||||
|
|
||||||
|
if (fd->hints->ds_write == ADIOI_HINT_DISABLE) {
|
||||||
|
/* if user has disabled data sieving on reads, use naive
|
||||||
|
* approach instead.
|
||||||
|
*/
|
||||||
|
/*FPRINTF(stderr, "ADIOI_GEN_WriteStrided_naive(%d):\n", __LINE__);*/
|
||||||
|
ADIOI_GEN_WriteStrided_naive(fd,
|
||||||
|
buf,
|
||||||
|
count,
|
||||||
|
datatype,
|
||||||
|
file_ptr_type,
|
||||||
|
offset,
|
||||||
|
status,
|
||||||
|
error_code);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/*FPRINTF(stderr, "%s(%d):\n",myname, __LINE__);*/
|
||||||
|
|
||||||
|
ADIOI_Datatype_iscontig(datatype, &buftype_is_contig);
|
||||||
|
ADIOI_Datatype_iscontig(fd->filetype, &filetype_is_contig);
|
||||||
|
|
||||||
|
MPI_Type_size(fd->filetype, &filetype_size);
|
||||||
|
if ( ! filetype_size ) {
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Type_extent(fd->filetype, &filetype_extent);
|
||||||
|
MPI_Type_size(datatype, &buftype_size);
|
||||||
|
MPI_Type_extent(datatype, &buftype_extent);
|
||||||
|
etype_size = fd->etype_size;
|
||||||
|
|
||||||
|
bufsize = buftype_size * count;
|
||||||
|
|
||||||
|
/* get max_bufsize from the info object. */
|
||||||
|
|
||||||
|
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
||||||
|
MPI_Info_get(fd->info, "ind_wr_buffer_size", MPI_MAX_INFO_VAL, value,
|
||||||
|
&info_flag);
|
||||||
|
max_bufsize = atoi(value);
|
||||||
|
ADIOI_Free(value);
|
||||||
|
|
||||||
|
if (!buftype_is_contig && filetype_is_contig) {
|
||||||
|
|
||||||
|
/* noncontiguous in memory, contiguous in file. */
|
||||||
|
|
||||||
|
ADIOI_Flatten_datatype(datatype);
|
||||||
|
flat_buf = ADIOI_Flatlist;
|
||||||
|
while (flat_buf->type != datatype) flat_buf = flat_buf->next;
|
||||||
|
|
||||||
|
off = (file_ptr_type == ADIO_INDIVIDUAL) ? fd->fp_ind :
|
||||||
|
fd->disp + etype_size * offset;
|
||||||
|
|
||||||
|
start_off = off;
|
||||||
|
end_offset = off + bufsize - 1;
|
||||||
|
writebuf_off = off;
|
||||||
|
writebuf = (char *) ADIOI_Malloc(max_bufsize);
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));
|
||||||
|
|
||||||
|
/* if atomicity is true, lock the region to be accessed */
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
for (j=0; j<count; j++)
|
||||||
|
for (i=0; i<flat_buf->count; i++) {
|
||||||
|
userbuf_off = j*buftype_extent + flat_buf->indices[i];
|
||||||
|
req_off = off;
|
||||||
|
req_len = flat_buf->blocklens[i];
|
||||||
|
ADIOI_BUFFERED_WRITE_WITHOUT_READ
|
||||||
|
off += flat_buf->blocklens[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write the buffer out finally */
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len);
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
ADIOI_Free(writebuf); /* malloced in the buffered_write macro */
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;
|
||||||
|
if (err_flag) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
else { /* noncontiguous in file */
|
||||||
|
|
||||||
|
/* filetype already flattened in ADIO_Open */
|
||||||
|
flat_file = ADIOI_Flatlist;
|
||||||
|
while (flat_file->type != fd->filetype) flat_file = flat_file->next;
|
||||||
|
disp = fd->disp;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
offset = fd->fp_ind; /* in bytes */
|
||||||
|
n_filetypes = -1;
|
||||||
|
flag = 0;
|
||||||
|
while (!flag) {
|
||||||
|
n_filetypes++;
|
||||||
|
for (i=0; i<flat_file->count; i++) {
|
||||||
|
if (disp + flat_file->indices[i] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent + flat_file->blocklens[i]
|
||||||
|
>= offset) {
|
||||||
|
st_index = i;
|
||||||
|
fwr_size = (int) (disp + flat_file->indices[i] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent
|
||||||
|
+ flat_file->blocklens[i] - offset);
|
||||||
|
flag = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
n_etypes_in_filetype = filetype_size/etype_size;
|
||||||
|
n_filetypes = (int) (offset / n_etypes_in_filetype);
|
||||||
|
etype_in_filetype = (int) (offset % n_etypes_in_filetype);
|
||||||
|
size_in_filetype = etype_in_filetype * etype_size;
|
||||||
|
|
||||||
|
sum = 0;
|
||||||
|
for (i=0; i<flat_file->count; i++) {
|
||||||
|
sum += flat_file->blocklens[i];
|
||||||
|
if (sum > size_in_filetype) {
|
||||||
|
st_index = i;
|
||||||
|
fwr_size = sum - size_in_filetype;
|
||||||
|
abs_off_in_filetype = flat_file->indices[i] +
|
||||||
|
size_in_filetype - (sum - flat_file->blocklens[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* abs. offset in bytes in the file */
|
||||||
|
offset = disp + (ADIO_Offset) n_filetypes*filetype_extent + abs_off_in_filetype;
|
||||||
|
}
|
||||||
|
|
||||||
|
start_off = offset;
|
||||||
|
|
||||||
|
/* Calculate end_offset, the last byte-offset that will be accessed.
|
||||||
|
e.g., if start_offset=0 and 100 bytes to be write, end_offset=99*/
|
||||||
|
|
||||||
|
st_fwr_size = fwr_size;
|
||||||
|
st_n_filetypes = n_filetypes;
|
||||||
|
i = 0;
|
||||||
|
j = st_index;
|
||||||
|
off = offset;
|
||||||
|
fwr_size = ADIOI_MIN(st_fwr_size, bufsize);
|
||||||
|
while (i < bufsize) {
|
||||||
|
i += fwr_size;
|
||||||
|
end_offset = off + fwr_size - 1;
|
||||||
|
|
||||||
|
if (j < (flat_file->count - 1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
off = disp + flat_file->indices[j] + (ADIO_Offset) n_filetypes*filetype_extent;
|
||||||
|
fwr_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if atomicity is true, lock the region to be accessed */
|
||||||
|
if (fd->atomicity)
|
||||||
|
ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
/* initial read for the read-modify-write */
|
||||||
|
writebuf_off = offset;
|
||||||
|
writebuf = (char *) ADIOI_Malloc(max_bufsize);
|
||||||
|
writebuf_len = (int)(ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
||||||
|
err = read(fd->fd_sys, writebuf, writebuf_len);
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_IO,
|
||||||
|
"ADIOI_BGL_WriteStrided: ROMIO tries to optimize this access by doing a read-modify-write, but is unable to read the file. Please give the file read permission and open it with MPI_MODE_RDWR.", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buftype_is_contig && !filetype_is_contig) {
|
||||||
|
|
||||||
|
/* contiguous in memory, noncontiguous in file. should be the most
|
||||||
|
common case. */
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
j = st_index;
|
||||||
|
off = offset;
|
||||||
|
n_filetypes = st_n_filetypes;
|
||||||
|
fwr_size = ADIOI_MIN(st_fwr_size, bufsize);
|
||||||
|
while (i < bufsize) {
|
||||||
|
if (fwr_size) {
|
||||||
|
/* TYPE_UB and TYPE_LB can result in
|
||||||
|
fwr_size = 0. save system call in such cases */
|
||||||
|
/* lseek(fd->fd_sys, off, SEEK_SET);
|
||||||
|
err = write(fd->fd_sys, ((char *) buf) + i, fwr_size);*/
|
||||||
|
|
||||||
|
req_off = off;
|
||||||
|
req_len = fwr_size;
|
||||||
|
userbuf_off = i;
|
||||||
|
ADIOI_BUFFERED_WRITE
|
||||||
|
}
|
||||||
|
i += fwr_size;
|
||||||
|
|
||||||
|
if (off + fwr_size < disp + flat_file->indices[j] +
|
||||||
|
flat_file->blocklens[j] + (ADIO_Offset) n_filetypes*filetype_extent)
|
||||||
|
off += fwr_size;
|
||||||
|
/* did not reach end of contiguous block in filetype.
|
||||||
|
no more I/O needed. off is incremented by fwr_size. */
|
||||||
|
else {
|
||||||
|
if (j < (flat_file->count - 1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
|
off = disp + flat_file->indices[j] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent;
|
||||||
|
fwr_size = ADIOI_MIN(flat_file->blocklens[j], bufsize-i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
/* noncontiguous in memory as well as in file */
|
||||||
|
|
||||||
|
ADIOI_Flatten_datatype(datatype);
|
||||||
|
flat_buf = ADIOI_Flatlist;
|
||||||
|
while (flat_buf->type != datatype) flat_buf = flat_buf->next;
|
||||||
|
|
||||||
|
k = num = buf_count = 0;
|
||||||
|
i = (int) (flat_buf->indices[0]);
|
||||||
|
j = st_index;
|
||||||
|
off = offset;
|
||||||
|
n_filetypes = st_n_filetypes;
|
||||||
|
fwr_size = st_fwr_size;
|
||||||
|
bwr_size = flat_buf->blocklens[0];
|
||||||
|
|
||||||
|
while (num < bufsize) {
|
||||||
|
size = ADIOI_MIN(fwr_size, bwr_size);
|
||||||
|
if (size) {
|
||||||
|
/* lseek(fd->fd_sys, off, SEEK_SET);
|
||||||
|
err = write(fd->fd_sys, ((char *) buf) + i, size); */
|
||||||
|
|
||||||
|
req_off = off;
|
||||||
|
req_len = size;
|
||||||
|
userbuf_off = i;
|
||||||
|
ADIOI_BUFFERED_WRITE
|
||||||
|
}
|
||||||
|
|
||||||
|
new_fwr_size = fwr_size;
|
||||||
|
new_bwr_size = bwr_size;
|
||||||
|
|
||||||
|
if (size == fwr_size) {
|
||||||
|
/* reached end of contiguous block in file */
|
||||||
|
if (j < (flat_file->count - 1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
off = disp + flat_file->indices[j] +
|
||||||
|
(ADIO_Offset) n_filetypes*filetype_extent;
|
||||||
|
|
||||||
|
new_fwr_size = flat_file->blocklens[j];
|
||||||
|
if (size != bwr_size) {
|
||||||
|
i += size;
|
||||||
|
new_bwr_size -= size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size == bwr_size) {
|
||||||
|
/* reached end of contiguous block in memory */
|
||||||
|
|
||||||
|
k = (k + 1)%flat_buf->count;
|
||||||
|
buf_count++;
|
||||||
|
i = (int) (buftype_extent*(buf_count/flat_buf->count) +
|
||||||
|
flat_buf->indices[k]);
|
||||||
|
new_bwr_size = flat_buf->blocklens[k];
|
||||||
|
if (size != fwr_size) {
|
||||||
|
off += size;
|
||||||
|
new_fwr_size -= size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num += size;
|
||||||
|
fwr_size = new_fwr_size;
|
||||||
|
bwr_size = new_bwr_size;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* write the buffer out finally */
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len);
|
||||||
|
|
||||||
|
if (!(fd->atomicity))
|
||||||
|
ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
else ADIOI_UNLOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
|
ADIOI_Free(writebuf); /* malloced in the buffered_write macro */
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind = off;
|
||||||
|
if (err_flag) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd->fp_sys_posn = -1; /* set it to null. */
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
MPIR_Status_set_bytes(status, datatype, bufsize);
|
||||||
|
/* This is a temporary way of filling in status. The right way is to
|
||||||
|
keep track of how much data was actually written by ADIOI_BUFFERED_WRITE. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (!buftype_is_contig) ADIOI_Delete_flattened(datatype);
|
||||||
|
}
|
7
ompi/mca/io/romio/romio/adio/ad_bglockless/.state-cache
Обычный файл
7
ompi/mca/io/romio/romio/adio/ad_bglockless/.state-cache
Обычный файл
@ -0,0 +1,7 @@
|
|||||||
|
<dir>
|
||||||
|
<file name="ad_bglockless.c" info="1205188711"/>
|
||||||
|
</dir>
|
||||||
|
<data>
|
||||||
|
<fileinfo name="ad_bglockless.c">
|
||||||
|
</fileinfo>
|
||||||
|
</data>
|
24
ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.am
Обычный файл
24
ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.am
Обычный файл
@ -0,0 +1,24 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||||
|
# University Research and Technology
|
||||||
|
# Corporation. All rights reserved.
|
||||||
|
# Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||||
|
# of Tennessee Research Foundation. All rights
|
||||||
|
# reserved.
|
||||||
|
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||||
|
# University of Stuttgart. All rights reserved.
|
||||||
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||||
|
# $COPYRIGHT$
|
||||||
|
#
|
||||||
|
# Additional copyrights may follow
|
||||||
|
#
|
||||||
|
# $HEADER$
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(top_srcdir)/Makefile.options
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libadio_bglockless.la
|
||||||
|
libadio_bglockless_la_SOURCES = \
|
||||||
|
ad_bglockless.c
|
49
ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.in
Обычный файл
49
ompi/mca/io/romio/romio/adio/ad_bglockless/Makefile.in
Обычный файл
@ -0,0 +1,49 @@
|
|||||||
|
CC = @CC@
|
||||||
|
AR = @AR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
LIBNAME = @LIBNAME@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
CC_SHL = @CC_SHL@
|
||||||
|
SHLIBNAME = @SHLIBNAME@
|
||||||
|
|
||||||
|
INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I${srcdir}/../include -I../include -I../../include -I${srcdir}/../../../../include -I../../../../include
|
||||||
|
CFLAGS = @CPPFLAGS@ @CFLAGS@ $(INCLUDE_DIR)
|
||||||
|
|
||||||
|
top_builddir = @master_topbuild_dir@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
C_COMPILE_SHL = $(CC_SHL)
|
||||||
|
|
||||||
|
@VPATH@
|
||||||
|
|
||||||
|
AD_BGLOCKLESS_OBJECTS = ad_bglockless.o
|
||||||
|
|
||||||
|
|
||||||
|
default: $(LIBNAME)
|
||||||
|
@if [ "@ENABLE_SHLIB@" != "none" ] ; then \
|
||||||
|
$(MAKE) $(SHLIBNAME).la ;\
|
||||||
|
fi
|
||||||
|
|
||||||
|
.SUFFIXES: $(SUFFIXES) .p .lo
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
.c.lo:
|
||||||
|
$(C_COMPILE_SHL) $(CFLAGS) -c $< -o _s$*.o
|
||||||
|
@mv -f _s$*.o $*.lo
|
||||||
|
|
||||||
|
$(LIBNAME): $(AD_BGLOCKLESS_OBJECTS)
|
||||||
|
$(AR) $(LIBNAME) $(AD_BGLOCKLESS_OBJECTS)
|
||||||
|
$(RANLIB) $(LIBNAME)
|
||||||
|
|
||||||
|
AD_BGLOCKLESS_LOOBJECTS=$(AD_BGLOCKLESS_OBJECTS:.o=.lo)
|
||||||
|
$(SHLIBNAME).la: $(AD_BGLOCKLESS_LOOBJECTS)
|
||||||
|
$(AR) $(SHLIBNAME).la $(AD_BGLOCKLESS_LOOBJECTS)
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
-@for file in ${AD_BGLOCKLESS_OBJECTS:.o=.c} ; do \
|
||||||
|
gcov -b -f $$file ; done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -f *.o *.lo *.gcno *.gcda *.bb *.bbg
|
||||||
|
@rm -f ${srcdir}/*.gcno ${srcdir}/*.gcda
|
||||||
|
@rm -f ${srcdir}/*.bb ${srcdir}/*.bbg
|
41
ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.c
Обычный файл
41
ompi/mca/io/romio/romio/adio/ad_bglockless/ad_bglockless.c
Обычный файл
@ -0,0 +1,41 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2001 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "../ad_bgl/ad_bgl.h"
|
||||||
|
|
||||||
|
/* adioi.h has the ADIOI_Fns_struct define */
|
||||||
|
#include "adioi.h"
|
||||||
|
|
||||||
|
struct ADIOI_Fns_struct ADIO_BGLOCKLESS_operations = {
|
||||||
|
ADIOI_BGL_Open, /* Open */
|
||||||
|
ADIOI_GEN_ReadContig, /* ReadContig */
|
||||||
|
ADIOI_GEN_WriteContig, /* WriteContig */
|
||||||
|
ADIOI_BGL_ReadStridedColl, /* ReadStridedColl */
|
||||||
|
ADIOI_BGL_WriteStridedColl, /* WriteStridedColl */
|
||||||
|
ADIOI_GEN_SeekIndividual, /* SeekIndividual */
|
||||||
|
ADIOI_GEN_Fcntl, /* Fcntl */
|
||||||
|
ADIOI_BGL_SetInfo, /* SetInfo */
|
||||||
|
ADIOI_GEN_ReadStrided, /* ReadStrided */
|
||||||
|
ADIOI_NOLOCK_WriteStrided, /* WriteStrided */
|
||||||
|
ADIOI_BGL_Close, /* Close */
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
|
ADIOI_GEN_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
||||||
|
#else
|
||||||
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
|
#endif
|
||||||
|
ADIOI_GEN_IODone, /* ReadDone */
|
||||||
|
ADIOI_GEN_IODone, /* WriteDone */
|
||||||
|
ADIOI_GEN_IOComplete, /* ReadComplete */
|
||||||
|
ADIOI_GEN_IOComplete, /* WriteComplete */
|
||||||
|
ADIOI_GEN_IreadStrided, /* IreadStrided */
|
||||||
|
ADIOI_GEN_IwriteStrided, /* IwriteStrided */
|
||||||
|
ADIOI_GEN_Flush, /* Flush */
|
||||||
|
ADIOI_GEN_Resize, /* Resize */
|
||||||
|
ADIOI_GEN_Delete, /* Delete */
|
||||||
|
};
|
22
ompi/mca/io/romio/romio/adio/ad_lustre/.state-cache
Обычный файл
22
ompi/mca/io/romio/romio/adio/ad_lustre/.state-cache
Обычный файл
@ -0,0 +1,22 @@
|
|||||||
|
<dir>
|
||||||
|
<file name="ad_lustre_fcntl.c" info="1204573775"/>
|
||||||
|
<file name="ad_lustre_hints.c" info="1204573775"/>
|
||||||
|
<file name="ad_lustre_open.c" info="1204573775"/>
|
||||||
|
<file name="ad_lustre_rwcontig.c" info="1204573775"/>
|
||||||
|
<file name="ad_lustre.h" info="1204573775"/>
|
||||||
|
<file name="ad_lustre.c" info="1204573775"/>
|
||||||
|
</dir>
|
||||||
|
<data>
|
||||||
|
<fileinfo name="ad_lustre_fcntl.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_lustre_hints.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_lustre_open.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_lustre_rwcontig.c">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_lustre.h">
|
||||||
|
</fileinfo>
|
||||||
|
<fileinfo name="ad_lustre.c">
|
||||||
|
</fileinfo>
|
||||||
|
</data>
|
31
ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.am
Обычный файл
31
ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.am
Обычный файл
@ -0,0 +1,31 @@
|
|||||||
|
#
|
||||||
|
# Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
||||||
|
# University Research and Technology
|
||||||
|
# Corporation. All rights reserved.
|
||||||
|
# Copyright (c) 2004-2005 The University of Tennessee and The University
|
||||||
|
# of Tennessee Research Foundation. All rights
|
||||||
|
# reserved.
|
||||||
|
# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||||
|
# University of Stuttgart. All rights reserved.
|
||||||
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||||
|
# $COPYRIGHT$
|
||||||
|
#
|
||||||
|
# Additional copyrights may follow
|
||||||
|
#
|
||||||
|
# $HEADER$
|
||||||
|
#
|
||||||
|
|
||||||
|
include $(top_srcdir)/Makefile.options
|
||||||
|
|
||||||
|
EXTRA_DIST = README
|
||||||
|
|
||||||
|
noinst_LTLIBRARIES = libadio_lustre.la
|
||||||
|
libadio_lustre_la_SOURCES = \
|
||||||
|
ad_lustre.c \
|
||||||
|
ad_lustre_fcntl.c \
|
||||||
|
ad_lustre.h \
|
||||||
|
ad_lustre_hints.c \
|
||||||
|
ad_lustre_open.c \
|
||||||
|
ad_lustre_rwcontig.c
|
47
ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.in
Обычный файл
47
ompi/mca/io/romio/romio/adio/ad_lustre/Makefile.in
Обычный файл
@ -0,0 +1,47 @@
|
|||||||
|
CC = @CC@
|
||||||
|
AR = @AR@
|
||||||
|
RANLIB = @RANLIB@
|
||||||
|
LIBNAME = @LIBNAME@
|
||||||
|
srcdir = @srcdir@
|
||||||
|
CC_SHL = @CC_SHL@
|
||||||
|
SHLIBNAME = @SHLIBNAME@
|
||||||
|
|
||||||
|
INCLUDE_DIR = -I@MPI_INCLUDE_DIR@ -I${srcdir}/../include -I../include -I../../include -I${srcdir}/../../../../include -I../../../../include
|
||||||
|
CFLAGS = @CPPFLAGS@ @CFLAGS@ $(INCLUDE_DIR)
|
||||||
|
|
||||||
|
top_builddir = @master_topbuild_dir@
|
||||||
|
LIBTOOL = @LIBTOOL@
|
||||||
|
C_COMPILE_SHL = $(CC_SHL) @CFLAGS@ $(INCLUDE_DIR)
|
||||||
|
|
||||||
|
@VPATH@
|
||||||
|
|
||||||
|
AD_LUSTRE_OBJECTS = ad_lustre.o ad_lustre_open.o \
|
||||||
|
ad_lustre_rwcontig.o ad_lustre_hints.o
|
||||||
|
|
||||||
|
default: $(LIBNAME)
|
||||||
|
@if [ "@ENABLE_SHLIB@" != "none" ] ; then \
|
||||||
|
$(MAKE) $(SHLIBNAME).la ;\
|
||||||
|
fi
|
||||||
|
|
||||||
|
.SUFFIXES: $(SUFFIXES) .p .lo
|
||||||
|
|
||||||
|
.c.o:
|
||||||
|
$(CC) $(CFLAGS) -c $<
|
||||||
|
.c.lo:
|
||||||
|
$(C_COMPILE_SHL) -c $< -o _s$*.o
|
||||||
|
@mv -f _s$*.o $*.lo
|
||||||
|
|
||||||
|
$(LIBNAME): $(AD_LUSTRE_OBJECTS)
|
||||||
|
$(AR) $(LIBNAME) $(AD_LUSTRE_OBJECTS)
|
||||||
|
$(RANLIB) $(LIBNAME)
|
||||||
|
|
||||||
|
AD_LUSTRE_LOOBJECTS=$(AD_LUSTRE_OBJECTS:.o=.lo)
|
||||||
|
$(SHLIBNAME).la: $(AD_LUSTRE_LOOBJECTS)
|
||||||
|
$(AR) $(SHLIBNAME).la $(AD_LUSTRE_LOOBJECTS)
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
-@for file in ${AD_LUSTRE_OBJECTS:.o=.c} ; do \
|
||||||
|
gcov -b -f $$file ; done
|
||||||
|
|
||||||
|
clean:
|
||||||
|
@rm -f *.o *.lo
|
40
ompi/mca/io/romio/romio/adio/ad_lustre/README
Обычный файл
40
ompi/mca/io/romio/romio/adio/ad_lustre/README
Обычный файл
@ -0,0 +1,40 @@
|
|||||||
|
Upcoming soon:
|
||||||
|
o Hierarchical striping as described in the paper from CCGrid2007
|
||||||
|
http://ft.ornl.gov/projects/io/pubs/CCGrid-2007-file-joining.pdf
|
||||||
|
Further out:
|
||||||
|
o To post the code for ParColl (Partitioned collective IO)
|
||||||
|
|
||||||
|
-----------------------------------------------------
|
||||||
|
V04:
|
||||||
|
-----------------------------------------------------
|
||||||
|
o Direct IO and Lockless IO support
|
||||||
|
|
||||||
|
-----------------------------------------------------
|
||||||
|
V03:
|
||||||
|
-----------------------------------------------------
|
||||||
|
o Correct detection of fs_type when lustre: prefix is not given
|
||||||
|
o Further fix on stripe alignment
|
||||||
|
o Tested/Enabled striping hints over Cray XT (Catamount and CNL)
|
||||||
|
|
||||||
|
-----------------------------------------------------
|
||||||
|
V02:
|
||||||
|
-----------------------------------------------------
|
||||||
|
The Lustre ADIO driver has been cleaned up quite a lot. Compared
|
||||||
|
to the intital posting, here are the changes:
|
||||||
|
o Removal of dead/redundant code
|
||||||
|
o Removal of asynchronous IO piece as it appears outdated
|
||||||
|
o Bug fixes for setting Lustre Hints
|
||||||
|
o Bug fixes for data sieving
|
||||||
|
o Improved Setsize operation with one process calling ftruncate
|
||||||
|
o Improved collective IO with domain partitioning on
|
||||||
|
Lustre stripe boundary
|
||||||
|
|
||||||
|
Contributing:
|
||||||
|
o You may contribute via many different ways, such as
|
||||||
|
testing results, bug reports, and new feature patches.
|
||||||
|
o We appreciate any courtesy reference of this work.
|
||||||
|
o Disclaimer: you are welcome to try the code, but at your own risk.
|
||||||
|
|
||||||
|
Contact info:
|
||||||
|
For more info, visit http://ft.ornl.gov/projects/io/
|
||||||
|
|
39
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.c
Обычный файл
39
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.c
Обычный файл
@ -0,0 +1,39 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Oak Ridge National Laboratory
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_lustre.h"
|
||||||
|
|
||||||
|
struct ADIOI_Fns_struct ADIO_LUSTRE_operations = {
|
||||||
|
ADIOI_LUSTRE_Open, /* Open */
|
||||||
|
ADIOI_LUSTRE_ReadContig, /* ReadContig */
|
||||||
|
ADIOI_LUSTRE_WriteContig, /* WriteContig */
|
||||||
|
ADIOI_GEN_ReadStridedColl, /* ReadStridedColl */
|
||||||
|
ADIOI_GEN_WriteStridedColl, /* WriteStridedColl */
|
||||||
|
ADIOI_GEN_SeekIndividual, /* SeekIndividual */
|
||||||
|
ADIOI_GEN_Fcntl, /* Fcntl */
|
||||||
|
ADIOI_LUSTRE_SetInfo, /* SetInfo */
|
||||||
|
ADIOI_GEN_ReadStrided, /* ReadStrided */
|
||||||
|
ADIOI_GEN_WriteStrided, /* WriteStrided */
|
||||||
|
ADIOI_GEN_Close, /* Close */
|
||||||
|
#if defined(ROMIO_HAVE_WORKING_AIO) && !defined(CRAY_XT_LUSTRE)
|
||||||
|
ADIOI_GEN_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
||||||
|
#else
|
||||||
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
|
#endif
|
||||||
|
ADIOI_GEN_IODone, /* ReadDone */
|
||||||
|
ADIOI_GEN_IODone, /* WriteDone */
|
||||||
|
ADIOI_GEN_IOComplete, /* ReadComplete */
|
||||||
|
ADIOI_GEN_IOComplete, /* WriteComplete */
|
||||||
|
ADIOI_GEN_IreadStrided, /* IreadStrided */
|
||||||
|
ADIOI_GEN_IwriteStrided, /* IwriteStrided */
|
||||||
|
ADIOI_GEN_Flush, /* Flush */
|
||||||
|
ADIOI_GEN_Resize, /* Resize */
|
||||||
|
ADIOI_GEN_Delete, /* Delete */
|
||||||
|
};
|
64
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.h
Обычный файл
64
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre.h
Обычный файл
@ -0,0 +1,64 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Oak Ridge National Laboratory
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef AD_UNIX_INCLUDE
|
||||||
|
#define AD_UNIX_INCLUDE
|
||||||
|
|
||||||
|
/* temp*/
|
||||||
|
#define HAVE_ASM_TYPES_H 1
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#ifdef __linux__
|
||||||
|
# include <sys/ioctl.h> /* necessary for: */
|
||||||
|
# define __USE_GNU /* O_DIRECT and */
|
||||||
|
# include <fcntl.h> /* IO operations */
|
||||||
|
# undef __USE_GNU
|
||||||
|
#endif /* __linux__ */
|
||||||
|
|
||||||
|
/*#include <fcntl.h>*/
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include "lustre/lustre_user.h"
|
||||||
|
#include "adio.h"
|
||||||
|
/*#include "adioi.h"*/
|
||||||
|
|
||||||
|
#ifdef HAVE_SIGNAL_H
|
||||||
|
#include <signal.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_AIO_H
|
||||||
|
#include <aio.h>
|
||||||
|
#ifdef HAVE_SYS_AIO_H
|
||||||
|
#include <sys/aio.h>
|
||||||
|
#endif
|
||||||
|
#endif /* End of HAVE_SYS_AIO_H */
|
||||||
|
|
||||||
|
void ADIOI_LUSTRE_Open(ADIO_File fd, int *error_code);
|
||||||
|
void ADIOI_LUSTRE_Close(ADIO_File fd, int *error_code);
|
||||||
|
void ADIOI_LUSTRE_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_LUSTRE_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_LUSTRE_WriteStridedColl(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_LUSTRE_ReadStridedColl(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int
|
||||||
|
*error_code);
|
||||||
|
void ADIOI_LUSTRE_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct,
|
||||||
|
int *error_code);
|
||||||
|
void ADIOI_LUSTRE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
|
||||||
|
|
||||||
|
#endif /* End of AD_UNIX_INCLUDE */
|
97
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_fcntl.c
Обычный файл
97
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_fcntl.c
Обычный файл
@ -0,0 +1,97 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Oak Ridge National Laboratory
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_lustre.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
|
||||||
|
void ADIOI_LUSTRE_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *error_code)
|
||||||
|
{
|
||||||
|
int i, ntimes;
|
||||||
|
ADIO_Offset curr_fsize, alloc_size, size, len, done;
|
||||||
|
ADIO_Status status;
|
||||||
|
char *buf;
|
||||||
|
#if defined(MPICH2) || !defined(PRINT_ERR_MSG)
|
||||||
|
static char myname[] = "ADIOI_LUSTRE_FCNTL";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
switch(flag) {
|
||||||
|
case ADIO_FCNTL_GET_FSIZE:
|
||||||
|
fcntl_struct->fsize = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
if (fd->fp_sys_posn != -1)
|
||||||
|
lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
||||||
|
if (fcntl_struct->fsize == -1) {
|
||||||
|
*error_code = MPIR_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io", "**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ADIO_FCNTL_SET_DISKSPACE:
|
||||||
|
/* will be called by one process only */
|
||||||
|
/* On file systems with no preallocation function, I have to
|
||||||
|
explicitly write
|
||||||
|
to allocate space. Since there could be holes in the file,
|
||||||
|
I need to read up to the current file size, write it back,
|
||||||
|
and then write beyond that depending on how much
|
||||||
|
preallocation is needed.
|
||||||
|
read/write in sizes of no more than ADIOI_PREALLOC_BUFSZ */
|
||||||
|
|
||||||
|
curr_fsize = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
alloc_size = fcntl_struct->diskspace;
|
||||||
|
|
||||||
|
size = ADIOI_MIN(curr_fsize, alloc_size);
|
||||||
|
|
||||||
|
ntimes = (size + ADIOI_PREALLOC_BUFSZ - 1)/ADIOI_PREALLOC_BUFSZ;
|
||||||
|
buf = (char *) ADIOI_Malloc(ADIOI_PREALLOC_BUFSZ);
|
||||||
|
done = 0;
|
||||||
|
|
||||||
|
for (i=0; i<ntimes; i++) {
|
||||||
|
len = ADIOI_MIN(size-done, ADIOI_PREALLOC_BUFSZ);
|
||||||
|
ADIO_ReadContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET, done,
|
||||||
|
&status, error_code);
|
||||||
|
if (*error_code != MPI_SUCCESS) {
|
||||||
|
*error_code = MPIR_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io", "**io %s", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
ADIO_WriteContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET,
|
||||||
|
done, &status, error_code);
|
||||||
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
|
done += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (alloc_size > curr_fsize) {
|
||||||
|
memset(buf, 0, ADIOI_PREALLOC_BUFSZ);
|
||||||
|
size = alloc_size - curr_fsize;
|
||||||
|
ntimes = (size + ADIOI_PREALLOC_BUFSZ - 1)/ADIOI_PREALLOC_BUFSZ;
|
||||||
|
for (i=0; i<ntimes; i++) {
|
||||||
|
len = ADIOI_MIN(alloc_size-done, ADIOI_PREALLOC_BUFSZ);
|
||||||
|
ADIO_WriteContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET,
|
||||||
|
done, &status, error_code);
|
||||||
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
|
done += len;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ADIOI_Free(buf);
|
||||||
|
if (fd->fp_sys_posn != -1)
|
||||||
|
lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ADIO_FCNTL_SET_ATOMICITY:
|
||||||
|
fd->atomicity = (fcntl_struct->atomicity == 0) ? 0 : 1;
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
FPRINTF(stderr, "Unknown flag passed to ADIOI_LUSTRE_Fcntl\n");
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
}
|
140
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_hints.c
Обычный файл
140
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_hints.c
Обычный файл
@ -0,0 +1,140 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Oak Ridge National Laboratory
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_lustre.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
|
||||||
|
void ADIOI_LUSTRE_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
|
||||||
|
{
|
||||||
|
char *value, *value_in_fd;
|
||||||
|
int flag, tmp_val[3], str_factor=-1, str_unit=0, start_iodev=-1;
|
||||||
|
struct lov_user_md lum = { 0 };
|
||||||
|
int err, myrank, fd_sys, perm, amode, old_mask;
|
||||||
|
|
||||||
|
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
||||||
|
if ( (fd->info) == MPI_INFO_NULL) {
|
||||||
|
/* This must be part of the open call. can set striping parameters
|
||||||
|
if necessary. */
|
||||||
|
MPI_Info_create(&(fd->info));
|
||||||
|
|
||||||
|
MPI_Info_set(fd->info, "direct_read", "false");
|
||||||
|
MPI_Info_set(fd->info, "direct_write", "false");
|
||||||
|
fd->direct_read = fd->direct_write = 0;
|
||||||
|
|
||||||
|
/* has user specified striping or server buffering parameters
|
||||||
|
and do they have the same value on all processes? */
|
||||||
|
if (users_info != MPI_INFO_NULL) {
|
||||||
|
MPI_Info_get(users_info, "striping_unit", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag)
|
||||||
|
str_unit=atoi(value);
|
||||||
|
|
||||||
|
MPI_Info_get(users_info, "striping_factor", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag)
|
||||||
|
str_factor=atoi(value);
|
||||||
|
|
||||||
|
MPI_Info_get(users_info, "start_iodevice", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag)
|
||||||
|
start_iodev=atoi(value);
|
||||||
|
|
||||||
|
MPI_Info_get(users_info, "direct_read", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag && (!strcmp(value, "true") || !strcmp(value, "TRUE"))) {
|
||||||
|
MPI_Info_set(fd->info, "direct_read", "true");
|
||||||
|
fd->direct_read = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Info_get(users_info, "direct_write", MPI_MAX_INFO_VAL,
|
||||||
|
value, &flag);
|
||||||
|
if (flag && (!strcmp(value, "true") || !strcmp(value, "TRUE"))) {
|
||||||
|
MPI_Info_set(fd->info, "direct_write", "true");
|
||||||
|
fd->direct_write = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
|
if (myrank == 0) {
|
||||||
|
tmp_val[0] = str_factor;
|
||||||
|
tmp_val[1] = str_unit;
|
||||||
|
tmp_val[2] = start_iodev;
|
||||||
|
}
|
||||||
|
MPI_Bcast(tmp_val, 3, MPI_INT, 0, fd->comm);
|
||||||
|
|
||||||
|
if (tmp_val[0] != str_factor
|
||||||
|
|| tmp_val[1] != str_unit
|
||||||
|
|| tmp_val[2] != start_iodev) {
|
||||||
|
FPRINTF(stderr, "ADIOI_LUSTRE_SetInfo: All keys"
|
||||||
|
"-striping_factor:striping_unit:start_iodevice "
|
||||||
|
"need to be identical across all processes\n");
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
} else if ((str_factor > 0) || (str_unit > 0) || (start_iodev >= 0)) {
|
||||||
|
/* if user has specified striping info, process 0 tries to set it */
|
||||||
|
if (!myrank) {
|
||||||
|
if (fd->perm == ADIO_PERM_NULL) {
|
||||||
|
old_mask = umask(022);
|
||||||
|
umask(old_mask);
|
||||||
|
perm = old_mask ^ 0666;
|
||||||
|
}
|
||||||
|
else perm = fd->perm;
|
||||||
|
|
||||||
|
amode = 0;
|
||||||
|
if (fd->access_mode & ADIO_CREATE)
|
||||||
|
amode = amode | O_CREAT;
|
||||||
|
if (fd->access_mode & ADIO_RDONLY)
|
||||||
|
amode = amode | O_RDONLY;
|
||||||
|
if (fd->access_mode & ADIO_WRONLY)
|
||||||
|
amode = amode | O_WRONLY;
|
||||||
|
if (fd->access_mode & ADIO_RDWR)
|
||||||
|
amode = amode | O_RDWR;
|
||||||
|
if (fd->access_mode & ADIO_EXCL)
|
||||||
|
amode = amode | O_EXCL;
|
||||||
|
|
||||||
|
/* we need to create file so ensure this is set */
|
||||||
|
amode = amode | O_LOV_DELAY_CREATE | O_CREAT;
|
||||||
|
|
||||||
|
fd_sys = open(fd->filename, amode, perm);
|
||||||
|
if (fd_sys == -1) {
|
||||||
|
if (errno != EEXIST)
|
||||||
|
fprintf(stderr,
|
||||||
|
"Failure to open file %s %d %d\n",strerror(errno), amode, perm);
|
||||||
|
} else {
|
||||||
|
lum.lmm_magic = LOV_USER_MAGIC;
|
||||||
|
lum.lmm_pattern = 0;
|
||||||
|
lum.lmm_stripe_size = str_unit;
|
||||||
|
lum.lmm_stripe_count = str_factor;
|
||||||
|
lum.lmm_stripe_offset = start_iodev;
|
||||||
|
|
||||||
|
err = ioctl(fd_sys, LL_IOC_LOV_SETSTRIPE, &lum);
|
||||||
|
if (err == -1 && errno != EEXIST) {
|
||||||
|
fprintf(stderr, "Failure to set stripe info %s \n", strerror(errno));
|
||||||
|
}
|
||||||
|
close(fd_sys);
|
||||||
|
}
|
||||||
|
} /* End of striping parameters validation */
|
||||||
|
}
|
||||||
|
|
||||||
|
MPI_Barrier(fd->comm);
|
||||||
|
/* set the values for collective I/O and data sieving parameters */
|
||||||
|
ADIOI_GEN_SetInfo(fd, users_info, error_code);
|
||||||
|
} else {
|
||||||
|
/* The file has been opened previously and fd->fd_sys is a valid
|
||||||
|
file descriptor. cannot set striping parameters now. */
|
||||||
|
|
||||||
|
/* set the values for collective I/O and data sieving parameters */
|
||||||
|
ADIOI_GEN_SetInfo(fd, users_info, error_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ADIOI_Direct_read) fd->direct_read = 1;
|
||||||
|
if (ADIOI_Direct_write) fd->direct_write = 1;
|
||||||
|
|
||||||
|
ADIOI_Free(value);
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
134
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_open.c
Обычный файл
134
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_open.c
Обычный файл
@ -0,0 +1,134 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Oak Ridge National Laboratory
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_lustre.h"
|
||||||
|
|
||||||
|
void ADIOI_LUSTRE_Open(ADIO_File fd, int *error_code)
|
||||||
|
{
|
||||||
|
int perm, old_mask, amode, amode_direct;
|
||||||
|
struct lov_user_md lum = { 0 };
|
||||||
|
char *value;
|
||||||
|
|
||||||
|
#if defined(MPICH2) || !defined(PRINT_ERR_MSG)
|
||||||
|
static char myname[] = "ADIOI_LUSTRE_OPEN";
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (fd->perm == ADIO_PERM_NULL) {
|
||||||
|
old_mask = umask(022);
|
||||||
|
umask(old_mask);
|
||||||
|
perm = old_mask ^ 0666;
|
||||||
|
}
|
||||||
|
else perm = fd->perm;
|
||||||
|
|
||||||
|
amode = 0;
|
||||||
|
if (fd->access_mode & ADIO_CREATE)
|
||||||
|
amode = amode | O_CREAT;
|
||||||
|
if (fd->access_mode & ADIO_RDONLY)
|
||||||
|
amode = amode | O_RDONLY;
|
||||||
|
if (fd->access_mode & ADIO_WRONLY)
|
||||||
|
amode = amode | O_WRONLY;
|
||||||
|
if (fd->access_mode & ADIO_RDWR)
|
||||||
|
amode = amode | O_RDWR;
|
||||||
|
if (fd->access_mode & ADIO_EXCL)
|
||||||
|
amode = amode | O_EXCL;
|
||||||
|
|
||||||
|
amode_direct = amode | O_DIRECT;
|
||||||
|
|
||||||
|
fd->fd_sys = open(fd->filename, amode|O_CREAT, perm);
|
||||||
|
|
||||||
|
if (fd->fd_sys != -1) {
|
||||||
|
int err;
|
||||||
|
|
||||||
|
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
||||||
|
|
||||||
|
/* get file striping information and set it in info */
|
||||||
|
lum.lmm_magic = LOV_USER_MAGIC;
|
||||||
|
err = ioctl(fd->fd_sys, LL_IOC_LOV_GETSTRIPE, (void *) &lum);
|
||||||
|
|
||||||
|
if (!err) {
|
||||||
|
sprintf(value, "%d", lum.lmm_stripe_size);
|
||||||
|
MPI_Info_set(fd->info, "striping_unit", value);
|
||||||
|
|
||||||
|
sprintf(value, "%d", lum.lmm_stripe_count);
|
||||||
|
MPI_Info_set(fd->info, "striping_factor", value);
|
||||||
|
|
||||||
|
sprintf(value, "%d", lum.lmm_stripe_offset);
|
||||||
|
MPI_Info_set(fd->info, "start_iodevice", value);
|
||||||
|
}
|
||||||
|
ADIOI_Free(value);
|
||||||
|
|
||||||
|
if (fd->access_mode & ADIO_APPEND)
|
||||||
|
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
|
||||||
|
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
|
||||||
|
fd->fd_direct = -1;
|
||||||
|
if (fd->direct_write || fd->direct_read) {
|
||||||
|
fd->fd_direct = open(fd->filename, amode_direct, perm);
|
||||||
|
if (fd->fd_direct != -1) {
|
||||||
|
fd->d_mem = fd->d_miniosz = (1<<12);
|
||||||
|
} else {
|
||||||
|
perror("cannot open file with O_Direct");
|
||||||
|
fd->direct_write = fd->direct_read = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (fd->fd_sys == -1 || ((fd->fd_direct == -1) &&
|
||||||
|
(fd->direct_write || fd->direct_read))) {
|
||||||
|
if (errno == ENAMETOOLONG)
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_BAD_FILE,
|
||||||
|
"**filenamelong",
|
||||||
|
"**filenamelong %s %d",
|
||||||
|
fd->filename,
|
||||||
|
strlen(fd->filename));
|
||||||
|
else if (errno == ENOENT)
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_NO_SUCH_FILE,
|
||||||
|
"**filenoexist",
|
||||||
|
"**filenoexist %s",
|
||||||
|
fd->filename);
|
||||||
|
else if (errno == ENOTDIR || errno == ELOOP)
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_BAD_FILE,
|
||||||
|
"**filenamedir",
|
||||||
|
"**filenamedir %s",
|
||||||
|
fd->filename);
|
||||||
|
else if (errno == EACCES) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_ACCESS,
|
||||||
|
"**fileaccess",
|
||||||
|
"**fileaccess %s",
|
||||||
|
fd->filename );
|
||||||
|
}
|
||||||
|
else if (errno == EROFS) {
|
||||||
|
/* Read only file or file system and write access requested */
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_READ_ONLY,
|
||||||
|
"**ioneedrd", 0 );
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
else *error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
|
}
|
187
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_rwcontig.c
Обычный файл
187
ompi/mca/io/romio/romio/adio/ad_lustre/ad_lustre_rwcontig.c
Обычный файл
@ -0,0 +1,187 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2007 Oak Ridge National Laboratory
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _XOPEN_SOURCE 600
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
#include "ad_lustre.h"
|
||||||
|
|
||||||
|
#define LUSTRE_MEMALIGN (1<<12) /* to use page_shift */
|
||||||
|
|
||||||
|
static void ADIOI_LUSTRE_Aligned_Mem_File_Write(ADIO_File fd, void *buf, int len,
|
||||||
|
ADIO_Offset offset, int *err);
|
||||||
|
static void ADIOI_LUSTRE_Aligned_Mem_File_Write(ADIO_File fd, void *buf, int len,
|
||||||
|
ADIO_Offset offset, int *err)
|
||||||
|
{
|
||||||
|
int ntimes, rem, newrem, i, size, nbytes;
|
||||||
|
if (!(len % fd->d_miniosz) && (len >= fd->d_miniosz)) {
|
||||||
|
*err = pwrite(fd->fd_direct, buf, len, offset);
|
||||||
|
} else if (len < fd->d_miniosz) {
|
||||||
|
*err = pwrite(fd->fd_sys, buf, len, offset);
|
||||||
|
} else {
|
||||||
|
rem = len % fd->d_miniosz;
|
||||||
|
size = len - rem;
|
||||||
|
nbytes = pwrite(fd->fd_direct, buf, size, offset);
|
||||||
|
nbytes += pwrite(fd->fd_sys, ((char *)buf) + size, rem, offset+size);
|
||||||
|
*err = nbytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ADIOI_LUSTRE_Aligned_Mem_File_Read(ADIO_File fd, void *buf, int len,
|
||||||
|
ADIO_Offset offset, int *err);
|
||||||
|
static void ADIOI_LUSTRE_Aligned_Mem_File_Read(ADIO_File fd, void *buf, int len,
|
||||||
|
ADIO_Offset offset, int *err)
|
||||||
|
{
|
||||||
|
int ntimes, rem, newrem, i, size, nbytes;
|
||||||
|
if (!(len % fd->d_miniosz) && (len >= fd->d_miniosz))
|
||||||
|
*err = pread(fd->fd_direct, buf, len, offset);
|
||||||
|
else if (len < fd->d_miniosz)
|
||||||
|
*err = pread(fd->fd_sys, buf, len, offset);
|
||||||
|
else {
|
||||||
|
rem = len % fd->d_miniosz;
|
||||||
|
size = len - rem;
|
||||||
|
nbytes = pread(fd->fd_direct, buf, size, offset);
|
||||||
|
nbytes += pread(fd->fd_sys, ((char *)buf) + size, rem, offset+size);
|
||||||
|
*err = nbytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ADIOI_LUSTRE_Directio(ADIO_File fd, void *buf, int len,
|
||||||
|
off_t offset, int rw);
|
||||||
|
static int ADIOI_LUSTRE_Directio(ADIO_File fd, void *buf, int len,
|
||||||
|
off_t offset, int rw)
|
||||||
|
{
|
||||||
|
int err=-1, diff, size=len, nbytes = 0;
|
||||||
|
void *newbuf;
|
||||||
|
static char myname[] = "ADIOI_LUSTRE_Directio";
|
||||||
|
|
||||||
|
if (offset % fd->d_miniosz) {
|
||||||
|
diff = fd->d_miniosz - (offset % fd->d_miniosz);
|
||||||
|
diff = ADIOI_MIN(diff, len);
|
||||||
|
if (rw)
|
||||||
|
nbytes = pwrite(fd->fd_sys, buf, diff, offset);
|
||||||
|
else
|
||||||
|
nbytes = pread(fd->fd_sys, buf, diff, offset);
|
||||||
|
buf = ((char *) buf) + diff;
|
||||||
|
offset += diff;
|
||||||
|
size = len - diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!size) {
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rw) { /* direct I/O enabled */
|
||||||
|
if (!(((long) buf) % fd->d_mem)) {
|
||||||
|
ADIOI_LUSTRE_Aligned_Mem_File_Write(fd, buf, size, offset, &err);
|
||||||
|
nbytes += err;
|
||||||
|
} else {
|
||||||
|
newbuf = (void *) memalign(LUSTRE_MEMALIGN, size);
|
||||||
|
if (newbuf) {
|
||||||
|
memcpy(newbuf, buf, size);
|
||||||
|
ADIOI_LUSTRE_Aligned_Mem_File_Write(fd, newbuf, size, offset, &err);
|
||||||
|
nbytes += err;
|
||||||
|
free(newbuf);
|
||||||
|
}
|
||||||
|
else nbytes += pwrite(fd->fd_sys, buf, size, offset);
|
||||||
|
}
|
||||||
|
err = nbytes;
|
||||||
|
} else {
|
||||||
|
if (!(((long) buf) % fd->d_mem)) {
|
||||||
|
ADIOI_LUSTRE_Aligned_Mem_File_Read(fd, buf, size, offset, &err);
|
||||||
|
nbytes += err;
|
||||||
|
} else {
|
||||||
|
newbuf = (void *) memalign(LUSTRE_MEMALIGN, size);
|
||||||
|
if (newbuf) {
|
||||||
|
ADIOI_LUSTRE_Aligned_Mem_File_Read(fd, newbuf, size, offset, &err);
|
||||||
|
if (err > 0) memcpy(buf, newbuf, err);
|
||||||
|
nbytes += err;
|
||||||
|
free(newbuf);
|
||||||
|
}
|
||||||
|
else nbytes += pread(fd->fd_sys, buf, size, offset);
|
||||||
|
}
|
||||||
|
err = nbytes;
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ADIOI_LUSTRE_IOContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status,
|
||||||
|
int io_mode, int *error_code);
|
||||||
|
static void ADIOI_LUSTRE_IOContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status,
|
||||||
|
int io_mode, int *error_code)
|
||||||
|
{
|
||||||
|
int err=-1, datatype_size, len;
|
||||||
|
static char myname[] = "ADIOI_LUSTRE_IOCONTIG";
|
||||||
|
|
||||||
|
MPI_Type_size(datatype, &datatype_size);
|
||||||
|
len = datatype_size * count;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(fd->direct_read || fd->direct_write)) {
|
||||||
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
err = lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
if (err == -1) goto ioerr;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (io_mode)
|
||||||
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
else
|
||||||
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
} else {
|
||||||
|
err = ADIOI_LUSTRE_Directio(fd, buf, len, offset, io_mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (err == -1) goto ioerr;
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
fd->fp_ind += err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
if (status) MPIR_Status_set_bytes(status, datatype, err);
|
||||||
|
#endif
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
|
ioerr:
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
fd->fp_sys_posn = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADIOI_LUSTRE_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int *error_code)
|
||||||
|
{
|
||||||
|
ADIOI_LUSTRE_IOContig(fd, buf, count, datatype, file_ptr_type,
|
||||||
|
offset, status, 1, error_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADIOI_LUSTRE_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status, int *error_code)
|
||||||
|
{
|
||||||
|
ADIOI_LUSTRE_IOContig(fd, buf, count, datatype, file_ptr_type,
|
||||||
|
offset, status, 0, error_code);
|
||||||
|
}
|
@ -22,8 +22,10 @@ struct ADIOI_Fns_struct ADIO_NFS_operations = {
|
|||||||
ADIOI_NFS_ReadStrided, /* ReadStrided */
|
ADIOI_NFS_ReadStrided, /* ReadStrided */
|
||||||
ADIOI_NFS_WriteStrided, /* WriteStrided */
|
ADIOI_NFS_WriteStrided, /* WriteStrided */
|
||||||
ADIOI_GEN_Close, /* Close */
|
ADIOI_GEN_Close, /* Close */
|
||||||
ADIOI_NFS_IreadContig, /* IreadContig */
|
/* Even with lockd running and NFS mounted 'noac', we have been unable to
|
||||||
ADIOI_NFS_IwriteContig, /* IwriteContig */
|
* gaurantee correct behavior over NFS with asyncronous I/O operations */
|
||||||
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
ADIOI_NFS_ReadDone, /* ReadDone */
|
ADIOI_NFS_ReadDone, /* ReadDone */
|
||||||
ADIOI_NFS_WriteDone, /* WriteDone */
|
ADIOI_NFS_WriteDone, /* WriteDone */
|
||||||
ADIOI_NFS_ReadComplete, /* ReadComplete */
|
ADIOI_NFS_ReadComplete, /* ReadComplete */
|
||||||
|
@ -15,6 +15,9 @@
|
|||||||
#ifdef HAVE_SIGNAL_H
|
#ifdef HAVE_SIGNAL_H
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_AIO_H
|
#ifdef HAVE_AIO_H
|
||||||
#include <aio.h>
|
#include <aio.h>
|
||||||
#endif
|
#endif
|
||||||
@ -29,7 +32,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ADIOI_NFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
int ADIOI_NFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
||||||
int wr, void *handle);
|
int wr, MPI_Request *request);
|
||||||
|
|
||||||
#ifdef SX4
|
#ifdef SX4
|
||||||
#define lseek llseek
|
#define lseek llseek
|
||||||
|
@ -9,119 +9,9 @@
|
|||||||
int ADIOI_NFS_ReadDone(ADIO_Request *request, ADIO_Status *status,
|
int ADIOI_NFS_ReadDone(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
#ifdef ROMIO_HAVE_WORKING_AIO
|
|
||||||
int done=0;
|
|
||||||
int err;
|
|
||||||
static char myname[] = "ADIOI_NFS_READDONE";
|
|
||||||
#ifdef ROMIO_HAVE_STRUCT_AIOCB_WITH_AIO_HANDLE
|
|
||||||
struct aiocb *tmp1;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL) {
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef ROMIO_HAVE_WORKING_AIO
|
|
||||||
# ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
# endif
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
return 1;
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#ifndef ROMIO_HAVE_STRUCT_AIOCB_WITH_AIO_FILDES
|
|
||||||
/* old IBM API */
|
|
||||||
if ((*request)->queued) {
|
|
||||||
tmp1 = (struct aiocb *) (*request)->handle;
|
|
||||||
errno = aio_error(tmp1->aio_handle);
|
|
||||||
if (errno == EINPROG) {
|
|
||||||
done = 0;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
err = aio_return(tmp1->aio_handle);
|
|
||||||
(*request)->nbytes = err;
|
|
||||||
errno = aio_error(tmp1->aio_handle);
|
|
||||||
|
|
||||||
done = 1;
|
|
||||||
|
|
||||||
if (err == -1) {
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
|
||||||
MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__,
|
|
||||||
MPI_ERR_IO, "**io",
|
|
||||||
"**io %s", strerror(errno));
|
|
||||||
}
|
|
||||||
else *error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
done = 1;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (done && ((*request)->nbytes != -1))
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#else
|
|
||||||
/* everything other than old IBM */
|
|
||||||
if ((*request)->queued) {
|
|
||||||
errno = aio_error((const struct aiocb *) (*request)->handle);
|
|
||||||
if (errno == EINPROGRESS) {
|
|
||||||
done = 0;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
err = aio_return((struct aiocb *) (*request)->handle);
|
|
||||||
(*request)->nbytes = err;
|
|
||||||
errno = aio_error((struct aiocb *) (*request)->handle);
|
|
||||||
|
|
||||||
done = 1;
|
|
||||||
|
|
||||||
if (err == -1) {
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
|
||||||
MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__,
|
|
||||||
MPI_ERR_IO, "**io",
|
|
||||||
"**io %s", strerror(errno));
|
|
||||||
}
|
|
||||||
else *error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
done = 1;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (done && ((*request)->nbytes != -1))
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (done) {
|
|
||||||
/* if request is still queued in the system, it is also there
|
|
||||||
on ADIOI_Async_list. Delete it from there. */
|
|
||||||
if ((*request)->queued) ADIOI_Del_req_from_list(request);
|
|
||||||
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
if ((*request)->handle) ADIOI_Free((*request)->handle);
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
}
|
|
||||||
return done;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ADIOI_NFS_WriteDone(ADIO_Request *request, ADIO_Status *status,
|
int ADIOI_NFS_WriteDone(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
|
@ -18,10 +18,22 @@ void ADIOI_NFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *er
|
|||||||
switch(flag) {
|
switch(flag) {
|
||||||
case ADIO_FCNTL_GET_FSIZE:
|
case ADIO_FCNTL_GET_FSIZE:
|
||||||
ADIOI_READ_LOCK(fd, 0, SEEK_SET, 1);
|
ADIOI_READ_LOCK(fd, 0, SEEK_SET, 1);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fcntl_struct->fsize = lseek(fd->fd_sys, 0, SEEK_END);
|
fcntl_struct->fsize = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
ADIOI_UNLOCK(fd, 0, SEEK_SET, 1);
|
ADIOI_UNLOCK(fd, 0, SEEK_SET, 1);
|
||||||
if (fd->fp_sys_posn != -1) {
|
if (fd->fp_sys_posn != -1) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
lseek(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (fcntl_struct->fsize == -1) {
|
if (fcntl_struct->fsize == -1) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
@ -32,7 +32,13 @@ void ADIOI_NFS_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp,
|
|||||||
if (*error_code != MPI_SUCCESS) return;
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
*shared_fp = 0;
|
*shared_fp = 0;
|
||||||
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->shared_fp_fd->fd_sys, shared_fp, sizeof(ADIO_Offset));
|
err = read(fd->shared_fp_fd->fd_sys, shared_fp, sizeof(ADIO_Offset));
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* if the file is empty, the above read may return error
|
/* if the file is empty, the above read may return error
|
||||||
(reading beyond end of file). In that case, shared_fp = 0,
|
(reading beyond end of file). In that case, shared_fp = 0,
|
||||||
set above, is the correct value. */
|
set above, is the correct value. */
|
||||||
@ -40,10 +46,22 @@ void ADIOI_NFS_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp,
|
|||||||
else {
|
else {
|
||||||
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->shared_fp_fd->fd_sys, shared_fp,
|
err = read(fd->shared_fp_fd->fd_sys, shared_fp,
|
||||||
sizeof(ADIO_Offset));
|
sizeof(ADIO_Offset));
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
if (err == -1) {
|
if (err == -1) {
|
||||||
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
@ -57,9 +75,21 @@ void ADIOI_NFS_Get_shared_fp(ADIO_File fd, int incr, ADIO_Offset *shared_fp,
|
|||||||
|
|
||||||
new_fp = *shared_fp + incr;
|
new_fp = *shared_fp + incr;
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
err = lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = write(fd->shared_fp_fd->fd_sys, &new_fp, sizeof(ADIO_Offset));
|
err = write(fd->shared_fp_fd->fd_sys, &new_fp, sizeof(ADIO_Offset));
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
if (err == -1) {
|
if (err == -1) {
|
||||||
|
@ -6,50 +6,24 @@
|
|||||||
|
|
||||||
#include "ad_nfs.h"
|
#include "ad_nfs.h"
|
||||||
|
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
|
/* nearly identical to ADIOI_GEN_IreadContig, except we lock around I/O */
|
||||||
void ADIOI_NFS_IreadContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_NFS_IreadContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
ADIO_Offset offset, ADIO_Request *request,
|
ADIO_Offset offset, ADIO_Request *request,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
int len, typesize;
|
int len, typesize;
|
||||||
#ifndef ROMIO_HAVE_WORKING_AIO
|
|
||||||
ADIO_Status status;
|
|
||||||
#else
|
|
||||||
int aio_errno = 0;
|
int aio_errno = 0;
|
||||||
static char myname[] = "ADIOI_NFS_IREADCONTIG";
|
static char myname[] = "ADIOI_NFS_IREADCONTIG";
|
||||||
#endif
|
|
||||||
|
|
||||||
(*request) = ADIOI_Malloc_request();
|
|
||||||
(*request)->optype = ADIOI_READ;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
MPI_Type_size(datatype, &typesize);
|
||||||
len = count * typesize;
|
len = count * typesize;
|
||||||
|
|
||||||
#ifndef ROMIO_HAVE_WORKING_AIO
|
|
||||||
/* no support for nonblocking I/O. Use blocking I/O. */
|
|
||||||
|
|
||||||
ADIOI_NFS_ReadContig(fd, buf, len, MPI_BYTE, file_ptr_type, offset,
|
|
||||||
&status, error_code);
|
|
||||||
(*request)->queued = 0;
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (*error_code == MPI_SUCCESS) {
|
|
||||||
MPI_Get_elements(&status, MPI_BYTE, &len);
|
|
||||||
(*request)->nbytes = len;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fd->fp_sys_posn = -1;
|
|
||||||
|
|
||||||
#else
|
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;
|
if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;
|
||||||
aio_errno = ADIOI_NFS_aio(fd, buf, len, offset, 0, &((*request)->handle));
|
aio_errno = ADIOI_NFS_aio(fd, buf, len, offset, 0, request);
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len;
|
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len;
|
||||||
|
|
||||||
(*request)->queued = 1;
|
|
||||||
ADIOI_Add_req_to_list(request);
|
|
||||||
|
|
||||||
fd->fp_sys_posn = -1;
|
fd->fp_sys_posn = -1;
|
||||||
|
|
||||||
if (aio_errno != 0) {
|
if (aio_errno != 0) {
|
||||||
@ -59,7 +33,5 @@ void ADIOI_NFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
}
|
}
|
||||||
else *error_code = MPI_SUCCESS;
|
else *error_code = MPI_SUCCESS;
|
||||||
#endif
|
|
||||||
|
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
@ -6,51 +6,31 @@
|
|||||||
|
|
||||||
#include "ad_nfs.h"
|
#include "ad_nfs.h"
|
||||||
|
|
||||||
|
#include "../../mpi-io/mpioimpl.h"
|
||||||
|
#include "../../mpi-io/mpioprof.h"
|
||||||
|
#include "mpiu_greq.h"
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
|
static MPIX_Grequest_class ADIOI_GEN_greq_class = 0;
|
||||||
|
/* this routine is nearly identical to ADIOI_GEN_IwriteContig, except we lock
|
||||||
|
* around I/O */
|
||||||
void ADIOI_NFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_NFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
ADIO_Offset offset, ADIO_Request *request, int *error_code)
|
ADIO_Offset offset, ADIO_Request *request, int *error_code)
|
||||||
{
|
{
|
||||||
int len, typesize;
|
int len, typesize;
|
||||||
#ifndef ROMIO_HAVE_WORKING_AIO
|
|
||||||
ADIO_Status status;
|
|
||||||
#else
|
|
||||||
int aio_errno = 0;
|
int aio_errno = 0;
|
||||||
static char myname[] = "ADIOI_NFS_IWRITECONTIG";
|
static char myname[] = "ADIOI_NFS_IWRITECONTIG";
|
||||||
#endif
|
|
||||||
|
|
||||||
*request = ADIOI_Malloc_request();
|
|
||||||
(*request)->optype = ADIOI_WRITE;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
MPI_Type_size(datatype, &typesize);
|
||||||
len = count * typesize;
|
len = count * typesize;
|
||||||
|
|
||||||
#ifndef ROMIO_HAVE_WORKING_AIO
|
|
||||||
/* HP, FreeBSD, Linux */
|
|
||||||
/* no support for nonblocking I/O. Use blocking I/O. */
|
|
||||||
|
|
||||||
ADIOI_NFS_WriteContig(fd, buf, len, MPI_BYTE, file_ptr_type, offset,
|
|
||||||
&status,
|
|
||||||
error_code);
|
|
||||||
(*request)->queued = 0;
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (*error_code == MPI_SUCCESS) {
|
|
||||||
MPI_Get_elements(&status, MPI_BYTE, &len);
|
|
||||||
(*request)->nbytes = len;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
fd->fp_sys_posn = -1;
|
|
||||||
|
|
||||||
#else
|
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;
|
if (file_ptr_type == ADIO_INDIVIDUAL) offset = fd->fp_ind;
|
||||||
aio_errno = ADIOI_NFS_aio(fd, buf, len, offset, 1, &((*request)->handle));
|
aio_errno = ADIOI_NFS_aio(fd, buf, len, offset, 1, request);
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len;
|
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += len;
|
||||||
|
|
||||||
(*request)->queued = 1;
|
|
||||||
ADIOI_Add_req_to_list(request);
|
|
||||||
|
|
||||||
fd->fp_sys_posn = -1;
|
fd->fp_sys_posn = -1;
|
||||||
|
|
||||||
if (aio_errno != 0) {
|
if (aio_errno != 0) {
|
||||||
@ -60,11 +40,9 @@ void ADIOI_NFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
}
|
}
|
||||||
else *error_code = MPI_SUCCESS;
|
else *error_code = MPI_SUCCESS;
|
||||||
#endif
|
return;
|
||||||
|
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* This function is for implementation convenience. It is not user-visible.
|
/* This function is for implementation convenience. It is not user-visible.
|
||||||
* It takes care of the differences in the interface for nonblocking I/O
|
* It takes care of the differences in the interface for nonblocking I/O
|
||||||
@ -74,21 +52,22 @@ void ADIOI_NFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
*/
|
*/
|
||||||
#ifdef ROMIO_HAVE_WORKING_AIO
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
int ADIOI_NFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
int ADIOI_NFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
||||||
int wr, void *handle)
|
int wr, MPI_Request *request)
|
||||||
{
|
{
|
||||||
int err=-1, fd_sys;
|
int err=-1, fd_sys;
|
||||||
int error_code, this_errno;
|
int error_code, this_errno;
|
||||||
|
|
||||||
struct aiocb *aiocbp;
|
struct aiocb *aiocbp;
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
|
||||||
fd_sys = fd->fd_sys;
|
fd_sys = fd->fd_sys;
|
||||||
|
|
||||||
|
aio_req = (ADIOI_AIO_Request*)ADIOI_Calloc(sizeof(ADIOI_AIO_Request), 1);
|
||||||
aiocbp = (struct aiocb *) ADIOI_Calloc(sizeof(struct aiocb), 1);
|
aiocbp = (struct aiocb *) ADIOI_Calloc(sizeof(struct aiocb), 1);
|
||||||
aiocbp->aio_offset = offset;
|
aiocbp->aio_offset = offset;
|
||||||
aiocbp->aio_buf = buf;
|
aiocbp->aio_buf = buf;
|
||||||
aiocbp->aio_nbytes = len;
|
aiocbp->aio_nbytes = len;
|
||||||
|
|
||||||
/* This madness is mostly here to deal with IBM AIO implementation */
|
|
||||||
#ifdef ROMIO_HAVE_STRUCT_AIOCB_WITH_AIO_WHENCE
|
#ifdef ROMIO_HAVE_STRUCT_AIOCB_WITH_AIO_WHENCE
|
||||||
aiocbp->aio_whence = SEEK_SET;
|
aiocbp->aio_whence = SEEK_SET;
|
||||||
#endif
|
#endif
|
||||||
@ -112,7 +91,7 @@ int ADIOI_NFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
|||||||
if (wr) ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
if (wr) ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
|
||||||
#ifdef ROMIO_HAVE_STRUCT_AIOCB_WITH_AIO_FILDES
|
#ifndef ROMIO_HAVE_AIO_CALLS_NEED_FILEDES
|
||||||
if (wr) err = aio_write(aiocbp);
|
if (wr) err = aio_write(aiocbp);
|
||||||
else err = aio_read(aiocbp);
|
else err = aio_read(aiocbp);
|
||||||
#else
|
#else
|
||||||
@ -128,43 +107,23 @@ int ADIOI_NFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
|||||||
if (this_errno == EAGAIN) {
|
if (this_errno == EAGAIN) {
|
||||||
/* exceeded the max. no. of outstanding requests.
|
/* exceeded the max. no. of outstanding requests.
|
||||||
complete all previous async. requests and try again. */
|
complete all previous async. requests and try again. */
|
||||||
|
ADIO_WriteContig(fd, buf, len, MPI_BYTE, ADIO_EXPLICIT_OFFSET,
|
||||||
ADIOI_Complete_async(&error_code);
|
offset, NULL, &error_code);
|
||||||
if (error_code != MPI_SUCCESS) return -EIO;
|
MPIO_Completed_request_create(&fd, len, &error_code, request);
|
||||||
|
return 0;
|
||||||
while (err == -1 && this_errno == EAGAIN) {
|
} else {
|
||||||
|
|
||||||
if (wr) ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
|
||||||
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
|
||||||
|
|
||||||
#ifdef ROMIO_HAVE_STRUCT_AIOCB_WITH_AIO_FILDES
|
|
||||||
if (wr) err = aio_write(aiocbp);
|
|
||||||
else err = aio_read(aiocbp);
|
|
||||||
#else
|
|
||||||
/* Broken IBM interface */
|
|
||||||
if (wr) err = aio_write(fd_sys, aiocbp);
|
|
||||||
else err = aio_read(fd_sys, aiocbp);
|
|
||||||
#endif
|
|
||||||
this_errno = errno;
|
|
||||||
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
|
||||||
|
|
||||||
if (err == -1 && this_errno == EAGAIN) {
|
|
||||||
/* sleep and try again */
|
|
||||||
sleep(1);
|
|
||||||
}
|
|
||||||
else if (err == -1) {
|
|
||||||
/* real error */
|
|
||||||
return -errno;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -this_errno;
|
return -this_errno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
aio_req->aiocbp = aiocbp;
|
||||||
*((struct aiocb **) handle) = aiocbp;
|
if (ADIOI_GEN_greq_class == 0) {
|
||||||
|
MPIX_Grequest_class_create(ADIOI_GEN_aio_query_fn,
|
||||||
|
ADIOI_GEN_aio_free_fn, MPIU_Greq_cancel_fn,
|
||||||
|
ADIOI_GEN_aio_poll_fn, ADIOI_GEN_aio_wait_fn,
|
||||||
|
&ADIOI_GEN_greq_class);
|
||||||
|
}
|
||||||
|
MPIX_Grequest_class_allocate(ADIOI_GEN_greq_class, aio_req, request);
|
||||||
|
memcpy(&(aio_req->req), request, sizeof(MPI_Request));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -32,11 +32,24 @@ void ADIOI_NFS_Open(ADIO_File fd, int *error_code)
|
|||||||
if (fd->access_mode & ADIO_EXCL)
|
if (fd->access_mode & ADIO_EXCL)
|
||||||
amode = amode | O_EXCL;
|
amode = amode | O_EXCL;
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_sys = open(fd->filename, amode, perm);
|
fd->fd_sys = open(fd->filename, amode, perm);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_direct = -1;
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
|
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND)) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (fd->fd_sys == -1) {
|
if (fd->fd_sys == -1) {
|
||||||
/* Check for special error codes for those MPI error
|
/* Check for special error codes for those MPI error
|
||||||
|
@ -19,24 +19,50 @@ void ADIOI_NFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
len = datatype_size * count;
|
len = datatype_size * count;
|
||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset)
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, offset, SEEK_SET);
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
if (fd->atomicity)
|
if (fd->atomicity)
|
||||||
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->fd_sys, buf, len);
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* read from curr. location of ind. file pointer */
|
else { /* read from curr. location of ind. file pointer */
|
||||||
offset = fd->fp_ind;
|
offset = fd->fp_ind;
|
||||||
if (fd->fp_sys_posn != fd->fp_ind)
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
if (fd->atomicity)
|
if (fd->atomicity)
|
||||||
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
else ADIOI_READ_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->fd_sys, buf, len);
|
err = read(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
@ -60,6 +86,46 @@ void ADIOI_NFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
#define ADIOI_BUFFERED_READ \
|
||||||
|
{ \
|
||||||
|
if (req_off >= readbuf_off + readbuf_len) { \
|
||||||
|
readbuf_off = req_off; \
|
||||||
|
readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));\
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, readbuf_off, SEEK_SET);\
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL ); \
|
||||||
|
err = read(fd->fd_sys, readbuf, readbuf_len);\
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);\
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
} \
|
||||||
|
while (req_len > readbuf_off + readbuf_len - req_off) { \
|
||||||
|
partial_read = (int) (readbuf_off + readbuf_len - req_off); \
|
||||||
|
tmp_buf = (char *) ADIOI_Malloc(partial_read); \
|
||||||
|
memcpy(tmp_buf, readbuf+readbuf_len-partial_read, partial_read); \
|
||||||
|
ADIOI_Free(readbuf); \
|
||||||
|
readbuf = (char *) ADIOI_Malloc(partial_read + max_bufsize); \
|
||||||
|
memcpy(readbuf, tmp_buf, partial_read); \
|
||||||
|
ADIOI_Free(tmp_buf); \
|
||||||
|
readbuf_off += readbuf_len-partial_read; \
|
||||||
|
readbuf_len = (int) (partial_read + ADIOI_MIN(max_bufsize, \
|
||||||
|
end_offset-readbuf_off+1)); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, readbuf_off+partial_read, SEEK_SET);\
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL ); \
|
||||||
|
err = read(fd->fd_sys, readbuf+partial_read, readbuf_len-partial_read);\
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off+partial_read, SEEK_SET, readbuf_len-partial_read);\
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
} \
|
||||||
|
memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \
|
||||||
|
}
|
||||||
|
#else
|
||||||
#define ADIOI_BUFFERED_READ \
|
#define ADIOI_BUFFERED_READ \
|
||||||
{ \
|
{ \
|
||||||
if (req_off >= readbuf_off + readbuf_len) { \
|
if (req_off >= readbuf_off + readbuf_len) { \
|
||||||
@ -90,6 +156,7 @@ void ADIOI_NFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
} \
|
} \
|
||||||
memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \
|
memcpy((char *)buf + userbuf_off, readbuf+req_off-readbuf_off, req_len); \
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
|
void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
|
||||||
@ -160,9 +227,21 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
if (fd->atomicity)
|
if (fd->atomicity)
|
||||||
ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
ADIOI_WRITE_LOCK(fd, start_off, SEEK_SET, end_offset-start_off+1);
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, readbuf_off, SEEK_SET);
|
lseek(fd->fd_sys, readbuf_off, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, readbuf_off, SEEK_SET, readbuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->fd_sys, readbuf, readbuf_len);
|
err = read(fd->fd_sys, readbuf, readbuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, readbuf_off, SEEK_SET, readbuf_len);
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
@ -274,9 +353,21 @@ void ADIOI_NFS_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
readbuf = (char *) ADIOI_Malloc(max_bufsize);
|
readbuf = (char *) ADIOI_Malloc(max_bufsize);
|
||||||
readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));
|
readbuf_len = (int) (ADIOI_MIN(max_bufsize, end_offset-readbuf_off+1));
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, offset, SEEK_SET);
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, offset, SEEK_SET, readbuf_len);
|
if (!(fd->atomicity)) ADIOI_READ_LOCK(fd, offset, SEEK_SET, readbuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->fd_sys, readbuf, readbuf_len);
|
err = read(fd->fd_sys, readbuf, readbuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, offset, SEEK_SET, readbuf_len);
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, offset, SEEK_SET, readbuf_len);
|
||||||
|
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
|
@ -47,8 +47,20 @@ void ADIOI_NFS_Set_shared_fp(ADIO_File fd, ADIO_Offset offset, int *error_code)
|
|||||||
if (*error_code != MPI_SUCCESS) return;
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
|
|
||||||
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
ADIOI_WRITE_LOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
lseek(fd->shared_fp_fd->fd_sys, 0, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = write(fd->shared_fp_fd->fd_sys, &offset, sizeof(ADIO_Offset));
|
err = write(fd->shared_fp_fd->fd_sys, &offset, sizeof(ADIO_Offset));
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
ADIOI_UNLOCK(fd->shared_fp_fd, 0, SEEK_SET, sizeof(ADIO_Offset));
|
||||||
|
|
||||||
if (err == -1) {
|
if (err == -1) {
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
void ADIOI_NFS_ReadComplete(ADIO_Request *request, ADIO_Status *status,
|
void ADIOI_NFS_ReadComplete(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
|
return;
|
||||||
|
#if 0
|
||||||
#ifdef ROMIO_HAVE_WORKING_AIO
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
int err;
|
int err;
|
||||||
static char myname[] = "ADIOI_NFS_READCOMPLETE";
|
static char myname[] = "ADIOI_NFS_READCOMPLETE";
|
||||||
@ -121,6 +123,7 @@ void ADIOI_NFS_ReadComplete(ADIO_Request *request, ADIO_Status *status,
|
|||||||
*request = ADIO_REQUEST_NULL;
|
*request = ADIO_REQUEST_NULL;
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,20 +19,46 @@ void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
len = datatype_size * count;
|
len = datatype_size * count;
|
||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset)
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, offset, SEEK_SET);
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = write(fd->fd_sys, buf, len);
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* write from curr. location of ind. file pointer */
|
else { /* write from curr. location of ind. file pointer */
|
||||||
offset = fd->fp_ind;
|
offset = fd->fp_ind;
|
||||||
if (fd->fp_sys_posn != fd->fp_ind)
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
ADIOI_WRITE_LOCK(fd, offset, SEEK_SET, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = write(fd->fd_sys, buf, len);
|
err = write(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
ADIOI_UNLOCK(fd, offset, SEEK_SET, len);
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
@ -58,6 +84,69 @@ void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
#define ADIOI_BUFFERED_WRITE \
|
||||||
|
{ \
|
||||||
|
if (req_off >= writebuf_off + writebuf_len) { \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL ); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
writebuf_off = req_off; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL ); \
|
||||||
|
err = read(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL ); \
|
||||||
|
if (err == -1) { \
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, \
|
||||||
|
MPIR_ERR_RECOVERABLE, myname, \
|
||||||
|
__LINE__, MPI_ERR_IO, \
|
||||||
|
"**ioRMWrdwr", 0); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
} \
|
||||||
|
write_sz = (int) (ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off)); \
|
||||||
|
memcpy(writebuf+req_off-writebuf_off, (char *)buf +userbuf_off, write_sz);\
|
||||||
|
while (write_sz != req_len) { \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL ); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
req_len -= write_sz; \
|
||||||
|
userbuf_off += write_sz; \
|
||||||
|
writebuf_off += writebuf_len; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL ); \
|
||||||
|
err = read(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL ); \
|
||||||
|
if (err == -1) { \
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, \
|
||||||
|
MPIR_ERR_RECOVERABLE, myname, \
|
||||||
|
__LINE__, MPI_ERR_IO, \
|
||||||
|
"**ioRMWrdwr", 0); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
write_sz = ADIOI_MIN(req_len, writebuf_len); \
|
||||||
|
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#else
|
||||||
#define ADIOI_BUFFERED_WRITE \
|
#define ADIOI_BUFFERED_WRITE \
|
||||||
{ \
|
{ \
|
||||||
if (req_off >= writebuf_off + writebuf_len) { \
|
if (req_off >= writebuf_off + writebuf_len) { \
|
||||||
@ -103,10 +192,47 @@ void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* this macro is used when filetype is contig and buftype is not contig.
|
/* this macro is used when filetype is contig and buftype is not contig.
|
||||||
it does not do a read-modify-write and does not lock*/
|
it does not do a read-modify-write and does not lock*/
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
#define ADIOI_BUFFERED_WRITE_WITHOUT_READ \
|
||||||
|
{ \
|
||||||
|
if (req_off >= writebuf_off + writebuf_len) { \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL ); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
writebuf_off = req_off; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
} \
|
||||||
|
write_sz = (int) (ADIOI_MIN(req_len, writebuf_off + writebuf_len - req_off)); \
|
||||||
|
memcpy(writebuf+req_off-writebuf_off, (char *)buf +userbuf_off, write_sz);\
|
||||||
|
while (write_sz != req_len) { \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL ); \
|
||||||
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL ); \
|
||||||
|
err = write(fd->fd_sys, writebuf, writebuf_len); \
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL ); \
|
||||||
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len); \
|
||||||
|
if (err == -1) err_flag = 1; \
|
||||||
|
req_len -= write_sz; \
|
||||||
|
userbuf_off += write_sz; \
|
||||||
|
writebuf_off += writebuf_len; \
|
||||||
|
writebuf_len = (int) (ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));\
|
||||||
|
write_sz = ADIOI_MIN(req_len, writebuf_len); \
|
||||||
|
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#else
|
||||||
#define ADIOI_BUFFERED_WRITE_WITHOUT_READ \
|
#define ADIOI_BUFFERED_WRITE_WITHOUT_READ \
|
||||||
{ \
|
{ \
|
||||||
if (req_off >= writebuf_off + writebuf_len) { \
|
if (req_off >= writebuf_off + writebuf_len) { \
|
||||||
@ -134,7 +260,7 @@ void ADIOI_NFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
memcpy(writebuf, (char *)buf + userbuf_off, write_sz);\
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
||||||
@ -214,9 +340,21 @@ void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* write the buffer out finally */
|
/* write the buffer out finally */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = write(fd->fd_sys, writebuf, writebuf_len);
|
err = write(fd->fd_sys, writebuf, writebuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
if (!(fd->atomicity)) ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
@ -318,8 +456,20 @@ void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
writebuf = (char *) ADIOI_Malloc(max_bufsize);
|
writebuf = (char *) ADIOI_Malloc(max_bufsize);
|
||||||
writebuf_len = (int)(ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));
|
writebuf_len = (int)(ADIOI_MIN(max_bufsize,end_offset-writebuf_off+1));
|
||||||
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = read(fd->fd_sys, writebuf, writebuf_len);
|
err = read(fd->fd_sys, writebuf, writebuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (err == -1) {
|
if (err == -1) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE,
|
MPIR_ERR_RECOVERABLE,
|
||||||
@ -438,9 +588,21 @@ void ADIOI_NFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* write the buffer out finally */
|
/* write the buffer out finally */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
lseek(fd->fd_sys, writebuf_off, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
if (!(fd->atomicity)) ADIOI_WRITE_LOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = write(fd->fd_sys, writebuf, writebuf_len);
|
err = write(fd->fd_sys, writebuf, writebuf_len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!(fd->atomicity))
|
if (!(fd->atomicity))
|
||||||
ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
ADIOI_UNLOCK(fd, writebuf_off, SEEK_SET, writebuf_len);
|
||||||
|
@ -61,6 +61,8 @@ void ADIOI_NTFS_IwriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
void ADIOI_NTFS_Flush(ADIO_File fd, int *error_code);
|
void ADIOI_NTFS_Flush(ADIO_File fd, int *error_code);
|
||||||
void ADIOI_NTFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code);
|
void ADIOI_NTFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code);
|
||||||
|
|
||||||
const char * ADIOI_NTFS_Strerror(int error);
|
#define FORMAT_MESSAGE_MIN_SIZE 100
|
||||||
|
#define ADIOI_NTFS_ERR_MSG_MAX FORMAT_MESSAGE_MIN_SIZE
|
||||||
|
void ADIOI_NTFS_Strerror(int error, char *errMsg, int errMsgLen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -16,11 +16,13 @@ void ADIOI_NTFS_Close(ADIO_File fd, int *error_code)
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -9,92 +9,12 @@
|
|||||||
int ADIOI_NTFS_ReadDone(ADIO_Request *request, ADIO_Status *status,
|
int ADIOI_NTFS_ReadDone(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
DWORD ret_val;
|
return 0;
|
||||||
int done = 0;
|
|
||||||
static char myname[] = "ADIOI_NTFS_ReadDone";
|
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL)
|
|
||||||
{
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((*request)->queued)
|
|
||||||
{
|
|
||||||
(*request)->nbytes = 0;
|
|
||||||
ret_val = GetOverlappedResult((*request)->fd, (*request)->handle, &(*request)->nbytes, FALSE);
|
|
||||||
|
|
||||||
if (!ret_val)
|
|
||||||
{
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
|
||||||
ret_val = GetLastError();
|
|
||||||
if (ret_val == ERROR_IO_INCOMPLETE)
|
|
||||||
{
|
|
||||||
done = 0;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(ret_val));
|
|
||||||
}
|
|
||||||
/* --END ERROR HANDLING-- */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
done = 1;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
done = 1;
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
}
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (done && ((*request)->nbytes != -1))
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (done)
|
|
||||||
{
|
|
||||||
/* if request is still queued in the system, it is also there
|
|
||||||
on ADIOI_Async_list. Delete it from there. */
|
|
||||||
if ((*request)->queued) ADIOI_Del_req_from_list(request);
|
|
||||||
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
if ((*request)->handle)
|
|
||||||
{
|
|
||||||
if (!CloseHandle(((OVERLAPPED*)((*request)->handle))->hEvent))
|
|
||||||
{
|
|
||||||
ret_val = GetLastError();
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(ret_val));
|
|
||||||
}
|
|
||||||
ADIOI_Free((*request)->handle);
|
|
||||||
}
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
}
|
|
||||||
return done;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ADIOI_NTFS_WriteDone(ADIO_Request *request, ADIO_Status *status,
|
int ADIOI_NTFS_WriteDone(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
static char myname[] = "ADIOI_NTFS_WriteDone";
|
return 0;
|
||||||
int ret_val;
|
|
||||||
ret_val = ADIOI_NTFS_ReadDone(request, status, error_code);
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
|
||||||
if (*error_code != MPI_SUCCESS)
|
|
||||||
{
|
|
||||||
*error_code = MPIO_Err_create_code(*error_code, MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
|
||||||
"**io", 0);
|
|
||||||
}
|
|
||||||
/* --END ERROR HANDLING-- */
|
|
||||||
return ret_val;
|
|
||||||
}
|
}
|
||||||
|
@ -22,12 +22,14 @@ void ADIOI_NTFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *e
|
|||||||
dwTemp = DWORDHIGH(fd->fp_sys_posn);
|
dwTemp = DWORDHIGH(fd->fp_sys_posn);
|
||||||
if (SetFilePointer(fd->fd_sys, DWORDLOW(fd->fp_sys_posn), &dwTemp, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
|
if (SetFilePointer(fd->fd_sys, DWORDLOW(fd->fp_sys_posn), &dwTemp, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -35,11 +37,13 @@ void ADIOI_NTFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int *e
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (fcntl_struct->fsize == INVALID_SET_FILE_POINTER)
|
if (fcntl_struct->fsize == INVALID_SET_FILE_POINTER)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
dwTemp = GetLastError();
|
dwTemp = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(dwTemp, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
__LINE__, MPI_ERR_IO, "**io",
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(dwTemp));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -18,11 +18,13 @@ void ADIOI_NTFS_Flush(ADIO_File fd, int *error_code)
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -14,18 +14,6 @@ void ADIOI_NTFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
int err;
|
int err;
|
||||||
static char myname[] = "ADIOI_NTFS_IreadContig";
|
static char myname[] = "ADIOI_NTFS_IreadContig";
|
||||||
|
|
||||||
(*request) = ADIOI_Malloc_request();
|
|
||||||
if ((*request) == NULL)
|
|
||||||
{
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
|
||||||
"**nomem", "**nomem %s", "ADIOI_Request");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
(*request)->optype = ADIOI_READ;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
MPI_Type_size(datatype, &typesize);
|
||||||
len = count * typesize;
|
len = count * typesize;
|
||||||
|
|
||||||
@ -33,15 +21,12 @@ void ADIOI_NTFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
{
|
{
|
||||||
offset = fd->fp_ind;
|
offset = fd->fp_ind;
|
||||||
}
|
}
|
||||||
err = ADIOI_NTFS_aio(fd, buf, len, offset, 0, &((*request)->handle));
|
err = ADIOI_NTFS_aio(fd, buf, len, offset, 0, request);
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL)
|
if (file_ptr_type == ADIO_INDIVIDUAL)
|
||||||
{
|
{
|
||||||
fd->fp_ind += len;
|
fd->fp_ind += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*request)->queued = 1;
|
|
||||||
ADIOI_Add_req_to_list(request);
|
|
||||||
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err != MPI_SUCCESS)
|
if (err != MPI_SUCCESS)
|
||||||
{
|
{
|
||||||
@ -54,5 +39,4 @@ void ADIOI_NTFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
fd->fp_sys_posn = -1; /* set it to null. */
|
fd->fp_sys_posn = -1; /* set it to null. */
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,171 @@
|
|||||||
|
|
||||||
#include "ad_ntfs.h"
|
#include "ad_ntfs.h"
|
||||||
|
|
||||||
|
#include "../../mpi-io/mpioimpl.h"
|
||||||
|
#include "../../mpi-io/mpioprof.h"
|
||||||
|
#include "mpiu_greq.h"
|
||||||
|
|
||||||
|
static MPIX_Grequest_class ADIOI_NTFS_greq_class = 0;
|
||||||
|
|
||||||
|
/* Fills the input buffer, errMsg, with the error message
|
||||||
|
corresponding to error code, error */
|
||||||
|
void ADIOI_NTFS_Strerror(int error, char *errMsg, int errMsgLen)
|
||||||
|
{
|
||||||
|
LPTSTR str;
|
||||||
|
int num_bytes;
|
||||||
|
num_bytes = FormatMessage(
|
||||||
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
||||||
|
FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
||||||
|
NULL,
|
||||||
|
error,
|
||||||
|
0,
|
||||||
|
&str,
|
||||||
|
FORMAT_MESSAGE_MIN_SIZE,
|
||||||
|
0);
|
||||||
|
if (num_bytes == 0)
|
||||||
|
{
|
||||||
|
strncpy(errMsg, "\0", errMsgLen);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
strncpy(errMsg, str, errMsgLen);
|
||||||
|
LocalFree(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* poll for completion of a single outstanding AIO request */
|
||||||
|
int ADIOI_NTFS_aio_poll_fn(void *extra_state, MPI_Status *status)
|
||||||
|
{
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
int mpi_errno = MPI_SUCCESS;
|
||||||
|
|
||||||
|
/* FIXME: Validate the args -- has it already been done by the
|
||||||
|
caller ? */
|
||||||
|
|
||||||
|
aio_req = (ADIOI_AIO_Request *)extra_state;
|
||||||
|
|
||||||
|
/* XXX: test for AIO completion here */
|
||||||
|
if(!GetOverlappedResult( aio_req->fd, aio_req->lpOvl,
|
||||||
|
&(aio_req->nbytes), FALSE)){
|
||||||
|
if(GetLastError() == ERROR_IO_INCOMPLETE){
|
||||||
|
/* IO in progress */
|
||||||
|
/* TODO: need to diddle with status somehow */
|
||||||
|
}else{
|
||||||
|
/* Error occured */
|
||||||
|
/* TODO: unsure how to handle this */
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
MPIR_Nest_incr();
|
||||||
|
mpi_errno = MPI_Grequest_complete(aio_req->req);
|
||||||
|
if (mpi_errno != MPI_SUCCESS) {
|
||||||
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
"ADIOI_NTFS_aio_poll_fn", __LINE__,
|
||||||
|
MPI_ERR_IO, "**mpi_grequest_complete",
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
MPIR_Nest_decr();
|
||||||
|
}
|
||||||
|
return mpi_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Wait for completion of one of the outstanding AIO requests */
|
||||||
|
int ADIOI_NTFS_aio_wait_fn(int count, void **array_of_states,
|
||||||
|
double timeout, MPI_Status *status)
|
||||||
|
{
|
||||||
|
int i, mpi_errno = MPI_SUCCESS;
|
||||||
|
ADIOI_AIO_Request **aio_reqlist;
|
||||||
|
LPHANDLE lpHandles;
|
||||||
|
DWORD retObject=0;
|
||||||
|
|
||||||
|
/* FIXME: Validate the args -- has it already been done by the
|
||||||
|
caller ? */
|
||||||
|
aio_reqlist = (ADIOI_AIO_Request **)array_of_states;
|
||||||
|
lpHandles = (LPHANDLE) ADIOI_Calloc(count, sizeof(HANDLE));
|
||||||
|
if (lpHandles == NULL)
|
||||||
|
{
|
||||||
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
"ADIOI_NTFS_aio_wait_fn", __LINE__, MPI_ERR_IO,
|
||||||
|
"**nomem", "**nomem %s", "Event handles");
|
||||||
|
return mpi_errno;
|
||||||
|
}
|
||||||
|
/* XXX: set-up arrays of outstanding requests */
|
||||||
|
for(i=0; i<count; i++){
|
||||||
|
lpHandles[i] = (aio_reqlist[i])->lpOvl->hEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* XXX: wait for one request to complete */
|
||||||
|
/* FIXME: Is the timeout in seconds ? */
|
||||||
|
timeout = (timeout <= 0) ? INFINITE : (timeout * 1000);
|
||||||
|
|
||||||
|
if((retObject = WaitForMultipleObjects(count, lpHandles,
|
||||||
|
FALSE, timeout)) != WAIT_FAILED){
|
||||||
|
retObject = retObject - WAIT_OBJECT_0;
|
||||||
|
if(GetOverlappedResult( aio_reqlist[retObject]->fd,
|
||||||
|
aio_reqlist[retObject]->lpOvl, &(aio_reqlist[retObject]->nbytes),
|
||||||
|
FALSE)){
|
||||||
|
/* XXX: mark completed requests as 'done'*/
|
||||||
|
MPIR_Nest_incr();
|
||||||
|
mpi_errno = MPI_Grequest_complete(aio_reqlist[retObject]->req);
|
||||||
|
if (mpi_errno != MPI_SUCCESS) {
|
||||||
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
"ADIOI_NTFS_aio_wait_fn", __LINE__,
|
||||||
|
MPI_ERR_IO, "**mpi_grequest_complete",
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
MPIR_Nest_decr();
|
||||||
|
}else{
|
||||||
|
if(GetLastError() == ERROR_IO_INCOMPLETE){
|
||||||
|
/* IO in progress */
|
||||||
|
/* TODO: need to diddle with status somehow */
|
||||||
|
}else{
|
||||||
|
/* Error occured */
|
||||||
|
/* TODO: not sure how to handle this */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
/* TODO: How to handle error while waiting ? */
|
||||||
|
}
|
||||||
|
ADIOI_Free(lpHandles);
|
||||||
|
return mpi_errno;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ADIOI_NTFS_aio_query_fn(void *extra_state, MPI_Status *status)
|
||||||
|
{
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
|
||||||
|
aio_req = (ADIOI_AIO_Request *)extra_state;
|
||||||
|
|
||||||
|
|
||||||
|
MPI_Status_set_elements(status, MPI_BYTE, aio_req->nbytes);
|
||||||
|
|
||||||
|
/* do i need to nest_incr/nest_decr here? */
|
||||||
|
/* can never cancel so always true */
|
||||||
|
MPI_Status_set_cancelled(status, 0);
|
||||||
|
|
||||||
|
/* choose not to return a value for this */
|
||||||
|
status->MPI_SOURCE = MPI_UNDEFINED;
|
||||||
|
/* tag has no meaning for this generalized request */
|
||||||
|
status->MPI_TAG = MPI_UNDEFINED;
|
||||||
|
/* this generalized request never fails */
|
||||||
|
return MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int ADIOI_NTFS_aio_free_fn(void *extra_state)
|
||||||
|
{
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
/* FIXME: Validate the args -- has it already been done by the
|
||||||
|
caller ? */
|
||||||
|
aio_req = (ADIOI_AIO_Request*)extra_state;
|
||||||
|
CloseHandle(aio_req->lpOvl->hEvent);
|
||||||
|
ADIOI_Free(aio_req->lpOvl);
|
||||||
|
ADIOI_Free(aio_req);
|
||||||
|
return MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
void ADIOI_NTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_NTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
ADIO_Offset offset, ADIO_Request *request,
|
ADIO_Offset offset, ADIO_Request *request,
|
||||||
@ -15,18 +180,6 @@ void ADIOI_NTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
int err;
|
int err;
|
||||||
static char myname[] = "ADIOI_NTFS_IwriteContig";
|
static char myname[] = "ADIOI_NTFS_IwriteContig";
|
||||||
|
|
||||||
*request = ADIOI_Malloc_request();
|
|
||||||
if ((*request) == NULL)
|
|
||||||
{
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
|
||||||
"**nomem", "**nomem %s", "ADIOI_Request");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
(*request)->optype = ADIOI_WRITE;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
MPI_Type_size(datatype, &typesize);
|
||||||
len = count * typesize;
|
len = count * typesize;
|
||||||
|
|
||||||
@ -34,15 +187,12 @@ void ADIOI_NTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
{
|
{
|
||||||
offset = fd->fp_ind;
|
offset = fd->fp_ind;
|
||||||
}
|
}
|
||||||
err = ADIOI_NTFS_aio(fd, buf, len, offset, 1, &((*request)->handle));
|
err = ADIOI_NTFS_aio(fd, buf, len, offset, 1, request);
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL)
|
if (file_ptr_type == ADIO_INDIVIDUAL)
|
||||||
{
|
{
|
||||||
fd->fp_ind += len;
|
fd->fp_ind += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*request)->queued = 1;
|
|
||||||
ADIOI_Add_req_to_list(request);
|
|
||||||
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err != MPI_SUCCESS)
|
if (err != MPI_SUCCESS)
|
||||||
{
|
{
|
||||||
@ -55,7 +205,6 @@ void ADIOI_NTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
fd->fp_sys_posn = -1; /* set it to null. */
|
fd->fp_sys_posn = -1; /* set it to null. */
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -65,56 +214,61 @@ void ADIOI_NTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
* Returns MPI_SUCCESS on success, mpi_errno on failure.
|
* Returns MPI_SUCCESS on success, mpi_errno on failure.
|
||||||
*/
|
*/
|
||||||
int ADIOI_NTFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
int ADIOI_NTFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
||||||
int wr, void *handle)
|
int wr, MPI_Request *request)
|
||||||
{
|
{
|
||||||
static char myname[] = "ADIOI_NTFS_aio";
|
static char myname[] = "ADIOI_NTFS_aio";
|
||||||
|
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
static DWORD dwNumWritten, dwNumRead;
|
static DWORD dwNumWritten, dwNumRead;
|
||||||
BOOL ret_val = FALSE;
|
BOOL ret_val = FALSE;
|
||||||
FDTYPE fd_sys;
|
FDTYPE fd_sys;
|
||||||
int mpi_errno = MPI_SUCCESS;
|
int mpi_errno = MPI_SUCCESS;
|
||||||
OVERLAPPED *pOvl;
|
|
||||||
DWORD err;
|
DWORD err;
|
||||||
|
|
||||||
fd_sys = fd->fd_sys;
|
fd_sys = fd->fd_sys;
|
||||||
|
|
||||||
pOvl = (OVERLAPPED *) ADIOI_Calloc(sizeof(OVERLAPPED), 1);
|
aio_req = (ADIOI_AIO_Request *)ADIOI_Calloc(sizeof(ADIOI_AIO_Request), 1);
|
||||||
if (pOvl == NULL)
|
if (aio_req == NULL)
|
||||||
|
{
|
||||||
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**nomem", "**nomem %s", "AIO_REQ");
|
||||||
|
return mpi_errno;
|
||||||
|
}
|
||||||
|
aio_req->lpOvl = (LPOVERLAPPED ) ADIOI_Calloc(sizeof(OVERLAPPED), 1);
|
||||||
|
if (aio_req->lpOvl == NULL)
|
||||||
{
|
{
|
||||||
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**nomem", "**nomem %s", "OVERLAPPED");
|
"**nomem", "**nomem %s", "OVERLAPPED");
|
||||||
|
ADIOI_Free(aio_req);
|
||||||
return mpi_errno;
|
return mpi_errno;
|
||||||
}
|
}
|
||||||
pOvl->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
|
aio_req->lpOvl->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||||
if (pOvl->hEvent == NULL)
|
if (aio_req->lpOvl->hEvent == NULL)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(aio_req->lpOvl);
|
||||||
|
ADIOI_Free(aio_req);
|
||||||
return mpi_errno;
|
return mpi_errno;
|
||||||
}
|
}
|
||||||
pOvl->Offset = DWORDLOW(offset);
|
aio_req->lpOvl->Offset = DWORDLOW(offset);
|
||||||
pOvl->OffsetHigh = DWORDHIGH(offset);
|
aio_req->lpOvl->OffsetHigh = DWORDHIGH(offset);
|
||||||
|
aio_req->fd = fd_sys;
|
||||||
|
|
||||||
|
/* XXX: initiate async I/O */
|
||||||
if (wr)
|
if (wr)
|
||||||
{
|
{
|
||||||
/*printf("WriteFile(%d bytes)\n", len);fflush(stdout);*/
|
ret_val = WriteFile(fd_sys, buf, len, &dwNumWritten, aio_req->lpOvl);
|
||||||
ret_val = WriteFile(fd_sys, buf, len, &dwNumWritten, pOvl);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/*
|
ret_val = ReadFile(fd_sys, buf, len, &dwNumRead, aio_req->lpOvl);
|
||||||
{
|
|
||||||
ADIO_Fcntl_t fcntl_struct;
|
|
||||||
int error_code;
|
|
||||||
ADIO_Fcntl(fd, ADIO_FCNTL_GET_FSIZE, &fcntl_struct, &error_code);
|
|
||||||
printf("File size a: %d\n", fcntl_struct.fsize);
|
|
||||||
}
|
|
||||||
printf("ReadFile(%d bytes)\n", len);fflush(stdout);
|
|
||||||
*/
|
|
||||||
ret_val = ReadFile(fd_sys, buf, len, &dwNumRead, pOvl);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
@ -123,44 +277,32 @@ int ADIOI_NTFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
|||||||
mpi_errno = GetLastError();
|
mpi_errno = GetLastError();
|
||||||
if (mpi_errno != ERROR_IO_PENDING)
|
if (mpi_errno != ERROR_IO_PENDING)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
|
ADIOI_NTFS_Strerror(mpi_errno, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
mpi_errno = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(mpi_errno));
|
"**io %s", errMsg);
|
||||||
return mpi_errno;
|
return mpi_errno;
|
||||||
}
|
}
|
||||||
mpi_errno = MPI_SUCCESS;
|
mpi_errno = MPI_SUCCESS;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
*((OVERLAPPED **) handle) = pOvl;
|
/* XXX: set up generalized request class and request */
|
||||||
|
if (ADIOI_NTFS_greq_class == 0) {
|
||||||
|
mpi_errno = MPIX_Grequest_class_create(ADIOI_NTFS_aio_query_fn,
|
||||||
|
ADIOI_NTFS_aio_free_fn, MPIU_Greq_cancel_fn,
|
||||||
|
ADIOI_NTFS_aio_poll_fn, ADIOI_NTFS_aio_wait_fn,
|
||||||
|
&ADIOI_NTFS_greq_class);
|
||||||
|
if(mpi_errno != MPI_SUCCESS){
|
||||||
|
/* FIXME: Pass appropriate error code to user */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mpi_errno = MPIX_Grequest_class_allocate(ADIOI_NTFS_greq_class, aio_req, request);
|
||||||
|
if(mpi_errno != MPI_SUCCESS){
|
||||||
|
/* FIXME: Pass appropriate error code to user */
|
||||||
|
}
|
||||||
|
memcpy(&(aio_req->req), request, sizeof(MPI_Request));
|
||||||
return mpi_errno;
|
return mpi_errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * ADIOI_NTFS_Strerror(int error)
|
|
||||||
{
|
|
||||||
/* obviously not thread safe to store a message like this */
|
|
||||||
static char msg[1024];
|
|
||||||
HLOCAL str;
|
|
||||||
int num_bytes;
|
|
||||||
num_bytes = FormatMessage(
|
|
||||||
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER,
|
|
||||||
0,
|
|
||||||
error,
|
|
||||||
MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
|
|
||||||
(LPTSTR) &str,
|
|
||||||
0,0);
|
|
||||||
if (num_bytes == 0)
|
|
||||||
{
|
|
||||||
*msg = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
memcpy(msg, str, num_bytes+1);
|
|
||||||
LocalFree(str);
|
|
||||||
strtok(msg, "\r\n");
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
|
@ -71,12 +71,14 @@ void ADIOI_NTFS_Open(ADIO_File fd, int *error_code)
|
|||||||
fd->fp_ind = fd->fp_sys_posn = SetFilePointer(fd->fd_sys, 0, NULL, FILE_END);
|
fd->fp_ind = fd->fp_sys_posn = SetFilePointer(fd->fd_sys, 0, NULL, FILE_END);
|
||||||
if (fd->fp_ind == INVALID_SET_FILE_POINTER)
|
if (fd->fp_ind == INVALID_SET_FILE_POINTER)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -85,11 +87,13 @@ void ADIOI_NTFS_Open(ADIO_File fd, int *error_code)
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (fd->fd_sys == INVALID_HANDLE_VALUE)
|
if (fd->fd_sys == INVALID_HANDLE_VALUE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -37,10 +37,12 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
pOvl->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
|
pOvl->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
|
||||||
if (pOvl->hEvent == NULL)
|
if (pOvl->hEvent == NULL)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -54,12 +56,14 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
dwTemp = DWORDHIGH(offset);
|
dwTemp = DWORDHIGH(offset);
|
||||||
if (SetFilePointer(fd->fd_sys, DWORDLOW(offset), &dwTemp, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
|
if (SetFilePointer(fd->fd_sys, DWORDLOW(offset), &dwTemp, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -79,7 +83,9 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
switch (err)
|
switch (err)
|
||||||
{
|
{
|
||||||
case ERROR_IO_PENDING:
|
case ERROR_IO_PENDING:
|
||||||
@ -92,7 +98,7 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -103,13 +109,15 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
if (err != ERROR_HANDLE_EOF) /* Ignore EOF errors */
|
if (err != ERROR_HANDLE_EOF) /* Ignore EOF errors */
|
||||||
{
|
{
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
__LINE__, MPI_ERR_IO, "**io",
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -118,10 +126,12 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
if (!CloseHandle(pOvl->hEvent))
|
if (!CloseHandle(pOvl->hEvent))
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -139,12 +149,14 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
dwTemp = DWORDHIGH(fd->fp_ind);
|
dwTemp = DWORDHIGH(fd->fp_ind);
|
||||||
if (SetFilePointer(fd->fd_sys, DWORDLOW(fd->fp_ind), &dwTemp, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
|
if (SetFilePointer(fd->fd_sys, DWORDLOW(fd->fp_ind), &dwTemp, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -164,7 +176,9 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
switch (err)
|
switch (err)
|
||||||
{
|
{
|
||||||
case ERROR_IO_PENDING:
|
case ERROR_IO_PENDING:
|
||||||
@ -177,7 +191,7 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -188,13 +202,15 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
if (err != ERROR_HANDLE_EOF) /* Ignore EOF errors */
|
if (err != ERROR_HANDLE_EOF) /* Ignore EOF errors */
|
||||||
{
|
{
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
__LINE__, MPI_ERR_IO, "**io",
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -203,10 +219,12 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
if (!CloseHandle(pOvl->hEvent))
|
if (!CloseHandle(pOvl->hEvent))
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -226,11 +244,13 @@ void ADIOI_NTFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -22,10 +22,12 @@ void ADIOI_NTFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code)
|
|||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -35,11 +37,13 @@ void ADIOI_NTFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code)
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (result == FALSE)
|
if (result == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -9,80 +9,12 @@
|
|||||||
void ADIOI_NTFS_ReadComplete(ADIO_Request *request, ADIO_Status *status,
|
void ADIOI_NTFS_ReadComplete(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
DWORD ret_val;
|
return;
|
||||||
static char myname[] = "ADIOI_NTFS_ReadComplete";
|
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL)
|
|
||||||
{
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((*request)->queued)
|
|
||||||
{
|
|
||||||
ret_val = GetOverlappedResult((*request)->fd, (*request)->handle,
|
|
||||||
&(*request)->nbytes, TRUE);
|
|
||||||
|
|
||||||
if (!ret_val)
|
|
||||||
(*request)->nbytes = -1;
|
|
||||||
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
|
||||||
if (ret_val == FALSE)
|
|
||||||
{
|
|
||||||
ret_val = GetLastError();
|
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
|
||||||
__LINE__, MPI_ERR_IO, "**io",
|
|
||||||
"**io %s", ADIOI_NTFS_Strerror(ret_val));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* --END ERROR HANDLING-- */
|
|
||||||
} /* if ((*request)->queued) ... */
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if ((*request)->nbytes != -1)
|
|
||||||
{
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((*request)->queued != -1)
|
|
||||||
{
|
|
||||||
/* queued = -1 is an internal hack used when the request must
|
|
||||||
be completed, but the request object should not be
|
|
||||||
freed. This is used in ADIOI_Complete_async, because the user
|
|
||||||
will call MPI_Wait later, which would require status to
|
|
||||||
be filled. Ugly but works. queued = -1 should be used only
|
|
||||||
in ADIOI_Complete_async.
|
|
||||||
This should not affect the user in any way. */
|
|
||||||
|
|
||||||
/* if request is still queued in the system, it is also there
|
|
||||||
on ADIOI_Async_list. Delete it from there. */
|
|
||||||
if ((*request)->queued) ADIOI_Del_req_from_list(request);
|
|
||||||
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
if ((*request)->handle)
|
|
||||||
{
|
|
||||||
CloseHandle(((OVERLAPPED*)((*request)->handle))->hEvent);
|
|
||||||
ADIOI_Free((*request)->handle);
|
|
||||||
}
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ADIOI_NTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status,
|
void ADIOI_NTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status,
|
||||||
int *error_code)
|
int *error_code)
|
||||||
{
|
{
|
||||||
static char myname[] = "ADIOI_NTFS_WriteComplete";
|
return;
|
||||||
ADIOI_NTFS_ReadComplete(request, status, error_code);
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
|
||||||
if (*error_code != MPI_SUCCESS)
|
|
||||||
{
|
|
||||||
*error_code = MPIO_Err_create_code(*error_code,
|
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
|
||||||
__LINE__, MPI_ERR_IO, "**io", 0);
|
|
||||||
}
|
|
||||||
/* --END ERROR HANDLING-- */
|
|
||||||
}
|
}
|
||||||
|
@ -37,10 +37,12 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
pOvl->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
|
pOvl->hEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
|
||||||
if (pOvl->hEvent == NULL)
|
if (pOvl->hEvent == NULL)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -57,9 +59,11 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -74,10 +78,12 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
if (err != ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -88,11 +94,13 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
__LINE__, MPI_ERR_IO, "**io",
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -100,10 +108,12 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
if (!CloseHandle(pOvl->hEvent))
|
if (!CloseHandle(pOvl->hEvent))
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -124,9 +134,11 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
if (err != NO_ERROR)
|
if (err != NO_ERROR)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -141,10 +153,12 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
if (err != ERROR_IO_PENDING)
|
if (err != ERROR_IO_PENDING)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -155,11 +169,13 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
__LINE__, MPI_ERR_IO, "**io",
|
__LINE__, MPI_ERR_IO, "**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
CloseHandle(pOvl->hEvent);
|
CloseHandle(pOvl->hEvent);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
@ -167,10 +183,12 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
if (!CloseHandle(pOvl->hEvent))
|
if (!CloseHandle(pOvl->hEvent))
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io", "**io %s", ADIOI_NTFS_Strerror(err));
|
"**io", "**io %s", errMsg);
|
||||||
ADIOI_Free(pOvl);
|
ADIOI_Free(pOvl);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -190,11 +208,13 @@ void ADIOI_NTFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err == FALSE)
|
if (err == FALSE)
|
||||||
{
|
{
|
||||||
|
char errMsg[ADIOI_NTFS_ERR_MSG_MAX];
|
||||||
err = GetLastError();
|
err = GetLastError();
|
||||||
|
ADIOI_NTFS_Strerror(err, errMsg, ADIOI_NTFS_ERR_MSG_MAX);
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
myname, __LINE__, MPI_ERR_IO,
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
"**io",
|
"**io",
|
||||||
"**io %s", ADIOI_NTFS_Strerror(err));
|
"**io %s", errMsg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
@ -23,4 +24,7 @@ libadio_panfs_la_SOURCES = \
|
|||||||
ad_panfs.c \
|
ad_panfs.c \
|
||||||
ad_panfs.h \
|
ad_panfs.h \
|
||||||
ad_panfs_hints.c \
|
ad_panfs_hints.c \
|
||||||
ad_panfs_open.c
|
ad_panfs_open.c \
|
||||||
|
ad_panfs_read.c \
|
||||||
|
ad_panfs_resize.c \
|
||||||
|
ad_panfs_write.c
|
||||||
|
@ -13,8 +13,8 @@
|
|||||||
|
|
||||||
struct ADIOI_Fns_struct ADIO_PANFS_operations = {
|
struct ADIOI_Fns_struct ADIO_PANFS_operations = {
|
||||||
ADIOI_PANFS_Open, /* Open */
|
ADIOI_PANFS_Open, /* Open */
|
||||||
ADIOI_GEN_ReadContig, /* ReadContig */
|
ADIOI_PANFS_ReadContig, /* ReadContig */
|
||||||
ADIOI_GEN_WriteContig, /* WriteContig */
|
ADIOI_PANFS_WriteContig, /* WriteContig */
|
||||||
ADIOI_GEN_ReadStridedColl, /* ReadStridedColl */
|
ADIOI_GEN_ReadStridedColl, /* ReadStridedColl */
|
||||||
ADIOI_GEN_WriteStridedColl, /* WriteStridedColl */
|
ADIOI_GEN_WriteStridedColl, /* WriteStridedColl */
|
||||||
ADIOI_GEN_SeekIndividual, /* SeekIndividual */
|
ADIOI_GEN_SeekIndividual, /* SeekIndividual */
|
||||||
@ -23,8 +23,13 @@ struct ADIOI_Fns_struct ADIO_PANFS_operations = {
|
|||||||
ADIOI_GEN_ReadStrided, /* ReadStrided */
|
ADIOI_GEN_ReadStrided, /* ReadStrided */
|
||||||
ADIOI_GEN_WriteStrided, /* WriteStrided */
|
ADIOI_GEN_WriteStrided, /* WriteStrided */
|
||||||
ADIOI_GEN_Close, /* Close */
|
ADIOI_GEN_Close, /* Close */
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
ADIOI_GEN_IreadContig, /* IreadContig */
|
ADIOI_GEN_IreadContig, /* IreadContig */
|
||||||
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
||||||
|
#else
|
||||||
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
|
#endif
|
||||||
ADIOI_GEN_IODone, /* ReadDone */
|
ADIOI_GEN_IODone, /* ReadDone */
|
||||||
ADIOI_GEN_IODone, /* WriteDone */
|
ADIOI_GEN_IODone, /* WriteDone */
|
||||||
ADIOI_GEN_IOComplete, /* ReadComplete */
|
ADIOI_GEN_IOComplete, /* ReadComplete */
|
||||||
@ -32,6 +37,6 @@ struct ADIOI_Fns_struct ADIO_PANFS_operations = {
|
|||||||
ADIOI_GEN_IreadStrided, /* IreadStrided */
|
ADIOI_GEN_IreadStrided, /* IreadStrided */
|
||||||
ADIOI_GEN_IwriteStrided, /* IwriteStrided */
|
ADIOI_GEN_IwriteStrided, /* IwriteStrided */
|
||||||
ADIOI_GEN_Flush, /* Flush */
|
ADIOI_GEN_Flush, /* Flush */
|
||||||
ADIOI_GEN_Resize, /* Resize */
|
ADIOI_PANFS_Resize, /* Resize */
|
||||||
ADIOI_GEN_Delete, /* Delete */
|
ADIOI_GEN_Delete, /* Delete */
|
||||||
};
|
};
|
||||||
|
@ -6,8 +6,8 @@
|
|||||||
* See COPYRIGHT notice in top-level directory.
|
* See COPYRIGHT notice in top-level directory.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef AD_UNIX_INCLUDE
|
#ifndef AD_PANFS_INCLUDE
|
||||||
#define AD_UNIX_INCLUDE
|
#define AD_PANFS_INCLUDE
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
@ -25,28 +25,32 @@ typedef struct adiocb adiocb_t;
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int ADIOI_PANFS_aio(ADIO_File fd, void *buf, int len, ADIO_Offset offset,
|
|
||||||
int wr, void *handle);
|
|
||||||
|
|
||||||
void ADIOI_PANFS_Open(ADIO_File fd, int *error_code);
|
void ADIOI_PANFS_Open(ADIO_File fd, int *error_code);
|
||||||
void ADIOI_PANFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
|
||||||
ADIO_Offset offset, ADIO_Request *request, int
|
|
||||||
*error_code);
|
|
||||||
void ADIOI_PANFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
|
||||||
ADIO_Offset offset, ADIO_Request *request, int
|
|
||||||
*error_code);
|
|
||||||
int ADIOI_PANFS_ReadDone(ADIO_Request *request, ADIO_Status *status, int
|
|
||||||
*error_code);
|
|
||||||
int ADIOI_PANFS_WriteDone(ADIO_Request *request, ADIO_Status *status, int
|
|
||||||
*error_code);
|
|
||||||
void ADIOI_PANFS_ReadComplete(ADIO_Request *request, ADIO_Status *status, int
|
|
||||||
*error_code);
|
|
||||||
void ADIOI_PANFS_WriteComplete(ADIO_Request *request, ADIO_Status *status,
|
|
||||||
int *error_code);
|
|
||||||
void ADIOI_PANFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct, int
|
|
||||||
*error_code);
|
|
||||||
void ADIOI_PANFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
|
void ADIOI_PANFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
|
||||||
|
void ADIOI_PANFS_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status,
|
||||||
|
int *error_code);
|
||||||
|
void ADIOI_PANFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code);
|
||||||
|
void ADIOI_PANFS_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status,
|
||||||
|
int *error_code);
|
||||||
|
|
||||||
|
/* Delay 1 ms */
|
||||||
|
#define AD_PANFS_RETRY_DELAY 1000
|
||||||
|
|
||||||
|
#define AD_PANFS_RETRY(_op_,_rc_) \
|
||||||
|
{ \
|
||||||
|
_rc_ = (_op_); \
|
||||||
|
while(_rc_ == -1 && errno == EAGAIN) \
|
||||||
|
{ \
|
||||||
|
if(usleep(AD_PANFS_RETRY_DELAY) == -1) \
|
||||||
|
{ \
|
||||||
|
break; \
|
||||||
|
} \
|
||||||
|
_rc_ = (_op_); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#include "ad_panfs.h"
|
#include "ad_panfs.h"
|
||||||
#include <pan_fs_client_cw_mode.h>
|
#include <pan_fs_client_cw_mode.h>
|
||||||
#include "opal/mca/base/mca_base_param.h"
|
|
||||||
|
|
||||||
void ADIOI_PANFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
|
void ADIOI_PANFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
|
||||||
{
|
{
|
||||||
@ -117,7 +116,7 @@ void ADIOI_PANFS_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code)
|
|||||||
|
|
||||||
MPI_Info_get(users_info, "panfs_layout_visit_policy", MPI_MAX_INFO_VAL,
|
MPI_Info_get(users_info, "panfs_layout_visit_policy", MPI_MAX_INFO_VAL,
|
||||||
value, &flag);
|
value, &flag);
|
||||||
if (flag && (layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE)) {
|
if (flag && (layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE || layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID10)) {
|
||||||
layout_visit_policy = strtoul(value,NULL,10);
|
layout_visit_policy = strtoul(value,NULL,10);
|
||||||
tmp_val = layout_visit_policy;
|
tmp_val = layout_visit_policy;
|
||||||
MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm);
|
MPI_Bcast(&tmp_val, 1, MPI_INT, 0, fd->comm);
|
||||||
|
@ -33,6 +33,9 @@ void ADIOI_PANFS_Open(ADIO_File fd, int *error_code)
|
|||||||
unsigned long int layout_parity_stripe_depth = 0;
|
unsigned long int layout_parity_stripe_depth = 0;
|
||||||
unsigned long int layout_total_num_comps = 0;
|
unsigned long int layout_total_num_comps = 0;
|
||||||
pan_fs_client_layout_visit_t layout_visit_policy = PAN_FS_CLIENT_LAYOUT_VISIT__ROUND_ROBIN;
|
pan_fs_client_layout_visit_t layout_visit_policy = PAN_FS_CLIENT_LAYOUT_VISIT__ROUND_ROBIN;
|
||||||
|
int myrank;
|
||||||
|
|
||||||
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
value = (char *) ADIOI_Malloc((MPI_MAX_INFO_VAL+1)*sizeof(char));
|
||||||
@ -68,10 +71,10 @@ void ADIOI_PANFS_Open(ADIO_File fd, int *error_code)
|
|||||||
}
|
}
|
||||||
ADIOI_Free(value);
|
ADIOI_Free(value);
|
||||||
|
|
||||||
amode = amode | O_CREAT;
|
amode = amode | O_CREAT;
|
||||||
/* Check for valid set of hints */
|
/* Check for valid set of hints */
|
||||||
if ((layout_type < PAN_FS_CLIENT_LAYOUT_TYPE__DEFAULT) ||
|
if ((layout_type < PAN_FS_CLIENT_LAYOUT_TYPE__DEFAULT) ||
|
||||||
(layout_type > PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE))
|
(layout_type > PAN_FS_CLIENT_LAYOUT_TYPE__RAID10))
|
||||||
{
|
{
|
||||||
FPRINTF(stderr, "%s: panfs_layout_type is not a valid value: %u.\n", myname, layout_type);
|
FPRINTF(stderr, "%s: panfs_layout_type is not a valid value: %u.\n", myname, layout_type);
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
@ -121,99 +124,136 @@ void ADIOI_PANFS_Open(ADIO_File fd, int *error_code)
|
|||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID0) ||
|
if (layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID10)
|
||||||
(layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE))
|
{
|
||||||
{
|
if ((layout_stripe_unit == 0) || (layout_total_num_comps == 0))
|
||||||
int myrank;
|
{
|
||||||
|
if(layout_stripe_unit == 0)
|
||||||
MPI_Comm_rank(fd->comm, &myrank);
|
|
||||||
if (myrank == 0) {
|
|
||||||
pan_fs_client_layout_create_args_t file_create_args;
|
|
||||||
int fd_dir;
|
|
||||||
char* slash;
|
|
||||||
struct stat stat_buf;
|
|
||||||
int err;
|
|
||||||
char *value, *path, *file_name_ptr;
|
|
||||||
|
|
||||||
/* Check that the file does not exist before
|
|
||||||
* trying to create it. The ioctl itself should
|
|
||||||
* be able to handle this condition. Currently,
|
|
||||||
* the ioctl will return successfully if the file
|
|
||||||
* has been previously created. Filed bug 33862
|
|
||||||
* to track the problem.
|
|
||||||
*/
|
|
||||||
err = stat(fd->filename,&stat_buf);
|
|
||||||
if((err == -1) && (errno != ENOENT))
|
|
||||||
{
|
{
|
||||||
FPRINTF(stderr,"%s: Unexpected I/O Error calling stat() on PanFS file: %s.\n", myname, strerror(errno));
|
FPRINTF(stderr, "%s: MPI_Info does not contain the panfs_layout_stripe_unit hint which is necessary to specify a valid RAID10 layout to the PAN_FS_CLIENT_LAYOUT_CREATE_FILE ioctl.\n", myname);
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
}
|
||||||
else if (err == 0)
|
if(layout_total_num_comps == 0)
|
||||||
{
|
{
|
||||||
FPRINTF(stderr,"%s: Cannot create PanFS file with ioctl when file already exists.\n", myname);
|
FPRINTF(stderr, "%s: MPI_Info does not contain the panfs_layout_total_num_comps hint which is necessary to specify a valid RAID10 layout to the PAN_FS_CLIENT_LAYOUT_CREATE_FILE ioctl.\n", myname);
|
||||||
|
}
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
if ((layout_visit_policy < PAN_FS_CLIENT_LAYOUT_VISIT__ROUND_ROBIN) ||
|
||||||
|
(layout_visit_policy > PAN_FS_CLIENT_LAYOUT_VISIT__ROUND_ROBIN_WITH_HASHED_OFFSET))
|
||||||
|
{
|
||||||
|
FPRINTF(stderr, "%s: panfs_layout_visit_policy is not a valid value: %u.\n", myname, layout_visit_policy);
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Create the file via ioctl() or open(). ADIOI_PANFS_Open's caller
|
||||||
|
* already optimizes performance by only calling this function with
|
||||||
|
* ADIO_CREATE on rank 0. Therefore, we don't need to worry about
|
||||||
|
* implementing that optimization here. */
|
||||||
|
if((layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID0) || (layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE)
|
||||||
|
|| (layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID10)) {
|
||||||
|
pan_fs_client_layout_create_args_t file_create_args;
|
||||||
|
int fd_dir;
|
||||||
|
char* slash;
|
||||||
|
struct stat stat_buf;
|
||||||
|
int err;
|
||||||
|
char *value, *path, *file_name_ptr;
|
||||||
|
|
||||||
|
/* Check that the file does not exist before
|
||||||
|
* trying to create it. The ioctl itself should
|
||||||
|
* be able to handle this condition. Currently,
|
||||||
|
* the ioctl will return successfully if the file
|
||||||
|
* has been previously created. Filed bug 33862
|
||||||
|
* to track the problem.
|
||||||
|
*/
|
||||||
|
err = stat(fd->filename,&stat_buf);
|
||||||
|
if((err == -1) && (errno != ENOENT))
|
||||||
|
{
|
||||||
|
FPRINTF(stderr,"%s: Unexpected I/O Error calling stat() on PanFS file: %s.\n", myname, strerror(errno));
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
else if (err == 0)
|
||||||
|
{
|
||||||
|
FPRINTF(stderr,"%s: Cannot create PanFS file with ioctl when file already exists.\n", myname);
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* (err == -1) && (errno == ENOENT) */
|
||||||
|
/* File does not exist */
|
||||||
|
path = ADIOI_Strdup(fd->filename);
|
||||||
|
slash = strrchr(path, '/');
|
||||||
|
if (!slash)
|
||||||
|
ADIOI_Strncpy(path, ".", 2);
|
||||||
|
else {
|
||||||
|
if (slash == path)
|
||||||
|
*(path + 1) = '\0';
|
||||||
|
else *slash = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create PanFS object */
|
||||||
|
bzero(&file_create_args,sizeof(pan_fs_client_layout_create_args_t));
|
||||||
|
/* open directory */
|
||||||
|
fd_dir = open(path, O_RDONLY);
|
||||||
|
if (fd_dir < 0) {
|
||||||
|
FPRINTF(stderr, "%s: I/O Error opening parent directory to create PanFS file using ioctl: %s.\n", myname, strerror(errno));
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* (err == -1) && (errno == ENOENT) */
|
char *file_name_ptr = fd->filename;
|
||||||
/* File does not exist */
|
slash = strrchr(fd->filename, '/');
|
||||||
path = ADIOI_Strdup(fd->filename);
|
if (slash)
|
||||||
slash = strrchr(path, '/');
|
{
|
||||||
if (!slash)
|
file_name_ptr = slash + 1;
|
||||||
ADIOI_Strncpy(path, ".", 2);
|
|
||||||
else {
|
|
||||||
if (slash == path)
|
|
||||||
*(path + 1) = '\0';
|
|
||||||
else *slash = '\0';
|
|
||||||
}
|
}
|
||||||
|
/* create file in the directory */
|
||||||
/* create PanFS object */
|
file_create_args.mode = perm;
|
||||||
bzero(&file_create_args,sizeof(pan_fs_client_layout_create_args_t));
|
file_create_args.version = PAN_FS_CLIENT_LAYOUT_VERSION;
|
||||||
/* open directory */
|
file_create_args.flags = PAN_FS_CLIENT_LAYOUT_CREATE_F__NONE;
|
||||||
fd_dir = open(path, O_RDONLY);
|
ADIOI_Strncpy(file_create_args.filename, file_name_ptr, strlen(fd->filename)+1);
|
||||||
if (fd_dir < 0) {
|
file_create_args.layout.agg_type = layout_type;
|
||||||
FPRINTF(stderr, "%s: I/O Error opening parent directory to create PanFS file using ioctl: %s.\n", myname, strerror(errno));
|
file_create_args.layout.layout_is_valid = 1;
|
||||||
|
if(layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE)
|
||||||
|
{
|
||||||
|
file_create_args.layout.u.raid1_5_parity_stripe.total_num_comps = layout_total_num_comps;
|
||||||
|
file_create_args.layout.u.raid1_5_parity_stripe.parity_stripe_width = layout_parity_stripe_width;
|
||||||
|
file_create_args.layout.u.raid1_5_parity_stripe.parity_stripe_depth = layout_parity_stripe_depth;
|
||||||
|
file_create_args.layout.u.raid1_5_parity_stripe.stripe_unit = layout_stripe_unit;
|
||||||
|
file_create_args.layout.u.raid1_5_parity_stripe.layout_visit_policy = layout_visit_policy;
|
||||||
|
}
|
||||||
|
else if(layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID0)
|
||||||
|
{
|
||||||
|
file_create_args.layout.u.raid0.total_num_comps = layout_total_num_comps;
|
||||||
|
file_create_args.layout.u.raid0.stripe_unit = layout_stripe_unit;
|
||||||
|
}
|
||||||
|
else if(layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID10)
|
||||||
|
{
|
||||||
|
file_create_args.layout.u.raid10.total_num_comps = layout_total_num_comps;
|
||||||
|
file_create_args.layout.u.raid10.stripe_unit = layout_stripe_unit;
|
||||||
|
file_create_args.layout.u.raid10.layout_visit_policy = layout_visit_policy;
|
||||||
|
}
|
||||||
|
err = ioctl(fd_dir, PAN_FS_CLIENT_LAYOUT_CREATE_FILE, &file_create_args);
|
||||||
|
if (err < 0) {
|
||||||
|
FPRINTF(stderr, "%s: I/O Error doing ioctl on parent directory to create PanFS file using ioctl: %s.\n", myname, strerror(errno));
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
}
|
}
|
||||||
else
|
err = close(fd_dir);
|
||||||
{
|
|
||||||
char *file_name_ptr = fd->filename;
|
|
||||||
slash = strrchr(fd->filename, '/');
|
|
||||||
if (slash)
|
|
||||||
{
|
|
||||||
file_name_ptr = slash + 1;
|
|
||||||
}
|
|
||||||
/* create file in the directory */
|
|
||||||
file_create_args.mode = perm;
|
|
||||||
file_create_args.version = PAN_FS_CLIENT_LAYOUT_VERSION;
|
|
||||||
file_create_args.flags = PAN_FS_CLIENT_LAYOUT_CREATE_F__NONE;
|
|
||||||
ADIOI_Strncpy(file_create_args.filename, file_name_ptr, strlen(fd->filename)+1);
|
|
||||||
file_create_args.layout.agg_type = layout_type;
|
|
||||||
file_create_args.layout.layout_is_valid = 1;
|
|
||||||
if(layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID1_5_PARITY_STRIPE)
|
|
||||||
{
|
|
||||||
file_create_args.layout.u.raid1_5_parity_stripe.total_num_comps = layout_total_num_comps;
|
|
||||||
file_create_args.layout.u.raid1_5_parity_stripe.parity_stripe_width = layout_parity_stripe_width;
|
|
||||||
file_create_args.layout.u.raid1_5_parity_stripe.parity_stripe_depth = layout_parity_stripe_depth;
|
|
||||||
file_create_args.layout.u.raid1_5_parity_stripe.stripe_unit = layout_stripe_unit;
|
|
||||||
file_create_args.layout.u.raid1_5_parity_stripe.layout_visit_policy = layout_visit_policy;
|
|
||||||
}
|
|
||||||
else if(layout_type == PAN_FS_CLIENT_LAYOUT_TYPE__RAID0)
|
|
||||||
{
|
|
||||||
file_create_args.layout.u.raid0.total_num_comps = layout_total_num_comps;
|
|
||||||
file_create_args.layout.u.raid0.stripe_unit = layout_stripe_unit;
|
|
||||||
}
|
|
||||||
err = ioctl(fd_dir, PAN_FS_CLIENT_LAYOUT_CREATE_FILE, &file_create_args);
|
|
||||||
if (err < 0) {
|
|
||||||
FPRINTF(stderr, "%s: I/O Error doing ioctl on parent directory to create PanFS file using ioctl: %s.\n", myname, strerror(errno));
|
|
||||||
MPI_Abort(MPI_COMM_WORLD, 1);
|
|
||||||
}
|
|
||||||
err = close(fd_dir);
|
|
||||||
}
|
|
||||||
ADIOI_Free(path);
|
|
||||||
}
|
}
|
||||||
|
ADIOI_Free(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int create_fd = open(fd->filename,amode,perm);
|
||||||
|
if(create_fd != -1)
|
||||||
|
{
|
||||||
|
close(create_fd);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FPRINTF(stderr, "%s: I/O Error creating PanFS file using open: %s.\n", myname, strerror(errno));
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
}
|
}
|
||||||
MPI_Barrier(fd->comm);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (fd->access_mode & ADIO_RDONLY)
|
if (fd->access_mode & ADIO_RDONLY)
|
||||||
@ -279,6 +319,14 @@ void ADIOI_PANFS_Open(ADIO_File fd, int *error_code)
|
|||||||
ADIOI_Snprintf(temp_buffer,TEMP_BUFFER_SIZE,"%u",file_query_args.layout.u.raid1_5_parity_stripe.layout_visit_policy);
|
ADIOI_Snprintf(temp_buffer,TEMP_BUFFER_SIZE,"%u",file_query_args.layout.u.raid1_5_parity_stripe.layout_visit_policy);
|
||||||
MPI_Info_set(fd->info, "panfs_layout_visit_policy", temp_buffer);
|
MPI_Info_set(fd->info, "panfs_layout_visit_policy", temp_buffer);
|
||||||
break;
|
break;
|
||||||
|
case PAN_FS_CLIENT_LAYOUT_TYPE__RAID10:
|
||||||
|
ADIOI_Snprintf(temp_buffer,TEMP_BUFFER_SIZE,"%u",file_query_args.layout.u.raid10.stripe_unit);
|
||||||
|
MPI_Info_set(fd->info, "panfs_layout_stripe_unit", temp_buffer);
|
||||||
|
ADIOI_Snprintf(temp_buffer,TEMP_BUFFER_SIZE,"%u",file_query_args.layout.u.raid10.total_num_comps);
|
||||||
|
MPI_Info_set(fd->info, "panfs_layout_total_num_comps", temp_buffer);
|
||||||
|
ADIOI_Snprintf(temp_buffer,TEMP_BUFFER_SIZE,"%u",file_query_args.layout.u.raid10.layout_visit_policy);
|
||||||
|
MPI_Info_set(fd->info, "panfs_layout_visit_policy", temp_buffer);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
68
ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_read.c
Обычный файл
68
ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_read.c
Обычный файл
@ -0,0 +1,68 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_panfs.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ADIOI_PANFS_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status,
|
||||||
|
int *error_code)
|
||||||
|
{
|
||||||
|
int err = -1, datatype_size, len;
|
||||||
|
static char myname[] = "ADIOI_PANFS_READCONTIG";
|
||||||
|
|
||||||
|
MPI_Type_size(datatype, &datatype_size);
|
||||||
|
len = datatype_size * count;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
err = lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
fd->fp_sys_posn = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
|
||||||
|
AD_PANFS_RETRY(read(fd->fd_sys, buf, len),err)
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
fd->fp_sys_posn = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
fd->fp_ind += err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
if (err != -1) MPIR_Status_set_bytes(status, datatype, err);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
49
ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_resize.c
Обычный файл
49
ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_resize.c
Обычный файл
@ -0,0 +1,49 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2004 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_panfs.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ADIOI_PANFS_Resize(ADIO_File fd, ADIO_Offset size, int *error_code)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
int myrank;
|
||||||
|
struct stat stat_buf;
|
||||||
|
static char myname[] = "ADIOI_PANFS_RESIZE";
|
||||||
|
|
||||||
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
|
if (!myrank)
|
||||||
|
{
|
||||||
|
AD_PANFS_RETRY(ftruncate(fd->fd_sys,size),err);
|
||||||
|
MPI_Barrier(fd->comm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MPI_Barrier(fd->comm);
|
||||||
|
AD_PANFS_RETRY(fstat(fd->fd_sys,&stat_buf),err);
|
||||||
|
if(((ADIO_Offset)stat_buf.st_size) != size)
|
||||||
|
{
|
||||||
|
/* This should never happen otherwise there is a coherency problem. */
|
||||||
|
FPRINTF(stderr, "%s: Rank %d: Resize failed: requested=%llu actual=%llu.\n",myname,myrank,size,stat_buf.st_size);
|
||||||
|
MPI_Abort(MPI_COMM_WORLD, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__, MPI_ERR_IO,
|
||||||
|
"**io", "**io %s", strerror(errno));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
68
ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_write.c
Обычный файл
68
ompi/mca/io/romio/romio/adio/ad_panfs/ad_panfs_write.c
Обычный файл
@ -0,0 +1,68 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*- */
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2004 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "ad_panfs.h"
|
||||||
|
|
||||||
|
#ifdef HAVE_UNISTD_H
|
||||||
|
#include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void ADIOI_PANFS_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, ADIO_Status *status,
|
||||||
|
int *error_code)
|
||||||
|
{
|
||||||
|
int err = -1, datatype_size, len;
|
||||||
|
static char myname[] = "ADIOI_PANFS_WRITECONTIG";
|
||||||
|
|
||||||
|
MPI_Type_size(datatype, &datatype_size);
|
||||||
|
len = datatype_size * count;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
err = lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
fd->fp_sys_posn = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
}
|
||||||
|
|
||||||
|
AD_PANFS_RETRY(write(fd->fd_sys, buf, len),err)
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (err == -1) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
MPI_ERR_IO, "**io",
|
||||||
|
"**io %s", strerror(errno));
|
||||||
|
fd->fp_sys_posn = -1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
fd->fp_sys_posn = offset + err;
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
fd->fp_ind += err;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAVE_STATUS_SET_BYTES
|
||||||
|
if (err != -1 && status) MPIR_Status_set_bytes(status, datatype, err);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
}
|
@ -39,7 +39,7 @@ void ADIOI_PFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* exceeded the max. no. of outstanding requests. */
|
/* exceeded the max. no. of outstanding requests. */
|
||||||
|
|
||||||
/* complete all previous async. requests */
|
/* complete all previous async. requests */
|
||||||
ADIOI_Complete_async(error_code);
|
/*ADIOI_Complete_async(error_code); */
|
||||||
if (*error_code != MPI_SUCCESS) return;
|
if (*error_code != MPI_SUCCESS) return;
|
||||||
|
|
||||||
/* try again */
|
/* try again */
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ad_pfs.h"
|
#include "ad_pfs.h"
|
||||||
#ifdef PROFILE
|
|
||||||
#include "mpe.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ADIOI_PFS_Open(ADIO_File fd, int *error_code)
|
void ADIOI_PFS_Open(ADIO_File fd, int *error_code)
|
||||||
{
|
{
|
||||||
@ -39,15 +36,9 @@ void ADIOI_PFS_Open(ADIO_File fd, int *error_code)
|
|||||||
MPI_Comm_size(MPI_COMM_WORLD, &np_total);
|
MPI_Comm_size(MPI_COMM_WORLD, &np_total);
|
||||||
MPI_Comm_size(fd->comm, &np_comm);
|
MPI_Comm_size(fd->comm, &np_comm);
|
||||||
|
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(1, 0, "start open");
|
|
||||||
#endif
|
|
||||||
if (np_total == np_comm)
|
if (np_total == np_comm)
|
||||||
fd->fd_sys = _gopen(fd->filename, amode, M_ASYNC, perm);
|
fd->fd_sys = _gopen(fd->filename, amode, M_ASYNC, perm);
|
||||||
else fd->fd_sys = open(fd->filename, amode, perm);
|
else fd->fd_sys = open(fd->filename, amode, perm);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(2, 0, "end open");
|
|
||||||
#endif
|
|
||||||
fd->fd_direct = -1;
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
if (fd->fd_sys != -1) {
|
if (fd->fd_sys != -1) {
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ad_pfs.h"
|
#include "ad_pfs.h"
|
||||||
#ifdef PROFILE
|
|
||||||
#include "mpe.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ADIOI_PFS_ReadContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_PFS_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
@ -22,41 +19,17 @@ void ADIOI_PFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset) {
|
if (fd->fp_sys_posn != offset) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
lseek(fd->fd_sys, offset, SEEK_SET);
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(3, 0, "start read");
|
|
||||||
#endif
|
|
||||||
err = _cread(fd->fd_sys, buf, len);
|
err = _cread(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(4, 0, "end read");
|
|
||||||
#endif
|
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* read from curr. location of ind. file pointer */
|
else { /* read from curr. location of ind. file pointer */
|
||||||
if (fd->fp_sys_posn != fd->fp_ind) {
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(3, 0, "start read");
|
|
||||||
#endif
|
|
||||||
err = _cread(fd->fd_sys, buf, len);
|
err = _cread(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(4, 0, "end read");
|
|
||||||
#endif
|
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ad_pfs.h"
|
#include "ad_pfs.h"
|
||||||
#ifdef PROFILE
|
|
||||||
#include "mpe.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ADIOI_PFS_WriteContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_PFS_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
@ -23,41 +20,17 @@ void ADIOI_PFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset) {
|
if (fd->fp_sys_posn != offset) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
lseek(fd->fd_sys, offset, SEEK_SET);
|
lseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(5, 0, "start write");
|
|
||||||
#endif
|
|
||||||
err = _cwrite(fd->fd_sys, buf, len);
|
err = _cwrite(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(6, 0, "end write");
|
|
||||||
#endif
|
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* write from curr. location of ind. file pointer */
|
else { /* write from curr. location of ind. file pointer */
|
||||||
if (fd->fp_sys_posn != fd->fp_ind) {
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
lseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(5, 0, "start write");
|
|
||||||
#endif
|
|
||||||
err = _cwrite(fd->fd_sys, buf, len);
|
err = _cwrite(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(6, 0, "end write");
|
|
||||||
#endif
|
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ad_piofs.h"
|
#include "ad_piofs.h"
|
||||||
#ifdef PROFILE
|
|
||||||
#include "mpe.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ADIOI_PIOFS_Open(ADIO_File fd, int *error_code)
|
void ADIOI_PIOFS_Open(ADIO_File fd, int *error_code)
|
||||||
{
|
{
|
||||||
@ -38,16 +35,9 @@ void ADIOI_PIOFS_Open(ADIO_File fd, int *error_code)
|
|||||||
if (fd->access_mode & ADIO_EXCL)
|
if (fd->access_mode & ADIO_EXCL)
|
||||||
amode = amode | O_EXCL;
|
amode = amode | O_EXCL;
|
||||||
|
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(1, 0, "start open");
|
|
||||||
#endif
|
|
||||||
fd->fd_sys = open(fd->filename, amode, perm);
|
fd->fd_sys = open(fd->filename, amode, perm);
|
||||||
fd->fd_direct = -1;
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(2, 0, "end open");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
llseek(fd->fd_sys, 0, SEEK_SET);
|
llseek(fd->fd_sys, 0, SEEK_SET);
|
||||||
/* required to initiate use of 64-bit offset */
|
/* required to initiate use of 64-bit offset */
|
||||||
|
|
||||||
|
@ -6,9 +6,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "ad_piofs.h"
|
#include "ad_piofs.h"
|
||||||
#ifdef PROFILE
|
|
||||||
#include "mpe.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ADIOI_PIOFS_ReadContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_PIOFS_ReadContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
@ -24,41 +21,17 @@ void ADIOI_PIOFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset) {
|
if (fd->fp_sys_posn != offset) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
llseek(fd->fd_sys, offset, SEEK_SET);
|
llseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(3, 0, "start read");
|
|
||||||
#endif
|
|
||||||
err = read(fd->fd_sys, buf, len);
|
err = read(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(4, 0, "end read");
|
|
||||||
#endif
|
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* read from curr. location of ind. file pointer */
|
else { /* read from curr. location of ind. file pointer */
|
||||||
if (fd->fp_sys_posn != fd->fp_ind) {
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
llseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
llseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(3, 0, "start read");
|
|
||||||
#endif
|
|
||||||
err = read(fd->fd_sys, buf, len);
|
err = read(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(4, 0, "end read");
|
|
||||||
#endif
|
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
}
|
}
|
||||||
|
@ -7,9 +7,6 @@
|
|||||||
|
|
||||||
#include "ad_piofs.h"
|
#include "ad_piofs.h"
|
||||||
#include "adio_extern.h"
|
#include "adio_extern.h"
|
||||||
#ifdef PROFILE
|
|
||||||
#include "mpe.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ADIOI_PIOFS_WriteContig(ADIO_File fd, void *buf, int count,
|
void ADIOI_PIOFS_WriteContig(ADIO_File fd, void *buf, int count,
|
||||||
MPI_Datatype datatype, int file_ptr_type,
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
@ -25,41 +22,17 @@ void ADIOI_PIOFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset) {
|
if (fd->fp_sys_posn != offset) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
llseek(fd->fd_sys, offset, SEEK_SET);
|
llseek(fd->fd_sys, offset, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(5, 0, "start write");
|
|
||||||
#endif
|
|
||||||
err = write(fd->fd_sys, buf, len);
|
err = write(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(6, 0, "end write");
|
|
||||||
#endif
|
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* write from curr. location of ind. file pointer */
|
else { /* write from curr. location of ind. file pointer */
|
||||||
if (fd->fp_sys_posn != fd->fp_ind) {
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
llseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
llseek(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(5, 0, "start write");
|
|
||||||
#endif
|
|
||||||
err = write(fd->fd_sys, buf, len);
|
err = write(fd->fd_sys, buf, len);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(6, 0, "end write");
|
|
||||||
#endif
|
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
}
|
}
|
||||||
@ -255,18 +228,8 @@ void ADIOI_PIOFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
if (fwr_size) {
|
if (fwr_size) {
|
||||||
/* TYPE_UB and TYPE_LB can result in
|
/* TYPE_UB and TYPE_LB can result in
|
||||||
fwr_size = 0. save system call in such cases */
|
fwr_size = 0. save system call in such cases */
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
llseek(fd->fd_sys, off, SEEK_SET);
|
llseek(fd->fd_sys, off, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
MPE_Log_event(5, 0, "start write");
|
|
||||||
#endif
|
|
||||||
err = write(fd->fd_sys, ((char *) buf) + i, fwr_size);
|
err = write(fd->fd_sys, ((char *) buf) + i, fwr_size);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(6, 0, "end write");
|
|
||||||
#endif
|
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
}
|
}
|
||||||
i += fwr_size;
|
i += fwr_size;
|
||||||
@ -304,18 +267,8 @@ void ADIOI_PIOFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
while (num < bufsize) {
|
while (num < bufsize) {
|
||||||
size = ADIOI_MIN(fwr_size, bwr_size);
|
size = ADIOI_MIN(fwr_size, bwr_size);
|
||||||
if (size) {
|
if (size) {
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(11, 0, "start seek");
|
|
||||||
#endif
|
|
||||||
llseek(fd->fd_sys, off, SEEK_SET);
|
llseek(fd->fd_sys, off, SEEK_SET);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(12, 0, "end seek");
|
|
||||||
MPE_Log_event(5, 0, "start write");
|
|
||||||
#endif
|
|
||||||
err = write(fd->fd_sys, ((char *) buf) + indx, size);
|
err = write(fd->fd_sys, ((char *) buf) + indx, size);
|
||||||
#ifdef PROFILE
|
|
||||||
MPE_Log_event(6, 0, "end write");
|
|
||||||
#endif
|
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,7 +12,13 @@ void ADIOI_PVFS_Close(ADIO_File fd, int *error_code)
|
|||||||
int err;
|
int err;
|
||||||
static char myname[] = "ADIOI_PVFS_CLOSE";
|
static char myname[] = "ADIOI_PVFS_CLOSE";
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_close_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_close(fd->fd_sys);
|
err = pvfs_close(fd->fd_sys);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_close_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_sys = -1;
|
fd->fd_sys = -1;
|
||||||
|
|
||||||
if (err == -1) {
|
if (err == -1) {
|
||||||
|
@ -15,9 +15,22 @@ void ADIOI_PVFS_Fcntl(ADIO_File fd, int flag, ADIO_Fcntl_t *fcntl_struct,
|
|||||||
|
|
||||||
switch(flag) {
|
switch(flag) {
|
||||||
case ADIO_FCNTL_GET_FSIZE:
|
case ADIO_FCNTL_GET_FSIZE:
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fcntl_struct->fsize = pvfs_lseek64(fd->fd_sys, 0, SEEK_END);
|
fcntl_struct->fsize = pvfs_lseek64(fd->fd_sys, 0, SEEK_END);
|
||||||
if (fd->fp_sys_posn != -1)
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
if (fd->fp_sys_posn != -1) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, fd->fp_sys_posn, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
if (fcntl_struct->fsize == -1) {
|
if (fcntl_struct->fsize == -1) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
MPIR_ERR_RECOVERABLE, myname,
|
MPIR_ERR_RECOVERABLE, myname,
|
||||||
|
@ -49,11 +49,24 @@ void ADIOI_PVFS_Open(ADIO_File fd, int *error_code)
|
|||||||
value, &flag);
|
value, &flag);
|
||||||
if (flag && (atoi(value) >= 0)) pstat.base = atoi(value);
|
if (flag && (atoi(value) >= 0)) pstat.base = atoi(value);
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_sys = pvfs_open64(fd->filename, amode, perm, &pstat, NULL);
|
fd->fd_sys = pvfs_open64(fd->filename, amode, perm, &pstat, NULL);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_direct = -1;
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
|
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND)) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_ind = fd->fp_sys_posn = pvfs_lseek64(fd->fd_sys, 0, SEEK_END);
|
fd->fp_ind = fd->fp_sys_posn = pvfs_lseek64(fd->fd_sys, 0, SEEK_END);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
if (fd->fd_sys != -1) {
|
if (fd->fd_sys != -1) {
|
||||||
pvfs_ioctl(fd->fd_sys, GETMETA, &pstat);
|
pvfs_ioctl(fd->fd_sys, GETMETA, &pstat);
|
||||||
|
@ -27,16 +27,42 @@ void ADIOI_PVFS_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
len = datatype_size * count;
|
len = datatype_size * count;
|
||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset)
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, offset, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_read(fd->fd_sys, buf, len);
|
err = pvfs_read(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* read from curr. location of ind. file pointer */
|
else { /* read from curr. location of ind. file pointer */
|
||||||
if (fd->fp_sys_posn != fd->fp_ind)
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_read(fd->fd_sys, buf, len);
|
err = pvfs_read(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
}
|
}
|
||||||
|
@ -27,16 +27,42 @@ void ADIOI_PVFS_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
len = datatype_size * count;
|
len = datatype_size * count;
|
||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
if (fd->fp_sys_posn != offset)
|
if (fd->fp_sys_posn != offset) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, offset, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, offset, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys, buf, len);
|
err = pvfs_write(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_sys_posn = offset + err;
|
fd->fp_sys_posn = offset + err;
|
||||||
/* individual file pointer not updated */
|
/* individual file pointer not updated */
|
||||||
}
|
}
|
||||||
else { /* write from curr. location of ind. file pointer */
|
else { /* write from curr. location of ind. file pointer */
|
||||||
if (fd->fp_sys_posn != fd->fp_ind)
|
if (fd->fp_sys_posn != fd->fp_ind) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys, buf, len);
|
err = pvfs_write(fd->fd_sys, buf, len);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_ind += err;
|
fd->fp_ind += err;
|
||||||
fd->fp_sys_posn = fd->fp_ind;
|
fd->fp_sys_posn = fd->fp_ind;
|
||||||
}
|
}
|
||||||
@ -130,9 +156,23 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* seek to the right spot in the file */
|
/* seek to the right spot in the file */
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
off = fd->disp + etype_size * offset;
|
off = fd->disp + etype_size * offset;
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, off, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, off, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else off = pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
else {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
|
off = pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* loop through all the flattened pieces. combine into buffer until
|
/* loop through all the flattened pieces. combine into buffer until
|
||||||
* no more will fit, then write.
|
* no more will fit, then write.
|
||||||
@ -144,9 +184,15 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
for (i=0; i<flat_buf->count; i++) {
|
for (i=0; i<flat_buf->count; i++) {
|
||||||
if (flat_buf->blocklens[i] > combine_buf_remain && combine_buf != combine_buf_ptr) {
|
if (flat_buf->blocklens[i] > combine_buf_remain && combine_buf != combine_buf_ptr) {
|
||||||
/* there is data in the buffer; write out the buffer so far */
|
/* there is data in the buffer; write out the buffer so far */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys,
|
err = pvfs_write(fd->fd_sys,
|
||||||
combine_buf,
|
combine_buf,
|
||||||
fd->hints->ind_wr_buffer_size - combine_buf_remain);
|
fd->hints->ind_wr_buffer_size - combine_buf_remain);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
|
|
||||||
/* reset our buffer info */
|
/* reset our buffer info */
|
||||||
@ -159,9 +205,15 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* special case: blocklen is as big as or bigger than the combine buf;
|
/* special case: blocklen is as big as or bigger than the combine buf;
|
||||||
* write directly
|
* write directly
|
||||||
*/
|
*/
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys,
|
err = pvfs_write(fd->fd_sys,
|
||||||
((char *) buf) + j*buftype_extent + flat_buf->indices[i],
|
((char *) buf) + j*buftype_extent + flat_buf->indices[i],
|
||||||
flat_buf->blocklens[i]);
|
flat_buf->blocklens[i]);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
off += flat_buf->blocklens[i]; /* keep up with the final file offset too */
|
off += flat_buf->blocklens[i]; /* keep up with the final file offset too */
|
||||||
}
|
}
|
||||||
@ -179,9 +231,15 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
if (combine_buf_ptr != combine_buf) {
|
if (combine_buf_ptr != combine_buf) {
|
||||||
/* data left in buffer to write */
|
/* data left in buffer to write */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys,
|
err = pvfs_write(fd->fd_sys,
|
||||||
combine_buf,
|
combine_buf,
|
||||||
fd->hints->ind_wr_buffer_size - combine_buf_remain);
|
fd->hints->ind_wr_buffer_size - combine_buf_remain);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -264,17 +322,19 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
if (fwr_size) {
|
if (fwr_size) {
|
||||||
/* TYPE_UB and TYPE_LB can result in
|
/* TYPE_UB and TYPE_LB can result in
|
||||||
fwr_size = 0. save system call in such cases */
|
fwr_size = 0. save system call in such cases */
|
||||||
#ifdef PROFILE
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
MPE_Log_event(11, 0, "start seek");
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
#endif
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, off, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, off, SEEK_SET);
|
||||||
#ifdef PROFILE
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
MPE_Log_event(12, 0, "end seek");
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
MPE_Log_event(5, 0, "start write");
|
#endif
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
#endif
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys, ((char *) buf) + i, fwr_size);
|
err = pvfs_write(fd->fd_sys, ((char *) buf) + i, fwr_size);
|
||||||
#ifdef PROFILE
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
MPE_Log_event(6, 0, "end write");
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
#endif
|
#endif
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
}
|
}
|
||||||
@ -313,17 +373,19 @@ void ADIOI_PVFS_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
while (num < bufsize) {
|
while (num < bufsize) {
|
||||||
size = ADIOI_MIN(fwr_size, bwr_size);
|
size = ADIOI_MIN(fwr_size, bwr_size);
|
||||||
if (size) {
|
if (size) {
|
||||||
#ifdef PROFILE
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
MPE_Log_event(11, 0, "start seek");
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
#endif
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, off, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, off, SEEK_SET);
|
||||||
#ifdef PROFILE
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
MPE_Log_event(12, 0, "end seek");
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
MPE_Log_event(5, 0, "start write");
|
#endif
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
#endif
|
#endif
|
||||||
err = pvfs_write(fd->fd_sys, ((char *) buf) + indx, size);
|
err = pvfs_write(fd->fd_sys, ((char *) buf) + indx, size);
|
||||||
#ifdef PROFILE
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
MPE_Log_event(6, 0, "end write");
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
#endif
|
#endif
|
||||||
if (err == -1) err_flag = 1;
|
if (err == -1) err_flag = 1;
|
||||||
}
|
}
|
||||||
@ -473,9 +535,23 @@ void ADIOI_PVFS_WriteStridedListIO(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
off = fd->disp + etype_size * offset;
|
off = fd->disp + etype_size * offset;
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
else off = pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
else {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
|
off = pvfs_lseek64(fd->fd_sys, fd->fp_ind, SEEK_SET);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
file_list_count = 1;
|
file_list_count = 1;
|
||||||
file_offsets = off;
|
file_offsets = off;
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
# University of Stuttgart. All rights reserved.
|
# University of Stuttgart. All rights reserved.
|
||||||
# Copyright (c) 2004-2005 The Regents of the University of California.
|
# Copyright (c) 2004-2005 The Regents of the University of California.
|
||||||
# All rights reserved.
|
# All rights reserved.
|
||||||
|
# Copyright (c) 2008 Cisco Systems, Inc. All rights reserved.
|
||||||
# $COPYRIGHT$
|
# $COPYRIGHT$
|
||||||
#
|
#
|
||||||
# Additional copyrights may follow
|
# Additional copyrights may follow
|
||||||
|
@ -22,8 +22,13 @@ struct ADIOI_Fns_struct ADIO_PVFS2_operations = {
|
|||||||
ADIOI_PVFS2_ReadStrided, /* ReadStrided */
|
ADIOI_PVFS2_ReadStrided, /* ReadStrided */
|
||||||
ADIOI_PVFS2_WriteStrided, /* WriteStrided */
|
ADIOI_PVFS2_WriteStrided, /* WriteStrided */
|
||||||
ADIOI_PVFS2_Close, /* Close */
|
ADIOI_PVFS2_Close, /* Close */
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
|
ADIOI_PVFS2_IReadContig, /* IreadContig */
|
||||||
|
ADIOI_PVFS2_IWriteContig, /* IwriteContig */
|
||||||
|
#else
|
||||||
ADIOI_FAKE_IreadContig, /* IreadContig */
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
|
#endif
|
||||||
ADIOI_FAKE_IODone, /* ReadDone */
|
ADIOI_FAKE_IODone, /* ReadDone */
|
||||||
ADIOI_FAKE_IODone, /* WriteDone */
|
ADIOI_FAKE_IODone, /* WriteDone */
|
||||||
ADIOI_FAKE_IOComplete, /* ReadComplete */
|
ADIOI_FAKE_IOComplete, /* ReadComplete */
|
||||||
|
@ -37,4 +37,16 @@ void ADIOI_PVFS2_Flush(ADIO_File fd, int *error_code);
|
|||||||
void ADIOI_PVFS2_Delete(char *filename, int *error_code);
|
void ADIOI_PVFS2_Delete(char *filename, int *error_code);
|
||||||
void ADIOI_PVFS2_Resize(ADIO_File fd, ADIO_Offset size, int *error_code);
|
void ADIOI_PVFS2_Resize(ADIO_File fd, ADIO_Offset size, int *error_code);
|
||||||
void ADIOI_PVFS2_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
|
void ADIOI_PVFS2_SetInfo(ADIO_File fd, MPI_Info users_info, int *error_code);
|
||||||
|
void ADIOI_PVFS2_IReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, MPI_Request *request,
|
||||||
|
int *error_code);
|
||||||
|
void ADIOI_PVFS2_IWriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, MPI_Request *request,
|
||||||
|
int *error_code);
|
||||||
|
void ADIOI_PVFS2_AIO_contig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, MPI_Request *request,
|
||||||
|
int flag, int *error_code);
|
||||||
#endif
|
#endif
|
||||||
|
220
ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c
Обычный файл
220
ompi/mca/io/romio/romio/adio/ad_pvfs2/ad_pvfs2_aio.c
Обычный файл
@ -0,0 +1,220 @@
|
|||||||
|
/* -*- Mode: C; c-basic-offset:4 ; -*-
|
||||||
|
* vim: ts=8 sts=4 sw=4 noexpandtab
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997 University of Chicago.
|
||||||
|
* See COPYRIGHT notice in top-level directory.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "adio.h"
|
||||||
|
#include "adio_extern.h"
|
||||||
|
#include "ad_pvfs2.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "ad_pvfs2_common.h"
|
||||||
|
#include "mpiu_greq.h"
|
||||||
|
#include "../../mpi-io/mpioimpl.h"
|
||||||
|
|
||||||
|
#define READ 0
|
||||||
|
#define WRITE 1
|
||||||
|
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
|
static int ADIOI_PVFS2_greq_class = 0;
|
||||||
|
int ADIOI_PVFS2_aio_free_fn(void *extra_state);
|
||||||
|
int ADIOI_PVFS2_aio_poll_fn(void *extra_state, MPI_Status *status);
|
||||||
|
int ADIOI_PVFS2_aio_wait_fn(int count, void ** array_of_states,
|
||||||
|
double timeout, MPI_Status *status);
|
||||||
|
|
||||||
|
void ADIOI_PVFS2_IReadContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, MPI_Request *request,
|
||||||
|
int *error_code)
|
||||||
|
{
|
||||||
|
ADIOI_PVFS2_AIO_contig(fd, buf, count, datatype, file_ptr_type,
|
||||||
|
offset, request, READ, error_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADIOI_PVFS2_IWriteContig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, MPI_Request *request,
|
||||||
|
int *error_code)
|
||||||
|
{
|
||||||
|
ADIOI_PVFS2_AIO_contig(fd, buf, count, datatype, file_ptr_type,
|
||||||
|
offset, request, WRITE, error_code);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ADIOI_PVFS2_AIO_contig(ADIO_File fd, void *buf, int count,
|
||||||
|
MPI_Datatype datatype, int file_ptr_type,
|
||||||
|
ADIO_Offset offset, MPI_Request *request,
|
||||||
|
int flag, int *error_code)
|
||||||
|
{
|
||||||
|
|
||||||
|
int ret, datatype_size, len;
|
||||||
|
ADIOI_PVFS2_fs *pvfs_fs;
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
static char myname[] = "ADIOI_PVFS2_AIO_contig";
|
||||||
|
|
||||||
|
pvfs_fs = (ADIOI_PVFS2_fs*)fd->fs_ptr;
|
||||||
|
|
||||||
|
aio_req = (ADIOI_AIO_Request*)ADIOI_Calloc(sizeof(ADIOI_AIO_Request), 1);
|
||||||
|
|
||||||
|
MPI_Type_size(datatype, &datatype_size);
|
||||||
|
len = datatype_size * count;
|
||||||
|
|
||||||
|
ret = PVFS_Request_contiguous(len, PVFS_BYTE, &(aio_req->mem_req));
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (ret != 0) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
ADIOI_PVFS2_error_convert(ret),
|
||||||
|
"Error in pvfs_request_contig (memory)", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
ret = PVFS_Request_contiguous(len, PVFS_BYTE, &(aio_req->file_req));
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (ret != 0) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
ADIOI_PVFS2_error_convert(ret),
|
||||||
|
"Error in pvfs_request_contig (file)", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
/* copy individual file pointer into offset variable, continue */
|
||||||
|
offset = fd->fp_ind;
|
||||||
|
}
|
||||||
|
if (flag == READ) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_iread_a, 0, NULL );
|
||||||
|
#endif
|
||||||
|
ret = PVFS_isys_read(pvfs_fs->object_ref, aio_req->file_req, offset,
|
||||||
|
buf, aio_req->mem_req, &(pvfs_fs->credentials),
|
||||||
|
&(aio_req->resp_io), &(aio_req->op_id), NULL);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_iread_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
} else if (flag == WRITE) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_iwrite_a, 0, NULL );
|
||||||
|
#endif
|
||||||
|
ret = PVFS_isys_write(pvfs_fs->object_ref, aio_req->file_req, offset,
|
||||||
|
buf, aio_req->mem_req, &(pvfs_fs->credentials),
|
||||||
|
&(aio_req->resp_io), &(aio_req->op_id), NULL);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_iwrite_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
|
if (ret < 0 ) {
|
||||||
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
|
MPIR_ERR_RECOVERABLE,
|
||||||
|
myname, __LINE__,
|
||||||
|
ADIOI_PVFS2_error_convert(ret),
|
||||||
|
"Error in PVFS_isys_io", 0);
|
||||||
|
goto fn_exit;
|
||||||
|
}
|
||||||
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
/* posted. defered completion */
|
||||||
|
if (ret == 0) {
|
||||||
|
if (ADIOI_PVFS2_greq_class == 0) {
|
||||||
|
MPIX_Grequest_class_create(ADIOI_GEN_aio_query_fn,
|
||||||
|
ADIOI_PVFS2_aio_free_fn, MPIU_Greq_cancel_fn,
|
||||||
|
ADIOI_PVFS2_aio_poll_fn, ADIOI_PVFS2_aio_wait_fn,
|
||||||
|
&ADIOI_PVFS2_greq_class);
|
||||||
|
}
|
||||||
|
MPIX_Grequest_class_allocate(ADIOI_PVFS2_greq_class, aio_req, request);
|
||||||
|
memcpy(&(aio_req->req), request, sizeof(request));
|
||||||
|
}
|
||||||
|
|
||||||
|
/* immediate completion */
|
||||||
|
if (ret == 1) {
|
||||||
|
MPIO_Completed_request_create(&fd, len, error_code, request);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
fd->fp_ind += len;
|
||||||
|
}
|
||||||
|
fd->fp_sys_posn = offset + len;
|
||||||
|
|
||||||
|
*error_code = MPI_SUCCESS;
|
||||||
|
fn_exit:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ADIOI_PVFS2_aio_free_fn(void *extra_state)
|
||||||
|
{
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
aio_req = (ADIOI_AIO_Request*)extra_state;
|
||||||
|
|
||||||
|
PVFS_Request_free(&(aio_req->mem_req));
|
||||||
|
PVFS_Request_free(&(aio_req->file_req));
|
||||||
|
ADIOI_Free(aio_req);
|
||||||
|
|
||||||
|
return MPI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ADIOI_PVFS2_aio_poll_fn(void *extra_state, MPI_Status *status)
|
||||||
|
{
|
||||||
|
ADIOI_AIO_Request *aio_req;
|
||||||
|
int ret, error;
|
||||||
|
|
||||||
|
aio_req = (ADIOI_AIO_Request *)extra_state;
|
||||||
|
|
||||||
|
/* BUG: cannot PVFS_sys_testsome: does not work for a specific request */
|
||||||
|
ret = PVFS_sys_wait(aio_req->op_id, __FUNCTION__, &error);
|
||||||
|
if (ret == 0) {
|
||||||
|
aio_req->nbytes = aio_req->resp_io.total_completed;
|
||||||
|
MPIR_Nest_incr();
|
||||||
|
MPI_Grequest_complete(aio_req->req);
|
||||||
|
MPIR_Nest_decr();
|
||||||
|
return MPI_SUCCESS;
|
||||||
|
} else
|
||||||
|
return MPI_UNDEFINED; /* TODO: what's this error? */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* wait for multiple requests to complete */
|
||||||
|
int ADIOI_PVFS2_aio_wait_fn(int count, void ** array_of_states,
|
||||||
|
double timeout, MPI_Status *status)
|
||||||
|
{
|
||||||
|
|
||||||
|
ADIOI_AIO_Request **aio_reqlist;
|
||||||
|
PVFS_sys_op_id *op_id_array;
|
||||||
|
int i,j, greq_count;
|
||||||
|
int *error_array;
|
||||||
|
|
||||||
|
aio_reqlist = (ADIOI_AIO_Request **)array_of_states;
|
||||||
|
|
||||||
|
op_id_array = (PVFS_sys_op_id*)ADIOI_Calloc(count, sizeof(PVFS_sys_op_id));
|
||||||
|
error_array = (int *)ADIOI_Calloc(count, sizeof(int));
|
||||||
|
greq_count = count;
|
||||||
|
|
||||||
|
/* PVFS-2.6: testsome actually tests all requests and fills in op_id_array
|
||||||
|
* with the ones that have completed. count is an in/out parameter.
|
||||||
|
* returns with the number of completed operations. what a mess! */
|
||||||
|
PVFS_sys_testsome(op_id_array, &count, NULL, error_array, INT_MAX);
|
||||||
|
for (i=0; i< count; i++) {
|
||||||
|
for (j=0; j<greq_count; j++) {
|
||||||
|
if (op_id_array[i] == aio_reqlist[j]->op_id) {
|
||||||
|
aio_reqlist[j]->nbytes =
|
||||||
|
aio_reqlist[j]->resp_io.total_completed;
|
||||||
|
MPIR_Nest_incr();
|
||||||
|
MPI_Grequest_complete(aio_reqlist[j]->req);
|
||||||
|
MPIR_Nest_decr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return MPI_SUCCESS; /* TODO: no idea how to deal with errors */
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* vim: ts=8 sts=4 sw=4 noexpandtab
|
||||||
|
*/
|
@ -9,6 +9,7 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
/* maybe give romio access to the globalconfig struct */
|
/* maybe give romio access to the globalconfig struct */
|
||||||
/* keyval hack to both tell us if we've already initialized pvfs2 and also
|
/* keyval hack to both tell us if we've already initialized pvfs2 and also
|
||||||
|
@ -30,7 +30,7 @@ typedef struct open_status_s open_status;
|
|||||||
* handle to everyone else in the communicator
|
* handle to everyone else in the communicator
|
||||||
*/
|
*/
|
||||||
static void fake_an_open(PVFS_fs_id fs_id, char *pvfs_name, int access_mode,
|
static void fake_an_open(PVFS_fs_id fs_id, char *pvfs_name, int access_mode,
|
||||||
int nr_datafiles, int strip_size,
|
int nr_datafiles, PVFS_size strip_size,
|
||||||
ADIOI_PVFS2_fs *pvfs2_fs,
|
ADIOI_PVFS2_fs *pvfs2_fs,
|
||||||
open_status *o_status)
|
open_status *o_status)
|
||||||
{
|
{
|
||||||
@ -82,9 +82,15 @@ static void fake_an_open(PVFS_fs_id fs_id, char *pvfs_name, int access_mode,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Perform file creation */
|
/* Perform file creation */
|
||||||
|
#ifdef HAVE_PVFS2_CREATE_WITHOUT_LAYOUT
|
||||||
ret = PVFS_sys_create(resp_getparent.basename,
|
ret = PVFS_sys_create(resp_getparent.basename,
|
||||||
resp_getparent.parent_ref, attribs,
|
resp_getparent.parent_ref, attribs,
|
||||||
&(pvfs2_fs->credentials), dist, &resp_create);
|
&(pvfs2_fs->credentials), dist, &resp_create);
|
||||||
|
#else
|
||||||
|
ret = PVFS_sys_create(resp_getparent.basename,
|
||||||
|
resp_getparent.parent_ref, attribs,
|
||||||
|
&(pvfs2_fs->credentials), dist, NULL, &resp_create);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* if many creates are happening in this directory, the earlier
|
/* if many creates are happening in this directory, the earlier
|
||||||
* sys_lookup may have returned ENOENT, but the sys_create could
|
* sys_lookup may have returned ENOENT, but the sys_create could
|
||||||
@ -175,6 +181,9 @@ void ADIOI_PVFS2_Open(ADIO_File fd, int *error_code)
|
|||||||
ADIOI_PVFS2_makecredentials(&(pvfs2_fs->credentials));
|
ADIOI_PVFS2_makecredentials(&(pvfs2_fs->credentials));
|
||||||
|
|
||||||
/* one process resolves name and will later bcast to others */
|
/* one process resolves name and will later bcast to others */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_a, 0, NULL );
|
||||||
|
#endif
|
||||||
if (rank == fd->hints->ranklist[0] && fd->fs_ptr == NULL) {
|
if (rank == fd->hints->ranklist[0] && fd->fs_ptr == NULL) {
|
||||||
/* given the filename, figure out which pvfs filesystem it is on */
|
/* given the filename, figure out which pvfs filesystem it is on */
|
||||||
ret = PVFS_util_resolve(fd->filename, &cur_fs,
|
ret = PVFS_util_resolve(fd->filename, &cur_fs,
|
||||||
@ -194,6 +203,9 @@ void ADIOI_PVFS2_Open(ADIO_File fd, int *error_code)
|
|||||||
pvfs2_fs->object_ref = o_status.object_ref;
|
pvfs2_fs->object_ref = o_status.object_ref;
|
||||||
fd->fs_ptr = pvfs2_fs;
|
fd->fs_ptr = pvfs2_fs;
|
||||||
}
|
}
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
|
||||||
/* broadcast status and (possibly valid) object reference */
|
/* broadcast status and (possibly valid) object reference */
|
||||||
MPI_Address(&o_status.error, &offsets[0]);
|
MPI_Address(&o_status.error, &offsets[0]);
|
||||||
|
@ -56,8 +56,14 @@ void ADIOI_PVFS2_ReadContig(ADIO_File fd, void *buf, int count,
|
|||||||
offset = fd->fp_ind;
|
offset = fd->fp_ind;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
ret = PVFS_sys_read(pvfs_fs->object_ref, file_req, offset, buf,
|
ret = PVFS_sys_read(pvfs_fs->object_ref, file_req, offset, buf,
|
||||||
mem_req, &(pvfs_fs->credentials), &resp_io);
|
mem_req, &(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (ret != 0 ) {
|
if (ret != 0 ) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -140,7 +146,7 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
if (!filetype_is_contig) {
|
if (!filetype_is_contig) {
|
||||||
flat_file = ADIOI_Flatlist;
|
flat_file = ADIOI_Flatlist;
|
||||||
while (flat_file->type != fd->filetype) flat_file = flat_file->next;
|
while (flat_file->type != fd->filetype) flat_file = flat_file->next;
|
||||||
if (flat_file->count == 1)
|
if (flat_file->count == 1 && !buftype_is_contig)
|
||||||
filetype_is_contig = 1;
|
filetype_is_contig = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -214,9 +220,15 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
err_flag = PVFS_Request_contiguous(file_lengths,
|
err_flag = PVFS_Request_contiguous(file_lengths,
|
||||||
PVFS_BYTE, &file_req);
|
PVFS_BYTE, &file_req);
|
||||||
if (err_flag < 0) break;
|
if (err_flag < 0) break;
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req,
|
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req,
|
||||||
file_offsets, PVFS_BOTTOM, mem_req,
|
file_offsets, PVFS_BOTTOM, mem_req,
|
||||||
&(pvfs_fs->credentials), &resp_io);
|
&(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -284,11 +296,11 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
n_filetypes++;
|
n_filetypes++;
|
||||||
for (i=0; i<flat_file->count; i++) {
|
for (i=0; i<flat_file->count; i++) {
|
||||||
if (disp + flat_file->indices[i] +
|
if (disp + flat_file->indices[i] +
|
||||||
(ADIO_Offset) n_filetypes*filetype_extent +
|
((ADIO_Offset) n_filetypes)*filetype_extent +
|
||||||
flat_file->blocklens[i] >= offset) {
|
flat_file->blocklens[i] >= offset) {
|
||||||
st_index = i;
|
st_index = i;
|
||||||
frd_size = (int) (disp + flat_file->indices[i] +
|
frd_size = (int) (disp + flat_file->indices[i] +
|
||||||
(ADIO_Offset) n_filetypes*filetype_extent
|
((ADIO_Offset) n_filetypes)*filetype_extent
|
||||||
+ flat_file->blocklens[i] - offset);
|
+ flat_file->blocklens[i] - offset);
|
||||||
flag = 1;
|
flag = 1;
|
||||||
break;
|
break;
|
||||||
@ -315,7 +327,7 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* abs. offset in bytes in the file */
|
/* abs. offset in bytes in the file */
|
||||||
offset = disp + (ADIO_Offset) n_filetypes*filetype_extent +
|
offset = disp + ((ADIO_Offset) n_filetypes)*filetype_extent +
|
||||||
abs_off_in_filetype;
|
abs_off_in_filetype;
|
||||||
} /* else [file_ptr_type != ADIO_INDIVIDUAL] */
|
} /* else [file_ptr_type != ADIO_INDIVIDUAL] */
|
||||||
|
|
||||||
@ -340,7 +352,11 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* determine how many blocks in file to read */
|
/* determine how many blocks in file to read */
|
||||||
f_data_read = ADIOI_MIN(st_frd_size, bufsize);
|
f_data_read = ADIOI_MIN(st_frd_size, bufsize);
|
||||||
total_blks_to_read = 1;
|
total_blks_to_read = 1;
|
||||||
j++;
|
if (j < (flat_file->count-1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
while (f_data_read < bufsize) {
|
while (f_data_read < bufsize) {
|
||||||
f_data_read += flat_file->blocklens[j];
|
f_data_read += flat_file->blocklens[j];
|
||||||
total_blks_to_read++;
|
total_blks_to_read++;
|
||||||
@ -383,7 +399,8 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
for (k=0; k<MAX_ARRAY_SIZE; k++) {
|
for (k=0; k<MAX_ARRAY_SIZE; k++) {
|
||||||
if (i || k) {
|
if (i || k) {
|
||||||
file_offsets[k] = disp + n_filetypes*filetype_extent
|
file_offsets[k] = disp +
|
||||||
|
((ADIO_Offset)n_filetypes)*filetype_extent
|
||||||
+ flat_file->indices[j];
|
+ flat_file->indices[j];
|
||||||
file_lengths[k] = flat_file->blocklens[j];
|
file_lengths[k] = flat_file->blocklens[j];
|
||||||
mem_lengths += file_lengths[k];
|
mem_lengths += file_lengths[k];
|
||||||
@ -424,9 +441,15 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* PVFS_Request_hindexed already expresses the offsets into the
|
/* PVFS_Request_hindexed already expresses the offsets into the
|
||||||
* file, so we should not pass in an offset if we are using
|
* file, so we should not pass in an offset if we are using
|
||||||
* hindexed for the file type */
|
* hindexed for the file type */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req, 0,
|
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req, 0,
|
||||||
mem_offsets, mem_req,
|
mem_offsets, mem_req,
|
||||||
&(pvfs_fs->credentials), &resp_io);
|
&(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -455,8 +478,9 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
for (k=0; k<extra_blks; k++) {
|
for (k=0; k<extra_blks; k++) {
|
||||||
if(i || k) {
|
if(i || k) {
|
||||||
file_offsets[k] = disp + n_filetypes*filetype_extent +
|
file_offsets[k] = disp +
|
||||||
flat_file->indices[j];
|
((ADIO_Offset)n_filetypes)*filetype_extent +
|
||||||
|
flat_file->indices[j];
|
||||||
if (k == (extra_blks - 1)) {
|
if (k == (extra_blks - 1)) {
|
||||||
file_lengths[k] = bufsize - (int32_t) mem_lengths
|
file_lengths[k] = bufsize - (int32_t) mem_lengths
|
||||||
- (int32_t) mem_offsets + (int32_t) buf;
|
- (int32_t) mem_offsets + (int32_t) buf;
|
||||||
@ -497,8 +521,14 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
/* as above, use 0 for 'offset' when using hindexed file type */
|
/* as above, use 0 for 'offset' when using hindexed file type */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req, 0,
|
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req, 0,
|
||||||
mem_offsets, mem_req, &(pvfs_fs->credentials), &resp_io);
|
mem_offsets, mem_req, &(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -848,8 +878,8 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
k = (k + 1)%flat_buf->count;
|
k = (k + 1)%flat_buf->count;
|
||||||
} /* for (i=0; i<mem_list_count; i++) */
|
} /* for (i=0; i<mem_list_count; i++) */
|
||||||
for (i=0; i<file_list_count; i++) {
|
for (i=0; i<file_list_count; i++) {
|
||||||
file_offsets[i] = disp + flat_file->indices[j] + n_filetypes *
|
file_offsets[i] = disp + flat_file->indices[j] +
|
||||||
filetype_extent;
|
((ADIO_Offset)n_filetypes) * filetype_extent;
|
||||||
if (!i) {
|
if (!i) {
|
||||||
file_lengths[0] = frd_size;
|
file_lengths[0] = frd_size;
|
||||||
file_offsets[0] += flat_file->blocklens[j] - frd_size;
|
file_offsets[0] += flat_file->blocklens[j] - frd_size;
|
||||||
@ -899,8 +929,14 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
/* offset will be expressed in memory and file datatypes */
|
/* offset will be expressed in memory and file datatypes */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req, 0,
|
err_flag = PVFS_sys_read(pvfs_fs->object_ref, file_req, 0,
|
||||||
PVFS_BOTTOM, mem_req, &(pvfs_fs->credentials), &resp_io);
|
PVFS_BOTTOM, mem_req, &(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_read_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -924,7 +960,16 @@ void ADIOI_PVFS2_ReadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
ADIOI_Free(file_lengths);
|
ADIOI_Free(file_lengths);
|
||||||
|
|
||||||
/* Other ADIO routines will convert absolute bytes into counts of datatypes */
|
/* Other ADIO routines will convert absolute bytes into counts of datatypes */
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += total_bytes_read;
|
/* when incrementing fp_ind, need to also take into account the file type:
|
||||||
|
* consider an N-element 1-d subarray with a lb and ub: ( |---xxxxx-----|
|
||||||
|
* if we wrote N elements, offset needs to point at beginning of type, not
|
||||||
|
* at empty region at offset N+1) */
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
/* this is closer, but still incorrect for the cases where a small
|
||||||
|
* amount of a file type is "leftover" after a write */
|
||||||
|
fd->fp_ind = disp + flat_file->indices[j] +
|
||||||
|
((ADIO_Offset)n_filetypes)*filetype_extent;
|
||||||
|
}
|
||||||
if (err_flag == 0) *error_code = MPI_SUCCESS;
|
if (err_flag == 0) *error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
error_state:
|
error_state:
|
||||||
|
@ -51,8 +51,14 @@ void ADIOI_PVFS2_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
if (file_ptr_type == ADIO_EXPLICIT_OFFSET) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
ret = PVFS_sys_write(pvfs_fs->object_ref, file_req, offset, buf,
|
ret = PVFS_sys_write(pvfs_fs->object_ref, file_req, offset, buf,
|
||||||
mem_req, &(pvfs_fs->credentials), &resp_io);
|
mem_req, &(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -67,8 +73,14 @@ void ADIOI_PVFS2_WriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
fd->fp_sys_posn = offset + (int) resp_io.total_completed;
|
fd->fp_sys_posn = offset + (int) resp_io.total_completed;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
ret = PVFS_sys_write(pvfs_fs->object_ref, file_req, fd->fp_ind, buf,
|
ret = PVFS_sys_write(pvfs_fs->object_ref, file_req, fd->fp_ind, buf,
|
||||||
mem_req, &(pvfs_fs->credentials), &resp_io);
|
mem_req, &(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -161,7 +173,7 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
if (!filetype_is_contig) {
|
if (!filetype_is_contig) {
|
||||||
flat_file = ADIOI_Flatlist;
|
flat_file = ADIOI_Flatlist;
|
||||||
while (flat_file->type != fd->filetype) flat_file = flat_file->next;
|
while (flat_file->type != fd->filetype) flat_file = flat_file->next;
|
||||||
if (flat_file->count == 1)
|
if (flat_file->count == 1 && !buftype_is_contig)
|
||||||
filetype_is_contig = 1;
|
filetype_is_contig = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -258,11 +270,17 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req,
|
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req,
|
||||||
file_offsets, PVFS_BOTTOM,
|
file_offsets, PVFS_BOTTOM,
|
||||||
mem_req,
|
mem_req,
|
||||||
&(pvfs_fs->credentials),
|
&(pvfs_fs->credentials),
|
||||||
&resp_io);
|
&resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
total_bytes_written += resp_io.total_completed;
|
total_bytes_written += resp_io.total_completed;
|
||||||
|
|
||||||
/* in the case of error or the last write list call,
|
/* in the case of error or the last write list call,
|
||||||
@ -330,11 +348,11 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
n_filetypes++;
|
n_filetypes++;
|
||||||
for (i=0; i<flat_file->count; i++) {
|
for (i=0; i<flat_file->count; i++) {
|
||||||
if (disp + flat_file->indices[i] +
|
if (disp + flat_file->indices[i] +
|
||||||
(ADIO_Offset) n_filetypes*filetype_extent +
|
((ADIO_Offset) n_filetypes)*filetype_extent +
|
||||||
flat_file->blocklens[i] >= offset) {
|
flat_file->blocklens[i] >= offset) {
|
||||||
st_index = i;
|
st_index = i;
|
||||||
fwr_size = disp + flat_file->indices[i] +
|
fwr_size = disp + flat_file->indices[i] +
|
||||||
(ADIO_Offset) n_filetypes*filetype_extent
|
((ADIO_Offset) n_filetypes)*filetype_extent
|
||||||
+ flat_file->blocklens[i] - offset;
|
+ flat_file->blocklens[i] - offset;
|
||||||
flag = 1;
|
flag = 1;
|
||||||
break;
|
break;
|
||||||
@ -361,7 +379,7 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* abs. offset in bytes in the file */
|
/* abs. offset in bytes in the file */
|
||||||
offset = disp + (ADIO_Offset) n_filetypes*filetype_extent +
|
offset = disp + ((ADIO_Offset) n_filetypes)*filetype_extent +
|
||||||
abs_off_in_filetype;
|
abs_off_in_filetype;
|
||||||
} /* else [file_ptr_type != ADIO_INDIVIDUAL] */
|
} /* else [file_ptr_type != ADIO_INDIVIDUAL] */
|
||||||
|
|
||||||
@ -387,7 +405,11 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* determine how many blocks in file to write */
|
/* determine how many blocks in file to write */
|
||||||
f_data_wrote = ADIOI_MIN(st_fwr_size, bufsize);
|
f_data_wrote = ADIOI_MIN(st_fwr_size, bufsize);
|
||||||
total_blks_to_write = 1;
|
total_blks_to_write = 1;
|
||||||
j++;
|
if (j < (flat_file->count -1)) j++;
|
||||||
|
else {
|
||||||
|
j = 0;
|
||||||
|
n_filetypes++;
|
||||||
|
}
|
||||||
while (f_data_wrote < bufsize) {
|
while (f_data_wrote < bufsize) {
|
||||||
f_data_wrote += flat_file->blocklens[j];
|
f_data_wrote += flat_file->blocklens[j];
|
||||||
total_blks_to_write++;
|
total_blks_to_write++;
|
||||||
@ -430,8 +452,9 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
for (k=0; k<MAX_ARRAY_SIZE; k++) {
|
for (k=0; k<MAX_ARRAY_SIZE; k++) {
|
||||||
if (i || k) {
|
if (i || k) {
|
||||||
file_offsets[k] = disp + n_filetypes*filetype_extent
|
file_offsets[k] = disp +
|
||||||
+ flat_file->indices[j];
|
((ADIO_Offset)n_filetypes)*filetype_extent
|
||||||
|
+ flat_file->indices[j];
|
||||||
file_lengths[k] = flat_file->blocklens[j];
|
file_lengths[k] = flat_file->blocklens[j];
|
||||||
mem_lengths += file_lengths[k];
|
mem_lengths += file_lengths[k];
|
||||||
}
|
}
|
||||||
@ -472,9 +495,15 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* PVFS_Request_hindexed already expresses the offsets into the
|
/* PVFS_Request_hindexed already expresses the offsets into the
|
||||||
* file, so we should not pass in an offset if we are using
|
* file, so we should not pass in an offset if we are using
|
||||||
* hindexed for the file type */
|
* hindexed for the file type */
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0,
|
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0,
|
||||||
mem_offsets, mem_req,
|
mem_offsets, mem_req,
|
||||||
&(pvfs_fs->credentials), &resp_io);
|
&(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -503,8 +532,9 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
}
|
}
|
||||||
for (k=0; k<extra_blks; k++) {
|
for (k=0; k<extra_blks; k++) {
|
||||||
if(i || k) {
|
if(i || k) {
|
||||||
file_offsets[k] = disp + n_filetypes*filetype_extent +
|
file_offsets[k] = disp +
|
||||||
flat_file->indices[j];
|
((ADIO_Offset)n_filetypes)*filetype_extent +
|
||||||
|
flat_file->indices[j];
|
||||||
if (k == (extra_blks - 1)) {
|
if (k == (extra_blks - 1)) {
|
||||||
file_lengths[k] = bufsize - (int32_t) mem_lengths
|
file_lengths[k] = bufsize - (int32_t) mem_lengths
|
||||||
- (int32_t) mem_offsets + (int32_t) buf;
|
- (int32_t) mem_offsets + (int32_t) buf;
|
||||||
@ -547,9 +577,15 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
/* --END ERROR HANDLING-- */
|
/* --END ERROR HANDLING-- */
|
||||||
|
|
||||||
/* as above, use 0 for 'offset' when using hindexed file type*/
|
/* as above, use 0 for 'offset' when using hindexed file type*/
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0,
|
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0,
|
||||||
mem_offsets, mem_req,
|
mem_offsets, mem_req,
|
||||||
&(pvfs_fs->credentials), &resp_io);
|
&(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -904,8 +940,8 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
k = (k + 1)%flat_buf->count;
|
k = (k + 1)%flat_buf->count;
|
||||||
} /* for (i=0; i<mem_list_count; i++) */
|
} /* for (i=0; i<mem_list_count; i++) */
|
||||||
for (i=0; i<file_list_count; i++) {
|
for (i=0; i<file_list_count; i++) {
|
||||||
file_offsets[i] = disp + flat_file->indices[j] + n_filetypes *
|
file_offsets[i] = disp + flat_file->indices[j] +
|
||||||
filetype_extent;
|
((ADIO_Offset)n_filetypes) * filetype_extent;
|
||||||
if (!i) {
|
if (!i) {
|
||||||
file_lengths[0] = fwr_size;
|
file_lengths[0] = fwr_size;
|
||||||
file_offsets[0] += flat_file->blocklens[j] - fwr_size;
|
file_offsets[0] += flat_file->blocklens[j] - fwr_size;
|
||||||
@ -959,9 +995,15 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
/* offset will be expressed in memory and file datatypes */
|
/* offset will be expressed in memory and file datatypes */
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_a, 0, NULL );
|
||||||
|
#endif
|
||||||
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0,
|
err_flag = PVFS_sys_write(pvfs_fs->object_ref, file_req, 0,
|
||||||
PVFS_BOTTOM, mem_req,
|
PVFS_BOTTOM, mem_req,
|
||||||
&(pvfs_fs->credentials), &resp_io);
|
&(pvfs_fs->credentials), &resp_io);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_write_b, 0, NULL );
|
||||||
|
#endif
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (err_flag != 0) {
|
if (err_flag != 0) {
|
||||||
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
*error_code = MPIO_Err_create_code(MPI_SUCCESS,
|
||||||
@ -986,7 +1028,16 @@ void ADIOI_PVFS2_WriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
ADIOI_Free(file_offsets);
|
ADIOI_Free(file_offsets);
|
||||||
ADIOI_Free(file_lengths);
|
ADIOI_Free(file_lengths);
|
||||||
|
|
||||||
if (file_ptr_type == ADIO_INDIVIDUAL) fd->fp_ind += total_bytes_written;
|
/* when incrementing fp_ind, need to also take into account the file type:
|
||||||
|
* consider an N-element 1-d subarray with a lb and ub: ( |---xxxxx-----|
|
||||||
|
* if we wrote N elements, offset needs to point at beginning of type, not
|
||||||
|
* at empty region at offset N+1) */
|
||||||
|
if (file_ptr_type == ADIO_INDIVIDUAL) {
|
||||||
|
/* this is closer, but still incorrect for the cases where a small
|
||||||
|
* amount of a file type is "leftover" after a write */
|
||||||
|
fd->fp_ind = disp + flat_file->indices[j] +
|
||||||
|
((ADIO_Offset)n_filetypes)*filetype_extent;
|
||||||
|
}
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
error_state:
|
error_state:
|
||||||
|
@ -15,29 +15,14 @@ int ADIOI_TESTFS_ReadDone(ADIO_Request *request, ADIO_Status *status, int
|
|||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL) {
|
MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
|
||||||
MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
|
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
|
||||||
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
|
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_ReadDone called on ADIO_REQUEST_NULL\n",
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_ReadDone called on ADIO_REQUEST_NULL\n",
|
myrank, nprocs);
|
||||||
myrank, nprocs);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
MPI_Comm_size((*request)->fd->comm, &nprocs);
|
|
||||||
MPI_Comm_rank((*request)->fd->comm, &myrank);
|
|
||||||
|
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_ReadDone called on %s\n",
|
|
||||||
myrank, nprocs, (*request)->fd->filename);
|
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int ADIOI_TESTFS_WriteDone(ADIO_Request *request, ADIO_Status *status, int
|
int ADIOI_TESTFS_WriteDone(ADIO_Request *request, ADIO_Status *status, int
|
||||||
*error_code)
|
*error_code)
|
||||||
{
|
{
|
||||||
@ -45,24 +30,10 @@ int ADIOI_TESTFS_WriteDone(ADIO_Request *request, ADIO_Status *status, int
|
|||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL) {
|
MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
|
||||||
MPI_Comm_size( MPI_COMM_WORLD, &nprocs );
|
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
|
||||||
MPI_Comm_rank( MPI_COMM_WORLD, &myrank );
|
FPRINTF(stdout,
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_WriteDone called on ADIO_REQUEST_NULL\n",
|
"[%d/%d] ADIOI_TESTFS_WriteDone called on ADIO_REQUEST_NULL\n",
|
||||||
myrank, nprocs);
|
myrank, nprocs);
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
MPI_Comm_size((*request)->fd->comm, &nprocs);
|
|
||||||
MPI_Comm_rank((*request)->fd->comm, &myrank);
|
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_WriteDone called on %s\n",
|
|
||||||
myrank, nprocs, (*request)->fd->filename);
|
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -22,15 +22,9 @@ void ADIOI_TESTFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
*request = ADIOI_Malloc_request();
|
|
||||||
(*request)->optype = ADIOI_WRITE;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->queued = 0;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
|
||||||
MPI_Comm_size(fd->comm, &nprocs);
|
MPI_Comm_size(fd->comm, &nprocs);
|
||||||
MPI_Comm_rank(fd->comm, &myrank);
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
|
MPI_Type_size(datatype, &typesize);
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_IreadContig called on %s\n",
|
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_IreadContig called on %s\n",
|
||||||
myrank, nprocs, fd->filename);
|
myrank, nprocs, fd->filename);
|
||||||
FPRINTF(stdout, "[%d/%d] calling ADIOI_TESTFS_ReadContig\n",
|
FPRINTF(stdout, "[%d/%d] calling ADIOI_TESTFS_ReadContig\n",
|
||||||
@ -40,13 +34,7 @@ void ADIOI_TESTFS_IreadContig(ADIO_File fd, void *buf, int count,
|
|||||||
ADIOI_TESTFS_ReadContig(fd, buf, len, MPI_BYTE, file_ptr_type,
|
ADIOI_TESTFS_ReadContig(fd, buf, len, MPI_BYTE, file_ptr_type,
|
||||||
offset, &status, error_code);
|
offset, &status, error_code);
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
MPIO_Completed_request_create(&fd, len, error_code, request);
|
||||||
if (*error_code == MPI_SUCCESS) {
|
|
||||||
MPI_Get_elements(&status, MPI_BYTE, &len);
|
|
||||||
(*request)->nbytes = len;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADIOI_TESTFS_IreadStrided(ADIO_File fd, void *buf, int count,
|
void ADIOI_TESTFS_IreadStrided(ADIO_File fd, void *buf, int count,
|
||||||
@ -56,34 +44,18 @@ void ADIOI_TESTFS_IreadStrided(ADIO_File fd, void *buf, int count,
|
|||||||
{
|
{
|
||||||
ADIO_Status status;
|
ADIO_Status status;
|
||||||
int myrank, nprocs;
|
int myrank, nprocs;
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
int typesize;
|
int typesize;
|
||||||
#endif
|
|
||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
|
||||||
|
|
||||||
*request = ADIOI_Malloc_request();
|
|
||||||
(*request)->optype = ADIOI_WRITE;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->queued = 0;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Comm_size(fd->comm, &nprocs);
|
MPI_Comm_size(fd->comm, &nprocs);
|
||||||
MPI_Comm_rank(fd->comm, &myrank);
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
|
MPI_Type_size(datatype, &typesize);
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_IreadStrided called on %s\n",
|
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_IreadStrided called on %s\n",
|
||||||
myrank, nprocs, fd->filename);
|
myrank, nprocs, fd->filename);
|
||||||
FPRINTF(stdout, "[%d/%d] calling ADIOI_TESTFS_ReadStrided\n",
|
FPRINTF(stdout, "[%d/%d] calling ADIOI_TESTFS_ReadStrided\n",
|
||||||
myrank, nprocs);
|
myrank, nprocs);
|
||||||
|
|
||||||
ADIOI_TESTFS_ReadStrided(fd, buf, count, datatype, file_ptr_type,
|
ADIOI_TESTFS_ReadStrided(fd, buf, count, datatype, file_ptr_type,
|
||||||
offset, &status, error_code);
|
offset, &status, error_code);
|
||||||
|
MPIO_Completed_request_create(&fd, count*typesize, error_code, request);
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (*error_code == MPI_SUCCESS) {
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
|
||||||
(*request)->nbytes = count * typesize;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,6 +8,9 @@
|
|||||||
#include "ad_testfs.h"
|
#include "ad_testfs.h"
|
||||||
#include "adioi.h"
|
#include "adioi.h"
|
||||||
|
|
||||||
|
#include "mpiu_greq.h"
|
||||||
|
#include "../../mpi-io/mpioimpl.h"
|
||||||
|
|
||||||
/* ADIOI_TESTFS_IwriteContig()
|
/* ADIOI_TESTFS_IwriteContig()
|
||||||
*
|
*
|
||||||
* Implemented by immediately calling WriteContig()
|
* Implemented by immediately calling WriteContig()
|
||||||
@ -22,12 +25,6 @@ void ADIOI_TESTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
*request = ADIOI_Malloc_request();
|
|
||||||
(*request)->optype = ADIOI_WRITE;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->queued = 0;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
MPI_Type_size(datatype, &typesize);
|
||||||
MPI_Comm_size(fd->comm, &nprocs);
|
MPI_Comm_size(fd->comm, &nprocs);
|
||||||
MPI_Comm_rank(fd->comm, &myrank);
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
@ -39,14 +36,8 @@ void ADIOI_TESTFS_IwriteContig(ADIO_File fd, void *buf, int count,
|
|||||||
len = count * typesize;
|
len = count * typesize;
|
||||||
ADIOI_TESTFS_WriteContig(fd, buf, len, MPI_BYTE, file_ptr_type,
|
ADIOI_TESTFS_WriteContig(fd, buf, len, MPI_BYTE, file_ptr_type,
|
||||||
offset, &status, error_code);
|
offset, &status, error_code);
|
||||||
|
MPIO_Completed_request_create(&fd, len, error_code, request);
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (*error_code == MPI_SUCCESS) {
|
|
||||||
MPI_Get_elements(&status, MPI_BYTE, &len);
|
|
||||||
(*request)->nbytes = len;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, void *buf, int count,
|
void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, void *buf, int count,
|
||||||
@ -56,20 +47,14 @@ void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
{
|
{
|
||||||
ADIO_Status status;
|
ADIO_Status status;
|
||||||
int myrank, nprocs;
|
int myrank, nprocs;
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
int typesize;
|
int typesize;
|
||||||
#endif
|
|
||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
*request = ADIOI_Malloc_request();
|
|
||||||
(*request)->optype = ADIOI_WRITE;
|
|
||||||
(*request)->fd = fd;
|
|
||||||
(*request)->queued = 0;
|
|
||||||
(*request)->datatype = datatype;
|
|
||||||
|
|
||||||
MPI_Comm_size(fd->comm, &nprocs);
|
MPI_Comm_size(fd->comm, &nprocs);
|
||||||
MPI_Comm_rank(fd->comm, &myrank);
|
MPI_Comm_rank(fd->comm, &myrank);
|
||||||
|
MPI_Type_size(datatype, &typesize);
|
||||||
|
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_IwriteStrided called on %s\n",
|
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_IwriteStrided called on %s\n",
|
||||||
myrank, nprocs, fd->filename);
|
myrank, nprocs, fd->filename);
|
||||||
FPRINTF(stdout, "[%d/%d] calling ADIOI_TESTFS_WriteStrided\n",
|
FPRINTF(stdout, "[%d/%d] calling ADIOI_TESTFS_WriteStrided\n",
|
||||||
@ -77,12 +62,6 @@ void ADIOI_TESTFS_IwriteStrided(ADIO_File fd, void *buf, int count,
|
|||||||
|
|
||||||
ADIOI_TESTFS_WriteStrided(fd, buf, count, datatype, file_ptr_type,
|
ADIOI_TESTFS_WriteStrided(fd, buf, count, datatype, file_ptr_type,
|
||||||
offset, &status, error_code);
|
offset, &status, error_code);
|
||||||
|
MPIO_Completed_request_create(&fd, count*typesize, error_code, request);
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
if (*error_code == MPI_SUCCESS) {
|
|
||||||
MPI_Type_size(datatype, &typesize);
|
|
||||||
(*request)->nbytes = count * typesize;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
fd->async_count++;
|
|
||||||
}
|
}
|
||||||
|
@ -15,22 +15,12 @@ void ADIOI_TESTFS_ReadComplete(ADIO_Request *request, ADIO_Status *status, int
|
|||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL) {
|
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
|
||||||
FPRINTF(stdout, "[xx/xx] ADIOI_TESTFS_ReadComplete called on ADIO_REQUEST_NULL\n");
|
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||||
return;
|
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_ReadComplete called \n",
|
||||||
}
|
myrank, nprocs);
|
||||||
|
|
||||||
MPI_Comm_size((*request)->fd->comm, &nprocs);
|
/* do something with status set bytes? */
|
||||||
MPI_Comm_rank((*request)->fd->comm, &myrank);
|
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_ReadComplete called on %s\n",
|
|
||||||
myrank, nprocs, (*request)->fd->filename);
|
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ADIOI_TESTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int
|
void ADIOI_TESTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int
|
||||||
@ -40,20 +30,10 @@ void ADIOI_TESTFS_WriteComplete(ADIO_Request *request, ADIO_Status *status, int
|
|||||||
|
|
||||||
*error_code = MPI_SUCCESS;
|
*error_code = MPI_SUCCESS;
|
||||||
|
|
||||||
if (*request == ADIO_REQUEST_NULL) {
|
MPI_Comm_size(MPI_COMM_WORLD, &nprocs);
|
||||||
FPRINTF(stdout, "[xx/xx] ADIOI_TESTFS_WriteComplete called on ADIO_REQUEST_NULL\n");
|
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);
|
||||||
return;
|
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_WriteComplete called\n",
|
||||||
}
|
myrank, nprocs);
|
||||||
|
|
||||||
MPI_Comm_size((*request)->fd->comm, &nprocs);
|
/* do something with status_set_bytes? */
|
||||||
MPI_Comm_rank((*request)->fd->comm, &myrank);
|
|
||||||
FPRINTF(stdout, "[%d/%d] ADIOI_TESTFS_WriteComplete called on %s\n",
|
|
||||||
myrank, nprocs, (*request)->fd->filename);
|
|
||||||
|
|
||||||
#ifdef HAVE_STATUS_SET_BYTES
|
|
||||||
MPIR_Status_set_bytes(status, (*request)->datatype, (*request)->nbytes);
|
|
||||||
#endif
|
|
||||||
(*request)->fd->async_count--;
|
|
||||||
ADIOI_Free_request((ADIOI_Req_node *) (*request));
|
|
||||||
*request = ADIO_REQUEST_NULL;
|
|
||||||
}
|
}
|
||||||
|
@ -22,8 +22,13 @@ struct ADIOI_Fns_struct ADIO_UFS_operations = {
|
|||||||
ADIOI_GEN_ReadStrided, /* ReadStrided */
|
ADIOI_GEN_ReadStrided, /* ReadStrided */
|
||||||
ADIOI_GEN_WriteStrided, /* WriteStrided */
|
ADIOI_GEN_WriteStrided, /* WriteStrided */
|
||||||
ADIOI_GEN_Close, /* Close */
|
ADIOI_GEN_Close, /* Close */
|
||||||
|
#ifdef ROMIO_HAVE_WORKING_AIO
|
||||||
ADIOI_GEN_IreadContig, /* IreadContig */
|
ADIOI_GEN_IreadContig, /* IreadContig */
|
||||||
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
ADIOI_GEN_IwriteContig, /* IwriteContig */
|
||||||
|
#else
|
||||||
|
ADIOI_FAKE_IreadContig, /* IreadContig */
|
||||||
|
ADIOI_FAKE_IwriteContig, /* IwriteContig */
|
||||||
|
#endif
|
||||||
ADIOI_GEN_IODone, /* ReadDone */
|
ADIOI_GEN_IODone, /* ReadDone */
|
||||||
ADIOI_GEN_IODone, /* WriteDone */
|
ADIOI_GEN_IODone, /* WriteDone */
|
||||||
ADIOI_GEN_IOComplete, /* ReadComplete */
|
ADIOI_GEN_IOComplete, /* ReadComplete */
|
||||||
|
@ -15,6 +15,9 @@
|
|||||||
#ifdef HAVE_SIGNAL_H
|
#ifdef HAVE_SIGNAL_H
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_SYS_TYPES_H
|
||||||
|
#include <sys/types.h>
|
||||||
|
#endif
|
||||||
#ifdef HAVE_AIO_H
|
#ifdef HAVE_AIO_H
|
||||||
#include <aio.h>
|
#include <aio.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,11 +31,25 @@ void ADIOI_UFS_Open(ADIO_File fd, int *error_code)
|
|||||||
if (fd->access_mode & ADIO_EXCL)
|
if (fd->access_mode & ADIO_EXCL)
|
||||||
amode = amode | O_EXCL;
|
amode = amode | O_EXCL;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_sys = open(fd->filename, amode, perm);
|
fd->fd_sys = open(fd->filename, amode, perm);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_open_b, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fd_direct = -1;
|
fd->fd_direct = -1;
|
||||||
|
|
||||||
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND))
|
if ((fd->fd_sys != -1) && (fd->access_mode & ADIO_APPEND)) {
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_a, 0, NULL );
|
||||||
|
#endif
|
||||||
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
fd->fp_ind = fd->fp_sys_posn = lseek(fd->fd_sys, 0, SEEK_END);
|
||||||
|
#ifdef ADIOI_MPE_LOGGING
|
||||||
|
MPE_Log_event( ADIOI_MPE_lseek_b, 0, NULL );
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
/* --BEGIN ERROR HANDLING-- */
|
/* --BEGIN ERROR HANDLING-- */
|
||||||
if (fd->fd_sys == -1) {
|
if (fd->fd_sys == -1) {
|
||||||
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
x
Ссылка в новой задаче
Block a user