Commit 099470b3 authored by Shane Snyder's avatar Shane Snyder

Merge remote-tracking branch 'origin/mmap-dev'

Merging mmap feature development branch back into master. Darshan
can now mmap its data structures to temporary log files at runtime to
protect against applications that do not call MPI_Finalize. Feature
can be enabled at configure time using '--enable-mmap-logs'.
parents a6e86829 bb75028f
......@@ -11,7 +11,7 @@
#define DARSHAN_BGQ_VER 1
#define BGQ_COUNTERS \
/* control system jobid*/\
/* control system jobid */\
X(BGQ_CSJOBID) \
/* number of BGQ compute nodes */\
X(BGQ_NNODES) \
......@@ -60,16 +60,13 @@ enum darshan_bgq_f_indices
* which would actually be logged to file by Darshan for the "BGQ" example
* module. This example implementation logs the following data for each
* record:
* - a corresponding Darshan record identifier
* - the rank of the process responsible for the record
* - a darshan_base_record structure, which contains the record id & rank
* - integer I/O counters (operation counts, I/O sizes, etc.)
* - floating point I/O counters (timestamps, cumulative timers, etc.)
*/
struct darshan_bgq_record
{
darshan_record_id f_id;
int64_t rank;
int alignment;
struct darshan_base_record base_rec;
int64_t counters[BGQ_NUM_INDICES];
double fcounters[BGQ_F_NUM_INDICES];
};
......
......@@ -41,15 +41,13 @@ enum darshan_hdf5_f_indices
/* file record structure for HDF5 files. a record is created and stored for
* every HDF5 file opened by the original application. For the HDF5 module,
* the record includes:
* - a corresponding record identifier (created by hashing the file path)
* - the rank of the process which opened the file (-1 for shared files)
* - a darshan_base_record structure, which contains the record id & rank
* - integer file I/O statistics (open, read/write counts, etc)
* - floating point I/O statistics (timestamps, cumulative timers, etc.)
*/
struct darshan_hdf5_file
{
darshan_record_id f_id;
int64_t rank;
struct darshan_base_record base_rec;
int64_t counters[HDF5_NUM_INDICES];
double fcounters[HDF5_F_NUM_INDICES];
};
......
......@@ -20,7 +20,7 @@
#endif
/* update this on file format changes */
#define DARSHAN_LOG_VERSION "3.00"
#define DARSHAN_LOG_VERSION "3.01"
/* magic number for validating output files and checking byte order */
#define DARSHAN_MAGIC_NR 6567223
......@@ -44,6 +44,7 @@ enum darshan_comp_type
{
DARSHAN_ZLIB_COMP,
DARSHAN_BZIP2_COMP,
DARSHAN_NO_COMP,
};
typedef uint64_t darshan_record_id;
......@@ -68,7 +69,7 @@ struct darshan_header
int64_t magic_nr;
unsigned char comp_type;
uint32_t partial_flag;
struct darshan_log_map rec_map;
struct darshan_log_map name_map;
struct darshan_log_map mod_map[DARSHAN_MAX_MODS];
uint32_t mod_ver[DARSHAN_MAX_MODS];
};
......@@ -85,11 +86,18 @@ struct darshan_job
char metadata[DARSHAN_JOB_METADATA_LEN];
};
/* minimal record stored for each file/object accessed by Darshan */
struct darshan_record
/* record to store name->darshan_id mapping for each registered record */
struct darshan_name_record
{
char* name;
darshan_record_id id;
char name[1];
};
/* base record definition that can be used by modules */
struct darshan_base_record
{
darshan_record_id id;
int64_t rank;
};
......
......@@ -140,15 +140,13 @@ enum darshan_mpiio_f_indices
/* file record structure for MPI-IO files. a record is created and stored for
* every MPI-IO file opened by the original application. For the MPI-IO module,
* the record includes:
* - a corresponding record identifier (created by hashing the file path)
* - the rank of the process which opened the file (-1 for shared files)
* - a darshan_base_record structure, which contains the record id & rank
* - integer file I/O statistics (open, read/write counts, etc)
* - floating point I/O statistics (timestamps, cumulative timers, etc.)
*/
struct darshan_mpiio_file
{
darshan_record_id f_id;
int64_t rank;
struct darshan_base_record base_rec;
int64_t counters[MPIIO_NUM_INDICES];
double fcounters[MPIIO_F_NUM_INDICES];
};
......
......@@ -44,15 +44,13 @@ enum darshan_null_f_indices
* which would actually be logged to file by Darshan for the "NULL" example
* module. This example implementation logs the following data for each
* record:
* - a corresponding Darshan record identifier
* - the rank of the process responsible for the record
* - a darshan_base_record structure, which contains the record id & rank
* - integer I/O counters (operation counts, I/O sizes, etc.)
* - floating point I/O counters (timestamps, cumulative timers, etc.)
*/
struct darshan_null_record
{
darshan_record_id f_id;
int64_t rank;
struct darshan_base_record base_rec;
int64_t counters[NULL_NUM_INDICES];
double fcounters[NULL_F_NUM_INDICES];
};
......
......@@ -43,15 +43,13 @@ enum darshan_pnetcdf_f_indices
/* file record structure for PNETCDF files. a record is created and stored for
* every PNETCDF file opened by the original application. For the PNETCDF module,
* the record includes:
* - a corresponding record identifier (created by hashing the file path)
* - the rank of the process which opened the file (-1 for shared files)
* - a darshan_base_record structure, which contains the record id & rank
* - integer file I/O statistics (open, read/write counts, etc)
* - floating point I/O statistics (timestamps, cumulative timers, etc.)
*/
struct darshan_pnetcdf_file
{
darshan_record_id f_id;
int64_t rank;
struct darshan_base_record base_rec;
int64_t counters[PNETCDF_NUM_INDICES];
double fcounters[PNETCDF_F_NUM_INDICES];
};
......
......@@ -164,15 +164,13 @@ enum darshan_posix_f_indices
/* file record structure for POSIX files. a record is created and stored for
* every POSIX file opened by the original application. For the POSIX module,
* the record includes:
* - a corresponding record identifier (created by hashing the file path)
* - the rank of the process which opened the file (-1 for shared files)
* - a darshan_base_record structure, which contains the record id & rank
* - integer file I/O statistics (open, read/write counts, etc)
* - floating point I/O statistics (timestamps, cumulative timers, etc.)
*/
struct darshan_posix_file
{
darshan_record_id f_id;
int64_t rank;
struct darshan_base_record base_rec;
int64_t counters[POSIX_NUM_INDICES];
double fcounters[POSIX_F_NUM_INDICES];
};
......
......@@ -17,6 +17,7 @@ CC = @CC@
LD = @LD@
DISABLE_LDPRELOAD = @DISABLE_LDPRELOAD@
ENABLE_MMAP_LOGS = @ENABLE_MMAP_LOGS@
DARSHAN_USE_BGQ = @DARSHAN_USE_BGQ@
DARSHAN_LOG_FORMAT = $(srcdir)/../darshan-log-format.h
DARSHAN_VERSION = @DARSHAN_VERSION@
......@@ -157,6 +158,9 @@ endif
install -m 644 $(srcdir)/share/ld-opts/darshan-posix-ld-opts $(datarootdir)/ld-opts/darshan-posix-ld-opts
install -m 644 $(srcdir)/share/ld-opts/darshan-hdf5-ld-opts $(datarootdir)/ld-opts/darshan-hdf5-ld-opts
install -m 644 $(srcdir)/share/ld-opts/darshan-pnetcdf-ld-opts $(datarootdir)/ld-opts/darshan-pnetcdf-ld-opts
ifdef ENABLE_MMAP_LOGS
install -m 755 share/darshan-mmap-epilog.sh $(datarootdir)/darshan-mmap-epilog.sh
endif
install -d $(libdir)/pkgconfig
install -m 644 lib/pkgconfig/darshan-runtime.pc $(libdir)/pkgconfig/darshan-runtime.pc
......@@ -164,5 +168,5 @@ clean::
rm -f *.o *.a lib/*.o lib/*.po lib/*.a lib/*.so
distclean:: clean
rm -f darshan-runtime-config.h darshan-gen-cxx.pl darshan-gen-fortran.pl darshan-gen-cc.pl darshan-mk-log-dirs.pl darshan-config darshan-base-ld-opts aclocal.m4 autom4te.cache/* config.status config.log Makefile
rm -f darshan-runtime-config.h darshan-gen-cxx.pl darshan-gen-fortran.pl darshan-gen-cc.pl darshan-mk-log-dirs.pl darshan-config lib/pkgconfig/darshan-runtime.pc share/craype-1.x/darshan-module share/craype-2.x/darshan-module share/darshan-mmap-epilog.sh share/ld-opts/darshan-base-ld-opts share/mpi-profile/darshan-bg-cc.conf share/mpi-profile/darshan-bg-cxx.conf share/mpi-profile/darshan-bg-f.conf share/mpi-profile/darshan-cc.conf share/mpi-profile/darshan-cxx.conf share/mpi-profile/darshan-f.conf aclocal.m4 autom4te.cache/* config.status config.log Makefile
rm -rf autom4te.cache
......@@ -624,6 +624,7 @@ LIBOBJS
DARSHAN_USE_BGQ
MPICH_LIB_OLD
DARSHAN_VERSION
ENABLE_MMAP_LOGS
DISABLE_LDPRELOAD
__DARSHAN_LOG_PATH
darshan_share_path
......@@ -684,15 +685,16 @@ ac_subst_files=''
ac_user_opts='
enable_option_checking
with_zlib
enable_cuserid
enable_ld_preload
enable_cuserid
enable_group_readable_logs
enable_bgq_mod
enable_mmap_logs
with_mem_align
with_log_path_by_env
with_log_hints
with_log_path
with_jobid_env
enable_bgq_mod
with_mod_mem
'
ac_precious_vars='build_alias
......@@ -1313,10 +1315,12 @@ Optional Features:
--disable-option-checking ignore unrecognized --enable/--with options
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
--disable-cuserid Disables attempted use of cuserid() at run time
--disable-ld-preload Disables support for LD_PRELOAD library
--enable-group-readable-logs Set log files to be group readable
--disable-cuserid Disables attempted use of cuserid() at run time
--enable-group-readable-logs
Set log files to be group readable
--disable-bgq-mod Disables compilation and use of BG/Q module (for BG/Q systems)
--enable-mmmap-logs Enables ability to mmap I/O data to log file
Optional Packages:
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
......@@ -1325,13 +1329,16 @@ Optional Packages:
/usr/local or /usr if not found in /usr/local
--without-zlib to disable zlib usage completely
--with-mem-align=<num> Memory alignment in bytes
--with-log-path-by-env=<env var list> Comma separated list of environment variables to check for log path location before --with-log-path path
--with-log-hints=<hint1=x;hint2=y> Semicolon-separated list of MPI-IO hints for log file write
--with-log-path-by-env=<env var list>
Comma separated list of environment variables to check for
log path location before --with-log-path path
--with-log-hints=<hint1=x;hint2=y>
Semicolon-separated list of MPI-IO hints for log file write
--with-log-path=<path> Location to store log files at run time
--with-jobid-env=<name> Name of environment variable that stores the jobid
(specify "NONE" if no appropriate environment variable is available:
Darshan will use rank 0's pid instead)
--with-mod-mem=<num> Maximum amount of memory (in MiB) for each Darshan module
(specify "NONE" if no appropriate environment variable
is available: Darshan will use rank 0's pid instead)
--with-mod-mem=<num> Maximum amount of memory (in MiB) for each Darshan module
Some influential environment variables:
CC C compiler command
......@@ -3528,31 +3535,54 @@ fi
# Check whether --enable-ld-preload was given.
if test "${enable_ld_preload+set}" = set; then :
enableval=$enable_ld_preload; if test "x$enableval" = "xno" ; then
DISABLE_LDPRELOAD="1"
fi
fi
# Check whether --enable-cuserid was given.
if test "${enable_cuserid+set}" = set; then :
enableval=$enable_cuserid; if test "x$enableval" = "xno" ; then
$as_echo "#define DARSHAN_DISABLE_CUSERID 1" >>confdefs.h
$as_echo "#define __DARSHAN_DISABLE_CUSERID 1" >>confdefs.h
fi
fi
# Check whether --enable-ld-preload was given.
if test "${enable_ld_preload+set}" = set; then :
enableval=$enable_ld_preload; if test "x$enableval" = "xno" ; then
DISABLE_LDPRELOAD="1"
# Check whether --enable-group-readable-logs was given.
if test "${enable_group_readable_logs+set}" = set; then :
enableval=$enable_group_readable_logs; if test "x$enableval" = "xyes" ; then
$as_echo "#define __DARSHAN_GROUP_READABLE_LOGS 1" >>confdefs.h
fi
fi
# Check whether --enable-group-readable-logs was given.
if test "${enable_group_readable_logs+set}" = set; then :
enableval=$enable_group_readable_logs; if test "x$enableval" = "xyes" ; then
# Check whether --enable-bgq_mod was given.
if test "${enable_bgq_mod+set}" = set; then :
enableval=$enable_bgq_mod;
else
enable_bgq_mod=check
fi
$as_echo "#define __DARSHAN_GROUP_READABLE_LOGS 1" >>confdefs.h
# Check whether --enable-mmap-logs was given.
if test "${enable_mmap_logs+set}" = set; then :
enableval=$enable_mmap_logs; if test "x$enableval" = "xyes" ; then
$as_echo "#define __DARSHAN_ENABLE_MMAP_LOGS 1" >>confdefs.h
ENABLE_MMAP_LOGS=1
ac_config_files="$ac_config_files share/darshan-mmap-epilog.sh"
fi
......@@ -3648,6 +3678,54 @@ _ACEOF
fi
# Check whether --with-mod-mem was given.
if test "${with_mod_mem+set}" = set; then :
withval=$with_mod_mem; if test x$withval = xyes; then
as_fn_error $? "--with-mod-mem must be given a number" "$LINENO" 5
else
cat >>confdefs.h <<_ACEOF
#define __DARSHAN_MOD_MEM_MAX ${withval}
_ACEOF
fi
fi
if test x$enable_bgq_mod != xno; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BG/Q environment" >&5
$as_echo_n "checking for BG/Q environment... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifndef __bgq__
#error __bgq__ not set
#endif
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
DARSHAN_USE_BGQ=1
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "x$enable_bgq_mod" = xyes; then :
as_fn_error $? "BG/Q module enabled in non-BG/Q environment" "$LINENO" 5
fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
if test x$GOT_ALIGNMENT != x1; then
as_fn_error $? "must provide --with-mem-align=<num> argument to configure." "$LINENO" 5
fi
......@@ -4243,63 +4321,6 @@ else
MPICH_LIB_OLD=0
fi
# check to see whether the bgq instrumentation module should be built
# Check whether --enable-bgq_mod was given.
if test "${enable_bgq_mod+set}" = set; then :
enableval=$enable_bgq_mod;
else
enable_bgq_mod=check
fi
if test x$enable_bgq_mod != xno; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for BG/Q environment" >&5
$as_echo_n "checking for BG/Q environment... " >&6; }
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#ifndef __bgq__
#error __bgq__ not set
#endif
int
main ()
{
;
return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
$as_echo "yes" >&6; }
DARSHAN_USE_BGQ=1
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
$as_echo "no" >&6; }
if test "x$enable_bgq_mod" = xyes; then :
as_fn_error $? "BG/Q module enabled in non-BG/Q environment" "$LINENO" 5
fi
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
fi
# Check whether --with-mod-mem was given.
if test "${with_mod_mem+set}" = set; then :
withval=$with_mod_mem; if test x$withval = xyes; then
as_fn_error $? "--with-mod-mem must be given a number" "$LINENO" 5
else
cat >>confdefs.h <<_ACEOF
#define __DARSHAN_MOD_MEM_MAX ${withval}
_ACEOF
fi
fi
DARSHAN_VERSION="3.0.1"
......@@ -4309,6 +4330,7 @@ DARSHAN_VERSION="3.0.1"
ac_config_files="$ac_config_files Makefile darshan-mk-log-dirs.pl darshan-gen-cc.pl darshan-gen-cxx.pl darshan-gen-fortran.pl darshan-config share/craype-1.x/darshan-module share/craype-2.x/darshan-module lib/pkgconfig/darshan-runtime.pc share/mpi-profile/darshan-cc.conf share/mpi-profile/darshan-cxx.conf share/mpi-profile/darshan-f.conf share/mpi-profile/darshan-bg-cc.conf share/mpi-profile/darshan-bg-cxx.conf share/mpi-profile/darshan-bg-f.conf share/ld-opts/darshan-base-ld-opts"
cat >confcache <<\_ACEOF
......@@ -5003,6 +5025,7 @@ for ac_config_target in $ac_config_targets
do
case $ac_config_target in
"darshan-runtime-config.h") CONFIG_HEADERS="$CONFIG_HEADERS darshan-runtime-config.h" ;;
"share/darshan-mmap-epilog.sh") CONFIG_FILES="$CONFIG_FILES share/darshan-mmap-epilog.sh" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"darshan-mk-log-dirs.pl") CONFIG_FILES="$CONFIG_FILES darshan-mk-log-dirs.pl" ;;
"darshan-gen-cc.pl") CONFIG_FILES="$CONFIG_FILES darshan-gen-cc.pl" ;;
......
......@@ -24,27 +24,44 @@ AC_TRY_COMPILE([#include <mpi.h>], [int ret = MPI_Init(0, (void*)0)],
dnl runtime libraries require zlib
CHECK_ZLIB
AC_ARG_ENABLE(cuserid,
[ --disable-cuserid Disables attempted use of cuserid() at run time],
AC_ARG_ENABLE(ld-preload,
[ --disable-ld-preload Disables support for LD_PRELOAD library],
[if test "x$enableval" = "xno" ; then
AC_DEFINE(DARSHAN_DISABLE_CUSERID, 1, Define if cuserid() should be disabled)
DISABLE_LDPRELOAD="1"
fi]
,)
AC_ARG_ENABLE(ld-preload,
[ --disable-ld-preload Disables support for LD_PRELOAD library],
AC_ARG_ENABLE(cuserid,
[ --disable-cuserid Disables attempted use of cuserid() at run time],
[if test "x$enableval" = "xno" ; then
DISABLE_LDPRELOAD="1"
AC_DEFINE(__DARSHAN_DISABLE_CUSERID, 1, Define if cuserid() should be disabled)
fi]
,)
AC_ARG_ENABLE(group-readable-logs,
[ --enable-group-readable-logs Set log files to be group readable],
[ --enable-group-readable-logs
Set log files to be group readable],
[if test "x$enableval" = "xyes" ; then
AC_DEFINE(__DARSHAN_GROUP_READABLE_LOGS, 1, Define if Darshan should set log files to be group readable)
fi]
,)
AC_ARG_ENABLE(
[bgq_mod],
[ --disable-bgq-mod Disables compilation and use of BG/Q module (for BG/Q systems)],
[],
[enable_bgq_mod=check]
)
AC_ARG_ENABLE(mmap-logs,
[ --enable-mmmap-logs Enables ability to mmap I/O data to log file],
[if test "x$enableval" = "xyes" ; then
AC_DEFINE(__DARSHAN_ENABLE_MMAP_LOGS, 1, Define if Darshan should mmap data structures to log file)
ENABLE_MMAP_LOGS=1
AC_CONFIG_FILES(share/darshan-mmap-epilog.sh)
fi]
,)
AC_ARG_WITH(mem-align,
[ --with-mem-align=<num> Memory alignment in bytes],
if test x$withval = xyes; then
......@@ -56,7 +73,9 @@ AC_ARG_WITH(mem-align,
)
AC_ARG_WITH(log-path-by-env,
[ --with-log-path-by-env=<env var list> Comma separated list of environment variables to check for log path location before --with-log-path path],
[ --with-log-path-by-env=<env var list>
Comma separated list of environment variables to check for
log path location before --with-log-path path],
if test x$withval = xyes; then
AC_MSG_ERROR(--with-log-path-by-env must be given at least one variable name)
else
......@@ -67,7 +86,8 @@ AC_ARG_WITH(log-path-by-env,
)
AC_ARG_WITH(log-hints,
[ --with-log-hints=<hint1=x;hint2=y> Semicolon-separated list of MPI-IO hints for log file write],
[ --with-log-hints=<hint1=x;hint2=y>
Semicolon-separated list of MPI-IO hints for log file write],
if test x$withval = xyes; then
AC_MSG_ERROR(--with-log-hints must be given an argument)
else
......@@ -90,8 +110,8 @@ AC_ARG_WITH(log-path,
AC_ARG_WITH(jobid-env,
[ --with-jobid-env=<name> Name of environment variable that stores the jobid
(specify "NONE" if no appropriate environment variable is available:
Darshan will use rank 0's pid instead)],
(specify "NONE" if no appropriate environment variable
is available: Darshan will use rank 0's pid instead)],
if test x$withval = xyes; then
AC_MSG_ERROR(--with-jobid-env must be given a name)
else
......@@ -101,6 +121,30 @@ AC_ARG_WITH(jobid-env,
fi
)
AC_ARG_WITH(mod-mem,
[ --with-mod-mem=<num> Maximum amount of memory (in MiB) for each Darshan module],
if test x$withval = xyes; then
AC_MSG_ERROR(--with-mod-mem must be given a number)
else
AC_DEFINE_UNQUOTED(__DARSHAN_MOD_MEM_MAX, ${withval}, Maximum memory (in MiB) for each Darshan module)
fi
)
if test x$enable_bgq_mod != xno; then
AC_MSG_CHECKING(for BG/Q environment)
AC_TRY_COMPILE([
#ifndef __bgq__
#error __bgq__ not set
#endif
], [],
AC_MSG_RESULT(yes)
DARSHAN_USE_BGQ=1,
AC_MSG_RESULT(no)
AS_IF([test "x$enable_bgq_mod" = xyes],
AC_MSG_ERROR(BG/Q module enabled in non-BG/Q environment),
[]))
fi
if test x$GOT_ALIGNMENT != x1; then
AC_MSG_ERROR(must provide --with-mem-align=<num> argument to configure.)
fi
......@@ -280,43 +324,13 @@ AS_IF([$CC -show foo.c -o foo >& /dev/null],
MPICH_LIB_OLD=0),
MPICH_LIB_OLD=0)
# check to see whether the bgq instrumentation module should be built
AC_ARG_ENABLE(
[bgq_mod],
[ --disable-bgq-mod Disables compilation and use of BG/Q module (for BG/Q systems)],
[],
[enable_bgq_mod=check]
)
if test x$enable_bgq_mod != xno; then
AC_MSG_CHECKING(for BG/Q environment)
AC_TRY_COMPILE([
#ifndef __bgq__
#error __bgq__ not set
#endif
], [],
AC_MSG_RESULT(yes)
DARSHAN_USE_BGQ=1,
AC_MSG_RESULT(no)
AS_IF([test "x$enable_bgq_mod" = xyes],
AC_MSG_ERROR(BG/Q module enabled in non-BG/Q environment),
[]))
fi
AC_ARG_WITH(mod-mem,
[ --with-mod-mem=<num> Maximum amount of memory (in MiB) for each Darshan module],
if test x$withval = xyes; then
AC_MSG_ERROR(--with-mod-mem must be given a number)
else
AC_DEFINE_UNQUOTED(__DARSHAN_MOD_MEM_MAX, ${withval}, Maximum memory (in MiB) for each Darshan module)
fi
)
DARSHAN_VERSION="AC_PACKAGE_VERSION"
AC_SUBST(darshan_lib_path)
AC_SUBST(darshan_share_path)
AC_SUBST(LDFLAGS)
AC_SUBST(__DARSHAN_LOG_PATH)
AC_SUBST(DISABLE_LDPRELOAD)
AC_SUBST(ENABLE_MMAP_LOGS)
AC_SUBST(DARSHAN_VERSION)
AC_SUBST(MPICH_LIB_OLD)
AC_SUBST(DARSHAN_USE_BGQ)
......
......@@ -66,44 +66,68 @@
} while(0)
/* potentially set or increment a common value counter, depending on the __count
* for the given __value
* for the given __value. This macro ensures common values are stored first in
* decreasing order of their total count, and second by decreasing order of
* their value.
*
* NOTE: This macro is hardcoded to expect that Darshan will only track the 4
* most common (i.e., frequently occuring) values. __val_p is a pointer to the
* base of the value counters (i.e., the first of 4 contiguous common value
* counters) and __cnt_p is a pointer to the base of the count counters (i.e.
* the first of 4 contiguous common count counters). It is assumed your counters
* are stored as int64_t types.
* are stored as int64_t types. __add_flag is set if the given count should be
* added to the common access counter, rather than just incrementing it.
*/
#define DARSHAN_COMMON_VAL_COUNTER_INC(__val_p, __cnt_p, __value, __count) do {\
#define DARSHAN_COMMON_VAL_COUNTER_INC(__val_p, __cnt_p, __value, __count, __add_flag) do {\
int i; \
int set = 0; \
int64_t min = *(__cnt_p); \
int min_index = 0; \
int inc_count, total_count; \
int64_t tmp_val[4] = {0}; \
int64_t tmp_cnt[4] = {0}; \
int tmp_ndx = 0; \
if(__value == 0) break; \
if(__add_flag) \
inc_count = 1; \
else \
inc_count = __count; \
for(i=0; i<4; i++) { \
/* increment bucket if already exists */ \
if(*(__val_p + i) == __value) { \
*(__cnt_p + i) += __count; \
set = 1; \
total_count = *(__cnt_p + i) + inc_count; \
break; \
} \
/* otherwise find the least frequently used bucket */ \
else if(*(__cnt_p + i) < min) { \
min = *(__cnt_p + i); \
min_index = i; \
} \
if(i == 4) total_count = __count; \
/* first, copy over any counters that should be sorted above this one \
* (counters with higher counts or equal counts and larger values) \
*/ \
for(i=0;i < 4; i++) { \
if((*(__cnt_p + i) > total_count) || \
((*(__cnt_p + i) == total_count) && (*(__val_p + i) > __value))) { \
tmp_val[tmp_ndx] = *(__val_p + i); \
tmp_cnt[tmp_ndx] = *(__cnt_p + i); \
tmp_ndx++; \
} \
else break; \
} \
if(!set && (__count > min)) { \
*(__cnt_p + min_index) = __count; \
*(__val_p + min_index) = __value; \
if(tmp_ndx == 4) break; /* all done, updated counter is not added */ \
/* next, add the updated counter */ \
tmp_val[tmp_ndx] = __value; \
tmp_cnt[tmp_ndx] = total_count; \
tmp_ndx++; \
/* last, copy over any remaining counters to make sure we have 4 sets total */ \
while(tmp_ndx != 4) { \
if(*(__val_p + i) != __value) { \
tmp_val[tmp_ndx] = *(__val_p + i); \
tmp_cnt[tmp_ndx] = *(__cnt_p + i); \
tmp_ndx++; \
} \
i++; \
} \
memcpy(__val_p, tmp_val, 4*sizeof(int64_t)); \
memcpy(__cnt_p, tmp_cnt, 4*sizeof(int64_t)); \
} while(0)
/* maximum number of common values that darshan will track per file at
* runtime; at shutdown time these will be reduced to the 4 most
* frequently occuring ones
*/
/* maximum number of common values that darshan will track per file at runtime */
#define DARSHAN_COMMON_VAL_MAX_RUNTIME_COUNT 32
struct darshan_common_val_counter
{
......@@ -130,6 +154,67 @@ struct darshan_variance_dt
* darshan-common functions for darshan modules *
***********************************************/
/* darshan_lookup_record_ref()
*
* Lookup a record reference pointer using the given 'handle'.
* 'handle_sz' is the size of the handle structure, and 'hash_head'
* is the pointer to the hash table to search.
* If the handle is found, the corresponding record reference pointer
* is returned, otherwise NULL is returned.
*/
void *darshan_lookup_record_ref(
void *hash_head,
void *handle,
size_t handle_sz);
/* darshan_add_record_ref()
*
* Add the given record reference pointer, 'rec_ref_p' to the hash
* table whose address is stored in the 'hash_head_p' pointer. The
* hash is generated from the given 'handle', with size 'handle_sz'.
* If the record reference is successfully added, 1 is returned,
* otherwise, 0 is returned.
*/
int darshan_add_record_ref(
void **hash_head_p,
void *handle,
size_t handle_sz,
void *rec_ref_p);
/* darshan_delete_record_ref()
*
* Delete the record reference for the given 'handle', with size
* 'handle_sz', from the hash table whose address is stored in
* the 'hash_head_p' pointer.
* On success deletion, the corresponding record reference pointer
* is returned, otherwise NULL is returned.
*/
void *darshan_delete_record_ref(
void **hash_head_p,
void *handle,
size_t handle_sz);