mirror of https://github.com/xzeldon/htop.git
Remove bundled hwloc-1.2.1. Use either native Linux affinity support or an external libhwloc.
(for details see https://sourceforge.net/mailarchive/forum.php?thread_name=CAJpkDYeZpwqcWxZ77wq6bMrnhn-KzkU1xAqb3cU0drfnA3n9FQ%40mail.gmail.com&forum_name=htop-general )
This commit is contained in:
parent
7ca1081712
commit
bc87a8ff8c
12
Makefile.am
12
Makefile.am
|
@ -1,9 +1,5 @@
|
||||||
|
|
||||||
if HAVE_BUNDLED_HWLOC
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
SUBDIRS = hwloc-1.2.1
|
|
||||||
endif
|
|
||||||
|
|
||||||
ACLOCAL_AMFLAGS = -I m4 -I hwloc-1.2.1/config
|
|
||||||
|
|
||||||
bin_PROGRAMS = htop
|
bin_PROGRAMS = htop
|
||||||
dist_man_MANS = htop.1
|
dist_man_MANS = htop.1
|
||||||
|
@ -41,12 +37,6 @@ SUFFIXES = .h
|
||||||
BUILT_SOURCES = $(myhtopheaders)
|
BUILT_SOURCES = $(myhtopheaders)
|
||||||
htop_SOURCES = $(myhtopheaders) $(myhtopsources) config.h debug.h
|
htop_SOURCES = $(myhtopheaders) $(myhtopsources) config.h debug.h
|
||||||
|
|
||||||
if HAVE_BUNDLED_HWLOC
|
|
||||||
htop_LDADD = $(HWLOC_EMBEDDED_LDADD) $(HWLOC_EMBEDDED_LIBS)
|
|
||||||
AM_CFLAGS += $(HWLOC_EMBEDDED_CFLAGS)
|
|
||||||
AM_CPPFLAGS += $(HWLOC_EMBEDDED_CPPFLAGS)
|
|
||||||
endif
|
|
||||||
|
|
||||||
profile:
|
profile:
|
||||||
$(MAKE) all CFLAGS="-pg -O2"
|
$(MAKE) all CFLAGS="-pg -O2"
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ in the source distribution for its full text.
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
#include <hwloc/linux.h>
|
#include <hwloc/linux.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -566,7 +566,7 @@ bool Process_setPriority(Process* this, int priority) {
|
||||||
return (err == 0);
|
return (err == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
|
|
||||||
Affinity* Process_getAffinity(Process* this) {
|
Affinity* Process_getAffinity(Process* this) {
|
||||||
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
||||||
|
|
|
@ -32,7 +32,7 @@ in the source distribution for its full text.
|
||||||
#include <sched.h>
|
#include <sched.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
#include <hwloc/linux.h>
|
#include <hwloc/linux.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -196,7 +196,7 @@ void Process_toggleTag(Process* this);
|
||||||
|
|
||||||
bool Process_setPriority(Process* this, int priority);
|
bool Process_setPriority(Process* this, int priority);
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
|
|
||||||
Affinity* Process_getAffinity(Process* this);
|
Affinity* Process_getAffinity(Process* this);
|
||||||
|
|
||||||
|
|
|
@ -115,7 +115,7 @@ typedef struct ProcessList_ {
|
||||||
int kernelThreads;
|
int kernelThreads;
|
||||||
int runningTasks;
|
int runningTasks;
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
hwloc_topology_t topology;
|
hwloc_topology_t topology;
|
||||||
bool topologyOk;
|
bool topologyOk;
|
||||||
#endif
|
#endif
|
||||||
|
@ -195,7 +195,7 @@ ProcessList* ProcessList_new(UsersTable* usersTable) {
|
||||||
fclose(file);
|
fclose(file);
|
||||||
this->cpuCount = cpus - 1;
|
this->cpuCount = cpus - 1;
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
this->topologyOk = false;
|
this->topologyOk = false;
|
||||||
int topoErr = hwloc_topology_init(&this->topology);
|
int topoErr = hwloc_topology_init(&this->topology);
|
||||||
if (topoErr == 0) {
|
if (topoErr == 0) {
|
||||||
|
|
|
@ -117,7 +117,7 @@ typedef struct ProcessList_ {
|
||||||
int kernelThreads;
|
int kernelThreads;
|
||||||
int runningTasks;
|
int runningTasks;
|
||||||
|
|
||||||
#ifdef HAVE_HWLOC
|
#ifdef HAVE_LIBHWLOC
|
||||||
hwloc_topology_t topology;
|
hwloc_topology_t topology;
|
||||||
bool topologyOk;
|
bool topologyOk;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
m4_include(hwloc-1.2.1/config/hwloc.m4)
|
|
||||||
m4_include(hwloc-1.2.1/config/hwloc_pkg.m4)
|
|
22
configure.ac
22
configure.ac
|
@ -131,32 +131,12 @@ if test "x$enable_native_affinity" = xyes; then
|
||||||
[AC_MSG_RESULT([no])])
|
[AC_MSG_RESULT([no])])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
##### hwloc
|
AC_ARG_ENABLE(hwloc, [AC_HELP_STRING([--enable-hwloc], [enable hwloc support for CPU affinity])],, enable_hwloc="no")
|
||||||
AC_ARG_ENABLE(system-hwloc, [AC_HELP_STRING([--enable-system-hwloc], [use the copy of hwloc from your system and not the one bundled with the htop sources. (hwloc required)])], ,enable_system_hwloc="no")
|
|
||||||
enable_xml=no
|
|
||||||
AC_ARG_ENABLE(hwloc, [AC_HELP_STRING([--enable-hwloc], [enable hwloc support for CPU affinity])],, test "x$enable_native_affinity" = xno && enable_hwloc="yes")
|
|
||||||
if test "x$enable_hwloc" = xyes
|
if test "x$enable_hwloc" = xyes
|
||||||
then
|
then
|
||||||
if test "x$enable_system_hwloc" = xyes
|
|
||||||
then
|
|
||||||
AC_CHECK_LIB([hwloc], [hwloc_linux_get_tid_cpubind], [], [missing_libraries="$missing_libraries libhwloc"])
|
AC_CHECK_LIB([hwloc], [hwloc_linux_get_tid_cpubind], [], [missing_libraries="$missing_libraries libhwloc"])
|
||||||
AC_CHECK_HEADERS([hwloc.h],[:], [missing_headers="$missing_headers $ac_header"])
|
AC_CHECK_HEADERS([hwloc.h],[:], [missing_headers="$missing_headers $ac_header"])
|
||||||
|
|
||||||
else
|
|
||||||
HWLOC_SETUP_CORE([hwloc-1.2.1], [hwloc_bundled=yes], [hwloc_bundled=no])
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
HWLOC_DO_AM_CONDITIONALS
|
|
||||||
AM_CONDITIONAL([HAVE_HWLOC], [test "x$hwloc_bundled" = "xyes" -o "x$hwloc_system" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HAVE_BUNDLED_HWLOC], [test "x$hwloc_bundled" = "xyes"])
|
|
||||||
if test "x$hwloc_system" = "xyes"; then
|
|
||||||
AC_DEFINE([HAVE_SYSTEM_HWLOC], 1, [Have system hwloc])
|
|
||||||
AC_DEFINE([HAVE_HWLOC], 1, [Have hwloc])
|
|
||||||
elif test "x$hwloc_bundled" = "xyes"; then
|
|
||||||
AC_DEFINE([HAVE_BUNDLED_HWLOC], 1, [Use bundled hwloc])
|
|
||||||
AC_DEFINE([HAVE_HWLOC], 1, [Have hwloc])
|
|
||||||
fi
|
|
||||||
#####
|
|
||||||
|
|
||||||
AC_CONFIG_FILES([Makefile htop.1])
|
AC_CONFIG_FILES([Makefile htop.1])
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
|
|
6
htop.c
6
htop.c
|
@ -123,7 +123,7 @@ static void showHelp(ProcessList* pl) {
|
||||||
mvaddstr(15, 0, " F9 k: kill process/tagged processes P: sort by CPU%");
|
mvaddstr(15, 0, " F9 k: kill process/tagged processes P: sort by CPU%");
|
||||||
mvaddstr(16, 0, " ] F7: higher priority (root only) M: sort by MEM%");
|
mvaddstr(16, 0, " ] F7: higher priority (root only) M: sort by MEM%");
|
||||||
mvaddstr(17, 0, " [ F8: lower priority (+ nice) T: sort by TIME");
|
mvaddstr(17, 0, " [ F8: lower priority (+ nice) T: sort by TIME");
|
||||||
#ifdef HAVE_HWLOC
|
#if (HAVE_LIBHWLOC || HAVE_NATIVE_AFFINITY)
|
||||||
if (pl->cpuCount > 1)
|
if (pl->cpuCount > 1)
|
||||||
mvaddstr(18, 0, " a: set CPU affinity I: invert sort order");
|
mvaddstr(18, 0, " a: set CPU affinity I: invert sort order");
|
||||||
else
|
else
|
||||||
|
@ -144,7 +144,7 @@ static void showHelp(ProcessList* pl) {
|
||||||
mvaddstr(16, 0, " ] F7"); mvaddstr(16,40, " M");
|
mvaddstr(16, 0, " ] F7"); mvaddstr(16,40, " M");
|
||||||
mvaddstr(17, 0, " [ F8"); mvaddstr(17,40, " T");
|
mvaddstr(17, 0, " [ F8"); mvaddstr(17,40, " T");
|
||||||
mvaddstr(18,40, " F4 I");
|
mvaddstr(18,40, " F4 I");
|
||||||
#if HAVE_HWLOC
|
#if (HAVE_LIBHWLOC || HAVE_NATIVE_AFFINITY)
|
||||||
if (pl->cpuCount > 1)
|
if (pl->cpuCount > 1)
|
||||||
mvaddstr(18, 0, " a:");
|
mvaddstr(18, 0, " a:");
|
||||||
#endif
|
#endif
|
||||||
|
@ -773,7 +773,7 @@ int main(int argc, char** argv) {
|
||||||
refreshTimeout = 0;
|
refreshTimeout = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#if (HAVE_HWLOC || HAVE_NATIVE_AFFINITY)
|
#if (HAVE_LIBHWLOC || HAVE_NATIVE_AFFINITY)
|
||||||
case 'a':
|
case 'a':
|
||||||
{
|
{
|
||||||
if (pl->cpuCount == 1)
|
if (pl->cpuCount == 1)
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
Cédric Augonnet <Cedric.Augonnet@labri.fr>
|
|
||||||
Jérôme Clet-Ortega <Jerome.Clet-Ortega@labri.fr>
|
|
||||||
Ludovic Courtès <Ludovic.Courtes@inria.fr>
|
|
||||||
Brice Goglin <Brice.Goglin@inria.fr>
|
|
||||||
Nathalie Furmento <Nathalie.Furmento@labri.fr>
|
|
||||||
Samuel Thibault <Samuel.Thibault@labri.fr>
|
|
||||||
Jeff Squyres <jsquyres@cisco.com>
|
|
||||||
Alexey Kardashevskiy <aik@au1.ibm.com>
|
|
|
@ -1,27 +0,0 @@
|
||||||
Copyright © 2009 CNRS
|
|
||||||
Copyright © 2009 INRIA. All rights reserved.
|
|
||||||
Copyright © 2009 Université Bordeaux 1
|
|
||||||
Copyright © 2009 Cisco Systems, Inc. All rights reserved.
|
|
||||||
See COPYING in top-level directory.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions
|
|
||||||
are met:
|
|
||||||
1. Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer in the
|
|
||||||
documentation and/or other materials provided with the distribution.
|
|
||||||
3. The name of the author may not be used to endorse or promote products
|
|
||||||
derived from this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
||||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
||||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
||||||
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
||||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
||||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
||||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
@ -1,27 +0,0 @@
|
||||||
# Copyright © 2009 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
|
|
||||||
# Note that the -I directory must *exactly* match what was specified
|
|
||||||
# via AC_CONFIG_MACRO_DIR in configure.ac.
|
|
||||||
ACLOCAL_AMFLAGS = -I ./config
|
|
||||||
|
|
||||||
SUBDIRS = src include
|
|
||||||
|
|
||||||
# Do not let automake automatically add the non-standalone dirs to the
|
|
||||||
# distribution tarball if we're building in embedded mode.
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
|
|
||||||
#
|
|
||||||
# "make distcheck" requires that tarballs are able to be able to "make
|
|
||||||
# dist", so we have to include config/distscript.csh.
|
|
||||||
#
|
|
||||||
EXTRA_DIST = \
|
|
||||||
README VERSION COPYING AUTHORS \
|
|
||||||
config/hwloc_get_version.sh \
|
|
||||||
config/distscript.csh
|
|
||||||
|
|
||||||
#
|
|
||||||
# Build the top-level README file
|
|
||||||
#
|
|
|
@ -1,611 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
# Copyright © 2009 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
build_triplet = @build@
|
|
||||||
host_triplet = @host@
|
|
||||||
target_triplet = @target@
|
|
||||||
subdir = hwloc-1.2.1
|
|
||||||
DIST_COMMON = README $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
|
|
||||||
AUTHORS COPYING NEWS
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_check_attributes.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_check_visibility.m4 \
|
|
||||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_pkg.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h \
|
|
||||||
$(top_builddir)/hwloc-1.2.1/include/private/autogen/config.h \
|
|
||||||
$(top_builddir)/hwloc-1.2.1/include/hwloc/autogen/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
|
|
||||||
html-recursive info-recursive install-data-recursive \
|
|
||||||
install-dvi-recursive install-exec-recursive \
|
|
||||||
install-html-recursive install-info-recursive \
|
|
||||||
install-pdf-recursive install-ps-recursive install-recursive \
|
|
||||||
installcheck-recursive installdirs-recursive pdf-recursive \
|
|
||||||
ps-recursive uninstall-recursive
|
|
||||||
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
|
|
||||||
distclean-recursive maintainer-clean-recursive
|
|
||||||
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
|
|
||||||
distdir
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
am__relativize = \
|
|
||||||
dir0=`pwd`; \
|
|
||||||
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
|
|
||||||
sed_rest='s,^[^/]*/*,,'; \
|
|
||||||
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
|
|
||||||
sed_butlast='s,/*[^/]*$$,,'; \
|
|
||||||
while test -n "$$dir1"; do \
|
|
||||||
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first" != "."; then \
|
|
||||||
if test "$$first" = ".."; then \
|
|
||||||
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
|
|
||||||
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
|
|
||||||
else \
|
|
||||||
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
|
|
||||||
if test "$$first2" = "$$first"; then \
|
|
||||||
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
|
|
||||||
else \
|
|
||||||
dir2="../$$dir2"; \
|
|
||||||
fi; \
|
|
||||||
dir0="$$dir0"/"$$first"; \
|
|
||||||
fi; \
|
|
||||||
fi; \
|
|
||||||
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
|
|
||||||
done; \
|
|
||||||
reldir="$$dir2"
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AR = @AR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
BASH = @BASH@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
DSYMUTIL = @DSYMUTIL@
|
|
||||||
DUMPBIN = @DUMPBIN@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GREP = @GREP@
|
|
||||||
HWLOC_CFLAGS = @HWLOC_CFLAGS@
|
|
||||||
HWLOC_CPPFLAGS = @HWLOC_CPPFLAGS@
|
|
||||||
HWLOC_EMBEDDED_CFLAGS = @HWLOC_EMBEDDED_CFLAGS@
|
|
||||||
HWLOC_EMBEDDED_CPPFLAGS = @HWLOC_EMBEDDED_CPPFLAGS@
|
|
||||||
HWLOC_EMBEDDED_LDADD = @HWLOC_EMBEDDED_LDADD@
|
|
||||||
HWLOC_EMBEDDED_LIBS = @HWLOC_EMBEDDED_LIBS@
|
|
||||||
HWLOC_HAVE_XML = @HWLOC_HAVE_XML@
|
|
||||||
HWLOC_KERRIGHED_CFLAGS = @HWLOC_KERRIGHED_CFLAGS@
|
|
||||||
HWLOC_KERRIGHED_LIBS = @HWLOC_KERRIGHED_LIBS@
|
|
||||||
HWLOC_LDFLAGS = @HWLOC_LDFLAGS@
|
|
||||||
HWLOC_LIBS = @HWLOC_LIBS@
|
|
||||||
HWLOC_LINUX_LIBNUMA_LIBS = @HWLOC_LINUX_LIBNUMA_LIBS@
|
|
||||||
HWLOC_MS_LIB = @HWLOC_MS_LIB@
|
|
||||||
HWLOC_PKG_CONFIG = @HWLOC_PKG_CONFIG@
|
|
||||||
HWLOC_REQUIRES = @HWLOC_REQUIRES@
|
|
||||||
HWLOC_XML_CFLAGS = @HWLOC_XML_CFLAGS@
|
|
||||||
HWLOC_XML_LIBS = @HWLOC_XML_LIBS@
|
|
||||||
HWLOC_top_builddir = @HWLOC_top_builddir@
|
|
||||||
HWLOC_top_srcdir = @HWLOC_top_srcdir@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build = @build@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
build_cpu = @build_cpu@
|
|
||||||
build_os = @build_os@
|
|
||||||
build_vendor = @build_vendor@
|
|
||||||
builddir = @builddir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host = @host@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
host_cpu = @host_cpu@
|
|
||||||
host_os = @host_os@
|
|
||||||
host_vendor = @host_vendor@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target = @target@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
target_cpu = @target_cpu@
|
|
||||||
target_os = @target_os@
|
|
||||||
target_vendor = @target_vendor@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
|
|
||||||
# Note that the -I directory must *exactly* match what was specified
|
|
||||||
# via AC_CONFIG_MACRO_DIR in configure.ac.
|
|
||||||
ACLOCAL_AMFLAGS = -I ./config
|
|
||||||
SUBDIRS = src include
|
|
||||||
|
|
||||||
# Do not let automake automatically add the non-standalone dirs to the
|
|
||||||
# distribution tarball if we're building in embedded mode.
|
|
||||||
DIST_SUBDIRS = $(SUBDIRS)
|
|
||||||
|
|
||||||
#
|
|
||||||
# "make distcheck" requires that tarballs are able to be able to "make
|
|
||||||
# dist", so we have to include config/distscript.csh.
|
|
||||||
#
|
|
||||||
EXTRA_DIST = \
|
|
||||||
README VERSION COPYING AUTHORS \
|
|
||||||
config/hwloc_get_version.sh \
|
|
||||||
config/distscript.csh
|
|
||||||
|
|
||||||
all: all-recursive
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu hwloc-1.2.1/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu hwloc-1.2.1/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
|
|
||||||
mostlyclean-libtool:
|
|
||||||
-rm -f *.lo
|
|
||||||
|
|
||||||
clean-libtool:
|
|
||||||
-rm -rf .libs _libs
|
|
||||||
|
|
||||||
# This directory's subdirectories are mostly independent; you can cd
|
|
||||||
# into them and run `make' without going through this Makefile.
|
|
||||||
# To change the values of `make' variables: instead of editing Makefiles,
|
|
||||||
# (1) if the variable is set in `config.status', edit `config.status'
|
|
||||||
# (which will cause the Makefiles to be regenerated when you run `make');
|
|
||||||
# (2) otherwise, pass the desired values on the `make' command line.
|
|
||||||
$(RECURSIVE_TARGETS):
|
|
||||||
@fail= failcom='exit 1'; \
|
|
||||||
for f in x $$MAKEFLAGS; do \
|
|
||||||
case $$f in \
|
|
||||||
*=* | --[!k]*);; \
|
|
||||||
*k*) failcom='fail=yes';; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
dot_seen=no; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
dot_seen=yes; \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done; \
|
|
||||||
if test "$$dot_seen" = "no"; then \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
|
|
||||||
fi; test -z "$$fail"
|
|
||||||
|
|
||||||
$(RECURSIVE_CLEAN_TARGETS):
|
|
||||||
@fail= failcom='exit 1'; \
|
|
||||||
for f in x $$MAKEFLAGS; do \
|
|
||||||
case $$f in \
|
|
||||||
*=* | --[!k]*);; \
|
|
||||||
*k*) failcom='fail=yes';; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
dot_seen=no; \
|
|
||||||
case "$@" in \
|
|
||||||
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
|
|
||||||
*) list='$(SUBDIRS)' ;; \
|
|
||||||
esac; \
|
|
||||||
rev=''; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = "."; then :; else \
|
|
||||||
rev="$$subdir $$rev"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
rev="$$rev ."; \
|
|
||||||
target=`echo $@ | sed s/-recursive//`; \
|
|
||||||
for subdir in $$rev; do \
|
|
||||||
echo "Making $$target in $$subdir"; \
|
|
||||||
if test "$$subdir" = "."; then \
|
|
||||||
local_target="$$target-am"; \
|
|
||||||
else \
|
|
||||||
local_target="$$target"; \
|
|
||||||
fi; \
|
|
||||||
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|
|
||||||
|| eval $$failcom; \
|
|
||||||
done && test -z "$$fail"
|
|
||||||
tags-recursive:
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
|
|
||||||
done
|
|
||||||
ctags-recursive:
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
|
|
||||||
done
|
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
mkid -fID $$unique
|
|
||||||
tags: TAGS
|
|
||||||
|
|
||||||
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
|
|
||||||
include_option=--etags-include; \
|
|
||||||
empty_fix=.; \
|
|
||||||
else \
|
|
||||||
include_option=--include; \
|
|
||||||
empty_fix=; \
|
|
||||||
fi; \
|
|
||||||
list='$(SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test ! -f $$subdir/TAGS || \
|
|
||||||
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
|
|
||||||
fi; \
|
|
||||||
done; \
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
test -d "$(distdir)/$$subdir" \
|
|
||||||
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
|
|
||||||
if test "$$subdir" = .; then :; else \
|
|
||||||
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_distdir=$$reldir; \
|
|
||||||
dir1=$$subdir; dir2="$(top_distdir)"; \
|
|
||||||
$(am__relativize); \
|
|
||||||
new_top_distdir=$$reldir; \
|
|
||||||
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
|
|
||||||
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
|
|
||||||
($(am__cd) $$subdir && \
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) \
|
|
||||||
top_distdir="$$new_top_distdir" \
|
|
||||||
distdir="$$new_distdir" \
|
|
||||||
am__remove_distdir=: \
|
|
||||||
am__skip_length_check=: \
|
|
||||||
am__skip_mode_fix=: \
|
|
||||||
distdir) \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-recursive
|
|
||||||
all-am: Makefile
|
|
||||||
installdirs: installdirs-recursive
|
|
||||||
installdirs-am:
|
|
||||||
install: install-recursive
|
|
||||||
install-exec: install-exec-recursive
|
|
||||||
install-data: install-data-recursive
|
|
||||||
uninstall: uninstall-recursive
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-recursive
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-recursive
|
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-recursive
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-recursive
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-recursive
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-recursive
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am:
|
|
||||||
|
|
||||||
install-dvi: install-dvi-recursive
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-recursive
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-recursive
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-recursive
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-recursive
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-recursive
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-recursive
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
|
||||||
|
|
||||||
pdf: pdf-recursive
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-recursive
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am:
|
|
||||||
|
|
||||||
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
|
|
||||||
install-am install-strip tags-recursive
|
|
||||||
|
|
||||||
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
|
|
||||||
all all-am check check-am clean clean-generic clean-libtool \
|
|
||||||
ctags ctags-recursive distclean distclean-generic \
|
|
||||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
|
||||||
html-am info info-am install install-am install-data \
|
|
||||||
install-data-am install-dvi install-dvi-am install-exec \
|
|
||||||
install-exec-am install-html install-html-am install-info \
|
|
||||||
install-info-am install-man install-pdf install-pdf-am \
|
|
||||||
install-ps install-ps-am install-strip installcheck \
|
|
||||||
installcheck-am installdirs installdirs-am maintainer-clean \
|
|
||||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
|
||||||
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
|
|
||||||
uninstall uninstall-am
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Build the top-level README file
|
|
||||||
#
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
361
hwloc-1.2.1/NEWS
361
hwloc-1.2.1/NEWS
|
@ -1,361 +0,0 @@
|
||||||
Copyright © 2009 CNRS
|
|
||||||
Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
|
|
||||||
$COPYRIGHT$
|
|
||||||
|
|
||||||
Additional copyrights may follow
|
|
||||||
|
|
||||||
$HEADER$
|
|
||||||
|
|
||||||
===========================================================================
|
|
||||||
|
|
||||||
This file contains the main features as well as overviews of specific
|
|
||||||
bug fixes (and other actions) for each version of hwloc since version
|
|
||||||
0.9 (as initially released as "libtopology", then re-branded to "hwloc"
|
|
||||||
in v0.9.1).
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.2.1
|
|
||||||
-------------
|
|
||||||
* Improve support of AMD Bulldozer "Compute-Unit" modules by detecting
|
|
||||||
logical processors with different core IDs on Linux.
|
|
||||||
* Fix hwloc-ps crash when listing processes from another Linux cpuset.
|
|
||||||
Thanks to Carl Smith for reporting the problem.
|
|
||||||
* Fix build on AIX and Solaris. Thanks to Carl Smith and Andreas Kupries
|
|
||||||
for reporting the problems.
|
|
||||||
* Fix cache size detection on Darwin. Thanks to Erkcan Özcan for reporting
|
|
||||||
the problem.
|
|
||||||
* Make configure fail if --enable-xml or --enable-cairo is given and
|
|
||||||
proper support cannot be found. Thanks to Andreas Kupries for reporting
|
|
||||||
the XML problem.
|
|
||||||
* Fix spurious L1 cache detection on AIX. Thanks to Hendryk Bockelmann
|
|
||||||
for reporting the problem.
|
|
||||||
* Fix hwloc_get_last_cpu_location(THREAD) on Linux. Thanks to Gabriele
|
|
||||||
Fatigati for reporting the problem.
|
|
||||||
* Fix object distance detection on Solaris.
|
|
||||||
* Add pthread_self weak symbol to ease static linking.
|
|
||||||
* Minor documentation fixes.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.2.0
|
|
||||||
-------------
|
|
||||||
* Major features
|
|
||||||
+ Expose latency matrices in the API as an array of distance structures
|
|
||||||
within objects. Add several helpers to find distances.
|
|
||||||
+ Add hwloc_topology_set_distance_matrix() and environment variables
|
|
||||||
to provide a matrix of distances between a given set of objects.
|
|
||||||
+ Add hwloc_get_last_cpu_location() and hwloc_get_proc_last_cpu_location()
|
|
||||||
to retrieve the processors where a process or thread recently ran.
|
|
||||||
- Add the corresponding --get-last-cpu-location option to hwloc-bind.
|
|
||||||
+ Add hwloc_topology_restrict() to restrict an existing topology to a
|
|
||||||
given cpuset.
|
|
||||||
- Add the corresponding --restrict option to lstopo.
|
|
||||||
* Minor API updates
|
|
||||||
+ Add hwloc_bitmap_list_sscanf/snprintf/asprintf to convert between bitmaps
|
|
||||||
and strings such as 4-5,7-9,12,15-
|
|
||||||
+ hwloc_bitmap_set/clr_range() now support infinite ranges.
|
|
||||||
+ Clarify the difference between inserting Misc objects by cpuset or by
|
|
||||||
parent.
|
|
||||||
+ hwloc_insert_misc_object_by_cpuset() now returns NULL in case of error.
|
|
||||||
* Discovery improvements
|
|
||||||
+ x86 backend (for freebsd): add x2APIC support
|
|
||||||
+ Support standard device-tree phandle, to get better support on e.g. ARM
|
|
||||||
systems providing it.
|
|
||||||
+ Detect cache size on AIX. Thanks Christopher and IBM.
|
|
||||||
+ Improve grouping to support asymmetric topologies.
|
|
||||||
* Tools
|
|
||||||
+ Command-line tools now support "all" and "root" special locations
|
|
||||||
consisting in the entire topology, as well as type names with depth
|
|
||||||
attributes such as L2 or Group4.
|
|
||||||
+ hwloc-calc improvements:
|
|
||||||
- Add --number-of/-N option to report the number of objects of a given
|
|
||||||
type or depth.
|
|
||||||
- -I is now equivalent to --intersect for listing the indexes of
|
|
||||||
objects of a given type or depth that intersects the input.
|
|
||||||
- Add -H to report the output as a hierarchical combination of types
|
|
||||||
and depths.
|
|
||||||
+ Add --thissystem to lstopo.
|
|
||||||
+ Add lstopo-win, a console-less lstopo variant on Windows.
|
|
||||||
* Miscellaneous
|
|
||||||
+ Remove C99 usage from code base.
|
|
||||||
+ Rename hwloc-gather-topology.sh into hwloc-gather-topology
|
|
||||||
+ Fix AMD cache discovery on freebsd when there is no L3 cache, thanks
|
|
||||||
Andriy Gapon for the fix.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.1.2
|
|
||||||
-------------
|
|
||||||
* Fix a segfault in the distance-based grouping code when some objects
|
|
||||||
are not placed in any group. Thanks to Bernd Kallies for reporting
|
|
||||||
the problem and providing a patch.
|
|
||||||
* Fix the command-line parsing of hwloc-bind --mempolicy interleave.
|
|
||||||
Thanks to Guy Streeter for reporting the problem.
|
|
||||||
* Stop truncating the output in hwloc_obj_attr_snprintf() and in the
|
|
||||||
corresponding lstopo output. Thanks to Guy Streeter for reporting the
|
|
||||||
problem.
|
|
||||||
* Fix object levels ordering in synthetic topologies.
|
|
||||||
* Fix potential incoherency between device tree and kernel information,
|
|
||||||
when SMT is disabled on Power machines.
|
|
||||||
* Fix and document the behavior of hwloc_topology_set_synthetic() in case
|
|
||||||
of invalid argument. Thanks to Guy Streeter for reporting the problem.
|
|
||||||
* Add some verbose error message reporting when it looks like the OS
|
|
||||||
gives erroneous information.
|
|
||||||
* Do not include unistd.h and stdint.h in public headers on Windows.
|
|
||||||
* Move config.h files into their own subdirectories to avoid name
|
|
||||||
conflicts when AC_CONFIG_HEADERS adds -I's for them.
|
|
||||||
* Remove the use of declaring variables inside "for" loops.
|
|
||||||
* Some other minor fixes.
|
|
||||||
* Many minor documentation fixes.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.1.1
|
|
||||||
-------------
|
|
||||||
* Add hwloc_get_api_version() which returns the version of hwloc used
|
|
||||||
at runtime. Thanks to Guy Streeter for the suggestion.
|
|
||||||
* Fix the number of hugepages reported for NUMA nodes on Linux.
|
|
||||||
* Fix hwloc_bitmap_to_ulong() right after allocating the bitmap.
|
|
||||||
Thanks to Bernd Kallies for reporting the problem.
|
|
||||||
* Fix hwloc_bitmap_from_ith_ulong() to properly zero the first ulong.
|
|
||||||
Thanks to Guy Streeter for reporting the problem.
|
|
||||||
* Fix hwloc_get_membind_nodeset() on Linux.
|
|
||||||
Thanks to Bernd Kallies for reporting the problem and providing a patch.
|
|
||||||
* Fix some file descriptor leaks in the Linux discovery.
|
|
||||||
* Fix the minimum width of NUMA nodes, caches and the legend in the graphical
|
|
||||||
lstopo output. Thanks to Jirka Hladky for reporting the problem.
|
|
||||||
* Various fixes to bitmap conversion from/to taskset-strings.
|
|
||||||
* Fix and document snprintf functions behavior when the buffer size is too
|
|
||||||
small or zero. Thanks to Guy Streeter for reporting the problem.
|
|
||||||
* Fix configure to avoid spurious enabling of the cpuid backend.
|
|
||||||
Thanks to Tim Anderson for reporting the problem.
|
|
||||||
* Cleanup error management in hwloc-gather-topology.sh.
|
|
||||||
Thanks to Jirka Hladky for reporting the problem and providing a patch.
|
|
||||||
* Add a manpage and usage for hwloc-gather-topology.sh on Linux.
|
|
||||||
Thanks to Jirka Hladky for providing a patch.
|
|
||||||
* Memory binding documentation enhancements.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.1.0
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* API
|
|
||||||
+ Increase HWLOC_API_VERSION to 0x00010100 so that API changes may be
|
|
||||||
detected at build-time.
|
|
||||||
+ Add a memory binding interface.
|
|
||||||
+ The cpuset API (hwloc/cpuset.h) is now deprecated. It is replaced by
|
|
||||||
the bitmap API (hwloc/bitmap.h) which offers the same features with more
|
|
||||||
generic names since it applies to CPU sets, node sets and more.
|
|
||||||
Backward compatibility with the cpuset API and ABI is still provided but
|
|
||||||
it will be removed in a future release.
|
|
||||||
Old types (hwloc_cpuset_t, ...) are still available as a way to clarify
|
|
||||||
what kind of hwloc_bitmap_t each API function manipulates.
|
|
||||||
Upgrading to the new API only requires to replace hwloc_cpuset_ function
|
|
||||||
calls with the corresponding hwloc_bitmap_ calls, with the following
|
|
||||||
renaming exceptions:
|
|
||||||
- hwloc_cpuset_cpu -> hwloc_bitmap_only
|
|
||||||
- hwloc_cpuset_all_but_cpu -> hwloc_bitmap_allbut
|
|
||||||
- hwloc_cpuset_from_string -> hwloc_bitmap_sscanf
|
|
||||||
+ Add an `infos' array in each object to store couples of info names and
|
|
||||||
values. It enables generic storage of things like the old dmi board infos
|
|
||||||
that were previously stored in machine specific attributes.
|
|
||||||
+ Add linesize cache attribute.
|
|
||||||
* Features
|
|
||||||
+ Bitmaps (and thus CPU sets and node sets) are dynamically (re-)allocated,
|
|
||||||
the maximal number of CPUs (HWLOC_NBMAXCPUS) has been removed.
|
|
||||||
+ Improve the distance-based grouping code to better support irregular
|
|
||||||
distance matrices.
|
|
||||||
+ Add support for device-tree to get cache information (useful on Power
|
|
||||||
architectures).
|
|
||||||
* Helpers
|
|
||||||
+ Add NVIDIA CUDA helpers in cuda.h and cudart.h to ease interoperability
|
|
||||||
with CUDA Runtime and Driver APIs.
|
|
||||||
+ Add Myrinet Express helper in myriexpress.h to ease interoperability.
|
|
||||||
* Tools
|
|
||||||
+ lstopo now displays physical/OS indexes by default in graphical mode
|
|
||||||
(use -l to switch back to logical indexes). The textual output still uses
|
|
||||||
logical by default (use -p to switch to physical indexes).
|
|
||||||
+ lstopo prefixes logical indexes with `L#' and physical indexes with `P#'.
|
|
||||||
Physical indexes are also printed as `P#N' instead of `phys=N' within
|
|
||||||
object attributes (in parentheses).
|
|
||||||
+ Add a legend at the bottom of the lstopo graphical output, use --no-legend
|
|
||||||
to remove it.
|
|
||||||
+ Add hwloc-ps to list process' bindings.
|
|
||||||
+ Add --membind and --mempolicy options to hwloc-bind.
|
|
||||||
+ Improve tools command-line options by adding a generic --input option
|
|
||||||
(and more) which replaces the old --xml, --synthetic and --fsys-root.
|
|
||||||
+ Cleanup lstopo output configuration by adding --output-format.
|
|
||||||
+ Add --intersect in hwloc-calc, and replace --objects with --largest.
|
|
||||||
+ Add the ability to work on standard input in hwloc-calc.
|
|
||||||
+ Add --from, --to and --at in hwloc-distrib.
|
|
||||||
+ Add taskset-specific functions and command-line tools options to
|
|
||||||
manipulate CPU set strings in the format of the taskset program.
|
|
||||||
+ Install hwloc-gather-topology.sh on Linux.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.0.3
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* Fix support for Linux cpuset when emulated by a cgroup mount point.
|
|
||||||
* Remove unneeded runtime dependency on libibverbs.so in the library and
|
|
||||||
all utils programs.
|
|
||||||
* Fix hwloc_cpuset_to_linux_libnuma_ulongs in case of non-linear OS-indexes
|
|
||||||
for NUMA nodes.
|
|
||||||
* lstopo now displays physical/OS indexes by default in graphical mode
|
|
||||||
(use -l to switch back to logical indexes). The textual output still uses
|
|
||||||
logical by default (use -p to switch to physical indexes).
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.0.2
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* Public headers can now be included directly from C++ programs.
|
|
||||||
* Solaris fix for non-contiguous cpu numbers. Thanks to Rolf vandeVaart for
|
|
||||||
reporting the issue.
|
|
||||||
* Darwin 10.4 fix. Thanks to Olivier Cessenat for reporting the issue.
|
|
||||||
* Revert 1.0.1 patch that ignored sockets with unknown ID values since it
|
|
||||||
only slightly helped POWER7 machines with old Linux kernels while it
|
|
||||||
prevents recent kernels from getting the complete POWER7 topology.
|
|
||||||
* Fix hwloc_get_common_ancestor_obj().
|
|
||||||
* Remove arch-specific bits in public headers.
|
|
||||||
* Some fixes in the lstopo graphical output.
|
|
||||||
* Various man page clarifications and minor updates.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.0.1
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* Various Solaris fixes. Thanks to Yannick Martin for reporting the issue.
|
|
||||||
* Fix "non-native" builds on x86 platforms (e.g., when building 32
|
|
||||||
bit executables with compilers that natively build 64 bit).
|
|
||||||
* Ignore sockets with unknown ID values (which fixes issues on POWER7
|
|
||||||
machines). Thanks to Greg Bauer for reporting the issue.
|
|
||||||
* Various man page clarifications and minor updates.
|
|
||||||
* Fixed memory leaks in hwloc_setup_group_from_min_distance_clique().
|
|
||||||
* Fix cache type filtering on MS Windows 7. Thanks to Αλέξανδρος
|
|
||||||
Παπαδογιαννάκ for reporting the issue.
|
|
||||||
* Fixed warnings when compiling with -DNDEBUG.
|
|
||||||
|
|
||||||
|
|
||||||
Version 1.0.0
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* The ABI of the library has changed.
|
|
||||||
* Backend updates
|
|
||||||
+ Add FreeBSD support.
|
|
||||||
+ Add x86 cpuid based backend.
|
|
||||||
+ Add Linux cgroup support to the Linux cpuset code.
|
|
||||||
+ Support binding of entire multithreaded process on Linux.
|
|
||||||
+ Fix and enable Group support in Windows.
|
|
||||||
+ Cleanup XML export/import.
|
|
||||||
* Objects
|
|
||||||
+ HWLOC_OBJ_PROC is renamed into HWLOC_OBJ_PU for "Processing Unit",
|
|
||||||
its stringified type name is now "PU".
|
|
||||||
+ Use new HWLOC_OBJ_GROUP objects instead of MISC when grouping
|
|
||||||
objects according to NUMA distances or arbitrary OS aggregation.
|
|
||||||
+ Rework memory attributes.
|
|
||||||
+ Add different cpusets in each object to specify processors that
|
|
||||||
are offline, unavailable, ...
|
|
||||||
+ Cleanup the storage of object names and DMI infos.
|
|
||||||
* Features
|
|
||||||
+ Add support for looking up specific PID topology information.
|
|
||||||
+ Add hwloc_topology_export_xml() to export the topology in a XML file.
|
|
||||||
+ Add hwloc_topology_get_support() to retrieve the supported features
|
|
||||||
for the current topology context.
|
|
||||||
+ Support non-SYSTEM object as the root of the tree, use MACHINE in
|
|
||||||
most common cases.
|
|
||||||
+ Add hwloc_get_*cpubind() routines to retrieve the current binding
|
|
||||||
of processes and threads.
|
|
||||||
* API
|
|
||||||
+ Add HWLOC_API_VERSION to help detect the currently used API version.
|
|
||||||
+ Add missing ending "e" to *compare* functions.
|
|
||||||
+ Add several routines to emulate PLPA functions.
|
|
||||||
+ Rename and rework the cpuset and/or/xor/not/clear operators to output
|
|
||||||
their result in a dedicated argument instead of modifying one input.
|
|
||||||
+ Deprecate hwloc_obj_snprintf() in favor of hwloc_obj_type/attr_snprintf().
|
|
||||||
+ Clarify the use of parent and ancestor in the API, do not use father.
|
|
||||||
+ Replace hwloc_get_system_obj() with hwloc_get_root_obj().
|
|
||||||
+ Return -1 instead of HWLOC_OBJ_TYPE_MAX in the API since the latter
|
|
||||||
isn't public.
|
|
||||||
+ Relax constraints in hwloc_obj_type_of_string().
|
|
||||||
+ Improve displaying of memory sizes.
|
|
||||||
+ Add 0x prefix to cpuset strings.
|
|
||||||
* Tools
|
|
||||||
+ lstopo now displays logical indexes by default, use --physical to
|
|
||||||
revert back to OS/physical indexes.
|
|
||||||
+ Add colors in the lstopo graphical outputs to distinguish between online,
|
|
||||||
offline, reserved, ... objects.
|
|
||||||
+ Extend lstopo to show cpusets, filter objects by type, ...
|
|
||||||
+ Renamed hwloc-mask into hwloc-calc which supports many new options.
|
|
||||||
* Documentation
|
|
||||||
+ Add a hwloc(7) manpage containing general information.
|
|
||||||
+ Add documentation about how to switch from PLPA to hwloc.
|
|
||||||
+ Cleanup the distributed documentation files.
|
|
||||||
* Miscellaneous
|
|
||||||
+ Many compilers warning fixes.
|
|
||||||
+ Cleanup the ABI by using the visibility attribute.
|
|
||||||
+ Add project embedding support.
|
|
||||||
|
|
||||||
|
|
||||||
Version 0.9.4 (unreleased)
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
* Fix reseting colors to normal in lstopo -.txt output.
|
|
||||||
* Fix Linux pthread_t binding error report.
|
|
||||||
|
|
||||||
|
|
||||||
Version 0.9.3
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* Fix autogen.sh to work with Autoconf 2.63.
|
|
||||||
* Fix various crashes in particular conditions:
|
|
||||||
- xml files with root attributes
|
|
||||||
- offline CPUs
|
|
||||||
- partial sysfs support
|
|
||||||
- unparseable /proc/cpuinfo
|
|
||||||
- ignoring NUMA level while Misc level have been generated
|
|
||||||
* Tweak documentation a bit
|
|
||||||
* Do not require the pthread library for binding the current thread on Linux
|
|
||||||
* Do not erroneously consider the sched_setaffinity prototype is the old version
|
|
||||||
when there is actually none.
|
|
||||||
* Fix _syscall3 compilation on archs for which we do not have the
|
|
||||||
sched_setaffinity system call number.
|
|
||||||
* Fix AIX binding.
|
|
||||||
* Fix libraries dependencies: now only lstopo depends on libtermcap, fix
|
|
||||||
binutils-gold link
|
|
||||||
* Have make check always build and run hwloc-hello.c
|
|
||||||
* Do not limit size of a cpuset.
|
|
||||||
|
|
||||||
|
|
||||||
Version 0.9.2
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* Trivial documentation changes.
|
|
||||||
|
|
||||||
|
|
||||||
Version 0.9.1
|
|
||||||
-------------
|
|
||||||
|
|
||||||
* Re-branded to "hwloc" and moved to the Open MPI project, relicensed under the
|
|
||||||
BSD license.
|
|
||||||
* The prefix of all functions and tools is now hwloc, and some public
|
|
||||||
functions were also renamed for real.
|
|
||||||
* Group NUMA nodes into Misc objects according to their physical distance
|
|
||||||
that may be reported by the OS/BIOS.
|
|
||||||
May be ignored by setting HWLOC_IGNORE_DISTANCES=1 in the environment.
|
|
||||||
* Ignore offline CPUs on Solaris.
|
|
||||||
* Improved binding support on AIX.
|
|
||||||
* Add HP-UX support.
|
|
||||||
* CPU sets are now allocated/freed dynamically.
|
|
||||||
* Add command line options to tune the lstopo graphical output, add
|
|
||||||
semi-graphical textual output
|
|
||||||
* Extend topobind to support multiple cpusets or objects on the command
|
|
||||||
line as topomask does.
|
|
||||||
* Add an Infiniband-specific helper hwloc/openfabrics-verbs.h to retrieve
|
|
||||||
the physical location of IB devices.
|
|
||||||
|
|
||||||
|
|
||||||
Version 0.9 (libtopology)
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
* First release.
|
|
|
@ -1,688 +0,0 @@
|
||||||
Introduction
|
|
||||||
|
|
||||||
hwloc provides command line tools and a C API to obtain the hierarchical map of
|
|
||||||
key computing elements, such as: NUMA memory nodes, shared caches, processor
|
|
||||||
sockets, processor cores, and processing units (logical processors or
|
|
||||||
"threads"). hwloc also gathers various attributes such as cache and memory
|
|
||||||
information, and is portable across a variety of different operating systems
|
|
||||||
and platforms.
|
|
||||||
|
|
||||||
hwloc primarily aims at helping high-performance computing (HPC) applications,
|
|
||||||
but is also applicable to any project seeking to exploit code and/or data
|
|
||||||
locality on modern computing platforms.
|
|
||||||
|
|
||||||
Note that the hwloc project represents the merger of the libtopology project
|
|
||||||
from INRIA and the Portable Linux Processor Affinity (PLPA) sub-project from
|
|
||||||
Open MPI. Both of these prior projects are now deprecated. The first hwloc
|
|
||||||
release was essentially a "re-branding" of the libtopology code base, but with
|
|
||||||
both a few genuinely new features and a few PLPA-like features added in. Prior
|
|
||||||
releases of hwloc included documentation about switching from PLPA to hwloc;
|
|
||||||
this documentation has been dropped on the assumption that everyone who was
|
|
||||||
using PLPA has already switched to hwloc.
|
|
||||||
|
|
||||||
hwloc supports the following operating systems:
|
|
||||||
|
|
||||||
* Linux (including old kernels not having sysfs topology information, with
|
|
||||||
knowledge of cpusets, offline CPUs, ScaleMP vSMP, and Kerrighed support)
|
|
||||||
* Solaris
|
|
||||||
* AIX
|
|
||||||
* Darwin / OS X
|
|
||||||
* FreeBSD and its variants, such as kFreeBSD/GNU
|
|
||||||
* OSF/1 (a.k.a., Tru64)
|
|
||||||
* HP-UX
|
|
||||||
* Microsoft Windows
|
|
||||||
|
|
||||||
hwloc only reports the number of processors on unsupported operating systems;
|
|
||||||
no topology information is available.
|
|
||||||
|
|
||||||
For development and debugging purposes, hwloc also offers the ability to work
|
|
||||||
on "fake" topologies:
|
|
||||||
|
|
||||||
* Symmetrical tree of resources generated from a list of level arities
|
|
||||||
* Remote machine simulation through the gathering of Linux sysfs topology
|
|
||||||
files
|
|
||||||
|
|
||||||
hwloc can display the topology in a human-readable format, either in graphical
|
|
||||||
mode (X11), or by exporting in one of several different formats, including:
|
|
||||||
plain text, PDF, PNG, and FIG (see CLI Examples below). Note that some of the
|
|
||||||
export formats require additional support libraries.
|
|
||||||
|
|
||||||
hwloc offers a programming interface for manipulating topologies and objects.
|
|
||||||
It also brings a powerful CPU bitmap API that is used to describe topology
|
|
||||||
objects location on physical/logical processors. See the Programming Interface
|
|
||||||
below. It may also be used to binding applications onto certain cores or memory
|
|
||||||
nodes. Several utility programs are also provided to ease command-line
|
|
||||||
manipulation of topology objects, binding of processes, and so on.
|
|
||||||
|
|
||||||
Installation
|
|
||||||
|
|
||||||
hwloc (http://www.open-mpi.org/projects/hwloc/) is available under the BSD
|
|
||||||
license. It is hosted as a sub-project of the overall Open MPI project (http://
|
|
||||||
www.open-mpi.org/). Note that hwloc does not require any functionality from
|
|
||||||
Open MPI -- it is a wholly separate (and much smaller!) project and code base.
|
|
||||||
It just happens to be hosted as part of the overall Open MPI project.
|
|
||||||
|
|
||||||
Nightly development snapshots are available on the web site. Additionally, the
|
|
||||||
code can be directly checked out of Subversion:
|
|
||||||
|
|
||||||
shell$ svn checkout http://svn.open-mpi.org/svn/hwloc/trunk hwloc-trunk
|
|
||||||
shell$ cd hwloc-trunk
|
|
||||||
shell$ ./autogen.sh
|
|
||||||
|
|
||||||
Note that GNU Autoconf >=2.63, Automake >=1.10 and Libtool >=2.2.6 are required
|
|
||||||
when building from a Subversion checkout.
|
|
||||||
|
|
||||||
Installation by itself is the fairly common GNU-based process:
|
|
||||||
|
|
||||||
shell$ ./configure --prefix=...
|
|
||||||
shell$ make
|
|
||||||
shell$ make install
|
|
||||||
|
|
||||||
The hwloc command-line tool "lstopo" produces human-readable topology maps, as
|
|
||||||
mentioned above. It can also export maps to the "fig" file format. Support for
|
|
||||||
PDF, Postscript, and PNG exporting is provided if the "Cairo" development
|
|
||||||
package can be found when hwloc is configured and build. Similarly, lstopo's
|
|
||||||
XML support requires the libxml2 development package.
|
|
||||||
|
|
||||||
CLI Examples
|
|
||||||
|
|
||||||
On a 4-socket 2-core machine with hyperthreading, the lstopo tool may show the
|
|
||||||
following graphical output:
|
|
||||||
|
|
||||||
dudley.png
|
|
||||||
|
|
||||||
Here's the equivalent output in textual form:
|
|
||||||
|
|
||||||
Machine (16GB)
|
|
||||||
Socket L#0 + L3 L#0 (4096KB)
|
|
||||||
L2 L#0 (1024KB) + L1 L#0 (16KB) + Core L#0
|
|
||||||
PU L#0 (P#0)
|
|
||||||
PU L#1 (P#8)
|
|
||||||
L2 L#1 (1024KB) + L1 L#1 (16KB) + Core L#1
|
|
||||||
PU L#2 (P#4)
|
|
||||||
PU L#3 (P#12)
|
|
||||||
Socket L#1 + L3 L#1 (4096KB)
|
|
||||||
L2 L#2 (1024KB) + L1 L#2 (16KB) + Core L#2
|
|
||||||
PU L#4 (P#1)
|
|
||||||
PU L#5 (P#9)
|
|
||||||
L2 L#3 (1024KB) + L1 L#3 (16KB) + Core L#3
|
|
||||||
PU L#6 (P#5)
|
|
||||||
PU L#7 (P#13)
|
|
||||||
Socket L#2 + L3 L#2 (4096KB)
|
|
||||||
L2 L#4 (1024KB) + L1 L#4 (16KB) + Core L#4
|
|
||||||
PU L#8 (P#2)
|
|
||||||
PU L#9 (P#10)
|
|
||||||
L2 L#5 (1024KB) + L1 L#5 (16KB) + Core L#5
|
|
||||||
PU L#10 (P#6)
|
|
||||||
PU L#11 (P#14)
|
|
||||||
Socket L#3 + L3 L#3 (4096KB)
|
|
||||||
L2 L#6 (1024KB) + L1 L#6 (16KB) + Core L#6
|
|
||||||
PU L#12 (P#3)
|
|
||||||
PU L#13 (P#11)
|
|
||||||
L2 L#7 (1024KB) + L1 L#7 (16KB) + Core L#7
|
|
||||||
PU L#14 (P#7)
|
|
||||||
PU L#15 (P#15)
|
|
||||||
|
|
||||||
Finally, here's the equivalent output in XML. Long lines were artificially
|
|
||||||
broken for document clarity (in the real output, each XML tag is on a single
|
|
||||||
line), and only socket #0 is shown for brevity:
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE topology SYSTEM "hwloc.dtd">
|
|
||||||
<topology>
|
|
||||||
<object type="Machine" os_level="-1" os_index="0" cpuset="0x0000ffff"
|
|
||||||
complete_cpuset="0x0000ffff" online_cpuset="0x0000ffff"
|
|
||||||
allowed_cpuset="0x0000ffff"
|
|
||||||
dmi_board_vendor="Dell Computer Corporation" dmi_board_name="0RD318"
|
|
||||||
local_memory="16648183808">
|
|
||||||
<page_type size="4096" count="4064498"/>
|
|
||||||
<page_type size="2097152" count="0"/>
|
|
||||||
<object type="Socket" os_level="-1" os_index="0" cpuset="0x00001111"
|
|
||||||
complete_cpuset="0x00001111" online_cpuset="0x00001111"
|
|
||||||
allowed_cpuset="0x00001111">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00001111"
|
|
||||||
complete_cpuset="0x00001111" online_cpuset="0x00001111"
|
|
||||||
allowed_cpuset="0x00001111" cache_size="4194304" depth="3"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000101"
|
|
||||||
complete_cpuset="0x00000101" online_cpuset="0x00000101"
|
|
||||||
allowed_cpuset="0x00000101" cache_size="1048576" depth="2"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000101"
|
|
||||||
complete_cpuset="0x00000101" online_cpuset="0x00000101"
|
|
||||||
allowed_cpuset="0x00000101" cache_size="16384" depth="1"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Core" os_level="-1" os_index="0" cpuset="0x00000101"
|
|
||||||
complete_cpuset="0x00000101" online_cpuset="0x00000101"
|
|
||||||
allowed_cpuset="0x00000101">
|
|
||||||
<object type="PU" os_level="-1" os_index="0" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001"/>
|
|
||||||
<object type="PU" os_level="-1" os_index="8" cpuset="0x00000100"
|
|
||||||
complete_cpuset="0x00000100" online_cpuset="0x00000100"
|
|
||||||
allowed_cpuset="0x00000100"/>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00001010"
|
|
||||||
complete_cpuset="0x00001010" online_cpuset="0x00001010"
|
|
||||||
allowed_cpuset="0x00001010" cache_size="1048576" depth="2"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00001010"
|
|
||||||
complete_cpuset="0x00001010" online_cpuset="0x00001010"
|
|
||||||
allowed_cpuset="0x00001010" cache_size="16384" depth="1"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Core" os_level="-1" os_index="1" cpuset="0x00001010"
|
|
||||||
complete_cpuset="0x00001010" online_cpuset="0x00001010"
|
|
||||||
allowed_cpuset="0x00001010">
|
|
||||||
<object type="PU" os_level="-1" os_index="4" cpuset="0x00000010"
|
|
||||||
complete_cpuset="0x00000010" online_cpuset="0x00000010"
|
|
||||||
allowed_cpuset="0x00000010"/>
|
|
||||||
<object type="PU" os_level="-1" os_index="12" cpuset="0x00001000"
|
|
||||||
complete_cpuset="0x00001000" online_cpuset="0x00001000"
|
|
||||||
allowed_cpuset="0x00001000"/>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<!-- ...other sockets listed here ... -->
|
|
||||||
</object>
|
|
||||||
</topology>
|
|
||||||
|
|
||||||
On a 4-socket 2-core Opteron NUMA machine, the lstopo tool may show the
|
|
||||||
following graphical output:
|
|
||||||
|
|
||||||
hagrid.png
|
|
||||||
|
|
||||||
Here's the equivalent output in textual form:
|
|
||||||
|
|
||||||
Machine (32GB)
|
|
||||||
NUMANode L#0 (P#0 8190MB) + Socket L#0
|
|
||||||
L2 L#0 (1024KB) + L1 L#0 (64KB) + Core L#0 + PU L#0 (P#0)
|
|
||||||
L2 L#1 (1024KB) + L1 L#1 (64KB) + Core L#1 + PU L#1 (P#1)
|
|
||||||
NUMANode L#1 (P#1 8192MB) + Socket L#1
|
|
||||||
L2 L#2 (1024KB) + L1 L#2 (64KB) + Core L#2 + PU L#2 (P#2)
|
|
||||||
L2 L#3 (1024KB) + L1 L#3 (64KB) + Core L#3 + PU L#3 (P#3)
|
|
||||||
NUMANode L#2 (P#2 8192MB) + Socket L#2
|
|
||||||
L2 L#4 (1024KB) + L1 L#4 (64KB) + Core L#4 + PU L#4 (P#4)
|
|
||||||
L2 L#5 (1024KB) + L1 L#5 (64KB) + Core L#5 + PU L#5 (P#5)
|
|
||||||
NUMANode L#3 (P#3 8192MB) + Socket L#3
|
|
||||||
L2 L#6 (1024KB) + L1 L#6 (64KB) + Core L#6 + PU L#6 (P#6)
|
|
||||||
L2 L#7 (1024KB) + L1 L#7 (64KB) + Core L#7 + PU L#7 (P#7)
|
|
||||||
|
|
||||||
And here's the equivalent output in XML. Similar to above, line breaks were
|
|
||||||
added and only PU #0 is shown for brevity:
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE topology SYSTEM "hwloc.dtd">
|
|
||||||
<topology>
|
|
||||||
<object type="Machine" os_level="-1" os_index="0" cpuset="0x000000ff"
|
|
||||||
complete_cpuset="0x000000ff" online_cpuset="0x000000ff"
|
|
||||||
allowed_cpuset="0x000000ff" nodeset="0x000000ff"
|
|
||||||
complete_nodeset="0x000000ff" allowed_nodeset="0x000000ff"
|
|
||||||
dmi_board_vendor="TYAN Computer Corp" dmi_board_name="S4881 ">
|
|
||||||
<page_type size="4096" count="0"/>
|
|
||||||
<page_type size="2097152" count="0"/>
|
|
||||||
<object type="NUMANode" os_level="-1" os_index="0" cpuset="0x00000003"
|
|
||||||
complete_cpuset="0x00000003" online_cpuset="0x00000003"
|
|
||||||
allowed_cpuset="0x00000003" nodeset="0x00000001"
|
|
||||||
complete_nodeset="0x00000001" allowed_nodeset="0x00000001"
|
|
||||||
local_memory="7514177536">
|
|
||||||
<page_type size="4096" count="1834516"/>
|
|
||||||
<page_type size="2097152" count="0"/>
|
|
||||||
<object type="Socket" os_level="-1" os_index="0" cpuset="0x00000003"
|
|
||||||
complete_cpuset="0x00000003" online_cpuset="0x00000003"
|
|
||||||
allowed_cpuset="0x00000003" nodeset="0x00000001"
|
|
||||||
complete_nodeset="0x00000001" allowed_nodeset="0x00000001">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001" nodeset="0x00000001"
|
|
||||||
complete_nodeset="0x00000001" allowed_nodeset="0x00000001"
|
|
||||||
cache_size="1048576" depth="2" cache_linesize="64">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001" nodeset="0x00000001"
|
|
||||||
complete_nodeset="0x00000001" allowed_nodeset="0x00000001"
|
|
||||||
cache_size="65536" depth="1" cache_linesize="64">
|
|
||||||
<object type="Core" os_level="-1" os_index="0"
|
|
||||||
cpuset="0x00000001" complete_cpuset="0x00000001"
|
|
||||||
online_cpuset="0x00000001" allowed_cpuset="0x00000001"
|
|
||||||
nodeset="0x00000001" complete_nodeset="0x00000001"
|
|
||||||
allowed_nodeset="0x00000001">
|
|
||||||
<object type="PU" os_level="-1" os_index="0" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001" nodeset="0x00000001"
|
|
||||||
complete_nodeset="0x00000001" allowed_nodeset="0x00000001"/>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<!-- ...more objects listed here ... -->
|
|
||||||
</topology>
|
|
||||||
|
|
||||||
On a 2-socket quad-core Xeon (pre-Nehalem, with 2 dual-core dies into each
|
|
||||||
socket):
|
|
||||||
|
|
||||||
emmett.png
|
|
||||||
|
|
||||||
Here's the same output in textual form:
|
|
||||||
|
|
||||||
Machine (16GB)
|
|
||||||
Socket L#0
|
|
||||||
L2 L#0 (4096KB)
|
|
||||||
L1 L#0 (32KB) + Core L#0 + PU L#0 (P#0)
|
|
||||||
L1 L#1 (32KB) + Core L#1 + PU L#1 (P#4)
|
|
||||||
L2 L#1 (4096KB)
|
|
||||||
L1 L#2 (32KB) + Core L#2 + PU L#2 (P#2)
|
|
||||||
L1 L#3 (32KB) + Core L#3 + PU L#3 (P#6)
|
|
||||||
Socket L#1
|
|
||||||
L2 L#2 (4096KB)
|
|
||||||
L1 L#4 (32KB) + Core L#4 + PU L#4 (P#1)
|
|
||||||
L1 L#5 (32KB) + Core L#5 + PU L#5 (P#5)
|
|
||||||
L2 L#3 (4096KB)
|
|
||||||
L1 L#6 (32KB) + Core L#6 + PU L#6 (P#3)
|
|
||||||
L1 L#7 (32KB) + Core L#7 + PU L#7 (P#7)
|
|
||||||
|
|
||||||
And the same output in XML (line breaks added, only PU #0 shown):
|
|
||||||
|
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE topology SYSTEM "hwloc.dtd">
|
|
||||||
<topology>
|
|
||||||
<object type="Machine" os_level="-1" os_index="0" cpuset="0x000000ff"
|
|
||||||
complete_cpuset="0x000000ff" online_cpuset="0x000000ff"
|
|
||||||
allowed_cpuset="0x000000ff" dmi_board_vendor="Dell Inc."
|
|
||||||
dmi_board_name="0NR282" local_memory="16865292288">
|
|
||||||
<page_type size="4096" count="4117503"/>
|
|
||||||
<page_type size="2097152" count="0"/>
|
|
||||||
<object type="Socket" os_level="-1" os_index="0" cpuset="0x00000055"
|
|
||||||
complete_cpuset="0x00000055" online_cpuset="0x00000055"
|
|
||||||
allowed_cpuset="0x00000055">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000011"
|
|
||||||
complete_cpuset="0x00000011" online_cpuset="0x00000011"
|
|
||||||
allowed_cpuset="0x00000011" cache_size="4194304" depth="2"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001" cache_size="32768" depth="1"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Core" os_level="-1" os_index="0" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001">
|
|
||||||
<object type="PU" os_level="-1" os_index="0" cpuset="0x00000001"
|
|
||||||
complete_cpuset="0x00000001" online_cpuset="0x00000001"
|
|
||||||
allowed_cpuset="0x00000001"/>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<object type="Cache" os_level="-1" cpuset="0x00000010"
|
|
||||||
complete_cpuset="0x00000010" online_cpuset="0x00000010"
|
|
||||||
allowed_cpuset="0x00000010" cache_size="32768" depth="1"
|
|
||||||
cache_linesize="64">
|
|
||||||
<object type="Core" os_level="-1" os_index="1" cpuset="0x00000010"
|
|
||||||
complete_cpuset="0x00000010" online_cpuset="0x00000010"
|
|
||||||
allowed_cpuset="0x00000010">
|
|
||||||
<object type="PU" os_level="-1" os_index="4" cpuset="0x00000010"
|
|
||||||
complete_cpuset="0x00000010" online_cpuset="0x00000010"
|
|
||||||
allowed_cpuset="0x00000010"/>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
</object>
|
|
||||||
<!-- ...more objects listed here ... -->
|
|
||||||
</topology>
|
|
||||||
|
|
||||||
Programming Interface
|
|
||||||
|
|
||||||
The basic interface is available in hwloc.h. It essentially offers low-level
|
|
||||||
routines for advanced programmers that want to manually manipulate objects and
|
|
||||||
follow links between them. Documentation for everything in hwloc.h are provided
|
|
||||||
later in this document. Developers should also look at hwloc/helper.h (and also
|
|
||||||
in this document, which provides good higher-level topology traversal examples.
|
|
||||||
|
|
||||||
To precisely define the vocabulary used by hwloc, a Terms and Definitions
|
|
||||||
section is available and should probably be read first.
|
|
||||||
|
|
||||||
Each hwloc object contains a cpuset describing the list of processing units
|
|
||||||
that it contains. These bitmaps may be used for CPU binding and Memory binding.
|
|
||||||
hwloc offers an extensive bitmap manipulation interface in hwloc/bitmap.h.
|
|
||||||
|
|
||||||
Moreover, hwloc also comes with additional helpers for interoperability with
|
|
||||||
several commonly used environments. See the Interoperability With Other
|
|
||||||
Software section for details.
|
|
||||||
|
|
||||||
The complete API documentation is available in a full set of HTML pages, man
|
|
||||||
pages, and self-contained PDF files (formatted for both both US letter and A4
|
|
||||||
formats) in the source tarball in doc/doxygen-doc/.
|
|
||||||
|
|
||||||
NOTE: If you are building the documentation from a Subversion checkout, you
|
|
||||||
will need to have Doxygen and pdflatex installed -- the documentation will be
|
|
||||||
built during the normal "make" process. The documentation is installed during
|
|
||||||
"make install" to $prefix/share/doc/hwloc/ and your systems default man page
|
|
||||||
tree (under $prefix, of course).
|
|
||||||
|
|
||||||
Portability
|
|
||||||
|
|
||||||
As shown in CLI Examples, hwloc can obtain information on a wide variety of
|
|
||||||
hardware topologies. However, some platforms and/or operating system versions
|
|
||||||
will only report a subset of this information. For example, on an PPC64-based
|
|
||||||
system with 32 cores (each with 2 hardware threads) running a default
|
|
||||||
2.6.18-based kernel from RHEL 5.4, hwloc is only able to glean information
|
|
||||||
about NUMA nodes and processor units (PUs). No information about caches,
|
|
||||||
sockets, or cores is available.
|
|
||||||
|
|
||||||
Similarly, Operating System have varying support for CPU and memory binding,
|
|
||||||
e.g. while some Operating Systems provide interfaces for all kinds of CPU and
|
|
||||||
memory bindings, some others provide only interfaces for a limited number of
|
|
||||||
kinds of CPU and memory binding, and some do not provide any binding interface
|
|
||||||
at all. Hwloc's binding functions would then simply return the ENOSYS error
|
|
||||||
(Function not implemented), meaning that the underlying Operating System does
|
|
||||||
not provide any interface for them. CPU binding and Memory binding provide more
|
|
||||||
information on which hwloc binding functions should be preferred because
|
|
||||||
interfaces for them are usually available on the supported Operating Systems.
|
|
||||||
|
|
||||||
Here's the graphical output from lstopo on this platform when Simultaneous
|
|
||||||
Multi-Threading (SMT) is enabled:
|
|
||||||
|
|
||||||
ppc64-with-smt.png
|
|
||||||
|
|
||||||
And here's the graphical output from lstopo on this platform when SMT is
|
|
||||||
disabled:
|
|
||||||
|
|
||||||
ppc64-without-smt.png
|
|
||||||
|
|
||||||
Notice that hwloc only sees half the PUs when SMT is disabled. PU #15, for
|
|
||||||
example, seems to change location from NUMA node #0 to #1. In reality, no PUs
|
|
||||||
"moved" -- they were simply re-numbered when hwloc only saw half as many.
|
|
||||||
Hence, PU #15 in the SMT-disabled picture probably corresponds to PU #30 in the
|
|
||||||
SMT-enabled picture.
|
|
||||||
|
|
||||||
This same "PUs have disappeared" effect can be seen on other platforms -- even
|
|
||||||
platforms / OSs that provide much more information than the above PPC64 system.
|
|
||||||
This is an unfortunate side-effect of how operating systems report information
|
|
||||||
to hwloc.
|
|
||||||
|
|
||||||
Note that upgrading the Linux kernel on the same PPC64 system mentioned above
|
|
||||||
to 2.6.34, hwloc is able to discover all the topology information. The
|
|
||||||
following picture shows the entire topology layout when SMT is enabled:
|
|
||||||
|
|
||||||
ppc64-full-with-smt.png
|
|
||||||
|
|
||||||
Developers using the hwloc API or XML output for portable applications should
|
|
||||||
therefore be extremely careful to not make any assumptions about the structure
|
|
||||||
of data that is returned. For example, per the above reported PPC topology, it
|
|
||||||
is not safe to assume that PUs will always be descendants of cores.
|
|
||||||
|
|
||||||
Additionally, future hardware may insert new topology elements that are not
|
|
||||||
available in this version of hwloc. Long-lived applications that are meant to
|
|
||||||
span multiple different hardware platforms should also be careful about making
|
|
||||||
structure assumptions. For example, there may someday be an element "lower"
|
|
||||||
than a PU, or perhaps a new element may exist between a core and a PU.
|
|
||||||
|
|
||||||
API Example
|
|
||||||
|
|
||||||
The following small C example (named ``hwloc-hello.c'') prints the topology of
|
|
||||||
the machine and bring the process to the first logical processor of the second
|
|
||||||
core of the machine.
|
|
||||||
|
|
||||||
/* Example hwloc API program.
|
|
||||||
*
|
|
||||||
* Copyright ? 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright ? 2009-2011 Universit? Bordeaux 1
|
|
||||||
* Copyright ? 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*
|
|
||||||
* hwloc-hello.c
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
static void print_children(hwloc_topology_t topology, hwloc_obj_t obj,
|
|
||||||
int depth)
|
|
||||||
{
|
|
||||||
char string[128];
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
hwloc_obj_snprintf(string, sizeof(string), topology, obj, "#", 0);
|
|
||||||
printf("%*s%s\n", 2*depth, "", string);
|
|
||||||
for (i = 0; i < obj->arity; i++) {
|
|
||||||
print_children(topology, obj->children[i], depth + 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int main(void)
|
|
||||||
{
|
|
||||||
int depth;
|
|
||||||
unsigned i, n;
|
|
||||||
unsigned long size;
|
|
||||||
int levels;
|
|
||||||
char string[128];
|
|
||||||
int topodepth;
|
|
||||||
hwloc_topology_t topology;
|
|
||||||
hwloc_cpuset_t cpuset;
|
|
||||||
hwloc_obj_t obj;
|
|
||||||
|
|
||||||
/* Allocate and initialize topology object. */
|
|
||||||
hwloc_topology_init(&topology);
|
|
||||||
|
|
||||||
/* ... Optionally, put detection configuration here to ignore
|
|
||||||
some objects types, define a synthetic topology, etc....
|
|
||||||
|
|
||||||
The default is to detect all the objects of the machine that
|
|
||||||
the caller is allowed to access. See Configure Topology
|
|
||||||
Detection. */
|
|
||||||
|
|
||||||
/* Perform the topology detection. */
|
|
||||||
hwloc_topology_load(topology);
|
|
||||||
|
|
||||||
/* Optionally, get some additional topology information
|
|
||||||
in case we need the topology depth later. */
|
|
||||||
topodepth = hwloc_topology_get_depth(topology);
|
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
* First example:
|
|
||||||
* Walk the topology with an array style, from level 0 (always
|
|
||||||
* the system level) to the lowest level (always the proc level).
|
|
||||||
*****************************************************************/
|
|
||||||
for (depth = 0; depth < topodepth; depth++) {
|
|
||||||
printf("*** Objects at level %d\n", depth);
|
|
||||||
for (i = 0; i < hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
i++) {
|
|
||||||
hwloc_obj_snprintf(string, sizeof(string), topology,
|
|
||||||
hwloc_get_obj_by_depth(topology, depth, i),
|
|
||||||
"#", 0);
|
|
||||||
printf("Index %u: %s\n", i, string);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
* Second example:
|
|
||||||
* Walk the topology with a tree style.
|
|
||||||
*****************************************************************/
|
|
||||||
printf("*** Printing overall tree\n");
|
|
||||||
print_children(topology, hwloc_get_root_obj(topology), 0);
|
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
* Third example:
|
|
||||||
* Print the number of sockets.
|
|
||||||
*****************************************************************/
|
|
||||||
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_SOCKET);
|
|
||||||
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
printf("*** The number of sockets is unknown\n");
|
|
||||||
} else {
|
|
||||||
printf("*** %u socket(s)\n",
|
|
||||||
hwloc_get_nbobjs_by_depth(topology, depth));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
* Fourth example:
|
|
||||||
* Compute the amount of cache that the first logical processor
|
|
||||||
* has above it.
|
|
||||||
*****************************************************************/
|
|
||||||
levels = 0;
|
|
||||||
size = 0;
|
|
||||||
for (obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_PU, 0);
|
|
||||||
obj;
|
|
||||||
obj = obj->parent)
|
|
||||||
if (obj->type == HWLOC_OBJ_CACHE) {
|
|
||||||
levels++;
|
|
||||||
size += obj->attr->cache.size;
|
|
||||||
}
|
|
||||||
printf("*** Logical processor 0 has %d caches totaling %luKB\n",
|
|
||||||
levels, size / 1024);
|
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
* Fifth example:
|
|
||||||
* Bind to only one thread of the last core of the machine.
|
|
||||||
*
|
|
||||||
* First find out where cores are, or else smaller sets of CPUs if
|
|
||||||
* the OS doesn't have the notion of a "core".
|
|
||||||
*****************************************************************/
|
|
||||||
depth = hwloc_get_type_or_below_depth(topology, HWLOC_OBJ_CORE);
|
|
||||||
|
|
||||||
/* Get last core. */
|
|
||||||
obj = hwloc_get_obj_by_depth(topology, depth,
|
|
||||||
hwloc_get_nbobjs_by_depth(topology, depth) - 1);
|
|
||||||
if (obj) {
|
|
||||||
/* Get a copy of its cpuset that we may modify. */
|
|
||||||
cpuset = hwloc_bitmap_dup(obj->cpuset);
|
|
||||||
|
|
||||||
/* Get only one logical processor (in case the core is
|
|
||||||
SMT/hyperthreaded). */
|
|
||||||
hwloc_bitmap_singlify(cpuset);
|
|
||||||
|
|
||||||
/* And try to bind ourself there. */
|
|
||||||
if (hwloc_set_cpubind(topology, cpuset, 0)) {
|
|
||||||
char *str;
|
|
||||||
int error = errno;
|
|
||||||
hwloc_bitmap_asprintf(&str, obj->cpuset);
|
|
||||||
printf("Couldn't bind to cpuset %s: %s\n", str, strerror(error));
|
|
||||||
free(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Free our cpuset copy */
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************
|
|
||||||
* Sixth example:
|
|
||||||
* Allocate some memory on the last NUMA node, bind some existing
|
|
||||||
* memory to the last NUMA node.
|
|
||||||
*****************************************************************/
|
|
||||||
/* Get last node. */
|
|
||||||
n = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NODE);
|
|
||||||
if (n) {
|
|
||||||
void *m;
|
|
||||||
size = 1024*1024;
|
|
||||||
|
|
||||||
obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NODE, n - 1);
|
|
||||||
m = hwloc_alloc_membind_nodeset(topology, size, obj->nodeset,
|
|
||||||
HWLOC_MEMBIND_DEFAULT, 0);
|
|
||||||
hwloc_free(topology, m, size);
|
|
||||||
|
|
||||||
m = malloc(size);
|
|
||||||
hwloc_set_area_membind_nodeset(topology, m, size, obj->nodeset,
|
|
||||||
HWLOC_MEMBIND_DEFAULT, 0);
|
|
||||||
free(m);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Destroy topology object. */
|
|
||||||
hwloc_topology_destroy(topology);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc provides a pkg-config executable to obtain relevant compiler and linker
|
|
||||||
flags. For example, it can be used thusly to compile applications that utilize
|
|
||||||
the hwloc library (assuming GNU Make):
|
|
||||||
|
|
||||||
CFLAGS += $(pkg-config --cflags hwloc)
|
|
||||||
LDLIBS += $(pkg-config --libs hwloc)
|
|
||||||
cc hwloc-hello.c $(CFLAGS) -o hwloc-hello $(LDLIBS)
|
|
||||||
|
|
||||||
On a machine with 4GB of RAM and 2 processor sockets -- each socket of which
|
|
||||||
has two processing cores -- the output from running hwloc-hello could be
|
|
||||||
something like the following:
|
|
||||||
|
|
||||||
shell$ ./hwloc-hello
|
|
||||||
*** Objects at level 0
|
|
||||||
Index 0: Machine(3938MB)
|
|
||||||
*** Objects at level 1
|
|
||||||
Index 0: Socket#0
|
|
||||||
Index 1: Socket#1
|
|
||||||
*** Objects at level 2
|
|
||||||
Index 0: Core#0
|
|
||||||
Index 1: Core#1
|
|
||||||
Index 2: Core#3
|
|
||||||
Index 3: Core#2
|
|
||||||
*** Objects at level 3
|
|
||||||
Index 0: PU#0
|
|
||||||
Index 1: PU#1
|
|
||||||
Index 2: PU#2
|
|
||||||
Index 3: PU#3
|
|
||||||
*** Printing overall tree
|
|
||||||
Machine(3938MB)
|
|
||||||
Socket#0
|
|
||||||
Core#0
|
|
||||||
PU#0
|
|
||||||
Core#1
|
|
||||||
PU#1
|
|
||||||
Socket#1
|
|
||||||
Core#3
|
|
||||||
PU#2
|
|
||||||
Core#2
|
|
||||||
PU#3
|
|
||||||
*** 2 socket(s)
|
|
||||||
shell$
|
|
||||||
|
|
||||||
Questions and Bugs
|
|
||||||
|
|
||||||
Questions should be sent to the devel mailing list (http://www.open-mpi.org/
|
|
||||||
community/lists/hwloc.php). Bug reports should be reported in the tracker (
|
|
||||||
https://svn.open-mpi.org/trac/hwloc/).
|
|
||||||
|
|
||||||
If hwloc discovers an incorrect topology for your machine, the very first thing
|
|
||||||
you should check is to ensure that you have the most recent updates installed
|
|
||||||
for your operating system. Indeed, most of hwloc topology discovery relies on
|
|
||||||
hardware information retrieved through the operation system (e.g., via the /sys
|
|
||||||
virtual filesystem of the Linux kernel). If upgrading your OS or Linux kernel
|
|
||||||
does not solve your problem, you may also want to ensure that you are running
|
|
||||||
the most recent version of the BIOS for your machine.
|
|
||||||
|
|
||||||
If those things fail, contact us on the mailing list for additional help.
|
|
||||||
Please attach the output of lstopo after having given the --enable-debug option
|
|
||||||
to ./configure and rebuilt completely, to get debugging output.
|
|
||||||
|
|
||||||
History / Credits
|
|
||||||
|
|
||||||
hwloc is the evolution and merger of the libtopology (http://
|
|
||||||
runtime.bordeaux.inria.fr/libtopology/) project and the Portable Linux
|
|
||||||
Processor Affinity (PLPA) (http://www.open-mpi.org/projects/plpa/) project.
|
|
||||||
Because of functional and ideological overlap, these two code bases and ideas
|
|
||||||
were merged and released under the name "hwloc" as an Open MPI sub-project.
|
|
||||||
|
|
||||||
libtopology was initially developed by the INRIA Runtime Team-Project (http://
|
|
||||||
runtime.bordeaux.inria.fr/) (headed by Raymond Namyst (http://
|
|
||||||
dept-info.labri.fr/~namyst/). PLPA was initially developed by the Open MPI
|
|
||||||
development team as a sub-project. Both are now deprecated in favor of hwloc,
|
|
||||||
which is distributed as an Open MPI sub-project.
|
|
||||||
|
|
||||||
Further Reading
|
|
||||||
|
|
||||||
The documentation chapters include
|
|
||||||
|
|
||||||
* Terms and Definitions
|
|
||||||
* Command-Line Tools
|
|
||||||
* Environment Variables
|
|
||||||
* CPU and Memory Binding Overview
|
|
||||||
* Interoperability With Other Software
|
|
||||||
* Thread Safety
|
|
||||||
* Embedding hwloc in Other Software
|
|
||||||
* Frequently Asked Questions
|
|
||||||
|
|
||||||
Make sure to have had a look at those too!
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Generated on Tue Aug 16 2011 19:37:04 for Hardware Locality (hwloc) by doxygen
|
|
||||||
1.7.4
|
|
|
@ -1,61 +0,0 @@
|
||||||
# This is the VERSION file for hwloc, describing the precise version
|
|
||||||
# of hwloc in this distribution. The various components of the version
|
|
||||||
# number below are combined to form a single version number string.
|
|
||||||
|
|
||||||
# major, minor, and release are generally combined in the form
|
|
||||||
# <major>.<minor>.<release>. If release is zero, then it is omitted.
|
|
||||||
|
|
||||||
major=1
|
|
||||||
minor=2
|
|
||||||
release=1
|
|
||||||
|
|
||||||
# greek is used for alpha or beta release tags. If it is non-empty,
|
|
||||||
# it will be appended to the version number. It does not have to be
|
|
||||||
# numeric. Common examples include a1 (alpha release 1), b1 (beta
|
|
||||||
# release 1), sc2005 (Super Computing 2005 release). The only
|
|
||||||
# requirement is that it must be entirely printable ASCII characters
|
|
||||||
# and have no white space.
|
|
||||||
|
|
||||||
greek=
|
|
||||||
|
|
||||||
# If want_repo_rev=1, then the SVN r number will be included in the overall
|
|
||||||
# hwloc version number in some form.
|
|
||||||
|
|
||||||
want_repo_rev=0
|
|
||||||
|
|
||||||
# If repo_rev=-1, then the repository version number will be obtained
|
|
||||||
# dynamically at run time, either:
|
|
||||||
#
|
|
||||||
# 1) via the "svnversion" command (if this is a Subversion checkout)
|
|
||||||
# in the form "r<svn_r>", or
|
|
||||||
# 2) via the "hg -v -R tip" command (if this is a Mercurial clone)
|
|
||||||
# in the form of "hg<hash>", using the hash tag at the tip
|
|
||||||
# 3) via the "git log -1" command (if this is a Git clone) in the form
|
|
||||||
# of "git<hash>", using the hash tag at the HEAD
|
|
||||||
# 4) with the date (if none of the above work) in the form of
|
|
||||||
# "date<date>".
|
|
||||||
#
|
|
||||||
# Alternatively, if repo_rev is not -1, the value of repo_rev_r will
|
|
||||||
# be directly appended to the version string. This happens during
|
|
||||||
# "make dist", for example: if the distribution tarball is being made
|
|
||||||
# from an SVN checkout, if repo_rev=-1, then its value is replaced
|
|
||||||
# with the output of "svnversion".
|
|
||||||
|
|
||||||
repo_rev=r3619
|
|
||||||
|
|
||||||
# The date when this release was created
|
|
||||||
|
|
||||||
date="Aug 16, 2011"
|
|
||||||
|
|
||||||
# The shared library version of hwloc's public library. This version
|
|
||||||
# is maintained in accordance with the "Library Interface Versions"
|
|
||||||
# chapter from the GNU Libtool documentation. Notes:
|
|
||||||
|
|
||||||
# 1. Since version numbers are associated with *releases*, the version
|
|
||||||
# number maintained on the hwloc SVN trunk (and developer branches) is
|
|
||||||
# always 0:0:0.
|
|
||||||
|
|
||||||
# 2. Version numbers are described in the Libtool current:revision:age
|
|
||||||
# format.
|
|
||||||
|
|
||||||
libhwloc_so_version=3:1:3
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,143 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Wrapper for compilers which do not understand `-c -o'.
|
|
||||||
|
|
||||||
scriptversion=2009-10-06.20; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009 Free Software
|
|
||||||
# Foundation, Inc.
|
|
||||||
# Written by Tom Tromey <tromey@cygnus.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# This file is maintained in Automake, please report
|
|
||||||
# bugs to <bug-automake@gnu.org> or send patches to
|
|
||||||
# <automake-patches@gnu.org>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: compile [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Wrapper for compilers which do not understand `-c -o'.
|
|
||||||
Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
|
|
||||||
arguments, and rename the output as expected.
|
|
||||||
|
|
||||||
If you are trying to build a whole package this is not the
|
|
||||||
right script to run: please start by reading the file `INSTALL'.
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "compile $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ofile=
|
|
||||||
cfile=
|
|
||||||
eat=
|
|
||||||
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$eat"; then
|
|
||||||
eat=
|
|
||||||
else
|
|
||||||
case $1 in
|
|
||||||
-o)
|
|
||||||
# configure might choose to run compile as `compile cc -o foo foo.c'.
|
|
||||||
# So we strip `-o arg' only if arg is an object.
|
|
||||||
eat=1
|
|
||||||
case $2 in
|
|
||||||
*.o | *.obj)
|
|
||||||
ofile=$2
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" -o "$2"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
*.c)
|
|
||||||
cfile=$1
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set x "$@" "$1"
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -z "$ofile" || test -z "$cfile"; then
|
|
||||||
# If no `-o' option was seen then we might have been invoked from a
|
|
||||||
# pattern rule where we don't need one. That is ok -- this is a
|
|
||||||
# normal compilation that the losing compiler can handle. If no
|
|
||||||
# `.c' file was seen then we are probably linking. That is also
|
|
||||||
# ok.
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Name of file we expect compiler to create.
|
|
||||||
cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'`
|
|
||||||
|
|
||||||
# Create the lock directory.
|
|
||||||
# Note: use `[/\\:.-]' here to ensure that we don't use the same name
|
|
||||||
# that we are using for the .o file. Also, base the name on the expected
|
|
||||||
# object file name, since that is what matters with a parallel build.
|
|
||||||
lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d
|
|
||||||
while true; do
|
|
||||||
if mkdir "$lockdir" >/dev/null 2>&1; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
# FIXME: race condition here if user kills between mkdir and trap.
|
|
||||||
trap "rmdir '$lockdir'; exit 1" 1 2 15
|
|
||||||
|
|
||||||
# Run the compile.
|
|
||||||
"$@"
|
|
||||||
ret=$?
|
|
||||||
|
|
||||||
if test -f "$cofile"; then
|
|
||||||
test "$cofile" = "$ofile" || mv "$cofile" "$ofile"
|
|
||||||
elif test -f "${cofile}bj"; then
|
|
||||||
test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile"
|
|
||||||
fi
|
|
||||||
|
|
||||||
rmdir "$lockdir"
|
|
||||||
exit $ret
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,630 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# depcomp - compile a program generating dependencies as side-effects
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free
|
|
||||||
# Software Foundation, Inc.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
'')
|
|
||||||
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
|
|
||||||
exit 1;
|
|
||||||
;;
|
|
||||||
-h | --h*)
|
|
||||||
cat <<\EOF
|
|
||||||
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
|
|
||||||
|
|
||||||
Run PROGRAMS ARGS to compile a file, generating dependencies
|
|
||||||
as side-effects.
|
|
||||||
|
|
||||||
Environment variables:
|
|
||||||
depmode Dependency tracking mode.
|
|
||||||
source Source file read by `PROGRAMS ARGS'.
|
|
||||||
object Object file output by `PROGRAMS ARGS'.
|
|
||||||
DEPDIR directory where to store dependencies.
|
|
||||||
depfile Dependency file to output.
|
|
||||||
tmpdepfile Temporary file to use when outputing dependencies.
|
|
||||||
libtool Whether libtool is used (yes/no).
|
|
||||||
|
|
||||||
Report bugs to <bug-automake@gnu.org>.
|
|
||||||
EOF
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
-v | --v*)
|
|
||||||
echo "depcomp $scriptversion"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
|
|
||||||
echo "depcomp: Variables source, object and depmode must be set" 1>&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
|
||||||
depfile=${depfile-`echo "$object" |
|
|
||||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
|
||||||
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
|
|
||||||
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
|
|
||||||
# Some modes work just like other modes, but use different flags. We
|
|
||||||
# parameterize here, but still list the modes in the big case below,
|
|
||||||
# to make depend.m4 easier to write. Note that we *cannot* use a case
|
|
||||||
# here, because this file can only contain one case statement.
|
|
||||||
if test "$depmode" = hp; then
|
|
||||||
# HP compiler uses -M and no extra arg.
|
|
||||||
gccflag=-M
|
|
||||||
depmode=gcc
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "$depmode" = dashXmstdout; then
|
|
||||||
# This is just like dashmstdout with a different argument.
|
|
||||||
dashmflag=-xM
|
|
||||||
depmode=dashmstdout
|
|
||||||
fi
|
|
||||||
|
|
||||||
cygpath_u="cygpath -u -f -"
|
|
||||||
if test "$depmode" = msvcmsys; then
|
|
||||||
# This is just like msvisualcpp but w/o cygpath translation.
|
|
||||||
# Just convert the backslash-escaped backslashes to single forward
|
|
||||||
# slashes to satisfy depend.m4
|
|
||||||
cygpath_u="sed s,\\\\\\\\,/,g"
|
|
||||||
depmode=msvisualcpp
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$depmode" in
|
|
||||||
gcc3)
|
|
||||||
## gcc 3 implements dependency tracking that does exactly what
|
|
||||||
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
|
|
||||||
## it if -MD -MP comes after the -MF stuff. Hmm.
|
|
||||||
## Unfortunately, FreeBSD c89 acceptance of flags depends upon
|
|
||||||
## the command line argument order; so add the flags where they
|
|
||||||
## appear in depend2.am. Note that the slowdown incurred here
|
|
||||||
## affects only configure: in makefiles, %FASTDEP% shortcuts this.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
|
|
||||||
*) set fnord "$@" "$arg" ;;
|
|
||||||
esac
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
done
|
|
||||||
"$@"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
mv "$tmpdepfile" "$depfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
gcc)
|
|
||||||
## There are various ways to get dependency output from gcc. Here's
|
|
||||||
## why we pick this rather obscure method:
|
|
||||||
## - Don't want to use -MD because we'd like the dependencies to end
|
|
||||||
## up in a subdir. Having to rename by hand is ugly.
|
|
||||||
## (We might end up doing this anyway to support other compilers.)
|
|
||||||
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
|
|
||||||
## -MM, not -M (despite what the docs say).
|
|
||||||
## - Using -M directly means running the compiler twice (even worse
|
|
||||||
## than renaming).
|
|
||||||
if test -z "$gccflag"; then
|
|
||||||
gccflag=-MD,
|
|
||||||
fi
|
|
||||||
"$@" -Wp,"$gccflag$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
|
|
||||||
## The second -e expression handles DOS-style file names with drive letters.
|
|
||||||
sed -e 's/^[^:]*: / /' \
|
|
||||||
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
|
|
||||||
## This next piece of magic avoids the `deleted header file' problem.
|
|
||||||
## The problem is that when a header file which appears in a .P file
|
|
||||||
## is deleted, the dependency causes make to die (because there is
|
|
||||||
## typically no way to rebuild the header). We avoid this by adding
|
|
||||||
## dummy dependencies for each header file. Too bad gcc doesn't do
|
|
||||||
## this for us directly.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" |
|
|
||||||
## Some versions of gcc put a space before the `:'. On the theory
|
|
||||||
## that the space means something, we add a space to the output as
|
|
||||||
## well.
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
sgi)
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
"$@" "-Wp,-MDupdate,$tmpdepfile"
|
|
||||||
else
|
|
||||||
"$@" -MDupdate "$tmpdepfile"
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
|
|
||||||
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
|
|
||||||
# Clip off the initial element (the dependent). Don't try to be
|
|
||||||
# clever and replace this with sed code, as IRIX sed won't handle
|
|
||||||
# lines with more than a fixed number of characters (4096 in
|
|
||||||
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
|
|
||||||
# the IRIX cc adds comments like `#:fec' to the end of the
|
|
||||||
# dependency line.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
|
|
||||||
tr '
|
|
||||||
' ' ' >> "$depfile"
|
|
||||||
echo >> "$depfile"
|
|
||||||
|
|
||||||
# The second pass generates a dummy entry for each header file.
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" \
|
|
||||||
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
|
|
||||||
>> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
aix)
|
|
||||||
# The C for AIX Compiler uses -M and outputs the dependencies
|
|
||||||
# in a .u file. In older versions, this file always lives in the
|
|
||||||
# current directory. Also, the AIX compiler puts `$object:' at the
|
|
||||||
# start of each line; $object doesn't have directory information.
|
|
||||||
# Version 6 uses the directory in both cases.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$base.u
|
|
||||||
tmpdepfile3=$dir.libs/$base.u
|
|
||||||
"$@" -Wc,-M
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.u
|
|
||||||
tmpdepfile2=$dir$base.u
|
|
||||||
tmpdepfile3=$dir$base.u
|
|
||||||
"$@" -M
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
# Each line is of the form `foo.o: dependent.h'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
# The sourcefile does not contain any dependencies, so just
|
|
||||||
# store a dummy comment line, to avoid errors with the Makefile
|
|
||||||
# "include basename.Plo" scheme.
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
icc)
|
|
||||||
# Intel's C compiler understands `-MD -MF file'. However on
|
|
||||||
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
|
|
||||||
# ICC 7.0 will fill foo.d with something like
|
|
||||||
# foo.o: sub/foo.c
|
|
||||||
# foo.o: sub/foo.h
|
|
||||||
# which is wrong. We want:
|
|
||||||
# sub/foo.o: sub/foo.c
|
|
||||||
# sub/foo.o: sub/foo.h
|
|
||||||
# sub/foo.c:
|
|
||||||
# sub/foo.h:
|
|
||||||
# ICC 7.1 will output
|
|
||||||
# foo.o: sub/foo.c sub/foo.h
|
|
||||||
# and will wrap long lines using \ :
|
|
||||||
# foo.o: sub/foo.c ... \
|
|
||||||
# sub/foo.h ... \
|
|
||||||
# ...
|
|
||||||
|
|
||||||
"$@" -MD -MF "$tmpdepfile"
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
rm -f "$depfile"
|
|
||||||
# Each line is of the form `foo.o: dependent.h',
|
|
||||||
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
|
|
||||||
# Do two passes, one to just change these to
|
|
||||||
# `$object: dependent.h' and one to simply `dependent.h:'.
|
|
||||||
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
|
|
||||||
# Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
# correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
|
|
||||||
sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
hp2)
|
|
||||||
# The "hp" stanza above does not work with aCC (C++) and HP's ia64
|
|
||||||
# compilers, which have integrated preprocessors. The correct option
|
|
||||||
# to use with these is +Maked; it writes dependencies to a file named
|
|
||||||
# 'foo.d', which lands next to the object file, wherever that
|
|
||||||
# happens to be.
|
|
||||||
# Much of this is similar to the tru64 case; see comments there.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir.libs/$base.d
|
|
||||||
"$@" -Wc,+Maked
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
"$@" +Maked
|
|
||||||
fi
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
|
|
||||||
# Add `dependent.h:' lines.
|
|
||||||
sed -ne '2,${
|
|
||||||
s/^ *//
|
|
||||||
s/ \\*$//
|
|
||||||
s/$/:/
|
|
||||||
p
|
|
||||||
}' "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile2"
|
|
||||||
;;
|
|
||||||
|
|
||||||
tru64)
|
|
||||||
# The Tru64 compiler uses -MD to generate dependencies as a side
|
|
||||||
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
|
|
||||||
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
|
|
||||||
# dependencies in `foo.d' instead, so we check for that too.
|
|
||||||
# Subdirectories are respected.
|
|
||||||
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
|
|
||||||
test "x$dir" = "x$object" && dir=
|
|
||||||
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
|
|
||||||
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
# With Tru64 cc, shared objects can also be used to make a
|
|
||||||
# static library. This mechanism is used in libtool 1.4 series to
|
|
||||||
# handle both shared and static libraries in a single compilation.
|
|
||||||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
|
||||||
#
|
|
||||||
# With libtool 1.5 this exception was removed, and libtool now
|
|
||||||
# generates 2 separate objects for the 2 libraries. These two
|
|
||||||
# compilations output dependencies in $dir.libs/$base.o.d and
|
|
||||||
# in $dir$base.o.d. We have to check for both files, because
|
|
||||||
# one of the two compilations can be disabled. We should prefer
|
|
||||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
|
||||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
|
||||||
# the former would cause a distcleancheck panic.
|
|
||||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
|
||||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
|
||||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
|
||||||
"$@" -Wc,-MD
|
|
||||||
else
|
|
||||||
tmpdepfile1=$dir$base.o.d
|
|
||||||
tmpdepfile2=$dir$base.d
|
|
||||||
tmpdepfile3=$dir$base.d
|
|
||||||
tmpdepfile4=$dir$base.d
|
|
||||||
"$@" -MD
|
|
||||||
fi
|
|
||||||
|
|
||||||
stat=$?
|
|
||||||
if test $stat -eq 0; then :
|
|
||||||
else
|
|
||||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
exit $stat
|
|
||||||
fi
|
|
||||||
|
|
||||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
|
||||||
do
|
|
||||||
test -f "$tmpdepfile" && break
|
|
||||||
done
|
|
||||||
if test -f "$tmpdepfile"; then
|
|
||||||
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
|
|
||||||
# That's a tab and a space in the [].
|
|
||||||
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
|
|
||||||
else
|
|
||||||
echo "#dummy" > "$depfile"
|
|
||||||
fi
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
#nosideeffect)
|
|
||||||
# This comment above is used by automake to tell side-effect
|
|
||||||
# dependency tracking mechanisms from slower ones.
|
|
||||||
|
|
||||||
dashmstdout)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout, regardless of -o.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
test -z "$dashmflag" && dashmflag=-M
|
|
||||||
# Require at least two characters before searching for `:'
|
|
||||||
# in the target name. This is to cope with DOS-style filenames:
|
|
||||||
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
|
|
||||||
"$@" $dashmflag |
|
|
||||||
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
tr ' ' '
|
|
||||||
' < "$tmpdepfile" | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
dashXmstdout)
|
|
||||||
# This case only exists to satisfy depend.m4. It is never actually
|
|
||||||
# run, as this mode is specially recognized in the preamble.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
makedepend)
|
|
||||||
"$@" || exit $?
|
|
||||||
# Remove any Libtool call
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
# X makedepend
|
|
||||||
shift
|
|
||||||
cleared=no eat=no
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $cleared in
|
|
||||||
no)
|
|
||||||
set ""; shift
|
|
||||||
cleared=yes ;;
|
|
||||||
esac
|
|
||||||
if test $eat = yes; then
|
|
||||||
eat=no
|
|
||||||
continue
|
|
||||||
fi
|
|
||||||
case "$arg" in
|
|
||||||
-D*|-I*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
# Strip any option that makedepend may not understand. Remove
|
|
||||||
# the object too, otherwise makedepend will parse it as a source file.
|
|
||||||
-arch)
|
|
||||||
eat=yes ;;
|
|
||||||
-*|$object)
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"; shift ;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
obj_suffix=`echo "$object" | sed 's/^.*\././'`
|
|
||||||
touch "$tmpdepfile"
|
|
||||||
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
|
|
||||||
rm -f "$depfile"
|
|
||||||
cat < "$tmpdepfile" > "$depfile"
|
|
||||||
sed '1,2d' "$tmpdepfile" | tr ' ' '
|
|
||||||
' | \
|
|
||||||
## Some versions of the HPUX 10.20 sed can't process this invocation
|
|
||||||
## correctly. Breaking it into two sed invocations is a workaround.
|
|
||||||
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile" "$tmpdepfile".bak
|
|
||||||
;;
|
|
||||||
|
|
||||||
cpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Remove `-o $object'.
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case $arg in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift # fnord
|
|
||||||
shift # $arg
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
"$@" -E |
|
|
||||||
sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
|
||||||
-e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
|
|
||||||
sed '$ s: \\$::' > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
cat < "$tmpdepfile" >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvisualcpp)
|
|
||||||
# Important note: in order to support this mode, a compiler *must*
|
|
||||||
# always write the preprocessed file to stdout.
|
|
||||||
"$@" || exit $?
|
|
||||||
|
|
||||||
# Remove the call to Libtool.
|
|
||||||
if test "$libtool" = yes; then
|
|
||||||
while test "X$1" != 'X--mode=compile'; do
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
shift
|
|
||||||
fi
|
|
||||||
|
|
||||||
IFS=" "
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
case "$arg" in
|
|
||||||
-o)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
$object)
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
|
|
||||||
set fnord "$@"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
set fnord "$@" "$arg"
|
|
||||||
shift
|
|
||||||
shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
"$@" -E 2>/dev/null |
|
|
||||||
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile"
|
|
||||||
rm -f "$depfile"
|
|
||||||
echo "$object : \\" > "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
|
|
||||||
echo " " >> "$depfile"
|
|
||||||
sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile"
|
|
||||||
rm -f "$tmpdepfile"
|
|
||||||
;;
|
|
||||||
|
|
||||||
msvcmsys)
|
|
||||||
# This case exists only to let depend.m4 do its work. It works by
|
|
||||||
# looking at the text of this script. This case will never be run,
|
|
||||||
# since it is checked for above.
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
none)
|
|
||||||
exec "$@"
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo "Unknown depmode $depmode" 1>&2
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local Variables:
|
|
||||||
# mode: shell-script
|
|
||||||
# sh-indentation: 2
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
|
@ -1,240 +0,0 @@
|
||||||
#! /bin/csh -f
|
|
||||||
#
|
|
||||||
# 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 © 2010 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# $COPYRIGHT$
|
|
||||||
#
|
|
||||||
# Additional copyrights may follow
|
|
||||||
#
|
|
||||||
# $HEADER$
|
|
||||||
#
|
|
||||||
|
|
||||||
set builddir="`pwd`"
|
|
||||||
|
|
||||||
set srcdir="$1"
|
|
||||||
cd "$srcdir"
|
|
||||||
set srcdir=`pwd`
|
|
||||||
cd "$builddir"
|
|
||||||
|
|
||||||
set distdir="$builddir/$2"
|
|
||||||
set HWLOC_VERSION="$3"
|
|
||||||
set HWLOC_REPO_REV="$4"
|
|
||||||
|
|
||||||
if ("$distdir" == "") then
|
|
||||||
echo "Must supply relative distdir as argv[2] -- aborting"
|
|
||||||
exit 1
|
|
||||||
elif ("$HWLOC_VERSION" == "") then
|
|
||||||
echo "Must supply version as argv[1] -- aborting"
|
|
||||||
exit 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
#========================================================================
|
|
||||||
|
|
||||||
if ("$srcdir" != "$builddir") then
|
|
||||||
set vpath=1
|
|
||||||
set vpath_msg=yes
|
|
||||||
else
|
|
||||||
set vpath=0
|
|
||||||
set vpath_msg=no
|
|
||||||
endif
|
|
||||||
|
|
||||||
# We can catch some hard (but possible) to do mistakes by looking at
|
|
||||||
# our tree's revision number, but only if we are in the source tree.
|
|
||||||
# Otherwise, use what configure told us, at the cost of allowing one
|
|
||||||
# or two corner cases in (but otherwise VPATH builds won't work).
|
|
||||||
set repo_rev=$HWLOC_REPO_REV
|
|
||||||
if (-d .svn) then
|
|
||||||
set repo_rev="r`svnversion .`"
|
|
||||||
endif
|
|
||||||
|
|
||||||
set start=`date`
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
Creating hwloc distribution
|
|
||||||
In directory: `pwd`
|
|
||||||
Srcdir: $srcdir
|
|
||||||
Builddir: $builddir
|
|
||||||
VPATH: $vpath_msg
|
|
||||||
Version: $HWLOC_VERSION
|
|
||||||
Started: $start
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
||||||
umask 022
|
|
||||||
|
|
||||||
if (! -d "$distdir") then
|
|
||||||
echo "*** ERROR: dist dir does not exist"
|
|
||||||
echo "*** ERROR: $distdir"
|
|
||||||
exit 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# See if we need to update the version file with the current repo
|
|
||||||
# revision number. Do this *before* entering the distribution tree to
|
|
||||||
# solve a whole host of problems with VPATH (since srcdir may be
|
|
||||||
# relative or absolute)
|
|
||||||
#
|
|
||||||
set cur_repo_rev="`grep '^repo_rev' ${distdir}/VERSION | cut -d= -f2`"
|
|
||||||
if ("$cur_repo_rev" == "-1") then
|
|
||||||
sed -e 's/^repo_rev=.*/repo_rev='$repo_rev'/' "${distdir}/VERSION" > "${distdir}/version.new"
|
|
||||||
cp "${distdir}/version.new" "${distdir}/VERSION"
|
|
||||||
rm -f "${distdir}/version.new"
|
|
||||||
# need to reset the timestamp to not annoy AM dependencies
|
|
||||||
touch -r "${srcdir}/VERSION" "${distdir}/VERSION"
|
|
||||||
echo "*** Updated VERSION file with repo rev number: $repo_rev"
|
|
||||||
else
|
|
||||||
echo "*** Did NOT update VERSION file with repo rev number"
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# VPATH builds only work if the srcdir has valid docs already built.
|
|
||||||
# If we're VPATH and the srcdir doesn't have valid docs, then fail.
|
|
||||||
#
|
|
||||||
|
|
||||||
if ($vpath == 1 && ! -d $srcdir/doc/doxygen-doc) then
|
|
||||||
echo "*** This is a VPATH 'make dist', but the srcdir does not already"
|
|
||||||
echo "*** have a doxygen-doc tree built. hwloc's config/distscript.csh"
|
|
||||||
echo "*** requores the docs to be built in the srcdir before executing"
|
|
||||||
echo "*** 'make dist' in a VPATH build."
|
|
||||||
exit 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
#
|
|
||||||
# If we're not VPATH, force the generation of new doxygen documentation
|
|
||||||
#
|
|
||||||
|
|
||||||
if ($vpath == 0) then
|
|
||||||
# Not VPATH
|
|
||||||
echo "*** Making new doxygen documentation (doxygen-doc tree)"
|
|
||||||
echo "*** Directory: srcdir: $srcdir, distdir: $distdir, pwd: `pwd`"
|
|
||||||
cd doc
|
|
||||||
# We're still in the src tree, so kill any previous doxygen-docs
|
|
||||||
# tree and make a new one.
|
|
||||||
chmod -R a=rwx doxygen-doc
|
|
||||||
rm -rf doxygen-doc
|
|
||||||
make
|
|
||||||
if ($status != 0) then
|
|
||||||
echo ERROR: generating doxygen docs failed
|
|
||||||
echo ERROR: cannot continue
|
|
||||||
exit 1
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Make new README file
|
|
||||||
echo "*** Making new README"
|
|
||||||
make readme
|
|
||||||
if ($status != 0) then
|
|
||||||
echo ERROR: generating new README failed
|
|
||||||
echo ERROR: cannot continue
|
|
||||||
exit 1
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
echo "*** This is a VPATH build; assuming that the doxygen docs and REAME"
|
|
||||||
echo "*** are current in the srcdir (i.e., we'll just copy those)"
|
|
||||||
endif
|
|
||||||
|
|
||||||
echo "*** Copying doxygen-doc tree to dist..."
|
|
||||||
echo "*** Directory: srcdir: $srcdir, distdir: $distdir, pwd: `pwd`"
|
|
||||||
chmod -R a=rwx $distdir/doc/doxygen-doc
|
|
||||||
echo rm -rf $distdir/doc/doxygen-doc
|
|
||||||
rm -rf $distdir/doc/doxygen-doc
|
|
||||||
echo cp -rpf $srcdir/doc/doxygen-doc $distdir/doc
|
|
||||||
cp -rpf $srcdir/doc/doxygen-doc $distdir/doc
|
|
||||||
|
|
||||||
echo "*** Copying new README"
|
|
||||||
ls -lf $distdir/README
|
|
||||||
cp -pf $srcdir/README $distdir
|
|
||||||
|
|
||||||
#########################################################
|
|
||||||
# VERY IMPORTANT: Now go into the new distribution tree #
|
|
||||||
#########################################################
|
|
||||||
cd "$distdir"
|
|
||||||
echo "*** Now in distdir: $distdir"
|
|
||||||
|
|
||||||
#
|
|
||||||
# Remove all the latex source files from the distribution tree (the
|
|
||||||
# PDFs are still there; we're just removing the latex source because
|
|
||||||
# some of the filenames get really, really long...).
|
|
||||||
#
|
|
||||||
|
|
||||||
echo "*** Removing latex source from dist tree"
|
|
||||||
rm -rf doc/doxygen-doc/latex
|
|
||||||
|
|
||||||
#
|
|
||||||
# Get the latest config.guess and config.sub from ftp.gnu.org
|
|
||||||
#
|
|
||||||
|
|
||||||
echo "*** Downloading latest config.sub/config.guess from ftp.gnu.org..."
|
|
||||||
cd config
|
|
||||||
set configdir="`pwd`"
|
|
||||||
mkdir tmp.$$
|
|
||||||
cd tmp.$$
|
|
||||||
# Official HTTP git mirrors for config.guess / config.sub
|
|
||||||
wget -t 1 -T 10 -O config.guess 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=master'
|
|
||||||
wget -t 1 -T 10 -O config.sub 'http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=master'
|
|
||||||
chmod +x config.guess config.sub
|
|
||||||
|
|
||||||
# Recently, ftp.gnu.org has had zero-legnth config.guess / config.sub
|
|
||||||
# files, which causes the automated nightly SVN snapshot tarball to
|
|
||||||
# fail to be made correctly. This is a primitive attempt to fix that.
|
|
||||||
# If we got zero-length files from wget, use a config.guess /
|
|
||||||
# config.sub from a known location that is more recent than what ships
|
|
||||||
# in the current generation of auto* tools. Also check to ensure that
|
|
||||||
# the resulting scripts are runnable (Jan 2009: there are un-runnable
|
|
||||||
# scripts available right now because of some git vulnerability).
|
|
||||||
|
|
||||||
# Before you complain about this too loudly, remember that we're using
|
|
||||||
# unreleased software...
|
|
||||||
|
|
||||||
set happy=0
|
|
||||||
if (! -f config.guess || ! -s config.guess) then
|
|
||||||
echo " - WARNING: Got bad config.guess from ftp.gnu.org (non-existent or empty)"
|
|
||||||
else
|
|
||||||
./config.guess >& /dev/null
|
|
||||||
if ($status != 0) then
|
|
||||||
echo " - WARNING: Got bad config.guess from ftp.gnu.org (not executable)"
|
|
||||||
else
|
|
||||||
if (! -f config.sub || ! -s config.sub) then
|
|
||||||
echo " - WARNING: Got bad config.sub from ftp.gnu.org (non-existent or empty)"
|
|
||||||
else
|
|
||||||
./config.sub `./config.guess` >& /dev/null
|
|
||||||
if ($status != 0) then
|
|
||||||
echo " - WARNING: Got bad config.sub from ftp.gnu.org (not executable)"
|
|
||||||
else
|
|
||||||
echo " - Got good config.guess and config.sub from ftp.gnu.org"
|
|
||||||
chmod +w ../config.sub ../config.guess
|
|
||||||
cp config.sub config.guess ..
|
|
||||||
set happy=1
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
if ("$happy" == "0") then
|
|
||||||
echo " - WARNING: using included versions for both config.sub and config.guess"
|
|
||||||
endif
|
|
||||||
cd ..
|
|
||||||
rm -rf tmp.$$
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
#
|
|
||||||
# All done
|
|
||||||
#
|
|
||||||
|
|
||||||
cat <<EOF
|
|
||||||
*** hwloc version $HWLOC_VERSION distribution created
|
|
||||||
|
|
||||||
Started: $start
|
|
||||||
Ended: `date`
|
|
||||||
|
|
||||||
EOF
|
|
||||||
|
|
|
@ -1,707 +0,0 @@
|
||||||
dnl -*- Autoconf -*-
|
|
||||||
dnl
|
|
||||||
dnl Copyright (c) 2009-2010 INRIA. All rights reserved.
|
|
||||||
dnl Copyright (c) 2009-2011 Université Bordeaux 1
|
|
||||||
dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
||||||
dnl University Research and Technology
|
|
||||||
dnl Corporation. All rights reserved.
|
|
||||||
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
|
||||||
dnl All rights reserved.
|
|
||||||
dnl Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
|
|
||||||
dnl University of Stuttgart. All rights reserved.
|
|
||||||
dnl Copyright © 2006-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
dnl See COPYING in top-level directory.
|
|
||||||
|
|
||||||
# Main hwloc m4 macro, to be invoked by the user
|
|
||||||
#
|
|
||||||
# Expects two or three paramters:
|
|
||||||
# 1. Configuration prefix
|
|
||||||
# 2. What to do upon success
|
|
||||||
# 3. What to do upon failure
|
|
||||||
# 4. If non-empty, print the announcement banner
|
|
||||||
#
|
|
||||||
AC_DEFUN([HWLOC_SETUP_CORE],[
|
|
||||||
AC_REQUIRE([AC_CANONICAL_TARGET])
|
|
||||||
AC_REQUIRE([AC_PROG_CC])
|
|
||||||
|
|
||||||
AS_IF([test "x$4" != "x"],
|
|
||||||
[cat <<EOF
|
|
||||||
|
|
||||||
###
|
|
||||||
### Configuring hwloc core
|
|
||||||
###
|
|
||||||
EOF])
|
|
||||||
|
|
||||||
# If no prefix was defined, set a good value
|
|
||||||
m4_ifval([$1],
|
|
||||||
[m4_define([hwloc_config_prefix],[$1/])],
|
|
||||||
[m4_define([hwloc_config_prefix], [])])
|
|
||||||
|
|
||||||
# Unless previously set to "standalone" mode, default to embedded
|
|
||||||
# mode
|
|
||||||
AS_IF([test "$hwloc_mode" = ""], [hwloc_mode=embedded])
|
|
||||||
AC_MSG_CHECKING([hwloc building mode])
|
|
||||||
AC_MSG_RESULT([$hwloc_mode])
|
|
||||||
|
|
||||||
# Get hwloc's absolute top builddir (which may not be the same as
|
|
||||||
# the real $top_builddir, because we may be building in embedded
|
|
||||||
# mode).
|
|
||||||
HWLOC_startdir=`pwd`
|
|
||||||
if test x"hwloc_config_prefix" != "x" -a ! -d "hwloc_config_prefix"; then
|
|
||||||
mkdir -p "hwloc_config_prefix"
|
|
||||||
fi
|
|
||||||
if test x"hwloc_config_prefix" != "x"; then
|
|
||||||
cd "hwloc_config_prefix"
|
|
||||||
fi
|
|
||||||
HWLOC_top_builddir=`pwd`
|
|
||||||
AC_SUBST(HWLOC_top_builddir)
|
|
||||||
|
|
||||||
# Get hwloc's absolute top srcdir (which may not be the same as
|
|
||||||
# the real $top_srcdir, because we may be building in embedded
|
|
||||||
# mode). First, go back to the startdir incase the $srcdir is
|
|
||||||
# relative.
|
|
||||||
|
|
||||||
cd "$HWLOC_startdir"
|
|
||||||
cd "$srcdir"/hwloc_config_prefix
|
|
||||||
HWLOC_top_srcdir="`pwd`"
|
|
||||||
AC_SUBST(HWLOC_top_srcdir)
|
|
||||||
|
|
||||||
# Go back to where we started
|
|
||||||
cd "$HWLOC_startdir"
|
|
||||||
|
|
||||||
AC_MSG_NOTICE([hwloc builddir: $HWLOC_top_builddir])
|
|
||||||
AC_MSG_NOTICE([hwloc srcdir: $HWLOC_top_srcdir])
|
|
||||||
if test "$HWLOC_top_builddir" != "$HWLOC_top_srcdir"; then
|
|
||||||
AC_MSG_NOTICE([Detected VPATH build])
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Debug mode?
|
|
||||||
AC_MSG_CHECKING([if want hwloc maintainer support])
|
|
||||||
hwloc_debug=
|
|
||||||
|
|
||||||
# Unconditionally disable debug mode in embedded mode; if someone
|
|
||||||
# asks, we can add a configure-time option for it. Disable it
|
|
||||||
# now, however, because --enable-debug is not even added as an
|
|
||||||
# option when configuring in embedded mode, and we wouldn't want
|
|
||||||
# to hijack the enclosing application's --enable-debug configure
|
|
||||||
# switch.
|
|
||||||
AS_IF([test "$hwloc_mode" = "embedded"],
|
|
||||||
[hwloc_debug=0
|
|
||||||
hwloc_debug_msg="disabled (embedded mode)"])
|
|
||||||
AS_IF([test "$hwloc_debug" = "" -a "$enable_debug" = "yes"],
|
|
||||||
[hwloc_debug=1
|
|
||||||
hwloc_debug_msg="enabled"])
|
|
||||||
AS_IF([test "$hwloc_debug" = ""],
|
|
||||||
[hwloc_debug=0
|
|
||||||
hwloc_debug_msg="disabled"])
|
|
||||||
# Grr; we use #ifndef for HWLOC_DEBUG! :-(
|
|
||||||
AH_TEMPLATE(HWLOC_DEBUG, [Whether we are in debugging mode or not])
|
|
||||||
AS_IF([test "$hwloc_debug" = "1"], [AC_DEFINE([HWLOC_DEBUG])])
|
|
||||||
AC_MSG_RESULT([$hwloc_debug_msg])
|
|
||||||
|
|
||||||
# We need to set a path for header, etc files depending on whether
|
|
||||||
# we're standalone or embedded. this is taken care of by HWLOC_EMBEDDED.
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for hwloc directory prefix])
|
|
||||||
AC_MSG_RESULT(m4_ifval([$1], hwloc_config_prefix, [(none)]))
|
|
||||||
|
|
||||||
# Note that private/config.h *MUST* be listed first so that it
|
|
||||||
# becomes the "main" config header file. Any AC-CONFIG-HEADERS
|
|
||||||
# after that (hwloc/config.h) will only have selective #defines
|
|
||||||
# replaced, not the entire file.
|
|
||||||
AC_CONFIG_HEADERS(hwloc_config_prefix[include/private/autogen/config.h])
|
|
||||||
AC_CONFIG_HEADERS(hwloc_config_prefix[include/hwloc/autogen/config.h])
|
|
||||||
|
|
||||||
# What prefix are we using?
|
|
||||||
AC_MSG_CHECKING([for hwloc symbol prefix])
|
|
||||||
AS_IF([test "$hwloc_symbol_prefix_value" = ""],
|
|
||||||
[AS_IF([test "$with_hwloc_symbol_prefix" = ""],
|
|
||||||
[hwloc_symbol_prefix_value=hwloc_],
|
|
||||||
[hwloc_symbol_prefix_value=$with_hwloc_symbol_prefix])])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_SYM_PREFIX, [$hwloc_symbol_prefix_value],
|
|
||||||
[The hwloc symbol prefix])
|
|
||||||
# Ensure to [] escape the whole next line so that we can get the
|
|
||||||
# proper tr tokens
|
|
||||||
[hwloc_symbol_prefix_value_caps="`echo $hwloc_symbol_prefix_value | tr '[:lower:]' '[:upper:]'`"]
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_SYM_PREFIX_CAPS, [$hwloc_symbol_prefix_value_caps],
|
|
||||||
[The hwloc symbol prefix in all caps])
|
|
||||||
AC_MSG_RESULT([$hwloc_symbol_prefix_value])
|
|
||||||
|
|
||||||
# Give an easy #define to know if we need to transform all the
|
|
||||||
# hwloc names
|
|
||||||
AH_TEMPLATE([HWLOC_SYM_TRANSFORM], [Whether we need to re-define all the hwloc public symbols or not])
|
|
||||||
AS_IF([test "$hwloc_symbol_prefix_value" = "hwloc_"],
|
|
||||||
[AC_DEFINE([HWLOC_SYM_TRANSFORM], [0])],
|
|
||||||
[AC_DEFINE([HWLOC_SYM_TRANSFORM], [1])])
|
|
||||||
|
|
||||||
# GCC specifics.
|
|
||||||
if test "x$GCC" = "xyes"; then
|
|
||||||
HWLOC_GCC_CFLAGS="-Wall -Wmissing-prototypes -Wundef"
|
|
||||||
HWLOC_GCC_CFLAGS="$HWLOC_GCC_CFLAGS -Wpointer-arith -Wcast-align"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Enample system extensions for O_DIRECTORY, fdopen, fssl, etc.
|
|
||||||
AC_USE_SYSTEM_EXTENSIONS
|
|
||||||
AH_VERBATIM([USE_HPUX_SYSTEM_EXTENSIONS],
|
|
||||||
[/* Enable extensions on HP-UX. */
|
|
||||||
#ifndef _HPUX_SOURCE
|
|
||||||
# undef _HPUX_SOURCE
|
|
||||||
#endif
|
|
||||||
])
|
|
||||||
AC_DEFINE([_HPUX_SOURCE], [1], [Are we building for HP-UX?])
|
|
||||||
|
|
||||||
AC_LANG_PUSH([C])
|
|
||||||
|
|
||||||
# Check to see if we're producing a 32 or 64 bit executable by
|
|
||||||
# checking the sizeof void*. Note that AC CHECK_SIZEOF even works
|
|
||||||
# when cross compiling (!), according to the AC 2.64 docs. This
|
|
||||||
# check is needed because on some systems, you can instruct the
|
|
||||||
# compiler to specifically build 32 or 64 bit executables -- even
|
|
||||||
# though the $target may indicate something different.
|
|
||||||
AC_CHECK_SIZEOF([void *])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check OS support
|
|
||||||
#
|
|
||||||
AC_MSG_CHECKING([which OS support to include])
|
|
||||||
case ${target} in
|
|
||||||
*-*-linux*)
|
|
||||||
AC_DEFINE(HWLOC_LINUX_SYS, 1, [Define to 1 on Linux])
|
|
||||||
hwloc_linux=yes
|
|
||||||
AC_MSG_RESULT([Linux])
|
|
||||||
;;
|
|
||||||
*-*-irix*)
|
|
||||||
AC_DEFINE(HWLOC_IRIX_SYS, 1, [Define to 1 on Irix])
|
|
||||||
hwloc_irix=yes
|
|
||||||
AC_MSG_RESULT([IRIX])
|
|
||||||
;;
|
|
||||||
*-*-darwin*)
|
|
||||||
AC_DEFINE(HWLOC_DARWIN_SYS, 1, [Define to 1 on Darwin])
|
|
||||||
hwloc_darwin=yes
|
|
||||||
AC_MSG_RESULT([Darwin])
|
|
||||||
;;
|
|
||||||
*-*-solaris*)
|
|
||||||
AC_DEFINE(HWLOC_SOLARIS_SYS, 1, [Define to 1 on Solaris])
|
|
||||||
hwloc_solaris=yes
|
|
||||||
AC_MSG_RESULT([Solaris])
|
|
||||||
;;
|
|
||||||
*-*-aix*)
|
|
||||||
AC_DEFINE(HWLOC_AIX_SYS, 1, [Define to 1 on AIX])
|
|
||||||
hwloc_aix=yes
|
|
||||||
AC_MSG_RESULT([AIX])
|
|
||||||
;;
|
|
||||||
*-*-osf*)
|
|
||||||
AC_DEFINE(HWLOC_OSF_SYS, 1, [Define to 1 on OSF])
|
|
||||||
hwloc_osf=yes
|
|
||||||
AC_MSG_RESULT([OSF])
|
|
||||||
;;
|
|
||||||
*-*-hpux*)
|
|
||||||
AC_DEFINE(HWLOC_HPUX_SYS, 1, [Define to 1 on HP-UX])
|
|
||||||
hwloc_hpux=yes
|
|
||||||
AC_MSG_RESULT([HP-UX])
|
|
||||||
;;
|
|
||||||
*-*-mingw*|*-*-cygwin*)
|
|
||||||
AC_DEFINE(HWLOC_WIN_SYS, 1, [Define to 1 on WINDOWS])
|
|
||||||
hwloc_windows=yes
|
|
||||||
AC_MSG_RESULT([Windows])
|
|
||||||
;;
|
|
||||||
*-*-*freebsd*)
|
|
||||||
AC_DEFINE(HWLOC_FREEBSD_SYS, 1, [Define to 1 on *FREEBSD])
|
|
||||||
hwloc_freebsd=yes
|
|
||||||
AC_MSG_RESULT([FreeBSD])
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_MSG_RESULT([Unsupported! ($target)])
|
|
||||||
AC_DEFINE(HWLOC_UNSUPPORTED_SYS, 1, [Define to 1 on unsupported systems])
|
|
||||||
AC_MSG_WARN([***********************************************************])
|
|
||||||
AC_MSG_WARN([*** hwloc does not support this system.])
|
|
||||||
AC_MSG_WARN([*** hwloc will *attempt* to build (but it may not work).])
|
|
||||||
AC_MSG_WARN([*** hwloc run-time results may be reduced to showing just one processor.])
|
|
||||||
AC_MSG_WARN([*** You have been warned.])
|
|
||||||
AC_MSG_WARN([*** Pausing to give you time to read this message...])
|
|
||||||
AC_MSG_WARN([***********************************************************])
|
|
||||||
sleep 10
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check CPU support
|
|
||||||
#
|
|
||||||
AC_MSG_CHECKING([which CPU support to include])
|
|
||||||
case ${target} in
|
|
||||||
i*86-*-*|x86_64-*-*)
|
|
||||||
case ${ac_cv_sizeof_void_p} in
|
|
||||||
4)
|
|
||||||
AC_DEFINE(HWLOC_X86_32_ARCH, 1, [Define to 1 on x86_32])
|
|
||||||
hwloc_x86_32=yes
|
|
||||||
AC_MSG_RESULT([x86_32])
|
|
||||||
;;
|
|
||||||
8)
|
|
||||||
AC_DEFINE(HWLOC_X86_64_ARCH, 1, [Define to 1 on x86_64])
|
|
||||||
hwloc_x86_64=yes
|
|
||||||
AC_MSG_RESULT([x86_64])
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
AC_DEFINE(HWLOC_X86_64_ARCH, 1, [Define to 1 on x86_64])
|
|
||||||
hwloc_x86_64=yes
|
|
||||||
AC_MSG_RESULT([unknown -- assuming x86_64])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
esac
|
|
||||||
|
|
||||||
AC_CHECK_SIZEOF([unsigned long])
|
|
||||||
AC_DEFINE_UNQUOTED([HWLOC_SIZEOF_UNSIGNED_LONG], $ac_cv_sizeof_unsigned_long, [The size of `unsigned long', as computed by sizeof])
|
|
||||||
AC_CHECK_SIZEOF([unsigned int])
|
|
||||||
AC_DEFINE_UNQUOTED([HWLOC_SIZEOF_UNSIGNED_INT], $ac_cv_sizeof_unsigned_int, [The size of `unsigned int', as computed by sizeof])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check for compiler attributes and visibility
|
|
||||||
#
|
|
||||||
_HWLOC_CHECK_ATTRIBUTES
|
|
||||||
_HWLOC_CHECK_VISIBILITY
|
|
||||||
HWLOC_CFLAGS="$HWLOC_FLAGS $HWLOC_VISIBILITY_CFLAGS"
|
|
||||||
AS_IF([test "$HWLOC_VISIBILITY_CFLAGS" != ""],
|
|
||||||
[AC_MSG_WARN(["$HWLOC_VISIBILITY_CFLAGS" has been added to the hwloc CFLAGS])])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Check for inline compatibility support
|
|
||||||
#
|
|
||||||
AC_MSG_CHECKING([for inline compatibility keyword])
|
|
||||||
AC_TRY_COMPILE([static void __inline__ f(void) { }], [],
|
|
||||||
[__hwloc_inline=__inline__],
|
|
||||||
[AC_TRY_COMPILE([static void __inline f(void) {}], [],
|
|
||||||
[__hwloc_inline=__inline],
|
|
||||||
[__hwloc_inline=]
|
|
||||||
)]
|
|
||||||
)
|
|
||||||
AC_MSG_RESULT([$__hwloc_inline])
|
|
||||||
AC_DEFINE_UNQUOTED(__hwloc_inline, $__hwloc_inline, [Define this to a keyword that can safely replace inline in installed headers])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Now detect support
|
|
||||||
#
|
|
||||||
|
|
||||||
hwloc_strncasecmp=strncmp
|
|
||||||
AC_CHECK_FUNCS([strncasecmp], [
|
|
||||||
_HWLOC_CHECK_DECL([strncasecmp], [
|
|
||||||
hwloc_strncasecmp=strncasecmp
|
|
||||||
])
|
|
||||||
])
|
|
||||||
AC_DEFINE_UNQUOTED(hwloc_strncasecmp, $hwloc_strncasecmp, [Define this to either strncasecmp or strncmp])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([strftime])
|
|
||||||
AC_CHECK_FUNCS([setlocale])
|
|
||||||
|
|
||||||
AC_CHECK_HEADER([stdint.h], [
|
|
||||||
AC_DEFINE([HWLOC_HAVE_STDINT_H], [1], [Define to 1 if you have the <stdint.h> header file.])
|
|
||||||
])
|
|
||||||
AC_CHECK_HEADERS([sys/mman.h])
|
|
||||||
|
|
||||||
AC_CHECK_TYPES([KAFFINITY,
|
|
||||||
PROCESSOR_CACHE_TYPE,
|
|
||||||
CACHE_DESCRIPTOR,
|
|
||||||
LOGICAL_PROCESSOR_RELATIONSHIP,
|
|
||||||
RelationProcessorPackage,
|
|
||||||
SYSTEM_LOGICAL_PROCESSOR_INFORMATION,
|
|
||||||
GROUP_AFFINITY,
|
|
||||||
PROCESSOR_RELATIONSHIP,
|
|
||||||
NUMA_NODE_RELATIONSHIP,
|
|
||||||
CACHE_RELATIONSHIP,
|
|
||||||
PROCESSOR_GROUP_INFO,
|
|
||||||
GROUP_RELATIONSHIP,
|
|
||||||
SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX,
|
|
||||||
PSAPI_WORKING_SET_EX_BLOCK,
|
|
||||||
PSAPI_WORKING_SET_EX_INFORMATION],
|
|
||||||
[],[],[[#include <windows.h>]])
|
|
||||||
AC_CHECK_LIB([gdi32], [main],
|
|
||||||
[HWLOC_LIBS="-lgdi32 $HWLOC_LIBS"
|
|
||||||
AC_DEFINE([HAVE_LIBGDI32], 1, [Define to 1 if we have -lgdi32])])
|
|
||||||
|
|
||||||
AC_CHECK_HEADER([windows.h], [
|
|
||||||
AC_DEFINE([HWLOC_HAVE_WINDOWS_H], [1], [Define to 1 if you have the `windows.h' header.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([sys/lgrp_user.h], [
|
|
||||||
AC_CHECK_LIB([lgrp], [lgrp_latency_cookie],
|
|
||||||
[HWLOC_LIBS="-llgrp $HWLOC_LIBS"
|
|
||||||
AC_DEFINE([HAVE_LIBLGRP], 1, [Define to 1 if we have -llgrp])])
|
|
||||||
])
|
|
||||||
AC_CHECK_HEADERS([kstat.h], [
|
|
||||||
AC_CHECK_LIB([kstat], [main],
|
|
||||||
[HWLOC_LIBS="-lkstat $HWLOC_LIBS"
|
|
||||||
AC_DEFINE([HAVE_LIBKSTAT], 1, [Define to 1 if we have -lkstat])])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_DECLS([_SC_NPROCESSORS_ONLN,
|
|
||||||
_SC_NPROCESSORS_CONF,
|
|
||||||
_SC_NPROC_ONLN,
|
|
||||||
_SC_NPROC_CONF,
|
|
||||||
_SC_LARGE_PAGESIZE],,[:],[[#include <unistd.h>]])
|
|
||||||
|
|
||||||
AC_HAVE_HEADERS([mach/mach_host.h])
|
|
||||||
AC_HAVE_HEADERS([mach/mach_init.h], [
|
|
||||||
AC_CHECK_FUNCS([host_info])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([sys/param.h])
|
|
||||||
AC_CHECK_HEADERS([sys/sysctl.h], [
|
|
||||||
AC_CHECK_DECLS([CTL_HW, HW_NCPU],,,[[
|
|
||||||
#if HAVE_SYS_PARAM_H
|
|
||||||
#include <sys/param.h>
|
|
||||||
#endif
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
]])
|
|
||||||
],,[
|
|
||||||
AC_INCLUDES_DEFAULT
|
|
||||||
#if HAVE_SYS_PARAM_H
|
|
||||||
#include <sys/param.h>
|
|
||||||
#endif
|
|
||||||
])
|
|
||||||
AC_CHECK_FUNCS([sysctl sysctlbyname])
|
|
||||||
|
|
||||||
case ${target} in
|
|
||||||
*-*-mingw*|*-*-cygwin*)
|
|
||||||
hwloc_pid_t=HANDLE
|
|
||||||
hwloc_thread_t=HANDLE
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
hwloc_pid_t=pid_t
|
|
||||||
AC_CHECK_TYPES([pthread_t], [hwloc_thread_t=pthread_t], [:], [[#include <pthread.h>]])
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
AC_DEFINE_UNQUOTED(hwloc_pid_t, $hwloc_pid_t, [Define this to the process ID type])
|
|
||||||
if test "x$hwloc_thread_t" != "x" ; then
|
|
||||||
AC_DEFINE_UNQUOTED(hwloc_thread_t, $hwloc_thread_t, [Define this to the thread ID type])
|
|
||||||
fi
|
|
||||||
|
|
||||||
_HWLOC_CHECK_DECL([sched_setaffinity], [
|
|
||||||
AC_MSG_CHECKING([for old prototype of sched_setaffinity])
|
|
||||||
AC_COMPILE_IFELSE([
|
|
||||||
AC_LANG_PROGRAM([[
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <sched.h>
|
|
||||||
static unsigned long mask;
|
|
||||||
]], [[ sched_setaffinity(0, (void*) &mask); ]])],
|
|
||||||
[AC_DEFINE([HWLOC_HAVE_OLD_SCHED_SETAFFINITY], [1], [Define to 1 if glibc provides the old prototype of sched_setaffinity()])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
], , [[
|
|
||||||
#define _GNU_SOURCE
|
|
||||||
#include <sched.h>
|
|
||||||
]])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for working CPU_SET])
|
|
||||||
AC_LINK_IFELSE([
|
|
||||||
AC_LANG_PROGRAM([[
|
|
||||||
#include <sched.h>
|
|
||||||
cpu_set_t set;
|
|
||||||
]], [[ CPU_ZERO(&set); CPU_SET(0, &set);]])],
|
|
||||||
[AC_DEFINE([HWLOC_HAVE_CPU_SET], [1], [Define to 1 if the CPU_SET macro works])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for working CPU_SET_S])
|
|
||||||
AC_LINK_IFELSE([
|
|
||||||
AC_LANG_PROGRAM([[
|
|
||||||
#include <sched.h>
|
|
||||||
cpu_set_t *set;
|
|
||||||
]], [[
|
|
||||||
set = CPU_ALLOC(1024);
|
|
||||||
CPU_ZERO_S(CPU_ALLOC_SIZE(1024), set);
|
|
||||||
CPU_SET_S(CPU_ALLOC_SIZE(1024), 0, set);
|
|
||||||
CPU_FREE(set);
|
|
||||||
]])],
|
|
||||||
[AC_DEFINE([HWLOC_HAVE_CPU_SET_S], [1], [Define to 1 if the CPU_SET_S macro works])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for working _syscall3])
|
|
||||||
AC_LINK_IFELSE([
|
|
||||||
AC_LANG_PROGRAM([[
|
|
||||||
#include <linux/unistd.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#define __NR_hwloc_test 123
|
|
||||||
_syscall3(int, hwloc_test, int, param1, int, param2, int, param3);
|
|
||||||
]], [[ hwloc_test(1, 2, 3); ]])],
|
|
||||||
[AC_DEFINE([HWLOC_HAVE__SYSCALL3], [1], [Define to 1 if the _syscall3 macro works])
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
|
|
||||||
# Check for kerrighed, but don't abort if not found. It's illegal
|
|
||||||
# to pass in an empty 3rd argument, but we trust the output of
|
|
||||||
# pkg-config, so just give it a value that will always work:
|
|
||||||
# printf.
|
|
||||||
HWLOC_PKG_CHECK_MODULES([KERRIGHED], [kerrighed >= 2.0], [printf], [], [:])
|
|
||||||
|
|
||||||
AC_PATH_PROGS([HWLOC_MS_LIB], [lib])
|
|
||||||
AC_ARG_VAR([HWLOC_MS_LIB], [Path to Microsoft's Visual Studio `lib' tool])
|
|
||||||
|
|
||||||
AC_PATH_PROG([BASH], [bash])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([ffs], [
|
|
||||||
_HWLOC_CHECK_DECL([ffs],[
|
|
||||||
AC_DEFINE([HWLOC_HAVE_DECL_FFS], [1], [Define to 1 if function `ffs' is declared by system headers])
|
|
||||||
])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_FFS], [1], [Define to 1 if you have the `ffs' function.])
|
|
||||||
])
|
|
||||||
AC_CHECK_FUNCS([ffsl], [
|
|
||||||
_HWLOC_CHECK_DECL([ffsl],[
|
|
||||||
AC_DEFINE([HWLOC_HAVE_DECL_FFSL], [1], [Define to 1 if function `ffsl' is declared by system headers])
|
|
||||||
])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_FFSL], [1], [Define to 1 if you have the `ffsl' function.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([fls], [
|
|
||||||
_HWLOC_CHECK_DECL([fls],[
|
|
||||||
AC_DEFINE([HWLOC_HAVE_DECL_FLS], [1], [Define to 1 if function `fls' is declared by system headers])
|
|
||||||
])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_FLS], [1], [Define to 1 if you have the `fls' function.])
|
|
||||||
])
|
|
||||||
AC_CHECK_FUNCS([flsl], [
|
|
||||||
_HWLOC_CHECK_DECL([flsl],[
|
|
||||||
AC_DEFINE([HWLOC_HAVE_DECL_FLSL], [1], [Define to 1 if function `flsl' is declared by system headers])
|
|
||||||
])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_FLSL], [1], [Define to 1 if you have the `flsl' function.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([clz], [
|
|
||||||
_HWLOC_CHECK_DECL([clz],[
|
|
||||||
AC_DEFINE([HWLOC_HAVE_DECL_CLZ], [1], [Define to 1 if function `clz' is declared by system headers])
|
|
||||||
])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_CLZ], [1], [Define to 1 if you have the `clz' function.])
|
|
||||||
])
|
|
||||||
AC_CHECK_FUNCS([clzl], [
|
|
||||||
_HWLOC_CHECK_DECL([clzl],[
|
|
||||||
AC_DEFINE([HWLOC_HAVE_DECL_CLZL], [1], [Define to 1 if function `clzl' is declared by system headers])
|
|
||||||
])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_CLZL], [1], [Define to 1 if you have the `clzl' function.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_FUNCS([openat], [hwloc_have_openat=yes])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([malloc.h])
|
|
||||||
AC_CHECK_FUNCS([getpagesize memalign posix_memalign])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([sys/utsname.h])
|
|
||||||
AC_CHECK_FUNCS([uname])
|
|
||||||
|
|
||||||
# set_mempolicy and mbind support
|
|
||||||
AC_CHECK_HEADERS([numaif.h], [
|
|
||||||
AC_CHECK_LIB([numa], [set_mempolicy], [
|
|
||||||
enable_set_mempolicy=yes
|
|
||||||
AC_SUBST([HWLOC_LINUX_LIBNUMA_LIBS], ["-lnuma"])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_SET_MEMPOLICY], [1], [Define to 1 if set_mempolicy is available.])
|
|
||||||
])
|
|
||||||
AC_CHECK_LIB([numa], [mbind], [
|
|
||||||
enable_mbind=yes
|
|
||||||
AC_SUBST([HWLOC_LINUX_LIBNUMA_LIBS], ["-lnuma"])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_MBIND], [1], [Define to 1 if mbind is available.])
|
|
||||||
])
|
|
||||||
AC_CHECK_LIB([numa], [migrate_pages], [
|
|
||||||
enable_migrate_pages=yes
|
|
||||||
AC_SUBST([HWLOC_LINUX_LIBNUMA_LIBS], ["-lnuma"])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_MIGRATE_PAGES], [1], [Define to 1 if migrate_pages is available.])
|
|
||||||
])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([pthread_np.h])
|
|
||||||
AC_CHECK_DECLS([pthread_setaffinity_np],,[:],[[
|
|
||||||
#include <pthread.h>
|
|
||||||
#ifdef HAVE_PTHREAD_NP_H
|
|
||||||
# include <pthread_np.h>
|
|
||||||
#endif
|
|
||||||
]])
|
|
||||||
AC_CHECK_DECLS([pthread_getaffinity_np],,[:],[[
|
|
||||||
#include <pthread.h>
|
|
||||||
#ifdef HAVE_PTHREAD_NP_H
|
|
||||||
# include <pthread_np.h>
|
|
||||||
#endif
|
|
||||||
]])
|
|
||||||
AC_CHECK_FUNC([sched_setaffinity], [hwloc_have_sched_setaffinity=yes])
|
|
||||||
AC_CHECK_HEADERS([sys/cpuset.h],,,[[#include <sys/param.h>]])
|
|
||||||
AC_SEARCH_LIBS([pthread_getthrds_np], [pthread],
|
|
||||||
AC_DEFINE([HWLOC_HAVE_PTHREAD_GETTHRDS_NP], 1, `Define to 1 if you have pthread_getthrds_np')
|
|
||||||
)
|
|
||||||
|
|
||||||
# XML support
|
|
||||||
hwloc_xml_happy=
|
|
||||||
if test "x$enable_xml" != "xno"; then
|
|
||||||
HWLOC_PKG_CHECK_MODULES([XML], [libxml-2.0], [xmlNewDoc],
|
|
||||||
[hwloc_xml_happy=yes],
|
|
||||||
[hwloc_xml_happy=no])
|
|
||||||
fi
|
|
||||||
if test "x$hwloc_xml_happy" = "xyes"; then
|
|
||||||
HWLOC_REQUIRES="libxml-2.0 $HWLOC_REQUIRES"
|
|
||||||
AC_DEFINE([HWLOC_HAVE_XML], [1], [Define to 1 if you have the `xml' library.])
|
|
||||||
AC_SUBST([HWLOC_HAVE_XML], [1])
|
|
||||||
else
|
|
||||||
AC_SUBST([HWLOC_HAVE_XML], [0])
|
|
||||||
AS_IF([test "$enable_xml" = "yes"],
|
|
||||||
[AC_MSG_WARN([--enable-xml requested, but XML support was not found])
|
|
||||||
AC_MSG_ERROR([Cannot continue])])
|
|
||||||
fi
|
|
||||||
HWLOC_CFLAGS="$HWLOC_CFLAGS $HWLOC_XML_CFLAGS"
|
|
||||||
|
|
||||||
# Setup HWLOC's C, CPP, and LD flags, and LIBS
|
|
||||||
AC_SUBST(HWLOC_REQUIRES)
|
|
||||||
AC_SUBST(HWLOC_CFLAGS)
|
|
||||||
HWLOC_CPPFLAGS='-I$(HWLOC_top_srcdir)/include -I$(HWLOC_top_builddir)/include'
|
|
||||||
AC_SUBST(HWLOC_CPPFLAGS)
|
|
||||||
HWLOC_LDFLAGS='-L$(HWLOC_top_builddir)/src'
|
|
||||||
AC_SUBST(HWLOC_LDFLAGS)
|
|
||||||
AC_SUBST(HWLOC_LIBS)
|
|
||||||
|
|
||||||
# Set these values explicitly for embedded builds. Exporting
|
|
||||||
# these values through *_EMBEDDED_* values gives us the freedom to
|
|
||||||
# do something different someday if we ever need to.
|
|
||||||
HWLOC_EMBEDDED_CFLAGS=$HWLOC_CFLAGS
|
|
||||||
AC_SUBST(HWLOC_EMBEDDED_CFLAGS)
|
|
||||||
HWLOC_EMBEDDED_CPPFLAGS=$HWLOC_CPPFLAGS
|
|
||||||
AC_SUBST(HWLOC_EMBEDDED_CPPFLAGS)
|
|
||||||
HWLOC_EMBEDDED_LDADD='$(HWLOC_top_builddir)/src/libhwloc_embedded.la'
|
|
||||||
AC_SUBST(HWLOC_EMBEDDED_LDADD)
|
|
||||||
HWLOC_EMBEDDED_LIBS=$HWLOC_LIBS
|
|
||||||
AC_SUBST(HWLOC_EMBEDDED_LIBS)
|
|
||||||
|
|
||||||
# Try to compile the cpuid inlines
|
|
||||||
AC_MSG_CHECKING([for cpuid])
|
|
||||||
old_CPPFLAGS="$CPPFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -I$HWLOC_top_srcdir/include"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <private/cpuid.h>
|
|
||||||
]], [[
|
|
||||||
if (hwloc_have_cpuid()) {
|
|
||||||
unsigned eax = 0, ebx, ecx = 0, edx;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
printf("highest cpuid %x\n", eax);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
]])],
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
AC_DEFINE(HWLOC_HAVE_CPUID, 1, [Define to 1 if you have cpuid])
|
|
||||||
hwloc_have_cpuid=yes],
|
|
||||||
[AC_MSG_RESULT([no])])
|
|
||||||
CPPFLAGS="$old_CPPFLAGS"
|
|
||||||
|
|
||||||
# Always generate these files
|
|
||||||
AC_CONFIG_FILES(
|
|
||||||
hwloc_config_prefix[Makefile]
|
|
||||||
hwloc_config_prefix[include/Makefile]
|
|
||||||
hwloc_config_prefix[src/Makefile ]
|
|
||||||
)
|
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
AC_LANG_POP
|
|
||||||
|
|
||||||
# Success
|
|
||||||
$2
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Specify the symbol prefix
|
|
||||||
AC_DEFUN([HWLOC_SET_SYMBOL_PREFIX],[
|
|
||||||
hwloc_symbol_prefix_value=$1
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# This must be a standalone routine so that it can be called both by
|
|
||||||
# HWLOC_INIT and an external caller (if HWLOC_INIT is not invoked).
|
|
||||||
AC_DEFUN([HWLOC_DO_AM_CONDITIONALS],[
|
|
||||||
AS_IF([test "$hwloc_did_am_conditionals" != "yes"],[
|
|
||||||
AM_CONDITIONAL([HWLOC_BUILD_STANDALONE], [test "$hwloc_mode" = "standalone"])
|
|
||||||
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_GCC], [test "x$GCC" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_MS_LIB], [test "x$HWLOC_MS_LIB" != "x"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_OPENAT], [test "x$hwloc_have_openat" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_LINUX_LIBNUMA],
|
|
||||||
[test "x$hwloc_have_linux_libnuma" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_SCHED_SETAFFINITY],
|
|
||||||
[test "x$hwloc_have_sched_setaffinity" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_LIBIBVERBS],
|
|
||||||
[test "x$hwloc_have_libibverbs" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_CUDA],
|
|
||||||
[test "x$hwloc_have_cuda" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_MYRIEXPRESS],
|
|
||||||
[test "x$hwloc_have_myriexpress" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_CUDART],
|
|
||||||
[test "x$hwloc_have_cudart" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_CAIRO], [test "x$enable_cairo" != "xno"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_XML], [test "$hwloc_xml_happy" = "yes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_SET_MEMPOLICY], [test "x$enable_set_mempolicy" != "xno"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_MBIND], [test "x$enable_mbind" != "xno"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_BUNZIPP], [test "x$BUNZIPP" != "xfalse"])
|
|
||||||
|
|
||||||
AM_CONDITIONAL([HWLOC_BUILD_DOXYGEN],
|
|
||||||
[test "x$hwloc_generate_doxs" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_BUILD_README],
|
|
||||||
[test "x$hwloc_generate_readme" = "xyes" -a \( "x$hwloc_install_doxs" = "xyes" -o "x$hwloc_generate_doxs" = "xyes" \) ])
|
|
||||||
AM_CONDITIONAL([HWLOC_INSTALL_DOXYGEN],
|
|
||||||
[test "x$hwloc_install_doxs" = "xyes"])
|
|
||||||
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_LINUX], [test "x$hwloc_linux" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_IRIX], [test "x$hwloc_irix" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_DARWIN], [test "x$hwloc_darwin" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_FREEBSD], [test "x$hwloc_freebsd" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_SOLARIS], [test "x$hwloc_solaris" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_AIX], [test "x$hwloc_aix" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_OSF], [test "x$hwloc_osf" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_HPUX], [test "x$hwloc_hpux" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_WINDOWS], [test "x$hwloc_windows" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_MINGW32], [test "x$target_os" = "xmingw32"])
|
|
||||||
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_X86_32], [test "x$hwloc_x86_32" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_X86_64], [test "x$hwloc_x86_64" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_DOXYGEN_BROKEN_SHORT_NAMES], [test "$HWLOC_DOXYGEN_VERSION" = "1.6.2"])
|
|
||||||
AM_CONDITIONAL([HWLOC_HAVE_CPUID], [test "x$hwloc_have_cpuid" = "xyes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_BUILD_UTILS], [test "$hwloc_build_utils" = "yes"])
|
|
||||||
AM_CONDITIONAL([HWLOC_BUILD_TESTS], [test "$hwloc_build_tests" = "yes"])
|
|
||||||
])
|
|
||||||
hwloc_did_am_conditionals=yes
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
AC_DEFUN([_HWLOC_CHECK_DIFF_U], [
|
|
||||||
AC_MSG_CHECKING([whether diff accepts -u])
|
|
||||||
if diff -u /dev/null /dev/null 2> /dev/null
|
|
||||||
then
|
|
||||||
HWLOC_DIFF_U="-u"
|
|
||||||
else
|
|
||||||
HWLOC_DIFF_U=""
|
|
||||||
fi
|
|
||||||
AC_SUBST([HWLOC_DIFF_U])
|
|
||||||
AC_MSG_RESULT([$HWLOC_DIFF_U])
|
|
||||||
])
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
dnl HWLOC_CHECK_DECL
|
|
||||||
dnl
|
|
||||||
dnl Check declaration of given function by trying to call it with an insane
|
|
||||||
dnl number of arguments (10). Success means the compiler couldn't really check.
|
|
||||||
AC_DEFUN([_HWLOC_CHECK_DECL], [
|
|
||||||
AC_MSG_CHECKING([whether function $1 is declared])
|
|
||||||
AC_REQUIRE([AC_PROG_CC])
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$4])],[$1(1,2,3,4,5,6,7,8,9,10);])],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
$3],
|
|
||||||
[AC_MSG_RESULT([yes])
|
|
||||||
$2]
|
|
||||||
)
|
|
||||||
])
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
dnl HWLOC_CHECK_DECLS
|
|
||||||
dnl
|
|
||||||
dnl Same as HWLOCK_CHECK_DECL, but defines HAVE_DECL_foo to 1 or 0 depending on
|
|
||||||
dnl the result.
|
|
||||||
AC_DEFUN([_HWLOC_CHECK_DECLS], [
|
|
||||||
HWLOC_CHECK_DECL([$1], [ac_have_decl=1], [ac_have_decl=0], [$4])
|
|
||||||
AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE_DECL_$1]), [$ac_have_decl],
|
|
||||||
[Define to 1 if you have the declaration of `$1', and to 0 if you don't])
|
|
||||||
])
|
|
||||||
|
|
|
@ -1,533 +0,0 @@
|
||||||
# This macro set originally copied from Open MPI:
|
|
||||||
# Copyright (c) 2004-2007 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-2007 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.
|
|
||||||
# and renamed for hwloc:
|
|
||||||
# Copyright (c) 2009 INRIA. All rights reserved.
|
|
||||||
# Copyright (c) 2009 Université Bordeaux 1
|
|
||||||
# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# - Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# - Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer listed
|
|
||||||
# in this license in the documentation and/or other materials
|
|
||||||
# provided with the distribution.
|
|
||||||
#
|
|
||||||
# - Neither the name of the copyright holders nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# The copyright holders provide no reassurances that the source code
|
|
||||||
# provided does not infringe any patent, copyright, or any other
|
|
||||||
# intellectual property rights of third parties. The copyright holders
|
|
||||||
# disclaim any liability to any recipient for claims brought against
|
|
||||||
# recipient by any third party for infringement of that parties
|
|
||||||
# intellectual property rights.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Search the generated warnings for
|
|
||||||
# keywords regarding skipping or ignoring certain attributes
|
|
||||||
# Intel: ignore
|
|
||||||
# Sun C++: skip
|
|
||||||
#
|
|
||||||
AC_DEFUN([_HWLOC_ATTRIBUTE_FAIL_SEARCH],[
|
|
||||||
# Be safe for systems that have ancient Autoconf's (e.g., RHEL5)
|
|
||||||
m4_ifdef([AC_PROG_GREP],
|
|
||||||
[AC_REQUIRE([AC_PROG_GREP])],
|
|
||||||
[GREP=grep])
|
|
||||||
|
|
||||||
if test -s conftest.err ; then
|
|
||||||
for i in ignore skip ; do
|
|
||||||
$GREP -iq $i conftest.err
|
|
||||||
if test "$?" = "0" ; then
|
|
||||||
hwloc_cv___attribute__[$1]=0
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
#
|
|
||||||
# HWLOC: Remove C++ compiler check. It can result in a circular
|
|
||||||
# dependency in embedded situations.
|
|
||||||
#
|
|
||||||
# Check for one specific attribute by compiling with C
|
|
||||||
# and possibly using a cross-check.
|
|
||||||
#
|
|
||||||
# If the cross-check is defined, a static function "usage" should be
|
|
||||||
# defined, which is to be called from main (to circumvent warnings
|
|
||||||
# regarding unused function in main file)
|
|
||||||
# static int usage (int * argument);
|
|
||||||
#
|
|
||||||
# The last argument is for specific CFLAGS, that need to be set
|
|
||||||
# for the compiler to generate a warning on the cross-check.
|
|
||||||
# This may need adaption for future compilers / CFLAG-settings.
|
|
||||||
#
|
|
||||||
AC_DEFUN([_HWLOC_CHECK_SPECIFIC_ATTRIBUTE], [
|
|
||||||
AC_MSG_CHECKING([for __attribute__([$1])])
|
|
||||||
AC_CACHE_VAL(hwloc_cv___attribute__[$1], [
|
|
||||||
#
|
|
||||||
# Try to compile using the C compiler
|
|
||||||
#
|
|
||||||
AC_TRY_COMPILE([$2],[],
|
|
||||||
[
|
|
||||||
#
|
|
||||||
# In case we did succeed: Fine, but was this due to the
|
|
||||||
# attribute being ignored/skipped? Grep for IgNoRe/skip in conftest.err
|
|
||||||
# and if found, reset the hwloc_cv__attribute__var=0
|
|
||||||
#
|
|
||||||
hwloc_cv___attribute__[$1]=1
|
|
||||||
_HWLOC_ATTRIBUTE_FAIL_SEARCH([$1])
|
|
||||||
],
|
|
||||||
[hwloc_cv___attribute__[$1]=0])
|
|
||||||
|
|
||||||
#
|
|
||||||
# If the attribute is supported by both compilers,
|
|
||||||
# try to recompile a *cross-check*, IFF defined.
|
|
||||||
#
|
|
||||||
if test '(' "$hwloc_cv___attribute__[$1]" = "1" -a "[$3]" != "" ')' ; then
|
|
||||||
ac_c_werror_flag_safe=$ac_c_werror_flag
|
|
||||||
ac_c_werror_flag="yes"
|
|
||||||
CFLAGS_safe=$CFLAGS
|
|
||||||
CFLAGS="$CFLAGS [$4]"
|
|
||||||
|
|
||||||
AC_TRY_COMPILE([$3],
|
|
||||||
[
|
|
||||||
int i=4711;
|
|
||||||
i=usage(&i);
|
|
||||||
],
|
|
||||||
[hwloc_cv___attribute__[$1]=0],
|
|
||||||
[
|
|
||||||
#
|
|
||||||
# In case we did NOT succeed: Fine, but was this due to the
|
|
||||||
# attribute being ignored? Grep for IgNoRe in conftest.err
|
|
||||||
# and if found, reset the hwloc_cv__attribute__var=0
|
|
||||||
#
|
|
||||||
hwloc_cv___attribute__[$1]=1
|
|
||||||
_HWLOC_ATTRIBUTE_FAIL_SEARCH([$1])
|
|
||||||
])
|
|
||||||
|
|
||||||
ac_c_werror_flag=$ac_c_werror_flag_safe
|
|
||||||
CFLAGS=$CFLAGS_safe
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
if test "$hwloc_cv___attribute__[$1]" = "1" ; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Test the availability of __attribute__ and with the help
|
|
||||||
# of _HWLOC_CHECK_SPECIFIC_ATTRIBUTE for the support of
|
|
||||||
# particular attributes. Compilers, that do not support an
|
|
||||||
# attribute most often fail with a warning (when the warning
|
|
||||||
# level is set).
|
|
||||||
# The compilers output is parsed in _HWLOC_ATTRIBUTE_FAIL_SEARCH
|
|
||||||
#
|
|
||||||
# To add a new attributes __NAME__ add the
|
|
||||||
# hwloc_cv___attribute__NAME
|
|
||||||
# add a new check with _HWLOC_CHECK_SPECIFIC_ATTRIBUTE (possibly with a cross-check)
|
|
||||||
# _HWLOC_CHECK_SPECIFIC_ATTRIBUTE([name], [int foo (int arg) __attribute__ ((__name__));], [], [])
|
|
||||||
# and define the corresponding
|
|
||||||
# AC_DEFINE_UNQUOTED(_HWLOC_HAVE_ATTRIBUTE_NAME, [$hwloc_cv___attribute__NAME],
|
|
||||||
# [Whether your compiler has __attribute__ NAME or not])
|
|
||||||
# and decide on a correct macro (in opal/include/opal_config_bottom.h):
|
|
||||||
# # define __opal_attribute_NAME(x) __attribute__(__NAME__)
|
|
||||||
#
|
|
||||||
# Please use the "__"-notation of the attribute in order not to
|
|
||||||
# clash with predefined names or macros (e.g. const, which some compilers
|
|
||||||
# do not like..)
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
AC_DEFUN([_HWLOC_CHECK_ATTRIBUTES], [
|
|
||||||
AC_MSG_CHECKING(for __attribute__)
|
|
||||||
|
|
||||||
AC_CACHE_VAL(hwloc_cv___attribute__, [
|
|
||||||
AC_TRY_COMPILE(
|
|
||||||
[#include <stdlib.h>
|
|
||||||
/* Check for the longest available __attribute__ (since gcc-2.3) */
|
|
||||||
struct foo {
|
|
||||||
char a;
|
|
||||||
int x[2] __attribute__ ((__packed__));
|
|
||||||
};
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[hwloc_cv___attribute__=1],
|
|
||||||
[hwloc_cv___attribute__=0],
|
|
||||||
)
|
|
||||||
|
|
||||||
if test "$hwloc_cv___attribute__" = "1" ; then
|
|
||||||
AC_TRY_COMPILE(
|
|
||||||
[#include <stdlib.h>
|
|
||||||
/* Check for the longest available __attribute__ (since gcc-2.3) */
|
|
||||||
struct foo {
|
|
||||||
char a;
|
|
||||||
int x[2] __attribute__ ((__packed__));
|
|
||||||
};
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[hwloc_cv___attribute__=1],
|
|
||||||
[hwloc_cv___attribute__=0],
|
|
||||||
)
|
|
||||||
fi
|
|
||||||
])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE, [$hwloc_cv___attribute__],
|
|
||||||
[Whether your compiler has __attribute__ or not])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Now that we know the compiler support __attribute__ let's check which kind of
|
|
||||||
# attributed are supported.
|
|
||||||
#
|
|
||||||
if test "$hwloc_cv___attribute__" = "0" ; then
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
hwloc_cv___attribute__aligned=0
|
|
||||||
hwloc_cv___attribute__always_inline=0
|
|
||||||
hwloc_cv___attribute__cold=0
|
|
||||||
hwloc_cv___attribute__const=0
|
|
||||||
hwloc_cv___attribute__deprecated=0
|
|
||||||
hwloc_cv___attribute__format=0
|
|
||||||
hwloc_cv___attribute__hot=0
|
|
||||||
hwloc_cv___attribute__malloc=0
|
|
||||||
hwloc_cv___attribute__may_alias=0
|
|
||||||
hwloc_cv___attribute__no_instrument_function=0
|
|
||||||
hwloc_cv___attribute__nonnull=0
|
|
||||||
hwloc_cv___attribute__noreturn=0
|
|
||||||
hwloc_cv___attribute__packed=0
|
|
||||||
hwloc_cv___attribute__pure=0
|
|
||||||
hwloc_cv___attribute__sentinel=0
|
|
||||||
hwloc_cv___attribute__unused=0
|
|
||||||
hwloc_cv___attribute__warn_unused_result=0
|
|
||||||
hwloc_cv___attribute__weak_alias=0
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([aligned],
|
|
||||||
[struct foo { char text[4]; } __attribute__ ((__aligned__(8)));],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Ignored by PGI-6.2.5; -- recognized by output-parser
|
|
||||||
#
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([always_inline],
|
|
||||||
[int foo (int arg) __attribute__ ((__always_inline__));],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([cold],
|
|
||||||
[
|
|
||||||
int foo(int arg1, int arg2) __attribute__ ((__cold__));
|
|
||||||
int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([const],
|
|
||||||
[
|
|
||||||
int foo(int arg1, int arg2) __attribute__ ((__const__));
|
|
||||||
int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([deprecated],
|
|
||||||
[
|
|
||||||
int foo(int arg1, int arg2) __attribute__ ((__deprecated__));
|
|
||||||
int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS=
|
|
||||||
case "$hwloc_c_vendor" in
|
|
||||||
gnu)
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-Wall"
|
|
||||||
;;
|
|
||||||
intel)
|
|
||||||
# we want specifically the warning on format string conversion
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-we181"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([format],
|
|
||||||
[
|
|
||||||
int this_printf (void *my_object, const char *my_format, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
|
|
||||||
],
|
|
||||||
[
|
|
||||||
static int usage (int * argument);
|
|
||||||
extern int this_printf (int arg1, const char *my_format, ...) __attribute__ ((__format__ (__printf__, 2, 3)));
|
|
||||||
|
|
||||||
static int usage (int * argument) {
|
|
||||||
return this_printf (*argument, "%d", argument); /* This should produce a format warning */
|
|
||||||
}
|
|
||||||
/* The autoconf-generated main-function is int main(), which produces a warning by itself */
|
|
||||||
int main(void);
|
|
||||||
],
|
|
||||||
[$HWLOC_ATTRIBUTE_CFLAGS])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([hot],
|
|
||||||
[
|
|
||||||
int foo(int arg1, int arg2) __attribute__ ((__hot__));
|
|
||||||
int foo(int arg1, int arg2) { return arg1 * arg2 + arg1; }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([malloc],
|
|
||||||
[
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
# include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
int * foo(int arg1) __attribute__ ((__malloc__));
|
|
||||||
int * foo(int arg1) { return (int*) malloc(arg1); }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Attribute may_alias: No suitable cross-check available, that works for non-supporting compilers
|
|
||||||
# Ignored by intel-9.1.045 -- turn off with -wd1292
|
|
||||||
# Ignored by PGI-6.2.5; ignore not detected due to missing cross-check
|
|
||||||
#
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([may_alias],
|
|
||||||
[int * p_value __attribute__ ((__may_alias__));],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([no_instrument_function],
|
|
||||||
[int * foo(int arg1) __attribute__ ((__no_instrument_function__));],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Attribute nonnull:
|
|
||||||
# Ignored by intel-compiler 9.1.045 -- recognized by cross-check
|
|
||||||
# Ignored by PGI-6.2.5 (pgCC) -- recognized by cross-check
|
|
||||||
#
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS=
|
|
||||||
case "$hwloc_c_vendor" in
|
|
||||||
gnu)
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-Wall"
|
|
||||||
;;
|
|
||||||
intel)
|
|
||||||
# we do not want to get ignored attributes warnings, but rather real warnings
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-wd1292"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([nonnull],
|
|
||||||
[
|
|
||||||
int square(int *arg) __attribute__ ((__nonnull__));
|
|
||||||
int square(int *arg) { return *arg; }
|
|
||||||
],
|
|
||||||
[
|
|
||||||
static int usage(int * argument);
|
|
||||||
int square(int * argument) __attribute__ ((__nonnull__));
|
|
||||||
int square(int * argument) { return (*argument) * (*argument); }
|
|
||||||
|
|
||||||
static int usage(int * argument) {
|
|
||||||
return square( ((void*)0) ); /* This should produce an argument must be nonnull warning */
|
|
||||||
}
|
|
||||||
/* The autoconf-generated main-function is int main(), which produces a warning by itself */
|
|
||||||
int main(void);
|
|
||||||
],
|
|
||||||
[$HWLOC_ATTRIBUTE_CFLAGS])
|
|
||||||
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([noreturn],
|
|
||||||
[
|
|
||||||
#ifdef HAVE_UNISTD_H
|
|
||||||
# include <unistd.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_STDLIB_H
|
|
||||||
# include <stdlib.h>
|
|
||||||
#endif
|
|
||||||
void fatal(int arg1) __attribute__ ((__noreturn__));
|
|
||||||
void fatal(int arg1) { exit(arg1); }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([packed],
|
|
||||||
[
|
|
||||||
struct foo {
|
|
||||||
char a;
|
|
||||||
int x[2] __attribute__ ((__packed__));
|
|
||||||
};
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([pure],
|
|
||||||
[
|
|
||||||
int square(int arg) __attribute__ ((__pure__));
|
|
||||||
int square(int arg) { return arg * arg; }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
#
|
|
||||||
# Attribute sentinel:
|
|
||||||
# Ignored by the intel-9.1.045 -- recognized by cross-check
|
|
||||||
# intel-10.0beta works fine
|
|
||||||
# Ignored by PGI-6.2.5 (pgCC) -- recognized by output-parser and cross-check
|
|
||||||
# Ignored by pathcc-2.2.1 -- recognized by cross-check (through grep ignore)
|
|
||||||
#
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS=
|
|
||||||
case "$hwloc_c_vendor" in
|
|
||||||
gnu)
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-Wall"
|
|
||||||
;;
|
|
||||||
intel)
|
|
||||||
# we do not want to get ignored attributes warnings
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-wd1292"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([sentinel],
|
|
||||||
[
|
|
||||||
int my_execlp(const char * file, const char *arg, ...) __attribute__ ((__sentinel__));
|
|
||||||
],
|
|
||||||
[
|
|
||||||
static int usage(int * argument);
|
|
||||||
int my_execlp(const char * file, const char *arg, ...) __attribute__ ((__sentinel__));
|
|
||||||
|
|
||||||
static int usage(int * argument) {
|
|
||||||
void * last_arg_should_be_null = argument;
|
|
||||||
return my_execlp ("lala", "/home/there", last_arg_should_be_null); /* This should produce a warning */
|
|
||||||
}
|
|
||||||
/* The autoconf-generated main-function is int main(), which produces a warning by itself */
|
|
||||||
int main(void);
|
|
||||||
],
|
|
||||||
[$HWLOC_ATTRIBUTE_CFLAGS])
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([unused],
|
|
||||||
[
|
|
||||||
int square(int arg1 __attribute__ ((__unused__)), int arg2);
|
|
||||||
int square(int arg1, int arg2) { return arg2; }
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Attribute warn_unused_result:
|
|
||||||
# Ignored by the intel-compiler 9.1.045 -- recognized by cross-check
|
|
||||||
# Ignored by pathcc-2.2.1 -- recognized by cross-check (through grep ignore)
|
|
||||||
#
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS=
|
|
||||||
case "$hwloc_c_vendor" in
|
|
||||||
gnu)
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-Wall"
|
|
||||||
;;
|
|
||||||
intel)
|
|
||||||
# we do not want to get ignored attributes warnings
|
|
||||||
HWLOC_ATTRIBUTE_CFLAGS="-wd1292"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([warn_unused_result],
|
|
||||||
[
|
|
||||||
int foo(int arg) __attribute__ ((__warn_unused_result__));
|
|
||||||
int foo(int arg) { return arg + 3; }
|
|
||||||
],
|
|
||||||
[
|
|
||||||
static int usage(int * argument);
|
|
||||||
int foo(int arg) __attribute__ ((__warn_unused_result__));
|
|
||||||
|
|
||||||
int foo(int arg) { return arg + 3; }
|
|
||||||
static int usage(int * argument) {
|
|
||||||
foo (*argument); /* Should produce an unused result warning */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The autoconf-generated main-function is int main(), which produces a warning by itself */
|
|
||||||
int main(void);
|
|
||||||
],
|
|
||||||
[$HWLOC_ATTRIBUTE_CFLAGS])
|
|
||||||
|
|
||||||
|
|
||||||
_HWLOC_CHECK_SPECIFIC_ATTRIBUTE([weak_alias],
|
|
||||||
[
|
|
||||||
int foo(int arg);
|
|
||||||
int foo(int arg) { return arg + 3; }
|
|
||||||
int foo2(int arg) __attribute__ ((__weak__, __alias__("foo")));
|
|
||||||
],
|
|
||||||
[],
|
|
||||||
[])
|
|
||||||
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Now that all the values are set, define them
|
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_ALIGNED, [$hwloc_cv___attribute__aligned],
|
|
||||||
[Whether your compiler has __attribute__ aligned or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_ALWAYS_INLINE, [$hwloc_cv___attribute__always_inline],
|
|
||||||
[Whether your compiler has __attribute__ always_inline or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_COLD, [$hwloc_cv___attribute__cold],
|
|
||||||
[Whether your compiler has __attribute__ cold or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_CONST, [$hwloc_cv___attribute__const],
|
|
||||||
[Whether your compiler has __attribute__ const or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_DEPRECATED, [$hwloc_cv___attribute__deprecated],
|
|
||||||
[Whether your compiler has __attribute__ deprecated or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_FORMAT, [$hwloc_cv___attribute__format],
|
|
||||||
[Whether your compiler has __attribute__ format or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_HOT, [$hwloc_cv___attribute__hot],
|
|
||||||
[Whether your compiler has __attribute__ hot or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_MALLOC, [$hwloc_cv___attribute__malloc],
|
|
||||||
[Whether your compiler has __attribute__ malloc or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS, [$hwloc_cv___attribute__may_alias],
|
|
||||||
[Whether your compiler has __attribute__ may_alias or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION, [$hwloc_cv___attribute__no_instrument_function],
|
|
||||||
[Whether your compiler has __attribute__ no_instrument_function or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_NONNULL, [$hwloc_cv___attribute__nonnull],
|
|
||||||
[Whether your compiler has __attribute__ nonnull or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_NORETURN, [$hwloc_cv___attribute__noreturn],
|
|
||||||
[Whether your compiler has __attribute__ noreturn or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_PACKED, [$hwloc_cv___attribute__packed],
|
|
||||||
[Whether your compiler has __attribute__ packed or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_PURE, [$hwloc_cv___attribute__pure],
|
|
||||||
[Whether your compiler has __attribute__ pure or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_SENTINEL, [$hwloc_cv___attribute__sentinel],
|
|
||||||
[Whether your compiler has __attribute__ sentinel or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_UNUSED, [$hwloc_cv___attribute__unused],
|
|
||||||
[Whether your compiler has __attribute__ unused or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT, [$hwloc_cv___attribute__warn_unused_result],
|
|
||||||
[Whether your compiler has __attribute__ warn unused result or not])
|
|
||||||
AC_DEFINE_UNQUOTED(HWLOC_HAVE_ATTRIBUTE_WEAK_ALIAS, [$hwloc_cv___attribute__weak_alias],
|
|
||||||
[Whether your compiler has __attribute__ weak alias or not])
|
|
||||||
])
|
|
||||||
|
|
|
@ -1,122 +0,0 @@
|
||||||
# This macro set originally copied from Open MPI:
|
|
||||||
# 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-2007 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) 2006-2007 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# and renamed for hwloc:
|
|
||||||
# Copyright (c) 2009 INRIA. All rights reserved.
|
|
||||||
# Copyright (c) 2009-2010 Université Bordeaux 1
|
|
||||||
# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# - Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
#
|
|
||||||
# - Redistributions in binary form must reproduce the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer listed
|
|
||||||
# in this license in the documentation and/or other materials
|
|
||||||
# provided with the distribution.
|
|
||||||
#
|
|
||||||
# - Neither the name of the copyright holders nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# The copyright holders provide no reassurances that the source code
|
|
||||||
# provided does not infringe any patent, copyright, or any other
|
|
||||||
# intellectual property rights of third parties. The copyright holders
|
|
||||||
# disclaim any liability to any recipient for claims brought against
|
|
||||||
# recipient by any third party for infringement of that parties
|
|
||||||
# intellectual property rights.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
#
|
|
||||||
|
|
||||||
# _HWLOC_CHECK_VISIBILITY
|
|
||||||
# --------------------------------------------------------
|
|
||||||
AC_DEFUN([_HWLOC_CHECK_VISIBILITY],[
|
|
||||||
# Be safe for systems that have ancient Autoconf's (e.g., RHEL5)
|
|
||||||
m4_ifdef([AC_PROG_GREP],
|
|
||||||
[AC_REQUIRE([AC_PROG_GREP])],
|
|
||||||
[GREP=grep])
|
|
||||||
|
|
||||||
msg="whether to enable visibility"
|
|
||||||
# Check if the compiler has support for visibility, like some
|
|
||||||
# versions of gcc, icc.
|
|
||||||
AC_ARG_ENABLE(visibility,
|
|
||||||
AC_HELP_STRING([--enable-visibility],
|
|
||||||
[enable visibility feature of certain compilers/linkers (default: enabled)]))
|
|
||||||
|
|
||||||
case ${target} in
|
|
||||||
*-*-aix*|*-*-mingw*|*-*-cygwin*|*-*-hpux*)
|
|
||||||
enable_visibility=no
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test "$enable_visibility" = "no"; then
|
|
||||||
AC_MSG_CHECKING([$msg])
|
|
||||||
AC_MSG_RESULT([no (disabled)])
|
|
||||||
have_visibility=0
|
|
||||||
else
|
|
||||||
CFLAGS_orig="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS_orig -fvisibility=hidden"
|
|
||||||
hwloc_add=
|
|
||||||
AC_CACHE_CHECK([if $CC supports -fvisibility],
|
|
||||||
[hwloc_cv_cc_fvisibility],
|
|
||||||
[AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
|
||||||
__attribute__((visibility("default"))) int foo;
|
|
||||||
]],[[int i;]])],
|
|
||||||
[hwloc_cv_cc_fvisibility=yes],
|
|
||||||
[if test -s conftest.err ; then
|
|
||||||
$GREP -iq "visibility" conftest.err
|
|
||||||
if test "$?" = "0" ; then
|
|
||||||
hwloc_cv_cc_fvisibility=no
|
|
||||||
else
|
|
||||||
hwloc_cv_cc_fvisibility=yes
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
hwloc_cv_cc_fvisibility=yes
|
|
||||||
fi],
|
|
||||||
[hwloc_cv_cc_fvisibility=no])
|
|
||||||
])
|
|
||||||
|
|
||||||
if test "$hwloc_cv_cc_fvisibility" = "yes" ; then
|
|
||||||
hwloc_add=" -fvisibility=hidden"
|
|
||||||
have_visibility=1
|
|
||||||
AC_MSG_CHECKING([$msg])
|
|
||||||
AC_MSG_RESULT([yes (via$hwloc_add)])
|
|
||||||
elif test "$enable_visibility" = "yes"; then
|
|
||||||
AC_MSG_ERROR([Symbol visibility support requested but compiler does not seem to support it. Aborting])
|
|
||||||
else
|
|
||||||
AC_MSG_CHECKING([$msg])
|
|
||||||
AC_MSG_RESULT([no (unsupported)])
|
|
||||||
have_visibility=0
|
|
||||||
fi
|
|
||||||
CFLAGS=$CFLAGS_orig
|
|
||||||
HWLOC_VISIBILITY_CFLAGS=$hwloc_add
|
|
||||||
unset hwloc_add
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED([HWLOC_C_HAVE_VISIBILITY], [$have_visibility],
|
|
||||||
[Whether C compiler supports -fvisibility])
|
|
||||||
])
|
|
|
@ -1,173 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# hwloc_get_version is created from hwloc_get_version.m4 and hwloc_get_version.m4sh.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2004-2006 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 © 2008-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# $COPYRIGHT$
|
|
||||||
#
|
|
||||||
# Additional copyrights may follow
|
|
||||||
#
|
|
||||||
# $HEADER$
|
|
||||||
#
|
|
||||||
|
|
||||||
# 11 September 2009: this file was copied from PLPA's SVN trunk as of
|
|
||||||
# r251 on 11 September 2009. The only change made to it was
|
|
||||||
# s/PLPA/hwloc/ig.
|
|
||||||
|
|
||||||
|
|
||||||
# HWLOC_GET_VERSION(version_file, variable_prefix)
|
|
||||||
# -----------------------------------------------
|
|
||||||
# parse version_file for version information, setting
|
|
||||||
# the following shell variables:
|
|
||||||
#
|
|
||||||
# prefix_VERSION
|
|
||||||
# prefix_BASE_VERSION
|
|
||||||
# prefix_MAJOR_VERSION
|
|
||||||
# prefix_MINOR_VERSION
|
|
||||||
# prefix_RELEASE_VERSION
|
|
||||||
# prefix_GREEK_VERSION
|
|
||||||
# prefix_WANT_REPO_REV
|
|
||||||
# prefix_REPO_REV
|
|
||||||
# prefix_RELEASE_DATE
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
srcfile="$1"
|
|
||||||
option="$2"
|
|
||||||
|
|
||||||
case "$option" in
|
|
||||||
# svnversion can take a while to run. If we don't need it, don't run it.
|
|
||||||
--major|--minor|--release|--greek|--base|--help)
|
|
||||||
ompi_ver_need_repo_rev=0
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ompi_ver_need_repo_rev=1
|
|
||||||
esac
|
|
||||||
|
|
||||||
|
|
||||||
if test -z "$srcfile"; then
|
|
||||||
option="--help"
|
|
||||||
else
|
|
||||||
|
|
||||||
: ${ompi_ver_need_repo_rev=1}
|
|
||||||
: ${srcdir=.}
|
|
||||||
: ${svnversion_result=-1}
|
|
||||||
|
|
||||||
if test -f "$srcfile"; then
|
|
||||||
ompi_vers=`sed -n "
|
|
||||||
t clear
|
|
||||||
: clear
|
|
||||||
s/^major/HWLOC_MAJOR_VERSION/
|
|
||||||
s/^minor/HWLOC_MINOR_VERSION/
|
|
||||||
s/^release/HWLOC_RELEASE_VERSION/
|
|
||||||
s/^greek/HWLOC_GREEK_VERSION/
|
|
||||||
s/^want_repo_rev/HWLOC_WANT_REPO_REV/
|
|
||||||
s/^repo_rev/HWLOC_REPO_REV/
|
|
||||||
s/^date/HWLOC_RELEASE_DATE/
|
|
||||||
t print
|
|
||||||
b
|
|
||||||
: print
|
|
||||||
p" < "$srcfile"`
|
|
||||||
eval "$ompi_vers"
|
|
||||||
|
|
||||||
# Only print release version if it isn't 0
|
|
||||||
if test $HWLOC_RELEASE_VERSION -ne 0 ; then
|
|
||||||
HWLOC_VERSION="$HWLOC_MAJOR_VERSION.$HWLOC_MINOR_VERSION.$HWLOC_RELEASE_VERSION"
|
|
||||||
else
|
|
||||||
HWLOC_VERSION="$HWLOC_MAJOR_VERSION.$HWLOC_MINOR_VERSION"
|
|
||||||
fi
|
|
||||||
HWLOC_VERSION="${HWLOC_VERSION}${HWLOC_GREEK_VERSION}"
|
|
||||||
HWLOC_BASE_VERSION=$HWLOC_VERSION
|
|
||||||
|
|
||||||
if test $HWLOC_WANT_REPO_REV -eq 1 && test $ompi_ver_need_repo_rev -eq 1 ; then
|
|
||||||
if test "$svnversion_result" != "-1" ; then
|
|
||||||
HWLOC_REPO_REV=$svnversion_result
|
|
||||||
fi
|
|
||||||
if test "$HWLOC_REPO_REV" = "-1" ; then
|
|
||||||
|
|
||||||
if test -d "$srcdir/.svn" ; then
|
|
||||||
HWLOC_REPO_REV=r`svnversion "$srcdir"`
|
|
||||||
elif test -d "$srcdir/.hg" ; then
|
|
||||||
HWLOC_REPO_REV=hg`hg -v -R "$srcdir" tip | grep changeset | cut -d: -f3`
|
|
||||||
elif test -d "$srcdir/.git" ; then
|
|
||||||
HWLOC_REPO_REV=git`git log -1 "$srcdir" | grep commit | awk '{ print $2 }'`
|
|
||||||
fi
|
|
||||||
if test "HWLOC_REPO_REV" = ""; then
|
|
||||||
HWLOC_REPO_REV=date`date '+%m%d%Y'`
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi
|
|
||||||
HWLOC_VERSION="${HWLOC_VERSION}${HWLOC_REPO_REV}"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if test "$option" = ""; then
|
|
||||||
option="--full"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
case "$option" in
|
|
||||||
--full|-v|--version)
|
|
||||||
echo $HWLOC_VERSION
|
|
||||||
;;
|
|
||||||
--major)
|
|
||||||
echo $HWLOC_MAJOR_VERSION
|
|
||||||
;;
|
|
||||||
--minor)
|
|
||||||
echo $HWLOC_MINOR_VERSION
|
|
||||||
;;
|
|
||||||
--release)
|
|
||||||
echo $HWLOC_RELEASE_VERSION
|
|
||||||
;;
|
|
||||||
--greek)
|
|
||||||
echo $HWLOC_GREEK_VERSION
|
|
||||||
;;
|
|
||||||
--repo-rev)
|
|
||||||
echo $HWLOC_REPO_REV
|
|
||||||
;;
|
|
||||||
--base)
|
|
||||||
echo $HWLOC_BASE_VERSION
|
|
||||||
;;
|
|
||||||
--release-date)
|
|
||||||
echo $HWLOC_RELEASE_DATE
|
|
||||||
;;
|
|
||||||
--all)
|
|
||||||
echo ${HWLOC_VERSION} ${HWLOC_MAJOR_VERSION} ${HWLOC_MINOR_VERSION} ${HWLOC_RELEASE_VERSION} ${HWLOC_GREEK_VERSION} ${HWLOC_REPO_REV}
|
|
||||||
;;
|
|
||||||
-h|--help)
|
|
||||||
cat <<EOF
|
|
||||||
$0 <srcfile> <option>
|
|
||||||
|
|
||||||
<srcfile> - Text version file
|
|
||||||
<option> - One of:
|
|
||||||
--full - Full version number
|
|
||||||
--major - Major version number
|
|
||||||
--minor - Minor version number
|
|
||||||
--release - Release version number
|
|
||||||
--greek - Greek (alpha, beta, etc) version number
|
|
||||||
--repo-rev - Repository version number
|
|
||||||
--all - Show all version numbers, separated by :
|
|
||||||
--base - Show base version number (no repo version number)
|
|
||||||
--release-date - Show the release date
|
|
||||||
--help - This message
|
|
||||||
EOF
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
echo "Unrecognized option $option. Run $0 --help for options"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# All done
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -1,408 +0,0 @@
|
||||||
dnl -*- Autoconf -*-
|
|
||||||
dnl
|
|
||||||
dnl Copyright (c) 2009 INRIA. All rights reserved.
|
|
||||||
dnl Copyright (c) 2009, 2011 Université Bordeaux 1
|
|
||||||
dnl Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
||||||
dnl University Research and Technology
|
|
||||||
dnl Corporation. All rights reserved.
|
|
||||||
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
|
||||||
dnl All rights reserved.
|
|
||||||
dnl Copyright (c) 2004-2008 High Performance Computing Center Stuttgart,
|
|
||||||
dnl University of Stuttgart. All rights reserved.
|
|
||||||
dnl Copyright © 2010 INRIA. All rights reserved.
|
|
||||||
dnl Copyright © 2006-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
dnl
|
|
||||||
dnl See COPYING in top-level directory.
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Probably only ever invoked by hwloc's configure.ac
|
|
||||||
AC_DEFUN([HWLOC_BUILD_STANDALONE],[
|
|
||||||
hwloc_mode=standalone
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Probably only ever invoked by hwloc's configure.ac
|
|
||||||
AC_DEFUN([HWLOC_DEFINE_ARGS],[
|
|
||||||
# Embedded mode, or standalone?
|
|
||||||
AC_ARG_ENABLE([embedded-mode],
|
|
||||||
AC_HELP_STRING([--enable-embedded-mode],
|
|
||||||
[Using --enable-embedded-mode puts the HWLOC into "embedded" mode. The default is --disable-embedded-mode, meaning that the HWLOC is in "standalone" mode.]))
|
|
||||||
|
|
||||||
# Change the symbol prefix?
|
|
||||||
AC_ARG_WITH([hwloc-symbol-prefix],
|
|
||||||
AC_HELP_STRING([--with-hwloc-symbol-prefix=STRING],
|
|
||||||
[STRING can be any valid C symbol name. It will be prefixed to all public HWLOC symbols. Default: "hwloc_"]))
|
|
||||||
|
|
||||||
# Debug mode?
|
|
||||||
AC_ARG_ENABLE([debug],
|
|
||||||
AC_HELP_STRING([--enable-debug],
|
|
||||||
[Using --enable-debug enables various hwloc maintainer-level debugging controls. This option is not recomended for end users.]))
|
|
||||||
|
|
||||||
# Doxygen?
|
|
||||||
AC_ARG_ENABLE([doxygen],
|
|
||||||
[AC_HELP_STRING([--enable-doxygen],
|
|
||||||
[enable support for building Doxygen documentation (note that this option is ONLY relevant in developer builds; Doxygen documentation is pre-built for tarball builds and this option is therefore ignored)])])
|
|
||||||
|
|
||||||
# Picky?
|
|
||||||
AC_ARG_ENABLE(picky,
|
|
||||||
AC_HELP_STRING([--disable-picky],
|
|
||||||
[When in developer checkouts of hwloc and compiling with gcc, the default is to enable maximum compiler pickyness. Using --disable-picky or --enable-picky overrides any default setting]))
|
|
||||||
|
|
||||||
# Cairo?
|
|
||||||
AC_ARG_ENABLE([cairo],
|
|
||||||
AS_HELP_STRING([--disable-cairo],
|
|
||||||
[Disable the Cairo back-end of hwloc's lstopo command]))
|
|
||||||
|
|
||||||
# XML?
|
|
||||||
AC_ARG_ENABLE([xml],
|
|
||||||
AS_HELP_STRING([--disable-xml],
|
|
||||||
[Disable the XML back-end of hwloc's lstopo command]))
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
dnl We only build documentation if this is a developer checkout.
|
|
||||||
dnl Distribution tarballs just install pre-built docuemntation that was
|
|
||||||
dnl included in the tarball.
|
|
||||||
|
|
||||||
# Probably only ever invoked by hwloc's configure.ac
|
|
||||||
AC_DEFUN([HWLOC_SETUP_DOCS],[
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
###
|
|
||||||
### Configuring hwloc documentation
|
|
||||||
###
|
|
||||||
EOF
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if this is a developer build])
|
|
||||||
AS_IF([test ! -d "$srcdir/.svn" -a ! -d "$srcdir/.hg" -a ! -d "$srcdir/.git"],
|
|
||||||
[AC_MSG_RESULT([no (doxygen generation is optional)])],
|
|
||||||
[AC_MSG_RESULT([yes])])
|
|
||||||
|
|
||||||
# Generating the doxygen output requires a few tools. If we
|
|
||||||
# don't have all of them, refuse the build the docs.
|
|
||||||
AC_ARG_VAR([DOXYGEN], [Location of the doxygen program (required for building the hwloc doxygen documentation)])
|
|
||||||
AC_PATH_TOOL([DOXYGEN], [doxygen])
|
|
||||||
HWLOC_DOXYGEN_VERSION=`doxygen --version 2> /dev/null`
|
|
||||||
|
|
||||||
AC_ARG_VAR([PDFLATEX], [Location of the pdflatex program (required for building the hwloc doxygen documentation)])
|
|
||||||
AC_PATH_TOOL([PDFLATEX], [pdflatex])
|
|
||||||
|
|
||||||
AC_ARG_VAR([MAKEINDEX], [Location of the makeindex program (required for building the hwloc doxygen documentation)])
|
|
||||||
AC_PATH_TOOL([MAKEINDEX], [makeindex])
|
|
||||||
|
|
||||||
AC_ARG_VAR([FIG2DEV], [Location of the fig2dev program (required for building the hwloc doxygen documentation)])
|
|
||||||
AC_PATH_TOOL([FIG2DEV], [fig2dev])
|
|
||||||
|
|
||||||
AC_ARG_VAR([GS], [Location of the gs program (required for building the hwloc doxygen documentation)])
|
|
||||||
AC_PATH_TOOL([GS], [gs])
|
|
||||||
|
|
||||||
AC_ARG_VAR([EPSTOPDF], [Location of the epstopdf program (required for building the hwloc doxygen documentation)])
|
|
||||||
AC_PATH_TOOL([EPSTOPDF], [epstopdf])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if can build doxygen docs])
|
|
||||||
AS_IF([test "x$DOXYGEN" != "x" -a "x$PDFLATEX" != "x" -a "x$MAKEINDEX" != "x" -a "x$FIG2DEV" != "x" -a "x$GS" != "x" -a "x$EPSTOPDF" != "x"],
|
|
||||||
[hwloc_generate_doxs=yes], [hwloc_generate_doxs=no])
|
|
||||||
AC_MSG_RESULT([$hwloc_generate_doxs])
|
|
||||||
|
|
||||||
# Linux and OS X take different sed arguments.
|
|
||||||
AC_PROG_SED
|
|
||||||
AC_MSG_CHECKING([if the sed -i option requires an argument])
|
|
||||||
rm -f conftest
|
|
||||||
cat > conftest <<EOF
|
|
||||||
hello
|
|
||||||
EOF
|
|
||||||
$SED -i -e s/hello/goodbye/ conftest 2> /dev/null
|
|
||||||
AS_IF([test -f conftest-e],
|
|
||||||
[SED_I="$SED -i ''"
|
|
||||||
AC_MSG_RESULT([yes])],
|
|
||||||
[SED_I="$SED -i"
|
|
||||||
AC_MSG_RESULT([no])])
|
|
||||||
rm -f conftest conftest-e
|
|
||||||
AC_SUBST([SED_I])
|
|
||||||
|
|
||||||
# Making the top-level README requires w3m or lynx.
|
|
||||||
AC_ARG_VAR([W3M], [Location of the w3m program (required to building the top-level hwloc README file)])
|
|
||||||
AC_PATH_TOOL([W3M], [w3m])
|
|
||||||
AC_ARG_VAR([LYNX], [Location of the lynx program (required to building the top-level hwloc README file)])
|
|
||||||
AC_PATH_TOOL([LYNX], [lynx])
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([if can build top-level README])
|
|
||||||
AS_IF([test "x$W3M" != "x"],
|
|
||||||
[hwloc_generate_readme=yes
|
|
||||||
HWLOC_W3_GENERATOR=$W3M],
|
|
||||||
[AS_IF([test "x$LYNX" != "x"],
|
|
||||||
[hwloc_generate_readme=yes
|
|
||||||
HWLOC_W3_GENERATOR="$LYNX -dump -nolist"],
|
|
||||||
[hwloc_generate_readme=no])])
|
|
||||||
AC_SUBST(HWLOC_W3_GENERATOR)
|
|
||||||
AC_MSG_RESULT([$hwloc_generate_readme])
|
|
||||||
|
|
||||||
# If any one of the above tools is missing, we will refuse to make dist.
|
|
||||||
AC_MSG_CHECKING([if will build doxygen docs])
|
|
||||||
AS_IF([test "x$hwloc_generate_doxs" = "xyes" -a "x$enable_doxygen" != "xno"],
|
|
||||||
[], [hwloc_generate_doxs=no])
|
|
||||||
AC_MSG_RESULT([$hwloc_generate_doxs])
|
|
||||||
|
|
||||||
# See if we want to install the doxygen docs
|
|
||||||
AC_MSG_CHECKING([if will install doxygen docs])
|
|
||||||
AS_IF([test "x$hwloc_generate_doxs" = "xyes" -o \
|
|
||||||
-f "$srcdir/doc/doxygen-doc/man/man3/hwloc_distribute.3" -a \
|
|
||||||
-f "$srcdir/doc/doxygen-doc/hwloc-a4.pdf" -a \
|
|
||||||
-f "$srcdir/doc/doxygen-doc/hwloc-letter.pdf"],
|
|
||||||
[hwloc_install_doxs=yes],
|
|
||||||
[hwloc_install_doxs=no])
|
|
||||||
AC_MSG_RESULT([$hwloc_install_doxs])
|
|
||||||
|
|
||||||
# For the common developer case, if we're in a developer checkout and
|
|
||||||
# using the GNU compilers, turn on maximum warnings unless
|
|
||||||
# specifically disabled by the user.
|
|
||||||
AC_MSG_CHECKING([whether to enable "picky" compiler mode])
|
|
||||||
hwloc_want_picky=0
|
|
||||||
AS_IF([test "$GCC" = "yes"],
|
|
||||||
[AS_IF([test -d "$srcdir/.svn" -o -d "$srcdir/.hg" -o -d "$srcdir/.git"],
|
|
||||||
[hwloc_want_picky=1])])
|
|
||||||
if test "$enable_picky" = "yes"; then
|
|
||||||
if test "$GCC" = "yes"; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
hwloc_want_picky=1
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
AC_MSG_WARN([Warning: --enable-picky used, but is currently only defined for the GCC compiler set -- automatically disabled])
|
|
||||||
hwloc_want_picky=0
|
|
||||||
fi
|
|
||||||
elif test "$enable_picky" = "no"; then
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
hwloc_want_picky=0
|
|
||||||
else
|
|
||||||
if test "$hwloc_want_picky" = 1; then
|
|
||||||
AC_MSG_RESULT([yes (default)])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no (default)])
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
if test "$hwloc_want_picky" = 1; then
|
|
||||||
add="-Wall -Wunused-parameter -Wundef -Wno-long-long -Wsign-compare"
|
|
||||||
add="$add -Wmissing-prototypes -Wstrict-prototypes"
|
|
||||||
add="$add -Wcomment -pedantic"
|
|
||||||
|
|
||||||
CFLAGS="$CFLAGS $add"
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Generate some files for the docs
|
|
||||||
AC_CONFIG_FILES(
|
|
||||||
hwloc_config_prefix[doc/Makefile]
|
|
||||||
hwloc_config_prefix[doc/doxygen-config.cfg])
|
|
||||||
])
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Probably only ever invoked by hwloc's configure.ac
|
|
||||||
AC_DEFUN([HWLOC_SETUP_UTILS],[
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
###
|
|
||||||
### Configuring hwloc command line utilities
|
|
||||||
###
|
|
||||||
EOF
|
|
||||||
|
|
||||||
hwloc_build_utils=yes
|
|
||||||
|
|
||||||
# Cairo support
|
|
||||||
hwloc_cairo_happy=
|
|
||||||
if test "x$enable_cairo" != "xno"; then
|
|
||||||
HWLOC_PKG_CHECK_MODULES([CAIRO], [cairo], [cairo_fill],
|
|
||||||
[hwloc_cairo_happy=yes],
|
|
||||||
[hwloc_cairo_happy=no])
|
|
||||||
if test "x$hwloc_cairo_happy" = "xyes"; then
|
|
||||||
AC_PATH_XTRA
|
|
||||||
CFLAGS_save=$CFLAGS
|
|
||||||
LIBS_save=$LIBS
|
|
||||||
|
|
||||||
CFLAGS="$CFLAGS $X_CFLAGS"
|
|
||||||
LIBS="$LIBS $X_PRE_LIBS $X_LIBS $X_EXTRA_LIBS"
|
|
||||||
AC_CHECK_HEADERS([X11/Xlib.h], [
|
|
||||||
AC_CHECK_HEADERS([X11/Xutil.h X11/keysym.h], [
|
|
||||||
AC_CHECK_LIB([X11], [XOpenDisplay], [
|
|
||||||
enable_X11=yes
|
|
||||||
AC_SUBST([HWLOC_X11_LIBS], ["-lX11"])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_X11], [1], [Define to 1 if X11 libraries are available.])
|
|
||||||
])]
|
|
||||||
)],,
|
|
||||||
[[#include <X11/Xlib.h>]]
|
|
||||||
)
|
|
||||||
if test "x$enable_X11" != "xyes"; then
|
|
||||||
AC_MSG_WARN([X11 headers not found, Cairo/X11 back-end disabled])
|
|
||||||
hwloc_cairo_happy=no
|
|
||||||
fi
|
|
||||||
|
|
||||||
CFLAGS=$CFLAGS_save
|
|
||||||
LIBS=$LIBS_save
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test "x$hwloc_cairo_happy" = "xyes"; then
|
|
||||||
AC_DEFINE([HWLOC_HAVE_CAIRO], [1], [Define to 1 if you have the `cairo' library.])
|
|
||||||
else
|
|
||||||
AS_IF([test "$enable_cairo" = "yes"],
|
|
||||||
[AC_MSG_WARN([--enable-cairo requested, but Cairo/X11 support was not found])
|
|
||||||
AC_MSG_ERROR([Cannot continue])])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_TYPES([wchar_t], [
|
|
||||||
AC_CHECK_FUNCS([putwc])
|
|
||||||
], [], [[#include <wchar.h>]])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([locale.h], [
|
|
||||||
AC_CHECK_FUNCS([setlocale])
|
|
||||||
])
|
|
||||||
AC_CHECK_HEADERS([langinfo.h], [
|
|
||||||
AC_CHECK_FUNCS([nl_langinfo])
|
|
||||||
])
|
|
||||||
hwloc_old_LIBS="$LIBS"
|
|
||||||
chosen_curses=""
|
|
||||||
for curses in ncurses curses
|
|
||||||
do
|
|
||||||
for lib in "" -ltermcap -l${curses}w -l$curses
|
|
||||||
do
|
|
||||||
AC_MSG_CHECKING(termcap support using $curses and $lib)
|
|
||||||
LIBS="$hwloc_old_LIBS $lib"
|
|
||||||
AC_LINK_IFELSE([AC_LANG_PROGRAM([[
|
|
||||||
#include <$curses.h>
|
|
||||||
#include <term.h>
|
|
||||||
]], [[tparm(NULL, 0, 0, 0, 0, 0, 0, 0, 0, 0)]])], [
|
|
||||||
AC_MSG_RESULT(yes)
|
|
||||||
AC_SUBST([HWLOC_TERMCAP_LIBS], ["$LIBS"])
|
|
||||||
AC_DEFINE([HWLOC_HAVE_LIBTERMCAP], [1],
|
|
||||||
[Define to 1 if you have a library providing the termcap interface])
|
|
||||||
chosen_curses=$curses
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT(no)
|
|
||||||
])
|
|
||||||
test "x$chosen_curses" != "x" && break
|
|
||||||
done
|
|
||||||
test "x$chosen_curses" != "x" && break
|
|
||||||
done
|
|
||||||
if test "$chosen_curses" = ncurses
|
|
||||||
then
|
|
||||||
AC_DEFINE([HWLOC_USE_NCURSES], [1], [Define to 1 if ncurses works, preferred over curses])
|
|
||||||
fi
|
|
||||||
LIBS="$hwloc_old_LIBS"
|
|
||||||
unset hwloc_old_LIBS
|
|
||||||
|
|
||||||
_HWLOC_CHECK_DIFF_U
|
|
||||||
|
|
||||||
# Only generate this if we're building the utilities
|
|
||||||
AC_CONFIG_FILES(
|
|
||||||
hwloc_config_prefix[utils/Makefile]
|
|
||||||
hwloc_config_prefix[hwloc.pc])
|
|
||||||
])dnl
|
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
|
||||||
|
|
||||||
# Probably only ever invoked by hwloc's configure.ac
|
|
||||||
AC_DEFUN([HWLOC_SETUP_TESTS],[
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
###
|
|
||||||
### Configuring hwloc tests
|
|
||||||
###
|
|
||||||
EOF
|
|
||||||
|
|
||||||
hwloc_build_tests=yes
|
|
||||||
|
|
||||||
# linux-libnuma.h testing requires libnuma with numa_bitmask_alloc()
|
|
||||||
AC_CHECK_DECL([numa_bitmask_alloc], [hwloc_have_linux_libnuma=yes], [],
|
|
||||||
[#include <numa.h>])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([infiniband/verbs.h], [
|
|
||||||
AC_CHECK_LIB([ibverbs], [ibv_open_device],
|
|
||||||
[AC_DEFINE([HAVE_LIBIBVERBS], 1, [Define to 1 if we have -libverbs])
|
|
||||||
hwloc_have_libibverbs=yes])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([myriexpress.h], [
|
|
||||||
AC_MSG_CHECKING(if MX_NUMA_NODE exists)
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <myriexpress.h>]],
|
|
||||||
[[int a = MX_NUMA_NODE;]],
|
|
||||||
[AC_MSG_RESULT(yes)
|
|
||||||
AC_CHECK_LIB([myriexpress], [mx_get_info],
|
|
||||||
[AC_DEFINE([HAVE_MYRIEXPRESS], 1, [Define to 1 if we have -lmyriexpress])
|
|
||||||
hwloc_have_myriexpress=yes])],
|
|
||||||
[AC_MSG_RESULT(no)])])])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([cuda.h], [
|
|
||||||
AC_MSG_CHECKING(if CUDA_VERSION >= 3020)
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
||||||
#include <cuda.h>
|
|
||||||
#ifndef CUDA_VERSION
|
|
||||||
#error CUDA_VERSION undefined
|
|
||||||
#elif CUDA_VERSION < 3020
|
|
||||||
#error CUDA_VERSION too old
|
|
||||||
#endif]], [[int i = 3;]])],
|
|
||||||
[AC_MSG_RESULT(yes)
|
|
||||||
AC_CHECK_LIB([cuda], [cuInit],
|
|
||||||
[AC_DEFINE([HAVE_CUDA], 1, [Define to 1 if we have -lcuda])
|
|
||||||
hwloc_have_cuda=yes])],
|
|
||||||
[AC_MSG_RESULT(no)])])
|
|
||||||
|
|
||||||
AC_CHECK_HEADERS([cuda_runtime_api.h], [
|
|
||||||
AC_MSG_CHECKING(if CUDART_VERSION >= 3020)
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
|
|
||||||
#include <cuda_runtime_api.h>
|
|
||||||
#ifndef CUDART_VERSION
|
|
||||||
#error CUDART_VERSION undefined
|
|
||||||
#elif CUDART_VERSION < 3020
|
|
||||||
#error CUDART_VERSION too old
|
|
||||||
#endif]], [[int i = 3;]])],
|
|
||||||
[AC_MSG_RESULT(yes)
|
|
||||||
AC_CHECK_LIB([cudart], [cudaGetDeviceCount],
|
|
||||||
[AC_DEFINE([HAVE_CUDART], 1, [Define to 1 if we have -lcudart])
|
|
||||||
hwloc_have_cudart=yes])],
|
|
||||||
[AC_MSG_RESULT(no)])])
|
|
||||||
|
|
||||||
if test "x$enable_xml" != "xno"; then
|
|
||||||
AC_CHECK_PROGS(XMLLINT, [xmllint])
|
|
||||||
fi
|
|
||||||
|
|
||||||
AC_CHECK_PROGS(BUNZIPP, bunzip2, false)
|
|
||||||
|
|
||||||
_HWLOC_CHECK_DIFF_U
|
|
||||||
|
|
||||||
# Only generate these files if we're making the tests
|
|
||||||
AC_CONFIG_FILES(
|
|
||||||
hwloc_config_prefix[tests/Makefile]
|
|
||||||
hwloc_config_prefix[tests/linux/Makefile]
|
|
||||||
hwloc_config_prefix[tests/linux/gather/Makefile]
|
|
||||||
hwloc_config_prefix[tests/xml/Makefile]
|
|
||||||
hwloc_config_prefix[tests/ports/Makefile]
|
|
||||||
hwloc_config_prefix[tests/linux/hwloc-gather-topology]
|
|
||||||
hwloc_config_prefix[tests/linux/gather/test-gather-topology.sh]
|
|
||||||
hwloc_config_prefix[tests/linux/test-topology.sh]
|
|
||||||
hwloc_config_prefix[tests/xml/test-topology.sh]
|
|
||||||
hwloc_config_prefix[utils/test-hwloc-calc.sh]
|
|
||||||
hwloc_config_prefix[utils/test-hwloc-distrib.sh])
|
|
||||||
|
|
||||||
AC_CONFIG_COMMANDS([chmoding-scripts], [chmod +x ]hwloc_config_prefix[tests/linux/test-topology.sh ]hwloc_config_prefix[tests/xml/test-topology.sh ]hwloc_config_prefix[tests/linux/hwloc-gather-topology ]hwloc_config_prefix[tests/linux/gather/test-gather-topology.sh ]hwloc_config_prefix[utils/test-hwloc-calc.sh ]hwloc_config_prefix[utils/test-hwloc-distrib.sh])
|
|
||||||
|
|
||||||
# These links are only needed in standalone mode. It would
|
|
||||||
# be nice to m4 foreach this somehow, but whenever I tried
|
|
||||||
# it, I got obscure "invalid tag" errors from
|
|
||||||
# AC_CONFIG_LINKS. :-\ Since these tests are only run when
|
|
||||||
# built in standalone mode, only generate them in
|
|
||||||
# standalone mode.
|
|
||||||
AC_CONFIG_LINKS(
|
|
||||||
hwloc_config_prefix[tests/ports/topology.c]:hwloc_config_prefix[src/topology.c]
|
|
||||||
hwloc_config_prefix[tests/ports/traversal.c]:hwloc_config_prefix[src/traversal.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-synthetic.c]:hwloc_config_prefix[src/topology-synthetic.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-solaris.c]:hwloc_config_prefix[src/topology-solaris.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-aix.c]:hwloc_config_prefix[src/topology-aix.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-osf.c]:hwloc_config_prefix[src/topology-osf.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-windows.c]:hwloc_config_prefix[src/topology-windows.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-darwin.c]:hwloc_config_prefix[src/topology-darwin.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-freebsd.c]:hwloc_config_prefix[src/topology-freebsd.c]
|
|
||||||
hwloc_config_prefix[tests/ports/topology-hpux.c]:hwloc_config_prefix[src/topology-hpux.c])
|
|
||||||
])
|
|
||||||
])dnl
|
|
|
@ -1,187 +0,0 @@
|
||||||
# Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
#
|
|
||||||
# hwloc modification to the following PKG_* macros -- add HWLOC_
|
|
||||||
# prefix to make it "safe" to embed these macros in other packages.
|
|
||||||
# Originally copied from the pkg-config package; see copyright and
|
|
||||||
# license below.
|
|
||||||
|
|
||||||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
|
||||||
#
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2 of the License, or
|
|
||||||
# (at your option) any later version.
|
|
||||||
#
|
|
||||||
# This program is distributed in the hope that it will be useful, but
|
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
# General Public License for more details.
|
|
||||||
#
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program; if not, write to the Free Software
|
|
||||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
||||||
#
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
# HWLOC_PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
|
||||||
# ----------------------------------
|
|
||||||
AC_DEFUN([HWLOC_PKG_PROG_PKG_CONFIG],
|
|
||||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
|
||||||
m4_pattern_allow([^HWLOC_PKG_CONFIG(_PATH)?$])
|
|
||||||
AC_ARG_VAR([HWLOC_PKG_CONFIG], [path to pkg-config utility])dnl
|
|
||||||
if test "x$ac_cv_env_HWLOC_PKG_CONFIG_set" != "xset"; then
|
|
||||||
AC_PATH_TOOL([HWLOC_PKG_CONFIG], [pkg-config])
|
|
||||||
fi
|
|
||||||
if test -n "$HWLOC_PKG_CONFIG"; then
|
|
||||||
HWLOC_pkg_min_version=m4_default([$1], [0.9.0])
|
|
||||||
AC_MSG_CHECKING([pkg-config is at least version $HWLOC_pkg_min_version])
|
|
||||||
if $HWLOC_PKG_CONFIG --atleast-pkgconfig-version $HWLOC_pkg_min_version; then
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
HWLOC_PKG_CONFIG=""
|
|
||||||
fi
|
|
||||||
|
|
||||||
fi[]dnl
|
|
||||||
])# HWLOC_PKG_PROG_PKG_CONFIG
|
|
||||||
|
|
||||||
# HWLOC_PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
|
||||||
#
|
|
||||||
# Check to see whether a particular set of modules exists. Similar
|
|
||||||
# to HWLOC_PKG_CHECK_MODULES(), but does not set variables or print errors.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Similar to HWLOC_PKG_CHECK_MODULES, make sure that the first instance of
|
|
||||||
# this or HWLOC_PKG_CHECK_MODULES is called, or make sure to call
|
|
||||||
# HWLOC_PKG_CHECK_EXISTS manually
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
AC_DEFUN([HWLOC_PKG_CHECK_EXISTS],
|
|
||||||
[AC_REQUIRE([HWLOC_PKG_PROG_PKG_CONFIG])dnl
|
|
||||||
if test -n "$HWLOC_PKG_CONFIG" && \
|
|
||||||
AC_RUN_LOG([$HWLOC_PKG_CONFIG --exists --silence-errors "$1"]); then
|
|
||||||
m4_ifval([$2], [$2], [:])
|
|
||||||
m4_ifvaln([$3], [else
|
|
||||||
$3])dnl
|
|
||||||
fi])
|
|
||||||
|
|
||||||
|
|
||||||
# _HWLOC_PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
|
||||||
# ---------------------------------------------
|
|
||||||
m4_define([_HWLOC_PKG_CONFIG],
|
|
||||||
[if test -n "$HWLOC_PKG_CONFIG"; then
|
|
||||||
if test -n "$$1"; then
|
|
||||||
HWLOC_pkg_cv_[]$1="$$1"
|
|
||||||
else
|
|
||||||
HWLOC_PKG_CHECK_EXISTS([$3],
|
|
||||||
[HWLOC_pkg_cv_[]$1=`$HWLOC_PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
|
|
||||||
[HWLOC_pkg_failed=yes])
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
HWLOC_pkg_failed=untried
|
|
||||||
fi[]
|
|
||||||
])# _HWLOC_PKG_CONFIG
|
|
||||||
|
|
||||||
# _HWLOC_PKG_SHORT_ERRORS_SUPPORTED
|
|
||||||
# -----------------------------
|
|
||||||
AC_DEFUN([_HWLOC_PKG_SHORT_ERRORS_SUPPORTED],
|
|
||||||
[AC_REQUIRE([HWLOC_PKG_PROG_PKG_CONFIG])
|
|
||||||
if $HWLOC_PKG_CONFIG --atleast-pkgconfig-version 0.20; then
|
|
||||||
HWLOC_pkg_short_errors_supported=yes
|
|
||||||
else
|
|
||||||
HWLOC_pkg_short_errors_supported=no
|
|
||||||
fi[]dnl
|
|
||||||
])# _HWLOC_PKG_SHORT_ERRORS_SUPPORTED
|
|
||||||
|
|
||||||
|
|
||||||
# HWLOC_PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
|
||||||
# [ACTION-IF-NOT-FOUND])
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Note that if there is a possibility the first call to
|
|
||||||
# HWLOC_PKG_CHECK_MODULES might not happen, you should be sure to include an
|
|
||||||
# explicit call to HWLOC_PKG_PROG_PKG_CONFIG in your configure.ac
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
AC_DEFUN([HWLOC_PKG_CHECK_MODULES],[
|
|
||||||
AC_REQUIRE([HWLOC_PKG_PROG_PKG_CONFIG])dnl
|
|
||||||
AC_ARG_VAR([HWLOC_]$1[_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
|
||||||
AC_ARG_VAR([HWLOC_]$1[_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
|
||||||
|
|
||||||
HWLOC_pkg_failed=no
|
|
||||||
AC_MSG_CHECKING([for $1])
|
|
||||||
|
|
||||||
_HWLOC_PKG_CONFIG([HWLOC_][$1][_CFLAGS], [cflags], [$2])
|
|
||||||
_HWLOC_PKG_CONFIG([HWLOC_][$1][_LIBS], [libs], [$2])
|
|
||||||
|
|
||||||
m4_define([_HWLOC_PKG_TEXT], [Alternatively, you may set the environment variables HWLOC_[]$1[]_CFLAGS
|
|
||||||
and HWLOC_[]$1[]_LIBS to avoid the need to call pkg-config.
|
|
||||||
See the pkg-config man page for more details.])
|
|
||||||
|
|
||||||
# Check for failure of pkg-config
|
|
||||||
if test $HWLOC_pkg_failed = yes; then
|
|
||||||
_HWLOC_PKG_SHORT_ERRORS_SUPPORTED
|
|
||||||
if test $HWLOC_pkg_short_errors_supported = yes; then
|
|
||||||
HWLOC_[]$1[]_PKG_ERRORS=`$HWLOC_PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2" 2>&1`
|
|
||||||
else
|
|
||||||
HWLOC_[]$1[]_PKG_ERRORS=`$HWLOC_PKG_CONFIG --errors-to-stdout --print-errors "$2" 2>&1`
|
|
||||||
fi
|
|
||||||
# Put the nasty error message in config.log where it belongs
|
|
||||||
echo "$HWLOC_[]$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD
|
|
||||||
|
|
||||||
ifelse([$5], , [AC_MSG_ERROR(dnl
|
|
||||||
[Package requirements ($2) were not met:
|
|
||||||
|
|
||||||
$HWLOCC_$1_PKG_ERRORS
|
|
||||||
|
|
||||||
Consider adjusting the HWLOC_PKG_CONFIG_PATH environment variable if you
|
|
||||||
installed software in a non-standard prefix.
|
|
||||||
|
|
||||||
_HWLOC_PKG_TEXT
|
|
||||||
])],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
$5])
|
|
||||||
elif test $HWLOC_pkg_failed = untried; then
|
|
||||||
ifelse([$5], , [AC_MSG_FAILURE(dnl
|
|
||||||
[The pkg-config script could not be found or is too old. Make sure it
|
|
||||||
is in your PATH or set the HWLOC_PKG_CONFIG environment variable to the full
|
|
||||||
path to pkg-config.
|
|
||||||
|
|
||||||
_HWLOC_PKG_TEXT
|
|
||||||
|
|
||||||
To get pkg-config, see <http://pkg-config.freedesktop.org/>.])],
|
|
||||||
[$5])
|
|
||||||
else
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
|
|
||||||
# If we got good results from pkg-config, check that they
|
|
||||||
# actually work (i.e., that we can link against the resulting
|
|
||||||
# $LIBS). The canonical example why we do this is if
|
|
||||||
# pkg-config returns 64 bit libraries but ./configure was run
|
|
||||||
# with CFLAGS=-m32 LDFLAGS=-m32. pkg-config gave us valid
|
|
||||||
# results, but we'll fail if we try to link. So detect that
|
|
||||||
# failure now.
|
|
||||||
hwloc_cflags_save=$CFLAGS
|
|
||||||
hwloc_libs_save=$LIBS
|
|
||||||
CFLAGS="$CFLAGS $HWLOC_pkg_cv_HWLOC_[]$1[]_CFLAGS"
|
|
||||||
LIBS="$LIBS $HWLOC_pkg_cv_HWLOC_[]$1[]_LIBS"
|
|
||||||
AC_CHECK_FUNC([$3], [hwloc_result=yes], [hwloc_result=no])
|
|
||||||
CFLAGS=$hwloc_cflags_save
|
|
||||||
LIBS=$hwloc_libs_save
|
|
||||||
|
|
||||||
AC_MSG_CHECKING([for final $1 support])
|
|
||||||
AS_IF([test "$hwloc_result" = "yes"],
|
|
||||||
[HWLOC_[]$1[]_CFLAGS=$HWLOC_pkg_cv_HWLOC_[]$1[]_CFLAGS
|
|
||||||
HWLOC_[]$1[]_LIBS=$HWLOC_pkg_cv_HWLOC_[]$1[]_LIBS
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
ifelse([$4], , :, [$4])],
|
|
||||||
[AC_MSG_RESULT([no])
|
|
||||||
ifelse([$5], , :, [$5])])
|
|
||||||
fi[]dnl
|
|
||||||
])# HWLOC_PKG_CHECK_MODULES
|
|
|
@ -1,520 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# install - install a program, script, or datafile
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# This originates from X11R5 (mit/util/scripts/install.sh), which was
|
|
||||||
# later released in X11R6 (xc/config/util/install.sh) with the
|
|
||||||
# following copyright and license.
|
|
||||||
#
|
|
||||||
# Copyright (C) 1994 X Consortium
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to
|
|
||||||
# deal in the Software without restriction, including without limitation the
|
|
||||||
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
||||||
# sell copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
||||||
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
|
|
||||||
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
#
|
|
||||||
# Except as contained in this notice, the name of the X Consortium shall not
|
|
||||||
# be used in advertising or otherwise to promote the sale, use or other deal-
|
|
||||||
# ings in this Software without prior written authorization from the X Consor-
|
|
||||||
# tium.
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# FSF changes to this file are in the public domain.
|
|
||||||
#
|
|
||||||
# Calling this script install-sh is preferred over install.sh, to prevent
|
|
||||||
# `make' implicit rules from creating a file called install from it
|
|
||||||
# when there is no Makefile.
|
|
||||||
#
|
|
||||||
# This script is compatible with the BSD install script, but was written
|
|
||||||
# from scratch.
|
|
||||||
|
|
||||||
nl='
|
|
||||||
'
|
|
||||||
IFS=" "" $nl"
|
|
||||||
|
|
||||||
# set DOITPROG to echo to test this script
|
|
||||||
|
|
||||||
# Don't use :- since 4.3BSD and earlier shells don't like it.
|
|
||||||
doit=${DOITPROG-}
|
|
||||||
if test -z "$doit"; then
|
|
||||||
doit_exec=exec
|
|
||||||
else
|
|
||||||
doit_exec=$doit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Put in absolute file names if you don't have them in your path;
|
|
||||||
# or use environment vars.
|
|
||||||
|
|
||||||
chgrpprog=${CHGRPPROG-chgrp}
|
|
||||||
chmodprog=${CHMODPROG-chmod}
|
|
||||||
chownprog=${CHOWNPROG-chown}
|
|
||||||
cmpprog=${CMPPROG-cmp}
|
|
||||||
cpprog=${CPPROG-cp}
|
|
||||||
mkdirprog=${MKDIRPROG-mkdir}
|
|
||||||
mvprog=${MVPROG-mv}
|
|
||||||
rmprog=${RMPROG-rm}
|
|
||||||
stripprog=${STRIPPROG-strip}
|
|
||||||
|
|
||||||
posix_glob='?'
|
|
||||||
initialize_posix_glob='
|
|
||||||
test "$posix_glob" != "?" || {
|
|
||||||
if (set -f) 2>/dev/null; then
|
|
||||||
posix_glob=
|
|
||||||
else
|
|
||||||
posix_glob=:
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
'
|
|
||||||
|
|
||||||
posix_mkdir=
|
|
||||||
|
|
||||||
# Desired mode of installed file.
|
|
||||||
mode=0755
|
|
||||||
|
|
||||||
chgrpcmd=
|
|
||||||
chmodcmd=$chmodprog
|
|
||||||
chowncmd=
|
|
||||||
mvcmd=$mvprog
|
|
||||||
rmcmd="$rmprog -f"
|
|
||||||
stripcmd=
|
|
||||||
|
|
||||||
src=
|
|
||||||
dst=
|
|
||||||
dir_arg=
|
|
||||||
dst_arg=
|
|
||||||
|
|
||||||
copy_on_change=false
|
|
||||||
no_target_directory=
|
|
||||||
|
|
||||||
usage="\
|
|
||||||
Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
|
||||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
|
||||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
|
||||||
or: $0 [OPTION]... -d DIRECTORIES...
|
|
||||||
|
|
||||||
In the 1st form, copy SRCFILE to DSTFILE.
|
|
||||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
|
||||||
In the 4th, create DIRECTORIES.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
--help display this help and exit.
|
|
||||||
--version display version info and exit.
|
|
||||||
|
|
||||||
-c (ignored)
|
|
||||||
-C install only if different (preserve the last data modification time)
|
|
||||||
-d create directories instead of installing files.
|
|
||||||
-g GROUP $chgrpprog installed files to GROUP.
|
|
||||||
-m MODE $chmodprog installed files to MODE.
|
|
||||||
-o USER $chownprog installed files to USER.
|
|
||||||
-s $stripprog installed files.
|
|
||||||
-t DIRECTORY install into DIRECTORY.
|
|
||||||
-T report an error if DSTFILE is a directory.
|
|
||||||
|
|
||||||
Environment variables override the default commands:
|
|
||||||
CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG
|
|
||||||
RMPROG STRIPPROG
|
|
||||||
"
|
|
||||||
|
|
||||||
while test $# -ne 0; do
|
|
||||||
case $1 in
|
|
||||||
-c) ;;
|
|
||||||
|
|
||||||
-C) copy_on_change=true;;
|
|
||||||
|
|
||||||
-d) dir_arg=true;;
|
|
||||||
|
|
||||||
-g) chgrpcmd="$chgrpprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
--help) echo "$usage"; exit $?;;
|
|
||||||
|
|
||||||
-m) mode=$2
|
|
||||||
case $mode in
|
|
||||||
*' '* | *' '* | *'
|
|
||||||
'* | *'*'* | *'?'* | *'['*)
|
|
||||||
echo "$0: invalid mode: $mode" >&2
|
|
||||||
exit 1;;
|
|
||||||
esac
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-o) chowncmd="$chownprog $2"
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-s) stripcmd=$stripprog;;
|
|
||||||
|
|
||||||
-t) dst_arg=$2
|
|
||||||
shift;;
|
|
||||||
|
|
||||||
-T) no_target_directory=true;;
|
|
||||||
|
|
||||||
--version) echo "$0 $scriptversion"; exit $?;;
|
|
||||||
|
|
||||||
--) shift
|
|
||||||
break;;
|
|
||||||
|
|
||||||
-*) echo "$0: invalid option: $1" >&2
|
|
||||||
exit 1;;
|
|
||||||
|
|
||||||
*) break;;
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then
|
|
||||||
# When -d is used, all remaining arguments are directories to create.
|
|
||||||
# When -t is used, the destination is already specified.
|
|
||||||
# Otherwise, the last argument is the destination. Remove it from $@.
|
|
||||||
for arg
|
|
||||||
do
|
|
||||||
if test -n "$dst_arg"; then
|
|
||||||
# $@ is not empty: it contains at least $arg.
|
|
||||||
set fnord "$@" "$dst_arg"
|
|
||||||
shift # fnord
|
|
||||||
fi
|
|
||||||
shift # arg
|
|
||||||
dst_arg=$arg
|
|
||||||
done
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
echo "$0: no input file specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
# It's OK to call `install-sh -d' without argument.
|
|
||||||
# This can happen when creating conditional directories.
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dir_arg"; then
|
|
||||||
trap '(exit $?); exit' 1 2 13 15
|
|
||||||
|
|
||||||
# Set umask so as not to create temps with too-generous modes.
|
|
||||||
# However, 'strip' requires both read and write access to temps.
|
|
||||||
case $mode in
|
|
||||||
# Optimize common cases.
|
|
||||||
*644) cp_umask=133;;
|
|
||||||
*755) cp_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw='% 200'
|
|
||||||
fi
|
|
||||||
cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
|
|
||||||
*)
|
|
||||||
if test -z "$stripcmd"; then
|
|
||||||
u_plus_rw=
|
|
||||||
else
|
|
||||||
u_plus_rw=,u+rw
|
|
||||||
fi
|
|
||||||
cp_umask=$mode$u_plus_rw;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
for src
|
|
||||||
do
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $src in
|
|
||||||
-*) src=./$src;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
dst=$src
|
|
||||||
dstdir=$dst
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
else
|
|
||||||
|
|
||||||
# Waiting for this to be detected by the "$cpprog $src $dsttmp" command
|
|
||||||
# might cause directories to be created, which would be especially bad
|
|
||||||
# if $src (and thus $dsttmp) contains '*'.
|
|
||||||
if test ! -f "$src" && test ! -d "$src"; then
|
|
||||||
echo "$0: $src does not exist." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -z "$dst_arg"; then
|
|
||||||
echo "$0: no destination specified." >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
dst=$dst_arg
|
|
||||||
# Protect names starting with `-'.
|
|
||||||
case $dst in
|
|
||||||
-*) dst=./$dst;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If destination is a directory, append the input filename; won't work
|
|
||||||
# if double slashes aren't ignored.
|
|
||||||
if test -d "$dst"; then
|
|
||||||
if test -n "$no_target_directory"; then
|
|
||||||
echo "$0: $dst_arg: Is a directory" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
dstdir=$dst
|
|
||||||
dst=$dstdir/`basename "$src"`
|
|
||||||
dstdir_status=0
|
|
||||||
else
|
|
||||||
# Prefer dirname, but fall back on a substitute if dirname fails.
|
|
||||||
dstdir=`
|
|
||||||
(dirname "$dst") 2>/dev/null ||
|
|
||||||
expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$dst" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$dst" : 'X\(//\)$' \| \
|
|
||||||
X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
echo X"$dst" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'
|
|
||||||
`
|
|
||||||
|
|
||||||
test -d "$dstdir"
|
|
||||||
dstdir_status=$?
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
obsolete_mkdir_used=false
|
|
||||||
|
|
||||||
if test $dstdir_status != 0; then
|
|
||||||
case $posix_mkdir in
|
|
||||||
'')
|
|
||||||
# Create intermediate dirs using mode 755 as modified by the umask.
|
|
||||||
# This is like FreeBSD 'install' as of 1997-10-28.
|
|
||||||
umask=`umask`
|
|
||||||
case $stripcmd.$umask in
|
|
||||||
# Optimize common cases.
|
|
||||||
*[2367][2367]) mkdir_umask=$umask;;
|
|
||||||
.*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
|
|
||||||
|
|
||||||
*[0-7])
|
|
||||||
mkdir_umask=`expr $umask + 22 \
|
|
||||||
- $umask % 100 % 40 + $umask % 20 \
|
|
||||||
- $umask % 10 % 4 + $umask % 2
|
|
||||||
`;;
|
|
||||||
*) mkdir_umask=$umask,go-w;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# With -d, create the new directory with the user-specified mode.
|
|
||||||
# Otherwise, rely on $mkdir_umask.
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
mkdir_mode=-m$mode
|
|
||||||
else
|
|
||||||
mkdir_mode=
|
|
||||||
fi
|
|
||||||
|
|
||||||
posix_mkdir=false
|
|
||||||
case $umask in
|
|
||||||
*[123567][0-7][0-7])
|
|
||||||
# POSIX mkdir -p sets u+wx bits regardless of umask, which
|
|
||||||
# is incompatible with FreeBSD 'install' when (umask & 300) != 0.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
|
|
||||||
trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
|
|
||||||
|
|
||||||
if (umask $mkdir_umask &&
|
|
||||||
exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
if test -z "$dir_arg" || {
|
|
||||||
# Check for POSIX incompatibilities with -m.
|
|
||||||
# HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
|
|
||||||
# other-writeable bit of parent directory when it shouldn't.
|
|
||||||
# FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
|
|
||||||
ls_ld_tmpdir=`ls -ld "$tmpdir"`
|
|
||||||
case $ls_ld_tmpdir in
|
|
||||||
d????-?r-*) different_mode=700;;
|
|
||||||
d????-?--*) different_mode=755;;
|
|
||||||
*) false;;
|
|
||||||
esac &&
|
|
||||||
$mkdirprog -m$different_mode -p -- "$tmpdir" && {
|
|
||||||
ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
|
|
||||||
test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
then posix_mkdir=:
|
|
||||||
fi
|
|
||||||
rmdir "$tmpdir/d" "$tmpdir"
|
|
||||||
else
|
|
||||||
# Remove any dirs left behind by ancient mkdir implementations.
|
|
||||||
rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
|
|
||||||
fi
|
|
||||||
trap '' 0;;
|
|
||||||
esac;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
if
|
|
||||||
$posix_mkdir && (
|
|
||||||
umask $mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
|
|
||||||
)
|
|
||||||
then :
|
|
||||||
else
|
|
||||||
|
|
||||||
# The umask is ridiculous, or mkdir does not conform to POSIX,
|
|
||||||
# or it failed possibly due to a race condition. Create the
|
|
||||||
# directory the slow way, step by step, checking for races as we go.
|
|
||||||
|
|
||||||
case $dstdir in
|
|
||||||
/*) prefix='/';;
|
|
||||||
-*) prefix='./';;
|
|
||||||
*) prefix='';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob"
|
|
||||||
|
|
||||||
oIFS=$IFS
|
|
||||||
IFS=/
|
|
||||||
$posix_glob set -f
|
|
||||||
set fnord $dstdir
|
|
||||||
shift
|
|
||||||
$posix_glob set +f
|
|
||||||
IFS=$oIFS
|
|
||||||
|
|
||||||
prefixes=
|
|
||||||
|
|
||||||
for d
|
|
||||||
do
|
|
||||||
test -z "$d" && continue
|
|
||||||
|
|
||||||
prefix=$prefix$d
|
|
||||||
if test -d "$prefix"; then
|
|
||||||
prefixes=
|
|
||||||
else
|
|
||||||
if $posix_mkdir; then
|
|
||||||
(umask=$mkdir_umask &&
|
|
||||||
$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
test -d "$prefix" || exit 1
|
|
||||||
else
|
|
||||||
case $prefix in
|
|
||||||
*\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
|
|
||||||
*) qprefix=$prefix;;
|
|
||||||
esac
|
|
||||||
prefixes="$prefixes '$qprefix'"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
prefix=$prefix/
|
|
||||||
done
|
|
||||||
|
|
||||||
if test -n "$prefixes"; then
|
|
||||||
# Don't fail if two instances are running concurrently.
|
|
||||||
(umask $mkdir_umask &&
|
|
||||||
eval "\$doit_exec \$mkdirprog $prefixes") ||
|
|
||||||
test -d "$dstdir" || exit 1
|
|
||||||
obsolete_mkdir_used=true
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if test -n "$dir_arg"; then
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
|
|
||||||
{ test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
|
|
||||||
test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
|
|
||||||
else
|
|
||||||
|
|
||||||
# Make a couple of temp file names in the proper directory.
|
|
||||||
dsttmp=$dstdir/_inst.$$_
|
|
||||||
rmtmp=$dstdir/_rm.$$_
|
|
||||||
|
|
||||||
# Trap to clean up those temp files at exit.
|
|
||||||
trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
|
||||||
|
|
||||||
# Copy the file name to the temp name.
|
|
||||||
(umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
|
|
||||||
|
|
||||||
# and set any options; do chmod last to preserve setuid bits.
|
|
||||||
#
|
|
||||||
# If any of these fail, we abort the whole thing. If we want to
|
|
||||||
# ignore errors from any of these, just make sure not to ignore
|
|
||||||
# errors from the above "$doit $cpprog $src $dsttmp" command.
|
|
||||||
#
|
|
||||||
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } &&
|
|
||||||
{ test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
|
|
||||||
|
|
||||||
# If -C, don't bother to copy if it wouldn't change the file.
|
|
||||||
if $copy_on_change &&
|
|
||||||
old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` &&
|
|
||||||
new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` &&
|
|
||||||
|
|
||||||
eval "$initialize_posix_glob" &&
|
|
||||||
$posix_glob set -f &&
|
|
||||||
set X $old && old=:$2:$4:$5:$6 &&
|
|
||||||
set X $new && new=:$2:$4:$5:$6 &&
|
|
||||||
$posix_glob set +f &&
|
|
||||||
|
|
||||||
test "$old" = "$new" &&
|
|
||||||
$cmpprog "$dst" "$dsttmp" >/dev/null 2>&1
|
|
||||||
then
|
|
||||||
rm -f "$dsttmp"
|
|
||||||
else
|
|
||||||
# Rename the file to the real destination.
|
|
||||||
$doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null ||
|
|
||||||
|
|
||||||
# The rename failed, perhaps because mv can't rename something else
|
|
||||||
# to itself, or perhaps because mv is so ancient that it does not
|
|
||||||
# support -f.
|
|
||||||
{
|
|
||||||
# Now remove or move aside any old file at destination location.
|
|
||||||
# We try this two ways since rm can't unlink itself on some
|
|
||||||
# systems and the destination file might be busy for other
|
|
||||||
# reasons. In this case, the final cleanup might fail but the new
|
|
||||||
# file should still install successfully.
|
|
||||||
{
|
|
||||||
test ! -f "$dst" ||
|
|
||||||
$doit $rmcmd -f "$dst" 2>/dev/null ||
|
|
||||||
{ $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null &&
|
|
||||||
{ $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }
|
|
||||||
} ||
|
|
||||||
{ echo "$0: cannot unlink or rename $dst" >&2
|
|
||||||
(exit 1); exit 1
|
|
||||||
}
|
|
||||||
} &&
|
|
||||||
|
|
||||||
# Now rename the file to the real destination.
|
|
||||||
$doit $mvcmd "$dsttmp" "$dst"
|
|
||||||
}
|
|
||||||
fi || exit 1
|
|
||||||
|
|
||||||
trap '' 0
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -1,369 +0,0 @@
|
||||||
# Helper functions for option handling. -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 7 ltoptions.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ------------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_OPTION],
|
|
||||||
[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
|
|
||||||
# ---------------------------------------
|
|
||||||
# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
|
|
||||||
# matching handler defined, dispatch to it. Other OPTION-NAMEs are
|
|
||||||
# saved as a flag.
|
|
||||||
m4_define([_LT_SET_OPTION],
|
|
||||||
[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
|
|
||||||
m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
_LT_MANGLE_DEFUN([$1], [$2]),
|
|
||||||
[m4_warning([Unknown $1 option `$2'])])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
|
|
||||||
# ------------------------------------------------------------
|
|
||||||
# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
|
|
||||||
m4_define([_LT_IF_OPTION],
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
|
|
||||||
# -------------------------------------------------------
|
|
||||||
# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
|
|
||||||
# are set.
|
|
||||||
m4_define([_LT_UNLESS_OPTIONS],
|
|
||||||
[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
|
|
||||||
[m4_define([$0_found])])])[]dnl
|
|
||||||
m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
|
|
||||||
])[]dnl
|
|
||||||
])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
|
|
||||||
# ----------------------------------------
|
|
||||||
# OPTION-LIST is a space-separated list of Libtool options associated
|
|
||||||
# with MACRO-NAME. If any OPTION has a matching handler declared with
|
|
||||||
# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
|
|
||||||
# the unknown option and exit.
|
|
||||||
m4_defun([_LT_SET_OPTIONS],
|
|
||||||
[# Set options
|
|
||||||
m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
|
|
||||||
[_LT_SET_OPTION([$1], _LT_Option)])
|
|
||||||
|
|
||||||
m4_if([$1],[LT_INIT],[
|
|
||||||
dnl
|
|
||||||
dnl Simply set some default values (i.e off) if boolean options were not
|
|
||||||
dnl specified:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
|
|
||||||
])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
|
|
||||||
])
|
|
||||||
dnl
|
|
||||||
dnl If no reference was made to various pairs of opposing options, then
|
|
||||||
dnl we run the default mode handler for the pair. For example, if neither
|
|
||||||
dnl `shared' nor `disable-shared' was passed, we enable building of shared
|
|
||||||
dnl archives by default:
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
|
|
||||||
_LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
|
|
||||||
[_LT_ENABLE_FAST_INSTALL])
|
|
||||||
])
|
|
||||||
])# _LT_SET_OPTIONS
|
|
||||||
|
|
||||||
|
|
||||||
## --------------------------------- ##
|
|
||||||
## Macros to handle LT_INIT options. ##
|
|
||||||
## --------------------------------- ##
|
|
||||||
|
|
||||||
# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
|
|
||||||
# -----------------------------------------
|
|
||||||
m4_define([_LT_MANGLE_DEFUN],
|
|
||||||
[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
|
|
||||||
|
|
||||||
|
|
||||||
# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
|
|
||||||
# -----------------------------------------------
|
|
||||||
m4_define([LT_OPTION_DEFINE],
|
|
||||||
[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
|
|
||||||
])# LT_OPTION_DEFINE
|
|
||||||
|
|
||||||
|
|
||||||
# dlopen
|
|
||||||
# ------
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_DLOPEN],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [dlopen])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `dlopen' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
|
|
||||||
|
|
||||||
|
|
||||||
# win32-dll
|
|
||||||
# ---------
|
|
||||||
# Declare package support for building win32 dll's.
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [win32-dll],
|
|
||||||
[enable_win32_dll=yes
|
|
||||||
|
|
||||||
case $host in
|
|
||||||
*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
|
|
||||||
AC_CHECK_TOOL(AS, as, false)
|
|
||||||
AC_CHECK_TOOL(DLLTOOL, dlltool, false)
|
|
||||||
AC_CHECK_TOOL(OBJDUMP, objdump, false)
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
test -z "$AS" && AS=as
|
|
||||||
_LT_DECL([], [AS], [1], [Assembler program])dnl
|
|
||||||
|
|
||||||
test -z "$DLLTOOL" && DLLTOOL=dlltool
|
|
||||||
_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
|
|
||||||
|
|
||||||
test -z "$OBJDUMP" && OBJDUMP=objdump
|
|
||||||
_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
|
|
||||||
])# win32-dll
|
|
||||||
|
|
||||||
AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
|
|
||||||
[AC_REQUIRE([AC_CANONICAL_HOST])dnl
|
|
||||||
_LT_SET_OPTION([LT_INIT], [win32-dll])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `win32-dll' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_SHARED([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-shared flag, and supports the `shared' and
|
|
||||||
# `disable-shared' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_SHARED],
|
|
||||||
[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([shared],
|
|
||||||
[AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
|
|
||||||
[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_shared=yes ;;
|
|
||||||
no) enable_shared=no ;;
|
|
||||||
*)
|
|
||||||
enable_shared=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_shared=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_libtool_libs], [enable_shared], [0],
|
|
||||||
[Whether or not to build shared libraries])
|
|
||||||
])# _LT_ENABLE_SHARED
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_SHARED],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-shared])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_SHARED], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_SHARED], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_STATIC([DEFAULT])
|
|
||||||
# ----------------------------
|
|
||||||
# implement the --enable-static flag, and support the `static' and
|
|
||||||
# `disable-static' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_STATIC],
|
|
||||||
[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([static],
|
|
||||||
[AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
|
|
||||||
[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_static=yes ;;
|
|
||||||
no) enable_static=no ;;
|
|
||||||
*)
|
|
||||||
enable_static=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_static=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_static=]_LT_ENABLE_STATIC_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([build_old_libs], [enable_static], [0],
|
|
||||||
[Whether or not to build static libraries])
|
|
||||||
])# _LT_ENABLE_STATIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AC_DEFUN([AC_ENABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AC_DEFUN([AC_DISABLE_STATIC],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-static])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
|
|
||||||
AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AM_ENABLE_STATIC], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_STATIC], [])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_ENABLE_FAST_INSTALL([DEFAULT])
|
|
||||||
# ----------------------------------
|
|
||||||
# implement the --enable-fast-install flag, and support the `fast-install'
|
|
||||||
# and `disable-fast-install' LT_INIT options.
|
|
||||||
# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
|
|
||||||
m4_define([_LT_ENABLE_FAST_INSTALL],
|
|
||||||
[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
|
|
||||||
AC_ARG_ENABLE([fast-install],
|
|
||||||
[AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
|
|
||||||
[optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
|
|
||||||
[p=${PACKAGE-default}
|
|
||||||
case $enableval in
|
|
||||||
yes) enable_fast_install=yes ;;
|
|
||||||
no) enable_fast_install=no ;;
|
|
||||||
*)
|
|
||||||
enable_fast_install=no
|
|
||||||
# Look at the argument we got. We use all the common list separators.
|
|
||||||
lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
|
|
||||||
for pkg in $enableval; do
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
if test "X$pkg" = "X$p"; then
|
|
||||||
enable_fast_install=yes
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
IFS="$lt_save_ifs"
|
|
||||||
;;
|
|
||||||
esac],
|
|
||||||
[enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
|
|
||||||
|
|
||||||
_LT_DECL([fast_install], [enable_fast_install], [0],
|
|
||||||
[Whether or not to optimize for fast installation])dnl
|
|
||||||
])# _LT_ENABLE_FAST_INSTALL
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
|
|
||||||
|
|
||||||
# Old names:
|
|
||||||
AU_DEFUN([AC_ENABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
AU_DEFUN([AC_DISABLE_FAST_INSTALL],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you put
|
|
||||||
the `disable-fast-install' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
|
|
||||||
dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
|
|
||||||
|
|
||||||
|
|
||||||
# _LT_WITH_PIC([MODE])
|
|
||||||
# --------------------
|
|
||||||
# implement the --with-pic flag, and support the `pic-only' and `no-pic'
|
|
||||||
# LT_INIT options.
|
|
||||||
# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
|
|
||||||
m4_define([_LT_WITH_PIC],
|
|
||||||
[AC_ARG_WITH([pic],
|
|
||||||
[AS_HELP_STRING([--with-pic],
|
|
||||||
[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
|
|
||||||
[pic_mode="$withval"],
|
|
||||||
[pic_mode=default])
|
|
||||||
|
|
||||||
test -z "$pic_mode" && pic_mode=m4_default([$1], [default])
|
|
||||||
|
|
||||||
_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
|
|
||||||
])# _LT_WITH_PIC
|
|
||||||
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
|
|
||||||
LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
|
|
||||||
|
|
||||||
# Old name:
|
|
||||||
AU_DEFUN([AC_LIBTOOL_PICMODE],
|
|
||||||
[_LT_SET_OPTION([LT_INIT], [pic-only])
|
|
||||||
AC_DIAGNOSE([obsolete],
|
|
||||||
[$0: Remove this warning and the call to _LT_SET_OPTION when you
|
|
||||||
put the `pic-only' option into LT_INIT's first parameter.])
|
|
||||||
])
|
|
||||||
|
|
||||||
dnl aclocal-1.4 backwards compatibility:
|
|
||||||
dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
|
|
||||||
|
|
||||||
## ----------------- ##
|
|
||||||
## LTDL_INIT Options ##
|
|
||||||
## ----------------- ##
|
|
||||||
|
|
||||||
m4_define([_LTDL_MODE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
|
|
||||||
[m4_define([_LTDL_MODE], [nonrecursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [recursive],
|
|
||||||
[m4_define([_LTDL_MODE], [recursive])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [subproject],
|
|
||||||
[m4_define([_LTDL_MODE], [subproject])])
|
|
||||||
|
|
||||||
m4_define([_LTDL_TYPE], [])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [installable],
|
|
||||||
[m4_define([_LTDL_TYPE], [installable])])
|
|
||||||
LT_OPTION_DEFINE([LTDL_INIT], [convenience],
|
|
||||||
[m4_define([_LTDL_TYPE], [convenience])])
|
|
|
@ -1,123 +0,0 @@
|
||||||
# ltsugar.m4 -- libtool m4 base layer. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.
|
|
||||||
# Written by Gary V. Vaughan, 2004
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 6 ltsugar.m4
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_join(SEP, ARG1, [ARG2...])
|
|
||||||
# -----------------------------
|
|
||||||
# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
|
|
||||||
# associated separator.
|
|
||||||
# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
|
|
||||||
# versions in m4sugar had bugs.
|
|
||||||
m4_define([lt_join],
|
|
||||||
[m4_if([$#], [1], [],
|
|
||||||
[$#], [2], [[$2]],
|
|
||||||
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
m4_define([_lt_join],
|
|
||||||
[m4_if([$#$2], [2], [],
|
|
||||||
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_car(LIST)
|
|
||||||
# lt_cdr(LIST)
|
|
||||||
# ------------
|
|
||||||
# Manipulate m4 lists.
|
|
||||||
# These macros are necessary as long as will still need to support
|
|
||||||
# Autoconf-2.59 which quotes differently.
|
|
||||||
m4_define([lt_car], [[$1]])
|
|
||||||
m4_define([lt_cdr],
|
|
||||||
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
|
|
||||||
[$#], 1, [],
|
|
||||||
[m4_dquote(m4_shift($@))])])
|
|
||||||
m4_define([lt_unquote], $1)
|
|
||||||
|
|
||||||
|
|
||||||
# lt_append(MACRO-NAME, STRING, [SEPARATOR])
|
|
||||||
# ------------------------------------------
|
|
||||||
# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.
|
|
||||||
# Note that neither SEPARATOR nor STRING are expanded; they are appended
|
|
||||||
# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
|
|
||||||
# No SEPARATOR is output if MACRO-NAME was previously undefined (different
|
|
||||||
# than defined and empty).
|
|
||||||
#
|
|
||||||
# This macro is needed until we can rely on Autoconf 2.62, since earlier
|
|
||||||
# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
|
|
||||||
m4_define([lt_append],
|
|
||||||
[m4_define([$1],
|
|
||||||
m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
|
|
||||||
# ----------------------------------------------------------
|
|
||||||
# Produce a SEP delimited list of all paired combinations of elements of
|
|
||||||
# PREFIX-LIST with SUFFIX1 through SUFFIXn. Each element of the list
|
|
||||||
# has the form PREFIXmINFIXSUFFIXn.
|
|
||||||
# Needed until we can rely on m4_combine added in Autoconf 2.62.
|
|
||||||
m4_define([lt_combine],
|
|
||||||
[m4_if(m4_eval([$# > 3]), [1],
|
|
||||||
[m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
|
|
||||||
[[m4_foreach([_Lt_prefix], [$2],
|
|
||||||
[m4_foreach([_Lt_suffix],
|
|
||||||
]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
|
|
||||||
[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
|
|
||||||
# -----------------------------------------------------------------------
|
|
||||||
# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
|
|
||||||
# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
|
|
||||||
m4_define([lt_if_append_uniq],
|
|
||||||
[m4_ifdef([$1],
|
|
||||||
[m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
|
|
||||||
[lt_append([$1], [$2], [$3])$4],
|
|
||||||
[$5])],
|
|
||||||
[lt_append([$1], [$2], [$3])$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add(DICT, KEY, VALUE)
|
|
||||||
# -----------------------------
|
|
||||||
m4_define([lt_dict_add],
|
|
||||||
[m4_define([$1($2)], [$3])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
|
|
||||||
# --------------------------------------------
|
|
||||||
m4_define([lt_dict_add_subkey],
|
|
||||||
[m4_define([$1($2:$3)], [$4])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_fetch(DICT, KEY, [SUBKEY])
|
|
||||||
# ----------------------------------
|
|
||||||
m4_define([lt_dict_fetch],
|
|
||||||
[m4_ifval([$3],
|
|
||||||
m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
|
|
||||||
m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
|
|
||||||
# -----------------------------------------------------------------
|
|
||||||
m4_define([lt_if_dict_fetch],
|
|
||||||
[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
|
|
||||||
[$5],
|
|
||||||
[$6])])
|
|
||||||
|
|
||||||
|
|
||||||
# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
|
|
||||||
# --------------------------------------------------------------
|
|
||||||
m4_define([lt_dict_filter],
|
|
||||||
[m4_if([$5], [], [],
|
|
||||||
[lt_join(m4_quote(m4_default([$4], [[, ]])),
|
|
||||||
lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
|
|
||||||
[lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
|
|
||||||
])
|
|
|
@ -1,23 +0,0 @@
|
||||||
# ltversion.m4 -- version numbers -*- Autoconf -*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# serial 3293 ltversion.m4
|
|
||||||
# This file is part of GNU Libtool
|
|
||||||
|
|
||||||
m4_define([LT_PACKAGE_VERSION], [2.4])
|
|
||||||
m4_define([LT_PACKAGE_REVISION], [1.3293])
|
|
||||||
|
|
||||||
AC_DEFUN([LTVERSION_VERSION],
|
|
||||||
[macro_version='2.4'
|
|
||||||
macro_revision='1.3293'
|
|
||||||
_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
|
|
||||||
_LT_DECL(, macro_revision, 0)
|
|
||||||
])
|
|
|
@ -1,98 +0,0 @@
|
||||||
# lt~obsolete.m4 -- aclocal satisfying obsolete definitions. -*-Autoconf-*-
|
|
||||||
#
|
|
||||||
# Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
|
|
||||||
# Written by Scott James Remnant, 2004.
|
|
||||||
#
|
|
||||||
# This file is free software; the Free Software Foundation gives
|
|
||||||
# unlimited permission to copy and/or distribute it, with or without
|
|
||||||
# modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# serial 5 lt~obsolete.m4
|
|
||||||
|
|
||||||
# These exist entirely to fool aclocal when bootstrapping libtool.
|
|
||||||
#
|
|
||||||
# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)
|
|
||||||
# which have later been changed to m4_define as they aren't part of the
|
|
||||||
# exported API, or moved to Autoconf or Automake where they belong.
|
|
||||||
#
|
|
||||||
# The trouble is, aclocal is a bit thick. It'll see the old AC_DEFUN
|
|
||||||
# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
|
|
||||||
# using a macro with the same name in our local m4/libtool.m4 it'll
|
|
||||||
# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
|
|
||||||
# and doesn't know about Autoconf macros at all.)
|
|
||||||
#
|
|
||||||
# So we provide this file, which has a silly filename so it's always
|
|
||||||
# included after everything else. This provides aclocal with the
|
|
||||||
# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
|
|
||||||
# because those macros already exist, or will be overwritten later.
|
|
||||||
# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
|
|
||||||
#
|
|
||||||
# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
|
|
||||||
# Yes, that means every name once taken will need to remain here until
|
|
||||||
# we give up compatibility with versions before 1.7, at which point
|
|
||||||
# we need to keep only those names which we still refer to.
|
|
||||||
|
|
||||||
# This is to help aclocal find these macros, as it can't see m4_define.
|
|
||||||
AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
|
|
||||||
|
|
||||||
m4_ifndef([AC_LIBTOOL_LINKER_OPTION], [AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
|
|
||||||
m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_AC_SHELL_INIT], [AC_DEFUN([_LT_AC_SHELL_INIT])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_LIBPATH_AIX], [AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
|
|
||||||
m4_ifndef([_LT_PROG_LTMAIN], [AC_DEFUN([_LT_PROG_LTMAIN])])
|
|
||||||
m4_ifndef([_LT_AC_TAGVAR], [AC_DEFUN([_LT_AC_TAGVAR])])
|
|
||||||
m4_ifndef([AC_LTDL_ENABLE_INSTALL], [AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
|
|
||||||
m4_ifndef([AC_LTDL_PREOPEN], [AC_DEFUN([AC_LTDL_PREOPEN])])
|
|
||||||
m4_ifndef([_LT_AC_SYS_COMPILER], [AC_DEFUN([_LT_AC_SYS_COMPILER])])
|
|
||||||
m4_ifndef([_LT_AC_LOCK], [AC_DEFUN([_LT_AC_LOCK])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE], [AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
|
|
||||||
m4_ifndef([_LT_AC_TRY_DLOPEN_SELF], [AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_CC_C_O], [AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_OBJDIR], [AC_DEFUN([AC_LIBTOOL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LTDL_OBJDIR], [AC_DEFUN([AC_LTDL_OBJDIR])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP], [AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
|
|
||||||
m4_ifndef([AC_PATH_MAGIC], [AC_DEFUN([AC_PATH_MAGIC])])
|
|
||||||
m4_ifndef([AC_PROG_LD_GNU], [AC_DEFUN([AC_PROG_LD_GNU])])
|
|
||||||
m4_ifndef([AC_PROG_LD_RELOAD_FLAG], [AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
|
|
||||||
m4_ifndef([AC_DEPLIBS_CHECK_METHOD], [AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS], [AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP], [AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_EGREP], [AC_DEFUN([LT_AC_PROG_EGREP])])
|
|
||||||
m4_ifndef([LT_AC_PROG_SED], [AC_DEFUN([LT_AC_PROG_SED])])
|
|
||||||
m4_ifndef([_LT_CC_BASENAME], [AC_DEFUN([_LT_CC_BASENAME])])
|
|
||||||
m4_ifndef([_LT_COMPILER_BOILERPLATE], [AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_LT_LINKER_BOILERPLATE], [AC_DEFUN([_LT_LINKER_BOILERPLATE])])
|
|
||||||
m4_ifndef([_AC_PROG_LIBTOOL], [AC_DEFUN([_AC_PROG_LIBTOOL])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SETUP], [AC_DEFUN([AC_LIBTOOL_SETUP])])
|
|
||||||
m4_ifndef([_LT_AC_CHECK_DLFCN], [AC_DEFUN([_LT_AC_CHECK_DLFCN])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER], [AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
|
|
||||||
m4_ifndef([_LT_AC_TAGCONFIG], [AC_DEFUN([_LT_AC_TAGCONFIG])])
|
|
||||||
m4_ifndef([AC_DISABLE_FAST_INSTALL], [AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX], [AC_DEFUN([_LT_AC_LANG_CXX])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77], [AC_DEFUN([_LT_AC_LANG_F77])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ], [AC_DEFUN([_LT_AC_LANG_GCJ])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_C_CONFIG], [AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_CXX_CONFIG], [AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_F77_CONFIG], [AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_GCJ_CONFIG], [AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG], [AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_LANG_RC_CONFIG], [AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
|
|
||||||
m4_ifndef([AC_LIBTOOL_CONFIG], [AC_DEFUN([AC_LIBTOOL_CONFIG])])
|
|
||||||
m4_ifndef([_LT_AC_FILE_LTDLL_C], [AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
|
|
||||||
m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS], [AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
|
|
||||||
m4_ifndef([_LT_AC_PROG_CXXCPP], [AC_DEFUN([_LT_AC_PROG_CXXCPP])])
|
|
||||||
m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS], [AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
|
|
||||||
m4_ifndef([_LT_PROG_ECHO_BACKSLASH], [AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
|
|
||||||
m4_ifndef([_LT_PROG_F77], [AC_DEFUN([_LT_PROG_F77])])
|
|
||||||
m4_ifndef([_LT_PROG_FC], [AC_DEFUN([_LT_PROG_FC])])
|
|
||||||
m4_ifndef([_LT_PROG_CXX], [AC_DEFUN([_LT_PROG_CXX])])
|
|
|
@ -1,376 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Common stub for a few missing GNU programs while installing.
|
|
||||||
|
|
||||||
scriptversion=2009-04-28.21; # UTC
|
|
||||||
|
|
||||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,
|
|
||||||
# 2008, 2009 Free Software Foundation, Inc.
|
|
||||||
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
|
|
||||||
|
|
||||||
# This program is free software; you can redistribute it and/or modify
|
|
||||||
# it under the terms of the GNU General Public License as published by
|
|
||||||
# the Free Software Foundation; either version 2, or (at your option)
|
|
||||||
# any later version.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
# GNU General Public License for more details.
|
|
||||||
|
|
||||||
# You should have received a copy of the GNU General Public License
|
|
||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
# As a special exception to the GNU General Public License, if you
|
|
||||||
# distribute this file as part of a program that contains a
|
|
||||||
# configuration script generated by Autoconf, you may include it under
|
|
||||||
# the same distribution terms that you use for the rest of that program.
|
|
||||||
|
|
||||||
if test $# -eq 0; then
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
run=:
|
|
||||||
sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
|
|
||||||
sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
|
|
||||||
|
|
||||||
# In the cases where this matters, `missing' is being run in the
|
|
||||||
# srcdir already.
|
|
||||||
if test -f configure.ac; then
|
|
||||||
configure_ac=configure.ac
|
|
||||||
else
|
|
||||||
configure_ac=configure.in
|
|
||||||
fi
|
|
||||||
|
|
||||||
msg="missing on your system"
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
--run)
|
|
||||||
# Try to run requested program, and just exit if it succeeds.
|
|
||||||
run=
|
|
||||||
shift
|
|
||||||
"$@" && exit 0
|
|
||||||
# Exit code 63 means version mismatch. This often happens
|
|
||||||
# when the user try to use an ancient version of a tool on
|
|
||||||
# a file that requires a minimum version. In this case we
|
|
||||||
# we should proceed has if the program had been absent, or
|
|
||||||
# if --run hadn't been passed.
|
|
||||||
if test $? = 63; then
|
|
||||||
run=:
|
|
||||||
msg="probably too old"
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
-h|--h|--he|--hel|--help)
|
|
||||||
echo "\
|
|
||||||
$0 [OPTION]... PROGRAM [ARGUMENT]...
|
|
||||||
|
|
||||||
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
|
|
||||||
error status if there is no known handling for PROGRAM.
|
|
||||||
|
|
||||||
Options:
|
|
||||||
-h, --help display this help and exit
|
|
||||||
-v, --version output version information and exit
|
|
||||||
--run try to run the given command, and emulate it if it fails
|
|
||||||
|
|
||||||
Supported PROGRAM values:
|
|
||||||
aclocal touch file \`aclocal.m4'
|
|
||||||
autoconf touch file \`configure'
|
|
||||||
autoheader touch file \`config.h.in'
|
|
||||||
autom4te touch the output file, or create a stub one
|
|
||||||
automake touch all \`Makefile.in' files
|
|
||||||
bison create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
flex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
help2man touch the output file
|
|
||||||
lex create \`lex.yy.c', if possible, from existing .c
|
|
||||||
makeinfo touch the output file
|
|
||||||
tar try tar, gnutar, gtar, then tar without non-portable flags
|
|
||||||
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
|
|
||||||
|
|
||||||
Version suffixes to PROGRAM as well as the prefixes \`gnu-', \`gnu', and
|
|
||||||
\`g' are ignored when checking the name.
|
|
||||||
|
|
||||||
Send bug reports to <bug-automake@gnu.org>."
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
|
||||||
echo "missing $scriptversion (GNU Automake)"
|
|
||||||
exit $?
|
|
||||||
;;
|
|
||||||
|
|
||||||
-*)
|
|
||||||
echo 1>&2 "$0: Unknown \`$1' option"
|
|
||||||
echo 1>&2 "Try \`$0 --help' for more information"
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
# normalize program name to check for.
|
|
||||||
program=`echo "$1" | sed '
|
|
||||||
s/^gnu-//; t
|
|
||||||
s/^gnu//; t
|
|
||||||
s/^g//; t'`
|
|
||||||
|
|
||||||
# Now exit if we have it, but it failed. Also exit now if we
|
|
||||||
# don't have it and --version was passed (most likely to detect
|
|
||||||
# the program). This is about non-GNU programs, so use $1 not
|
|
||||||
# $program.
|
|
||||||
case $1 in
|
|
||||||
lex*|yacc*)
|
|
||||||
# Not GNU programs, they don't have --version.
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar*)
|
|
||||||
if test -n "$run"; then
|
|
||||||
echo 1>&2 "ERROR: \`tar' requires --run"
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
|
||||||
# We have it, but it failed.
|
|
||||||
exit 1
|
|
||||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
|
||||||
# Could not run --version or --help. This is probably someone
|
|
||||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
|
||||||
# $TOOL exists and not knowing $TOOL uses missing.
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
# If it does not exist, or fails to run (possibly an outdated version),
|
|
||||||
# try to emulate it.
|
|
||||||
case $program in
|
|
||||||
aclocal*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Automake' and \`Perl' packages. Grab them from
|
|
||||||
any GNU archive site."
|
|
||||||
touch aclocal.m4
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoconf*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`${configure_ac}'. You might want to install the
|
|
||||||
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
|
|
||||||
archive site."
|
|
||||||
touch configure
|
|
||||||
;;
|
|
||||||
|
|
||||||
autoheader*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`acconfig.h' or \`${configure_ac}'. You might want
|
|
||||||
to install the \`Autoconf' and \`GNU m4' packages. Grab them
|
|
||||||
from any GNU archive site."
|
|
||||||
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
|
|
||||||
test -z "$files" && files="config.h"
|
|
||||||
touch_files=
|
|
||||||
for f in $files; do
|
|
||||||
case $f in
|
|
||||||
*:*) touch_files="$touch_files "`echo "$f" |
|
|
||||||
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
|
|
||||||
*) touch_files="$touch_files $f.in";;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
touch $touch_files
|
|
||||||
;;
|
|
||||||
|
|
||||||
automake*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
|
|
||||||
You might want to install the \`Automake' and \`Perl' packages.
|
|
||||||
Grab them from any GNU archive site."
|
|
||||||
find . -type f -name Makefile.am -print |
|
|
||||||
sed 's/\.am$/.in/' |
|
|
||||||
while read f; do touch "$f"; done
|
|
||||||
;;
|
|
||||||
|
|
||||||
autom4te*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, but is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them.
|
|
||||||
You can get \`$1' as part of \`Autoconf' from any GNU
|
|
||||||
archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo "#! /bin/sh"
|
|
||||||
echo "# Created by GNU Automake missing as a replacement of"
|
|
||||||
echo "# $ $@"
|
|
||||||
echo "exit 0"
|
|
||||||
chmod +x $file
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
bison*|yacc*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' $msg. You should only need it if
|
|
||||||
you modified a \`.y' file. You may need the \`Bison' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Bison' from any GNU archive site."
|
|
||||||
rm -f y.tab.c y.tab.h
|
|
||||||
if test $# -ne 1; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case $LASTARG in
|
|
||||||
*.y)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" y.tab.c
|
|
||||||
fi
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" y.tab.h
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -f y.tab.h; then
|
|
||||||
echo >y.tab.h
|
|
||||||
fi
|
|
||||||
if test ! -f y.tab.c; then
|
|
||||||
echo 'main() { return 0; }' >y.tab.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
lex*|flex*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.l' file. You may need the \`Flex' package
|
|
||||||
in order for those modifications to take effect. You can get
|
|
||||||
\`Flex' from any GNU archive site."
|
|
||||||
rm -f lex.yy.c
|
|
||||||
if test $# -ne 1; then
|
|
||||||
eval LASTARG="\${$#}"
|
|
||||||
case $LASTARG in
|
|
||||||
*.l)
|
|
||||||
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
|
|
||||||
if test -f "$SRCFILE"; then
|
|
||||||
cp "$SRCFILE" lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
if test ! -f lex.yy.c; then
|
|
||||||
echo 'main() { return 0; }' >lex.yy.c
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
help2man*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a dependency of a manual page. You may need the
|
|
||||||
\`Help2man' package in order for those modifications to take
|
|
||||||
effect. You can get \`Help2man' from any GNU archive site."
|
|
||||||
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -f "$file"; then
|
|
||||||
touch $file
|
|
||||||
else
|
|
||||||
test -z "$file" || exec >$file
|
|
||||||
echo ".ab help2man is required to generate this page"
|
|
||||||
exit $?
|
|
||||||
fi
|
|
||||||
;;
|
|
||||||
|
|
||||||
makeinfo*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is $msg. You should only need it if
|
|
||||||
you modified a \`.texi' or \`.texinfo' file, or any other file
|
|
||||||
indirectly affecting the aspect of the manual. The spurious
|
|
||||||
call might also be the consequence of using a buggy \`make' (AIX,
|
|
||||||
DU, IRIX). You might want to install the \`Texinfo' package or
|
|
||||||
the \`GNU make' package. Grab either from any GNU archive site."
|
|
||||||
# The file to touch is that specified with -o ...
|
|
||||||
file=`echo "$*" | sed -n "$sed_output"`
|
|
||||||
test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
|
|
||||||
if test -z "$file"; then
|
|
||||||
# ... or it is the one specified with @setfilename ...
|
|
||||||
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
|
||||||
file=`sed -n '
|
|
||||||
/^@setfilename/{
|
|
||||||
s/.* \([^ ]*\) *$/\1/
|
|
||||||
p
|
|
||||||
q
|
|
||||||
}' $infile`
|
|
||||||
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
|
||||||
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
|
||||||
fi
|
|
||||||
# If the file does not exist, the user really needs makeinfo;
|
|
||||||
# let's fail without touching anything.
|
|
||||||
test -f $file || exit 1
|
|
||||||
touch $file
|
|
||||||
;;
|
|
||||||
|
|
||||||
tar*)
|
|
||||||
shift
|
|
||||||
|
|
||||||
# We have already tried tar in the generic part.
|
|
||||||
# Look for gnutar/gtar before invocation to avoid ugly error
|
|
||||||
# messages.
|
|
||||||
if (gnutar --version > /dev/null 2>&1); then
|
|
||||||
gnutar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
if (gtar --version > /dev/null 2>&1); then
|
|
||||||
gtar "$@" && exit 0
|
|
||||||
fi
|
|
||||||
firstarg="$1"
|
|
||||||
if shift; then
|
|
||||||
case $firstarg in
|
|
||||||
*o*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/o//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
case $firstarg in
|
|
||||||
*h*)
|
|
||||||
firstarg=`echo "$firstarg" | sed s/h//`
|
|
||||||
tar "$firstarg" "$@" && exit 0
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: I can't seem to be able to run \`tar' with the given arguments.
|
|
||||||
You may want to install GNU tar or Free paxutils, or check the
|
|
||||||
command line arguments."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
|
|
||||||
*)
|
|
||||||
echo 1>&2 "\
|
|
||||||
WARNING: \`$1' is needed, and is $msg.
|
|
||||||
You might have modified some files without having the
|
|
||||||
proper tools for further handling them. Check the \`README' file,
|
|
||||||
it often tells you about the needed prerequisites for installing
|
|
||||||
this package. You may also peek at any GNU archive site, in case
|
|
||||||
some other package would contain this missing \`$1' program."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
|
|
||||||
# Local variables:
|
|
||||||
# eval: (add-hook 'write-file-hooks 'time-stamp)
|
|
||||||
# time-stamp-start: "scriptversion="
|
|
||||||
# time-stamp-format: "%:y-%02m-%02d.%02H"
|
|
||||||
# time-stamp-time-zone: "UTC"
|
|
||||||
# time-stamp-end: "; # UTC"
|
|
||||||
# End:
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,156 +0,0 @@
|
||||||
# -*- shell-script -*-
|
|
||||||
#
|
|
||||||
# Copyright © 2009 CNRS
|
|
||||||
# Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009, 2011 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
#
|
|
||||||
# Additional copyrights may follow
|
|
||||||
#
|
|
||||||
# $HEADER$
|
|
||||||
#
|
|
||||||
|
|
||||||
AC_INIT([hwloc],
|
|
||||||
[m4_normalize(esyscmd([config/hwloc_get_version.sh VERSION --base]))],
|
|
||||||
[http://www.open-mpi.org/community/help/], [hwloc])
|
|
||||||
AC_PREREQ(2.63)
|
|
||||||
AC_CONFIG_AUX_DIR(./config)
|
|
||||||
# Note that this directory must *exactly* match what was specified via
|
|
||||||
# -I in ACLOCAL_AMFLAGS in the top-level Makefile.am.
|
|
||||||
AC_CONFIG_MACRO_DIR(./config)
|
|
||||||
|
|
||||||
cat <<EOF
|
|
||||||
|
|
||||||
###
|
|
||||||
### Configuring hwloc distribution tarball
|
|
||||||
### Startup tests
|
|
||||||
###
|
|
||||||
EOF
|
|
||||||
|
|
||||||
# This must be before AM_INIT_AUTOMAKE
|
|
||||||
AC_CANONICAL_TARGET
|
|
||||||
|
|
||||||
# Init automake
|
|
||||||
AM_INIT_AUTOMAKE([1.10 dist-bzip2 subdir-objects foreign tar-ustar -Wall -Werror])
|
|
||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
|
||||||
|
|
||||||
# We want new Libtool. None of that old stuff. Pfft.
|
|
||||||
m4_ifdef([LT_PREREQ], [],
|
|
||||||
[m4_fatal([libtool version 2.2.6 or higher is required], [63])])
|
|
||||||
LT_PREREQ([2.2.6])
|
|
||||||
|
|
||||||
AC_LANG([C])
|
|
||||||
|
|
||||||
# Make configure depend on the VERSION file, since it's used in AC_INIT
|
|
||||||
AC_SUBST([CONFIGURE_DEPENDENCIES], ['$(top_srcdir)/VERSION'])
|
|
||||||
|
|
||||||
# Get the version of hwloc that we are installing
|
|
||||||
AC_MSG_CHECKING([for hwloc version])
|
|
||||||
HWLOC_VERSION="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION`"
|
|
||||||
HWLOC_MAJOR_VERSION="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION --major`"
|
|
||||||
HWLOC_MINOR_VERSION="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION --minor`"
|
|
||||||
HWLOC_RELEASE_VERSION="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION --release`"
|
|
||||||
HWLOC_REPO_REV="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION --repo-rev`"
|
|
||||||
HWLOC_RELEASE_DATE="`$srcdir/config/hwloc_get_version.sh $srcdir/VERSION --release-date`"
|
|
||||||
AC_SUBST(HWLOC_VERSION)
|
|
||||||
AC_SUBST(HWLOC_SVN_R)
|
|
||||||
AC_SUBST(HWLOC_RELEASE_DATE)
|
|
||||||
AC_DEFINE_UNQUOTED([HWLOC_MAJOR_VERSION], [$HWLOC_MAJOR_VERSION],
|
|
||||||
[Major version of hwloc])
|
|
||||||
AC_DEFINE_UNQUOTED([HWLOC_MINOR_VERSION], [$HWLOC_MINOR_VERSION],
|
|
||||||
[Minor version of hwloc])
|
|
||||||
AC_DEFINE_UNQUOTED([HWLOC_RELEASE_VERSION], [$HWLOC_RELEASE_VERSION],
|
|
||||||
[Release version of hwloc])
|
|
||||||
AC_MSG_RESULT([$HWLOC_VERSION])
|
|
||||||
|
|
||||||
# Override/fixup the version numbers set by AC_INIT, since on
|
|
||||||
# developer builds, there's no good way to know what the version is
|
|
||||||
# before running configure :(. We only use the base version number
|
|
||||||
# (ie, no svn r numbers) for the version set in AC_INIT. This will
|
|
||||||
# always match reality because we add the VERSION file (the only way
|
|
||||||
# to change the major.minor.release{greek}) into the configure
|
|
||||||
# dependencies.
|
|
||||||
|
|
||||||
PACKAGE_VERSION="$HWLOC_VERSION"
|
|
||||||
PACKAGE_STRING="${PACKAGE_NAME} ${PACKAGE_VERSION}"
|
|
||||||
VERSION="${PACKAGE_VERSION}"
|
|
||||||
|
|
||||||
# For standalone configurations, we also include a .so version number.
|
|
||||||
|
|
||||||
. $srcdir/VERSION
|
|
||||||
AC_SUBST([libhwloc_so_version])
|
|
||||||
|
|
||||||
# Setup the header file
|
|
||||||
AH_TOP([/* -*- c -*-
|
|
||||||
*
|
|
||||||
* Copyright © 2009 CNRS, INRIA., Université Bordeaux 1 All rights reserved.
|
|
||||||
* Copyright © 2009 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
|
||||||
*
|
|
||||||
* Additional copyrights may follow
|
|
||||||
*
|
|
||||||
* $HEADER$
|
|
||||||
*
|
|
||||||
* This file is automatically generated by configure. Edits will be lost
|
|
||||||
* the next time you run configure!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_CONFIGURE_H
|
|
||||||
#define HWLOC_CONFIGURE_H
|
|
||||||
])
|
|
||||||
AH_BOTTOM([
|
|
||||||
#endif /* HWLOC_CONFIGURE_H */
|
|
||||||
])
|
|
||||||
|
|
||||||
# Setup C compiler
|
|
||||||
|
|
||||||
CFLAGS_save="$CFLAGS"
|
|
||||||
AC_PROG_CC
|
|
||||||
AM_PROG_CC_C_O
|
|
||||||
CFLAGS="$CFLAGS_save"
|
|
||||||
|
|
||||||
# Define hwloc's configure arguments
|
|
||||||
HWLOC_DEFINE_ARGS
|
|
||||||
|
|
||||||
# If debug mode, add -g
|
|
||||||
AS_IF([test "$hwloc_debug" = "1"],
|
|
||||||
[CFLAGS="$CFLAGS -g"])
|
|
||||||
|
|
||||||
# If the user didn't specifically ask for embedding mode, default to
|
|
||||||
# standalone mode
|
|
||||||
AS_IF([test "$enable_embedded_mode" != "yes"],
|
|
||||||
[AS_IF([test ! -d "$srcdir/doc"],
|
|
||||||
[AC_MSG_WARN([The hwloc source tree looks incomplete for a standalone])
|
|
||||||
AC_MSG_WARN([build. Perhaps this hwloc tree is intended for an embedded])
|
|
||||||
AC_MSG_WARN([build? Try using the --enable-embedded-mode switch.])
|
|
||||||
AC_MSG_ERROR([Cannot build standalone hwloc])],
|
|
||||||
[HWLOC_BUILD_STANDALONE])])
|
|
||||||
|
|
||||||
# Setup the hwloc core
|
|
||||||
HWLOC_SETUP_CORE([], [], [AC_MSG_ERROR([Cannot build hwloc core])], [1])
|
|
||||||
|
|
||||||
# Setup hwloc's docs, utils, and tests
|
|
||||||
AS_IF([test "$hwloc_mode" = "standalone"],
|
|
||||||
[HWLOC_SETUP_DOCS
|
|
||||||
HWLOC_SETUP_UTILS
|
|
||||||
HWLOC_SETUP_TESTS])
|
|
||||||
|
|
||||||
# Run the AM_CONDITIONALs
|
|
||||||
HWLOC_DO_AM_CONDITIONALS
|
|
||||||
|
|
||||||
# Set the final flags
|
|
||||||
CFLAGS="$HWLOC_EMBEDDED_CFLAGS $CFLAGS"
|
|
||||||
CPPFLAGS="$HWLOC_EMBEDDED_CPPFLAGS $CPPFLAGS"
|
|
||||||
LIBS="$HWLOC_EMBEDDED_LIBS $LIBS"
|
|
||||||
|
|
||||||
# Setup libtool, but disable C++, F77, Java and Windows Resource
|
|
||||||
# Compiler support -- we don't need that stuff.
|
|
||||||
AM_ENABLE_SHARED
|
|
||||||
AM_DISABLE_STATIC
|
|
||||||
AM_PROG_LIBTOOL([win32-dll])
|
|
||||||
LT_LANG([C])
|
|
||||||
|
|
||||||
# Party on
|
|
||||||
AC_OUTPUT
|
|
|
@ -1,12 +0,0 @@
|
||||||
prefix=@prefix@
|
|
||||||
exec_prefix=@exec_prefix@
|
|
||||||
libdir=@libdir@
|
|
||||||
includedir=@includedir@
|
|
||||||
|
|
||||||
Name: hwloc
|
|
||||||
Description: Hardware locality detection and management library
|
|
||||||
Version: @VERSION@
|
|
||||||
Requires.private: @HWLOC_REQUIRES@
|
|
||||||
Cflags: -I${includedir}
|
|
||||||
Libs: -L${libdir} -lhwloc
|
|
||||||
Libs.private: @LIBS@
|
|
|
@ -1,40 +0,0 @@
|
||||||
# Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
|
|
||||||
# Only install the headers if we're in standalone mode (meaning:
|
|
||||||
# *don't* install the headers if we're in embedded mode).
|
|
||||||
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
include_HEADERS = hwloc.h
|
|
||||||
include_hwlocdir = $(includedir)/hwloc
|
|
||||||
include_hwloc_HEADERS = \
|
|
||||||
hwloc/bitmap.h \
|
|
||||||
hwloc/cpuset.h \
|
|
||||||
hwloc/helper.h \
|
|
||||||
hwloc/myriexpress.h \
|
|
||||||
hwloc/openfabrics-verbs.h \
|
|
||||||
hwloc/cuda.h \
|
|
||||||
hwloc/cudart.h \
|
|
||||||
hwloc/rename.h
|
|
||||||
include_hwloc_autogendir = $(includedir)/hwloc/autogen
|
|
||||||
nodist_include_hwloc_autogen_HEADERS = hwloc/autogen/config.h
|
|
||||||
|
|
||||||
noinst_HEADERS = \
|
|
||||||
private/private.h \
|
|
||||||
private/debug.h \
|
|
||||||
private/misc.h \
|
|
||||||
private/cpuid.h
|
|
||||||
|
|
||||||
if HWLOC_HAVE_LINUX
|
|
||||||
include_hwloc_HEADERS += \
|
|
||||||
hwloc/linux.h \
|
|
||||||
hwloc/linux-libnuma.h
|
|
||||||
endif HWLOC_HAVE_LINUX
|
|
||||||
|
|
||||||
if HWLOC_HAVE_SCHED_SETAFFINITY
|
|
||||||
include_hwloc_HEADERS += hwloc/glibc-sched.h
|
|
||||||
endif HWLOC_HAVE_SCHED_SETAFFINITY
|
|
||||||
|
|
||||||
endif HWLOC_BUILD_STANDALONE
|
|
|
@ -1,566 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
# Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
|
|
||||||
# Only install the headers if we're in standalone mode (meaning:
|
|
||||||
# *don't* install the headers if we're in embedded mode).
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
build_triplet = @build@
|
|
||||||
host_triplet = @host@
|
|
||||||
target_triplet = @target@
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@@HWLOC_HAVE_LINUX_TRUE@am__append_1 = \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@@HWLOC_HAVE_LINUX_TRUE@ hwloc/linux.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@@HWLOC_HAVE_LINUX_TRUE@ hwloc/linux-libnuma.h
|
|
||||||
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@@HWLOC_HAVE_SCHED_SETAFFINITY_TRUE@am__append_2 = hwloc/glibc-sched.h
|
|
||||||
subdir = hwloc-1.2.1/include
|
|
||||||
DIST_COMMON = $(am__include_HEADERS_DIST) \
|
|
||||||
$(am__include_hwloc_HEADERS_DIST) $(am__noinst_HEADERS_DIST) \
|
|
||||||
$(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_check_attributes.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_check_visibility.m4 \
|
|
||||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_pkg.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h \
|
|
||||||
$(top_builddir)/hwloc-1.2.1/include/private/autogen/config.h \
|
|
||||||
$(top_builddir)/hwloc-1.2.1/include/hwloc/autogen/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
SOURCES =
|
|
||||||
DIST_SOURCES =
|
|
||||||
am__include_HEADERS_DIST = hwloc.h
|
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
|
||||||
am__vpath_adj = case $$p in \
|
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
|
||||||
*) f=$$p;; \
|
|
||||||
esac;
|
|
||||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
|
||||||
am__install_max = 40
|
|
||||||
am__nobase_strip_setup = \
|
|
||||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
|
||||||
am__nobase_strip = \
|
|
||||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
|
||||||
am__nobase_list = $(am__nobase_strip_setup); \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
|
||||||
if (++n[$$2] == $(am__install_max)) \
|
|
||||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
|
||||||
END { for (dir in files) print dir, files[dir] }'
|
|
||||||
am__base_list = \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
|
||||||
am__installdirs = "$(DESTDIR)$(includedir)" \
|
|
||||||
"$(DESTDIR)$(include_hwlocdir)" \
|
|
||||||
"$(DESTDIR)$(include_hwloc_autogendir)"
|
|
||||||
am__include_hwloc_HEADERS_DIST = hwloc/bitmap.h hwloc/cpuset.h \
|
|
||||||
hwloc/helper.h hwloc/myriexpress.h hwloc/openfabrics-verbs.h \
|
|
||||||
hwloc/cuda.h hwloc/cudart.h hwloc/rename.h hwloc/linux.h \
|
|
||||||
hwloc/linux-libnuma.h hwloc/glibc-sched.h
|
|
||||||
am__noinst_HEADERS_DIST = private/private.h private/debug.h \
|
|
||||||
private/misc.h private/cpuid.h
|
|
||||||
HEADERS = $(include_HEADERS) $(include_hwloc_HEADERS) \
|
|
||||||
$(nodist_include_hwloc_autogen_HEADERS) $(noinst_HEADERS)
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AR = @AR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
BASH = @BASH@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
DSYMUTIL = @DSYMUTIL@
|
|
||||||
DUMPBIN = @DUMPBIN@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GREP = @GREP@
|
|
||||||
HWLOC_CFLAGS = @HWLOC_CFLAGS@
|
|
||||||
HWLOC_CPPFLAGS = @HWLOC_CPPFLAGS@
|
|
||||||
HWLOC_EMBEDDED_CFLAGS = @HWLOC_EMBEDDED_CFLAGS@
|
|
||||||
HWLOC_EMBEDDED_CPPFLAGS = @HWLOC_EMBEDDED_CPPFLAGS@
|
|
||||||
HWLOC_EMBEDDED_LDADD = @HWLOC_EMBEDDED_LDADD@
|
|
||||||
HWLOC_EMBEDDED_LIBS = @HWLOC_EMBEDDED_LIBS@
|
|
||||||
HWLOC_HAVE_XML = @HWLOC_HAVE_XML@
|
|
||||||
HWLOC_KERRIGHED_CFLAGS = @HWLOC_KERRIGHED_CFLAGS@
|
|
||||||
HWLOC_KERRIGHED_LIBS = @HWLOC_KERRIGHED_LIBS@
|
|
||||||
HWLOC_LDFLAGS = @HWLOC_LDFLAGS@
|
|
||||||
HWLOC_LIBS = @HWLOC_LIBS@
|
|
||||||
HWLOC_LINUX_LIBNUMA_LIBS = @HWLOC_LINUX_LIBNUMA_LIBS@
|
|
||||||
HWLOC_MS_LIB = @HWLOC_MS_LIB@
|
|
||||||
HWLOC_PKG_CONFIG = @HWLOC_PKG_CONFIG@
|
|
||||||
HWLOC_REQUIRES = @HWLOC_REQUIRES@
|
|
||||||
HWLOC_XML_CFLAGS = @HWLOC_XML_CFLAGS@
|
|
||||||
HWLOC_XML_LIBS = @HWLOC_XML_LIBS@
|
|
||||||
HWLOC_top_builddir = @HWLOC_top_builddir@
|
|
||||||
HWLOC_top_srcdir = @HWLOC_top_srcdir@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build = @build@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
build_cpu = @build_cpu@
|
|
||||||
build_os = @build_os@
|
|
||||||
build_vendor = @build_vendor@
|
|
||||||
builddir = @builddir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host = @host@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
host_cpu = @host_cpu@
|
|
||||||
host_os = @host_os@
|
|
||||||
host_vendor = @host_vendor@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target = @target@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
target_cpu = @target_cpu@
|
|
||||||
target_os = @target_os@
|
|
||||||
target_vendor = @target_vendor@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@include_HEADERS = hwloc.h
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@include_hwlocdir = $(includedir)/hwloc
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@include_hwloc_HEADERS = hwloc/bitmap.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ hwloc/cpuset.h hwloc/helper.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ hwloc/myriexpress.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ hwloc/openfabrics-verbs.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ hwloc/cuda.h hwloc/cudart.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ hwloc/rename.h $(am__append_1) \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ $(am__append_2)
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@include_hwloc_autogendir = $(includedir)/hwloc/autogen
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@nodist_include_hwloc_autogen_HEADERS = hwloc/autogen/config.h
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@noinst_HEADERS = \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ private/private.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ private/debug.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ private/misc.h \
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@ private/cpuid.h
|
|
||||||
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu hwloc-1.2.1/include/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu hwloc-1.2.1/include/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
|
|
||||||
mostlyclean-libtool:
|
|
||||||
-rm -f *.lo
|
|
||||||
|
|
||||||
clean-libtool:
|
|
||||||
-rm -rf .libs _libs
|
|
||||||
install-includeHEADERS: $(include_HEADERS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(includedir)" || $(MKDIR_P) "$(DESTDIR)$(includedir)"
|
|
||||||
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'"; \
|
|
||||||
$(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-includeHEADERS:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(include_HEADERS)'; test -n "$(includedir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
test -n "$$files" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(includedir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(includedir)" && rm -f $$files
|
|
||||||
install-include_hwlocHEADERS: $(include_hwloc_HEADERS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(include_hwlocdir)" || $(MKDIR_P) "$(DESTDIR)$(include_hwlocdir)"
|
|
||||||
@list='$(include_hwloc_HEADERS)'; test -n "$(include_hwlocdir)" || list=; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(include_hwlocdir)'"; \
|
|
||||||
$(INSTALL_HEADER) $$files "$(DESTDIR)$(include_hwlocdir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-include_hwlocHEADERS:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(include_hwloc_HEADERS)'; test -n "$(include_hwlocdir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
test -n "$$files" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(include_hwlocdir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(include_hwlocdir)" && rm -f $$files
|
|
||||||
install-nodist_include_hwloc_autogenHEADERS: $(nodist_include_hwloc_autogen_HEADERS)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(include_hwloc_autogendir)" || $(MKDIR_P) "$(DESTDIR)$(include_hwloc_autogendir)"
|
|
||||||
@list='$(nodist_include_hwloc_autogen_HEADERS)'; test -n "$(include_hwloc_autogendir)" || list=; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(include_hwloc_autogendir)'"; \
|
|
||||||
$(INSTALL_HEADER) $$files "$(DESTDIR)$(include_hwloc_autogendir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-nodist_include_hwloc_autogenHEADERS:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(nodist_include_hwloc_autogen_HEADERS)'; test -n "$(include_hwloc_autogendir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
test -n "$$files" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(include_hwloc_autogendir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(include_hwloc_autogendir)" && rm -f $$files
|
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
mkid -fID $$unique
|
|
||||||
tags: TAGS
|
|
||||||
|
|
||||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
all-am: Makefile $(HEADERS)
|
|
||||||
installdirs:
|
|
||||||
for dir in "$(DESTDIR)$(includedir)" "$(DESTDIR)$(include_hwlocdir)" "$(DESTDIR)$(include_hwloc_autogendir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-generic clean-libtool mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-generic distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am: install-includeHEADERS install-include_hwlocHEADERS \
|
|
||||||
install-nodist_include_hwloc_autogenHEADERS
|
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am:
|
|
||||||
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-includeHEADERS uninstall-include_hwlocHEADERS \
|
|
||||||
uninstall-nodist_include_hwloc_autogenHEADERS
|
|
||||||
|
|
||||||
.MAKE: install-am install-strip
|
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
|
|
||||||
clean-libtool ctags distclean distclean-generic \
|
|
||||||
distclean-libtool distclean-tags distdir dvi dvi-am html \
|
|
||||||
html-am info info-am install install-am install-data \
|
|
||||||
install-data-am install-dvi install-dvi-am install-exec \
|
|
||||||
install-exec-am install-html install-html-am \
|
|
||||||
install-includeHEADERS install-include_hwlocHEADERS \
|
|
||||||
install-info install-info-am install-man \
|
|
||||||
install-nodist_include_hwloc_autogenHEADERS install-pdf \
|
|
||||||
install-pdf-am install-ps install-ps-am install-strip \
|
|
||||||
installcheck installcheck-am installdirs maintainer-clean \
|
|
||||||
maintainer-clean-generic mostlyclean mostlyclean-generic \
|
|
||||||
mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
|
|
||||||
uninstall-am uninstall-includeHEADERS \
|
|
||||||
uninstall-include_hwlocHEADERS \
|
|
||||||
uninstall-nodist_include_hwloc_autogenHEADERS
|
|
||||||
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,137 +0,0 @@
|
||||||
/* hwloc-1.2.1/include/hwloc/autogen/config.h. Generated from config.h.in by configure. */
|
|
||||||
/* -*- c -*-
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The configuration file */
|
|
||||||
|
|
||||||
#ifndef HWLOC_CONFIG_H
|
|
||||||
#define HWLOC_CONFIG_H
|
|
||||||
|
|
||||||
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
|
||||||
# define __hwloc_restrict __restrict
|
|
||||||
#else
|
|
||||||
# if __STDC_VERSION__ >= 199901L
|
|
||||||
# define __hwloc_restrict restrict
|
|
||||||
# else
|
|
||||||
# define __hwloc_restrict
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define __hwloc_inline __inline__
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: this is public. We can not assume anything from the compiler used
|
|
||||||
* by the application and thus the HWLOC_HAVE_* macros below are not
|
|
||||||
* fetched from the autoconf result here. We only automatically use a few
|
|
||||||
* well-known easy cases.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Maybe before gcc 2.95 too */
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_UNUSED) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || HWLOC_HAVE_ATTRIBUTE_UNUSED
|
|
||||||
# define __hwloc_attribute_unused __attribute__((__unused__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_unused
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_unused
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_MALLOC) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) || HWLOC_HAVE_ATTRIBUTE_MALLOC
|
|
||||||
# define __hwloc_attribute_malloc __attribute__((__malloc__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_malloc
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_malloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_CONST) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || HWLOC_HAVE_ATTRIBUTE_CONST
|
|
||||||
# define __hwloc_attribute_const __attribute__((__const__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_const
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_const
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_PURE) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) || HWLOC_HAVE_ATTRIBUTE_PURE
|
|
||||||
# define __hwloc_attribute_pure __attribute__((__pure__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_pure
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_pure
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_DEPRECATED) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
|
|
||||||
# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) || HWLOC_HAVE_ATTRIBUTE_DEPRECATED
|
|
||||||
# define __hwloc_attribute_deprecated __attribute__((__deprecated__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_deprecated
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_deprecated
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HWLOC_C_HAVE_VISIBILITY
|
|
||||||
# if HWLOC_C_HAVE_VISIBILITY
|
|
||||||
# define HWLOC_DECLSPEC __attribute__((__visibility__("default")))
|
|
||||||
# else
|
|
||||||
# define HWLOC_DECLSPEC
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define HWLOC_DECLSPEC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Defined to 1 on Linux */
|
|
||||||
#define HWLOC_LINUX_SYS 1
|
|
||||||
|
|
||||||
/* Defined to 1 if the CPU_SET macro works */
|
|
||||||
#define HWLOC_HAVE_CPU_SET 1
|
|
||||||
|
|
||||||
/* Defined to 1 if you have the `windows.h' header. */
|
|
||||||
/* #undef HWLOC_HAVE_WINDOWS_H */
|
|
||||||
#define hwloc_pid_t pid_t
|
|
||||||
#define hwloc_thread_t pthread_t
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_WINDOWS_H
|
|
||||||
|
|
||||||
# include <windows.h>
|
|
||||||
typedef DWORDLONG hwloc_uint64_t;
|
|
||||||
|
|
||||||
#else /* HWLOC_HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
# ifdef hwloc_thread_t
|
|
||||||
# include <pthread.h>
|
|
||||||
# endif /* hwloc_thread_t */
|
|
||||||
|
|
||||||
/* Defined to 1 if you have the <stdint.h> header file. */
|
|
||||||
# define HWLOC_HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
# include <unistd.h>
|
|
||||||
# ifdef HWLOC_HAVE_STDINT_H
|
|
||||||
# include <stdint.h>
|
|
||||||
# endif
|
|
||||||
typedef uint64_t hwloc_uint64_t;
|
|
||||||
|
|
||||||
#endif /* HWLOC_HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
/* Whether we need to re-define all the hwloc public symbols or not */
|
|
||||||
#define HWLOC_SYM_TRANSFORM 0
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix */
|
|
||||||
#define HWLOC_SYM_PREFIX hwloc_
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix in all caps */
|
|
||||||
#define HWLOC_SYM_PREFIX_CAPS HWLOC_
|
|
||||||
|
|
||||||
#endif /* HWLOC_CONFIG_H */
|
|
|
@ -1,136 +0,0 @@
|
||||||
/* -*- c -*-
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The configuration file */
|
|
||||||
|
|
||||||
#ifndef HWLOC_CONFIG_H
|
|
||||||
#define HWLOC_CONFIG_H
|
|
||||||
|
|
||||||
#if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
|
||||||
# define __hwloc_restrict __restrict
|
|
||||||
#else
|
|
||||||
# if __STDC_VERSION__ >= 199901L
|
|
||||||
# define __hwloc_restrict restrict
|
|
||||||
# else
|
|
||||||
# define __hwloc_restrict
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef __hwloc_inline
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Note: this is public. We can not assume anything from the compiler used
|
|
||||||
* by the application and thus the HWLOC_HAVE_* macros below are not
|
|
||||||
* fetched from the autoconf result here. We only automatically use a few
|
|
||||||
* well-known easy cases.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Maybe before gcc 2.95 too */
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_UNUSED) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || HWLOC_HAVE_ATTRIBUTE_UNUSED
|
|
||||||
# define __hwloc_attribute_unused __attribute__((__unused__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_unused
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_unused
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_MALLOC) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) || HWLOC_HAVE_ATTRIBUTE_MALLOC
|
|
||||||
# define __hwloc_attribute_malloc __attribute__((__malloc__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_malloc
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_malloc
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_CONST) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)) || HWLOC_HAVE_ATTRIBUTE_CONST
|
|
||||||
# define __hwloc_attribute_const __attribute__((__const__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_const
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_const
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_PURE) || (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
|
|
||||||
# if (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)) || HWLOC_HAVE_ATTRIBUTE_PURE
|
|
||||||
# define __hwloc_attribute_pure __attribute__((__pure__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_pure
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_pure
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(HWLOC_HAVE_ATTRIBUTE_DEPRECATED) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
|
|
||||||
# if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) || HWLOC_HAVE_ATTRIBUTE_DEPRECATED
|
|
||||||
# define __hwloc_attribute_deprecated __attribute__((__deprecated__))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_deprecated
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_deprecated
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HWLOC_C_HAVE_VISIBILITY
|
|
||||||
# if HWLOC_C_HAVE_VISIBILITY
|
|
||||||
# define HWLOC_DECLSPEC __attribute__((__visibility__("default")))
|
|
||||||
# else
|
|
||||||
# define HWLOC_DECLSPEC
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define HWLOC_DECLSPEC
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Defined to 1 on Linux */
|
|
||||||
#undef HWLOC_LINUX_SYS
|
|
||||||
|
|
||||||
/* Defined to 1 if the CPU_SET macro works */
|
|
||||||
#undef HWLOC_HAVE_CPU_SET
|
|
||||||
|
|
||||||
/* Defined to 1 if you have the `windows.h' header. */
|
|
||||||
#undef HWLOC_HAVE_WINDOWS_H
|
|
||||||
#undef hwloc_pid_t
|
|
||||||
#undef hwloc_thread_t
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_WINDOWS_H
|
|
||||||
|
|
||||||
# include <windows.h>
|
|
||||||
typedef DWORDLONG hwloc_uint64_t;
|
|
||||||
|
|
||||||
#else /* HWLOC_HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
# ifdef hwloc_thread_t
|
|
||||||
# include <pthread.h>
|
|
||||||
# endif /* hwloc_thread_t */
|
|
||||||
|
|
||||||
/* Defined to 1 if you have the <stdint.h> header file. */
|
|
||||||
# undef HWLOC_HAVE_STDINT_H
|
|
||||||
|
|
||||||
# include <unistd.h>
|
|
||||||
# ifdef HWLOC_HAVE_STDINT_H
|
|
||||||
# include <stdint.h>
|
|
||||||
# endif
|
|
||||||
typedef uint64_t hwloc_uint64_t;
|
|
||||||
|
|
||||||
#endif /* HWLOC_HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
/* Whether we need to re-define all the hwloc public symbols or not */
|
|
||||||
#undef HWLOC_SYM_TRANSFORM
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix */
|
|
||||||
#undef HWLOC_SYM_PREFIX
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix in all caps */
|
|
||||||
#undef HWLOC_SYM_PREFIX_CAPS
|
|
||||||
|
|
||||||
#endif /* HWLOC_CONFIG_H */
|
|
|
@ -1 +0,0 @@
|
||||||
timestamp for hwloc-1.2.1/include/hwloc/autogen/config.h
|
|
|
@ -1,335 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief The bitmap API, for use in hwloc itself.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_BITMAP_H
|
|
||||||
#define HWLOC_BITMAP_H
|
|
||||||
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_bitmap The bitmap API
|
|
||||||
*
|
|
||||||
* The ::hwloc_bitmap_t type represents a set of objects, typically OS
|
|
||||||
* processors -- which may actually be hardware threads (represented
|
|
||||||
* by ::hwloc_cpuset_t, which is a typedef for ::hwloc_bitmap_t) -- or
|
|
||||||
* memory nodes (represented by ::hwloc_nodeset_t, which is also a
|
|
||||||
* typedef for ::hwloc_bitmap_t).
|
|
||||||
*
|
|
||||||
* <em>Both CPU and node sets are always indexed by OS physical number.</em>
|
|
||||||
*
|
|
||||||
* \note CPU sets and nodesets are described in \ref hwlocality_sets.
|
|
||||||
*
|
|
||||||
* A bitmap may be of infinite size.
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief
|
|
||||||
* Set of bits represented as an opaque pointer to an internal bitmap.
|
|
||||||
*/
|
|
||||||
typedef struct hwloc_bitmap_s * hwloc_bitmap_t;
|
|
||||||
/** \brief a non-modifiable ::hwloc_bitmap_t */
|
|
||||||
typedef const struct hwloc_bitmap_s * hwloc_const_bitmap_t;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bitmap allocation, freeing and copying.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Allocate a new empty bitmap.
|
|
||||||
*
|
|
||||||
* \returns A valid bitmap or \c NULL.
|
|
||||||
*
|
|
||||||
* The bitmap should be freed by a corresponding call to
|
|
||||||
* hwloc_bitmap_free().
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_alloc(void) __hwloc_attribute_malloc;
|
|
||||||
|
|
||||||
/** \brief Allocate a new full bitmap. */
|
|
||||||
HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_alloc_full(void) __hwloc_attribute_malloc;
|
|
||||||
|
|
||||||
/** \brief Free bitmap \p bitmap.
|
|
||||||
*
|
|
||||||
* If \p bitmap is \c NULL, no operation is performed.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_free(hwloc_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Duplicate bitmap \p bitmap by allocating a new bitmap and copying \p bitmap contents.
|
|
||||||
*
|
|
||||||
* If \p bitmap is \c NULL, \c NULL is returned.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC hwloc_bitmap_t hwloc_bitmap_dup(hwloc_const_bitmap_t bitmap) __hwloc_attribute_malloc;
|
|
||||||
|
|
||||||
/** \brief Copy the contents of bitmap \p src into the already allocated bitmap \p dst */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Bitmap/String Conversion
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Stringify a bitmap.
|
|
||||||
*
|
|
||||||
* Up to \p buflen characters may be written in buffer \p buf.
|
|
||||||
*
|
|
||||||
* If \p buflen is 0, \p buf may safely be \c NULL.
|
|
||||||
*
|
|
||||||
* \return the number of character that were actually written if not truncating,
|
|
||||||
* or that would have been written (not including the ending \\0).
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Stringify a bitmap into a newly allocated string.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_asprintf(char ** strp, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Parse a bitmap string and stores it in bitmap \p bitmap.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string);
|
|
||||||
|
|
||||||
/** \brief Stringify a bitmap in the list format.
|
|
||||||
*
|
|
||||||
* Lists are comma-separated indexes or ranges.
|
|
||||||
* Ranges are dash separated indexes.
|
|
||||||
* The last range may not have a ending indexes if the bitmap is infinite.
|
|
||||||
*
|
|
||||||
* Up to \p buflen characters may be written in buffer \p buf.
|
|
||||||
*
|
|
||||||
* If \p buflen is 0, \p buf may safely be \c NULL.
|
|
||||||
*
|
|
||||||
* \return the number of character that were actually written if not truncating,
|
|
||||||
* or that would have been written (not including the ending \\0).
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_list_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Stringify a bitmap into a newly allocated list string.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_list_asprintf(char ** strp, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Parse a list string and stores it in bitmap \p bitmap.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_list_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string);
|
|
||||||
|
|
||||||
/** \brief Stringify a bitmap in the taskset-specific format.
|
|
||||||
*
|
|
||||||
* The taskset command manipulates bitmap strings that contain a single
|
|
||||||
* (possible very long) hexadecimal number starting with 0x.
|
|
||||||
*
|
|
||||||
* Up to \p buflen characters may be written in buffer \p buf.
|
|
||||||
*
|
|
||||||
* If \p buflen is 0, \p buf may safely be \c NULL.
|
|
||||||
*
|
|
||||||
* \return the number of character that were actually written if not truncating,
|
|
||||||
* or that would have been written (not including the ending \\0).
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_taskset_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Stringify a bitmap into a newly allocated taskset-specific string.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_taskset_asprintf(char ** strp, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Parse a taskset-specific bitmap string and stores it in bitmap \p bitmap.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_taskset_sscanf(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Building bitmaps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Empty the bitmap \p bitmap */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_zero(hwloc_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Fill bitmap \p bitmap with all possible indexes (even if those objects don't exist or are otherwise unavailable) */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_fill(hwloc_bitmap_t bitmap);
|
|
||||||
|
|
||||||
/** \brief Empty the bitmap \p bitmap and add bit \p id */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_only(hwloc_bitmap_t bitmap, unsigned id);
|
|
||||||
|
|
||||||
/** \brief Fill the bitmap \p and clear the index \p id */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_allbut(hwloc_bitmap_t bitmap, unsigned id);
|
|
||||||
|
|
||||||
/** \brief Setup bitmap \p bitmap from unsigned long \p mask */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_from_ulong(hwloc_bitmap_t bitmap, unsigned long mask);
|
|
||||||
|
|
||||||
/** \brief Setup bitmap \p bitmap from unsigned long \p mask used as \p i -th subset */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_from_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Modifying bitmaps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Add index \p id in bitmap \p bitmap */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_set(hwloc_bitmap_t bitmap, unsigned id);
|
|
||||||
|
|
||||||
/** \brief Add indexes from \p begin to \p end in bitmap \p bitmap.
|
|
||||||
*
|
|
||||||
* If \p end is \c -1, the range is infinite.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_set_range(hwloc_bitmap_t bitmap, unsigned begin, int end);
|
|
||||||
|
|
||||||
/** \brief Replace \p i -th subset of bitmap \p bitmap with unsigned long \p mask */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_set_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask);
|
|
||||||
|
|
||||||
/** \brief Remove index \p id from bitmap \p bitmap */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_clr(hwloc_bitmap_t bitmap, unsigned id);
|
|
||||||
|
|
||||||
/** \brief Remove indexes from \p begin to \p end in bitmap \p bitmap.
|
|
||||||
*
|
|
||||||
* If \p end is \c -1, the range is infinite.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_clr_range(hwloc_bitmap_t bitmap, unsigned begin, int end);
|
|
||||||
|
|
||||||
/** \brief Keep a single index among those set in bitmap \p bitmap
|
|
||||||
*
|
|
||||||
* May be useful before binding so that the process does not
|
|
||||||
* have a chance of migrating between multiple logical CPUs
|
|
||||||
* in the original mask.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_singlify(hwloc_bitmap_t bitmap);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Consulting bitmaps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Convert the beginning part of bitmap \p bitmap into unsigned long \p mask */
|
|
||||||
HWLOC_DECLSPEC unsigned long hwloc_bitmap_to_ulong(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Convert the \p i -th subset of bitmap \p bitmap into unsigned long mask */
|
|
||||||
HWLOC_DECLSPEC unsigned long hwloc_bitmap_to_ith_ulong(hwloc_const_bitmap_t bitmap, unsigned i) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Test whether index \p id is part of bitmap \p bitmap */
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_isset(hwloc_const_bitmap_t bitmap, unsigned id) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Test whether bitmap \p bitmap is empty */
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_iszero(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Test whether bitmap \p bitmap is completely full */
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_isfull(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Compute the first index (least significant bit) in bitmap \p bitmap
|
|
||||||
*
|
|
||||||
* \return -1 if no index is set.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_first(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Compute the next index in bitmap \p bitmap which is after index \p prev
|
|
||||||
*
|
|
||||||
* If \p prev is -1, the first index is returned.
|
|
||||||
*
|
|
||||||
* \return -1 if no index with higher index is bitmap.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_next(hwloc_const_bitmap_t bitmap, int prev) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Compute the last index (most significant bit) in bitmap \p bitmap
|
|
||||||
*
|
|
||||||
* \return -1 if no index is bitmap, or if the index bitmap is infinite.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_last(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Compute the "weight" of bitmap \p bitmap (i.e., number of
|
|
||||||
* indexes that are in the bitmap).
|
|
||||||
*
|
|
||||||
* \return the number of indexes that are in the bitmap.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_weight(hwloc_const_bitmap_t bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Loop macro iterating on bitmap \p bitmap
|
|
||||||
* \hideinitializer
|
|
||||||
*
|
|
||||||
* \p index is the loop variable; it should be an unsigned int. The
|
|
||||||
* first iteration will set \p index to the lowest index in the bitmap.
|
|
||||||
* Successive iterations will iterate through, in order, all remaining
|
|
||||||
* indexes that in the bitmap. To be specific: each iteration will return a
|
|
||||||
* value for \p index such that hwloc_bitmap_isset(bitmap, index) is true.
|
|
||||||
*
|
|
||||||
* The assert prevents the loop from being infinite if the bitmap is infinite.
|
|
||||||
*/
|
|
||||||
#define hwloc_bitmap_foreach_begin(id, bitmap) \
|
|
||||||
do { \
|
|
||||||
assert(hwloc_bitmap_weight(bitmap) != -1); \
|
|
||||||
for (id = hwloc_bitmap_first(bitmap); \
|
|
||||||
(unsigned) id != (unsigned) -1; \
|
|
||||||
id = hwloc_bitmap_next(bitmap, id)) { \
|
|
||||||
/** \brief End of loop. Needs a terminating ';'.
|
|
||||||
* \hideinitializer
|
|
||||||
*
|
|
||||||
* \sa hwloc_bitmap_foreach_begin */
|
|
||||||
#define hwloc_bitmap_foreach_end() \
|
|
||||||
} \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Combining bitmaps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Or bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_or (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
|
||||||
|
|
||||||
/** \brief And bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_and (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
|
||||||
|
|
||||||
/** \brief And bitmap \p bitmap1 and the negation of \p bitmap2 and store the result in bitmap \p res */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_andnot (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
|
||||||
|
|
||||||
/** \brief Xor bitmaps \p bitmap1 and \p bitmap2 and store the result in bitmap \p res */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_xor (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2);
|
|
||||||
|
|
||||||
/** \brief Negate bitmap \p bitmap and store the result in bitmap \p res */
|
|
||||||
HWLOC_DECLSPEC void hwloc_bitmap_not (hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap);
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Comparing bitmaps.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Test whether bitmaps \p bitmap1 and \p bitmap2 intersects */
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_intersects (hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Test whether bitmap \p sub_bitmap is part of bitmap \p super_bitmap */
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_isincluded (hwloc_const_bitmap_t sub_bitmap, hwloc_const_bitmap_t super_bitmap) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Test whether bitmap \p bitmap1 is equal to bitmap \p bitmap2 */
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_isequal (hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Compare bitmaps \p bitmap1 and \p bitmap2 using their lowest index.
|
|
||||||
*
|
|
||||||
* Smaller least significant bit is smaller.
|
|
||||||
* The empty bitmap is considered higher than anything.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_compare_first(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** \brief Compare bitmaps \p bitmap1 and \p bitmap2 using their highest index.
|
|
||||||
*
|
|
||||||
* Higher most significant bit is higher.
|
|
||||||
* The empty bitmap is considered lower than anything.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_bitmap_compare(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) __hwloc_attribute_pure;
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_BITMAP_H */
|
|
|
@ -1,75 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief The old deprecated Cpuset API.
|
|
||||||
* This interface should not be used anymore, it will be dropped in a later release.
|
|
||||||
*
|
|
||||||
* hwloc/bitmap.h should be used instead. Most hwloc_cpuset_foo functions are
|
|
||||||
* replaced with hwloc_bitmap_foo. The only exceptions are:
|
|
||||||
* - hwloc_cpuset_from_string -> hwloc_bitmap_sscanf
|
|
||||||
* - hwloc_cpuset_cpu -> hwloc_bitmap_only
|
|
||||||
* - hwloc_cpuset_all_but_cpu -> hwloc_bitmap_allbut
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_CPUSET_H
|
|
||||||
#define HWLOC_CPUSET_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "hwloc/bitmap.h"
|
|
||||||
|
|
||||||
static __hwloc_inline hwloc_bitmap_t __hwloc_attribute_deprecated hwloc_cpuset_alloc(void) { return hwloc_bitmap_alloc(); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_free(hwloc_bitmap_t bitmap) { hwloc_bitmap_free(bitmap); }
|
|
||||||
static __hwloc_inline hwloc_bitmap_t __hwloc_attribute_deprecated hwloc_cpuset_dup(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_dup(bitmap); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_copy(hwloc_bitmap_t dst, hwloc_const_bitmap_t src) { hwloc_bitmap_copy(dst, src); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_snprintf(char * __hwloc_restrict buf, size_t buflen, hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_snprintf(buf, buflen, bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_asprintf(char ** strp, hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_asprintf(strp, bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_from_string(hwloc_bitmap_t bitmap, const char * __hwloc_restrict string) { return hwloc_bitmap_sscanf(bitmap, string); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_zero(hwloc_bitmap_t bitmap) { hwloc_bitmap_zero(bitmap); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_fill(hwloc_bitmap_t bitmap) { hwloc_bitmap_fill(bitmap); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_from_ulong(hwloc_bitmap_t bitmap, unsigned long mask) { hwloc_bitmap_from_ulong(bitmap, mask); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_from_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask) { hwloc_bitmap_from_ith_ulong(bitmap, i, mask); }
|
|
||||||
static __hwloc_inline unsigned __hwloc_attribute_deprecated long hwloc_cpuset_to_ulong(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_to_ulong(bitmap); }
|
|
||||||
static __hwloc_inline unsigned __hwloc_attribute_deprecated long hwloc_cpuset_to_ith_ulong(hwloc_const_bitmap_t bitmap, unsigned i) { return hwloc_bitmap_to_ith_ulong(bitmap, i); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_cpu(hwloc_bitmap_t bitmap, unsigned index_) { hwloc_bitmap_only(bitmap, index_); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_all_but_cpu(hwloc_bitmap_t bitmap, unsigned index_) { hwloc_bitmap_allbut(bitmap, index_); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_set(hwloc_bitmap_t bitmap, unsigned index_) { hwloc_bitmap_set(bitmap, index_); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_set_range(hwloc_bitmap_t bitmap, unsigned begin, unsigned end) { hwloc_bitmap_set_range(bitmap, begin, end); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_set_ith_ulong(hwloc_bitmap_t bitmap, unsigned i, unsigned long mask) { hwloc_bitmap_set_ith_ulong(bitmap, i, mask); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_clr(hwloc_bitmap_t bitmap, unsigned index_) { hwloc_bitmap_clr(bitmap, index_); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_clr_range(hwloc_bitmap_t bitmap, unsigned begin, unsigned end) { hwloc_bitmap_clr_range(bitmap, begin, end); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_isset(hwloc_const_bitmap_t bitmap, unsigned index_) { return hwloc_bitmap_isset(bitmap, index_); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_iszero(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_iszero(bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_isfull(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_isfull(bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_isequal(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { return hwloc_bitmap_isequal(bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_intersects(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { return hwloc_bitmap_intersects(bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_isincluded(hwloc_const_bitmap_t sub_bitmap, hwloc_const_bitmap_t super_bitmap) { return hwloc_bitmap_isincluded(sub_bitmap, super_bitmap); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_or(hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { hwloc_bitmap_or(res, bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_and(hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { hwloc_bitmap_and(res, bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_andnot(hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { hwloc_bitmap_andnot(res, bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_xor(hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { hwloc_bitmap_xor(res, bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_not(hwloc_bitmap_t res, hwloc_const_bitmap_t bitmap) { hwloc_bitmap_not(res, bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_first(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_first(bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_last(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_last(bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_next(hwloc_const_bitmap_t bitmap, unsigned prev) { return hwloc_bitmap_next(bitmap, prev); }
|
|
||||||
static __hwloc_inline void __hwloc_attribute_deprecated hwloc_cpuset_singlify(hwloc_bitmap_t bitmap) { hwloc_bitmap_singlify(bitmap); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_compare_first(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { return hwloc_bitmap_compare_first(bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_compare(hwloc_const_bitmap_t bitmap1, hwloc_const_bitmap_t bitmap2) { return hwloc_bitmap_compare(bitmap1, bitmap2); }
|
|
||||||
static __hwloc_inline int __hwloc_attribute_deprecated hwloc_cpuset_weight(hwloc_const_bitmap_t bitmap) { return hwloc_bitmap_weight(bitmap); }
|
|
||||||
|
|
||||||
#define hwloc_cpuset_foreach_begin hwloc_bitmap_foreach_begin
|
|
||||||
#define hwloc_cpuset_foreach_end hwloc_bitmap_foreach_end
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* HWLOC_CPUSET_H */
|
|
|
@ -1,90 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and the CUDA Driver API.
|
|
||||||
*
|
|
||||||
* Applications that use both hwloc and the CUDA Driver API may want to
|
|
||||||
* include this file so as to get topology information for CUDA devices.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_CUDA_H
|
|
||||||
#define HWLOC_CUDA_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
#include <hwloc/linux.h>
|
|
||||||
|
|
||||||
#include <cuda.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_cuda CUDA Driver API Specific Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Get the CPU set of logical processors that are physically
|
|
||||||
* close to device \p cudevice.
|
|
||||||
*
|
|
||||||
* For the given CUDA Driver API device \p cudevice, read the corresponding
|
|
||||||
* kernel-provided cpumap file and return the corresponding CPU set.
|
|
||||||
* This function is currently only implemented in a meaningful way for
|
|
||||||
* Linux; other systems will simply get a full cpuset.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cuda_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
|
||||||
CUdevice cudevice, hwloc_cpuset_t set)
|
|
||||||
{
|
|
||||||
#ifdef HWLOC_LINUX_SYS
|
|
||||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
|
||||||
#define HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX 128
|
|
||||||
CUresult cres;
|
|
||||||
int deviceid;
|
|
||||||
int busid;
|
|
||||||
char path[HWLOC_CUDA_DEVICE_SYSFS_PATH_MAX];
|
|
||||||
FILE *sysfile = NULL;
|
|
||||||
|
|
||||||
cres = cuDeviceGetAttribute(&busid, CU_DEVICE_ATTRIBUTE_PCI_BUS_ID, cudevice);
|
|
||||||
if (cres != CUDA_SUCCESS) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
cres = cuDeviceGetAttribute(&deviceid, CU_DEVICE_ATTRIBUTE_PCI_DEVICE_ID, cudevice);
|
|
||||||
if (cres != CUDA_SUCCESS) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(path, "/sys/bus/pci/devices/0000:%02x:%02x.0/local_cpus", busid, deviceid);
|
|
||||||
sysfile = fopen(path, "r");
|
|
||||||
if (!sysfile)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
hwloc_linux_parse_cpumap_file(sysfile, set);
|
|
||||||
|
|
||||||
fclose(sysfile);
|
|
||||||
#else
|
|
||||||
/* Non-Linux systems simply get a full cpuset */
|
|
||||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_CUDA_H */
|
|
|
@ -1,84 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and the CUDA Runtime API.
|
|
||||||
*
|
|
||||||
* Applications that use both hwloc and the CUDA Runtime API may want to
|
|
||||||
* include this file so as to get topology information for CUDA devices.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_CUDART_H
|
|
||||||
#define HWLOC_CUDART_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
#include <hwloc/linux.h>
|
|
||||||
|
|
||||||
#include <cuda_runtime_api.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_cudart CUDA Runtime API Specific Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Get the CPU set of logical processors that are physically
|
|
||||||
* close to device \p cudevice.
|
|
||||||
*
|
|
||||||
* For the given CUDA Runtime API device \p cudevice, read the corresponding
|
|
||||||
* kernel-provided cpumap file and return the corresponding CPU set.
|
|
||||||
* This function is currently only implemented in a meaningful way for
|
|
||||||
* Linux; other systems will simply get a full cpuset.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cudart_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
|
||||||
int device, hwloc_cpuset_t set)
|
|
||||||
{
|
|
||||||
#ifdef HWLOC_LINUX_SYS
|
|
||||||
/* If we're on Linux, use the sysfs mechanism to get the local cpus */
|
|
||||||
#define HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX 128
|
|
||||||
cudaError_t cerr;
|
|
||||||
struct cudaDeviceProp prop;
|
|
||||||
char path[HWLOC_CUDART_DEVICE_SYSFS_PATH_MAX];
|
|
||||||
FILE *sysfile = NULL;
|
|
||||||
|
|
||||||
cerr = cudaGetDeviceProperties(&prop, device);
|
|
||||||
if (cerr) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(path, "/sys/bus/pci/devices/0000:%02x:%02x.0/local_cpus", prop.pciBusID, prop.pciDeviceID);
|
|
||||||
sysfile = fopen(path, "r");
|
|
||||||
if (!sysfile)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
hwloc_linux_parse_cpumap_file(sysfile, set);
|
|
||||||
|
|
||||||
fclose(sysfile);
|
|
||||||
#else
|
|
||||||
/* Non-Linux systems simply get a full cpuset */
|
|
||||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_CUDART_H */
|
|
|
@ -1,119 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and glibc scheduling routines.
|
|
||||||
*
|
|
||||||
* Applications that use both hwloc and glibc scheduling routines such as
|
|
||||||
* sched_getaffinity may want to include this file so as to ease conversion
|
|
||||||
* between their respective types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_GLIBC_SCHED_H
|
|
||||||
#define HWLOC_GLIBC_SCHED_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <hwloc/helper.h>
|
|
||||||
#include <assert.h>
|
|
||||||
|
|
||||||
#if !defined _GNU_SOURCE || !defined _SCHED_H || !defined CPU_SETSIZE
|
|
||||||
#error Please make sure to include sched.h before including glibc-sched.h, and define _GNU_SOURCE before any inclusion of sched.h
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_CPU_SET
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_glibc_sched Helpers for manipulating glibc sched affinity
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Convert hwloc CPU set \p toposet into glibc sched affinity CPU set \p schedset
|
|
||||||
*
|
|
||||||
* This function may be used before calling sched_setaffinity or any other function
|
|
||||||
* that takes a cpu_set_t as input parameter.
|
|
||||||
*
|
|
||||||
* \p schedsetsize should be sizeof(cpu_set_t) unless \p schedset was dynamically allocated with CPU_ALLOC
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_to_glibc_sched_affinity(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_cpuset_t hwlocset,
|
|
||||||
cpu_set_t *schedset, size_t schedsetsize)
|
|
||||||
{
|
|
||||||
#ifdef CPU_ZERO_S
|
|
||||||
unsigned cpu;
|
|
||||||
CPU_ZERO_S(schedsetsize, schedset);
|
|
||||||
hwloc_bitmap_foreach_begin(cpu, hwlocset)
|
|
||||||
CPU_SET_S(cpu, schedsetsize, schedset);
|
|
||||||
hwloc_bitmap_foreach_end();
|
|
||||||
#else /* !CPU_ZERO_S */
|
|
||||||
unsigned cpu;
|
|
||||||
CPU_ZERO(schedset);
|
|
||||||
assert(schedsetsize == sizeof(cpu_set_t));
|
|
||||||
hwloc_bitmap_foreach_begin(cpu, hwlocset)
|
|
||||||
CPU_SET(cpu, schedset);
|
|
||||||
hwloc_bitmap_foreach_end();
|
|
||||||
#endif /* !CPU_ZERO_S */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert glibc sched affinity CPU set \p schedset into hwloc CPU set
|
|
||||||
*
|
|
||||||
* This function may be used before calling sched_setaffinity or any other function
|
|
||||||
* that takes a cpu_set_t as input parameter.
|
|
||||||
*
|
|
||||||
* \p schedsetsize should be sizeof(cpu_set_t) unless \p schedset was dynamically allocated with CPU_ALLOC
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_from_glibc_sched_affinity(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_cpuset_t hwlocset,
|
|
||||||
const cpu_set_t *schedset, size_t schedsetsize)
|
|
||||||
{
|
|
||||||
#ifdef CPU_ZERO_S
|
|
||||||
int cpu, count;
|
|
||||||
#endif
|
|
||||||
hwloc_bitmap_zero(hwlocset);
|
|
||||||
#ifdef CPU_ZERO_S
|
|
||||||
count = CPU_COUNT_S(schedsetsize, schedset);
|
|
||||||
cpu = 0;
|
|
||||||
while (count) {
|
|
||||||
if (CPU_ISSET_S(cpu, schedsetsize, schedset)) {
|
|
||||||
hwloc_bitmap_set(hwlocset, cpu);
|
|
||||||
count--;
|
|
||||||
}
|
|
||||||
cpu++;
|
|
||||||
}
|
|
||||||
#else /* !CPU_ZERO_S */
|
|
||||||
/* sched.h does not support dynamic cpu_set_t (introduced in glibc 2.7),
|
|
||||||
* assume we have a very old interface without CPU_COUNT (added in 2.6)
|
|
||||||
*/
|
|
||||||
int cpu;
|
|
||||||
assert(schedsetsize == sizeof(cpu_set_t));
|
|
||||||
for(cpu=0; cpu<CPU_SETSIZE; cpu++)
|
|
||||||
if (CPU_ISSET(cpu, schedset))
|
|
||||||
hwloc_bitmap_set(hwlocset, cpu);
|
|
||||||
#endif /* !CPU_ZERO_S */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* CPU_SET */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_GLIBC_SCHED_H */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,462 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and Linux libnuma.
|
|
||||||
*
|
|
||||||
* Applications that use both Linux libnuma and hwloc may want to
|
|
||||||
* include this file so as to ease conversion between their respective types.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_LINUX_LIBNUMA_H
|
|
||||||
#define HWLOC_LINUX_LIBNUMA_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <numa.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_linux_libnuma_ulongs Helpers for manipulating Linux libnuma unsigned long masks
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Convert hwloc CPU set \p cpuset into the array of unsigned long \p mask
|
|
||||||
*
|
|
||||||
* \p mask is the array of unsigned long that will be filled.
|
|
||||||
* \p maxnode contains the maximal node number that may be stored in \p mask.
|
|
||||||
* \p maxnode will be set to the maximal node number that was found, plus one.
|
|
||||||
*
|
|
||||||
* This function may be used before calling set_mempolicy, mbind, migrate_pages
|
|
||||||
* or any other function that takes an array of unsigned long and a maximal
|
|
||||||
* node number as input parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset,
|
|
||||||
unsigned long *mask, unsigned long *maxnode)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
unsigned long outmaxnode = -1;
|
|
||||||
|
|
||||||
/* round-up to the next ulong and clear all bytes */
|
|
||||||
*maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1);
|
|
||||||
memset(mask, 0, *maxnode/8);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node = NULL;
|
|
||||||
while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL) {
|
|
||||||
if (node->os_index >= *maxnode)
|
|
||||||
continue;
|
|
||||||
mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8));
|
|
||||||
if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index)
|
|
||||||
outmaxnode = node->os_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (!hwloc_bitmap_iszero(cpuset)) {
|
|
||||||
mask[0] = 1;
|
|
||||||
outmaxnode = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*maxnode = outmaxnode+1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert hwloc NUMA node set \p nodeset into the array of unsigned long \p mask
|
|
||||||
*
|
|
||||||
* \p mask is the array of unsigned long that will be filled.
|
|
||||||
* \p maxnode contains the maximal node number that may be stored in \p mask.
|
|
||||||
* \p maxnode will be set to the maximal node number that was found, plus one.
|
|
||||||
*
|
|
||||||
* This function may be used before calling set_mempolicy, mbind, migrate_pages
|
|
||||||
* or any other function that takes an array of unsigned long and a maximal
|
|
||||||
* node number as input parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_nodeset_to_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset,
|
|
||||||
unsigned long *mask, unsigned long *maxnode)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
unsigned long outmaxnode = -1;
|
|
||||||
|
|
||||||
/* round-up to the next ulong and clear all bytes */
|
|
||||||
*maxnode = (*maxnode + 8*sizeof(*mask) - 1) & ~(8*sizeof(*mask) - 1);
|
|
||||||
memset(mask, 0, *maxnode/8);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node = NULL;
|
|
||||||
while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL) {
|
|
||||||
if (node->os_index >= *maxnode)
|
|
||||||
continue;
|
|
||||||
if (!hwloc_bitmap_isset(nodeset, node->os_index))
|
|
||||||
continue;
|
|
||||||
mask[node->os_index/sizeof(*mask)/8] |= 1UL << (node->os_index % (sizeof(*mask)*8));
|
|
||||||
if (outmaxnode == (unsigned long) -1 || outmaxnode < node->os_index)
|
|
||||||
outmaxnode = node->os_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (!hwloc_bitmap_iszero(nodeset)) {
|
|
||||||
mask[0] = 1;
|
|
||||||
outmaxnode = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
*maxnode = outmaxnode+1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert the array of unsigned long \p mask into hwloc CPU set
|
|
||||||
*
|
|
||||||
* \p mask is a array of unsigned long that will be read.
|
|
||||||
* \p maxnode contains the maximal node number that may be read in \p mask.
|
|
||||||
*
|
|
||||||
* This function may be used after calling get_mempolicy or any other function
|
|
||||||
* that takes an array of unsigned long as output parameter (and possibly
|
|
||||||
* a maximal node number as input parameter).
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
|
|
||||||
const unsigned long *mask, unsigned long maxnode)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node;
|
|
||||||
unsigned i;
|
|
||||||
hwloc_bitmap_zero(cpuset);
|
|
||||||
for(i=0; i<maxnode; i++)
|
|
||||||
if (mask[i/sizeof(*mask)/8] & (1UL << (i% (sizeof(*mask)*8)))) {
|
|
||||||
node = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (node)
|
|
||||||
hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (mask[0] & 1)
|
|
||||||
hwloc_bitmap_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
else
|
|
||||||
hwloc_bitmap_zero(cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert the array of unsigned long \p mask into hwloc NUMA node set
|
|
||||||
*
|
|
||||||
* \p mask is a array of unsigned long that will be read.
|
|
||||||
* \p maxnode contains the maximal node number that may be read in \p mask.
|
|
||||||
*
|
|
||||||
* This function may be used after calling get_mempolicy or any other function
|
|
||||||
* that takes an array of unsigned long as output parameter (and possibly
|
|
||||||
* a maximal node number as input parameter).
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_nodeset_from_linux_libnuma_ulongs(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
|
|
||||||
const unsigned long *mask, unsigned long maxnode)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node;
|
|
||||||
unsigned i;
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
for(i=0; i<maxnode; i++)
|
|
||||||
if (mask[i/sizeof(*mask)/8] & (1UL << (i% (sizeof(*mask)*8)))) {
|
|
||||||
node = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (node)
|
|
||||||
hwloc_bitmap_set(nodeset, node->os_index);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (mask[0] & 1)
|
|
||||||
hwloc_bitmap_fill(nodeset);
|
|
||||||
else
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_linux_libnuma_bitmask Helpers for manipulating Linux libnuma bitmask
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Convert hwloc CPU set \p cpuset into the returned libnuma bitmask
|
|
||||||
*
|
|
||||||
* The returned bitmask should later be freed with numa_bitmask_free.
|
|
||||||
*
|
|
||||||
* This function may be used before calling many numa_ functions
|
|
||||||
* that use a struct bitmask as an input parameter.
|
|
||||||
*
|
|
||||||
* \return newly allocated struct bitmask.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline struct bitmask * __hwloc_attribute_malloc
|
|
||||||
hwloc_cpuset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
struct bitmask *bitmask = numa_allocate_cpumask();
|
|
||||||
if (!bitmask)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node = NULL;
|
|
||||||
while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL)
|
|
||||||
numa_bitmask_setbit(bitmask, node->os_index);
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (!hwloc_bitmap_iszero(cpuset))
|
|
||||||
numa_bitmask_setbit(bitmask, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmask;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert hwloc NUMA node set \p nodeset into the returned libnuma bitmask
|
|
||||||
*
|
|
||||||
* The returned bitmask should later be freed with numa_bitmask_free.
|
|
||||||
*
|
|
||||||
* This function may be used before calling many numa_ functions
|
|
||||||
* that use a struct bitmask as an input parameter.
|
|
||||||
*
|
|
||||||
* \return newly allocated struct bitmask.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline struct bitmask * __hwloc_attribute_malloc
|
|
||||||
hwloc_nodeset_to_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
struct bitmask *bitmask = numa_allocate_cpumask();
|
|
||||||
if (!bitmask)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node = NULL;
|
|
||||||
while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL)
|
|
||||||
if (hwloc_bitmap_isset(nodeset, node->os_index))
|
|
||||||
numa_bitmask_setbit(bitmask, node->os_index);
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (!hwloc_bitmap_iszero(nodeset))
|
|
||||||
numa_bitmask_setbit(bitmask, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bitmask;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert libnuma bitmask \p bitmask into hwloc CPU set \p cpuset
|
|
||||||
*
|
|
||||||
* This function may be used after calling many numa_ functions
|
|
||||||
* that use a struct bitmask as an output parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
|
|
||||||
const struct bitmask *bitmask)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node;
|
|
||||||
int i;
|
|
||||||
hwloc_bitmap_zero(cpuset);
|
|
||||||
for(i=0; i<NUMA_NUM_NODES; i++)
|
|
||||||
if (numa_bitmask_isbitset(bitmask, i)) {
|
|
||||||
node = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (node)
|
|
||||||
hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (numa_bitmask_isbitset(bitmask, 0))
|
|
||||||
hwloc_bitmap_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
else
|
|
||||||
hwloc_bitmap_zero(cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert libnuma bitmask \p bitmask into hwloc NUMA node set \p nodeset
|
|
||||||
*
|
|
||||||
* This function may be used after calling many numa_ functions
|
|
||||||
* that use a struct bitmask as an output parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_nodeset_from_linux_libnuma_bitmask(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
|
|
||||||
const struct bitmask *bitmask)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node;
|
|
||||||
int i;
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
for(i=0; i<NUMA_NUM_NODES; i++)
|
|
||||||
if (numa_bitmask_isbitset(bitmask, i)) {
|
|
||||||
node = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (node)
|
|
||||||
hwloc_bitmap_set(nodeset, node->os_index);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (numa_bitmask_isbitset(bitmask, 0))
|
|
||||||
hwloc_bitmap_fill(nodeset);
|
|
||||||
else
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef NUMA_VERSION1_COMPATIBILITY
|
|
||||||
/** \defgroup hwlocality_linux_libnuma_nodemask Helpers for manipulating Linux libnuma nodemask_t
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/** \brief Convert hwloc CPU set \p cpuset into libnuma nodemask \p nodemask
|
|
||||||
*
|
|
||||||
* This function may be used before calling some old libnuma functions
|
|
||||||
* that use a nodemask_t as an input parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_const_cpuset_t cpuset,
|
|
||||||
nodemask_t *nodemask)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
nodemask_zero(nodemask);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node = NULL;
|
|
||||||
while ((node = hwloc_get_next_obj_covering_cpuset_by_type(topology, cpuset, HWLOC_OBJ_NODE, node)) != NULL)
|
|
||||||
nodemask_set(nodemask, node->os_index);
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (!hwloc_bitmap_iszero(cpuset))
|
|
||||||
nodemask_set(nodemask, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert hwloc NUMA node set \p nodeset into libnuma nodemask \p nodemask
|
|
||||||
*
|
|
||||||
* This function may be used before calling some old libnuma functions
|
|
||||||
* that use a nodemask_t as an input parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_nodeset_to_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset,
|
|
||||||
nodemask_t *nodemask)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
nodemask_zero(nodemask);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node = NULL;
|
|
||||||
while ((node = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, node)) != NULL)
|
|
||||||
if (hwloc_bitmap_isset(nodeset, node->os_index))
|
|
||||||
nodemask_set(nodemask, node->os_index);
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (!hwloc_bitmap_iszero(nodeset))
|
|
||||||
nodemask_set(nodemask, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert libnuma nodemask \p nodemask into hwloc CPU set \p cpuset
|
|
||||||
*
|
|
||||||
* This function may be used before calling some old libnuma functions
|
|
||||||
* that use a nodemask_t as an output parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_cpuset_from_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_cpuset_t cpuset,
|
|
||||||
const nodemask_t *nodemask)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node;
|
|
||||||
int i;
|
|
||||||
hwloc_bitmap_zero(cpuset);
|
|
||||||
for(i=0; i<NUMA_NUM_NODES; i++)
|
|
||||||
if (nodemask_isset(nodemask, i)) {
|
|
||||||
node = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (node)
|
|
||||||
hwloc_bitmap_or(cpuset, cpuset, node->cpuset);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (nodemask_isset(nodemask, 0))
|
|
||||||
hwloc_bitmap_copy(cpuset, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
else
|
|
||||||
hwloc_bitmap_zero(cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Convert libnuma nodemask \p nodemask into hwloc NUMA node set \p nodeset
|
|
||||||
*
|
|
||||||
* This function may be used before calling some old libnuma functions
|
|
||||||
* that use a nodemask_t as an output parameter.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_nodeset_from_linux_libnuma_nodemask(hwloc_topology_t topology, hwloc_nodeset_t nodeset,
|
|
||||||
const nodemask_t *nodemask)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
|
|
||||||
if (depth != HWLOC_TYPE_DEPTH_UNKNOWN) {
|
|
||||||
hwloc_obj_t node;
|
|
||||||
int i;
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
for(i=0; i<NUMA_NUM_NODES; i++)
|
|
||||||
if (nodemask_isset(nodemask, i)) {
|
|
||||||
node = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (node)
|
|
||||||
hwloc_bitmap_set(nodeset, node->os_index);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
/* if no numa, libnuma assumes we have a single node */
|
|
||||||
if (nodemask_isset(nodemask, 0))
|
|
||||||
hwloc_bitmap_fill(nodeset);
|
|
||||||
else
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
#endif /* NUMA_VERSION1_COMPATIBILITY */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_LINUX_NUMA_H */
|
|
|
@ -1,64 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and Linux.
|
|
||||||
*
|
|
||||||
* Applications that use hwloc on Linux may want to include this file
|
|
||||||
* if using some low-level Linux features.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_LINUX_H
|
|
||||||
#define HWLOC_LINUX_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_linux Linux-only helpers
|
|
||||||
*
|
|
||||||
* This includes helpers for manipulating linux kernel cpumap files, and hwloc
|
|
||||||
* equivalents of the Linux sched_setaffinity and sched_getaffinity system calls.
|
|
||||||
*
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Convert a linux kernel cpumap file \p file into hwloc CPU set.
|
|
||||||
*
|
|
||||||
* Might be used when reading CPU set from sysfs attributes such as topology
|
|
||||||
* and caches for processors, or local_cpus for devices.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_linux_parse_cpumap_file(FILE *file, hwloc_cpuset_t set);
|
|
||||||
|
|
||||||
/** \brief Bind a thread \p tid on cpus given in cpuset \p set
|
|
||||||
*
|
|
||||||
* The behavior is exactly the same as the Linux sched_setaffinity system call,
|
|
||||||
* but uses a hwloc cpuset.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_linux_set_tid_cpubind(hwloc_topology_t topology, pid_t tid, hwloc_const_cpuset_t set);
|
|
||||||
|
|
||||||
/** \brief Get the current binding of thread \p tid
|
|
||||||
*
|
|
||||||
* The behavior is exactly the same as the Linux sched_getaffinity system call,
|
|
||||||
* but uses a hwloc cpuset.
|
|
||||||
*/
|
|
||||||
HWLOC_DECLSPEC int hwloc_linux_get_tid_cpubind(hwloc_topology_t topology, pid_t tid, hwloc_cpuset_t set);
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_GLIBC_SCHED_H */
|
|
|
@ -1,107 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and Myrinet Express.
|
|
||||||
*
|
|
||||||
* Applications that use both hwloc and Myrinet Express verbs may want to
|
|
||||||
* include this file so as to get topology information for Myrinet hardware.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_MYRIEXPRESS_H
|
|
||||||
#define HWLOC_MYRIEXPRESS_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
#include <hwloc/linux.h>
|
|
||||||
|
|
||||||
#include <myriexpress.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_myriexpress Myrinet Express-Specific Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Get the CPU set of logical processors that are physically
|
|
||||||
* close the MX board \p id.
|
|
||||||
*
|
|
||||||
* For the given Myrinet Express board index \p id, read the
|
|
||||||
* OS-provided NUMA node and return the corresponding CPU set.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_mx_board_get_device_cpuset(hwloc_topology_t topology,
|
|
||||||
unsigned id, hwloc_cpuset_t set)
|
|
||||||
{
|
|
||||||
uint32_t in, out;
|
|
||||||
|
|
||||||
in = id;
|
|
||||||
if (mx_get_info(NULL, MX_NUMA_NODE, &in, sizeof(in), &out, sizeof(out)) != MX_SUCCESS) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (out != (uint32_t) -1) {
|
|
||||||
hwloc_obj_t obj = NULL;
|
|
||||||
while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NODE, obj)) != NULL)
|
|
||||||
if (obj->os_index == out) {
|
|
||||||
hwloc_bitmap_copy(set, obj->cpuset);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* fallback to the full topology cpuset */
|
|
||||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
|
|
||||||
out:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** \brief Get the CPU set of logical processors that are physically
|
|
||||||
* close to endpoint \p endpoint.
|
|
||||||
*
|
|
||||||
* For the given Myrinet Express endpoint \p endpoint, read the
|
|
||||||
* OS-provided NUMA node and return the corresponding CPU set.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_mx_endpoint_get_device_cpuset(hwloc_topology_t topology,
|
|
||||||
mx_endpoint_t endpoint, hwloc_cpuset_t set)
|
|
||||||
{
|
|
||||||
uint64_t nid;
|
|
||||||
uint32_t nindex, eid;
|
|
||||||
mx_endpoint_addr_t eaddr;
|
|
||||||
|
|
||||||
if (mx_get_endpoint_addr(endpoint, &eaddr) != MX_SUCCESS) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mx_decompose_endpoint_addr(eaddr, &nid, &eid) != MX_SUCCESS) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mx_nic_id_to_board_number(nid, &nindex) != MX_SUCCESS) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return hwloc_mx_board_get_device_cpuset(topology, nindex, set);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_MYRIEXPRESS_H */
|
|
|
@ -1,81 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \file
|
|
||||||
* \brief Macros to help interaction between hwloc and OpenFabrics
|
|
||||||
* verbs.
|
|
||||||
*
|
|
||||||
* Applications that use both hwloc and OpenFabrics verbs may want to
|
|
||||||
* include this file so as to get topology information for OpenFabrics
|
|
||||||
* hardware.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_OPENFABRICS_VERBS_H
|
|
||||||
#define HWLOC_OPENFABRICS_VERBS_H
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
#include <hwloc/linux.h>
|
|
||||||
|
|
||||||
#include <infiniband/verbs.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/** \defgroup hwlocality_openfabrics OpenFabrics-Specific Functions
|
|
||||||
* @{
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** \brief Get the CPU set of logical processors that are physically
|
|
||||||
* close to device \p ibdev.
|
|
||||||
*
|
|
||||||
* For the given OpenFabrics device \p ibdev, read the corresponding
|
|
||||||
* kernel-provided cpumap file and return the corresponding CPU set.
|
|
||||||
* This function is currently only implemented in a meaningful way for
|
|
||||||
* Linux; other systems will simply get a full cpuset.
|
|
||||||
*/
|
|
||||||
static __hwloc_inline int
|
|
||||||
hwloc_ibv_get_device_cpuset(hwloc_topology_t topology __hwloc_attribute_unused,
|
|
||||||
struct ibv_device *ibdev, hwloc_cpuset_t set)
|
|
||||||
{
|
|
||||||
#ifdef HWLOC_LINUX_SYS
|
|
||||||
/* If we're on Linux, use the verbs-provided sysfs mechanism to
|
|
||||||
get the local cpus */
|
|
||||||
#define HWLOC_OPENFABRICS_VERBS_SYSFS_PATH_MAX 128
|
|
||||||
char path[HWLOC_OPENFABRICS_VERBS_SYSFS_PATH_MAX];
|
|
||||||
FILE *sysfile = NULL;
|
|
||||||
|
|
||||||
sprintf(path, "/sys/class/infiniband/%s/device/local_cpus",
|
|
||||||
ibv_get_device_name(ibdev));
|
|
||||||
sysfile = fopen(path, "r");
|
|
||||||
if (!sysfile)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
hwloc_linux_parse_cpumap_file(sysfile, set);
|
|
||||||
|
|
||||||
fclose(sysfile);
|
|
||||||
#else
|
|
||||||
/* Non-Linux systems simply get a full cpuset */
|
|
||||||
hwloc_bitmap_copy(set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
#endif
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** @} */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_OPENFABRICS_VERBS_H */
|
|
|
@ -1,513 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* Copyright © 2010-2011 INRIA. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_RENAME_H
|
|
||||||
#define HWLOC_RENAME_H
|
|
||||||
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Only enact these defines if we're actually renaming the symbols
|
|
||||||
(i.e., avoid trying to have no-op defines if we're *not*
|
|
||||||
renaming). */
|
|
||||||
|
|
||||||
#if HWLOC_SYM_TRANSFORM
|
|
||||||
|
|
||||||
/* Use a preprocessor two-step in order to get the prefixing right.
|
|
||||||
Make 2 macros: HWLOC_NAME and HWLOC_NAME_CAPS for renaming
|
|
||||||
things. */
|
|
||||||
|
|
||||||
#define HWLOC_MUNGE_NAME(a, b) HWLOC_MUNGE_NAME2(a, b)
|
|
||||||
#define HWLOC_MUNGE_NAME2(a, b) a ## b
|
|
||||||
#define HWLOC_NAME(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX, hwloc_ ## name)
|
|
||||||
#define HWLOC_NAME_CAPS(name) HWLOC_MUNGE_NAME(HWLOC_SYM_PREFIX_CAPS, hwloc_ ## name)
|
|
||||||
|
|
||||||
/* Now define all the "real" names to be the prefixed names. This
|
|
||||||
allows us to use the real names throughout the code base (i.e.,
|
|
||||||
"hwloc_<foo>"); the preprocessor will adjust to have the prefixed
|
|
||||||
name under the covers. */
|
|
||||||
|
|
||||||
/* Names from hwloc.h */
|
|
||||||
|
|
||||||
#define hwloc_get_api_version HWLOC_NAME(get_api_version)
|
|
||||||
|
|
||||||
#define hwloc_topology HWLOC_NAME(topology)
|
|
||||||
#define hwloc_topology_t HWLOC_NAME(topology_t)
|
|
||||||
|
|
||||||
#define hwloc_cpuset_t HWLOC_NAME(cpuset_t)
|
|
||||||
#define hwloc_const_cpuset_t HWLOC_NAME(const_cpuset_t)
|
|
||||||
#define hwloc_nodeset_t HWLOC_NAME(nodeset_t)
|
|
||||||
#define hwloc_const_nodeset_t HWLOC_NAME(const_nodeset_t)
|
|
||||||
|
|
||||||
#define HWLOC_OBJ_SYSTEM HWLOC_NAME_CAPS(OBJ_SYSTEM)
|
|
||||||
#define HWLOC_OBJ_MACHINE HWLOC_NAME_CAPS(OBJ_MACHINE)
|
|
||||||
#define HWLOC_OBJ_NODE HWLOC_NAME_CAPS(OBJ_NODE)
|
|
||||||
#define HWLOC_OBJ_SOCKET HWLOC_NAME_CAPS(OBJ_SOCKET)
|
|
||||||
#define HWLOC_OBJ_CACHE HWLOC_NAME_CAPS(OBJ_CACHE)
|
|
||||||
#define HWLOC_OBJ_CORE HWLOC_NAME_CAPS(OBJ_CORE)
|
|
||||||
#define HWLOC_OBJ_PU HWLOC_NAME_CAPS(OBJ_PU)
|
|
||||||
#define HWLOC_OBJ_MISC HWLOC_NAME_CAPS(OBJ_MISC)
|
|
||||||
#define HWLOC_OBJ_GROUP HWLOC_NAME_CAPS(OBJ_GROUP)
|
|
||||||
#define HWLOC_OBJ_TYPE_MAX HWLOC_NAME_CAPS(OBJ_TYPE_MAX)
|
|
||||||
|
|
||||||
#define hwloc_obj_type_t HWLOC_NAME(obj_type_t)
|
|
||||||
|
|
||||||
#define hwloc_compare_types HWLOC_NAME(compare_types)
|
|
||||||
|
|
||||||
#define hwloc_compare_types_e HWLOC_NAME(compare_types_e)
|
|
||||||
#define HWLOC_TYPE_UNORDERED HWLOC_NAME_CAPS(TYPE_UNORDERED)
|
|
||||||
|
|
||||||
#define hwloc_obj_memory_s HWLOC_NAME(obj_memory_s)
|
|
||||||
#define hwloc_obj_memory_page_type_s HWLOC_NAME(obj_memory_page_type_s)
|
|
||||||
|
|
||||||
#define hwloc_obj HWLOC_NAME(obj)
|
|
||||||
#define hwloc_obj_t HWLOC_NAME(obj_t)
|
|
||||||
|
|
||||||
#define hwloc_distances_s HWLOC_NAME(distances_s)
|
|
||||||
#define hwloc_obj_info_s HWLOC_NAME(obj_info_s)
|
|
||||||
|
|
||||||
#define hwloc_obj_attr_u HWLOC_NAME(obj_attr_u)
|
|
||||||
#define hwloc_cache_attr_s HWLOC_NAME(cache_attr_s)
|
|
||||||
#define hwloc_group_attr_s HWLOC_NAME(group_attr_s)
|
|
||||||
|
|
||||||
#define hwloc_topology_init HWLOC_NAME(topology_init)
|
|
||||||
#define hwloc_topology_load HWLOC_NAME(topology_load)
|
|
||||||
#define hwloc_topology_destroy HWLOC_NAME(topology_destroy)
|
|
||||||
#define hwloc_topology_check HWLOC_NAME(topology_check)
|
|
||||||
#define hwloc_topology_ignore_type HWLOC_NAME(topology_ignore_type)
|
|
||||||
#define hwloc_topology_ignore_type_keep_structure HWLOC_NAME(topology_ignore_type_keep_structure)
|
|
||||||
#define hwloc_topology_ignore_all_keep_structure HWLOC_NAME(topology_ignore_all_keep_structure)
|
|
||||||
|
|
||||||
#define hwloc_topology_flags_e HWLOC_NAME(topology_flags_e)
|
|
||||||
|
|
||||||
#define HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM HWLOC_NAME_CAPS(TOPOLOGY_FLAG_WHOLE_SYSTEM)
|
|
||||||
#define HWLOC_TOPOLOGY_FLAG_IS_THISSYSTEM HWLOC_NAME_CAPS(TOPOLOGY_FLAG_IS_THISSYSTEM)
|
|
||||||
|
|
||||||
#define hwloc_topology_set_flags HWLOC_NAME(topology_set_flags)
|
|
||||||
#define hwloc_topology_set_fsroot HWLOC_NAME(topology_set_fsroot)
|
|
||||||
#define hwloc_topology_set_pid HWLOC_NAME(topology_set_pid)
|
|
||||||
#define hwloc_topology_set_synthetic HWLOC_NAME(topology_set_synthetic)
|
|
||||||
#define hwloc_topology_set_xml HWLOC_NAME(topology_set_xml)
|
|
||||||
#define hwloc_topology_set_xmlbuffer HWLOC_NAME(topology_set_xmlbuffer)
|
|
||||||
#define hwloc_topology_set_distance_matrix HWLOC_NAME(topology_set_distance_matrix)
|
|
||||||
|
|
||||||
#define hwloc_topology_discovery_support HWLOC_NAME(topology_discovery_support)
|
|
||||||
#define hwloc_topology_cpubind_support HWLOC_NAME(topology_cpubind_support)
|
|
||||||
#define hwloc_topology_membind_support HWLOC_NAME(topology_membind_support)
|
|
||||||
#define hwloc_topology_support HWLOC_NAME(topology_support)
|
|
||||||
#define hwloc_topology_get_support HWLOC_NAME(topology_get_support)
|
|
||||||
#define hwloc_topology_export_xml HWLOC_NAME(topology_export_xml)
|
|
||||||
#define hwloc_topology_export_xmlbuffer HWLOC_NAME(topology_export_xmlbuffer)
|
|
||||||
|
|
||||||
#define hwloc_topology_insert_misc_object_by_cpuset HWLOC_NAME(topology_insert_misc_object_by_cpuset)
|
|
||||||
#define hwloc_topology_insert_misc_object_by_parent HWLOC_NAME(topology_insert_misc_object_by_parent)
|
|
||||||
|
|
||||||
#define hwloc_restrict_flags_e HWLOC_NAME(restrict_flags_e)
|
|
||||||
#define HWLOC_RESTRICT_FLAG_ADAPT_DISTANCES HWLOC_NAME_CAPS(RESTRICT_FLAG_ADAPT_DISTANCES)
|
|
||||||
#define HWLOC_RESTRICT_FLAG_ADAPT_MISC HWLOC_NAME_CAPS(RESTRICT_FLAG_ADAPT_MISC)
|
|
||||||
#define hwloc_topology_restrict HWLOC_NAME(topology_restrict)
|
|
||||||
|
|
||||||
#define hwloc_topology_get_depth HWLOC_NAME(topology_get_depth)
|
|
||||||
#define hwloc_get_type_depth HWLOC_NAME(get_type_depth)
|
|
||||||
|
|
||||||
#define hwloc_get_type_depth_e HWLOC_NAME(get_type_depth_e)
|
|
||||||
#define HWLOC_TYPE_DEPTH_UNKNOWN HWLOC_NAME_CAPS(TYPE_DEPTH_UNKNOWN)
|
|
||||||
#define HWLOC_TYPE_DEPTH_MULTIPLE HWLOC_NAME_CAPS(TYPE_DEPTH_MULTIPLE)
|
|
||||||
|
|
||||||
#define hwloc_get_depth_type HWLOC_NAME(get_depth_type)
|
|
||||||
#define hwloc_get_nbobjs_by_depth HWLOC_NAME(get_nbobjs_by_depth)
|
|
||||||
#define hwloc_get_nbobjs_by_type HWLOC_NAME(get_nbobjs_by_type)
|
|
||||||
|
|
||||||
#define hwloc_topology_is_thissystem HWLOC_NAME(topology_is_thissystem)
|
|
||||||
|
|
||||||
#define hwloc_get_obj_by_depth HWLOC_NAME(get_obj_by_depth )
|
|
||||||
#define hwloc_get_obj_by_type HWLOC_NAME(get_obj_by_type )
|
|
||||||
|
|
||||||
#define hwloc_obj_type_string HWLOC_NAME(obj_type_string )
|
|
||||||
#define hwloc_obj_type_of_string HWLOC_NAME(obj_type_of_string )
|
|
||||||
#define hwloc_obj_type_snprintf HWLOC_NAME(obj_type_snprintf )
|
|
||||||
#define hwloc_obj_attr_snprintf HWLOC_NAME(obj_attr_snprintf )
|
|
||||||
#define hwloc_obj_snprintf HWLOC_NAME(obj_snprintf)
|
|
||||||
#define hwloc_obj_cpuset_snprintf HWLOC_NAME(obj_cpuset_snprintf)
|
|
||||||
#define hwloc_obj_get_info_by_name HWLOC_NAME(obj_get_info_by_name)
|
|
||||||
|
|
||||||
#define HWLOC_CPUBIND_PROCESS HWLOC_NAME_CAPS(CPUBIND_PROCESS)
|
|
||||||
#define HWLOC_CPUBIND_THREAD HWLOC_NAME_CAPS(CPUBIND_THREAD)
|
|
||||||
#define HWLOC_CPUBIND_STRICT HWLOC_NAME_CAPS(CPUBIND_STRICT)
|
|
||||||
#define HWLOC_CPUBIND_NOMEMBIND HWLOC_NAME_CAPS(CPUBIND_NOMEMBIND)
|
|
||||||
|
|
||||||
#define hwloc_cpubind_flags_t HWLOC_NAME(cpubind_flags_t)
|
|
||||||
|
|
||||||
#define hwloc_set_cpubind HWLOC_NAME(set_cpubind)
|
|
||||||
#define hwloc_get_cpubind HWLOC_NAME(get_cpubind)
|
|
||||||
#define hwloc_set_proc_cpubind HWLOC_NAME(set_proc_cpubind)
|
|
||||||
#define hwloc_get_proc_cpubind HWLOC_NAME(get_proc_cpubind)
|
|
||||||
#define hwloc_set_thread_cpubind HWLOC_NAME(set_thread_cpubind)
|
|
||||||
#define hwloc_get_thread_cpubind HWLOC_NAME(get_thread_cpubind)
|
|
||||||
|
|
||||||
#define hwloc_get_last_cpu_location HWLOC_NAME(get_last_cpu_location)
|
|
||||||
#define hwloc_get_proc_last_cpu_location HWLOC_NAME(get_proc_last_cpu_location)
|
|
||||||
|
|
||||||
#define HWLOC_MEMBIND_DEFAULT HWLOC_NAME_CAPS(MEMBIND_DEFAULT)
|
|
||||||
#define HWLOC_MEMBIND_FIRSTTOUCH HWLOC_NAME_CAPS(MEMBIND_FIRSTTOUCH)
|
|
||||||
#define HWLOC_MEMBIND_BIND HWLOC_NAME_CAPS(MEMBIND_BIND)
|
|
||||||
#define HWLOC_MEMBIND_INTERLEAVE HWLOC_NAME_CAPS(MEMBIND_INTERLEAVE)
|
|
||||||
#define HWLOC_MEMBIND_REPLICATE HWLOC_NAME_CAPS(MEMBIND_REPLICATE)
|
|
||||||
#define HWLOC_MEMBIND_NEXTTOUCH HWLOC_NAME_CAPS(MEMBIND_NEXTTOUCH)
|
|
||||||
#define HWLOC_MEMBIND_MIXED HWLOC_NAME_CAPS(MEMBIND_MIXED)
|
|
||||||
|
|
||||||
#define hwloc_membind_policy_t HWLOC_NAME(membind_policy_t)
|
|
||||||
|
|
||||||
#define HWLOC_MEMBIND_PROCESS HWLOC_NAME_CAPS(MEMBIND_PROCESS)
|
|
||||||
#define HWLOC_MEMBIND_THREAD HWLOC_NAME_CAPS(MEMBIND_THREAD)
|
|
||||||
#define HWLOC_MEMBIND_STRICT HWLOC_NAME_CAPS(MEMBIND_STRICT)
|
|
||||||
#define HWLOC_MEMBIND_MIGRATE HWLOC_NAME_CAPS(MEMBIND_MIGRATE)
|
|
||||||
#define HWLOC_MEMBIND_NOCPUBIND HWLOC_NAME_CAPS(MEMBIND_NOCPUBIND)
|
|
||||||
|
|
||||||
#define hwloc_membind_flags_t HWLOC_NAME(membind_flags_t)
|
|
||||||
|
|
||||||
#define hwloc_set_membind_nodeset HWLOC_NAME(set_membind_nodeset)
|
|
||||||
#define hwloc_set_membind HWLOC_NAME(set_membind)
|
|
||||||
#define hwloc_get_membind_nodeset HWLOC_NAME(get_membind_nodeset)
|
|
||||||
#define hwloc_get_membind HWLOC_NAME(get_membind)
|
|
||||||
#define hwloc_set_proc_membind_nodeset HWLOC_NAME(set_proc_membind_nodeset)
|
|
||||||
#define hwloc_set_proc_membind HWLOC_NAME(set_proc_membind)
|
|
||||||
#define hwloc_get_proc_membind_nodeset HWLOC_NAME(get_proc_membind_nodeset)
|
|
||||||
#define hwloc_get_proc_membind HWLOC_NAME(get_proc_membind)
|
|
||||||
#define hwloc_set_area_membind_nodeset HWLOC_NAME(set_area_membind_nodeset)
|
|
||||||
#define hwloc_set_area_membind HWLOC_NAME(set_area_membind)
|
|
||||||
#define hwloc_get_area_membind_nodeset HWLOC_NAME(get_area_membind_nodeset)
|
|
||||||
#define hwloc_get_area_membind HWLOC_NAME(get_area_membind)
|
|
||||||
#define hwloc_alloc_membind_nodeset HWLOC_NAME(alloc_membind_nodeset)
|
|
||||||
#define hwloc_alloc_membind HWLOC_NAME(alloc_membind)
|
|
||||||
#define hwloc_alloc HWLOC_NAME(alloc)
|
|
||||||
#define hwloc_free HWLOC_NAME(free)
|
|
||||||
|
|
||||||
/* hwloc/bitmap.h */
|
|
||||||
|
|
||||||
#define hwloc_bitmap HWLOC_NAME(bitmap)
|
|
||||||
#define hwloc_bitmap_s HWLOC_NAME(bitmap_s)
|
|
||||||
#define hwloc_bitmap_t HWLOC_NAME(bitmap_t)
|
|
||||||
#define hwloc_const_bitmap_t HWLOC_NAME(const_bitmap_t)
|
|
||||||
|
|
||||||
#define hwloc_bitmap_alloc HWLOC_NAME(bitmap_alloc)
|
|
||||||
#define hwloc_bitmap_alloc_full HWLOC_NAME(bitmap_alloc_full)
|
|
||||||
#define hwloc_bitmap_free HWLOC_NAME(bitmap_free)
|
|
||||||
#define hwloc_bitmap_dup HWLOC_NAME(bitmap_dup)
|
|
||||||
#define hwloc_bitmap_copy HWLOC_NAME(bitmap_copy)
|
|
||||||
#define hwloc_bitmap_snprintf HWLOC_NAME(bitmap_snprintf)
|
|
||||||
#define hwloc_bitmap_asprintf HWLOC_NAME(bitmap_asprintf)
|
|
||||||
#define hwloc_bitmap_sscanf HWLOC_NAME(bitmap_sscanf)
|
|
||||||
#define hwloc_bitmap_list_snprintf HWLOC_NAME(bitmap_list_snprintf)
|
|
||||||
#define hwloc_bitmap_list_asprintf HWLOC_NAME(bitmap_list_asprintf)
|
|
||||||
#define hwloc_bitmap_list_sscanf HWLOC_NAME(bitmap_list_sscanf)
|
|
||||||
#define hwloc_bitmap_taskset_snprintf HWLOC_NAME(bitmap_taskset_snprintf)
|
|
||||||
#define hwloc_bitmap_taskset_asprintf HWLOC_NAME(bitmap_taskset_asprintf)
|
|
||||||
#define hwloc_bitmap_taskset_sscanf HWLOC_NAME(bitmap_taskset_sscanf)
|
|
||||||
#define hwloc_bitmap_zero HWLOC_NAME(bitmap_zero)
|
|
||||||
#define hwloc_bitmap_fill HWLOC_NAME(bitmap_fill)
|
|
||||||
#define hwloc_bitmap_from_ulong HWLOC_NAME(bitmap_from_ulong)
|
|
||||||
|
|
||||||
#define hwloc_bitmap_from_ith_ulong HWLOC_NAME(bitmap_from_ith_ulong)
|
|
||||||
#define hwloc_bitmap_to_ulong HWLOC_NAME(bitmap_to_ulong)
|
|
||||||
#define hwloc_bitmap_to_ith_ulong HWLOC_NAME(bitmap_to_ith_ulong)
|
|
||||||
#define hwloc_bitmap_only HWLOC_NAME(bitmap_only)
|
|
||||||
#define hwloc_bitmap_allbut HWLOC_NAME(bitmap_allbut)
|
|
||||||
#define hwloc_bitmap_set HWLOC_NAME(bitmap_set)
|
|
||||||
#define hwloc_bitmap_set_range HWLOC_NAME(bitmap_set_range)
|
|
||||||
#define hwloc_bitmap_set_ith_ulong HWLOC_NAME(bitmap_set_ith_ulong)
|
|
||||||
#define hwloc_bitmap_clr HWLOC_NAME(bitmap_clr)
|
|
||||||
#define hwloc_bitmap_clr_range HWLOC_NAME(bitmap_clr_range)
|
|
||||||
#define hwloc_bitmap_isset HWLOC_NAME(bitmap_isset)
|
|
||||||
#define hwloc_bitmap_iszero HWLOC_NAME(bitmap_iszero)
|
|
||||||
#define hwloc_bitmap_isfull HWLOC_NAME(bitmap_isfull)
|
|
||||||
#define hwloc_bitmap_isequal HWLOC_NAME(bitmap_isequal)
|
|
||||||
#define hwloc_bitmap_intersects HWLOC_NAME(bitmap_intersects)
|
|
||||||
#define hwloc_bitmap_isincluded HWLOC_NAME(bitmap_isincluded)
|
|
||||||
#define hwloc_bitmap_or HWLOC_NAME(bitmap_or)
|
|
||||||
#define hwloc_bitmap_and HWLOC_NAME(bitmap_and)
|
|
||||||
#define hwloc_bitmap_andnot HWLOC_NAME(bitmap_andnot)
|
|
||||||
#define hwloc_bitmap_xor HWLOC_NAME(bitmap_xor)
|
|
||||||
#define hwloc_bitmap_not HWLOC_NAME(bitmap_not)
|
|
||||||
#define hwloc_bitmap_first HWLOC_NAME(bitmap_first)
|
|
||||||
#define hwloc_bitmap_last HWLOC_NAME(bitmap_last)
|
|
||||||
#define hwloc_bitmap_next HWLOC_NAME(bitmap_next)
|
|
||||||
#define hwloc_bitmap_singlify HWLOC_NAME(bitmap_singlify)
|
|
||||||
#define hwloc_bitmap_compare_first HWLOC_NAME(bitmap_compare_first)
|
|
||||||
#define hwloc_bitmap_compare HWLOC_NAME(bitmap_compare)
|
|
||||||
#define hwloc_bitmap_weight HWLOC_NAME(bitmap_weight)
|
|
||||||
|
|
||||||
/* hwloc/cpuset.h -- deprecated but still available */
|
|
||||||
|
|
||||||
#define hwloc_cpuset HWLOC_NAME(cpuset)
|
|
||||||
#define hwloc_cpuset_s HWLOC_NAME(cpuset_s)
|
|
||||||
#define hwloc_cpuset_t HWLOC_NAME(cpuset_t)
|
|
||||||
#define hwloc_const_cpuset_t HWLOC_NAME(const_cpuset_t)
|
|
||||||
|
|
||||||
#define hwloc_cpuset_alloc HWLOC_NAME(cpuset_alloc)
|
|
||||||
#define hwloc_cpuset_free HWLOC_NAME(cpuset_free)
|
|
||||||
#define hwloc_cpuset_dup HWLOC_NAME(cpuset_dup)
|
|
||||||
#define hwloc_cpuset_copy HWLOC_NAME(cpuset_copy)
|
|
||||||
#define hwloc_cpuset_snprintf HWLOC_NAME(cpuset_snprintf)
|
|
||||||
#define hwloc_cpuset_asprintf HWLOC_NAME(cpuset_asprintf)
|
|
||||||
#define hwloc_cpuset_from_string HWLOC_NAME(cpuset_from_string)
|
|
||||||
#define hwloc_cpuset_zero HWLOC_NAME(cpuset_zero)
|
|
||||||
#define hwloc_cpuset_fill HWLOC_NAME(cpuset_fill)
|
|
||||||
#define hwloc_cpuset_from_ulong HWLOC_NAME(cpuset_from_ulong)
|
|
||||||
|
|
||||||
#define hwloc_cpuset_from_ith_ulong HWLOC_NAME(cpuset_from_ith_ulong)
|
|
||||||
#define hwloc_cpuset_to_ulong HWLOC_NAME(cpuset_to_ulong)
|
|
||||||
#define hwloc_cpuset_to_ith_ulong HWLOC_NAME(cpuset_to_ith_ulong)
|
|
||||||
#define hwloc_cpuset_cpu HWLOC_NAME(cpuset_cpu)
|
|
||||||
#define hwloc_cpuset_all_but_cpu HWLOC_NAME(cpuset_all_but_cpu)
|
|
||||||
#define hwloc_cpuset_set HWLOC_NAME(cpuset_set)
|
|
||||||
#define hwloc_cpuset_set_range HWLOC_NAME(cpuset_set_range)
|
|
||||||
#define hwloc_cpuset_set_ith_ulong HWLOC_NAME(cpuset_set_ith_ulong)
|
|
||||||
#define hwloc_cpuset_clr HWLOC_NAME(cpuset_clr)
|
|
||||||
#define hwloc_cpuset_clr_range HWLOC_NAME(cpuset_clr_range)
|
|
||||||
#define hwloc_cpuset_isset HWLOC_NAME(cpuset_isset)
|
|
||||||
#define hwloc_cpuset_iszero HWLOC_NAME(cpuset_iszero)
|
|
||||||
#define hwloc_cpuset_isfull HWLOC_NAME(cpuset_isfull)
|
|
||||||
#define hwloc_cpuset_isequal HWLOC_NAME(cpuset_isequal)
|
|
||||||
#define hwloc_cpuset_intersects HWLOC_NAME(cpuset_intersects)
|
|
||||||
#define hwloc_cpuset_isincluded HWLOC_NAME(cpuset_isincluded)
|
|
||||||
#define hwloc_cpuset_or HWLOC_NAME(cpuset_or)
|
|
||||||
#define hwloc_cpuset_and HWLOC_NAME(cpuset_and)
|
|
||||||
#define hwloc_cpuset_andnot HWLOC_NAME(cpuset_andnot)
|
|
||||||
#define hwloc_cpuset_xor HWLOC_NAME(cpuset_xor)
|
|
||||||
#define hwloc_cpuset_not HWLOC_NAME(cpuset_not)
|
|
||||||
#define hwloc_cpuset_first HWLOC_NAME(cpuset_first)
|
|
||||||
#define hwloc_cpuset_last HWLOC_NAME(cpuset_last)
|
|
||||||
#define hwloc_cpuset_next HWLOC_NAME(cpuset_next)
|
|
||||||
#define hwloc_cpuset_singlify HWLOC_NAME(cpuset_singlify)
|
|
||||||
#define hwloc_cpuset_compare_first HWLOC_NAME(cpuset_compare_first)
|
|
||||||
#define hwloc_cpuset_compare HWLOC_NAME(cpuset_compare)
|
|
||||||
#define hwloc_cpuset_weight HWLOC_NAME(cpuset_weight)
|
|
||||||
|
|
||||||
/* hwloc/helper.h */
|
|
||||||
|
|
||||||
#define hwloc_get_type_or_below_depth HWLOC_NAME(get_type_or_below_depth)
|
|
||||||
#define hwloc_get_type_or_above_depth HWLOC_NAME(get_type_or_above_depth)
|
|
||||||
#define hwloc_get_root_obj HWLOC_NAME(get_root_obj)
|
|
||||||
#define hwloc_get_system_obj HWLOC_NAME(get_system_obj)
|
|
||||||
#define hwloc_get_ancestor_obj_by_depth HWLOC_NAME(get_ancestor_obj_by_depth)
|
|
||||||
#define hwloc_get_ancestor_obj_by_type HWLOC_NAME(get_ancestor_obj_by_type)
|
|
||||||
#define hwloc_get_next_obj_by_depth HWLOC_NAME(get_next_obj_by_depth)
|
|
||||||
#define hwloc_get_next_obj_by_type HWLOC_NAME(get_next_obj_by_type)
|
|
||||||
#define hwloc_get_pu_obj_by_os_index HWLOC_NAME(get_pu_obj_by_os_index)
|
|
||||||
#define hwloc_get_next_child HWLOC_NAME(get_next_child)
|
|
||||||
#define hwloc_get_common_ancestor_obj HWLOC_NAME(get_common_ancestor_obj)
|
|
||||||
#define hwloc_obj_is_in_subtree HWLOC_NAME(obj_is_in_subtree)
|
|
||||||
#define hwloc_get_first_largest_obj_inside_cpuset HWLOC_NAME(get_first_largest_obj_inside_cpuset)
|
|
||||||
#define hwloc_get_largest_objs_inside_cpuset HWLOC_NAME(get_largest_objs_inside_cpuset)
|
|
||||||
#define hwloc_get_next_obj_inside_cpuset_by_depth HWLOC_NAME(get_next_obj_inside_cpuset_by_depth)
|
|
||||||
#define hwloc_get_next_obj_inside_cpuset_by_type HWLOC_NAME(get_next_obj_inside_cpuset_by_type)
|
|
||||||
#define hwloc_get_obj_inside_cpuset_by_depth HWLOC_NAME(get_obj_inside_cpuset_by_depth)
|
|
||||||
#define hwloc_get_obj_inside_cpuset_by_type HWLOC_NAME(get_obj_inside_cpuset_by_type)
|
|
||||||
#define hwloc_get_nbobjs_inside_cpuset_by_depth HWLOC_NAME(get_nbobjs_inside_cpuset_by_depth)
|
|
||||||
#define hwloc_get_nbobjs_inside_cpuset_by_type HWLOC_NAME(get_nbobjs_inside_cpuset_by_type)
|
|
||||||
#define hwloc_get_child_covering_cpuset HWLOC_NAME(get_child_covering_cpuset)
|
|
||||||
#define hwloc_get_obj_covering_cpuset HWLOC_NAME(get_obj_covering_cpuset)
|
|
||||||
#define hwloc_get_next_obj_covering_cpuset_by_depth HWLOC_NAME(get_next_obj_covering_cpuset_by_depth)
|
|
||||||
#define hwloc_get_next_obj_covering_cpuset_by_type HWLOC_NAME(get_next_obj_covering_cpuset_by_type)
|
|
||||||
#define hwloc_get_cache_covering_cpuset HWLOC_NAME(get_cache_covering_cpuset)
|
|
||||||
#define hwloc_get_shared_cache_covering_obj HWLOC_NAME(get_shared_cache_covering_obj)
|
|
||||||
#define hwloc_get_closest_objs HWLOC_NAME(get_closest_objs)
|
|
||||||
#define hwloc_get_obj_below_by_type HWLOC_NAME(get_obj_below_by_type)
|
|
||||||
#define hwloc_get_obj_below_array_by_type HWLOC_NAME(get_obj_below_array_by_type)
|
|
||||||
#define hwloc_distributev HWLOC_NAME(distributev)
|
|
||||||
#define hwloc_distribute HWLOC_NAME(distribute)
|
|
||||||
#define hwloc_alloc_membind_policy HWLOC_NAME(alloc_membind_policy)
|
|
||||||
#define hwloc_alloc_membind_policy_nodeset HWLOC_NAME(alloc_membind_policy_nodeset)
|
|
||||||
#define hwloc_topology_get_complete_cpuset HWLOC_NAME(topology_get_complete_cpuset)
|
|
||||||
#define hwloc_topology_get_topology_cpuset HWLOC_NAME(topology_get_topology_cpuset)
|
|
||||||
#define hwloc_topology_get_online_cpuset HWLOC_NAME(topology_get_online_cpuset)
|
|
||||||
#define hwloc_topology_get_allowed_cpuset HWLOC_NAME(topology_get_allowed_cpuset)
|
|
||||||
#define hwloc_topology_get_complete_nodeset HWLOC_NAME(topology_get_complete_nodeset)
|
|
||||||
#define hwloc_topology_get_topology_nodeset HWLOC_NAME(topology_get_topology_nodeset)
|
|
||||||
#define hwloc_topology_get_allowed_nodeset HWLOC_NAME(topology_get_allowed_nodeset)
|
|
||||||
#define hwloc_cpuset_to_nodeset HWLOC_NAME(cpuset_to_nodeset)
|
|
||||||
#define hwloc_cpuset_to_nodeset_strict HWLOC_NAME(cpuset_to_nodeset_strict)
|
|
||||||
#define hwloc_cpuset_from_nodeset HWLOC_NAME(cpuset_from_nodeset)
|
|
||||||
#define hwloc_cpuset_from_nodeset_strict HWLOC_NAME(cpuset_from_nodeset_strict)
|
|
||||||
#define hwloc_get_whole_distance_matrix_by_depth HWLOC_NAME(get_whole_distance_matrix_by_depth)
|
|
||||||
#define hwloc_get_whole_distance_matrix_by_type HWLOC_NAME(get_whole_distance_matrix_by_type)
|
|
||||||
#define hwloc_get_distance_matrix_covering_obj_by_depth HWLOC_NAME(get_distance_matrix_covering_obj_by_depth)
|
|
||||||
#define hwloc_get_latency HWLOC_NAME(get_latency)
|
|
||||||
|
|
||||||
/* glibc-sched.h */
|
|
||||||
|
|
||||||
#define hwloc_cpuset_to_glibc_sched_affinity HWLOC_NAME(cpuset_to_glibc_sched_affinity)
|
|
||||||
#define hwloc_cpuset_from_glibc_sched_affinity HWLOC_NAME(cpuset_from_glibc_sched_affinity)
|
|
||||||
|
|
||||||
/* linux-libnuma.h */
|
|
||||||
|
|
||||||
#define hwloc_cpuset_to_linux_libnuma_ulongs HWLOC_NAME(cpuset_to_linux_libnuma_ulongs)
|
|
||||||
#define hwloc_nodeset_to_linux_libnuma_ulongs HWLOC_NAME(nodeset_to_linux_libnuma_ulongs)
|
|
||||||
#define hwloc_cpuset_from_linux_libnuma_ulongs HWLOC_NAME(cpuset_from_linux_libnuma_ulongs)
|
|
||||||
#define hwloc_nodeset_from_linux_libnuma_ulongs HWLOC_NAME(nodeset_from_linux_libnuma_ulongs)
|
|
||||||
#define hwloc_cpuset_to_linux_libnuma_bitmask HWLOC_NAME(cpuset_to_linux_libnuma_bitmask)
|
|
||||||
#define hwloc_nodeset_to_linux_libnuma_bitmask HWLOC_NAME(nodeset_to_linux_libnuma_bitmask)
|
|
||||||
#define hwloc_cpuset_from_linux_libnuma_bitmask HWLOC_NAME(cpuset_from_linux_libnuma_bitmask)
|
|
||||||
#define hwloc_nodeset_from_linux_libnuma_bitmask HWLOC_NAME(nodeset_from_linux_libnuma_bitmask)
|
|
||||||
#define hwloc_cpuset_to_linux_libnuma_nodemask HWLOC_NAME(cpuset_to_linux_libnuma_nodemask)
|
|
||||||
#define hwloc_nodeset_to_linux_libnuma_nodemask HWLOC_NAME(nodeset_to_linux_libnuma_nodemask)
|
|
||||||
#define hwloc_cpuset_from_linux_libnuma_nodemask HWLOC_NAME(cpuset_from_linux_libnuma_nodemask)
|
|
||||||
#define hwloc_nodeset_from_linux_libnuma_nodemask HWLOC_NAME(nodeset_from_linux_libnuma_nodemask)
|
|
||||||
|
|
||||||
/* linux.h */
|
|
||||||
|
|
||||||
#define hwloc_linux_parse_cpumap_file HWLOC_NAME(linux_parse_cpumap_file)
|
|
||||||
#define hwloc_linux_set_tid_cpubind HWLOC_NAME(linux_set_tid_cpubind)
|
|
||||||
#define hwloc_linux_get_tid_cpubind HWLOC_NAME(linux_get_tid_cpubind)
|
|
||||||
|
|
||||||
/* openfabrics-verbs.h */
|
|
||||||
|
|
||||||
#define hwloc_ibv_get_device_cpuset HWLOC_NAME(ibv_get_device_cpuset)
|
|
||||||
|
|
||||||
/* myriexpress.h */
|
|
||||||
|
|
||||||
#define hwloc_mx_board_get_device_cpuset HWLOC_NAME(mx_board_get_device_cpuset)
|
|
||||||
#define hwloc_mx_endpoint_get_device_cpuset HWLOC_NAME(mx_endpoint_get_device_cpuset)
|
|
||||||
|
|
||||||
/* cuda.h */
|
|
||||||
|
|
||||||
#define hwloc_cuda_get_device_cpuset HWLOC_NAME(cuda_get_device_cpuset)
|
|
||||||
|
|
||||||
/* cudart.h */
|
|
||||||
|
|
||||||
#define hwloc_cudart_get_device_cpuset HWLOC_NAME(cudart_get_device_cpuset)
|
|
||||||
|
|
||||||
/* private/debug.h */
|
|
||||||
|
|
||||||
#define hwloc_debug HWLOC_NAME(debug)
|
|
||||||
|
|
||||||
/* private/misc.h */
|
|
||||||
|
|
||||||
#define hwloc_snprintf HWLOC_NAME(snprintf)
|
|
||||||
#define hwloc_namecoloncmp HWLOC_NAME(namecoloncmp)
|
|
||||||
/* FIXME: hwloc_ffsl may be a macro, but it may not be defined yet */
|
|
||||||
#define hwloc_ffs32 HWLOC_NAME(ffs32)
|
|
||||||
/* FIXME: hwloc_flsl may be a macro, but it may not be defined yet */
|
|
||||||
#define hwloc_fls32 HWLOC_NAME(fls32)
|
|
||||||
#define hwloc_weight_long HWLOC_NAME(weight_long)
|
|
||||||
|
|
||||||
/* private/cpuid.h */
|
|
||||||
|
|
||||||
#define hwloc_have_cpuid HWLOC_NAME(have_cpuid)
|
|
||||||
#define hwloc_cpuid HWLOC_NAME(cpuid)
|
|
||||||
|
|
||||||
/* private/private.h */
|
|
||||||
|
|
||||||
#define hwloc_ignore_type_e HWLOC_NAME(ignore_type_e)
|
|
||||||
|
|
||||||
#define HWLOC_IGNORE_TYPE_NEVER HWLOC_NAME_CAPS(IGNORE_TYPE_NEVER)
|
|
||||||
#define HWLOC_IGNORE_TYPE_KEEP_STRUCTURE HWLOC_NAME_CAPS(IGNORE_TYPE_KEEP_STRUCTURE)
|
|
||||||
#define HWLOC_IGNORE_TYPE_ALWAYS HWLOC_NAME_CAPS(IGNORE_TYPE_ALWAYS)
|
|
||||||
|
|
||||||
#define hwloc_os_distances_s HWLOC_NAME(os_distances_s)
|
|
||||||
#define hwloc_backend_e HWLOC_NAME(backend_e)
|
|
||||||
#define hwloc_backend_t HWLOC_NAME(backend_t)
|
|
||||||
|
|
||||||
#define HWLOC_BACKEND_NONE HWLOC_NAME_CAPS(BACKEND_NONE)
|
|
||||||
#define HWLOC_BACKEND_SYNTHETIC HWLOC_NAME_CAPS(BACKEND_SYNTHETIC)
|
|
||||||
#define HWLOC_BACKEND_SYSFS HWLOC_NAME_CAPS(BACKEND_SYSFS)
|
|
||||||
#define HWLOC_BACKEND_XML HWLOC_NAME_CAPS(BACKEND_XML)
|
|
||||||
#define HWLOC_BACKEND_MAX HWLOC_NAME_CAPS(BACKEND_MAX)
|
|
||||||
|
|
||||||
#define hwloc_backend_params_u HWLOC_NAME(backend_params_u)
|
|
||||||
#define hwloc_backend_params_sysfs_s HWLOC_NAME(backend_params_sysfs_s)
|
|
||||||
#define hwloc_backend_params_osf HWLOC_NAME(backend_params_osf)
|
|
||||||
#define hwloc_backend_params_xml_s HWLOC_NAME(backend_params_xml_s)
|
|
||||||
#define hwloc_backend_params_synthetic_s HWLOC_NAME(backend_params_synthetic_s)
|
|
||||||
|
|
||||||
#define hwloc_setup_pu_level HWLOC_NAME(setup_pu_level)
|
|
||||||
#define hwloc_setup_misc_level_from_distances HWLOC_NAME(setup_misc_level_from_distances)
|
|
||||||
#define hwloc_get_sysctlbyname HWLOC_NAME(get_sysctlbyname)
|
|
||||||
#define hwloc_get_sysctl HWLOC_NAME(get_sysctl)
|
|
||||||
#define hwloc_fallback_nbprocessors HWLOC_NAME(fallback_nbprocessors)
|
|
||||||
|
|
||||||
#define hwloc_look_linux HWLOC_NAME(look_linux)
|
|
||||||
#define hwloc_set_linux_hooks HWLOC_NAME(set_linux_hooks)
|
|
||||||
#define hwloc_backend_sysfs_init HWLOC_NAME(backend_sysfs_init)
|
|
||||||
#define hwloc_backend_sysfs_exit HWLOC_NAME(backend_sysfs_exit)
|
|
||||||
|
|
||||||
#define hwloc_backend_xml_init HWLOC_NAME(backend_xml_init)
|
|
||||||
#define hwloc_xml_check_distances HWLOC_NAME(xml_check_distances)
|
|
||||||
#define hwloc_look_xml HWLOC_NAME(look_xml)
|
|
||||||
#define hwloc_backend_xml_exit HWLOC_NAME(backend_xml_exit)
|
|
||||||
|
|
||||||
#define hwloc_look_solaris HWLOC_NAME(look_solaris)
|
|
||||||
#define hwloc_set_solaris_hooks HWLOC_NAME(set_solaris_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_aix HWLOC_NAME(look_aix)
|
|
||||||
#define hwloc_set_aix_hooks HWLOC_NAME(set_aix_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_osf HWLOC_NAME(look_osf)
|
|
||||||
#define hwloc_set_osf_hooks HWLOC_NAME(set_osf_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_windows HWLOC_NAME(look_windows)
|
|
||||||
#define hwloc_set_windows_hooks HWLOC_NAME(set_windows_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_darwin HWLOC_NAME(look_darwin)
|
|
||||||
#define hwloc_set_darwin_hooks HWLOC_NAME(set_darwin_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_freebsd HWLOC_NAME(look_freebsd)
|
|
||||||
#define hwloc_set_freebsd_hooks HWLOC_NAME(set_freebsd_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_hpux HWLOC_NAME(look_hpux)
|
|
||||||
#define hwloc_set_hpux_hooks HWLOC_NAME(set_hpux_hooks)
|
|
||||||
|
|
||||||
#define hwloc_look_x86 HWLOC_NAME(look_x86)
|
|
||||||
|
|
||||||
#define hwloc_backend_synthetic_init HWLOC_NAME(backend_synthetic_init)
|
|
||||||
#define hwloc_backend_synthetic_exit HWLOC_NAME(backend_synthetic_exit)
|
|
||||||
#define hwloc_look_synthetic HWLOC_NAME(look_synthetic )
|
|
||||||
|
|
||||||
#define hwloc_insert_object_by_cpuset HWLOC_NAME(insert_object_by_cpuset)
|
|
||||||
#define hwloc_report_error_t HWLOC_NAME(report_error_t)
|
|
||||||
#define hwloc_report_os_error HWLOC_NAME(report_os_error)
|
|
||||||
#define hwloc__insert_object_by_cpuset HWLOC_NAME(_insert_object_by_cpuset)
|
|
||||||
#define hwloc_insert_object_by_parent HWLOC_NAME(insert_object_by_parent)
|
|
||||||
#define hwloc_add_object_info HWLOC_NAME(add_object_info)
|
|
||||||
#define hwloc_add_uname_info HWLOC_NAME(add_uname_info)
|
|
||||||
#define hwloc_free_object HWLOC_NAME(free_object)
|
|
||||||
#define hwloc_bitmap_printf_value HWLOC_NAME(bitmap_printf_value)
|
|
||||||
#define hwloc_alloc_setup_object HWLOC_NAME(alloc_setup_object)
|
|
||||||
#define hwloc_free_unlinked_object HWLOC_NAME(free_unlinked_object)
|
|
||||||
#define hwloc_setup_level HWLOC_NAME(setup_level)
|
|
||||||
|
|
||||||
#define hwloc_alloc_heap HWLOC_NAME(alloc_heap)
|
|
||||||
#define hwloc_alloc_mmap HWLOC_NAME(alloc_mmap)
|
|
||||||
#define hwloc_free_heap HWLOC_NAME(free_heap)
|
|
||||||
#define hwloc_free_mmap HWLOC_NAME(free_mmap)
|
|
||||||
#define hwloc_alloc_or_fail HWLOC_NAME(alloc_or_fail)
|
|
||||||
|
|
||||||
#define hwloc_topology_distances_init HWLOC_NAME(topology_distances_init)
|
|
||||||
#define hwloc_topology_distances_clear HWLOC_NAME(topology_distances_clear)
|
|
||||||
#define hwloc_topology_distances_destroy HWLOC_NAME(topology_distances_destroy)
|
|
||||||
#define hwloc_topology__set_distance_matrix HWLOC_NAME(topology__set_distance_matrix)
|
|
||||||
#define hwloc_store_distances_from_env HWLOC_NAME(store_distances_from_env)
|
|
||||||
#define hwloc_convert_distances_indexes_into_objects HWLOC_NAME(convert_distances_indexes_into_objects)
|
|
||||||
#define hwloc_finalize_logical_distances HWLOC_NAME(finalize_logical_distances)
|
|
||||||
#define hwloc_restrict_distances HWLOC_NAME(restrict_distances)
|
|
||||||
#define hwloc_free_logical_distances HWLOC_NAME(free_logical_distances)
|
|
||||||
#define hwloc_group_by_distances HWLOC_NAME(group_by_distances)
|
|
||||||
|
|
||||||
#endif /* HWLOC_SYM_TRANSFORM */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
} /* extern "C" */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_RENAME_H */
|
|
|
@ -1,589 +0,0 @@
|
||||||
/* hwloc-1.2.1/include/private/autogen/config.h. Generated from config.h.in by configure. */
|
|
||||||
/* include/private/autogen/config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* -*- c -*-
|
|
||||||
*
|
|
||||||
* Copyright © 2009 CNRS, INRIA., Université Bordeaux 1 All rights reserved.
|
|
||||||
* Copyright © 2009 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
|
||||||
*
|
|
||||||
* Additional copyrights may follow
|
|
||||||
*
|
|
||||||
* $HEADER$
|
|
||||||
*
|
|
||||||
* This file is automatically generated by configure. Edits will be lost
|
|
||||||
* the next time you run configure!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_CONFIGURE_H
|
|
||||||
#define HWLOC_CONFIGURE_H
|
|
||||||
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `CACHE_DESCRIPTOR'. */
|
|
||||||
/* #undef HAVE_CACHE_DESCRIPTOR */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `CACHE_RELATIONSHIP'. */
|
|
||||||
/* #undef HAVE_CACHE_RELATIONSHIP */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clz' function. */
|
|
||||||
/* #undef HAVE_CLZ */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clzl' function. */
|
|
||||||
/* #undef HAVE_CLZL */
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lcuda */
|
|
||||||
/* #undef HAVE_CUDA */
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lcudart */
|
|
||||||
/* #undef HAVE_CUDART */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <cuda.h> header file. */
|
|
||||||
/* #undef HAVE_CUDA_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <cuda_runtime_api.h> header file. */
|
|
||||||
/* #undef HAVE_CUDA_RUNTIME_API_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `CTL_HW', and to 0 if you don't.
|
|
||||||
*/
|
|
||||||
#define HAVE_DECL_CTL_HW 0
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `HW_NCPU', and to 0 if you
|
|
||||||
don't. */
|
|
||||||
#define HAVE_DECL_HW_NCPU 0
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `pthread_getaffinity_np', and to
|
|
||||||
0 if you don't. */
|
|
||||||
#define HAVE_DECL_PTHREAD_GETAFFINITY_NP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `pthread_setaffinity_np', and to
|
|
||||||
0 if you don't. */
|
|
||||||
#define HAVE_DECL_PTHREAD_SETAFFINITY_NP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_LARGE_PAGESIZE', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#define HAVE_DECL__SC_LARGE_PAGESIZE 0
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROCESSORS_CONF', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#define HAVE_DECL__SC_NPROCESSORS_CONF 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROCESSORS_ONLN', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#define HAVE_DECL__SC_NPROCESSORS_ONLN 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROC_CONF', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#define HAVE_DECL__SC_NPROC_CONF 0
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROC_ONLN', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#define HAVE_DECL__SC_NPROC_ONLN 0
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#define HAVE_DLFCN_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffs' function. */
|
|
||||||
#define HAVE_FFS 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffsl' function. */
|
|
||||||
#define HAVE_FFSL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fls' function. */
|
|
||||||
/* #undef HAVE_FLS */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `flsl' function. */
|
|
||||||
/* #undef HAVE_FLSL */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getpagesize' function. */
|
|
||||||
#define HAVE_GETPAGESIZE 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `GROUP_AFFINITY'. */
|
|
||||||
/* #undef HAVE_GROUP_AFFINITY */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `GROUP_RELATIONSHIP'. */
|
|
||||||
/* #undef HAVE_GROUP_RELATIONSHIP */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `host_info' function. */
|
|
||||||
/* #undef HAVE_HOST_INFO */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <infiniband/verbs.h> header file. */
|
|
||||||
/* #undef HAVE_INFINIBAND_VERBS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `KAFFINITY'. */
|
|
||||||
/* #undef HAVE_KAFFINITY */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <kstat.h> header file. */
|
|
||||||
/* #undef HAVE_KSTAT_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <langinfo.h> header file. */
|
|
||||||
/* #undef HAVE_LANGINFO_H */
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lgdi32 */
|
|
||||||
/* #undef HAVE_LIBGDI32 */
|
|
||||||
|
|
||||||
/* Define to 1 if we have -libverbs */
|
|
||||||
/* #undef HAVE_LIBIBVERBS */
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lkstat */
|
|
||||||
/* #undef HAVE_LIBKSTAT */
|
|
||||||
|
|
||||||
/* Define to 1 if we have -llgrp */
|
|
||||||
/* #undef HAVE_LIBLGRP */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <locale.h> header file. */
|
|
||||||
/* #undef HAVE_LOCALE_H */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `LOGICAL_PROCESSOR_RELATIONSHIP'. */
|
|
||||||
/* #undef HAVE_LOGICAL_PROCESSOR_RELATIONSHIP */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <mach/mach_host.h> header file. */
|
|
||||||
/* #undef HAVE_MACH_MACH_HOST_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <mach/mach_init.h> header file. */
|
|
||||||
/* #undef HAVE_MACH_MACH_INIT_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#define HAVE_MALLOC_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memalign' function. */
|
|
||||||
#define HAVE_MEMALIGN 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <myriexpress.h> header file. */
|
|
||||||
/* #undef HAVE_MYRIEXPRESS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `nl_langinfo' function. */
|
|
||||||
/* #undef HAVE_NL_LANGINFO */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <numaif.h> header file. */
|
|
||||||
/* #undef HAVE_NUMAIF_H */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `NUMA_NODE_RELATIONSHIP'. */
|
|
||||||
/* #undef HAVE_NUMA_NODE_RELATIONSHIP */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `openat' function. */
|
|
||||||
#define HAVE_OPENAT 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `posix_memalign' function. */
|
|
||||||
#define HAVE_POSIX_MEMALIGN 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PROCESSOR_CACHE_TYPE'. */
|
|
||||||
/* #undef HAVE_PROCESSOR_CACHE_TYPE */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PROCESSOR_GROUP_INFO'. */
|
|
||||||
/* #undef HAVE_PROCESSOR_GROUP_INFO */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PROCESSOR_RELATIONSHIP'. */
|
|
||||||
/* #undef HAVE_PROCESSOR_RELATIONSHIP */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PSAPI_WORKING_SET_EX_BLOCK'. */
|
|
||||||
/* #undef HAVE_PSAPI_WORKING_SET_EX_BLOCK */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PSAPI_WORKING_SET_EX_INFORMATION'.
|
|
||||||
*/
|
|
||||||
/* #undef HAVE_PSAPI_WORKING_SET_EX_INFORMATION */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <pthread_np.h> header file. */
|
|
||||||
/* #undef HAVE_PTHREAD_NP_H */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `pthread_t'. */
|
|
||||||
#define HAVE_PTHREAD_T 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `putwc' function. */
|
|
||||||
/* #undef HAVE_PUTWC */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `RelationProcessorPackage'. */
|
|
||||||
/* #undef HAVE_RELATIONPROCESSORPACKAGE */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `setlocale' function. */
|
|
||||||
#define HAVE_SETLOCALE 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#define HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strftime' function. */
|
|
||||||
#define HAVE_STRFTIME 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#define HAVE_STRINGS_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strncasecmp' function. */
|
|
||||||
#define HAVE_STRNCASECMP 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sysctl' function. */
|
|
||||||
#define HAVE_SYSCTL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sysctlbyname' function. */
|
|
||||||
/* #undef HAVE_SYSCTLBYNAME */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type
|
|
||||||
`SYSTEM_LOGICAL_PROCESSOR_INFORMATION'. */
|
|
||||||
/* #undef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION */
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type
|
|
||||||
`SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX'. */
|
|
||||||
/* #undef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/cpuset.h> header file. */
|
|
||||||
/* #undef HAVE_SYS_CPUSET_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/lgrp_user.h> header file. */
|
|
||||||
/* #undef HAVE_SYS_LGRP_USER_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/mman.h> header file. */
|
|
||||||
#define HAVE_SYS_MMAN_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
|
||||||
#define HAVE_SYS_PARAM_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/sysctl.h> header file. */
|
|
||||||
#define HAVE_SYS_SYSCTL_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/utsname.h> header file. */
|
|
||||||
#define HAVE_SYS_UTSNAME_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `uname' function. */
|
|
||||||
#define HAVE_UNAME 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `wchar_t'. */
|
|
||||||
/* #undef HAVE_WCHAR_T */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <X11/keysym.h> header file. */
|
|
||||||
/* #undef HAVE_X11_KEYSYM_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <X11/Xlib.h> header file. */
|
|
||||||
/* #undef HAVE_X11_XLIB_H */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <X11/Xutil.h> header file. */
|
|
||||||
/* #undef HAVE_X11_XUTIL_H */
|
|
||||||
|
|
||||||
/* Define to 1 on AIX */
|
|
||||||
/* #undef HWLOC_AIX_SYS */
|
|
||||||
|
|
||||||
/* Whether C compiler supports -fvisibility */
|
|
||||||
#define HWLOC_C_HAVE_VISIBILITY 1
|
|
||||||
|
|
||||||
/* Define to 1 on Darwin */
|
|
||||||
/* #undef HWLOC_DARWIN_SYS */
|
|
||||||
|
|
||||||
/* Whether we are in debugging mode or not */
|
|
||||||
/* #undef HWLOC_DEBUG */
|
|
||||||
|
|
||||||
/* Define to 1 on *FREEBSD */
|
|
||||||
/* #undef HWLOC_FREEBSD_SYS */
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ aligned or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_ALIGNED 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ always_inline or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_ALWAYS_INLINE 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ cold or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_COLD 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ const or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_CONST 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ deprecated or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_DEPRECATED 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ format or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_FORMAT 0
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ hot or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_HOT 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ malloc or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_MALLOC 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ may_alias or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ nonnull or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_NONNULL 0
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ noreturn or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_NORETURN 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ no_instrument_function or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ packed or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_PACKED 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ pure or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_PURE 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ sentinel or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_SENTINEL 0
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ unused or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_UNUSED 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ warn unused result or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT 1
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ weak alias or not */
|
|
||||||
#define HWLOC_HAVE_ATTRIBUTE_WEAK_ALIAS 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `cairo' library. */
|
|
||||||
/* #undef HWLOC_HAVE_CAIRO */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clz' function. */
|
|
||||||
/* #undef HWLOC_HAVE_CLZ */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clzl' function. */
|
|
||||||
/* #undef HWLOC_HAVE_CLZL */
|
|
||||||
|
|
||||||
/* Define to 1 if you have cpuid */
|
|
||||||
#define HWLOC_HAVE_CPUID 1
|
|
||||||
|
|
||||||
/* Define to 1 if the CPU_SET macro works */
|
|
||||||
#define HWLOC_HAVE_CPU_SET 1
|
|
||||||
|
|
||||||
/* Define to 1 if the CPU_SET_S macro works */
|
|
||||||
#define HWLOC_HAVE_CPU_SET_S 1
|
|
||||||
|
|
||||||
/* Define to 1 if function `clz' is declared by system headers */
|
|
||||||
/* #undef HWLOC_HAVE_DECL_CLZ */
|
|
||||||
|
|
||||||
/* Define to 1 if function `clzl' is declared by system headers */
|
|
||||||
/* #undef HWLOC_HAVE_DECL_CLZL */
|
|
||||||
|
|
||||||
/* Define to 1 if function `ffs' is declared by system headers */
|
|
||||||
#define HWLOC_HAVE_DECL_FFS 1
|
|
||||||
|
|
||||||
/* Define to 1 if function `ffsl' is declared by system headers */
|
|
||||||
#define HWLOC_HAVE_DECL_FFSL 1
|
|
||||||
|
|
||||||
/* Define to 1 if function `fls' is declared by system headers */
|
|
||||||
/* #undef HWLOC_HAVE_DECL_FLS */
|
|
||||||
|
|
||||||
/* Define to 1 if function `flsl' is declared by system headers */
|
|
||||||
/* #undef HWLOC_HAVE_DECL_FLSL */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffs' function. */
|
|
||||||
#define HWLOC_HAVE_FFS 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffsl' function. */
|
|
||||||
#define HWLOC_HAVE_FFSL 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fls' function. */
|
|
||||||
/* #undef HWLOC_HAVE_FLS */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `flsl' function. */
|
|
||||||
/* #undef HWLOC_HAVE_FLSL */
|
|
||||||
|
|
||||||
/* Define to 1 if you have a library providing the termcap interface */
|
|
||||||
/* #undef HWLOC_HAVE_LIBTERMCAP */
|
|
||||||
|
|
||||||
/* Define to 1 if mbind is available. */
|
|
||||||
/* #undef HWLOC_HAVE_MBIND */
|
|
||||||
|
|
||||||
/* Define to 1 if migrate_pages is available. */
|
|
||||||
/* #undef HWLOC_HAVE_MIGRATE_PAGES */
|
|
||||||
|
|
||||||
/* Define to 1 if glibc provides the old prototype of sched_setaffinity() */
|
|
||||||
/* #undef HWLOC_HAVE_OLD_SCHED_SETAFFINITY */
|
|
||||||
|
|
||||||
/* `Define to 1 if you have pthread_getthrds_np' */
|
|
||||||
/* #undef HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
|
|
||||||
/* Define to 1 if set_mempolicy is available. */
|
|
||||||
/* #undef HWLOC_HAVE_SET_MEMPOLICY */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#define HWLOC_HAVE_STDINT_H 1
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `windows.h' header. */
|
|
||||||
/* #undef HWLOC_HAVE_WINDOWS_H */
|
|
||||||
|
|
||||||
/* Define to 1 if X11 libraries are available. */
|
|
||||||
/* #undef HWLOC_HAVE_X11 */
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `xml' library. */
|
|
||||||
/* #undef HWLOC_HAVE_XML */
|
|
||||||
|
|
||||||
/* Define to 1 if the _syscall3 macro works */
|
|
||||||
/* #undef HWLOC_HAVE__SYSCALL3 */
|
|
||||||
|
|
||||||
/* Define to 1 on HP-UX */
|
|
||||||
/* #undef HWLOC_HPUX_SYS */
|
|
||||||
|
|
||||||
/* Define to 1 on Irix */
|
|
||||||
/* #undef HWLOC_IRIX_SYS */
|
|
||||||
|
|
||||||
/* Define to 1 on Linux */
|
|
||||||
#define HWLOC_LINUX_SYS 1
|
|
||||||
|
|
||||||
/* Major version of hwloc */
|
|
||||||
/* #undef HWLOC_MAJOR_VERSION */
|
|
||||||
|
|
||||||
/* Minor version of hwloc */
|
|
||||||
/* #undef HWLOC_MINOR_VERSION */
|
|
||||||
|
|
||||||
/* Define to 1 on OSF */
|
|
||||||
/* #undef HWLOC_OSF_SYS */
|
|
||||||
|
|
||||||
/* Release version of hwloc */
|
|
||||||
/* #undef HWLOC_RELEASE_VERSION */
|
|
||||||
|
|
||||||
/* The size of `unsigned int', as computed by sizeof */
|
|
||||||
#define HWLOC_SIZEOF_UNSIGNED_INT 4
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof */
|
|
||||||
#define HWLOC_SIZEOF_UNSIGNED_LONG 4
|
|
||||||
|
|
||||||
/* Define to 1 on Solaris */
|
|
||||||
/* #undef HWLOC_SOLARIS_SYS */
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix */
|
|
||||||
#define HWLOC_SYM_PREFIX hwloc_
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix in all caps */
|
|
||||||
#define HWLOC_SYM_PREFIX_CAPS HWLOC_
|
|
||||||
|
|
||||||
/* Whether we need to re-define all the hwloc public symbols or not */
|
|
||||||
#define HWLOC_SYM_TRANSFORM 0
|
|
||||||
|
|
||||||
/* Define to 1 on unsupported systems */
|
|
||||||
/* #undef HWLOC_UNSUPPORTED_SYS */
|
|
||||||
|
|
||||||
/* Define to 1 if ncurses works, preferred over curses */
|
|
||||||
/* #undef HWLOC_USE_NCURSES */
|
|
||||||
|
|
||||||
/* Define to 1 on WINDOWS */
|
|
||||||
/* #undef HWLOC_WIN_SYS */
|
|
||||||
|
|
||||||
/* Define to 1 on x86_32 */
|
|
||||||
#define HWLOC_X86_32_ARCH 1
|
|
||||||
|
|
||||||
/* Define to 1 on x86_64 */
|
|
||||||
/* #undef HWLOC_X86_64_ARCH */
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#define LT_OBJDIR ".libs/"
|
|
||||||
|
|
||||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
|
||||||
/* #undef NO_MINUS_C_MINUS_O */
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#define PACKAGE "htop"
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#define PACKAGE_BUGREPORT "loderunner@users.sourceforge.net"
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#define PACKAGE_NAME "htop"
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#define PACKAGE_STRING "htop 0.9.1"
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#define PACKAGE_TARNAME "htop"
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#define PACKAGE_URL ""
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#define PACKAGE_VERSION "0.9.1"
|
|
||||||
|
|
||||||
/* The size of `unsigned int', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_INT 4
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof. */
|
|
||||||
#define SIZEOF_UNSIGNED_LONG 4
|
|
||||||
|
|
||||||
/* The size of `void *', as computed by sizeof. */
|
|
||||||
#define SIZEOF_VOID_P 4
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
|
|
||||||
/* Enable extensions on HP-UX. */
|
|
||||||
#ifndef _HPUX_SOURCE
|
|
||||||
# define _HPUX_SOURCE 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
|
||||||
#ifndef _ALL_SOURCE
|
|
||||||
# define _ALL_SOURCE 1
|
|
||||||
#endif
|
|
||||||
/* Enable GNU extensions on systems that have them. */
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
# define _GNU_SOURCE 1
|
|
||||||
#endif
|
|
||||||
/* Enable threading extensions on Solaris. */
|
|
||||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
# define _POSIX_PTHREAD_SEMANTICS 1
|
|
||||||
#endif
|
|
||||||
/* Enable extensions on HP NonStop. */
|
|
||||||
#ifndef _TANDEM_SOURCE
|
|
||||||
# define _TANDEM_SOURCE 1
|
|
||||||
#endif
|
|
||||||
/* Enable general extensions on Solaris. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# define __EXTENSIONS__ 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#define VERSION "0.9.1"
|
|
||||||
|
|
||||||
/* Define to 1 if the X Window System is missing or not being used. */
|
|
||||||
/* #undef X_DISPLAY_MISSING */
|
|
||||||
|
|
||||||
/* Are we building for HP-UX? */
|
|
||||||
#define _HPUX_SOURCE 1
|
|
||||||
|
|
||||||
/* Define to 1 if on MINIX. */
|
|
||||||
/* #undef _MINIX */
|
|
||||||
|
|
||||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
|
||||||
this defined. */
|
|
||||||
/* #undef _POSIX_1_SOURCE */
|
|
||||||
|
|
||||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
|
||||||
/* #undef _POSIX_SOURCE */
|
|
||||||
|
|
||||||
/* Define this to a keyword that can safely replace inline in installed
|
|
||||||
headers */
|
|
||||||
#define __hwloc_inline __inline__
|
|
||||||
|
|
||||||
/* Define this to the process ID type */
|
|
||||||
#define hwloc_pid_t pid_t
|
|
||||||
|
|
||||||
/* Define this to either strncasecmp or strncmp */
|
|
||||||
#define hwloc_strncasecmp strncasecmp
|
|
||||||
|
|
||||||
/* Define this to the thread ID type */
|
|
||||||
#define hwloc_thread_t pthread_t
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_CONFIGURE_H */
|
|
||||||
|
|
|
@ -1,588 +0,0 @@
|
||||||
/* include/private/autogen/config.h.in. Generated from configure.ac by autoheader. */
|
|
||||||
|
|
||||||
/* -*- c -*-
|
|
||||||
*
|
|
||||||
* Copyright © 2009 CNRS, INRIA., Université Bordeaux 1 All rights reserved.
|
|
||||||
* Copyright © 2009 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* $COPYRIGHT$
|
|
||||||
*
|
|
||||||
* Additional copyrights may follow
|
|
||||||
*
|
|
||||||
* $HEADER$
|
|
||||||
*
|
|
||||||
* This file is automatically generated by configure. Edits will be lost
|
|
||||||
* the next time you run configure!
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef HWLOC_CONFIGURE_H
|
|
||||||
#define HWLOC_CONFIGURE_H
|
|
||||||
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `CACHE_DESCRIPTOR'. */
|
|
||||||
#undef HAVE_CACHE_DESCRIPTOR
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `CACHE_RELATIONSHIP'. */
|
|
||||||
#undef HAVE_CACHE_RELATIONSHIP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clz' function. */
|
|
||||||
#undef HAVE_CLZ
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clzl' function. */
|
|
||||||
#undef HAVE_CLZL
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lcuda */
|
|
||||||
#undef HAVE_CUDA
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lcudart */
|
|
||||||
#undef HAVE_CUDART
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <cuda.h> header file. */
|
|
||||||
#undef HAVE_CUDA_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <cuda_runtime_api.h> header file. */
|
|
||||||
#undef HAVE_CUDA_RUNTIME_API_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `CTL_HW', and to 0 if you don't.
|
|
||||||
*/
|
|
||||||
#undef HAVE_DECL_CTL_HW
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `HW_NCPU', and to 0 if you
|
|
||||||
don't. */
|
|
||||||
#undef HAVE_DECL_HW_NCPU
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `pthread_getaffinity_np', and to
|
|
||||||
0 if you don't. */
|
|
||||||
#undef HAVE_DECL_PTHREAD_GETAFFINITY_NP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `pthread_setaffinity_np', and to
|
|
||||||
0 if you don't. */
|
|
||||||
#undef HAVE_DECL_PTHREAD_SETAFFINITY_NP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_LARGE_PAGESIZE', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#undef HAVE_DECL__SC_LARGE_PAGESIZE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROCESSORS_CONF', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#undef HAVE_DECL__SC_NPROCESSORS_CONF
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROCESSORS_ONLN', and to 0
|
|
||||||
if you don't. */
|
|
||||||
#undef HAVE_DECL__SC_NPROCESSORS_ONLN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROC_CONF', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#undef HAVE_DECL__SC_NPROC_CONF
|
|
||||||
|
|
||||||
/* Define to 1 if you have the declaration of `_SC_NPROC_ONLN', and to 0 if
|
|
||||||
you don't. */
|
|
||||||
#undef HAVE_DECL__SC_NPROC_ONLN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
|
||||||
#undef HAVE_DLFCN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffs' function. */
|
|
||||||
#undef HAVE_FFS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffsl' function. */
|
|
||||||
#undef HAVE_FFSL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fls' function. */
|
|
||||||
#undef HAVE_FLS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `flsl' function. */
|
|
||||||
#undef HAVE_FLSL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `getpagesize' function. */
|
|
||||||
#undef HAVE_GETPAGESIZE
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `GROUP_AFFINITY'. */
|
|
||||||
#undef HAVE_GROUP_AFFINITY
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `GROUP_RELATIONSHIP'. */
|
|
||||||
#undef HAVE_GROUP_RELATIONSHIP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `host_info' function. */
|
|
||||||
#undef HAVE_HOST_INFO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <infiniband/verbs.h> header file. */
|
|
||||||
#undef HAVE_INFINIBAND_VERBS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
|
||||||
#undef HAVE_INTTYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `KAFFINITY'. */
|
|
||||||
#undef HAVE_KAFFINITY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <kstat.h> header file. */
|
|
||||||
#undef HAVE_KSTAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <langinfo.h> header file. */
|
|
||||||
#undef HAVE_LANGINFO_H
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lgdi32 */
|
|
||||||
#undef HAVE_LIBGDI32
|
|
||||||
|
|
||||||
/* Define to 1 if we have -libverbs */
|
|
||||||
#undef HAVE_LIBIBVERBS
|
|
||||||
|
|
||||||
/* Define to 1 if we have -lkstat */
|
|
||||||
#undef HAVE_LIBKSTAT
|
|
||||||
|
|
||||||
/* Define to 1 if we have -llgrp */
|
|
||||||
#undef HAVE_LIBLGRP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <locale.h> header file. */
|
|
||||||
#undef HAVE_LOCALE_H
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `LOGICAL_PROCESSOR_RELATIONSHIP'. */
|
|
||||||
#undef HAVE_LOGICAL_PROCESSOR_RELATIONSHIP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <mach/mach_host.h> header file. */
|
|
||||||
#undef HAVE_MACH_MACH_HOST_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <mach/mach_init.h> header file. */
|
|
||||||
#undef HAVE_MACH_MACH_INIT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <malloc.h> header file. */
|
|
||||||
#undef HAVE_MALLOC_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `memalign' function. */
|
|
||||||
#undef HAVE_MEMALIGN
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <memory.h> header file. */
|
|
||||||
#undef HAVE_MEMORY_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <myriexpress.h> header file. */
|
|
||||||
#undef HAVE_MYRIEXPRESS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `nl_langinfo' function. */
|
|
||||||
#undef HAVE_NL_LANGINFO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <numaif.h> header file. */
|
|
||||||
#undef HAVE_NUMAIF_H
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `NUMA_NODE_RELATIONSHIP'. */
|
|
||||||
#undef HAVE_NUMA_NODE_RELATIONSHIP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `openat' function. */
|
|
||||||
#undef HAVE_OPENAT
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `posix_memalign' function. */
|
|
||||||
#undef HAVE_POSIX_MEMALIGN
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PROCESSOR_CACHE_TYPE'. */
|
|
||||||
#undef HAVE_PROCESSOR_CACHE_TYPE
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PROCESSOR_GROUP_INFO'. */
|
|
||||||
#undef HAVE_PROCESSOR_GROUP_INFO
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PROCESSOR_RELATIONSHIP'. */
|
|
||||||
#undef HAVE_PROCESSOR_RELATIONSHIP
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PSAPI_WORKING_SET_EX_BLOCK'. */
|
|
||||||
#undef HAVE_PSAPI_WORKING_SET_EX_BLOCK
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `PSAPI_WORKING_SET_EX_INFORMATION'.
|
|
||||||
*/
|
|
||||||
#undef HAVE_PSAPI_WORKING_SET_EX_INFORMATION
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <pthread_np.h> header file. */
|
|
||||||
#undef HAVE_PTHREAD_NP_H
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `pthread_t'. */
|
|
||||||
#undef HAVE_PTHREAD_T
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `putwc' function. */
|
|
||||||
#undef HAVE_PUTWC
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `RelationProcessorPackage'. */
|
|
||||||
#undef HAVE_RELATIONPROCESSORPACKAGE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `setlocale' function. */
|
|
||||||
#undef HAVE_SETLOCALE
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
|
||||||
#undef HAVE_STDLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strftime' function. */
|
|
||||||
#undef HAVE_STRFTIME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <strings.h> header file. */
|
|
||||||
#undef HAVE_STRINGS_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <string.h> header file. */
|
|
||||||
#undef HAVE_STRING_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `strncasecmp' function. */
|
|
||||||
#undef HAVE_STRNCASECMP
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sysctl' function. */
|
|
||||||
#undef HAVE_SYSCTL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `sysctlbyname' function. */
|
|
||||||
#undef HAVE_SYSCTLBYNAME
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type
|
|
||||||
`SYSTEM_LOGICAL_PROCESSOR_INFORMATION'. */
|
|
||||||
#undef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type
|
|
||||||
`SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX'. */
|
|
||||||
#undef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/cpuset.h> header file. */
|
|
||||||
#undef HAVE_SYS_CPUSET_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/lgrp_user.h> header file. */
|
|
||||||
#undef HAVE_SYS_LGRP_USER_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/mman.h> header file. */
|
|
||||||
#undef HAVE_SYS_MMAN_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
|
||||||
#undef HAVE_SYS_PARAM_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
|
||||||
#undef HAVE_SYS_STAT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/sysctl.h> header file. */
|
|
||||||
#undef HAVE_SYS_SYSCTL_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
|
||||||
#undef HAVE_SYS_TYPES_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <sys/utsname.h> header file. */
|
|
||||||
#undef HAVE_SYS_UTSNAME_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `uname' function. */
|
|
||||||
#undef HAVE_UNAME
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <unistd.h> header file. */
|
|
||||||
#undef HAVE_UNISTD_H
|
|
||||||
|
|
||||||
/* Define to 1 if the system has the type `wchar_t'. */
|
|
||||||
#undef HAVE_WCHAR_T
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <X11/keysym.h> header file. */
|
|
||||||
#undef HAVE_X11_KEYSYM_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <X11/Xlib.h> header file. */
|
|
||||||
#undef HAVE_X11_XLIB_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <X11/Xutil.h> header file. */
|
|
||||||
#undef HAVE_X11_XUTIL_H
|
|
||||||
|
|
||||||
/* Define to 1 on AIX */
|
|
||||||
#undef HWLOC_AIX_SYS
|
|
||||||
|
|
||||||
/* Whether C compiler supports -fvisibility */
|
|
||||||
#undef HWLOC_C_HAVE_VISIBILITY
|
|
||||||
|
|
||||||
/* Define to 1 on Darwin */
|
|
||||||
#undef HWLOC_DARWIN_SYS
|
|
||||||
|
|
||||||
/* Whether we are in debugging mode or not */
|
|
||||||
#undef HWLOC_DEBUG
|
|
||||||
|
|
||||||
/* Define to 1 on *FREEBSD */
|
|
||||||
#undef HWLOC_FREEBSD_SYS
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ aligned or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_ALIGNED
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ always_inline or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_ALWAYS_INLINE
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ cold or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_COLD
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ const or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_CONST
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ deprecated or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_DEPRECATED
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ format or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_FORMAT
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ hot or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_HOT
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ malloc or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_MALLOC
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ may_alias or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_MAY_ALIAS
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ nonnull or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_NONNULL
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ noreturn or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_NORETURN
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ no_instrument_function or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_NO_INSTRUMENT_FUNCTION
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ packed or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_PACKED
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ pure or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_PURE
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ sentinel or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_SENTINEL
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ unused or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_UNUSED
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ warn unused result or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_WARN_UNUSED_RESULT
|
|
||||||
|
|
||||||
/* Whether your compiler has __attribute__ weak alias or not */
|
|
||||||
#undef HWLOC_HAVE_ATTRIBUTE_WEAK_ALIAS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `cairo' library. */
|
|
||||||
#undef HWLOC_HAVE_CAIRO
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clz' function. */
|
|
||||||
#undef HWLOC_HAVE_CLZ
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `clzl' function. */
|
|
||||||
#undef HWLOC_HAVE_CLZL
|
|
||||||
|
|
||||||
/* Define to 1 if you have cpuid */
|
|
||||||
#undef HWLOC_HAVE_CPUID
|
|
||||||
|
|
||||||
/* Define to 1 if the CPU_SET macro works */
|
|
||||||
#undef HWLOC_HAVE_CPU_SET
|
|
||||||
|
|
||||||
/* Define to 1 if the CPU_SET_S macro works */
|
|
||||||
#undef HWLOC_HAVE_CPU_SET_S
|
|
||||||
|
|
||||||
/* Define to 1 if function `clz' is declared by system headers */
|
|
||||||
#undef HWLOC_HAVE_DECL_CLZ
|
|
||||||
|
|
||||||
/* Define to 1 if function `clzl' is declared by system headers */
|
|
||||||
#undef HWLOC_HAVE_DECL_CLZL
|
|
||||||
|
|
||||||
/* Define to 1 if function `ffs' is declared by system headers */
|
|
||||||
#undef HWLOC_HAVE_DECL_FFS
|
|
||||||
|
|
||||||
/* Define to 1 if function `ffsl' is declared by system headers */
|
|
||||||
#undef HWLOC_HAVE_DECL_FFSL
|
|
||||||
|
|
||||||
/* Define to 1 if function `fls' is declared by system headers */
|
|
||||||
#undef HWLOC_HAVE_DECL_FLS
|
|
||||||
|
|
||||||
/* Define to 1 if function `flsl' is declared by system headers */
|
|
||||||
#undef HWLOC_HAVE_DECL_FLSL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffs' function. */
|
|
||||||
#undef HWLOC_HAVE_FFS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `ffsl' function. */
|
|
||||||
#undef HWLOC_HAVE_FFSL
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `fls' function. */
|
|
||||||
#undef HWLOC_HAVE_FLS
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `flsl' function. */
|
|
||||||
#undef HWLOC_HAVE_FLSL
|
|
||||||
|
|
||||||
/* Define to 1 if you have a library providing the termcap interface */
|
|
||||||
#undef HWLOC_HAVE_LIBTERMCAP
|
|
||||||
|
|
||||||
/* Define to 1 if mbind is available. */
|
|
||||||
#undef HWLOC_HAVE_MBIND
|
|
||||||
|
|
||||||
/* Define to 1 if migrate_pages is available. */
|
|
||||||
#undef HWLOC_HAVE_MIGRATE_PAGES
|
|
||||||
|
|
||||||
/* Define to 1 if glibc provides the old prototype of sched_setaffinity() */
|
|
||||||
#undef HWLOC_HAVE_OLD_SCHED_SETAFFINITY
|
|
||||||
|
|
||||||
/* `Define to 1 if you have pthread_getthrds_np' */
|
|
||||||
#undef HWLOC_HAVE_PTHREAD_GETTHRDS_NP
|
|
||||||
|
|
||||||
/* Define to 1 if set_mempolicy is available. */
|
|
||||||
#undef HWLOC_HAVE_SET_MEMPOLICY
|
|
||||||
|
|
||||||
/* Define to 1 if you have the <stdint.h> header file. */
|
|
||||||
#undef HWLOC_HAVE_STDINT_H
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `windows.h' header. */
|
|
||||||
#undef HWLOC_HAVE_WINDOWS_H
|
|
||||||
|
|
||||||
/* Define to 1 if X11 libraries are available. */
|
|
||||||
#undef HWLOC_HAVE_X11
|
|
||||||
|
|
||||||
/* Define to 1 if you have the `xml' library. */
|
|
||||||
#undef HWLOC_HAVE_XML
|
|
||||||
|
|
||||||
/* Define to 1 if the _syscall3 macro works */
|
|
||||||
#undef HWLOC_HAVE__SYSCALL3
|
|
||||||
|
|
||||||
/* Define to 1 on HP-UX */
|
|
||||||
#undef HWLOC_HPUX_SYS
|
|
||||||
|
|
||||||
/* Define to 1 on Irix */
|
|
||||||
#undef HWLOC_IRIX_SYS
|
|
||||||
|
|
||||||
/* Define to 1 on Linux */
|
|
||||||
#undef HWLOC_LINUX_SYS
|
|
||||||
|
|
||||||
/* Major version of hwloc */
|
|
||||||
#undef HWLOC_MAJOR_VERSION
|
|
||||||
|
|
||||||
/* Minor version of hwloc */
|
|
||||||
#undef HWLOC_MINOR_VERSION
|
|
||||||
|
|
||||||
/* Define to 1 on OSF */
|
|
||||||
#undef HWLOC_OSF_SYS
|
|
||||||
|
|
||||||
/* Release version of hwloc */
|
|
||||||
#undef HWLOC_RELEASE_VERSION
|
|
||||||
|
|
||||||
/* The size of `unsigned int', as computed by sizeof */
|
|
||||||
#undef HWLOC_SIZEOF_UNSIGNED_INT
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof */
|
|
||||||
#undef HWLOC_SIZEOF_UNSIGNED_LONG
|
|
||||||
|
|
||||||
/* Define to 1 on Solaris */
|
|
||||||
#undef HWLOC_SOLARIS_SYS
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix */
|
|
||||||
#undef HWLOC_SYM_PREFIX
|
|
||||||
|
|
||||||
/* The hwloc symbol prefix in all caps */
|
|
||||||
#undef HWLOC_SYM_PREFIX_CAPS
|
|
||||||
|
|
||||||
/* Whether we need to re-define all the hwloc public symbols or not */
|
|
||||||
#undef HWLOC_SYM_TRANSFORM
|
|
||||||
|
|
||||||
/* Define to 1 on unsupported systems */
|
|
||||||
#undef HWLOC_UNSUPPORTED_SYS
|
|
||||||
|
|
||||||
/* Define to 1 if ncurses works, preferred over curses */
|
|
||||||
#undef HWLOC_USE_NCURSES
|
|
||||||
|
|
||||||
/* Define to 1 on WINDOWS */
|
|
||||||
#undef HWLOC_WIN_SYS
|
|
||||||
|
|
||||||
/* Define to 1 on x86_32 */
|
|
||||||
#undef HWLOC_X86_32_ARCH
|
|
||||||
|
|
||||||
/* Define to 1 on x86_64 */
|
|
||||||
#undef HWLOC_X86_64_ARCH
|
|
||||||
|
|
||||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
|
||||||
*/
|
|
||||||
#undef LT_OBJDIR
|
|
||||||
|
|
||||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
|
||||||
#undef NO_MINUS_C_MINUS_O
|
|
||||||
|
|
||||||
/* Name of package */
|
|
||||||
#undef PACKAGE
|
|
||||||
|
|
||||||
/* Define to the address where bug reports for this package should be sent. */
|
|
||||||
#undef PACKAGE_BUGREPORT
|
|
||||||
|
|
||||||
/* Define to the full name of this package. */
|
|
||||||
#undef PACKAGE_NAME
|
|
||||||
|
|
||||||
/* Define to the full name and version of this package. */
|
|
||||||
#undef PACKAGE_STRING
|
|
||||||
|
|
||||||
/* Define to the one symbol short name of this package. */
|
|
||||||
#undef PACKAGE_TARNAME
|
|
||||||
|
|
||||||
/* Define to the home page for this package. */
|
|
||||||
#undef PACKAGE_URL
|
|
||||||
|
|
||||||
/* Define to the version of this package. */
|
|
||||||
#undef PACKAGE_VERSION
|
|
||||||
|
|
||||||
/* The size of `unsigned int', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_UNSIGNED_INT
|
|
||||||
|
|
||||||
/* The size of `unsigned long', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_UNSIGNED_LONG
|
|
||||||
|
|
||||||
/* The size of `void *', as computed by sizeof. */
|
|
||||||
#undef SIZEOF_VOID_P
|
|
||||||
|
|
||||||
/* Define to 1 if you have the ANSI C header files. */
|
|
||||||
#undef STDC_HEADERS
|
|
||||||
|
|
||||||
/* Enable extensions on HP-UX. */
|
|
||||||
#ifndef _HPUX_SOURCE
|
|
||||||
# undef _HPUX_SOURCE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Enable extensions on AIX 3, Interix. */
|
|
||||||
#ifndef _ALL_SOURCE
|
|
||||||
# undef _ALL_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable GNU extensions on systems that have them. */
|
|
||||||
#ifndef _GNU_SOURCE
|
|
||||||
# undef _GNU_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable threading extensions on Solaris. */
|
|
||||||
#ifndef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
# undef _POSIX_PTHREAD_SEMANTICS
|
|
||||||
#endif
|
|
||||||
/* Enable extensions on HP NonStop. */
|
|
||||||
#ifndef _TANDEM_SOURCE
|
|
||||||
# undef _TANDEM_SOURCE
|
|
||||||
#endif
|
|
||||||
/* Enable general extensions on Solaris. */
|
|
||||||
#ifndef __EXTENSIONS__
|
|
||||||
# undef __EXTENSIONS__
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Version number of package */
|
|
||||||
#undef VERSION
|
|
||||||
|
|
||||||
/* Define to 1 if the X Window System is missing or not being used. */
|
|
||||||
#undef X_DISPLAY_MISSING
|
|
||||||
|
|
||||||
/* Are we building for HP-UX? */
|
|
||||||
#undef _HPUX_SOURCE
|
|
||||||
|
|
||||||
/* Define to 1 if on MINIX. */
|
|
||||||
#undef _MINIX
|
|
||||||
|
|
||||||
/* Define to 2 if the system does not provide POSIX.1 features except with
|
|
||||||
this defined. */
|
|
||||||
#undef _POSIX_1_SOURCE
|
|
||||||
|
|
||||||
/* Define to 1 if you need to in order for `stat' and other things to work. */
|
|
||||||
#undef _POSIX_SOURCE
|
|
||||||
|
|
||||||
/* Define this to a keyword that can safely replace inline in installed
|
|
||||||
headers */
|
|
||||||
#undef __hwloc_inline
|
|
||||||
|
|
||||||
/* Define this to the process ID type */
|
|
||||||
#undef hwloc_pid_t
|
|
||||||
|
|
||||||
/* Define this to either strncasecmp or strncmp */
|
|
||||||
#undef hwloc_strncasecmp
|
|
||||||
|
|
||||||
/* Define this to the thread ID type */
|
|
||||||
#undef hwloc_thread_t
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_CONFIGURE_H */
|
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
timestamp for hwloc-1.2.1/include/private/autogen/config.h
|
|
|
@ -1,72 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2010-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Internals for x86's cpuid. */
|
|
||||||
|
|
||||||
#ifndef HWLOC_PRIVATE_CPUID_H
|
|
||||||
#define HWLOC_PRIVATE_CPUID_H
|
|
||||||
|
|
||||||
#ifdef HWLOC_X86_32_ARCH
|
|
||||||
static __hwloc_inline int hwloc_have_cpuid(void)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
unsigned tmp, tmp2;
|
|
||||||
asm(
|
|
||||||
"mov $0,%0\n\t" /* Not supported a priori */
|
|
||||||
|
|
||||||
"pushfl \n\t" /* Save flags */
|
|
||||||
|
|
||||||
"pushfl \n\t" \
|
|
||||||
"pop %1 \n\t" /* Get flags */ \
|
|
||||||
|
|
||||||
#define TRY_TOGGLE \
|
|
||||||
"xor $0x00200000,%1\n\t" /* Try to toggle ID */ \
|
|
||||||
"mov %1,%2\n\t" /* Save expected value */ \
|
|
||||||
"push %1 \n\t" \
|
|
||||||
"popfl \n\t" /* Try to toggle */ \
|
|
||||||
"pushfl \n\t" \
|
|
||||||
"pop %1 \n\t" \
|
|
||||||
"cmp %1,%2\n\t" /* Compare with expected value */ \
|
|
||||||
"jnz Lhwloc1\n\t" /* Unexpected, failure */ \
|
|
||||||
|
|
||||||
TRY_TOGGLE /* Try to set/clear */
|
|
||||||
TRY_TOGGLE /* Try to clear/set */
|
|
||||||
|
|
||||||
"mov $1,%0\n\t" /* Passed the test! */
|
|
||||||
|
|
||||||
"Lhwloc1: \n\t"
|
|
||||||
"popfl \n\t" /* Restore flags */
|
|
||||||
|
|
||||||
: "=r" (ret), "=&r" (tmp), "=&r" (tmp2));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif /* HWLOC_X86_32_ARCH */
|
|
||||||
#ifdef HWLOC_X86_64_ARCH
|
|
||||||
static __hwloc_inline int hwloc_have_cpuid(void) { return 1; }
|
|
||||||
#endif /* HWLOC_X86_64_ARCH */
|
|
||||||
|
|
||||||
static __hwloc_inline void hwloc_cpuid(unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx)
|
|
||||||
{
|
|
||||||
asm(
|
|
||||||
#ifdef HWLOC_X86_32_ARCH
|
|
||||||
"push %%ebx\n\t"
|
|
||||||
#endif
|
|
||||||
"cpuid\n\t"
|
|
||||||
#ifdef HWLOC_X86_32_ARCH
|
|
||||||
"mov %%ebx,%1\n\t"
|
|
||||||
"pop %%ebx\n\t"
|
|
||||||
#endif
|
|
||||||
: "+a" (*eax),
|
|
||||||
#ifdef HWLOC_X86_32_ARCH
|
|
||||||
"=r" (*ebx),
|
|
||||||
#else
|
|
||||||
"=b" (*ebx),
|
|
||||||
#endif
|
|
||||||
"+c" (*ecx), "=d" (*edx));
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* HWLOC_PRIVATE_CPUID_H */
|
|
|
@ -1,54 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009, 2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The configuration file */
|
|
||||||
|
|
||||||
#ifndef HWLOC_DEBUG_H
|
|
||||||
#define HWLOC_DEBUG_H
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
|
|
||||||
#ifdef HWLOC_DEBUG
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static __hwloc_inline void hwloc_debug(const char *s __hwloc_attribute_unused, ...)
|
|
||||||
{
|
|
||||||
#ifdef HWLOC_DEBUG
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, s);
|
|
||||||
vfprintf(stderr, s, ap);
|
|
||||||
va_end(ap);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HWLOC_DEBUG
|
|
||||||
#define hwloc_debug_bitmap(fmt, bitmap) do { \
|
|
||||||
char *s= hwloc_bitmap_printf_value(bitmap); \
|
|
||||||
fprintf(stderr, fmt, s); \
|
|
||||||
free(s); \
|
|
||||||
} while (0)
|
|
||||||
#define hwloc_debug_1arg_bitmap(fmt, arg1, bitmap) do { \
|
|
||||||
char *s= hwloc_bitmap_printf_value(bitmap); \
|
|
||||||
fprintf(stderr, fmt, arg1, s); \
|
|
||||||
free(s); \
|
|
||||||
} while (0)
|
|
||||||
#define hwloc_debug_2args_bitmap(fmt, arg1, arg2, bitmap) do { \
|
|
||||||
char *s= hwloc_bitmap_printf_value(bitmap); \
|
|
||||||
fprintf(stderr, fmt, arg1, arg2, s); \
|
|
||||||
free(s); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define hwloc_debug_bitmap(s, bitmap) do { } while(0)
|
|
||||||
#define hwloc_debug_1arg_bitmap(s, arg1, bitmap) do { } while(0)
|
|
||||||
#define hwloc_debug_2args_bitmap(s, arg1, arg2, bitmap) do { } while(0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* HWLOC_DEBUG_H */
|
|
|
@ -1,331 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Misc internals routines. */
|
|
||||||
|
|
||||||
#ifndef HWLOC_PRIVATE_MISC_H
|
|
||||||
#define HWLOC_PRIVATE_MISC_H
|
|
||||||
|
|
||||||
#include <hwloc/autogen/config.h>
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
|
|
||||||
|
|
||||||
/* On some systems, snprintf returns the size of written data, not the actually
|
|
||||||
* required size. hwloc_snprintf always report the actually required size. */
|
|
||||||
int hwloc_snprintf(char *str, size_t size, const char *format, ...) __hwloc_attribute_format(printf, 3, 4);
|
|
||||||
|
|
||||||
/* Check whether needle matches the beginning of haystack, at least n, and up
|
|
||||||
* to a colon or \0 */
|
|
||||||
HWLOC_DECLSPEC
|
|
||||||
int hwloc_namecoloncmp(const char *haystack, const char *needle, size_t n);
|
|
||||||
|
|
||||||
/* Compile-time assertion */
|
|
||||||
#define HWLOC_BUILD_ASSERT(condition) ((void)sizeof(char[1 - 2*!(condition)]))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define HWLOC_BITS_PER_LONG (HWLOC_SIZEOF_UNSIGNED_LONG * 8)
|
|
||||||
#define HWLOC_BITS_PER_INT (HWLOC_SIZEOF_UNSIGNED_INT * 8)
|
|
||||||
|
|
||||||
#if (HWLOC_BITS_PER_LONG != 32) && (HWLOC_BITS_PER_LONG != 64)
|
|
||||||
#error "unknown size for unsigned long."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if (HWLOC_BITS_PER_INT != 16) && (HWLOC_BITS_PER_INT != 32) && (HWLOC_BITS_PER_INT != 64)
|
|
||||||
#error "unknown size for unsigned int."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ffsl helpers.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef __GNUC__
|
|
||||||
|
|
||||||
# if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
|
|
||||||
/* Starting from 3.4, gcc has a long variant. */
|
|
||||||
# define hwloc_ffsl(x) __builtin_ffsl(x)
|
|
||||||
# else
|
|
||||||
# define hwloc_ffs(x) __builtin_ffs(x)
|
|
||||||
# define HWLOC_NEED_FFSL
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#elif defined(HWLOC_HAVE_FFSL)
|
|
||||||
|
|
||||||
# ifndef HWLOC_HAVE_DECL_FFSL
|
|
||||||
extern int ffsl(long) __hwloc_attribute_const;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define hwloc_ffsl(x) ffsl(x)
|
|
||||||
|
|
||||||
#elif defined(HWLOC_HAVE_FFS)
|
|
||||||
|
|
||||||
# ifndef HWLOC_HAVE_DECL_FFS
|
|
||||||
extern int ffs(int) __hwloc_attribute_const;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define hwloc_ffs(x) ffs(x)
|
|
||||||
# define HWLOC_NEED_FFSL
|
|
||||||
|
|
||||||
#else /* no ffs implementation */
|
|
||||||
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_ffsl(unsigned long x)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!x)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
i = 1;
|
|
||||||
#if HWLOC_BITS_PER_LONG >= 64
|
|
||||||
if (!(x & 0xfffffffful)) {
|
|
||||||
x >>= 32;
|
|
||||||
i += 32;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (!(x & 0xffffu)) {
|
|
||||||
x >>= 16;
|
|
||||||
i += 16;
|
|
||||||
}
|
|
||||||
if (!(x & 0xff)) {
|
|
||||||
x >>= 8;
|
|
||||||
i += 8;
|
|
||||||
}
|
|
||||||
if (!(x & 0xf)) {
|
|
||||||
x >>= 4;
|
|
||||||
i += 4;
|
|
||||||
}
|
|
||||||
if (!(x & 0x3)) {
|
|
||||||
x >>= 2;
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
if (!(x & 0x1)) {
|
|
||||||
x >>= 1;
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HWLOC_NEED_FFSL
|
|
||||||
|
|
||||||
/* We only have an int ffs(int) implementation, build a long one. */
|
|
||||||
|
|
||||||
/* First make it 32 bits if it was only 16. */
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_ffs32(unsigned long x)
|
|
||||||
{
|
|
||||||
#if HWLOC_BITS_PER_INT == 16
|
|
||||||
int low_ffs, hi_ffs;
|
|
||||||
|
|
||||||
low_ffs = hwloc_ffs(x & 0xfffful);
|
|
||||||
if (low_ffs)
|
|
||||||
return low_ffs;
|
|
||||||
|
|
||||||
hi_ffs = hwloc_ffs(x >> 16);
|
|
||||||
if (hi_ffs)
|
|
||||||
return hi_ffs + 16;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return hwloc_ffs(x);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Then make it 64 bit if longs are. */
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_ffsl(unsigned long x)
|
|
||||||
{
|
|
||||||
#if HWLOC_BITS_PER_LONG == 64
|
|
||||||
int low_ffs, hi_ffs;
|
|
||||||
|
|
||||||
low_ffs = hwloc_ffs32(x & 0xfffffffful);
|
|
||||||
if (low_ffs)
|
|
||||||
return low_ffs;
|
|
||||||
|
|
||||||
hi_ffs = hwloc_ffs32(x >> 32);
|
|
||||||
if (hi_ffs)
|
|
||||||
return hi_ffs + 32;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return hwloc_ffs32(x);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/**
|
|
||||||
* flsl helpers.
|
|
||||||
*/
|
|
||||||
#ifdef __GNUC_____
|
|
||||||
|
|
||||||
# if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__ >= 4))
|
|
||||||
# define hwloc_flsl(x) (x ? 8*sizeof(long) - __builtin_clzl(x) : 0)
|
|
||||||
# else
|
|
||||||
# define hwloc_fls(x) (x ? 8*sizeof(int) - __builtin_clz(x) : 0)
|
|
||||||
# define HWLOC_NEED_FLSL
|
|
||||||
# endif
|
|
||||||
|
|
||||||
#elif defined(HWLOC_HAVE_FLSL)
|
|
||||||
|
|
||||||
# ifndef HWLOC_HAVE_DECL_FLSL
|
|
||||||
extern int flsl(long) __hwloc_attribute_const;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define hwloc_flsl(x) flsl(x)
|
|
||||||
|
|
||||||
#elif defined(HWLOC_HAVE_CLZL)
|
|
||||||
|
|
||||||
# ifndef HWLOC_HAVE_DECL_CLZL
|
|
||||||
extern int clzl(long) __hwloc_attribute_const;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define hwloc_flsl(x) (x ? 8*sizeof(long) - clzl(x) : 0)
|
|
||||||
|
|
||||||
#elif defined(HWLOC_HAVE_FLS)
|
|
||||||
|
|
||||||
# ifndef HWLOC_HAVE_DECL_FLS
|
|
||||||
extern int fls(int) __hwloc_attribute_const;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define hwloc_fls(x) fls(x)
|
|
||||||
# define HWLOC_NEED_FLSL
|
|
||||||
|
|
||||||
#elif defined(HWLOC_HAVE_CLZ)
|
|
||||||
|
|
||||||
# ifndef HWLOC_HAVE_DECL_CLZ
|
|
||||||
extern int clz(int) __hwloc_attribute_const;
|
|
||||||
# endif
|
|
||||||
|
|
||||||
# define hwloc_fls(x) (x ? 8*sizeof(int) - clz(x) : 0)
|
|
||||||
# define HWLOC_NEED_FLSL
|
|
||||||
|
|
||||||
#else /* no fls implementation */
|
|
||||||
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_flsl(unsigned long x)
|
|
||||||
{
|
|
||||||
int i = 0;
|
|
||||||
|
|
||||||
if (!x)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
i = 1;
|
|
||||||
#if HWLOC_BITS_PER_LONG >= 64
|
|
||||||
if ((x & 0xffffffff00000000ul)) {
|
|
||||||
x >>= 32;
|
|
||||||
i += 32;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if ((x & 0xffff0000u)) {
|
|
||||||
x >>= 16;
|
|
||||||
i += 16;
|
|
||||||
}
|
|
||||||
if ((x & 0xff00)) {
|
|
||||||
x >>= 8;
|
|
||||||
i += 8;
|
|
||||||
}
|
|
||||||
if ((x & 0xf0)) {
|
|
||||||
x >>= 4;
|
|
||||||
i += 4;
|
|
||||||
}
|
|
||||||
if ((x & 0xc)) {
|
|
||||||
x >>= 2;
|
|
||||||
i += 2;
|
|
||||||
}
|
|
||||||
if ((x & 0x2)) {
|
|
||||||
x >>= 1;
|
|
||||||
i += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return i;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HWLOC_NEED_FLSL
|
|
||||||
|
|
||||||
/* We only have an int fls(int) implementation, build a long one. */
|
|
||||||
|
|
||||||
/* First make it 32 bits if it was only 16. */
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_fls32(unsigned long x)
|
|
||||||
{
|
|
||||||
#if HWLOC_BITS_PER_INT == 16
|
|
||||||
int low_fls, hi_fls;
|
|
||||||
|
|
||||||
hi_fls = hwloc_fls(x >> 16);
|
|
||||||
if (hi_fls)
|
|
||||||
return hi_fls + 16;
|
|
||||||
|
|
||||||
low_fls = hwloc_fls(x & 0xfffful);
|
|
||||||
if (low_fls)
|
|
||||||
return low_fls;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return hwloc_fls(x);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Then make it 64 bit if longs are. */
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_flsl(unsigned long x)
|
|
||||||
{
|
|
||||||
#if HWLOC_BITS_PER_LONG == 64
|
|
||||||
int low_fls, hi_fls;
|
|
||||||
|
|
||||||
hi_fls = hwloc_fls32(x >> 32);
|
|
||||||
if (hi_fls)
|
|
||||||
return hi_fls + 32;
|
|
||||||
|
|
||||||
low_fls = hwloc_fls32(x & 0xfffffffful);
|
|
||||||
if (low_fls)
|
|
||||||
return low_fls;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
#else
|
|
||||||
return hwloc_fls32(x);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static __hwloc_inline int __hwloc_attribute_const
|
|
||||||
hwloc_weight_long(unsigned long w)
|
|
||||||
{
|
|
||||||
#if HWLOC_BITS_PER_LONG == 32
|
|
||||||
#if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4)
|
|
||||||
return __builtin_popcount(w);
|
|
||||||
#else
|
|
||||||
unsigned int res = (w & 0x55555555) + ((w >> 1) & 0x55555555);
|
|
||||||
res = (res & 0x33333333) + ((res >> 2) & 0x33333333);
|
|
||||||
res = (res & 0x0F0F0F0F) + ((res >> 4) & 0x0F0F0F0F);
|
|
||||||
res = (res & 0x00FF00FF) + ((res >> 8) & 0x00FF00FF);
|
|
||||||
return (res & 0x0000FFFF) + ((res >> 16) & 0x0000FFFF);
|
|
||||||
#endif
|
|
||||||
#else /* HWLOC_BITS_PER_LONG == 32 */
|
|
||||||
#if (__GNUC__ >= 4) || ((__GNUC__ == 3) && (__GNUC_MINOR__) >= 4)
|
|
||||||
return __builtin_popcountll(w);
|
|
||||||
#else
|
|
||||||
unsigned long res;
|
|
||||||
res = (w & 0x5555555555555555ul) + ((w >> 1) & 0x5555555555555555ul);
|
|
||||||
res = (res & 0x3333333333333333ul) + ((res >> 2) & 0x3333333333333333ul);
|
|
||||||
res = (res & 0x0F0F0F0F0F0F0F0Ful) + ((res >> 4) & 0x0F0F0F0F0F0F0F0Ful);
|
|
||||||
res = (res & 0x00FF00FF00FF00FFul) + ((res >> 8) & 0x00FF00FF00FF00FFul);
|
|
||||||
res = (res & 0x0000FFFF0000FFFFul) + ((res >> 16) & 0x0000FFFF0000FFFFul);
|
|
||||||
return (res & 0x00000000FFFFFFFFul) + ((res >> 32) & 0x00000000FFFFFFFFul);
|
|
||||||
#endif
|
|
||||||
#endif /* HWLOC_BITS_PER_LONG == 64 */
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_PRIVATE_MISC_H */
|
|
|
@ -1,343 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
*
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Internal types and helpers. */
|
|
||||||
|
|
||||||
#ifndef HWLOC_PRIVATE_H
|
|
||||||
#define HWLOC_PRIVATE_H
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <hwloc/bitmap.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#ifdef HAVE_STDINT_H
|
|
||||||
#include <stdint.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_ATTRIBUTE_FORMAT
|
|
||||||
# if HWLOC_HAVE_ATTRIBUTE_FORMAT
|
|
||||||
# define __hwloc_attribute_format(type, str, arg) __attribute__((__format__(type, str, arg)))
|
|
||||||
# else
|
|
||||||
# define __hwloc_attribute_format(type, str, arg)
|
|
||||||
# endif
|
|
||||||
#else
|
|
||||||
# define __hwloc_attribute_format(type, str, arg)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum hwloc_ignore_type_e {
|
|
||||||
HWLOC_IGNORE_TYPE_NEVER = 0,
|
|
||||||
HWLOC_IGNORE_TYPE_KEEP_STRUCTURE,
|
|
||||||
HWLOC_IGNORE_TYPE_ALWAYS
|
|
||||||
};
|
|
||||||
|
|
||||||
#define HWLOC_DEPTH_MAX 128
|
|
||||||
|
|
||||||
typedef enum hwloc_backend_e {
|
|
||||||
HWLOC_BACKEND_NONE,
|
|
||||||
HWLOC_BACKEND_SYNTHETIC,
|
|
||||||
#ifdef HWLOC_LINUX_SYS
|
|
||||||
HWLOC_BACKEND_SYSFS,
|
|
||||||
#endif
|
|
||||||
#ifdef HWLOC_HAVE_XML
|
|
||||||
HWLOC_BACKEND_XML,
|
|
||||||
#endif
|
|
||||||
/* This value is only here so that we can end the enum list without
|
|
||||||
a comma (thereby preventing compiler warnings) */
|
|
||||||
HWLOC_BACKEND_MAX
|
|
||||||
} hwloc_backend_t;
|
|
||||||
|
|
||||||
struct hwloc_topology {
|
|
||||||
unsigned nb_levels; /* Number of horizontal levels */
|
|
||||||
unsigned next_group_depth; /* Depth of the next Group object that we may create */
|
|
||||||
unsigned level_nbobjects[HWLOC_DEPTH_MAX]; /* Number of objects on each horizontal level */
|
|
||||||
struct hwloc_obj **levels[HWLOC_DEPTH_MAX]; /* Direct access to levels, levels[l = 0 .. nblevels-1][0..level_nbobjects[l]] */
|
|
||||||
unsigned long flags;
|
|
||||||
int type_depth[HWLOC_OBJ_TYPE_MAX];
|
|
||||||
enum hwloc_ignore_type_e ignored_types[HWLOC_OBJ_TYPE_MAX];
|
|
||||||
int is_thissystem;
|
|
||||||
int is_loaded;
|
|
||||||
hwloc_pid_t pid; /* Process ID the topology is view from, 0 for self */
|
|
||||||
|
|
||||||
int (*set_thisproc_cpubind)(hwloc_topology_t topology, hwloc_const_cpuset_t set, int flags);
|
|
||||||
int (*get_thisproc_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int flags);
|
|
||||||
int (*set_thisthread_cpubind)(hwloc_topology_t topology, hwloc_const_cpuset_t set, int flags);
|
|
||||||
int (*get_thisthread_cpubind)(hwloc_topology_t topology, hwloc_cpuset_t set, int flags);
|
|
||||||
int (*set_proc_cpubind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, int flags);
|
|
||||||
int (*get_proc_cpubind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int flags);
|
|
||||||
#ifdef hwloc_thread_t
|
|
||||||
int (*set_thread_cpubind)(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_const_cpuset_t set, int flags);
|
|
||||||
int (*get_thread_cpubind)(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_cpuset_t set, int flags);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int (*get_thisproc_last_cpu_location)(hwloc_topology_t topology, hwloc_cpuset_t set, int flags);
|
|
||||||
int (*get_thisthread_last_cpu_location)(hwloc_topology_t topology, hwloc_cpuset_t set, int flags);
|
|
||||||
int (*get_proc_last_cpu_location)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, int flags);
|
|
||||||
|
|
||||||
int (*set_thisproc_membind)(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags);
|
|
||||||
int (*get_thisproc_membind)(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags);
|
|
||||||
int (*set_thisthread_membind)(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags);
|
|
||||||
int (*get_thisthread_membind)(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags);
|
|
||||||
int (*set_proc_membind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags);
|
|
||||||
int (*get_proc_membind)(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags);
|
|
||||||
int (*set_area_membind)(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags);
|
|
||||||
int (*get_area_membind)(hwloc_topology_t topology, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags);
|
|
||||||
/* This has to return the same kind of pointer as alloc_membind, so that free_membind can be used on it */
|
|
||||||
void *(*alloc)(hwloc_topology_t topology, size_t len);
|
|
||||||
/* alloc_membind has to always succeed if !(flags & HWLOC_MEMBIND_STRICT).
|
|
||||||
* see hwloc_alloc_or_fail which is convenient for that. */
|
|
||||||
void *(*alloc_membind)(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags);
|
|
||||||
int (*free_membind)(hwloc_topology_t topology, void *addr, size_t len);
|
|
||||||
|
|
||||||
struct hwloc_topology_support support;
|
|
||||||
|
|
||||||
struct hwloc_os_distances_s {
|
|
||||||
int nbobjs;
|
|
||||||
unsigned *indexes; /* array of OS indexes before we can convert them into objs. always available.
|
|
||||||
*/
|
|
||||||
struct hwloc_obj **objs; /* array of objects, in the same order as above.
|
|
||||||
* either given (by a backend) together with the indexes array above.
|
|
||||||
* or build from the above indexes array when not given (by the user).
|
|
||||||
*/
|
|
||||||
float *distances; /* distance matrices, ordered according to the above indexes/objs array.
|
|
||||||
* distance from i to j is stored in slot i*nbnodes+j.
|
|
||||||
* will be copied into the main logical-index-ordered distance at the end of the discovery.
|
|
||||||
*/
|
|
||||||
} os_distances[HWLOC_OBJ_TYPE_MAX];
|
|
||||||
|
|
||||||
hwloc_backend_t backend_type;
|
|
||||||
union hwloc_backend_params_u {
|
|
||||||
#ifdef HWLOC_LINUX_SYS
|
|
||||||
struct hwloc_backend_params_sysfs_s {
|
|
||||||
/* sysfs backend parameters */
|
|
||||||
char *root_path; /* The path of the file system root, used when browsing, e.g., Linux' sysfs and procfs. */
|
|
||||||
int root_fd; /* The file descriptor for the file system root, used when browsing, e.g., Linux' sysfs and procfs. */
|
|
||||||
} sysfs;
|
|
||||||
#endif /* HWLOC_LINUX_SYS */
|
|
||||||
#if defined(HWLOC_OSF_SYS) || defined(HWLOC_COMPILE_PORTS)
|
|
||||||
struct hwloc_backend_params_osf {
|
|
||||||
int nbnodes;
|
|
||||||
} osf;
|
|
||||||
#endif /* HWLOC_OSF_SYS */
|
|
||||||
#ifdef HWLOC_HAVE_XML
|
|
||||||
struct hwloc_backend_params_xml_s {
|
|
||||||
/* xml backend parameters */
|
|
||||||
void *doc;
|
|
||||||
} xml;
|
|
||||||
#endif /* HWLOC_HAVE_XML */
|
|
||||||
struct hwloc_backend_params_synthetic_s {
|
|
||||||
/* synthetic backend parameters */
|
|
||||||
#define HWLOC_SYNTHETIC_MAX_DEPTH 128
|
|
||||||
unsigned arity[HWLOC_SYNTHETIC_MAX_DEPTH];
|
|
||||||
hwloc_obj_type_t type[HWLOC_SYNTHETIC_MAX_DEPTH];
|
|
||||||
unsigned id[HWLOC_SYNTHETIC_MAX_DEPTH];
|
|
||||||
unsigned depth[HWLOC_SYNTHETIC_MAX_DEPTH]; /* For cache/misc */
|
|
||||||
} synthetic;
|
|
||||||
} backend_params;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
extern void hwloc_setup_pu_level(struct hwloc_topology *topology, unsigned nb_pus);
|
|
||||||
extern int hwloc_get_sysctlbyname(const char *name, int64_t *n);
|
|
||||||
extern int hwloc_get_sysctl(int name[], unsigned namelen, int *n);
|
|
||||||
extern unsigned hwloc_fallback_nbprocessors(struct hwloc_topology *topology);
|
|
||||||
|
|
||||||
#if defined(HWLOC_LINUX_SYS)
|
|
||||||
extern void hwloc_look_linux(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_linux_hooks(struct hwloc_topology *topology);
|
|
||||||
extern int hwloc_backend_sysfs_init(struct hwloc_topology *topology, const char *fsroot_path);
|
|
||||||
extern void hwloc_backend_sysfs_exit(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_LINUX_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_XML
|
|
||||||
extern int hwloc_backend_xml_init(struct hwloc_topology *topology, const char *xmlpath, const char *xmlbuffer, int buflen);
|
|
||||||
extern void hwloc_xml_check_distances(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_look_xml(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_backend_xml_exit(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_HAVE_XML */
|
|
||||||
|
|
||||||
#ifdef HWLOC_SOLARIS_SYS
|
|
||||||
extern void hwloc_look_solaris(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_solaris_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_SOLARIS_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_AIX_SYS
|
|
||||||
extern void hwloc_look_aix(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_aix_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_AIX_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_OSF_SYS
|
|
||||||
extern void hwloc_look_osf(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_osf_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_OSF_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_WIN_SYS
|
|
||||||
extern void hwloc_look_windows(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_windows_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_WIN_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_DARWIN_SYS
|
|
||||||
extern void hwloc_look_darwin(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_darwin_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_DARWIN_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_FREEBSD_SYS
|
|
||||||
extern void hwloc_look_freebsd(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_freebsd_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_FREEBSD_SYS */
|
|
||||||
|
|
||||||
#ifdef HWLOC_HPUX_SYS
|
|
||||||
extern void hwloc_look_hpux(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_set_hpux_hooks(struct hwloc_topology *topology);
|
|
||||||
#endif /* HWLOC_HPUX_SYS */
|
|
||||||
|
|
||||||
extern void hwloc_look_x86(struct hwloc_topology *topology, unsigned nbprocs);
|
|
||||||
|
|
||||||
extern int hwloc_backend_synthetic_init(struct hwloc_topology *topology, const char *description);
|
|
||||||
extern void hwloc_backend_synthetic_exit(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_look_synthetic (struct hwloc_topology *topology);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add an object to the topology.
|
|
||||||
* It is sorted along the tree of other objects according to the inclusion of
|
|
||||||
* cpusets, to eventually be added as a child of the smallest object including
|
|
||||||
* this object.
|
|
||||||
*
|
|
||||||
* If the cpuset is empty, the type of the object (and maybe some attributes)
|
|
||||||
* must be enough to find where to insert the object. This is especially true
|
|
||||||
* for NUMA nodes with memory and no CPUs.
|
|
||||||
*
|
|
||||||
* The given object should not have children.
|
|
||||||
*
|
|
||||||
* This shall only be called before levels are built.
|
|
||||||
*
|
|
||||||
* In case of error, hwloc_report_os_error() is called.
|
|
||||||
*/
|
|
||||||
extern void hwloc_insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t obj);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add an object to the topology and specify which error callback to use
|
|
||||||
*/
|
|
||||||
typedef void (*hwloc_report_error_t)(const char * msg, int line);
|
|
||||||
extern void hwloc_report_os_error(const char * msg, int line);
|
|
||||||
extern int hwloc__insert_object_by_cpuset(struct hwloc_topology *topology, hwloc_obj_t obj, hwloc_report_error_t report_error);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Insert an object somewhere in the topology.
|
|
||||||
*
|
|
||||||
* It is added as the last child of the given parent.
|
|
||||||
* The cpuset is completely ignored, so strange objects such as I/O devices should
|
|
||||||
* preferably be inserted with this.
|
|
||||||
*
|
|
||||||
* The given object may have children.
|
|
||||||
*
|
|
||||||
* Remember to call topology_connect() afterwards to fix handy pointers.
|
|
||||||
*/
|
|
||||||
extern void hwloc_insert_object_by_parent(struct hwloc_topology *topology, hwloc_obj_t parent, hwloc_obj_t obj);
|
|
||||||
|
|
||||||
/* Insert name/value in the object infos array. name and value are copied by the callee. */
|
|
||||||
extern void hwloc_add_object_info(hwloc_obj_t obj, const char *name, const char *value);
|
|
||||||
|
|
||||||
/* Insert uname-specific names/values in the object infos array */
|
|
||||||
extern void hwloc_add_uname_info(struct hwloc_topology *topology);
|
|
||||||
|
|
||||||
/** \brief Return a locally-allocated stringified bitmap for printf-like calls. */
|
|
||||||
static __hwloc_inline char *
|
|
||||||
hwloc_bitmap_printf_value(hwloc_const_bitmap_t bitmap)
|
|
||||||
{
|
|
||||||
char *buf;
|
|
||||||
hwloc_bitmap_asprintf(&buf, bitmap);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static __hwloc_inline struct hwloc_obj *
|
|
||||||
hwloc_alloc_setup_object(hwloc_obj_type_t type, signed idx)
|
|
||||||
{
|
|
||||||
struct hwloc_obj *obj = malloc(sizeof(*obj));
|
|
||||||
memset(obj, 0, sizeof(*obj));
|
|
||||||
obj->type = type;
|
|
||||||
obj->os_index = idx;
|
|
||||||
obj->os_level = -1;
|
|
||||||
obj->attr = malloc(sizeof(*obj->attr));
|
|
||||||
memset(obj->attr, 0, sizeof(*obj->attr));
|
|
||||||
/* do not allocate the cpuset here, let the caller do it */
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void hwloc_free_unlinked_object(hwloc_obj_t obj);
|
|
||||||
|
|
||||||
#define hwloc_object_cpuset_from_array(l, _value, _array, _max) do { \
|
|
||||||
struct hwloc_obj *__l = (l); \
|
|
||||||
unsigned int *__a = (_array); \
|
|
||||||
int k; \
|
|
||||||
__l->cpuset = hwloc_bitmap_alloc(); \
|
|
||||||
for(k=0; k<_max; k++) \
|
|
||||||
if (__a[k] == _value) \
|
|
||||||
hwloc_bitmap_set(__l->cpuset, k); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/* Configures an array of NUM objects of type TYPE with physical IDs OSPHYSIDS
|
|
||||||
* and for which processors have ID PROC_PHYSIDS, and add them to the topology.
|
|
||||||
* */
|
|
||||||
static __hwloc_inline void
|
|
||||||
hwloc_setup_level(int procid_max, unsigned num, unsigned *osphysids, unsigned *proc_physids, struct hwloc_topology *topology, hwloc_obj_type_t type)
|
|
||||||
{
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
unsigned j;
|
|
||||||
|
|
||||||
hwloc_debug("%d %s\n", num, hwloc_obj_type_string(type));
|
|
||||||
|
|
||||||
for (j = 0; j < num; j++)
|
|
||||||
{
|
|
||||||
obj = hwloc_alloc_setup_object(type, osphysids[j]);
|
|
||||||
hwloc_object_cpuset_from_array(obj, j, proc_physids, procid_max);
|
|
||||||
hwloc_debug_2args_bitmap("%s %d has cpuset %s\n",
|
|
||||||
hwloc_obj_type_string(type),
|
|
||||||
j, obj->cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
hwloc_debug("%s", "\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/* This can be used for the alloc field to get allocated data that can be freed by free() */
|
|
||||||
void *hwloc_alloc_heap(hwloc_topology_t topology, size_t len);
|
|
||||||
|
|
||||||
/* This can be used for the alloc field to get allocated data that can be freed by munmap() */
|
|
||||||
void *hwloc_alloc_mmap(hwloc_topology_t topology, size_t len);
|
|
||||||
|
|
||||||
/* This can be used for the free_membind field to free data using free() */
|
|
||||||
int hwloc_free_heap(hwloc_topology_t topology, void *addr, size_t len);
|
|
||||||
|
|
||||||
/* This can be used for the free_membind field to free data using munmap() */
|
|
||||||
int hwloc_free_mmap(hwloc_topology_t topology, void *addr, size_t len);
|
|
||||||
|
|
||||||
/* Allocates unbound memory or fail, depending on whether STRICT is requested
|
|
||||||
* or not */
|
|
||||||
static __hwloc_inline void *
|
|
||||||
hwloc_alloc_or_fail(hwloc_topology_t topology, size_t len, int flags)
|
|
||||||
{
|
|
||||||
if (flags & HWLOC_MEMBIND_STRICT)
|
|
||||||
return NULL;
|
|
||||||
return hwloc_alloc(topology, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void hwloc_topology_distances_init(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_topology_distances_clear(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_topology_distances_destroy(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_topology__set_distance_matrix(struct hwloc_topology *topology, hwloc_obj_type_t type, unsigned nbobjs, unsigned *indexes, hwloc_obj_t *objs, float *distances);
|
|
||||||
extern void hwloc_store_distances_from_env(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_convert_distances_indexes_into_objects(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_finalize_logical_distances(struct hwloc_topology *topology);
|
|
||||||
extern void hwloc_restrict_distances(struct hwloc_topology *topology, unsigned long flags);
|
|
||||||
extern void hwloc_free_logical_distances(struct hwloc_distances_s *dist);
|
|
||||||
extern void hwloc_group_by_distances(struct hwloc_topology *topology);
|
|
||||||
|
|
||||||
#endif /* HWLOC_PRIVATE_H */
|
|
|
@ -1,118 +0,0 @@
|
||||||
# Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
|
|
||||||
AM_CFLAGS = $(HWLOC_CFLAGS)
|
|
||||||
AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
|
|
||||||
AM_LDFLAGS = $(HWLOC_LDFLAGS)
|
|
||||||
|
|
||||||
EXTRA_DIST = dolib.c
|
|
||||||
|
|
||||||
# If we're in standalone mode, build the installable library.
|
|
||||||
# Otherwise, build the embedded library.
|
|
||||||
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
lib_LTLIBRARIES = libhwloc.la
|
|
||||||
else
|
|
||||||
noinst_LTLIBRARIES = libhwloc_embedded.la
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Sources and ldflags
|
|
||||||
|
|
||||||
sources = \
|
|
||||||
topology.c \
|
|
||||||
traversal.c \
|
|
||||||
distances.c \
|
|
||||||
topology-synthetic.c \
|
|
||||||
bind.c \
|
|
||||||
cpuset.c \
|
|
||||||
misc.c
|
|
||||||
ldflags =
|
|
||||||
|
|
||||||
# Conditionally add to the sources and ldflags
|
|
||||||
|
|
||||||
if HWLOC_HAVE_XML
|
|
||||||
sources += topology-xml.c
|
|
||||||
endif HWLOC_HAVE_XML
|
|
||||||
|
|
||||||
if HWLOC_HAVE_SOLARIS
|
|
||||||
sources += topology-solaris.c
|
|
||||||
endif HWLOC_HAVE_SOLARIS
|
|
||||||
|
|
||||||
if HWLOC_HAVE_LINUX
|
|
||||||
sources += topology-linux.c
|
|
||||||
endif HWLOC_HAVE_LINUX
|
|
||||||
|
|
||||||
if HWLOC_HAVE_AIX
|
|
||||||
sources += topology-aix.c
|
|
||||||
ldflags += -lpthread
|
|
||||||
endif HWLOC_HAVE_AIX
|
|
||||||
|
|
||||||
if HWLOC_HAVE_OSF
|
|
||||||
sources += topology-osf.c
|
|
||||||
ldflags += -lnuma -lpthread
|
|
||||||
endif HWLOC_HAVE_OSF
|
|
||||||
|
|
||||||
if HWLOC_HAVE_HPUX
|
|
||||||
sources += topology-hpux.c
|
|
||||||
ldflags += -lpthread
|
|
||||||
endif HWLOC_HAVE_HPUX
|
|
||||||
|
|
||||||
if HWLOC_HAVE_WINDOWS
|
|
||||||
sources += topology-windows.c
|
|
||||||
endif HWLOC_HAVE_WINDOWS
|
|
||||||
|
|
||||||
if HWLOC_HAVE_DARWIN
|
|
||||||
sources += topology-darwin.c
|
|
||||||
endif HWLOC_HAVE_DARWIN
|
|
||||||
|
|
||||||
if HWLOC_HAVE_FREEBSD
|
|
||||||
sources += topology-freebsd.c
|
|
||||||
endif HWLOC_HAVE_FREEBSD
|
|
||||||
|
|
||||||
if HWLOC_HAVE_GCC
|
|
||||||
ldflags += -no-undefined
|
|
||||||
endif HWLOC_HAVE_GCC
|
|
||||||
|
|
||||||
if HWLOC_HAVE_WINDOWS
|
|
||||||
LC_MESSAGES=C
|
|
||||||
export LC_MESSAGES
|
|
||||||
ldflags += -Xlinker --output-def -Xlinker .libs/libhwloc.def
|
|
||||||
|
|
||||||
if HWLOC_HAVE_MS_LIB
|
|
||||||
.libs/libhwloc.lib: libhwloc.la dolib
|
|
||||||
./dolib "$(HWLOC_MS_LIB)" X86 .libs/libhwloc.def libhwloc-$(HWLOC_SOVERSION) .libs/libhwloc.lib
|
|
||||||
all-local: .libs/libhwloc.lib
|
|
||||||
endif HWLOC_HAVE_MS_LIB
|
|
||||||
|
|
||||||
install-exec-hook:
|
|
||||||
$(INSTALL) .libs/libhwloc.def $(DESTDIR)$(libdir)
|
|
||||||
if HWLOC_HAVE_MS_LIB
|
|
||||||
$(INSTALL) .libs/libhwloc.lib $(DESTDIR)$(libdir)
|
|
||||||
$(INSTALL) .libs/libhwloc.exp $(DESTDIR)$(libdir)
|
|
||||||
endif HWLOC_HAVE_MS_LIB
|
|
||||||
endif HWLOC_HAVE_WINDOWS
|
|
||||||
|
|
||||||
if HWLOC_HAVE_CPUID
|
|
||||||
sources += topology-x86.c
|
|
||||||
endif HWLOC_HAVE_CPUID
|
|
||||||
|
|
||||||
# Installable library
|
|
||||||
|
|
||||||
libhwloc_la_SOURCES = $(sources)
|
|
||||||
libhwloc_la_LDFLAGS = $(ldflags) -version-number $(libhwloc_so_version) $(HWLOC_XML_LIBS) $(HWLOC_LINUX_LIBNUMA_LIBS)
|
|
||||||
|
|
||||||
# Embedded library (note the lack of a .so version number -- that
|
|
||||||
# intentionally only appears in the installable library)
|
|
||||||
|
|
||||||
libhwloc_embedded_la_SOURCES = $(sources)
|
|
||||||
libhwloc_embedded_la_LDFLAGS = $(ldflags) $(HWLOC_XML_LIBS) $(HWLOC_LINUX_LIBNUMA_LIBS)
|
|
||||||
|
|
||||||
# XML data (only install if we're building in standalone mode)
|
|
||||||
|
|
||||||
if HWLOC_BUILD_STANDALONE
|
|
||||||
xml_DATA = $(srcdir)/hwloc.dtd
|
|
||||||
xmldir = $(pkgdatadir)
|
|
||||||
EXTRA_DIST += hwloc.dtd
|
|
||||||
endif
|
|
|
@ -1,702 +0,0 @@
|
||||||
# Makefile.in generated by automake 1.11.1 from Makefile.am.
|
|
||||||
# @configure_input@
|
|
||||||
|
|
||||||
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
|
||||||
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
|
|
||||||
# Inc.
|
|
||||||
# This Makefile.in is free software; the Free Software Foundation
|
|
||||||
# gives unlimited permission to copy and/or distribute it,
|
|
||||||
# with or without modifications, as long as this notice is preserved.
|
|
||||||
|
|
||||||
# This program is distributed in the hope that it will be useful,
|
|
||||||
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
|
|
||||||
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
|
||||||
# PARTICULAR PURPOSE.
|
|
||||||
|
|
||||||
@SET_MAKE@
|
|
||||||
|
|
||||||
# Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
# Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
# Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved.
|
|
||||||
# See COPYING in top-level directory.
|
|
||||||
|
|
||||||
|
|
||||||
VPATH = @srcdir@
|
|
||||||
pkgdatadir = $(datadir)/@PACKAGE@
|
|
||||||
pkgincludedir = $(includedir)/@PACKAGE@
|
|
||||||
pkglibdir = $(libdir)/@PACKAGE@
|
|
||||||
pkglibexecdir = $(libexecdir)/@PACKAGE@
|
|
||||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
|
||||||
install_sh_DATA = $(install_sh) -c -m 644
|
|
||||||
install_sh_PROGRAM = $(install_sh) -c
|
|
||||||
install_sh_SCRIPT = $(install_sh) -c
|
|
||||||
INSTALL_HEADER = $(INSTALL_DATA)
|
|
||||||
transform = $(program_transform_name)
|
|
||||||
NORMAL_INSTALL = :
|
|
||||||
PRE_INSTALL = :
|
|
||||||
POST_INSTALL = :
|
|
||||||
NORMAL_UNINSTALL = :
|
|
||||||
PRE_UNINSTALL = :
|
|
||||||
POST_UNINSTALL = :
|
|
||||||
build_triplet = @build@
|
|
||||||
host_triplet = @host@
|
|
||||||
target_triplet = @target@
|
|
||||||
|
|
||||||
# Conditionally add to the sources and ldflags
|
|
||||||
@HWLOC_HAVE_XML_TRUE@am__append_1 = topology-xml.c
|
|
||||||
@HWLOC_HAVE_SOLARIS_TRUE@am__append_2 = topology-solaris.c
|
|
||||||
@HWLOC_HAVE_LINUX_TRUE@am__append_3 = topology-linux.c
|
|
||||||
@HWLOC_HAVE_AIX_TRUE@am__append_4 = topology-aix.c
|
|
||||||
@HWLOC_HAVE_AIX_TRUE@am__append_5 = -lpthread
|
|
||||||
@HWLOC_HAVE_OSF_TRUE@am__append_6 = topology-osf.c
|
|
||||||
@HWLOC_HAVE_OSF_TRUE@am__append_7 = -lnuma -lpthread
|
|
||||||
@HWLOC_HAVE_HPUX_TRUE@am__append_8 = topology-hpux.c
|
|
||||||
@HWLOC_HAVE_HPUX_TRUE@am__append_9 = -lpthread
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@am__append_10 = topology-windows.c
|
|
||||||
@HWLOC_HAVE_DARWIN_TRUE@am__append_11 = topology-darwin.c
|
|
||||||
@HWLOC_HAVE_FREEBSD_TRUE@am__append_12 = topology-freebsd.c
|
|
||||||
@HWLOC_HAVE_GCC_TRUE@am__append_13 = -no-undefined
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@am__append_14 = -Xlinker --output-def -Xlinker .libs/libhwloc.def
|
|
||||||
@HWLOC_HAVE_CPUID_TRUE@am__append_15 = topology-x86.c
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@am__append_16 = hwloc.dtd
|
|
||||||
subdir = hwloc-1.2.1/src
|
|
||||||
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
|
|
||||||
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
|
|
||||||
am__aclocal_m4_deps = \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_check_attributes.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_check_visibility.m4 \
|
|
||||||
$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
|
|
||||||
$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
|
|
||||||
$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc.m4 \
|
|
||||||
$(top_srcdir)/hwloc-1.2.1/config/hwloc_pkg.m4 \
|
|
||||||
$(top_srcdir)/configure.ac
|
|
||||||
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
|
|
||||||
$(ACLOCAL_M4)
|
|
||||||
mkinstalldirs = $(install_sh) -d
|
|
||||||
CONFIG_HEADER = $(top_builddir)/config.h \
|
|
||||||
$(top_builddir)/hwloc-1.2.1/include/private/autogen/config.h \
|
|
||||||
$(top_builddir)/hwloc-1.2.1/include/hwloc/autogen/config.h
|
|
||||||
CONFIG_CLEAN_FILES =
|
|
||||||
CONFIG_CLEAN_VPATH_FILES =
|
|
||||||
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
|
|
||||||
am__vpath_adj = case $$p in \
|
|
||||||
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
|
|
||||||
*) f=$$p;; \
|
|
||||||
esac;
|
|
||||||
am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
|
|
||||||
am__install_max = 40
|
|
||||||
am__nobase_strip_setup = \
|
|
||||||
srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
|
|
||||||
am__nobase_strip = \
|
|
||||||
for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
|
|
||||||
am__nobase_list = $(am__nobase_strip_setup); \
|
|
||||||
for p in $$list; do echo "$$p $$p"; done | \
|
|
||||||
sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
|
|
||||||
$(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
|
|
||||||
if (++n[$$2] == $(am__install_max)) \
|
|
||||||
{ print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
|
|
||||||
END { for (dir in files) print dir, files[dir] }'
|
|
||||||
am__base_list = \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
|
|
||||||
sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
|
|
||||||
am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(xmldir)"
|
|
||||||
LTLIBRARIES = $(lib_LTLIBRARIES) $(noinst_LTLIBRARIES)
|
|
||||||
libhwloc_la_LIBADD =
|
|
||||||
am__libhwloc_la_SOURCES_DIST = topology.c traversal.c distances.c \
|
|
||||||
topology-synthetic.c bind.c cpuset.c misc.c topology-xml.c \
|
|
||||||
topology-solaris.c topology-linux.c topology-aix.c \
|
|
||||||
topology-osf.c topology-hpux.c topology-windows.c \
|
|
||||||
topology-darwin.c topology-freebsd.c topology-x86.c
|
|
||||||
@HWLOC_HAVE_XML_TRUE@am__objects_1 = topology-xml.lo
|
|
||||||
@HWLOC_HAVE_SOLARIS_TRUE@am__objects_2 = topology-solaris.lo
|
|
||||||
@HWLOC_HAVE_LINUX_TRUE@am__objects_3 = topology-linux.lo
|
|
||||||
@HWLOC_HAVE_AIX_TRUE@am__objects_4 = topology-aix.lo
|
|
||||||
@HWLOC_HAVE_OSF_TRUE@am__objects_5 = topology-osf.lo
|
|
||||||
@HWLOC_HAVE_HPUX_TRUE@am__objects_6 = topology-hpux.lo
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@am__objects_7 = topology-windows.lo
|
|
||||||
@HWLOC_HAVE_DARWIN_TRUE@am__objects_8 = topology-darwin.lo
|
|
||||||
@HWLOC_HAVE_FREEBSD_TRUE@am__objects_9 = topology-freebsd.lo
|
|
||||||
@HWLOC_HAVE_CPUID_TRUE@am__objects_10 = topology-x86.lo
|
|
||||||
am__objects_11 = topology.lo traversal.lo distances.lo \
|
|
||||||
topology-synthetic.lo bind.lo cpuset.lo misc.lo \
|
|
||||||
$(am__objects_1) $(am__objects_2) $(am__objects_3) \
|
|
||||||
$(am__objects_4) $(am__objects_5) $(am__objects_6) \
|
|
||||||
$(am__objects_7) $(am__objects_8) $(am__objects_9) \
|
|
||||||
$(am__objects_10)
|
|
||||||
am_libhwloc_la_OBJECTS = $(am__objects_11)
|
|
||||||
libhwloc_la_OBJECTS = $(am_libhwloc_la_OBJECTS)
|
|
||||||
libhwloc_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
|
||||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
|
||||||
$(libhwloc_la_LDFLAGS) $(LDFLAGS) -o $@
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@am_libhwloc_la_rpath = -rpath $(libdir)
|
|
||||||
libhwloc_embedded_la_LIBADD =
|
|
||||||
am__libhwloc_embedded_la_SOURCES_DIST = topology.c traversal.c \
|
|
||||||
distances.c topology-synthetic.c bind.c cpuset.c misc.c \
|
|
||||||
topology-xml.c topology-solaris.c topology-linux.c \
|
|
||||||
topology-aix.c topology-osf.c topology-hpux.c \
|
|
||||||
topology-windows.c topology-darwin.c topology-freebsd.c \
|
|
||||||
topology-x86.c
|
|
||||||
am_libhwloc_embedded_la_OBJECTS = $(am__objects_11)
|
|
||||||
libhwloc_embedded_la_OBJECTS = $(am_libhwloc_embedded_la_OBJECTS)
|
|
||||||
libhwloc_embedded_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
|
|
||||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
|
|
||||||
$(libhwloc_embedded_la_LDFLAGS) $(LDFLAGS) -o $@
|
|
||||||
@HWLOC_BUILD_STANDALONE_FALSE@am_libhwloc_embedded_la_rpath =
|
|
||||||
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) -I$(top_builddir)/hwloc-1.2.1/include/private/autogen -I$(top_builddir)/hwloc-1.2.1/include/hwloc/autogen
|
|
||||||
depcomp = $(SHELL) $(top_srcdir)/depcomp
|
|
||||||
am__depfiles_maybe = depfiles
|
|
||||||
am__mv = mv -f
|
|
||||||
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
|
|
||||||
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
LTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
|
||||||
--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
|
|
||||||
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
|
|
||||||
CCLD = $(CC)
|
|
||||||
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
|
|
||||||
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
|
|
||||||
$(LDFLAGS) -o $@
|
|
||||||
SOURCES = $(libhwloc_la_SOURCES) $(libhwloc_embedded_la_SOURCES)
|
|
||||||
DIST_SOURCES = $(am__libhwloc_la_SOURCES_DIST) \
|
|
||||||
$(am__libhwloc_embedded_la_SOURCES_DIST)
|
|
||||||
DATA = $(xml_DATA)
|
|
||||||
ETAGS = etags
|
|
||||||
CTAGS = ctags
|
|
||||||
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
|
|
||||||
ACLOCAL = @ACLOCAL@
|
|
||||||
AMTAR = @AMTAR@
|
|
||||||
AR = @AR@
|
|
||||||
AUTOCONF = @AUTOCONF@
|
|
||||||
AUTOHEADER = @AUTOHEADER@
|
|
||||||
AUTOMAKE = @AUTOMAKE@
|
|
||||||
AWK = @AWK@
|
|
||||||
BASH = @BASH@
|
|
||||||
CC = @CC@
|
|
||||||
CCDEPMODE = @CCDEPMODE@
|
|
||||||
CFLAGS = @CFLAGS@
|
|
||||||
CPP = @CPP@
|
|
||||||
CPPFLAGS = @CPPFLAGS@
|
|
||||||
CYGPATH_W = @CYGPATH_W@
|
|
||||||
DEFS = @DEFS@
|
|
||||||
DEPDIR = @DEPDIR@
|
|
||||||
DSYMUTIL = @DSYMUTIL@
|
|
||||||
DUMPBIN = @DUMPBIN@
|
|
||||||
ECHO_C = @ECHO_C@
|
|
||||||
ECHO_N = @ECHO_N@
|
|
||||||
ECHO_T = @ECHO_T@
|
|
||||||
EGREP = @EGREP@
|
|
||||||
EXEEXT = @EXEEXT@
|
|
||||||
FGREP = @FGREP@
|
|
||||||
GREP = @GREP@
|
|
||||||
HWLOC_CFLAGS = @HWLOC_CFLAGS@
|
|
||||||
HWLOC_CPPFLAGS = @HWLOC_CPPFLAGS@
|
|
||||||
HWLOC_EMBEDDED_CFLAGS = @HWLOC_EMBEDDED_CFLAGS@
|
|
||||||
HWLOC_EMBEDDED_CPPFLAGS = @HWLOC_EMBEDDED_CPPFLAGS@
|
|
||||||
HWLOC_EMBEDDED_LDADD = @HWLOC_EMBEDDED_LDADD@
|
|
||||||
HWLOC_EMBEDDED_LIBS = @HWLOC_EMBEDDED_LIBS@
|
|
||||||
HWLOC_HAVE_XML = @HWLOC_HAVE_XML@
|
|
||||||
HWLOC_KERRIGHED_CFLAGS = @HWLOC_KERRIGHED_CFLAGS@
|
|
||||||
HWLOC_KERRIGHED_LIBS = @HWLOC_KERRIGHED_LIBS@
|
|
||||||
HWLOC_LDFLAGS = @HWLOC_LDFLAGS@
|
|
||||||
HWLOC_LIBS = @HWLOC_LIBS@
|
|
||||||
HWLOC_LINUX_LIBNUMA_LIBS = @HWLOC_LINUX_LIBNUMA_LIBS@
|
|
||||||
HWLOC_MS_LIB = @HWLOC_MS_LIB@
|
|
||||||
HWLOC_PKG_CONFIG = @HWLOC_PKG_CONFIG@
|
|
||||||
HWLOC_REQUIRES = @HWLOC_REQUIRES@
|
|
||||||
HWLOC_XML_CFLAGS = @HWLOC_XML_CFLAGS@
|
|
||||||
HWLOC_XML_LIBS = @HWLOC_XML_LIBS@
|
|
||||||
HWLOC_top_builddir = @HWLOC_top_builddir@
|
|
||||||
HWLOC_top_srcdir = @HWLOC_top_srcdir@
|
|
||||||
INSTALL = @INSTALL@
|
|
||||||
INSTALL_DATA = @INSTALL_DATA@
|
|
||||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
|
||||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
|
||||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
|
||||||
LD = @LD@
|
|
||||||
LDFLAGS = @LDFLAGS@
|
|
||||||
LIBOBJS = @LIBOBJS@
|
|
||||||
LIBS = @LIBS@
|
|
||||||
LIBTOOL = @LIBTOOL@
|
|
||||||
LIPO = @LIPO@
|
|
||||||
LN_S = @LN_S@
|
|
||||||
LTLIBOBJS = @LTLIBOBJS@
|
|
||||||
MAKEINFO = @MAKEINFO@
|
|
||||||
MKDIR_P = @MKDIR_P@
|
|
||||||
NM = @NM@
|
|
||||||
NMEDIT = @NMEDIT@
|
|
||||||
OBJDUMP = @OBJDUMP@
|
|
||||||
OBJEXT = @OBJEXT@
|
|
||||||
OTOOL = @OTOOL@
|
|
||||||
OTOOL64 = @OTOOL64@
|
|
||||||
PACKAGE = @PACKAGE@
|
|
||||||
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
|
|
||||||
PACKAGE_NAME = @PACKAGE_NAME@
|
|
||||||
PACKAGE_STRING = @PACKAGE_STRING@
|
|
||||||
PACKAGE_TARNAME = @PACKAGE_TARNAME@
|
|
||||||
PACKAGE_URL = @PACKAGE_URL@
|
|
||||||
PACKAGE_VERSION = @PACKAGE_VERSION@
|
|
||||||
PATH_SEPARATOR = @PATH_SEPARATOR@
|
|
||||||
RANLIB = @RANLIB@
|
|
||||||
SED = @SED@
|
|
||||||
SET_MAKE = @SET_MAKE@
|
|
||||||
SHELL = @SHELL@
|
|
||||||
STRIP = @STRIP@
|
|
||||||
VERSION = @VERSION@
|
|
||||||
abs_builddir = @abs_builddir@
|
|
||||||
abs_srcdir = @abs_srcdir@
|
|
||||||
abs_top_builddir = @abs_top_builddir@
|
|
||||||
abs_top_srcdir = @abs_top_srcdir@
|
|
||||||
ac_ct_CC = @ac_ct_CC@
|
|
||||||
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
|
|
||||||
am__include = @am__include@
|
|
||||||
am__leading_dot = @am__leading_dot@
|
|
||||||
am__quote = @am__quote@
|
|
||||||
am__tar = @am__tar@
|
|
||||||
am__untar = @am__untar@
|
|
||||||
bindir = @bindir@
|
|
||||||
build = @build@
|
|
||||||
build_alias = @build_alias@
|
|
||||||
build_cpu = @build_cpu@
|
|
||||||
build_os = @build_os@
|
|
||||||
build_vendor = @build_vendor@
|
|
||||||
builddir = @builddir@
|
|
||||||
datadir = @datadir@
|
|
||||||
datarootdir = @datarootdir@
|
|
||||||
docdir = @docdir@
|
|
||||||
dvidir = @dvidir@
|
|
||||||
exec_prefix = @exec_prefix@
|
|
||||||
host = @host@
|
|
||||||
host_alias = @host_alias@
|
|
||||||
host_cpu = @host_cpu@
|
|
||||||
host_os = @host_os@
|
|
||||||
host_vendor = @host_vendor@
|
|
||||||
htmldir = @htmldir@
|
|
||||||
includedir = @includedir@
|
|
||||||
infodir = @infodir@
|
|
||||||
install_sh = @install_sh@
|
|
||||||
libdir = @libdir@
|
|
||||||
libexecdir = @libexecdir@
|
|
||||||
localedir = @localedir@
|
|
||||||
localstatedir = @localstatedir@
|
|
||||||
mandir = @mandir@
|
|
||||||
mkdir_p = @mkdir_p@
|
|
||||||
oldincludedir = @oldincludedir@
|
|
||||||
pdfdir = @pdfdir@
|
|
||||||
prefix = @prefix@
|
|
||||||
program_transform_name = @program_transform_name@
|
|
||||||
psdir = @psdir@
|
|
||||||
sbindir = @sbindir@
|
|
||||||
sharedstatedir = @sharedstatedir@
|
|
||||||
srcdir = @srcdir@
|
|
||||||
sysconfdir = @sysconfdir@
|
|
||||||
target = @target@
|
|
||||||
target_alias = @target_alias@
|
|
||||||
target_cpu = @target_cpu@
|
|
||||||
target_os = @target_os@
|
|
||||||
target_vendor = @target_vendor@
|
|
||||||
top_build_prefix = @top_build_prefix@
|
|
||||||
top_builddir = @top_builddir@
|
|
||||||
top_srcdir = @top_srcdir@
|
|
||||||
AM_CFLAGS = $(HWLOC_CFLAGS)
|
|
||||||
AM_CPPFLAGS = $(HWLOC_CPPFLAGS)
|
|
||||||
AM_LDFLAGS = $(HWLOC_LDFLAGS)
|
|
||||||
EXTRA_DIST = dolib.c $(am__append_16)
|
|
||||||
|
|
||||||
# If we're in standalone mode, build the installable library.
|
|
||||||
# Otherwise, build the embedded library.
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@lib_LTLIBRARIES = libhwloc.la
|
|
||||||
@HWLOC_BUILD_STANDALONE_FALSE@noinst_LTLIBRARIES = libhwloc_embedded.la
|
|
||||||
|
|
||||||
# Sources and ldflags
|
|
||||||
sources = topology.c traversal.c distances.c topology-synthetic.c \
|
|
||||||
bind.c cpuset.c misc.c $(am__append_1) $(am__append_2) \
|
|
||||||
$(am__append_3) $(am__append_4) $(am__append_6) \
|
|
||||||
$(am__append_8) $(am__append_10) $(am__append_11) \
|
|
||||||
$(am__append_12) $(am__append_15)
|
|
||||||
ldflags = $(am__append_5) $(am__append_7) $(am__append_9) \
|
|
||||||
$(am__append_13) $(am__append_14)
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@LC_MESSAGES = C
|
|
||||||
|
|
||||||
# Installable library
|
|
||||||
libhwloc_la_SOURCES = $(sources)
|
|
||||||
libhwloc_la_LDFLAGS = $(ldflags) -version-number $(libhwloc_so_version) $(HWLOC_XML_LIBS) $(HWLOC_LINUX_LIBNUMA_LIBS)
|
|
||||||
|
|
||||||
# Embedded library (note the lack of a .so version number -- that
|
|
||||||
# intentionally only appears in the installable library)
|
|
||||||
libhwloc_embedded_la_SOURCES = $(sources)
|
|
||||||
libhwloc_embedded_la_LDFLAGS = $(ldflags) $(HWLOC_XML_LIBS) $(HWLOC_LINUX_LIBNUMA_LIBS)
|
|
||||||
|
|
||||||
# XML data (only install if we're building in standalone mode)
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@xml_DATA = $(srcdir)/hwloc.dtd
|
|
||||||
@HWLOC_BUILD_STANDALONE_TRUE@xmldir = $(pkgdatadir)
|
|
||||||
all: all-am
|
|
||||||
|
|
||||||
.SUFFIXES:
|
|
||||||
.SUFFIXES: .c .lo .o .obj
|
|
||||||
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
|
|
||||||
@for dep in $?; do \
|
|
||||||
case '$(am__configure_deps)' in \
|
|
||||||
*$$dep*) \
|
|
||||||
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
|
|
||||||
&& { if test -f $@; then exit 0; else break; fi; }; \
|
|
||||||
exit 1;; \
|
|
||||||
esac; \
|
|
||||||
done; \
|
|
||||||
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu hwloc-1.2.1/src/Makefile'; \
|
|
||||||
$(am__cd) $(top_srcdir) && \
|
|
||||||
$(AUTOMAKE) --gnu hwloc-1.2.1/src/Makefile
|
|
||||||
.PRECIOUS: Makefile
|
|
||||||
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
|
|
||||||
@case '$?' in \
|
|
||||||
*config.status*) \
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
|
|
||||||
*) \
|
|
||||||
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
|
|
||||||
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
|
|
||||||
esac;
|
|
||||||
|
|
||||||
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
|
|
||||||
$(top_srcdir)/configure: $(am__configure_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
|
|
||||||
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
|
|
||||||
$(am__aclocal_m4_deps):
|
|
||||||
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(libdir)" || $(MKDIR_P) "$(DESTDIR)$(libdir)"
|
|
||||||
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
|
||||||
list2=; for p in $$list; do \
|
|
||||||
if test -f $$p; then \
|
|
||||||
list2="$$list2 $$p"; \
|
|
||||||
else :; fi; \
|
|
||||||
done; \
|
|
||||||
test -z "$$list2" || { \
|
|
||||||
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
|
|
||||||
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
|
|
||||||
}
|
|
||||||
|
|
||||||
uninstall-libLTLIBRARIES:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
|
|
||||||
for p in $$list; do \
|
|
||||||
$(am__strip_dir) \
|
|
||||||
echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
|
|
||||||
$(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
|
|
||||||
done
|
|
||||||
|
|
||||||
clean-libLTLIBRARIES:
|
|
||||||
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
|
|
||||||
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
|
|
||||||
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
|
||||||
test "$$dir" != "$$p" || dir=.; \
|
|
||||||
echo "rm -f \"$${dir}/so_locations\""; \
|
|
||||||
rm -f "$${dir}/so_locations"; \
|
|
||||||
done
|
|
||||||
|
|
||||||
clean-noinstLTLIBRARIES:
|
|
||||||
-test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES)
|
|
||||||
@list='$(noinst_LTLIBRARIES)'; for p in $$list; do \
|
|
||||||
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
|
|
||||||
test "$$dir" != "$$p" || dir=.; \
|
|
||||||
echo "rm -f \"$${dir}/so_locations\""; \
|
|
||||||
rm -f "$${dir}/so_locations"; \
|
|
||||||
done
|
|
||||||
libhwloc.la: $(libhwloc_la_OBJECTS) $(libhwloc_la_DEPENDENCIES)
|
|
||||||
$(libhwloc_la_LINK) $(am_libhwloc_la_rpath) $(libhwloc_la_OBJECTS) $(libhwloc_la_LIBADD) $(LIBS)
|
|
||||||
libhwloc_embedded.la: $(libhwloc_embedded_la_OBJECTS) $(libhwloc_embedded_la_DEPENDENCIES)
|
|
||||||
$(libhwloc_embedded_la_LINK) $(am_libhwloc_embedded_la_rpath) $(libhwloc_embedded_la_OBJECTS) $(libhwloc_embedded_la_LIBADD) $(LIBS)
|
|
||||||
|
|
||||||
mostlyclean-compile:
|
|
||||||
-rm -f *.$(OBJEXT)
|
|
||||||
|
|
||||||
distclean-compile:
|
|
||||||
-rm -f *.tab.c
|
|
||||||
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bind.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpuset.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/distances.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/misc.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-aix.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-darwin.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-freebsd.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-hpux.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-linux.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-osf.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-solaris.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-synthetic.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-windows.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-x86.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology-xml.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/topology.Plo@am__quote@
|
|
||||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/traversal.Plo@am__quote@
|
|
||||||
|
|
||||||
.c.o:
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(COMPILE) -c $<
|
|
||||||
|
|
||||||
.c.obj:
|
|
||||||
@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'`
|
|
||||||
|
|
||||||
.c.lo:
|
|
||||||
@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
|
|
||||||
@am__fastdepCC_TRUE@ $(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
|
|
||||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
|
||||||
@am__fastdepCC_FALSE@ $(LTCOMPILE) -c -o $@ $<
|
|
||||||
|
|
||||||
mostlyclean-libtool:
|
|
||||||
-rm -f *.lo
|
|
||||||
|
|
||||||
clean-libtool:
|
|
||||||
-rm -rf .libs _libs
|
|
||||||
install-xmlDATA: $(xml_DATA)
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
test -z "$(xmldir)" || $(MKDIR_P) "$(DESTDIR)$(xmldir)"
|
|
||||||
@list='$(xml_DATA)'; test -n "$(xmldir)" || list=; \
|
|
||||||
for p in $$list; do \
|
|
||||||
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
|
|
||||||
echo "$$d$$p"; \
|
|
||||||
done | $(am__base_list) | \
|
|
||||||
while read files; do \
|
|
||||||
echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(xmldir)'"; \
|
|
||||||
$(INSTALL_DATA) $$files "$(DESTDIR)$(xmldir)" || exit $$?; \
|
|
||||||
done
|
|
||||||
|
|
||||||
uninstall-xmlDATA:
|
|
||||||
@$(NORMAL_UNINSTALL)
|
|
||||||
@list='$(xml_DATA)'; test -n "$(xmldir)" || list=; \
|
|
||||||
files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
|
|
||||||
test -n "$$files" || exit 0; \
|
|
||||||
echo " ( cd '$(DESTDIR)$(xmldir)' && rm -f" $$files ")"; \
|
|
||||||
cd "$(DESTDIR)$(xmldir)" && rm -f $$files
|
|
||||||
|
|
||||||
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
mkid -fID $$unique
|
|
||||||
tags: TAGS
|
|
||||||
|
|
||||||
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
set x; \
|
|
||||||
here=`pwd`; \
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
shift; \
|
|
||||||
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
|
|
||||||
test -n "$$unique" || unique=$$empty_fix; \
|
|
||||||
if test $$# -gt 0; then \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
"$$@" $$unique; \
|
|
||||||
else \
|
|
||||||
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
|
|
||||||
$$unique; \
|
|
||||||
fi; \
|
|
||||||
fi
|
|
||||||
ctags: CTAGS
|
|
||||||
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
|
|
||||||
$(TAGS_FILES) $(LISP)
|
|
||||||
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
|
|
||||||
unique=`for i in $$list; do \
|
|
||||||
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
|
|
||||||
done | \
|
|
||||||
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
|
|
||||||
END { if (nonempty) { for (i in files) print i; }; }'`; \
|
|
||||||
test -z "$(CTAGS_ARGS)$$unique" \
|
|
||||||
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
|
|
||||||
$$unique
|
|
||||||
|
|
||||||
GTAGS:
|
|
||||||
here=`$(am__cd) $(top_builddir) && pwd` \
|
|
||||||
&& $(am__cd) $(top_srcdir) \
|
|
||||||
&& gtags -i $(GTAGS_ARGS) "$$here"
|
|
||||||
|
|
||||||
distclean-tags:
|
|
||||||
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
|
|
||||||
|
|
||||||
distdir: $(DISTFILES)
|
|
||||||
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
|
|
||||||
list='$(DISTFILES)'; \
|
|
||||||
dist_files=`for file in $$list; do echo $$file; done | \
|
|
||||||
sed -e "s|^$$srcdirstrip/||;t" \
|
|
||||||
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
|
|
||||||
case $$dist_files in \
|
|
||||||
*/*) $(MKDIR_P) `echo "$$dist_files" | \
|
|
||||||
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
|
|
||||||
sort -u` ;; \
|
|
||||||
esac; \
|
|
||||||
for file in $$dist_files; do \
|
|
||||||
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
|
|
||||||
if test -d $$d/$$file; then \
|
|
||||||
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
|
|
||||||
if test -d "$(distdir)/$$file"; then \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
|
|
||||||
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
|
|
||||||
fi; \
|
|
||||||
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
|
|
||||||
else \
|
|
||||||
test -f "$(distdir)/$$file" \
|
|
||||||
|| cp -p $$d/$$file "$(distdir)/$$file" \
|
|
||||||
|| exit 1; \
|
|
||||||
fi; \
|
|
||||||
done
|
|
||||||
check-am: all-am
|
|
||||||
check: check-am
|
|
||||||
@HWLOC_HAVE_MS_LIB_FALSE@all-local:
|
|
||||||
@HWLOC_HAVE_WINDOWS_FALSE@all-local:
|
|
||||||
all-am: Makefile $(LTLIBRARIES) $(DATA) all-local
|
|
||||||
installdirs:
|
|
||||||
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(xmldir)"; do \
|
|
||||||
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
|
|
||||||
done
|
|
||||||
install: install-am
|
|
||||||
install-exec: install-exec-am
|
|
||||||
install-data: install-data-am
|
|
||||||
uninstall: uninstall-am
|
|
||||||
|
|
||||||
install-am: all-am
|
|
||||||
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
|
|
||||||
|
|
||||||
installcheck: installcheck-am
|
|
||||||
install-strip:
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
|
|
||||||
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
|
|
||||||
`test -z '$(STRIP)' || \
|
|
||||||
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
|
|
||||||
mostlyclean-generic:
|
|
||||||
|
|
||||||
clean-generic:
|
|
||||||
|
|
||||||
distclean-generic:
|
|
||||||
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
|
|
||||||
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
|
|
||||||
|
|
||||||
maintainer-clean-generic:
|
|
||||||
@echo "This command is intended for maintainers to use"
|
|
||||||
@echo "it deletes files that may require special tools to rebuild."
|
|
||||||
@HWLOC_HAVE_WINDOWS_FALSE@install-exec-hook:
|
|
||||||
clean: clean-am
|
|
||||||
|
|
||||||
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
|
|
||||||
clean-noinstLTLIBRARIES mostlyclean-am
|
|
||||||
|
|
||||||
distclean: distclean-am
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
distclean-am: clean-am distclean-compile distclean-generic \
|
|
||||||
distclean-tags
|
|
||||||
|
|
||||||
dvi: dvi-am
|
|
||||||
|
|
||||||
dvi-am:
|
|
||||||
|
|
||||||
html: html-am
|
|
||||||
|
|
||||||
html-am:
|
|
||||||
|
|
||||||
info: info-am
|
|
||||||
|
|
||||||
info-am:
|
|
||||||
|
|
||||||
install-data-am: install-xmlDATA
|
|
||||||
|
|
||||||
install-dvi: install-dvi-am
|
|
||||||
|
|
||||||
install-dvi-am:
|
|
||||||
|
|
||||||
install-exec-am: install-libLTLIBRARIES
|
|
||||||
@$(NORMAL_INSTALL)
|
|
||||||
$(MAKE) $(AM_MAKEFLAGS) install-exec-hook
|
|
||||||
install-html: install-html-am
|
|
||||||
|
|
||||||
install-html-am:
|
|
||||||
|
|
||||||
install-info: install-info-am
|
|
||||||
|
|
||||||
install-info-am:
|
|
||||||
|
|
||||||
install-man:
|
|
||||||
|
|
||||||
install-pdf: install-pdf-am
|
|
||||||
|
|
||||||
install-pdf-am:
|
|
||||||
|
|
||||||
install-ps: install-ps-am
|
|
||||||
|
|
||||||
install-ps-am:
|
|
||||||
|
|
||||||
installcheck-am:
|
|
||||||
|
|
||||||
maintainer-clean: maintainer-clean-am
|
|
||||||
-rm -rf ./$(DEPDIR)
|
|
||||||
-rm -f Makefile
|
|
||||||
maintainer-clean-am: distclean-am maintainer-clean-generic
|
|
||||||
|
|
||||||
mostlyclean: mostlyclean-am
|
|
||||||
|
|
||||||
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
|
|
||||||
mostlyclean-libtool
|
|
||||||
|
|
||||||
pdf: pdf-am
|
|
||||||
|
|
||||||
pdf-am:
|
|
||||||
|
|
||||||
ps: ps-am
|
|
||||||
|
|
||||||
ps-am:
|
|
||||||
|
|
||||||
uninstall-am: uninstall-libLTLIBRARIES uninstall-xmlDATA
|
|
||||||
|
|
||||||
.MAKE: install-am install-exec-am install-strip
|
|
||||||
|
|
||||||
.PHONY: CTAGS GTAGS all all-am all-local check check-am clean \
|
|
||||||
clean-generic clean-libLTLIBRARIES clean-libtool \
|
|
||||||
clean-noinstLTLIBRARIES ctags distclean distclean-compile \
|
|
||||||
distclean-generic distclean-libtool distclean-tags distdir dvi \
|
|
||||||
dvi-am html html-am info info-am install install-am \
|
|
||||||
install-data install-data-am install-dvi install-dvi-am \
|
|
||||||
install-exec install-exec-am install-exec-hook install-html \
|
|
||||||
install-html-am install-info install-info-am \
|
|
||||||
install-libLTLIBRARIES install-man install-pdf install-pdf-am \
|
|
||||||
install-ps install-ps-am install-strip install-xmlDATA \
|
|
||||||
installcheck installcheck-am installdirs maintainer-clean \
|
|
||||||
maintainer-clean-generic mostlyclean mostlyclean-compile \
|
|
||||||
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
|
|
||||||
tags uninstall uninstall-am uninstall-libLTLIBRARIES \
|
|
||||||
uninstall-xmlDATA
|
|
||||||
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@export LC_MESSAGES
|
|
||||||
|
|
||||||
@HWLOC_HAVE_MS_LIB_TRUE@@HWLOC_HAVE_WINDOWS_TRUE@.libs/libhwloc.lib: libhwloc.la dolib
|
|
||||||
@HWLOC_HAVE_MS_LIB_TRUE@@HWLOC_HAVE_WINDOWS_TRUE@ ./dolib "$(HWLOC_MS_LIB)" X86 .libs/libhwloc.def libhwloc-$(HWLOC_SOVERSION) .libs/libhwloc.lib
|
|
||||||
@HWLOC_HAVE_MS_LIB_TRUE@@HWLOC_HAVE_WINDOWS_TRUE@all-local: .libs/libhwloc.lib
|
|
||||||
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@install-exec-hook:
|
|
||||||
@HWLOC_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libhwloc.def $(DESTDIR)$(libdir)
|
|
||||||
@HWLOC_HAVE_MS_LIB_TRUE@@HWLOC_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libhwloc.lib $(DESTDIR)$(libdir)
|
|
||||||
@HWLOC_HAVE_MS_LIB_TRUE@@HWLOC_HAVE_WINDOWS_TRUE@ $(INSTALL) .libs/libhwloc.exp $(DESTDIR)$(libdir)
|
|
||||||
|
|
||||||
# Tell versions [3.59,3.63) of GNU make to not export all variables.
|
|
||||||
# Otherwise a system limit (for SysV at least) may be exceeded.
|
|
||||||
.NOEXPORT:
|
|
|
@ -1,552 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <hwloc/helper.h>
|
|
||||||
#ifdef HAVE_SYS_MMAN_H
|
|
||||||
# include <sys/mman.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_MALLOC_H
|
|
||||||
# include <malloc.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
/* TODO: HWLOC_GNU_SYS, HWLOC_IRIX_SYS,
|
|
||||||
*
|
|
||||||
* IRIX: see MP_MUSTRUN / _DSM_MUSTRUN, pthread_setrunon_np, /hw, procss_cpulink, numa_create
|
|
||||||
*
|
|
||||||
* We could use glibc's sched_setaffinity generically when it is available
|
|
||||||
*
|
|
||||||
* Darwin and OpenBSD don't seem to have binding facilities.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static hwloc_const_bitmap_t
|
|
||||||
hwloc_fix_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t set)
|
|
||||||
{
|
|
||||||
hwloc_const_bitmap_t topology_set = hwloc_topology_get_topology_cpuset(topology);
|
|
||||||
hwloc_const_bitmap_t complete_set = hwloc_topology_get_complete_cpuset(topology);
|
|
||||||
|
|
||||||
if (!topology_set) {
|
|
||||||
/* The topology is composed of several systems, the cpuset is ambiguous. */
|
|
||||||
errno = EXDEV;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_iszero(set)) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hwloc_bitmap_isincluded(set, complete_set)) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isincluded(topology_set, set))
|
|
||||||
set = complete_set;
|
|
||||||
|
|
||||||
return set;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
set = hwloc_fix_cpubind(topology, set);
|
|
||||||
if (!set)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (flags & HWLOC_CPUBIND_PROCESS) {
|
|
||||||
if (topology->set_thisproc_cpubind)
|
|
||||||
return topology->set_thisproc_cpubind(topology, set, flags);
|
|
||||||
} else if (flags & HWLOC_CPUBIND_THREAD) {
|
|
||||||
if (topology->set_thisthread_cpubind)
|
|
||||||
return topology->set_thisthread_cpubind(topology, set, flags);
|
|
||||||
} else {
|
|
||||||
if (topology->set_thisproc_cpubind)
|
|
||||||
return topology->set_thisproc_cpubind(topology, set, flags);
|
|
||||||
else if (topology->set_thisthread_cpubind)
|
|
||||||
return topology->set_thisthread_cpubind(topology, set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_cpubind(hwloc_topology_t topology, hwloc_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
if (flags & HWLOC_CPUBIND_PROCESS) {
|
|
||||||
if (topology->get_thisproc_cpubind)
|
|
||||||
return topology->get_thisproc_cpubind(topology, set, flags);
|
|
||||||
} else if (flags & HWLOC_CPUBIND_THREAD) {
|
|
||||||
if (topology->get_thisthread_cpubind)
|
|
||||||
return topology->get_thisthread_cpubind(topology, set, flags);
|
|
||||||
} else {
|
|
||||||
if (topology->get_thisproc_cpubind)
|
|
||||||
return topology->get_thisproc_cpubind(topology, set, flags);
|
|
||||||
else if (topology->get_thisthread_cpubind)
|
|
||||||
return topology->get_thisthread_cpubind(topology, set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
set = hwloc_fix_cpubind(topology, set);
|
|
||||||
if (!set)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (topology->set_proc_cpubind)
|
|
||||||
return topology->set_proc_cpubind(topology, pid, set, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
if (topology->get_proc_cpubind)
|
|
||||||
return topology->get_proc_cpubind(topology, pid, set, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef hwloc_thread_t
|
|
||||||
int
|
|
||||||
hwloc_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_const_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
set = hwloc_fix_cpubind(topology, set);
|
|
||||||
if (!set)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (topology->set_thread_cpubind)
|
|
||||||
return topology->set_thread_cpubind(topology, tid, set, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t tid, hwloc_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
if (topology->get_thread_cpubind)
|
|
||||||
return topology->get_thread_cpubind(topology, tid, set, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_last_cpu_location(hwloc_topology_t topology, hwloc_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
if (flags & HWLOC_CPUBIND_PROCESS) {
|
|
||||||
if (topology->get_thisproc_last_cpu_location)
|
|
||||||
return topology->get_thisproc_last_cpu_location(topology, set, flags);
|
|
||||||
} else if (flags & HWLOC_CPUBIND_THREAD) {
|
|
||||||
if (topology->get_thisthread_last_cpu_location)
|
|
||||||
return topology->get_thisthread_last_cpu_location(topology, set, flags);
|
|
||||||
} else {
|
|
||||||
if (topology->get_thisproc_last_cpu_location)
|
|
||||||
return topology->get_thisproc_last_cpu_location(topology, set, flags);
|
|
||||||
else if (topology->get_thisthread_last_cpu_location)
|
|
||||||
return topology->get_thisthread_last_cpu_location(topology, set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_proc_last_cpu_location(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t set, int flags)
|
|
||||||
{
|
|
||||||
if (topology->get_proc_last_cpu_location)
|
|
||||||
return topology->get_proc_last_cpu_location(topology, pid, set, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static hwloc_const_nodeset_t
|
|
||||||
hwloc_fix_membind(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset)
|
|
||||||
{
|
|
||||||
hwloc_const_bitmap_t topology_nodeset = hwloc_topology_get_topology_nodeset(topology);
|
|
||||||
hwloc_const_bitmap_t complete_nodeset = hwloc_topology_get_complete_nodeset(topology);
|
|
||||||
|
|
||||||
if (!hwloc_topology_get_topology_cpuset(topology)) {
|
|
||||||
/* The topology is composed of several systems, the nodeset is thus
|
|
||||||
* ambiguous. */
|
|
||||||
errno = EXDEV;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!complete_nodeset) {
|
|
||||||
/* There is no NUMA node */
|
|
||||||
errno = ENODEV;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_iszero(nodeset)) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hwloc_bitmap_isincluded(nodeset, complete_nodeset)) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isincluded(topology_nodeset, nodeset))
|
|
||||||
return complete_nodeset;
|
|
||||||
|
|
||||||
return nodeset;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_fix_membind_cpuset(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_const_cpuset_t cpuset)
|
|
||||||
{
|
|
||||||
hwloc_const_bitmap_t topology_set = hwloc_topology_get_topology_cpuset(topology);
|
|
||||||
hwloc_const_bitmap_t complete_set = hwloc_topology_get_complete_cpuset(topology);
|
|
||||||
hwloc_const_bitmap_t complete_nodeset = hwloc_topology_get_complete_nodeset(topology);
|
|
||||||
|
|
||||||
if (!topology_set) {
|
|
||||||
/* The topology is composed of several systems, the cpuset is thus
|
|
||||||
* ambiguous. */
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!complete_nodeset) {
|
|
||||||
/* There is no NUMA node */
|
|
||||||
errno = ENODEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_iszero(cpuset)) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hwloc_bitmap_isincluded(cpuset, complete_set)) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isincluded(topology_set, cpuset)) {
|
|
||||||
hwloc_bitmap_copy(nodeset, complete_nodeset);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_cpuset_to_nodeset(topology, cpuset, nodeset);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_membind_nodeset(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
nodeset = hwloc_fix_membind(topology, nodeset);
|
|
||||||
if (!nodeset)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (flags & HWLOC_MEMBIND_PROCESS) {
|
|
||||||
if (topology->set_thisproc_membind)
|
|
||||||
return topology->set_thisproc_membind(topology, nodeset, policy, flags);
|
|
||||||
} else if (flags & HWLOC_MEMBIND_THREAD) {
|
|
||||||
if (topology->set_thisthread_membind)
|
|
||||||
return topology->set_thisthread_membind(topology, nodeset, policy, flags);
|
|
||||||
} else {
|
|
||||||
if (topology->set_thisproc_membind)
|
|
||||||
return topology->set_thisproc_membind(topology, nodeset, policy, flags);
|
|
||||||
else if (topology->set_thisthread_membind)
|
|
||||||
return topology->set_thisthread_membind(topology, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_membind(hwloc_topology_t topology, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset = hwloc_bitmap_alloc();
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (hwloc_fix_membind_cpuset(topology, nodeset, set))
|
|
||||||
ret = -1;
|
|
||||||
else
|
|
||||||
ret = hwloc_set_membind_nodeset(topology, nodeset, policy, flags);
|
|
||||||
|
|
||||||
hwloc_bitmap_free(nodeset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_membind_nodeset(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
if (flags & HWLOC_MEMBIND_PROCESS) {
|
|
||||||
if (topology->get_thisproc_membind)
|
|
||||||
return topology->get_thisproc_membind(topology, nodeset, policy, flags);
|
|
||||||
} else if (flags & HWLOC_MEMBIND_THREAD) {
|
|
||||||
if (topology->get_thisthread_membind)
|
|
||||||
return topology->get_thisthread_membind(topology, nodeset, policy, flags);
|
|
||||||
} else {
|
|
||||||
if (topology->get_thisproc_membind)
|
|
||||||
return topology->get_thisproc_membind(topology, nodeset, policy, flags);
|
|
||||||
else if (topology->get_thisthread_membind)
|
|
||||||
return topology->get_thisthread_membind(topology, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_membind(hwloc_topology_t topology, hwloc_cpuset_t set, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
nodeset = hwloc_bitmap_alloc();
|
|
||||||
ret = hwloc_get_membind_nodeset(topology, nodeset, policy, flags);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
hwloc_cpuset_from_nodeset(topology, set, nodeset);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
nodeset = hwloc_fix_membind(topology, nodeset);
|
|
||||||
if (!nodeset)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (topology->set_proc_membind)
|
|
||||||
return topology->set_proc_membind(topology, pid, nodeset, policy, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset = hwloc_bitmap_alloc();
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (hwloc_fix_membind_cpuset(topology, nodeset, set))
|
|
||||||
ret = -1;
|
|
||||||
else
|
|
||||||
ret = hwloc_set_proc_membind_nodeset(topology, pid, nodeset, policy, flags);
|
|
||||||
|
|
||||||
hwloc_bitmap_free(nodeset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_proc_membind_nodeset(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
if (topology->get_proc_membind)
|
|
||||||
return topology->get_proc_membind(topology, pid, nodeset, policy, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_cpuset_t set, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
nodeset = hwloc_bitmap_alloc();
|
|
||||||
ret = hwloc_get_proc_membind_nodeset(topology, pid, nodeset, policy, flags);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
hwloc_cpuset_from_nodeset(topology, set, nodeset);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
nodeset = hwloc_fix_membind(topology, nodeset);
|
|
||||||
if (!nodeset)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (topology->set_area_membind)
|
|
||||||
return topology->set_area_membind(topology, addr, len, nodeset, policy, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset = hwloc_bitmap_alloc();
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (hwloc_fix_membind_cpuset(topology, nodeset, set))
|
|
||||||
ret = -1;
|
|
||||||
else
|
|
||||||
ret = hwloc_set_area_membind_nodeset(topology, addr, len, nodeset, policy, flags);
|
|
||||||
|
|
||||||
hwloc_bitmap_free(nodeset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_area_membind_nodeset(hwloc_topology_t topology, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
if (topology->get_area_membind)
|
|
||||||
return topology->get_area_membind(topology, addr, len, nodeset, policy, flags);
|
|
||||||
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_cpuset_t set, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
nodeset = hwloc_bitmap_alloc();
|
|
||||||
ret = hwloc_get_area_membind_nodeset(topology, addr, len, nodeset, policy, flags);
|
|
||||||
|
|
||||||
if (!ret)
|
|
||||||
hwloc_cpuset_from_nodeset(topology, set, nodeset);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
hwloc_alloc_heap(hwloc_topology_t topology __hwloc_attribute_unused, size_t len)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
#if defined(HAVE_GETPAGESIZE) && defined(HAVE_POSIX_MEMALIGN)
|
|
||||||
errno = posix_memalign(&p, getpagesize(), len);
|
|
||||||
if (errno)
|
|
||||||
p = NULL;
|
|
||||||
#elif defined(HAVE_GETPAGESIZE) && defined(HAVE_MEMALIGN)
|
|
||||||
p = memalign(getpagesize(), len);
|
|
||||||
#else
|
|
||||||
p = malloc(len);
|
|
||||||
#endif
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAP_ANONYMOUS
|
|
||||||
void *
|
|
||||||
hwloc_alloc_mmap(hwloc_topology_t topology __hwloc_attribute_unused, size_t len)
|
|
||||||
{
|
|
||||||
return mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_free_heap(hwloc_topology_t topology __hwloc_attribute_unused, void *addr, size_t len __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
free(addr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef MAP_ANONYMOUS
|
|
||||||
int
|
|
||||||
hwloc_free_mmap(hwloc_topology_t topology __hwloc_attribute_unused, void *addr, size_t len)
|
|
||||||
{
|
|
||||||
if (!addr)
|
|
||||||
return 0;
|
|
||||||
return munmap(addr, len);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void *
|
|
||||||
hwloc_alloc(hwloc_topology_t topology, size_t len)
|
|
||||||
{
|
|
||||||
if (topology->alloc)
|
|
||||||
return topology->alloc(topology, len);
|
|
||||||
return hwloc_alloc_heap(topology, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
hwloc_alloc_membind_nodeset(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
void *p;
|
|
||||||
nodeset = hwloc_fix_membind(topology, nodeset);
|
|
||||||
if (!nodeset)
|
|
||||||
goto fallback;
|
|
||||||
if (flags & HWLOC_MEMBIND_MIGRATE) {
|
|
||||||
errno = EINVAL;
|
|
||||||
goto fallback;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topology->alloc_membind)
|
|
||||||
return topology->alloc_membind(topology, len, nodeset, policy, flags);
|
|
||||||
else if (topology->set_area_membind) {
|
|
||||||
p = hwloc_alloc(topology, len);
|
|
||||||
if (!p)
|
|
||||||
return NULL;
|
|
||||||
if (topology->set_area_membind(topology, p, len, nodeset, policy, flags) && flags & HWLOC_MEMBIND_STRICT) {
|
|
||||||
int error = errno;
|
|
||||||
free(p);
|
|
||||||
errno = error;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
} else {
|
|
||||||
errno = ENOSYS;
|
|
||||||
}
|
|
||||||
|
|
||||||
fallback:
|
|
||||||
if (flags & HWLOC_MEMBIND_STRICT)
|
|
||||||
/* Report error */
|
|
||||||
return NULL;
|
|
||||||
/* Never mind, allocate anyway */
|
|
||||||
return hwloc_alloc(topology, len);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *
|
|
||||||
hwloc_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_cpuset_t set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
hwloc_nodeset_t nodeset = hwloc_bitmap_alloc();
|
|
||||||
void *ret;
|
|
||||||
|
|
||||||
if (!hwloc_fix_membind_cpuset(topology, nodeset, set)) {
|
|
||||||
if (flags & HWLOC_MEMBIND_STRICT)
|
|
||||||
ret = NULL;
|
|
||||||
else
|
|
||||||
ret = hwloc_alloc(topology, len);
|
|
||||||
} else
|
|
||||||
ret = hwloc_alloc_membind_nodeset(topology, len, nodeset, policy, flags);
|
|
||||||
|
|
||||||
hwloc_bitmap_free(nodeset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_free(hwloc_topology_t topology, void *addr, size_t len)
|
|
||||||
{
|
|
||||||
if (topology->free_membind)
|
|
||||||
return topology->free_membind(topology, addr, len);
|
|
||||||
return hwloc_free_heap(topology, addr, len);
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,719 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2010-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <float.h>
|
|
||||||
|
|
||||||
/* called during topology init */
|
|
||||||
void hwloc_topology_distances_init(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
for (i=0; i < HWLOC_OBJ_TYPE_MAX; i++) {
|
|
||||||
/* no distances yet */
|
|
||||||
topology->os_distances[i].nbobjs = 0;
|
|
||||||
topology->os_distances[i].objs = NULL;
|
|
||||||
topology->os_distances[i].indexes = NULL;
|
|
||||||
topology->os_distances[i].distances = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* called when reloading a topology.
|
|
||||||
* keep initial parameters (from set_distances and environment),
|
|
||||||
* but drop what was generated during previous load().
|
|
||||||
*/
|
|
||||||
void hwloc_topology_distances_clear(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
for (i=0; i < HWLOC_OBJ_TYPE_MAX; i++) {
|
|
||||||
/* remove final distance matrices, but keep physically-ordered ones */
|
|
||||||
free(topology->os_distances[i].objs);
|
|
||||||
topology->os_distances[i].objs = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* called during topology destroy */
|
|
||||||
void hwloc_topology_distances_destroy(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned i;
|
|
||||||
for (i=0; i < HWLOC_OBJ_TYPE_MAX; i++) {
|
|
||||||
/* remove final distance matrics AND physically-ordered ones */
|
|
||||||
free(topology->os_distances[i].indexes);
|
|
||||||
topology->os_distances[i].indexes = NULL;
|
|
||||||
free(topology->os_distances[i].objs);
|
|
||||||
topology->os_distances[i].objs = NULL;
|
|
||||||
free(topology->os_distances[i].distances);
|
|
||||||
topology->os_distances[i].distances = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* insert a distance matrix in the topology.
|
|
||||||
* the caller gives us those pointers, we take care of freeing them later and so on.
|
|
||||||
*/
|
|
||||||
void hwloc_topology__set_distance_matrix(hwloc_topology_t __hwloc_restrict topology, hwloc_obj_type_t type,
|
|
||||||
unsigned nbobjs, unsigned *indexes, hwloc_obj_t *objs, float *distances)
|
|
||||||
{
|
|
||||||
free(topology->os_distances[type].indexes);
|
|
||||||
free(topology->os_distances[type].objs);
|
|
||||||
free(topology->os_distances[type].distances);
|
|
||||||
topology->os_distances[type].nbobjs = nbobjs;
|
|
||||||
topology->os_distances[type].indexes = indexes;
|
|
||||||
topology->os_distances[type].objs = objs;
|
|
||||||
topology->os_distances[type].distances = distances;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* make sure a user-given distance matrix is sane */
|
|
||||||
static int hwloc_topology__check_distance_matrix(hwloc_topology_t __hwloc_restrict topology __hwloc_attribute_unused, hwloc_obj_type_t type __hwloc_attribute_unused,
|
|
||||||
unsigned nbobjs, unsigned *indexes, hwloc_obj_t *objs __hwloc_attribute_unused, float *distances __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
unsigned i,j;
|
|
||||||
/* make sure we don't have the same index twice */
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
for(j=i+1; j<nbobjs; j++)
|
|
||||||
if (indexes[i] == indexes[j]) {
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static hwloc_obj_t hwloc_find_obj_by_type_and_os_index(hwloc_obj_t root, hwloc_obj_type_t type, unsigned os_index)
|
|
||||||
{
|
|
||||||
hwloc_obj_t child;
|
|
||||||
if (root->type == type && root->os_index == os_index)
|
|
||||||
return root;
|
|
||||||
child = root->first_child;
|
|
||||||
while (child) {
|
|
||||||
hwloc_obj_t found = hwloc_find_obj_by_type_and_os_index(child, type, os_index);
|
|
||||||
if (found)
|
|
||||||
return found;
|
|
||||||
child = child->next_sibling;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hwloc_get_type_distances_from_string(struct hwloc_topology *topology,
|
|
||||||
hwloc_obj_type_t type, char *string)
|
|
||||||
{
|
|
||||||
/* the string format is: "index[0],...,index[N-1]:distance[0],...,distance[N*N-1]"
|
|
||||||
* or "index[0],...,index[N-1]:X*Y" or "index[0],...,index[N-1]:X*Y*Z"
|
|
||||||
*/
|
|
||||||
char *tmp = string, *next;
|
|
||||||
unsigned *indexes;
|
|
||||||
float *distances;
|
|
||||||
unsigned nbobjs = 0, i, j, x, y, z;
|
|
||||||
|
|
||||||
/* count indexes */
|
|
||||||
while (1) {
|
|
||||||
size_t size = strspn(tmp, "0123456789");
|
|
||||||
if (tmp[size] != ',') {
|
|
||||||
/* last element */
|
|
||||||
tmp += size;
|
|
||||||
nbobjs++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/* another index */
|
|
||||||
tmp += size+1;
|
|
||||||
nbobjs++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (*tmp != ':') {
|
|
||||||
fprintf(stderr, "Ignoring %s distances from environment variable, missing colon\n",
|
|
||||||
hwloc_obj_type_string(type));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
indexes = calloc(nbobjs, sizeof(unsigned));
|
|
||||||
distances = calloc(nbobjs*nbobjs, sizeof(float));
|
|
||||||
tmp = string;
|
|
||||||
|
|
||||||
/* parse indexes */
|
|
||||||
for(i=0; i<nbobjs; i++) {
|
|
||||||
indexes[i] = strtoul(tmp, &next, 0);
|
|
||||||
tmp = next+1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* parse distances */
|
|
||||||
z=1; /* default if sscanf finds only 2 values below */
|
|
||||||
if (sscanf(tmp, "%u*%u*%u", &x, &y, &z) >= 2) {
|
|
||||||
/* generate the matrix to create x groups of y elements */
|
|
||||||
if (x*y*z != nbobjs) {
|
|
||||||
fprintf(stderr, "Ignoring %s distances from environment variable, invalid grouping (%u*%u*%u=%u instead of %u)\n",
|
|
||||||
hwloc_obj_type_string(type), x, y, z, x*y*z, nbobjs);
|
|
||||||
free(indexes);
|
|
||||||
free(distances);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
for(j=0; j<nbobjs; j++)
|
|
||||||
if (i==j)
|
|
||||||
distances[i*nbobjs+j] = 1;
|
|
||||||
else if (i/z == j/z)
|
|
||||||
distances[i*nbobjs+j] = 2;
|
|
||||||
else if (i/z/y == j/z/y)
|
|
||||||
distances[i*nbobjs+j] = 4;
|
|
||||||
else
|
|
||||||
distances[i*nbobjs+j] = 8;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* parse a comma separated list of distances */
|
|
||||||
for(i=0; i<nbobjs*nbobjs; i++) {
|
|
||||||
distances[i] = atof(tmp);
|
|
||||||
next = strchr(tmp, ',');
|
|
||||||
if (next) {
|
|
||||||
tmp = next+1;
|
|
||||||
} else if (i!=nbobjs*nbobjs-1) {
|
|
||||||
fprintf(stderr, "Ignoring %s distances from environment variable, not enough values (%u out of %u)\n",
|
|
||||||
hwloc_obj_type_string(type), i+1, nbobjs*nbobjs);
|
|
||||||
free(indexes);
|
|
||||||
free(distances);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_topology__check_distance_matrix(topology, type, nbobjs, indexes, NULL, distances) < 0) {
|
|
||||||
fprintf(stderr, "Ignoring invalid %s distances from environment variable\n", hwloc_obj_type_string(type));
|
|
||||||
free(indexes);
|
|
||||||
free(distances);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_topology__set_distance_matrix(topology, type, nbobjs, indexes, NULL, distances);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* take distances in the environment, store them as is in the topology.
|
|
||||||
* we'll convert them into object later once the tree is filled
|
|
||||||
*/
|
|
||||||
void hwloc_store_distances_from_env(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
for(type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++) {
|
|
||||||
char *env, envname[64];
|
|
||||||
snprintf(envname, sizeof(envname), "HWLOC_%s_DISTANCES", hwloc_obj_type_string(type));
|
|
||||||
env = getenv(envname);
|
|
||||||
if (env)
|
|
||||||
hwloc_get_type_distances_from_string(topology, type, env);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* take the given distance, store them as is in the topology.
|
|
||||||
* we'll convert them into object later once the tree is filled.
|
|
||||||
*/
|
|
||||||
int hwloc_topology_set_distance_matrix(hwloc_topology_t __hwloc_restrict topology, hwloc_obj_type_t type,
|
|
||||||
unsigned nbobjs, unsigned *indexes, float *distances)
|
|
||||||
{
|
|
||||||
unsigned *_indexes;
|
|
||||||
float *_distances;
|
|
||||||
|
|
||||||
if (hwloc_topology__check_distance_matrix(topology, type, nbobjs, indexes, NULL, distances) < 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
/* copy the input arrays and give them to the topology */
|
|
||||||
_indexes = malloc(nbobjs*sizeof(unsigned));
|
|
||||||
memcpy(_indexes, indexes, nbobjs*sizeof(unsigned));
|
|
||||||
_distances = malloc(nbobjs*nbobjs*sizeof(float));
|
|
||||||
memcpy(_distances, distances, nbobjs*nbobjs*sizeof(float));
|
|
||||||
hwloc_topology__set_distance_matrix(topology, type, nbobjs, _indexes, NULL, _distances);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* cleanup everything we created from distances so that we may rebuild them
|
|
||||||
* at the end of restrict()
|
|
||||||
*/
|
|
||||||
void hwloc_restrict_distances(struct hwloc_topology *topology, unsigned long flags)
|
|
||||||
{
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
for(type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++) {
|
|
||||||
/* remove the objs array, we'll rebuild it from the indexes
|
|
||||||
* depending on remaining objects */
|
|
||||||
free(topology->os_distances[type].objs);
|
|
||||||
topology->os_distances[type].objs = NULL;
|
|
||||||
/* if not adapting distances, drop everything */
|
|
||||||
if (!(flags & HWLOC_RESTRICT_FLAG_ADAPT_DISTANCES)) {
|
|
||||||
free(topology->os_distances[type].indexes);
|
|
||||||
topology->os_distances[type].indexes = NULL;
|
|
||||||
free(topology->os_distances[type].distances);
|
|
||||||
topology->os_distances[type].distances = NULL;
|
|
||||||
topology->os_distances[type].nbobjs = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* convert distance indexes that were previously stored in the topology
|
|
||||||
* into actual objects if not done already.
|
|
||||||
* it's already done when distances come from backends.
|
|
||||||
* it's not done when distances come from the user.
|
|
||||||
*/
|
|
||||||
void hwloc_convert_distances_indexes_into_objects(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
for(type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++) {
|
|
||||||
unsigned nbobjs = topology->os_distances[type].nbobjs;
|
|
||||||
unsigned *indexes = topology->os_distances[type].indexes;
|
|
||||||
float *distances = topology->os_distances[type].distances;
|
|
||||||
unsigned i, j;
|
|
||||||
if (!topology->os_distances[type].objs) {
|
|
||||||
hwloc_obj_t *objs = calloc(nbobjs, sizeof(hwloc_obj_t));
|
|
||||||
/* traverse the topology and look for the relevant objects */
|
|
||||||
for(i=0; i<nbobjs; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_find_obj_by_type_and_os_index(topology->levels[0][0], type, indexes[i]);
|
|
||||||
if (!obj) {
|
|
||||||
|
|
||||||
/* shift the matrix */
|
|
||||||
#define OLDPOS(i,j) (distances+(i)*nbobjs+(j))
|
|
||||||
#define NEWPOS(i,j) (distances+(i)*(nbobjs-1)+(j))
|
|
||||||
if (i>0) {
|
|
||||||
/** no need to move beginning of 0th line */
|
|
||||||
for(j=0; j<i-1; j++)
|
|
||||||
/** move end of jth line + beginning of (j+1)th line */
|
|
||||||
memmove(NEWPOS(j,i), OLDPOS(j,i+1), (nbobjs-1)*sizeof(*distances));
|
|
||||||
/** move end of (i-1)th line */
|
|
||||||
memmove(NEWPOS(i-1,i), OLDPOS(i-1,i+1), (nbobjs-i-1)*sizeof(*distances));
|
|
||||||
}
|
|
||||||
if (i<nbobjs-1) {
|
|
||||||
/** move beginning of (i+1)th line */
|
|
||||||
memmove(NEWPOS(i,0), OLDPOS(i+1,0), i*sizeof(*distances));
|
|
||||||
/** move end of jth line + beginning of (j+1)th line */
|
|
||||||
for(j=i; j<nbobjs-1; j++)
|
|
||||||
memmove(NEWPOS(j,i), OLDPOS(j+1,i+1), (nbobjs-1)*sizeof(*distances));
|
|
||||||
/** move end of (nbobjs-2)th line */
|
|
||||||
memmove(NEWPOS(nbobjs-2,i), OLDPOS(nbobjs-1,i+1), (nbobjs-i-1)*sizeof(*distances));
|
|
||||||
}
|
|
||||||
|
|
||||||
/* shift the indexes array */
|
|
||||||
memmove(indexes+i, indexes+i+1, (nbobjs-i-1)*sizeof(*indexes));
|
|
||||||
|
|
||||||
/* update counters */
|
|
||||||
nbobjs--;
|
|
||||||
i--;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
objs[i] = obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
topology->os_distances[type].nbobjs = nbobjs;
|
|
||||||
if (!nbobjs) {
|
|
||||||
/* the whole matrix was invalid */
|
|
||||||
free(objs);
|
|
||||||
free(topology->os_distances[type].indexes);
|
|
||||||
topology->os_distances[type].indexes = NULL;
|
|
||||||
free(topology->os_distances[type].distances);
|
|
||||||
topology->os_distances[type].distances = NULL;
|
|
||||||
} else {
|
|
||||||
/* setup the objs array */
|
|
||||||
topology->os_distances[type].objs = objs;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc_setup_distances_from_os_matrix(struct hwloc_topology *topology,
|
|
||||||
unsigned nbobjs,
|
|
||||||
hwloc_obj_t *objs, float *osmatrix)
|
|
||||||
{
|
|
||||||
unsigned i, j, li, lj, minl;
|
|
||||||
float min = FLT_MAX, max = FLT_MIN;
|
|
||||||
hwloc_obj_t root;
|
|
||||||
float *matrix;
|
|
||||||
hwloc_cpuset_t set;
|
|
||||||
unsigned relative_depth;
|
|
||||||
int idx;
|
|
||||||
|
|
||||||
/* find the root */
|
|
||||||
set = hwloc_bitmap_alloc();
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
hwloc_bitmap_or(set, set, objs[i]->cpuset);
|
|
||||||
root = hwloc_get_obj_covering_cpuset(topology, set);
|
|
||||||
assert(root);
|
|
||||||
if (!hwloc_bitmap_isequal(set, root->cpuset)) {
|
|
||||||
/* partial distance matrix not including all the children of a single object */
|
|
||||||
/* TODO insert an intermediate object (group?) covering only these children ? */
|
|
||||||
hwloc_bitmap_free(set);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(set);
|
|
||||||
relative_depth = objs[0]->depth - root->depth; /* this assume that we have distances between objects of the same level */
|
|
||||||
|
|
||||||
/* get the logical index offset, it's the min of all logical indexes */
|
|
||||||
minl = UINT_MAX;
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
if (minl > objs[i]->logical_index)
|
|
||||||
minl = objs[i]->logical_index;
|
|
||||||
|
|
||||||
/* compute/check min/max values */
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
for(j=0; j<nbobjs; j++) {
|
|
||||||
float val = osmatrix[i*nbobjs+j];
|
|
||||||
if (val < min)
|
|
||||||
min = val;
|
|
||||||
if (val > max)
|
|
||||||
max = val;
|
|
||||||
}
|
|
||||||
if (!min) {
|
|
||||||
/* Linux up to 2.6.36 reports ACPI SLIT distances, which should be memory latencies.
|
|
||||||
* Except of SGI IP27 (SGI Origin 200/2000 with MIPS processors) where the distances
|
|
||||||
* are the number of hops between routers.
|
|
||||||
*/
|
|
||||||
hwloc_debug("%s", "minimal distance is 0, matrix does not seem to contain latencies, ignoring\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* store the normalized latency matrix in the root object */
|
|
||||||
idx = root->distances_count++;
|
|
||||||
root->distances = realloc(root->distances, root->distances_count * sizeof(struct hwloc_distances_s *));
|
|
||||||
root->distances[idx] = malloc(sizeof(struct hwloc_distances_s));
|
|
||||||
root->distances[idx]->relative_depth = relative_depth;
|
|
||||||
root->distances[idx]->nbobjs = nbobjs;
|
|
||||||
root->distances[idx]->latency = matrix = malloc(nbobjs*nbobjs*sizeof(float));
|
|
||||||
root->distances[idx]->latency_base = (float) min;
|
|
||||||
#define NORMALIZE_LATENCY(d) ((d)/(min))
|
|
||||||
root->distances[idx]->latency_max = NORMALIZE_LATENCY(max);
|
|
||||||
for(i=0; i<nbobjs; i++) {
|
|
||||||
li = objs[i]->logical_index - minl;
|
|
||||||
matrix[li*nbobjs+li] = NORMALIZE_LATENCY(osmatrix[i*nbobjs+i]);
|
|
||||||
for(j=i+1; j<nbobjs; j++) {
|
|
||||||
lj = objs[j]->logical_index - minl;
|
|
||||||
matrix[li*nbobjs+lj] = NORMALIZE_LATENCY(osmatrix[i*nbobjs+j]);
|
|
||||||
matrix[lj*nbobjs+li] = NORMALIZE_LATENCY(osmatrix[j*nbobjs+i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* convert internal distances into logically-ordered distances
|
|
||||||
* that can be exposed in the API
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
hwloc_finalize_logical_distances(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned nbobjs;
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
int depth;
|
|
||||||
|
|
||||||
for (type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++) {
|
|
||||||
nbobjs = topology->os_distances[type].nbobjs;
|
|
||||||
if (!nbobjs)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
depth = hwloc_get_type_depth(topology, type);
|
|
||||||
if (depth == HWLOC_TYPE_DEPTH_UNKNOWN || depth == HWLOC_TYPE_DEPTH_MULTIPLE)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (topology->os_distances[type].objs) {
|
|
||||||
assert(topology->os_distances[type].distances);
|
|
||||||
|
|
||||||
hwloc_setup_distances_from_os_matrix(topology, nbobjs,
|
|
||||||
topology->os_distances[type].objs,
|
|
||||||
topology->os_distances[type].distances);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* destroy a object distances structure */
|
|
||||||
void
|
|
||||||
hwloc_free_logical_distances(struct hwloc_distances_s * dist)
|
|
||||||
{
|
|
||||||
free(dist->latency);
|
|
||||||
free(dist);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void hwloc_report_user_distance_error(const char *msg, int line)
|
|
||||||
{
|
|
||||||
static int reported = 0;
|
|
||||||
|
|
||||||
if (!reported) {
|
|
||||||
fprintf(stderr, "****************************************************************************\n");
|
|
||||||
fprintf(stderr, "* Hwloc has encountered what looks like an error from user-given distances.\n");
|
|
||||||
fprintf(stderr, "*\n");
|
|
||||||
fprintf(stderr, "* %s\n", msg);
|
|
||||||
fprintf(stderr, "* Error occurred in topology.c line %d\n", line);
|
|
||||||
fprintf(stderr, "*\n");
|
|
||||||
fprintf(stderr, "* Please make sure that distances given through the interface or environment\n");
|
|
||||||
fprintf(stderr, "* variables do not contradict any other topology information.\n");
|
|
||||||
fprintf(stderr, "****************************************************************************\n");
|
|
||||||
reported = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Place objects in groups if they are in a transitive graph of minimal distances.
|
|
||||||
* Return how many groups were created, or 0 if some incomplete distance graphs were found.
|
|
||||||
*/
|
|
||||||
static unsigned
|
|
||||||
hwloc_setup_group_from_min_distance(unsigned nbobjs,
|
|
||||||
float *_distances,
|
|
||||||
unsigned *groupids)
|
|
||||||
{
|
|
||||||
float min_distance = FLT_MAX;
|
|
||||||
unsigned groupid = 1;
|
|
||||||
unsigned i,j,k;
|
|
||||||
unsigned skipped = 0;
|
|
||||||
|
|
||||||
#define DISTANCE(i, j) _distances[(i) * nbobjs + (j)]
|
|
||||||
|
|
||||||
memset(groupids, 0, nbobjs*sizeof(*groupids));
|
|
||||||
|
|
||||||
/* find the minimal distance */
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
for(j=i+1; j<nbobjs; j++)
|
|
||||||
if (DISTANCE(i, j) < min_distance)
|
|
||||||
min_distance = DISTANCE(i, j);
|
|
||||||
hwloc_debug("found minimal distance %f between objects\n", min_distance);
|
|
||||||
|
|
||||||
if (min_distance == FLT_MAX)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* build groups of objects connected with this distance */
|
|
||||||
for(i=0; i<nbobjs; i++) {
|
|
||||||
unsigned size;
|
|
||||||
int firstfound;
|
|
||||||
|
|
||||||
/* if already grouped, skip */
|
|
||||||
if (groupids[i])
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* start a new group */
|
|
||||||
groupids[i] = groupid;
|
|
||||||
size = 1;
|
|
||||||
firstfound = i;
|
|
||||||
|
|
||||||
while (firstfound != -1) {
|
|
||||||
/* we added new objects to the group, the first one was firstfound.
|
|
||||||
* rescan all connections from these new objects (starting at first found) to any other objects,
|
|
||||||
* so as to find new objects minimally-connected by transivity.
|
|
||||||
*/
|
|
||||||
int newfirstfound = -1;
|
|
||||||
for(j=firstfound; j<nbobjs; j++)
|
|
||||||
if (groupids[j] == groupid)
|
|
||||||
for(k=0; k<nbobjs; k++)
|
|
||||||
if (!groupids[k] && DISTANCE(j, k) == min_distance) {
|
|
||||||
groupids[k] = groupid;
|
|
||||||
size++;
|
|
||||||
if (newfirstfound == -1)
|
|
||||||
newfirstfound = k;
|
|
||||||
if (i == j)
|
|
||||||
hwloc_debug("object %u is minimally connected to %u\n", k, i);
|
|
||||||
else
|
|
||||||
hwloc_debug("object %u is minimally connected to %u through %u\n", k, i, j);
|
|
||||||
}
|
|
||||||
firstfound = newfirstfound;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size == 1) {
|
|
||||||
/* cancel this useless group, ignore this object and try from the next one */
|
|
||||||
groupids[i] = 0;
|
|
||||||
skipped++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* valid this group */
|
|
||||||
groupid++;
|
|
||||||
hwloc_debug("found transitive graph with %u objects with minimal distance %f\n",
|
|
||||||
size, min_distance);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (groupid == 2 && !skipped)
|
|
||||||
/* we created a single group containing all objects, ignore it */
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
/* return the last id, since it's also the number of used group ids */
|
|
||||||
return groupid-1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Look at object physical distances to group them,
|
|
||||||
* after having done some basic sanity checks.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
hwloc__setup_groups_from_distances(struct hwloc_topology *topology,
|
|
||||||
unsigned nbobjs,
|
|
||||||
struct hwloc_obj **objs,
|
|
||||||
float *_distances,
|
|
||||||
int fromuser)
|
|
||||||
{
|
|
||||||
unsigned *groupids = NULL;
|
|
||||||
unsigned nbgroups;
|
|
||||||
unsigned i,j;
|
|
||||||
|
|
||||||
hwloc_debug("trying to group %s objects into Group objects according to physical distances\n",
|
|
||||||
hwloc_obj_type_string(objs[0]->type));
|
|
||||||
|
|
||||||
if (nbobjs <= 2) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
groupids = malloc(sizeof(unsigned) * nbobjs);
|
|
||||||
if (NULL == groupids) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
nbgroups = hwloc_setup_group_from_min_distance(nbobjs, _distances, groupids);
|
|
||||||
if (!nbgroups) {
|
|
||||||
goto outter_free;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For convenience, put these declarations inside a block. It's a
|
|
||||||
crying shame we can't use C99 syntax here, and have to do a bunch
|
|
||||||
of mallocs. :-( */
|
|
||||||
{
|
|
||||||
hwloc_obj_t *groupobjs = NULL;
|
|
||||||
unsigned *groupsizes = NULL;
|
|
||||||
float *groupdistances = NULL;
|
|
||||||
|
|
||||||
groupobjs = malloc(sizeof(hwloc_obj_t) * nbgroups);
|
|
||||||
groupsizes = malloc(sizeof(unsigned) * nbgroups);
|
|
||||||
groupdistances = malloc(sizeof(float) * nbgroups * nbgroups);
|
|
||||||
if (NULL == groupobjs || NULL == groupsizes || NULL == groupdistances) {
|
|
||||||
goto inner_free;
|
|
||||||
}
|
|
||||||
/* create new Group objects and record their size */
|
|
||||||
memset(&(groupsizes[0]), 0, sizeof(groupsizes[0]) * nbgroups);
|
|
||||||
for(i=0; i<nbgroups; i++) {
|
|
||||||
/* create the Group object */
|
|
||||||
hwloc_obj_t group_obj;
|
|
||||||
group_obj = hwloc_alloc_setup_object(HWLOC_OBJ_GROUP, -1);
|
|
||||||
group_obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
group_obj->attr->group.depth = topology->next_group_depth;
|
|
||||||
for (j=0; j<nbobjs; j++)
|
|
||||||
if (groupids[j] == i+1) {
|
|
||||||
hwloc_bitmap_or(group_obj->cpuset, group_obj->cpuset, objs[j]->cpuset);
|
|
||||||
groupsizes[i]++;
|
|
||||||
}
|
|
||||||
hwloc_debug_1arg_bitmap("adding Group object with %u objects and cpuset %s\n",
|
|
||||||
groupsizes[i], group_obj->cpuset);
|
|
||||||
hwloc__insert_object_by_cpuset(topology, group_obj,
|
|
||||||
fromuser ? hwloc_report_user_distance_error : hwloc_report_os_error);
|
|
||||||
groupobjs[i] = group_obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* factorize distances */
|
|
||||||
memset(&(groupdistances[0]), 0, sizeof(groupdistances[0]) * nbgroups * nbgroups);
|
|
||||||
#undef DISTANCE
|
|
||||||
#define DISTANCE(i, j) _distances[(i) * nbobjs + (j)]
|
|
||||||
#define GROUP_DISTANCE(i, j) groupdistances[(i) * nbgroups + (j)]
|
|
||||||
for(i=0; i<nbobjs; i++)
|
|
||||||
if (groupids[i])
|
|
||||||
for(j=0; j<nbobjs; j++)
|
|
||||||
if (groupids[j])
|
|
||||||
GROUP_DISTANCE(groupids[i]-1, groupids[j]-1) += DISTANCE(i, j);
|
|
||||||
for(i=0; i<nbgroups; i++)
|
|
||||||
for(j=0; j<nbgroups; j++)
|
|
||||||
GROUP_DISTANCE(i, j) /= groupsizes[i]*groupsizes[j];
|
|
||||||
#ifdef HWLOC_DEBUG
|
|
||||||
hwloc_debug("%s", "generated new distance matrix between groups:\n");
|
|
||||||
hwloc_debug("%s", " index");
|
|
||||||
for(j=0; j<nbgroups; j++)
|
|
||||||
hwloc_debug(" % 5d", (int) j); /* print index because os_index is -1 fro Groups */
|
|
||||||
hwloc_debug("%s", "\n");
|
|
||||||
for(i=0; i<nbgroups; i++) {
|
|
||||||
hwloc_debug(" % 5d", (int) i);
|
|
||||||
for(j=0; j<nbgroups; j++)
|
|
||||||
hwloc_debug(" %2.3f", GROUP_DISTANCE(i, j));
|
|
||||||
hwloc_debug("%s", "\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
topology->next_group_depth++;
|
|
||||||
hwloc__setup_groups_from_distances(topology, nbgroups, groupobjs, (float*) groupdistances, fromuser);
|
|
||||||
|
|
||||||
inner_free:
|
|
||||||
/* Safely free everything */
|
|
||||||
if (NULL != groupobjs) {
|
|
||||||
free(groupobjs);
|
|
||||||
}
|
|
||||||
if (NULL != groupsizes) {
|
|
||||||
free(groupsizes);
|
|
||||||
}
|
|
||||||
if (NULL != groupdistances) {
|
|
||||||
free(groupdistances);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
outter_free:
|
|
||||||
if (NULL != groupids) {
|
|
||||||
free(groupids);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Look at object physical distances to group them.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
hwloc_setup_groups_from_distances(struct hwloc_topology *topology,
|
|
||||||
unsigned nbobjs,
|
|
||||||
struct hwloc_obj **objs,
|
|
||||||
float *_distances,
|
|
||||||
int fromuser)
|
|
||||||
{
|
|
||||||
unsigned i,j;
|
|
||||||
|
|
||||||
if (getenv("HWLOC_IGNORE_DISTANCES"))
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef HWLOC_DEBUG
|
|
||||||
hwloc_debug("%s", "trying to group objects using distance matrix:\n");
|
|
||||||
hwloc_debug("%s", " index");
|
|
||||||
for(j=0; j<nbobjs; j++)
|
|
||||||
hwloc_debug(" % 5d", (int) objs[j]->os_index);
|
|
||||||
hwloc_debug("%s", "\n");
|
|
||||||
for(i=0; i<nbobjs; i++) {
|
|
||||||
hwloc_debug(" % 5d", (int) objs[i]->os_index);
|
|
||||||
for(j=0; j<nbobjs; j++)
|
|
||||||
hwloc_debug(" %2.3f", DISTANCE(i, j));
|
|
||||||
hwloc_debug("%s", "\n");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check that the matrix is ok */
|
|
||||||
for(i=0; i<nbobjs; i++) {
|
|
||||||
for(j=i+1; j<nbobjs; j++) {
|
|
||||||
/* should be symmetric */
|
|
||||||
if (DISTANCE(i, j) != DISTANCE(j, i)) {
|
|
||||||
hwloc_debug("distance matrix asymmetric ([%u,%u]=%f != [%u,%u]=%f), aborting\n",
|
|
||||||
i, j, DISTANCE(i, j), j, i, DISTANCE(j, i));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
/* diagonal is smaller than everything else */
|
|
||||||
if (DISTANCE(i, j) <= DISTANCE(i, i)) {
|
|
||||||
hwloc_debug("distance to self not strictly minimal ([%u,%u]=%f <= [%u,%u]=%f), aborting\n",
|
|
||||||
i, j, DISTANCE(i, j), i, i, DISTANCE(i, i));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc__setup_groups_from_distances(topology, nbobjs, objs, _distances, fromuser);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_group_by_distances(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned nbobjs;
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
|
|
||||||
for (type = HWLOC_OBJ_SYSTEM; type < HWLOC_OBJ_TYPE_MAX; type++) {
|
|
||||||
nbobjs = topology->os_distances[type].nbobjs;
|
|
||||||
if (!nbobjs)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (topology->os_distances[type].objs) {
|
|
||||||
/* if we have objs, we must have distances as well,
|
|
||||||
* thanks to hwloc_convert_distances_indexes_into_objects()
|
|
||||||
*/
|
|
||||||
assert(topology->os_distances[type].distances);
|
|
||||||
hwloc_setup_groups_from_distances(topology, nbobjs,
|
|
||||||
topology->os_distances[type].objs,
|
|
||||||
topology->os_distances[type].distances,
|
|
||||||
topology->os_distances[type].indexes != NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009 Université Bordeaux 1
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Wrapper to avoid msys' tendency to turn / into \ and : into ; */
|
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
|
||||||
char *prog, *arch, *def, *name, *lib;
|
|
||||||
char s[1024];
|
|
||||||
|
|
||||||
if (argc != 6) {
|
|
||||||
fprintf(stderr,"bad number of arguments");
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
prog = argv[1];
|
|
||||||
arch = argv[2];
|
|
||||||
def = argv[3];
|
|
||||||
name = argv[4];
|
|
||||||
lib = argv[5];
|
|
||||||
|
|
||||||
snprintf(s, sizeof(s), "\"%s\" /machine:%s /def:%s /name:%s /out:%s",
|
|
||||||
prog, arch, def, name, lib);
|
|
||||||
if (system(s)) {
|
|
||||||
fprintf(stderr, "%s failed\n", s);
|
|
||||||
exit(EXIT_FAILURE);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit(EXIT_SUCCESS);
|
|
||||||
}
|
|
|
@ -1,37 +0,0 @@
|
||||||
<!ELEMENT topology (object)+>
|
|
||||||
<!ELEMENT root (object)+>
|
|
||||||
|
|
||||||
<!ELEMENT object (page_type*,info*,distances*,object*)>
|
|
||||||
<!ATTLIST object type (System | Machine | Misc | Group | NUMANode | Socket| Cache | Core | PU) #REQUIRED>
|
|
||||||
<!ATTLIST object os_level CDATA "-1" >
|
|
||||||
<!ATTLIST object os_index CDATA "-1" >
|
|
||||||
<!ATTLIST object name CDATA "" >
|
|
||||||
<!ATTLIST object local_memory CDATA "0" >
|
|
||||||
<!ATTLIST object cache_size CDATA "0" >
|
|
||||||
<!ATTLIST object cache_linesize CDATA "0" >
|
|
||||||
<!ATTLIST object huge_page_size_kB CDATA "0" >
|
|
||||||
<!ATTLIST object huge_page_free CDATA "0" >
|
|
||||||
<!ATTLIST object depth CDATA "-1" >
|
|
||||||
<!ATTLIST object cpuset CDATA "0" >
|
|
||||||
<!ATTLIST object complete_cpuset CDATA "" >
|
|
||||||
<!ATTLIST object online_cpuset CDATA "" >
|
|
||||||
<!ATTLIST object allowed_cpuset CDATA "" >
|
|
||||||
<!ATTLIST object nodeset CDATA "" >
|
|
||||||
<!ATTLIST object complete_nodeset CDATA "" >
|
|
||||||
<!ATTLIST object allowed_nodeset CDATA "" >
|
|
||||||
|
|
||||||
<!ELEMENT page_type EMPTY>
|
|
||||||
<!ATTLIST page_type size CDATA #REQUIRED>
|
|
||||||
<!ATTLIST page_type count CDATA #REQUIRED>
|
|
||||||
|
|
||||||
<!ELEMENT info EMPTY>
|
|
||||||
<!ATTLIST info name CDATA #REQUIRED>
|
|
||||||
<!ATTLIST info value CDATA #REQUIRED>
|
|
||||||
|
|
||||||
<!ELEMENT distances (latency*)>
|
|
||||||
<!ATTLIST distances nbobjs CDATA #REQUIRED>
|
|
||||||
<!ATTLIST distances relative_depth CDATA #REQUIRED>
|
|
||||||
<!ATTLIST distances latency_base CDATA #REQUIRED>
|
|
||||||
|
|
||||||
<!ELEMENT latency EMPTY>
|
|
||||||
<!ATTLIST latency value CDATA #REQUIRED>
|
|
|
@ -1,100 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <private/misc.h>
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
|
||||||
#ifdef HAVE_SYS_UTSNAME_H
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
#endif
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
|
|
||||||
int hwloc_snprintf(char *str, size_t size, const char *format, ...)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
va_list ap;
|
|
||||||
static char bin;
|
|
||||||
size_t fakesize;
|
|
||||||
char *fakestr;
|
|
||||||
|
|
||||||
/* Some systems crash on str == NULL */
|
|
||||||
if (!size) {
|
|
||||||
str = &bin;
|
|
||||||
size = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
va_start(ap, format);
|
|
||||||
ret = vsnprintf(str, size, format, ap);
|
|
||||||
va_end(ap);
|
|
||||||
|
|
||||||
if (ret >= 0 && (size_t) ret != size-1)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
/* vsnprintf returned size-1 or -1. That could be a system which reports the
|
|
||||||
* written data and not the actually required room. Try increasing buffer
|
|
||||||
* size to get the latter. */
|
|
||||||
|
|
||||||
fakesize = size;
|
|
||||||
fakestr = NULL;
|
|
||||||
do {
|
|
||||||
fakesize *= 2;
|
|
||||||
free(fakestr);
|
|
||||||
fakestr = malloc(fakesize);
|
|
||||||
if (NULL == fakestr)
|
|
||||||
return -1;
|
|
||||||
va_start(ap, format);
|
|
||||||
errno = 0;
|
|
||||||
ret = vsnprintf(fakestr, fakesize, format, ap);
|
|
||||||
va_end(ap);
|
|
||||||
} while ((size_t) ret == fakesize-1 || (ret < 0 && (!errno || errno == ERANGE)));
|
|
||||||
|
|
||||||
if (ret >= 0 && size) {
|
|
||||||
if (size > (size_t) ret+1)
|
|
||||||
size = ret+1;
|
|
||||||
memcpy(str, fakestr, size-1);
|
|
||||||
str[size-1] = 0;
|
|
||||||
}
|
|
||||||
free(fakestr);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int hwloc_namecoloncmp(const char *haystack, const char *needle, size_t n)
|
|
||||||
{
|
|
||||||
size_t i = 0;
|
|
||||||
while (*haystack && *haystack != ':') {
|
|
||||||
int ha = *haystack++;
|
|
||||||
int low_h = tolower(ha);
|
|
||||||
int ne = *needle++;
|
|
||||||
int low_n = tolower(ne);
|
|
||||||
if (low_h != low_n)
|
|
||||||
return 1;
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return i < n;
|
|
||||||
}
|
|
||||||
|
|
||||||
void hwloc_add_uname_info(struct hwloc_topology *topology __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_UNAME
|
|
||||||
struct utsname utsname;
|
|
||||||
|
|
||||||
if (uname(&utsname) < 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "OSName", utsname.sysname);
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "OSRelease", utsname.release);
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "OSVersion", utsname.version);
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "HostName", utsname.nodename);
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Architecture", utsname.machine);
|
|
||||||
#endif /* HAVE_UNAME */
|
|
||||||
}
|
|
|
@ -1,602 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* TODO: use SIGRECONFIG & dr_reconfig for state change */
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <sys/rset.h>
|
|
||||||
#include <sys/processor.h>
|
|
||||||
#include <sys/thread.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/systemcfg.h>
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_sth_cpubind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_const_bitmap_t hwloc_set, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
rsethandle_t rad;
|
|
||||||
int res;
|
|
||||||
unsigned cpu;
|
|
||||||
|
|
||||||
if (flags & HWLOC_CPUBIND_NOMEMBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The resulting binding is always strict */
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
|
|
||||||
if (ra_detachrset(what, who, 0))
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
rad = rs_alloc(RS_EMPTY);
|
|
||||||
hwloc_bitmap_foreach_begin(cpu, hwloc_set)
|
|
||||||
rs_op(RS_ADDRESOURCE, rad, NULL, R_PROCS, cpu);
|
|
||||||
hwloc_bitmap_foreach_end();
|
|
||||||
|
|
||||||
res = ra_attachrset(what, who, rad, 0);
|
|
||||||
|
|
||||||
rs_free(rad);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_sth_cpubind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_bitmap_t hwloc_set, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
rsethandle_t rset;
|
|
||||||
unsigned cpu, maxcpus;
|
|
||||||
int res = -1;
|
|
||||||
|
|
||||||
rset = rs_alloc(RS_EMPTY);
|
|
||||||
|
|
||||||
if (ra_getrset(what, who, 0, rset) == -1)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
hwloc_bitmap_zero(hwloc_set);
|
|
||||||
maxcpus = rs_getinfo(rset, R_MAXPROCS, 0);
|
|
||||||
for (cpu = 0; cpu < maxcpus; cpu++)
|
|
||||||
if (rs_op(RS_TESTRESOURCE, rset, NULL, R_PROCS, cpu) == 1)
|
|
||||||
hwloc_bitmap_set(hwloc_set, cpu);
|
|
||||||
hwloc_bitmap_and(hwloc_set, hwloc_set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
res = 0;
|
|
||||||
|
|
||||||
out:
|
|
||||||
rs_free(rset);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = getpid();
|
|
||||||
return hwloc_aix_set_sth_cpubind(topology, R_PROCESS, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = getpid();
|
|
||||||
return hwloc_aix_get_sth_cpubind(topology, R_PROCESS, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = thread_self();
|
|
||||||
return hwloc_aix_set_sth_cpubind(topology, R_THREAD, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = thread_self();
|
|
||||||
return hwloc_aix_get_sth_cpubind(topology, R_THREAD, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = pid;
|
|
||||||
return hwloc_aix_set_sth_cpubind(topology, R_PROCESS, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = pid;
|
|
||||||
return hwloc_aix_get_sth_cpubind(topology, R_PROCESS, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_PTHREAD_GETTHRDS_NP
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
struct __pthrdsinfo info;
|
|
||||||
int size;
|
|
||||||
if ((errno = pthread_getthrds_np(&pthread, PTHRDSINFO_QUERY_TID, &info, sizeof(info), NULL, &size)))
|
|
||||||
return -1;
|
|
||||||
{
|
|
||||||
rsid_t who = { .at_tid = info.__pi_tid };
|
|
||||||
return hwloc_aix_set_sth_cpubind(topology, R_THREAD, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
struct __pthrdsinfo info;
|
|
||||||
int size;
|
|
||||||
if (pthread_getthrds_np(&pthread, PTHRDSINFO_QUERY_TID, &info, sizeof(info), NULL, &size))
|
|
||||||
return -1;
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = info.__pi_tid;
|
|
||||||
return hwloc_aix_get_sth_cpubind(topology, R_THREAD, who, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
|
|
||||||
#ifdef P_DEFAULT
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_membind_policy_from_hwloc(uint_t *aix_policy, int policy)
|
|
||||||
{
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
*aix_policy = P_DEFAULT;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_FIRSTTOUCH:
|
|
||||||
*aix_policy = P_FIRST_TOUCH;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_INTERLEAVE:
|
|
||||||
*aix_policy = P_BALANCED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_prepare_membind(hwloc_topology_t topology, rsethandle_t *rad, hwloc_const_nodeset_t nodeset, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
rsethandle_t rset, noderad;
|
|
||||||
int MCMlevel;
|
|
||||||
int node;
|
|
||||||
|
|
||||||
MCMlevel = rs_getinfo(NULL, R_MCMSDL, 0);
|
|
||||||
if ((topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM))
|
|
||||||
rset = rs_alloc(RS_ALL);
|
|
||||||
else
|
|
||||||
rset = rs_alloc(RS_PARTITION);
|
|
||||||
*rad = rs_alloc(RS_EMPTY);
|
|
||||||
noderad = rs_alloc(RS_EMPTY);
|
|
||||||
|
|
||||||
hwloc_bitmap_foreach_begin(node, nodeset)
|
|
||||||
rs_getrad(rset, noderad, MCMlevel, node, 0);
|
|
||||||
rs_op(RS_UNION, noderad, *rad, 0, 0);
|
|
||||||
hwloc_bitmap_foreach_end();
|
|
||||||
|
|
||||||
rs_free(rset);
|
|
||||||
rs_free(noderad);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_sth_membind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_const_bitmap_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
rsethandle_t rad;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (flags & HWLOC_MEMBIND_NOCPUBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_aix_prepare_membind(topology, &rad, nodeset, flags))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
res = ra_attachrset(what, who, rad, 0);
|
|
||||||
|
|
||||||
rs_free(rad);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_sth_membind(hwloc_topology_t topology, rstype_t what, rsid_t who, hwloc_bitmap_t nodeset, hwloc_membind_policy_t *policy, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t hwloc_set;
|
|
||||||
rsethandle_t rset;
|
|
||||||
unsigned cpu, maxcpus;
|
|
||||||
int res = -1;
|
|
||||||
int depth, n, i;
|
|
||||||
|
|
||||||
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
if (depth < 0) {
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
n = hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
|
|
||||||
rset = rs_alloc(RS_EMPTY);
|
|
||||||
|
|
||||||
if (ra_getrset(what, who, 0, rset) == -1)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
hwloc_set = hwloc_bitmap_alloc();
|
|
||||||
maxcpus = rs_getinfo(rset, R_MAXPROCS, 0);
|
|
||||||
for (cpu = 0; cpu < maxcpus; cpu++)
|
|
||||||
if (rs_op(RS_TESTRESOURCE, rset, NULL, R_PROCS, cpu) == 1)
|
|
||||||
hwloc_bitmap_set(hwloc_set, cpu);
|
|
||||||
hwloc_bitmap_and(hwloc_set, hwloc_set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (hwloc_bitmap_isincluded(obj->cpuset, hwloc_set))
|
|
||||||
hwloc_bitmap_set(nodeset, obj->os_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
*policy = HWLOC_MEMBIND_DEFAULT;
|
|
||||||
res = 0;
|
|
||||||
|
|
||||||
out:
|
|
||||||
rs_free(rset);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_thisproc_membind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = getpid();
|
|
||||||
return hwloc_aix_set_sth_membind(topology, R_PROCESS, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_thisproc_membind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_set, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = getpid();
|
|
||||||
return hwloc_aix_get_sth_membind(topology, R_PROCESS, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_thisthread_membind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = thread_self();
|
|
||||||
return hwloc_aix_set_sth_membind(topology, R_THREAD, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_thisthread_membind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_set, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = thread_self();
|
|
||||||
return hwloc_aix_get_sth_membind(topology, R_THREAD, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t hwloc_set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = pid;
|
|
||||||
return hwloc_aix_set_sth_membind(topology, R_PROCESS, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t hwloc_set, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_pid = pid;
|
|
||||||
return hwloc_aix_get_sth_membind(topology, R_PROCESS, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0 /* def HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_thread_membind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_const_bitmap_t hwloc_set, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
struct __pthrdsinfo info;
|
|
||||||
int size;
|
|
||||||
if ((errno = pthread_getthrds_np(&pthread, PTHRDSINFO_QUERY_TID, &info, sizeof(info), NULL, &size)))
|
|
||||||
return -1;
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = info.__pi_tid;
|
|
||||||
return hwloc_aix_set_sth_membind(topology, R_THREAD, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_aix_get_thread_membind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_bitmap_t hwloc_set, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
struct __pthrdsinfo info;
|
|
||||||
int size;
|
|
||||||
if (pthread_getthrds_np(&pthread, PTHRDSINFO_QUERY_TID, &info, sizeof(info), NULL, &size))
|
|
||||||
return -1;
|
|
||||||
{
|
|
||||||
rsid_t who;
|
|
||||||
who.at_tid = info.__pi_tid;
|
|
||||||
return hwloc_aix_get_sth_membind(topology, R_THREAD, who, hwloc_set, policy, flags);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
/* TODO: seems to be right, but doesn't seem to be working (EINVAL), even after
|
|
||||||
* aligning the range on 64K... */
|
|
||||||
static int
|
|
||||||
hwloc_aix_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
subrange_t subrange;
|
|
||||||
rsid_t rsid = { .at_subrange = &subrange };
|
|
||||||
uint_t aix_policy;
|
|
||||||
int ret;
|
|
||||||
fprintf(stderr,"yop\n");
|
|
||||||
|
|
||||||
if ((flags & (HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_STRICT))
|
|
||||||
== (HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_STRICT)) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
subrange.su_offset = (uintptr_t) addr;
|
|
||||||
subrange.su_length = len;
|
|
||||||
subrange.su_rstype = R_RSET;
|
|
||||||
|
|
||||||
if (hwloc_aix_membind_policy_from_hwloc(&aix_policy, policy))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (hwloc_aix_prepare_membind(topology, &subrange.su_rsid.at_rset, nodeset, flags))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
subrange.su_policy = aix_policy;
|
|
||||||
|
|
||||||
ret = ra_attachrset(R_SUBRANGE, rsid, subrange.su_rsid.at_rset, 0);
|
|
||||||
rs_free(subrange.su_rsid.at_rset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void *
|
|
||||||
hwloc_aix_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
void *ret;
|
|
||||||
rsid_t rsid;
|
|
||||||
uint_t aix_policy;
|
|
||||||
|
|
||||||
if (hwloc_aix_membind_policy_from_hwloc(&aix_policy, policy))
|
|
||||||
return hwloc_alloc_or_fail(topology, len, flags);
|
|
||||||
|
|
||||||
if (hwloc_aix_prepare_membind(topology, &rsid.at_rset, nodeset, flags))
|
|
||||||
return hwloc_alloc_or_fail(topology, len, flags);
|
|
||||||
|
|
||||||
ret = ra_mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0, R_RSET, rsid, aix_policy);
|
|
||||||
|
|
||||||
rs_free(rsid.at_rset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
#endif /* P_DEFAULT */
|
|
||||||
|
|
||||||
static void
|
|
||||||
look_rset(int sdl, hwloc_obj_type_t type, struct hwloc_topology *topology, int level)
|
|
||||||
{
|
|
||||||
rsethandle_t rset, rad;
|
|
||||||
int i,maxcpus,j;
|
|
||||||
int nbnodes;
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
|
|
||||||
if ((topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM))
|
|
||||||
rset = rs_alloc(RS_ALL);
|
|
||||||
else
|
|
||||||
rset = rs_alloc(RS_PARTITION);
|
|
||||||
rad = rs_alloc(RS_EMPTY);
|
|
||||||
nbnodes = rs_numrads(rset, sdl, 0);
|
|
||||||
if (nbnodes == -1) {
|
|
||||||
perror("rs_numrads");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nbnodes; i++) {
|
|
||||||
if (rs_getrad(rset, rad, sdl, i, 0)) {
|
|
||||||
fprintf(stderr,"rs_getrad(%d) failed: %s\n", i, strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!rs_getinfo(rad, R_NUMPROCS, 0))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/* It seems logical processors are numbered from 1 here, while the
|
|
||||||
* bindprocessor functions numbers them from 0... */
|
|
||||||
obj = hwloc_alloc_setup_object(type, i - (type == HWLOC_OBJ_PU));
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
obj->os_level = sdl;
|
|
||||||
maxcpus = rs_getinfo(rad, R_MAXPROCS, 0);
|
|
||||||
for (j = 0; j < maxcpus; j++) {
|
|
||||||
if (rs_op(RS_TESTRESOURCE, rad, NULL, R_PROCS, j))
|
|
||||||
hwloc_bitmap_set(obj->cpuset, j);
|
|
||||||
}
|
|
||||||
switch(type) {
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, i);
|
|
||||||
obj->memory.local_memory = 0; /* TODO: odd, rs_getinfo(rad, R_MEMSIZE, 0) << 10 returns the total memory ... */
|
|
||||||
obj->memory.page_types_len = 2;
|
|
||||||
obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types[0].size = getpagesize();
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
/* TODO: obj->memory.page_types[1].count = rs_getinfo(rset, R_LGPGFREE, 0) / hugepagesize */
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
obj->attr->cache.size = _system_configuration.L2_cache_size;
|
|
||||||
obj->attr->cache.linesize = 0; /* TODO: ? */
|
|
||||||
obj->attr->cache.depth = 2;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
obj->attr->group.depth = level;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CORE:
|
|
||||||
{
|
|
||||||
hwloc_obj_t obj2 = hwloc_alloc_setup_object(HWLOC_OBJ_CACHE, i);
|
|
||||||
obj2->cpuset = hwloc_bitmap_dup(obj->cpuset);
|
|
||||||
obj2->attr->cache.size = _system_configuration.dcache_size;
|
|
||||||
obj2->attr->cache.linesize = _system_configuration.dcache_line;
|
|
||||||
obj2->attr->cache.depth = 1;
|
|
||||||
hwloc_debug("Adding an L1 cache for core %d\n", i);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hwloc_debug_2args_bitmap("%s %d has cpuset %s\n",
|
|
||||||
hwloc_obj_type_string(type),
|
|
||||||
i, obj->cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
rs_free(rset);
|
|
||||||
rs_free(rad);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_aix(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
/* TODO: R_LGPGDEF/R_LGPGFREE for large pages */
|
|
||||||
|
|
||||||
hwloc_debug("Note: SMPSDL is at %d\n", rs_getinfo(NULL, R_SMPSDL, 0));
|
|
||||||
|
|
||||||
for (i=0; i<=rs_getinfo(NULL, R_MAXSDL, 0); i++)
|
|
||||||
{
|
|
||||||
int known = 0;
|
|
||||||
#if 0
|
|
||||||
if (i == rs_getinfo(NULL, R_SMPSDL, 0))
|
|
||||||
/* Not enabled for now because I'm not sure what it corresponds to. On
|
|
||||||
* decrypthon it contains all the cpus. Is it a "machine" or a "system"
|
|
||||||
* level ?
|
|
||||||
*/
|
|
||||||
{
|
|
||||||
hwloc_debug("looking AIX \"SMP\" sdl %d\n", i);
|
|
||||||
look_rset(i, HWLOC_OBJ_MACHINE, topology, i);
|
|
||||||
known = 1;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (i == rs_getinfo(NULL, R_MCMSDL, 0))
|
|
||||||
{
|
|
||||||
hwloc_debug("looking AIX node sdl %d\n", i);
|
|
||||||
look_rset(i, HWLOC_OBJ_NODE, topology, i);
|
|
||||||
known = 1;
|
|
||||||
}
|
|
||||||
# ifdef R_L2CSDL
|
|
||||||
if (i == rs_getinfo(NULL, R_L2CSDL, 0))
|
|
||||||
{
|
|
||||||
hwloc_debug("looking AIX L2 sdl %d\n", i);
|
|
||||||
look_rset(i, HWLOC_OBJ_CACHE, topology, i);
|
|
||||||
known = 1;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
# ifdef R_PCORESDL
|
|
||||||
if (i == rs_getinfo(NULL, R_PCORESDL, 0))
|
|
||||||
{
|
|
||||||
hwloc_debug("looking AIX core sdl %d\n", i);
|
|
||||||
look_rset(i, HWLOC_OBJ_CORE, topology, i);
|
|
||||||
known = 1;
|
|
||||||
}
|
|
||||||
# endif
|
|
||||||
if (i == rs_getinfo(NULL, R_MAXSDL, 0))
|
|
||||||
{
|
|
||||||
hwloc_debug("looking AIX max sdl %d\n", i);
|
|
||||||
look_rset(i, HWLOC_OBJ_PU, topology, i);
|
|
||||||
known = 1;
|
|
||||||
topology->support.discovery->pu = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Don't know how it should be rendered, make a misc object for it. */
|
|
||||||
if (!known)
|
|
||||||
{
|
|
||||||
hwloc_debug("looking AIX unknown sdl %d\n", i);
|
|
||||||
look_rset(i, HWLOC_OBJ_GROUP, topology, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "AIX");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_aix_hooks(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
topology->set_proc_cpubind = hwloc_aix_set_proc_cpubind;
|
|
||||||
topology->get_proc_cpubind = hwloc_aix_get_proc_cpubind;
|
|
||||||
#ifdef HWLOC_HAVE_PTHREAD_GETTHRDS_NP
|
|
||||||
topology->set_thread_cpubind = hwloc_aix_set_thread_cpubind;
|
|
||||||
topology->get_thread_cpubind = hwloc_aix_get_thread_cpubind;
|
|
||||||
#endif /* HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
topology->set_thisproc_cpubind = hwloc_aix_set_thisproc_cpubind;
|
|
||||||
topology->get_thisproc_cpubind = hwloc_aix_get_thisproc_cpubind;
|
|
||||||
topology->set_thisthread_cpubind = hwloc_aix_set_thisthread_cpubind;
|
|
||||||
topology->get_thisthread_cpubind = hwloc_aix_get_thisthread_cpubind;
|
|
||||||
/* TODO: get_last_cpu_location: use mycpu() */
|
|
||||||
#ifdef P_DEFAULT
|
|
||||||
topology->set_proc_membind = hwloc_aix_set_proc_membind;
|
|
||||||
topology->get_proc_membind = hwloc_aix_get_proc_membind;
|
|
||||||
#if 0 /* def HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
/* Does it really make sense to set the memory binding of another thread? */
|
|
||||||
topology->set_thread_membind = hwloc_aix_set_thread_membind;
|
|
||||||
topology->get_thread_membind = hwloc_aix_get_thread_membind;
|
|
||||||
#endif /* HWLOC_HAVE_PTHREAD_GETTHRDS_NP */
|
|
||||||
topology->set_thisproc_membind = hwloc_aix_set_thisproc_membind;
|
|
||||||
topology->get_thisproc_membind = hwloc_aix_get_thisproc_membind;
|
|
||||||
topology->set_thisthread_membind = hwloc_aix_set_thisthread_membind;
|
|
||||||
topology->get_thisthread_membind = hwloc_aix_get_thisthread_membind;
|
|
||||||
/* topology->set_area_membind = hwloc_aix_set_area_membind; */
|
|
||||||
/* get_area_membind is not available */
|
|
||||||
topology->alloc_membind = hwloc_aix_alloc_membind;
|
|
||||||
topology->alloc = hwloc_alloc_mmap;
|
|
||||||
topology->free_membind = hwloc_free_mmap;
|
|
||||||
topology->support.membind->firsttouch_membind = 1;
|
|
||||||
topology->support.membind->bind_membind = 1;
|
|
||||||
topology->support.membind->interleave_membind = 1;
|
|
||||||
#endif /* P_DEFAULT */
|
|
||||||
}
|
|
|
@ -1,216 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Detect topology change: registering for power management changes and check
|
|
||||||
* if for example hw.activecpu changed */
|
|
||||||
|
|
||||||
/* Apparently, Darwin people do not _want_ to provide binding functions. */
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/sysctl.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_darwin(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
int64_t _nprocs;
|
|
||||||
unsigned nprocs;
|
|
||||||
int64_t _npackages;
|
|
||||||
unsigned i, j, cpu;
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
size_t size;
|
|
||||||
int64_t l1cachesize;
|
|
||||||
int64_t l2cachesize;
|
|
||||||
int64_t cachelinesize;
|
|
||||||
int64_t memsize;
|
|
||||||
|
|
||||||
if (hwloc_get_sysctlbyname("hw.ncpu", &_nprocs) || _nprocs <= 0)
|
|
||||||
return;
|
|
||||||
nprocs = _nprocs;
|
|
||||||
topology->support.discovery->pu = 1;
|
|
||||||
|
|
||||||
hwloc_debug("%u procs\n", nprocs);
|
|
||||||
|
|
||||||
if (!hwloc_get_sysctlbyname("hw.packages", &_npackages) && _npackages > 0) {
|
|
||||||
unsigned npackages = _npackages;
|
|
||||||
int64_t _cores_per_package;
|
|
||||||
int64_t _logical_per_package;
|
|
||||||
unsigned logical_per_package;
|
|
||||||
|
|
||||||
hwloc_debug("%u packages\n", npackages);
|
|
||||||
|
|
||||||
if (!hwloc_get_sysctlbyname("machdep.cpu.logical_per_package", &_logical_per_package) && _logical_per_package > 0)
|
|
||||||
logical_per_package = _logical_per_package;
|
|
||||||
else
|
|
||||||
/* Assume the trivia. */
|
|
||||||
logical_per_package = nprocs / npackages;
|
|
||||||
|
|
||||||
hwloc_debug("%u threads per package\n", logical_per_package);
|
|
||||||
|
|
||||||
|
|
||||||
if (nprocs == npackages * logical_per_package)
|
|
||||||
for (i = 0; i < npackages; i++) {
|
|
||||||
obj = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, i);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (cpu = i*logical_per_package; cpu < (i+1)*logical_per_package; cpu++)
|
|
||||||
hwloc_bitmap_set(obj->cpuset, cpu);
|
|
||||||
|
|
||||||
hwloc_debug_1arg_bitmap("package %u has cpuset %s\n",
|
|
||||||
i, obj->cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hwloc_get_sysctlbyname("machdep.cpu.cores_per_package", &_cores_per_package) && _cores_per_package > 0) {
|
|
||||||
unsigned cores_per_package = _cores_per_package;
|
|
||||||
hwloc_debug("%u cores per package\n", cores_per_package);
|
|
||||||
|
|
||||||
if (!(logical_per_package % cores_per_package))
|
|
||||||
for (i = 0; i < npackages * cores_per_package; i++) {
|
|
||||||
obj = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, i);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (cpu = i*(logical_per_package/cores_per_package);
|
|
||||||
cpu < (i+1)*(logical_per_package/cores_per_package);
|
|
||||||
cpu++)
|
|
||||||
hwloc_bitmap_set(obj->cpuset, cpu);
|
|
||||||
|
|
||||||
hwloc_debug_1arg_bitmap("core %u has cpuset %s\n",
|
|
||||||
i, obj->cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_get_sysctlbyname("hw.l1dcachesize", &l1cachesize))
|
|
||||||
l1cachesize = 0;
|
|
||||||
|
|
||||||
if (hwloc_get_sysctlbyname("hw.l2cachesize", &l2cachesize))
|
|
||||||
l2cachesize = 0;
|
|
||||||
|
|
||||||
if (hwloc_get_sysctlbyname("hw.cachelinesize", &cachelinesize))
|
|
||||||
cachelinesize = 0;
|
|
||||||
|
|
||||||
if (hwloc_get_sysctlbyname("hw.memsize", &memsize))
|
|
||||||
memsize = 0;
|
|
||||||
|
|
||||||
if (!sysctlbyname("hw.cacheconfig", NULL, &size, NULL, 0)) {
|
|
||||||
unsigned n = size / sizeof(uint32_t);
|
|
||||||
uint64_t *cacheconfig = NULL;
|
|
||||||
uint64_t *cachesize = NULL;
|
|
||||||
uint32_t *cacheconfig32 = NULL;
|
|
||||||
|
|
||||||
cacheconfig = malloc(sizeof(uint64_t) * n);
|
|
||||||
if (NULL == cacheconfig) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
cachesize = malloc(sizeof(uint64_t) * n);
|
|
||||||
if (NULL == cachesize) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
cacheconfig32 = malloc(sizeof(uint32_t) * n);
|
|
||||||
if (NULL == cacheconfig32) {
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!sysctlbyname("hw.cacheconfig", cacheconfig, &size, NULL, 0))) {
|
|
||||||
/* Yeech. Darwin seemingly has changed from 32bit to 64bit integers for
|
|
||||||
* cacheconfig, with apparently no way for detection. Assume the machine
|
|
||||||
* won't have more than 4 billion cpus */
|
|
||||||
if (cacheconfig[0] > 0xFFFFFFFFUL) {
|
|
||||||
memcpy(cacheconfig32, cacheconfig, size);
|
|
||||||
for (i = 0 ; i < size / sizeof(uint32_t); i++)
|
|
||||||
cacheconfig[i] = cacheconfig32[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(cachesize, 0, sizeof(uint64_t) * n);
|
|
||||||
size = sizeof(uint64_t) * n;
|
|
||||||
if (sysctlbyname("hw.cachesize", cachesize, &size, NULL, 0)) {
|
|
||||||
if (n > 0)
|
|
||||||
cachesize[0] = memsize;
|
|
||||||
if (n > 1)
|
|
||||||
cachesize[1] = l1cachesize;
|
|
||||||
if (n > 2)
|
|
||||||
cachesize[2] = l2cachesize;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_debug("%s", "caches");
|
|
||||||
for (i = 0; i < n && cacheconfig[i]; i++)
|
|
||||||
hwloc_debug(" %"PRIu64"(%"PRIu64"kB)", cacheconfig[i], cachesize[i] / 1024);
|
|
||||||
|
|
||||||
cacheconfig[i] = cacheconfig32[i];
|
|
||||||
/* Now we know how many caches there are */
|
|
||||||
n = i;
|
|
||||||
hwloc_debug("\n%u cache levels\n", n - 1);
|
|
||||||
|
|
||||||
/* For each cache level (0 is memory) */
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
/* cacheconfig tells us how many cpus share it, let's iterate on each cache */
|
|
||||||
for (j = 0; j < (nprocs / cacheconfig[i]); j++) {
|
|
||||||
obj = hwloc_alloc_setup_object(i?HWLOC_OBJ_CACHE:HWLOC_OBJ_NODE, j);
|
|
||||||
if (!i) {
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, j);
|
|
||||||
}
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (cpu = j*cacheconfig[i];
|
|
||||||
cpu < ((j+1)*cacheconfig[i]);
|
|
||||||
cpu++)
|
|
||||||
hwloc_bitmap_set(obj->cpuset, cpu);
|
|
||||||
|
|
||||||
if (i) {
|
|
||||||
hwloc_debug_2args_bitmap("L%ucache %u has cpuset %s\n",
|
|
||||||
i, j, obj->cpuset);
|
|
||||||
obj->attr->cache.depth = i;
|
|
||||||
obj->attr->cache.size = cachesize[i];
|
|
||||||
obj->attr->cache.linesize = cachelinesize;
|
|
||||||
} else {
|
|
||||||
hwloc_debug_1arg_bitmap("node %u has cpuset %s\n",
|
|
||||||
j, obj->cpuset);
|
|
||||||
obj->memory.local_memory = cachesize[i];
|
|
||||||
obj->memory.page_types_len = 2;
|
|
||||||
obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types[0].size = getpagesize();
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
out:
|
|
||||||
if (NULL != cacheconfig) {
|
|
||||||
free(cacheconfig);
|
|
||||||
}
|
|
||||||
if (NULL != cachesize) {
|
|
||||||
free(cachesize);
|
|
||||||
}
|
|
||||||
if (NULL != cacheconfig32) {
|
|
||||||
free(cacheconfig32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* add PU objects */
|
|
||||||
hwloc_setup_pu_level(topology, nprocs);
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "Darwin");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_darwin_hooks(struct hwloc_topology *topology __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
}
|
|
|
@ -1,201 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <sys/param.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#ifdef HAVE_PTHREAD_NP_H
|
|
||||||
#include <pthread_np.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_CPUSET_H
|
|
||||||
#include <sys/cpuset.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_SYS_CPUSET_H
|
|
||||||
static void
|
|
||||||
hwloc_freebsd_bsd2hwloc(hwloc_bitmap_t hwloc_cpuset, const cpuset_t *cpuset)
|
|
||||||
{
|
|
||||||
unsigned cpu;
|
|
||||||
hwloc_bitmap_zero(hwloc_cpuset);
|
|
||||||
for (cpu = 0; cpu < CPU_SETSIZE; cpu++)
|
|
||||||
if (CPU_ISSET(cpu, cpuset))
|
|
||||||
hwloc_bitmap_set(hwloc_cpuset, cpu);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc_freebsd_hwloc2bsd(hwloc_const_bitmap_t hwloc_cpuset, cpuset_t *cpuset)
|
|
||||||
{
|
|
||||||
unsigned cpu;
|
|
||||||
CPU_ZERO(cpuset);
|
|
||||||
for (cpu = 0; cpu < CPU_SETSIZE; cpu++)
|
|
||||||
if (hwloc_bitmap_isset(hwloc_cpuset, cpu))
|
|
||||||
CPU_SET(cpu, cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_set_sth_affinity(hwloc_topology_t topology __hwloc_attribute_unused, cpulevel_t level, cpuwhich_t which, id_t id, hwloc_const_bitmap_t hwloc_cpuset, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
cpuset_t cpuset;
|
|
||||||
|
|
||||||
hwloc_freebsd_hwloc2bsd(hwloc_cpuset, &cpuset);
|
|
||||||
|
|
||||||
if (cpuset_setaffinity(level, which, id, sizeof(cpuset), &cpuset))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_get_sth_affinity(hwloc_topology_t topology __hwloc_attribute_unused, cpulevel_t level, cpuwhich_t which, id_t id, hwloc_bitmap_t hwloc_cpuset, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
cpuset_t cpuset;
|
|
||||||
|
|
||||||
if (cpuset_getaffinity(level, which, id, sizeof(cpuset), &cpuset))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
hwloc_freebsd_bsd2hwloc(hwloc_cpuset, &cpuset);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_freebsd_set_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_freebsd_get_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, -1, hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_freebsd_set_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_freebsd_get_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_TID, -1, hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_freebsd_set_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, pid, hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_freebsd_get_sth_affinity(topology, CPU_LEVEL_WHICH, CPU_WHICH_PID, pid, hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef hwloc_thread_t
|
|
||||||
|
|
||||||
#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
|
|
||||||
#pragma weak pthread_setaffinity_np
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_set_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t tid, hwloc_const_bitmap_t hwloc_cpuset, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
cpuset_t cpuset;
|
|
||||||
|
|
||||||
if (!pthread_setaffinity_np) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_freebsd_hwloc2bsd(hwloc_cpuset, &cpuset);
|
|
||||||
|
|
||||||
err = pthread_setaffinity_np(tid, sizeof(cpuset), &cpuset);
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
errno = err;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
|
|
||||||
#pragma weak pthread_getaffinity_np
|
|
||||||
static int
|
|
||||||
hwloc_freebsd_get_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t tid, hwloc_bitmap_t hwloc_cpuset, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
int err;
|
|
||||||
cpuset_t cpuset;
|
|
||||||
|
|
||||||
if (!pthread_getaffinity_np) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = pthread_getaffinity_np(tid, sizeof(cpuset), &cpuset);
|
|
||||||
|
|
||||||
if (err) {
|
|
||||||
errno = err;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_freebsd_bsd2hwloc(hwloc_cpuset, &cpuset);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_freebsd(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned nbprocs = hwloc_fallback_nbprocessors(topology);
|
|
||||||
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
topology->levels[0][0]->attr->machine.huge_page_size_kB = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hwloc_set_freebsd_hooks(topology);
|
|
||||||
hwloc_look_x86(topology, nbprocs);
|
|
||||||
|
|
||||||
hwloc_setup_pu_level(topology, nbprocs);
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "FreeBSD");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_freebsd_hooks(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
#ifdef HAVE_SYS_CPUSET_H
|
|
||||||
topology->set_thisproc_cpubind = hwloc_freebsd_set_thisproc_cpubind;
|
|
||||||
topology->get_thisproc_cpubind = hwloc_freebsd_get_thisproc_cpubind;
|
|
||||||
topology->set_thisthread_cpubind = hwloc_freebsd_set_thisthread_cpubind;
|
|
||||||
topology->get_thisthread_cpubind = hwloc_freebsd_get_thisthread_cpubind;
|
|
||||||
topology->set_proc_cpubind = hwloc_freebsd_set_proc_cpubind;
|
|
||||||
topology->get_proc_cpubind = hwloc_freebsd_get_proc_cpubind;
|
|
||||||
#ifdef hwloc_thread_t
|
|
||||||
#if HAVE_DECL_PTHREAD_SETAFFINITY_NP
|
|
||||||
topology->set_thread_cpubind = hwloc_freebsd_set_thread_cpubind;
|
|
||||||
#endif
|
|
||||||
#if HAVE_DECL_PTHREAD_GETAFFINITY_NP
|
|
||||||
topology->get_thread_cpubind = hwloc_freebsd_get_thread_cpubind;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
/* TODO: get_last_cpu_location: find out ki_lastcpu */
|
|
||||||
}
|
|
|
@ -1,262 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* TODO: psets? (Only for root)
|
|
||||||
* since 11i 1.6:
|
|
||||||
_SC_PSET_SUPPORT
|
|
||||||
pset_create/destroy/assign/setattr
|
|
||||||
pset_ctl/getattr
|
|
||||||
pset_bind()
|
|
||||||
pthread_pset_bind_np()
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <sys/mpctl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
static ldom_t
|
|
||||||
hwloc_hpux_find_ldom(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set)
|
|
||||||
{
|
|
||||||
int has_numa = sysconf(_SC_CCNUMA_SUPPORT) == 1;
|
|
||||||
hwloc_obj_t obj;
|
|
||||||
|
|
||||||
if (!has_numa)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
obj = hwloc_get_first_largest_obj_inside_cpuset(topology, hwloc_set);
|
|
||||||
if (!hwloc_bitmap_isequal(obj->cpuset, hwloc_set) || obj->type != HWLOC_OBJ_NODE) {
|
|
||||||
/* Does not correspond to exactly one node */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return obj->os_index;
|
|
||||||
}
|
|
||||||
|
|
||||||
static spu_t
|
|
||||||
hwloc_hpux_find_spu(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_const_bitmap_t hwloc_set)
|
|
||||||
{
|
|
||||||
spu_t cpu;
|
|
||||||
|
|
||||||
cpu = hwloc_bitmap_first(hwloc_set);
|
|
||||||
if (cpu != -1 && hwloc_bitmap_weight(hwloc_set) == 1)
|
|
||||||
return cpu;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: get_cpubind not available on HP-UX */
|
|
||||||
static int
|
|
||||||
hwloc_hpux_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
ldom_t ldom;
|
|
||||||
spu_t cpu;
|
|
||||||
|
|
||||||
/* Drop previous binding */
|
|
||||||
mpctl(MPC_SETLDOM, MPC_LDOMFLOAT, pid);
|
|
||||||
mpctl(MPC_SETPROCESS, MPC_SPUFLOAT, pid);
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ldom = hwloc_hpux_find_ldom(topology, hwloc_set);
|
|
||||||
if (ldom != -1)
|
|
||||||
return mpctl(MPC_SETLDOM, ldom, pid);
|
|
||||||
|
|
||||||
cpu = hwloc_hpux_find_spu(topology, hwloc_set);
|
|
||||||
if (cpu != -1)
|
|
||||||
return mpctl(flags & HWLOC_CPUBIND_STRICT ? MPC_SETPROCESS_FORCE : MPC_SETPROCESS, cpu, pid);
|
|
||||||
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_hpux_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_hpux_set_proc_cpubind(topology, MPC_SELFPID, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef hwloc_thread_t
|
|
||||||
static int
|
|
||||||
hwloc_hpux_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t pthread, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
ldom_t ldom, ldom2;
|
|
||||||
spu_t cpu, cpu2;
|
|
||||||
|
|
||||||
/* Drop previous binding */
|
|
||||||
pthread_ldom_bind_np(&ldom2, PTHREAD_LDOMFLOAT_NP, pthread);
|
|
||||||
pthread_processor_bind_np(PTHREAD_BIND_ADVISORY_NP, &cpu2, PTHREAD_SPUFLOAT_NP, pthread);
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology)))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
ldom = hwloc_hpux_find_ldom(topology, hwloc_set);
|
|
||||||
if (ldom != -1)
|
|
||||||
return pthread_ldom_bind_np(&ldom2, ldom, pthread);
|
|
||||||
|
|
||||||
cpu = hwloc_hpux_find_spu(topology, hwloc_set);
|
|
||||||
if (cpu != -1)
|
|
||||||
return pthread_processor_bind_np(flags & HWLOC_CPUBIND_STRICT ? PTHREAD_BIND_FORCED_NP : PTHREAD_BIND_ADVISORY_NP, &cpu2, cpu, pthread);
|
|
||||||
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_hpux_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_hpux_set_thread_cpubind(topology, PTHREAD_SELFTID_NP, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* According to HP docs, HP-UX up to 11iv2 don't support migration */
|
|
||||||
|
|
||||||
#ifdef MAP_MEM_FIRST_TOUCH
|
|
||||||
static void*
|
|
||||||
hwloc_hpux_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
int mmap_flags;
|
|
||||||
|
|
||||||
/* Can not give a set of nodes. */
|
|
||||||
if (!hwloc_bitmap_isequal(nodeset, hwloc_topology_get_complete_nodeset(topology))) {
|
|
||||||
errno = EXDEV;
|
|
||||||
return hwloc_alloc_or_fail(topology, len, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
mmap_flags = 0;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_FIRSTTOUCH:
|
|
||||||
mmap_flags = MAP_MEM_FIRST_TOUCH;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_INTERLEAVE:
|
|
||||||
mmap_flags = MAP_MEM_INTERLEAVED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return mmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | mmap_flags, -1, 0);
|
|
||||||
}
|
|
||||||
#endif /* MAP_MEM_FIRST_TOUCH */
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_hpux(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
int has_numa = sysconf(_SC_CCNUMA_SUPPORT) == 1;
|
|
||||||
hwloc_obj_t *nodes = NULL, obj;
|
|
||||||
spu_t currentcpu;
|
|
||||||
ldom_t currentnode;
|
|
||||||
int i, nbnodes = 0;
|
|
||||||
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
topology->levels[0][0]->attr->machine.huge_page_size_kB = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (has_numa) {
|
|
||||||
nbnodes = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
|
|
||||||
MPC_GETNUMLDOMS_SYS : MPC_GETNUMLDOMS, 0, 0);
|
|
||||||
|
|
||||||
hwloc_debug("%d nodes\n", nbnodes);
|
|
||||||
|
|
||||||
nodes = malloc(nbnodes * sizeof(*nodes));
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
currentnode = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
|
|
||||||
MPC_GETFIRSTLDOM_SYS : MPC_GETFIRSTLDOM, 0, 0);
|
|
||||||
while (currentnode != -1 && i < nbnodes) {
|
|
||||||
hwloc_debug("node %d is %d\n", i, currentnode);
|
|
||||||
nodes[i] = obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, currentnode);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, currentnode);
|
|
||||||
/* TODO: obj->attr->node.memory_kB */
|
|
||||||
/* TODO: obj->attr->node.huge_page_free */
|
|
||||||
|
|
||||||
currentnode = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
|
|
||||||
MPC_GETNEXTLDOM_SYS : MPC_GETNEXTLDOM, currentnode, 0);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
currentcpu = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
|
|
||||||
MPC_GETFIRSTSPU_SYS : MPC_GETFIRSTSPU, 0,0);
|
|
||||||
while (currentcpu != -1) {
|
|
||||||
obj = hwloc_alloc_setup_object(HWLOC_OBJ_PU, currentcpu);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->cpuset, currentcpu);
|
|
||||||
|
|
||||||
hwloc_debug("cpu %d\n", currentcpu);
|
|
||||||
|
|
||||||
if (nodes) {
|
|
||||||
/* Add this cpu to its node */
|
|
||||||
currentnode = mpctl(MPC_SPUTOLDOM, currentcpu, 0);
|
|
||||||
if ((ldom_t) nodes[i]->os_index != currentnode)
|
|
||||||
for (i = 0; i < nbnodes; i++)
|
|
||||||
if ((ldom_t) nodes[i]->os_index == currentnode)
|
|
||||||
break;
|
|
||||||
if (i < nbnodes) {
|
|
||||||
hwloc_bitmap_set(nodes[i]->cpuset, currentcpu);
|
|
||||||
hwloc_debug("is in node %d\n", i);
|
|
||||||
} else {
|
|
||||||
hwloc_debug("%s", "is in no node?!\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Add cpu */
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
|
|
||||||
currentcpu = mpctl(topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM ?
|
|
||||||
MPC_GETNEXTSPU_SYS : MPC_GETNEXTSPU, currentcpu, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nodes) {
|
|
||||||
/* Add nodes */
|
|
||||||
for (i = 0 ; i < nbnodes ; i++)
|
|
||||||
hwloc_insert_object_by_cpuset(topology, nodes[i]);
|
|
||||||
free(nodes);
|
|
||||||
}
|
|
||||||
|
|
||||||
topology->support.discovery->pu = 1;
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "HP-UX");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_hpux_hooks(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
topology->set_proc_cpubind = hwloc_hpux_set_proc_cpubind;
|
|
||||||
topology->set_thisproc_cpubind = hwloc_hpux_set_thisproc_cpubind;
|
|
||||||
#ifdef hwloc_thread_t
|
|
||||||
topology->set_thread_cpubind = hwloc_hpux_set_thread_cpubind;
|
|
||||||
topology->set_thisthread_cpubind = hwloc_hpux_set_thisthread_cpubind;
|
|
||||||
#endif
|
|
||||||
#ifdef MAP_MEM_FIRST_TOUCH
|
|
||||||
topology->alloc_membind = hwloc_hpux_alloc_membind;
|
|
||||||
topology->alloc = hwloc_alloc_mmap;
|
|
||||||
topology->free_membind = hwloc_free_mmap;
|
|
||||||
topology->support.membind->firsttouch_membind = 1;
|
|
||||||
topology->support.membind->bind_membind = 1;
|
|
||||||
topology->support.membind->interleave_membind = 1;
|
|
||||||
#endif /* MAP_MEM_FIRST_TOUCH */
|
|
||||||
}
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,343 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <numa.h>
|
|
||||||
#include <radset.h>
|
|
||||||
#include <cpuset.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* TODO
|
|
||||||
*
|
|
||||||
* nsg_init(), nsg_attach_pid(), RAD_MIGRATE/RAD_WAIT
|
|
||||||
* assign_pid_to_pset()
|
|
||||||
*
|
|
||||||
* pthread_use_only_cpu too?
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
prepare_radset(hwloc_topology_t topology, radset_t *radset, hwloc_const_bitmap_t hwloc_set)
|
|
||||||
{
|
|
||||||
unsigned cpu;
|
|
||||||
cpuset_t target_cpuset;
|
|
||||||
cpuset_t cpuset, xor_cpuset;
|
|
||||||
radid_t radid;
|
|
||||||
int ret = 0;
|
|
||||||
int ret_errno = 0;
|
|
||||||
|
|
||||||
cpusetcreate(&target_cpuset);
|
|
||||||
cpuemptyset(target_cpuset);
|
|
||||||
hwloc_bitmap_foreach_begin(cpu, hwloc_set)
|
|
||||||
cpuaddset(target_cpuset, cpu);
|
|
||||||
hwloc_bitmap_foreach_end();
|
|
||||||
|
|
||||||
cpusetcreate(&cpuset);
|
|
||||||
cpusetcreate(&xor_cpuset);
|
|
||||||
for (radid = 0; radid < topology->backend_params.osf.nbnodes; radid++) {
|
|
||||||
cpuemptyset(cpuset);
|
|
||||||
if (rad_get_cpus(radid, cpuset)==-1) {
|
|
||||||
fprintf(stderr,"rad_get_cpus(%d) failed: %s\n",radid,strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
cpuxorset(target_cpuset, cpuset, xor_cpuset);
|
|
||||||
if (cpucountset(xor_cpuset) == 0) {
|
|
||||||
/* Found it */
|
|
||||||
radsetcreate(radset);
|
|
||||||
rademptyset(*radset);
|
|
||||||
radaddset(*radset, radid);
|
|
||||||
ret = 1;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* radset containing exactly this set of CPUs not found */
|
|
||||||
ret_errno = EXDEV;
|
|
||||||
|
|
||||||
out:
|
|
||||||
cpusetdestroy(&target_cpuset);
|
|
||||||
cpusetdestroy(&cpuset);
|
|
||||||
cpusetdestroy(&xor_cpuset);
|
|
||||||
errno = ret_errno;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Note: get_cpubind not available on OSF */
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_osf_set_thread_cpubind(hwloc_topology_t topology, hwloc_thread_t thread, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
radset_t radset;
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
|
|
||||||
if ((errno = pthread_rad_detach(thread)))
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Apparently OSF migrates pages */
|
|
||||||
if (flags & HWLOC_CPUBIND_NOMEMBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!prepare_radset(topology, &radset, hwloc_set))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (flags & HWLOC_CPUBIND_STRICT) {
|
|
||||||
if ((errno = pthread_rad_bind(thread, radset, RAD_INSIST | RAD_WAIT)))
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
if ((errno = pthread_rad_attach(thread, radset, RAD_WAIT)))
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
radsetdestroy(&radset);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_osf_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
radset_t radset;
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
|
|
||||||
if (rad_detach_pid(pid))
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Apparently OSF migrates pages */
|
|
||||||
if (flags & HWLOC_CPUBIND_NOMEMBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!prepare_radset(topology, &radset, hwloc_set))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (flags & HWLOC_CPUBIND_STRICT) {
|
|
||||||
if (rad_bind_pid(pid, radset, RAD_INSIST | RAD_WAIT))
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
if (rad_attach_pid(pid, radset, RAD_WAIT))
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
radsetdestroy(&radset);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_osf_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_osf_set_thread_cpubind(topology, pthread_self(), hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_osf_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_osf_set_proc_cpubind(topology, getpid(), hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_osf_prepare_mattr(hwloc_topology_t topology __hwloc_attribute_unused, memalloc_attr_t *mattr, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
unsigned long osf_policy;
|
|
||||||
int node;
|
|
||||||
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_FIRSTTOUCH:
|
|
||||||
osf_policy = MPOL_THREAD;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
osf_policy = MPOL_DIRECTED;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_INTERLEAVE:
|
|
||||||
osf_policy = MPOL_STRIPPED;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_REPLICATE:
|
|
||||||
osf_policy = MPOL_REPLICATED;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
memset(mattr, 0, sizeof(*mattr));
|
|
||||||
mattr->mattr_policy = osf_policy;
|
|
||||||
mattr->mattr_rad = RAD_NONE;
|
|
||||||
radsetcreate(&mattr->mattr_radset);
|
|
||||||
rademptyset(mattr->mattr_radset);
|
|
||||||
|
|
||||||
hwloc_bitmap_foreach_begin(node, nodeset)
|
|
||||||
radaddset(mattr->mattr_radset, node);
|
|
||||||
hwloc_bitmap_foreach_end();
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_osf_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
memalloc_attr_t mattr;
|
|
||||||
int behavior = 0;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
if (flags & HWLOC_MEMBIND_MIGRATE)
|
|
||||||
behavior |= MADV_CURRENT;
|
|
||||||
if (flags & HWLOC_MEMBIND_STRICT)
|
|
||||||
behavior |= MADV_INSIST;
|
|
||||||
|
|
||||||
if (hwloc_osf_prepare_mattr(topology, &mattr, nodeset, policy, flags))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
ret = nmadvise(addr, len, MADV_CURRENT, &mattr);
|
|
||||||
radsetdestroy(&mattr.mattr_radset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
hwloc_osf_alloc_membind(hwloc_topology_t topology, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
memalloc_attr_t mattr;
|
|
||||||
void *ptr;
|
|
||||||
|
|
||||||
if (hwloc_osf_prepare_mattr(topology, &mattr, nodeset, policy, flags))
|
|
||||||
return hwloc_alloc_or_fail(topology, len, flags);
|
|
||||||
|
|
||||||
/* TODO: rather use acreate/amalloc ? */
|
|
||||||
ptr = nmmap(NULL, len, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1,
|
|
||||||
0, &mattr);
|
|
||||||
radsetdestroy(&mattr.mattr_radset);
|
|
||||||
return ptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_osf(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
cpu_cursor_t cursor;
|
|
||||||
unsigned nbnodes;
|
|
||||||
radid_t radid, radid2;
|
|
||||||
radset_t radset, radset2;
|
|
||||||
cpuid_t cpuid;
|
|
||||||
cpuset_t cpuset;
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
unsigned distance;
|
|
||||||
|
|
||||||
topology->backend_params.osf.nbnodes = nbnodes = rad_get_num();
|
|
||||||
|
|
||||||
cpusetcreate(&cpuset);
|
|
||||||
radsetcreate(&radset);
|
|
||||||
radsetcreate(&radset2);
|
|
||||||
{
|
|
||||||
hwloc_obj_t *nodes = calloc(nbnodes, sizeof(hwloc_obj_t));
|
|
||||||
unsigned *indexes = calloc(nbnodes, sizeof(unsigned));
|
|
||||||
float *distances = calloc(nbnodes*nbnodes, sizeof(float));
|
|
||||||
unsigned nfound;
|
|
||||||
numa_attr_t attr;
|
|
||||||
|
|
||||||
attr.nattr_type = R_RAD;
|
|
||||||
attr.nattr_descr.rd_radset = radset;
|
|
||||||
attr.nattr_flags = 0;
|
|
||||||
|
|
||||||
for (radid = 0; radid < (radid_t) nbnodes; radid++) {
|
|
||||||
rademptyset(radset);
|
|
||||||
radaddset(radset, radid);
|
|
||||||
cpuemptyset(cpuset);
|
|
||||||
if (rad_get_cpus(radid, cpuset)==-1) {
|
|
||||||
fprintf(stderr,"rad_get_cpus(%d) failed: %s\n",radid,strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
indexes[radid] = radid;
|
|
||||||
nodes[radid] = obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, radid);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
obj->memory.local_memory = rad_get_physmem(radid) * getpagesize();
|
|
||||||
obj->memory.page_types_len = 2;
|
|
||||||
obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types[0].size = getpagesize();
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
cursor = SET_CURSOR_INIT;
|
|
||||||
while((cpuid = cpu_foreach(cpuset, 0, &cursor)) != CPU_NONE)
|
|
||||||
hwloc_bitmap_set(obj->cpuset, cpuid);
|
|
||||||
|
|
||||||
hwloc_debug_1arg_bitmap("node %d has cpuset %s\n",
|
|
||||||
radid, obj->cpuset);
|
|
||||||
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
|
|
||||||
nfound = 0;
|
|
||||||
for (radid2 = 0; radid2 < (radid_t) nbnodes; radid2++)
|
|
||||||
distances[radid*nbnodes+radid2] = RAD_DIST_REMOTE;
|
|
||||||
for (distance = RAD_DIST_LOCAL; distance < RAD_DIST_REMOTE; distance++) {
|
|
||||||
attr.nattr_distance = distance;
|
|
||||||
/* get set of NUMA nodes at distance <= DISTANCE */
|
|
||||||
if (nloc(&attr, radset2)) {
|
|
||||||
fprintf(stderr,"nloc failed: %s\n", strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
cursor = SET_CURSOR_INIT;
|
|
||||||
while ((radid2 = rad_foreach(radset2, 0, &cursor)) != RAD_NONE) {
|
|
||||||
if (distances[radid*nbnodes+radid2] == RAD_DIST_REMOTE) {
|
|
||||||
distances[radid*nbnodes+radid2] = (float) distance;
|
|
||||||
nfound++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (nfound == nbnodes)
|
|
||||||
/* Finished finding distances, no need to go up to RAD_DIST_REMOTE */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_topology__set_distance_matrix(topology, HWLOC_OBJ_NODE, nbnodes, indexes, nodes, distances);
|
|
||||||
}
|
|
||||||
radsetdestroy(&radset2);
|
|
||||||
radsetdestroy(&radset);
|
|
||||||
cpusetdestroy(&cpuset);
|
|
||||||
|
|
||||||
/* add PU objects */
|
|
||||||
hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "OSF");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_osf_hooks(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
topology->set_thread_cpubind = hwloc_osf_set_thread_cpubind;
|
|
||||||
topology->set_thisthread_cpubind = hwloc_osf_set_thisthread_cpubind;
|
|
||||||
topology->set_proc_cpubind = hwloc_osf_set_proc_cpubind;
|
|
||||||
topology->set_thisproc_cpubind = hwloc_osf_set_thisproc_cpubind;
|
|
||||||
topology->set_area_membind = hwloc_osf_set_area_membind;
|
|
||||||
topology->alloc_membind = hwloc_osf_alloc_membind;
|
|
||||||
topology->alloc = hwloc_alloc_mmap;
|
|
||||||
topology->free_membind = hwloc_free_mmap;
|
|
||||||
topology->support.membind->firsttouch_membind = 1;
|
|
||||||
topology->support.membind->bind_membind = 1;
|
|
||||||
topology->support.membind->interleave_membind = 1;
|
|
||||||
topology->support.membind->replicate_membind = 1;
|
|
||||||
}
|
|
|
@ -1,667 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/processor.h>
|
|
||||||
#include <sys/procset.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
# include <sys/lgrp_user.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TODO: use psets? (only for root)
|
|
||||||
* TODO: get cache info from prtdiag? (it is setgid sys to be able to read from
|
|
||||||
* crw-r----- 1 root sys 88, 0 nov 3 14:35 /devices/pseudo/devinfo@0:devinfo
|
|
||||||
* and run (apparently undocumented) ioctls on it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_sth_cpubind(hwloc_topology_t topology, idtype_t idtype, id_t id, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
unsigned target_cpu;
|
|
||||||
|
|
||||||
/* The resulting binding is always strict */
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(hwloc_set, hwloc_topology_get_complete_cpuset(topology))) {
|
|
||||||
if (processor_bind(idtype, id, PBIND_NONE, NULL) != 0)
|
|
||||||
return -1;
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
if (!(flags & HWLOC_CPUBIND_NOMEMBIND)) {
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
if (depth >= 0) {
|
|
||||||
int n = hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_NONE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LIBLGRP */
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
if (!(flags & HWLOC_CPUBIND_NOMEMBIND)) {
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
if (depth >= 0) {
|
|
||||||
int n = hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
int i;
|
|
||||||
int ok;
|
|
||||||
hwloc_bitmap_t target = hwloc_bitmap_alloc();
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (hwloc_bitmap_isincluded(obj->cpuset, hwloc_set))
|
|
||||||
hwloc_bitmap_or(target, target, obj->cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = hwloc_bitmap_isequal(target, hwloc_set);
|
|
||||||
hwloc_bitmap_free(target);
|
|
||||||
|
|
||||||
if (ok) {
|
|
||||||
/* Ok, managed to achieve hwloc_set by just combining NUMA nodes */
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isincluded(obj->cpuset, hwloc_set)) {
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_STRONG);
|
|
||||||
} else {
|
|
||||||
if (flags & HWLOC_CPUBIND_STRICT)
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_NONE);
|
|
||||||
else
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_WEAK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LIBLGRP */
|
|
||||||
|
|
||||||
if (hwloc_bitmap_weight(hwloc_set) != 1) {
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
target_cpu = hwloc_bitmap_first(hwloc_set);
|
|
||||||
|
|
||||||
if (processor_bind(idtype, id,
|
|
||||||
(processorid_t) (target_cpu), NULL) != 0)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_set_sth_cpubind(topology, P_PID, pid, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_set_sth_cpubind(topology, P_PID, P_MYID, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_set_sth_cpubind(topology, P_LWPID, P_MYID, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_sth_cpubind(hwloc_topology_t topology, idtype_t idtype, id_t id, hwloc_bitmap_t hwloc_set, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
int n;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (depth < 0) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_bitmap_zero(hwloc_set);
|
|
||||||
n = hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
lgrp_affinity_t aff = lgrp_affinity_get(idtype, id, obj->os_index);
|
|
||||||
|
|
||||||
if (aff == LGRP_AFF_STRONG)
|
|
||||||
hwloc_bitmap_or(hwloc_set, hwloc_set, obj->cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_iszero(hwloc_set))
|
|
||||||
hwloc_bitmap_copy(hwloc_set, hwloc_topology_get_complete_cpuset(topology));
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_proc_cpubind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_get_sth_cpubind(topology, P_PID, pid, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_get_sth_cpubind(topology, P_PID, P_MYID, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_thisthread_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_get_sth_cpubind(topology, P_LWPID, P_MYID, hwloc_set, flags);
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LIBLGRP */
|
|
||||||
|
|
||||||
/* TODO: given thread, probably not easy because of the historical n:m implementation */
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_sth_membind(hwloc_topology_t topology, idtype_t idtype, id_t id, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
int depth;
|
|
||||||
int n, i;
|
|
||||||
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & HWLOC_MEMBIND_NOCPUBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
if (depth < 0) {
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
n = hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
if (hwloc_bitmap_isset(nodeset, obj->os_index)) {
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_STRONG);
|
|
||||||
} else {
|
|
||||||
if (flags & HWLOC_CPUBIND_STRICT)
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_NONE);
|
|
||||||
else
|
|
||||||
lgrp_affinity_set(idtype, id, obj->os_index, LGRP_AFF_WEAK);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_set_sth_membind(topology, P_PID, pid, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_thisproc_membind(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_set_sth_membind(topology, P_PID, P_MYID, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_thisthread_membind(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_set_sth_membind(topology, P_LWPID, P_MYID, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_sth_membind(hwloc_topology_t topology, idtype_t idtype, id_t id, hwloc_nodeset_t nodeset, hwloc_membind_policy_t *policy, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
int depth = hwloc_get_type_depth(topology, HWLOC_OBJ_NODE);
|
|
||||||
int n;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if (depth < 0) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
n = hwloc_get_nbobjs_by_depth(topology, depth);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
hwloc_obj_t obj = hwloc_get_obj_by_depth(topology, depth, i);
|
|
||||||
lgrp_affinity_t aff = lgrp_affinity_get(idtype, id, obj->os_index);
|
|
||||||
|
|
||||||
if (aff == LGRP_AFF_STRONG)
|
|
||||||
hwloc_bitmap_set(nodeset, obj->os_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_iszero(nodeset))
|
|
||||||
hwloc_bitmap_copy(nodeset, hwloc_topology_get_complete_nodeset(topology));
|
|
||||||
|
|
||||||
*policy = HWLOC_MEMBIND_DEFAULT;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_get_sth_membind(topology, P_PID, pid, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_thisproc_membind(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_get_sth_membind(topology, P_PID, P_MYID, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_solaris_get_thisthread_membind(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t *policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_solaris_get_sth_membind(topology, P_LWPID, P_MYID, nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LIBLGRP */
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef MADV_ACCESS_LWP
|
|
||||||
static int
|
|
||||||
hwloc_solaris_set_area_membind(hwloc_topology_t topology, const void *addr, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
int advice;
|
|
||||||
size_t remainder;
|
|
||||||
|
|
||||||
/* Can not give a set of nodes just for an area. */
|
|
||||||
if (!hwloc_bitmap_isequal(nodeset, hwloc_topology_get_complete_nodeset(topology))) {
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
advice = MADV_ACCESS_DEFAULT;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_FIRSTTOUCH:
|
|
||||||
case HWLOC_MEMBIND_NEXTTOUCH:
|
|
||||||
advice = MADV_ACCESS_LWP;
|
|
||||||
break;
|
|
||||||
case HWLOC_MEMBIND_INTERLEAVE:
|
|
||||||
advice = MADV_ACCESS_MANY;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
remainder = (uintptr_t) addr & (sysconf(_SC_PAGESIZE)-1);
|
|
||||||
addr = (char*) addr - remainder;
|
|
||||||
len += remainder;
|
|
||||||
return madvise((void*) addr, len, advice);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
static void
|
|
||||||
browse(struct hwloc_topology *topology, lgrp_cookie_t cookie, lgrp_id_t lgrp, hwloc_obj_t *glob_lgrps, unsigned *curlgrp)
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
hwloc_obj_t obj;
|
|
||||||
lgrp_mem_size_t mem_size;
|
|
||||||
|
|
||||||
n = lgrp_cpus(cookie, lgrp, NULL, 0, LGRP_CONTENT_HIERARCHY);
|
|
||||||
if (n == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Is this lgrp a NUMA node? */
|
|
||||||
if ((mem_size = lgrp_mem_size(cookie, lgrp, LGRP_MEM_SZ_INSTALLED, LGRP_CONTENT_DIRECT)) > 0)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
processorid_t *cpuids;
|
|
||||||
cpuids = malloc(sizeof(processorid_t) * n);
|
|
||||||
assert(cpuids != NULL);
|
|
||||||
|
|
||||||
obj = hwloc_alloc_setup_object(HWLOC_OBJ_NODE, lgrp);
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, lgrp);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
glob_lgrps[(*curlgrp)++] = obj;
|
|
||||||
|
|
||||||
lgrp_cpus(cookie, lgrp, cpuids, n, LGRP_CONTENT_HIERARCHY);
|
|
||||||
for (i = 0; i < n ; i++) {
|
|
||||||
hwloc_debug("node %ld's cpu %d is %d\n", lgrp, i, cpuids[i]);
|
|
||||||
hwloc_bitmap_set(obj->cpuset, cpuids[i]);
|
|
||||||
}
|
|
||||||
hwloc_debug_1arg_bitmap("node %ld has cpuset %s\n",
|
|
||||||
lgrp, obj->cpuset);
|
|
||||||
|
|
||||||
/* or LGRP_MEM_SZ_FREE */
|
|
||||||
hwloc_debug("node %ld has %lldkB\n", lgrp, mem_size/1024);
|
|
||||||
obj->memory.local_memory = mem_size;
|
|
||||||
obj->memory.page_types_len = 2;
|
|
||||||
obj->memory.page_types = malloc(2*sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, 2*sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types[0].size = getpagesize();
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
free(cpuids);
|
|
||||||
}
|
|
||||||
|
|
||||||
n = lgrp_children(cookie, lgrp, NULL, 0);
|
|
||||||
{
|
|
||||||
lgrp_id_t *lgrps;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
lgrps = malloc(sizeof(lgrp_id_t) * n);
|
|
||||||
assert(lgrps != NULL);
|
|
||||||
lgrp_children(cookie, lgrp, lgrps, n);
|
|
||||||
hwloc_debug("lgrp %ld has %d children\n", lgrp, n);
|
|
||||||
for (i = 0; i < n ; i++)
|
|
||||||
{
|
|
||||||
browse(topology, cookie, lgrps[i], glob_lgrps, curlgrp);
|
|
||||||
}
|
|
||||||
hwloc_debug("lgrp %ld's children done\n", lgrp);
|
|
||||||
free(lgrps);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc_look_lgrp(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
lgrp_cookie_t cookie;
|
|
||||||
unsigned curlgrp = 0;
|
|
||||||
int nlgrps;
|
|
||||||
lgrp_id_t root;
|
|
||||||
|
|
||||||
if ((topology->flags & HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM))
|
|
||||||
cookie = lgrp_init(LGRP_VIEW_OS);
|
|
||||||
else
|
|
||||||
cookie = lgrp_init(LGRP_VIEW_CALLER);
|
|
||||||
if (cookie == LGRP_COOKIE_NONE)
|
|
||||||
{
|
|
||||||
hwloc_debug("lgrp_init failed: %s\n", strerror(errno));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
nlgrps = lgrp_nlgrps(cookie);
|
|
||||||
root = lgrp_root(cookie);
|
|
||||||
{
|
|
||||||
hwloc_obj_t *glob_lgrps = calloc(nlgrps, sizeof(hwloc_obj_t));
|
|
||||||
browse(topology, cookie, root, glob_lgrps, &curlgrp);
|
|
||||||
#ifdef HAVE_LGRP_LATENCY_COOKIE
|
|
||||||
{
|
|
||||||
float *distances = calloc(curlgrp*curlgrp, sizeof(float));
|
|
||||||
unsigned *indexes = calloc(curlgrp,sizeof(unsigned));
|
|
||||||
unsigned i, j;
|
|
||||||
for (i = 0; i < curlgrp; i++) {
|
|
||||||
indexes[i] = glob_lgrps[i]->os_index;
|
|
||||||
for (j = 0; j < curlgrp; j++)
|
|
||||||
distances[i*curlgrp+j] = (float) lgrp_latency_cookie(cookie, glob_lgrps[i]->os_index, glob_lgrps[j]->os_index, LGRP_LAT_CPU_TO_MEM);
|
|
||||||
}
|
|
||||||
hwloc_topology__set_distance_matrix(topology, HWLOC_OBJ_NODE, curlgrp, indexes, glob_lgrps, distances);
|
|
||||||
}
|
|
||||||
#endif /* HAVE_LGRP_LATENCY_COOKIE */
|
|
||||||
}
|
|
||||||
lgrp_fini(cookie);
|
|
||||||
}
|
|
||||||
#endif /* LIBLGRP */
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBKSTAT
|
|
||||||
#include <kstat.h>
|
|
||||||
#define HWLOC_NBMAXCPUS 1024 /* FIXME: drop */
|
|
||||||
static int
|
|
||||||
hwloc_look_kstat(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
kstat_ctl_t *kc = kstat_open();
|
|
||||||
kstat_t *ksp;
|
|
||||||
kstat_named_t *stat;
|
|
||||||
unsigned look_cores = 1, look_chips = 1;
|
|
||||||
|
|
||||||
unsigned numsockets = 0;
|
|
||||||
unsigned proc_physids[HWLOC_NBMAXCPUS];
|
|
||||||
unsigned proc_osphysids[HWLOC_NBMAXCPUS];
|
|
||||||
unsigned osphysids[HWLOC_NBMAXCPUS];
|
|
||||||
|
|
||||||
unsigned numcores = 0;
|
|
||||||
unsigned proc_coreids[HWLOC_NBMAXCPUS];
|
|
||||||
unsigned oscoreids[HWLOC_NBMAXCPUS];
|
|
||||||
|
|
||||||
unsigned core_osphysids[HWLOC_NBMAXCPUS];
|
|
||||||
|
|
||||||
unsigned numprocs = 0;
|
|
||||||
unsigned proc_procids[HWLOC_NBMAXCPUS];
|
|
||||||
unsigned osprocids[HWLOC_NBMAXCPUS];
|
|
||||||
|
|
||||||
unsigned physid, coreid, cpuid;
|
|
||||||
unsigned procid_max = 0;
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
for (cpuid = 0; cpuid < HWLOC_NBMAXCPUS; cpuid++)
|
|
||||||
{
|
|
||||||
proc_procids[cpuid] = -1;
|
|
||||||
proc_physids[cpuid] = -1;
|
|
||||||
proc_osphysids[cpuid] = -1;
|
|
||||||
proc_coreids[cpuid] = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!kc)
|
|
||||||
{
|
|
||||||
hwloc_debug("kstat_open failed: %s\n", strerror(errno));
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (ksp = kc->kc_chain; ksp; ksp = ksp->ks_next)
|
|
||||||
{
|
|
||||||
if (strncmp("cpu_info", ksp->ks_module, 8))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
cpuid = ksp->ks_instance;
|
|
||||||
if (cpuid > HWLOC_NBMAXCPUS)
|
|
||||||
{
|
|
||||||
fprintf(stderr,"CPU id too big: %u\n", cpuid);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (kstat_read(kc, ksp, NULL) == -1)
|
|
||||||
{
|
|
||||||
fprintf(stderr, "kstat_read failed for CPU%u: %s\n", cpuid, strerror(errno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_debug("cpu%u\n", cpuid);
|
|
||||||
proc_procids[cpuid] = numprocs;
|
|
||||||
osprocids[numprocs] = cpuid;
|
|
||||||
numprocs++;
|
|
||||||
|
|
||||||
if (cpuid >= procid_max)
|
|
||||||
procid_max = cpuid + 1;
|
|
||||||
|
|
||||||
stat = (kstat_named_t *) kstat_data_lookup(ksp, "state");
|
|
||||||
if (!stat)
|
|
||||||
hwloc_debug("could not read state for CPU%u: %s\n", cpuid, strerror(errno));
|
|
||||||
else if (stat->data_type != KSTAT_DATA_CHAR)
|
|
||||||
hwloc_debug("unknown kstat type %d for cpu state\n", stat->data_type);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
hwloc_debug("cpu%u's state is %s\n", cpuid, stat->value.c);
|
|
||||||
if (strcmp(stat->value.c, "on-line"))
|
|
||||||
/* not online */
|
|
||||||
hwloc_bitmap_clr(topology->levels[0][0]->online_cpuset, cpuid);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (look_chips) do {
|
|
||||||
/* Get Chip ID */
|
|
||||||
stat = (kstat_named_t *) kstat_data_lookup(ksp, "chip_id");
|
|
||||||
if (!stat)
|
|
||||||
{
|
|
||||||
if (numsockets)
|
|
||||||
fprintf(stderr, "could not read socket id for CPU%u: %s\n", cpuid, strerror(errno));
|
|
||||||
else
|
|
||||||
hwloc_debug("could not read socket id for CPU%u: %s\n", cpuid, strerror(errno));
|
|
||||||
look_chips = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch (stat->data_type) {
|
|
||||||
case KSTAT_DATA_INT32:
|
|
||||||
physid = stat->value.i32;
|
|
||||||
break;
|
|
||||||
case KSTAT_DATA_UINT32:
|
|
||||||
physid = stat->value.ui32;
|
|
||||||
break;
|
|
||||||
#ifdef _INT64_TYPE
|
|
||||||
case KSTAT_DATA_UINT64:
|
|
||||||
physid = stat->value.ui64;
|
|
||||||
break;
|
|
||||||
case KSTAT_DATA_INT64:
|
|
||||||
physid = stat->value.i64;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "chip_id type %d unknown\n", stat->data_type);
|
|
||||||
look_chips = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
proc_osphysids[cpuid] = physid;
|
|
||||||
for (i = 0; i < numsockets; i++)
|
|
||||||
if (physid == osphysids[i])
|
|
||||||
break;
|
|
||||||
proc_physids[cpuid] = i;
|
|
||||||
hwloc_debug("%u on socket %u (%u)\n", cpuid, i, physid);
|
|
||||||
if (i == numsockets)
|
|
||||||
osphysids[numsockets++] = physid;
|
|
||||||
} while(0);
|
|
||||||
|
|
||||||
if (look_cores) do {
|
|
||||||
/* Get Core ID */
|
|
||||||
stat = (kstat_named_t *) kstat_data_lookup(ksp, "core_id");
|
|
||||||
if (!stat)
|
|
||||||
{
|
|
||||||
if (numcores)
|
|
||||||
fprintf(stderr, "could not read core id for CPU%u: %s\n", cpuid, strerror(errno));
|
|
||||||
else
|
|
||||||
hwloc_debug("could not read core id for CPU%u: %s\n", cpuid, strerror(errno));
|
|
||||||
look_cores = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
switch (stat->data_type) {
|
|
||||||
case KSTAT_DATA_INT32:
|
|
||||||
coreid = stat->value.i32;
|
|
||||||
break;
|
|
||||||
case KSTAT_DATA_UINT32:
|
|
||||||
coreid = stat->value.ui32;
|
|
||||||
break;
|
|
||||||
#ifdef _INT64_TYPE
|
|
||||||
case KSTAT_DATA_UINT64:
|
|
||||||
coreid = stat->value.ui64;
|
|
||||||
break;
|
|
||||||
case KSTAT_DATA_INT64:
|
|
||||||
coreid = stat->value.i64;
|
|
||||||
break;
|
|
||||||
#endif
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "core_id type %d unknown\n", stat->data_type);
|
|
||||||
look_cores = 0;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
for (i = 0; i < numcores; i++)
|
|
||||||
if (coreid == oscoreids[i] && proc_osphysids[cpuid] == core_osphysids[i])
|
|
||||||
break;
|
|
||||||
proc_coreids[cpuid] = i;
|
|
||||||
hwloc_debug("%u on core %u (%u)\n", cpuid, i, coreid);
|
|
||||||
if (i == numcores)
|
|
||||||
{
|
|
||||||
core_osphysids[numcores] = proc_osphysids[cpuid];
|
|
||||||
oscoreids[numcores++] = coreid;
|
|
||||||
}
|
|
||||||
} while(0);
|
|
||||||
|
|
||||||
/* Note: there is also clog_id for the Thread ID (not unique) and
|
|
||||||
* pkg_core_id for the core ID (not unique). They are not useful to us
|
|
||||||
* however. */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (look_chips)
|
|
||||||
hwloc_setup_level(procid_max, numsockets, osphysids, proc_physids, topology, HWLOC_OBJ_SOCKET);
|
|
||||||
|
|
||||||
if (look_cores)
|
|
||||||
hwloc_setup_level(procid_max, numcores, oscoreids, proc_coreids, topology, HWLOC_OBJ_CORE);
|
|
||||||
|
|
||||||
if (numprocs)
|
|
||||||
hwloc_setup_level(procid_max, numprocs, osprocids, proc_procids, topology, HWLOC_OBJ_PU);
|
|
||||||
|
|
||||||
kstat_close(kc);
|
|
||||||
|
|
||||||
return numprocs > 0;
|
|
||||||
}
|
|
||||||
#endif /* LIBKSTAT */
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_solaris(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
unsigned nbprocs = hwloc_fallback_nbprocessors (topology);
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
hwloc_look_lgrp(topology);
|
|
||||||
#endif /* HAVE_LIBLGRP */
|
|
||||||
#ifdef HAVE_LIBKSTAT
|
|
||||||
nbprocs = 0;
|
|
||||||
if (hwloc_look_kstat(topology))
|
|
||||||
return;
|
|
||||||
#endif /* HAVE_LIBKSTAT */
|
|
||||||
hwloc_setup_pu_level(topology, nbprocs);
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "Solaris");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_solaris_hooks(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
topology->set_proc_cpubind = hwloc_solaris_set_proc_cpubind;
|
|
||||||
topology->set_thisproc_cpubind = hwloc_solaris_set_thisproc_cpubind;
|
|
||||||
topology->set_thisthread_cpubind = hwloc_solaris_set_thisthread_cpubind;
|
|
||||||
#ifdef HAVE_LIBLGRP
|
|
||||||
topology->get_proc_cpubind = hwloc_solaris_get_proc_cpubind;
|
|
||||||
topology->get_thisproc_cpubind = hwloc_solaris_get_thisproc_cpubind;
|
|
||||||
topology->get_thisthread_cpubind = hwloc_solaris_get_thisthread_cpubind;
|
|
||||||
topology->set_proc_membind = hwloc_solaris_set_proc_membind;
|
|
||||||
topology->set_thisproc_membind = hwloc_solaris_set_thisproc_membind;
|
|
||||||
topology->set_thisthread_membind = hwloc_solaris_set_thisthread_membind;
|
|
||||||
topology->get_proc_membind = hwloc_solaris_get_proc_membind;
|
|
||||||
topology->get_thisproc_membind = hwloc_solaris_get_thisproc_membind;
|
|
||||||
topology->get_thisthread_membind = hwloc_solaris_get_thisthread_membind;
|
|
||||||
#endif /* HAVE_LIBLGRP */
|
|
||||||
#ifdef MADV_ACCESS_LWP
|
|
||||||
topology->set_area_membind = hwloc_solaris_set_area_membind;
|
|
||||||
topology->support.membind->firsttouch_membind = 1;
|
|
||||||
topology->support.membind->bind_membind = 1;
|
|
||||||
topology->support.membind->interleave_membind = 1;
|
|
||||||
topology->support.membind->nexttouch_membind = 1;
|
|
||||||
#endif
|
|
||||||
}
|
|
|
@ -1,335 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/misc.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <strings.h>
|
|
||||||
|
|
||||||
/* Read from DESCRIPTION a series of integers describing a symmetrical
|
|
||||||
topology and update `topology->synthetic_description' accordingly. On
|
|
||||||
success, return zero. */
|
|
||||||
int
|
|
||||||
hwloc_backend_synthetic_init(struct hwloc_topology *topology, const char *description)
|
|
||||||
{
|
|
||||||
const char *pos, *next_pos;
|
|
||||||
unsigned long item, count;
|
|
||||||
unsigned i;
|
|
||||||
int cache_depth = 0, group_depth = 0;
|
|
||||||
int nb_machine_levels = 0, nb_node_levels = 0;
|
|
||||||
int nb_pu_levels = 0;
|
|
||||||
|
|
||||||
assert(topology->backend_type == HWLOC_BACKEND_NONE);
|
|
||||||
|
|
||||||
for (pos = description, count = 1; *pos; pos = next_pos) {
|
|
||||||
#define HWLOC_OBJ_TYPE_UNKNOWN ((hwloc_obj_type_t) -1)
|
|
||||||
hwloc_obj_type_t type = HWLOC_OBJ_TYPE_UNKNOWN;
|
|
||||||
|
|
||||||
while (*pos == ' ')
|
|
||||||
pos++;
|
|
||||||
|
|
||||||
if (!*pos)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if (*pos < '0' || *pos > '9') {
|
|
||||||
if (!hwloc_namecoloncmp(pos, "machines", 2)) {
|
|
||||||
type = HWLOC_OBJ_MACHINE;
|
|
||||||
} else if (!hwloc_namecoloncmp(pos, "nodes", 1))
|
|
||||||
type = HWLOC_OBJ_NODE;
|
|
||||||
else if (!hwloc_namecoloncmp(pos, "sockets", 1))
|
|
||||||
type = HWLOC_OBJ_SOCKET;
|
|
||||||
else if (!hwloc_namecoloncmp(pos, "cores", 2))
|
|
||||||
type = HWLOC_OBJ_CORE;
|
|
||||||
else if (!hwloc_namecoloncmp(pos, "caches", 2))
|
|
||||||
type = HWLOC_OBJ_CACHE;
|
|
||||||
else if (!hwloc_namecoloncmp(pos, "pus", 1) || !hwloc_namecoloncmp(pos, "procs", 1) /* backward compatiblity with 0.9 */)
|
|
||||||
type = HWLOC_OBJ_PU;
|
|
||||||
else if (!hwloc_namecoloncmp(pos, "misc", 2))
|
|
||||||
type = HWLOC_OBJ_MISC;
|
|
||||||
else if (!hwloc_namecoloncmp(pos, "group", 2))
|
|
||||||
type = HWLOC_OBJ_GROUP;
|
|
||||||
else
|
|
||||||
fprintf(stderr, "Unknown object type `%s'\n", pos);
|
|
||||||
|
|
||||||
next_pos = strchr(pos, ':');
|
|
||||||
if (!next_pos) {
|
|
||||||
fprintf(stderr,"synthetic string doesn't have a `:' after object type at '%s'\n", pos);
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pos = next_pos + 1;
|
|
||||||
}
|
|
||||||
item = strtoul(pos, (char **)&next_pos, 0);
|
|
||||||
if (next_pos == pos) {
|
|
||||||
fprintf(stderr,"synthetic string doesn't have a number of objects at '%s'\n", pos);
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count + 1 >= HWLOC_SYNTHETIC_MAX_DEPTH) {
|
|
||||||
fprintf(stderr,"Too many synthetic levels, max %d\n", HWLOC_SYNTHETIC_MAX_DEPTH);
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (item > UINT_MAX) {
|
|
||||||
fprintf(stderr,"Too big arity, max %u\n", UINT_MAX);
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
topology->backend_params.synthetic.arity[count-1] = (unsigned)item;
|
|
||||||
topology->backend_params.synthetic.type[count] = type;
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count <= 0) {
|
|
||||||
fprintf(stderr,"synthetic string doesn't contain any object\n");
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=count-1; i>0; i--) {
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
|
|
||||||
type = topology->backend_params.synthetic.type[i];
|
|
||||||
|
|
||||||
if (type == HWLOC_OBJ_TYPE_UNKNOWN) {
|
|
||||||
if (i == count-1)
|
|
||||||
type = HWLOC_OBJ_PU;
|
|
||||||
else {
|
|
||||||
switch (topology->backend_params.synthetic.type[i+1]) {
|
|
||||||
case HWLOC_OBJ_PU: type = HWLOC_OBJ_CORE; break;
|
|
||||||
case HWLOC_OBJ_CORE: type = HWLOC_OBJ_CACHE; break;
|
|
||||||
case HWLOC_OBJ_CACHE: type = HWLOC_OBJ_SOCKET; break;
|
|
||||||
case HWLOC_OBJ_SOCKET: type = HWLOC_OBJ_NODE; break;
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
case HWLOC_OBJ_GROUP: type = HWLOC_OBJ_GROUP; break;
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
case HWLOC_OBJ_MISC: type = HWLOC_OBJ_MISC; break;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
topology->backend_params.synthetic.type[i] = type;
|
|
||||||
}
|
|
||||||
switch (type) {
|
|
||||||
case HWLOC_OBJ_PU:
|
|
||||||
if (nb_pu_levels) {
|
|
||||||
fprintf(stderr,"synthetic string can not have several PU levels\n");
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
nb_pu_levels++;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
cache_depth++;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
group_depth++;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
nb_node_levels++;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
nb_machine_levels++;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nb_pu_levels > 1) {
|
|
||||||
fprintf(stderr,"synthetic string can not have several PU levels\n");
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (nb_node_levels > 1) {
|
|
||||||
fprintf(stderr,"synthetic string can not have several NUMA node levels\n");
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (nb_machine_levels > 1) {
|
|
||||||
fprintf(stderr,"synthetic string can not have several machine levels\n");
|
|
||||||
errno = EINVAL;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nb_machine_levels)
|
|
||||||
topology->backend_params.synthetic.type[0] = HWLOC_OBJ_SYSTEM;
|
|
||||||
else {
|
|
||||||
topology->backend_params.synthetic.type[0] = HWLOC_OBJ_MACHINE;
|
|
||||||
nb_machine_levels++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cache_depth == 1)
|
|
||||||
/* if there is a single cache level, make it L2 */
|
|
||||||
cache_depth = 2;
|
|
||||||
|
|
||||||
for (i=0; i<count; i++) {
|
|
||||||
hwloc_obj_type_t type = topology->backend_params.synthetic.type[i];
|
|
||||||
|
|
||||||
if (type == HWLOC_OBJ_GROUP)
|
|
||||||
topology->backend_params.synthetic.depth[i] = group_depth--;
|
|
||||||
else if (type == HWLOC_OBJ_CACHE)
|
|
||||||
topology->backend_params.synthetic.depth[i] = cache_depth--;
|
|
||||||
}
|
|
||||||
|
|
||||||
topology->backend_type = HWLOC_BACKEND_SYNTHETIC;
|
|
||||||
topology->backend_params.synthetic.arity[count-1] = 0;
|
|
||||||
topology->is_thissystem = 0;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_backend_synthetic_exit(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
assert(topology->backend_type == HWLOC_BACKEND_SYNTHETIC);
|
|
||||||
topology->backend_type = HWLOC_BACKEND_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Recursively build objects whose cpu start at first_cpu
|
|
||||||
* - level gives where to look in the type, arity and id arrays
|
|
||||||
* - the id array is used as a variable to get unique IDs for a given level.
|
|
||||||
* - generated memory should be added to *memory_kB.
|
|
||||||
* - generated cpus should be added to parent_cpuset.
|
|
||||||
* - next cpu number to be used should be returned.
|
|
||||||
*/
|
|
||||||
static unsigned
|
|
||||||
hwloc__look_synthetic(struct hwloc_topology *topology,
|
|
||||||
int level, unsigned first_cpu,
|
|
||||||
hwloc_bitmap_t parent_cpuset)
|
|
||||||
{
|
|
||||||
hwloc_obj_t obj;
|
|
||||||
unsigned i;
|
|
||||||
hwloc_obj_type_t type = topology->backend_params.synthetic.type[level];
|
|
||||||
|
|
||||||
/* pre-hooks */
|
|
||||||
switch (type) {
|
|
||||||
case HWLOC_OBJ_MISC:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_SYSTEM:
|
|
||||||
/* Shouldn't happen. */
|
|
||||||
abort();
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_SOCKET:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CORE:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_PU:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_TYPE_MAX:
|
|
||||||
/* Should never happen */
|
|
||||||
assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = hwloc_alloc_setup_object(type, topology->backend_params.synthetic.id[level]++);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
|
|
||||||
if (!topology->backend_params.synthetic.arity[level]) {
|
|
||||||
hwloc_bitmap_set(obj->cpuset, first_cpu++);
|
|
||||||
} else {
|
|
||||||
for (i = 0; i < topology->backend_params.synthetic.arity[level]; i++)
|
|
||||||
first_cpu = hwloc__look_synthetic(topology, level + 1, first_cpu, obj->cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type == HWLOC_OBJ_NODE) {
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, obj->os_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_bitmap_or(parent_cpuset, parent_cpuset, obj->cpuset);
|
|
||||||
|
|
||||||
/* post-hooks */
|
|
||||||
switch (type) {
|
|
||||||
case HWLOC_OBJ_MISC:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
obj->attr->group.depth = topology->backend_params.synthetic.depth[level];
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_SYSTEM:
|
|
||||||
abort();
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
/* 1GB in memory nodes, 256k 4k-pages. */
|
|
||||||
obj->memory.local_memory = 1024*1024*1024;
|
|
||||||
obj->memory.page_types_len = 1;
|
|
||||||
obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types[0].size = 4096;
|
|
||||||
obj->memory.page_types[0].count = 256*1024;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_SOCKET:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
obj->attr->cache.depth = topology->backend_params.synthetic.depth[level];
|
|
||||||
obj->attr->cache.linesize = 64;
|
|
||||||
if (obj->attr->cache.depth == 1)
|
|
||||||
/* 32Kb in L1 */
|
|
||||||
obj->attr->cache.size = 32*1024;
|
|
||||||
else
|
|
||||||
/* *4 at each level, starting from 1MB for L2 */
|
|
||||||
obj->attr->cache.size = 256*1024 << (2*obj->attr->cache.depth);
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_CORE:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_PU:
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_TYPE_MAX:
|
|
||||||
/* Should never happen */
|
|
||||||
assert(0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
|
|
||||||
return first_cpu;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_synthetic(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t cpuset = hwloc_bitmap_alloc();
|
|
||||||
unsigned first_cpu = 0, i;
|
|
||||||
|
|
||||||
topology->support.discovery->pu = 1;
|
|
||||||
|
|
||||||
/* start with id=0 for each level */
|
|
||||||
for (i = 0; topology->backend_params.synthetic.arity[i] > 0; i++)
|
|
||||||
topology->backend_params.synthetic.id[i] = 0;
|
|
||||||
/* ... including the last one */
|
|
||||||
topology->backend_params.synthetic.id[i] = 0;
|
|
||||||
|
|
||||||
/* update first level type according to the synthetic type array */
|
|
||||||
topology->levels[0][0]->type = topology->backend_params.synthetic.type[0];
|
|
||||||
|
|
||||||
for (i = 0; i < topology->backend_params.synthetic.arity[0]; i++)
|
|
||||||
first_cpu = hwloc__look_synthetic(topology, 1, first_cpu, cpuset);
|
|
||||||
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "Synthetic");
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,706 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* To try to get all declarations duplicated below. */
|
|
||||||
#define _WIN32_WINNT 0x0601
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
|
|
||||||
#ifndef HAVE_KAFFINITY
|
|
||||||
typedef ULONG_PTR KAFFINITY, *PKAFFINITY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_PROCESSOR_CACHE_TYPE
|
|
||||||
typedef enum _PROCESSOR_CACHE_TYPE {
|
|
||||||
CacheUnified,
|
|
||||||
CacheInstruction,
|
|
||||||
CacheData,
|
|
||||||
CacheTrace
|
|
||||||
} PROCESSOR_CACHE_TYPE;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef CACHE_FULLY_ASSOCIATIVE
|
|
||||||
#define CACHE_FULLY_ASSOCIATIVE 0xFF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_CACHE_DESCRIPTOR
|
|
||||||
typedef struct _CACHE_DESCRIPTOR {
|
|
||||||
BYTE Level;
|
|
||||||
BYTE Associativity;
|
|
||||||
WORD LineSize;
|
|
||||||
DWORD Size; /* in bytes */
|
|
||||||
PROCESSOR_CACHE_TYPE Type;
|
|
||||||
} CACHE_DESCRIPTOR, *PCACHE_DESCRIPTOR;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_LOGICAL_PROCESSOR_RELATIONSHIP
|
|
||||||
typedef enum _LOGICAL_PROCESSOR_RELATIONSHIP {
|
|
||||||
RelationProcessorCore,
|
|
||||||
RelationNumaNode,
|
|
||||||
RelationCache,
|
|
||||||
RelationProcessorPackage,
|
|
||||||
RelationGroup,
|
|
||||||
RelationAll = 0xffff
|
|
||||||
} LOGICAL_PROCESSOR_RELATIONSHIP;
|
|
||||||
#else /* HAVE_LOGICAL_PROCESSOR_RELATIONSHIP */
|
|
||||||
# ifndef HAVE_RELATIONPROCESSORPACKAGE
|
|
||||||
# define RelationProcessorPackage 3
|
|
||||||
# define RelationGroup 4
|
|
||||||
# define RelationAll 0xffff
|
|
||||||
# endif /* HAVE_RELATIONPROCESSORPACKAGE */
|
|
||||||
#endif /* HAVE_LOGICAL_PROCESSOR_RELATIONSHIP */
|
|
||||||
|
|
||||||
#ifndef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION
|
|
||||||
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION {
|
|
||||||
ULONG_PTR ProcessorMask;
|
|
||||||
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
|
|
||||||
_ANONYMOUS_UNION
|
|
||||||
union {
|
|
||||||
struct {
|
|
||||||
BYTE flags;
|
|
||||||
} ProcessorCore;
|
|
||||||
struct {
|
|
||||||
DWORD NodeNumber;
|
|
||||||
} NumaNode;
|
|
||||||
CACHE_DESCRIPTOR Cache;
|
|
||||||
ULONGLONG Reserved[2];
|
|
||||||
} DUMMYUNIONNAME;
|
|
||||||
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Extended interface, for group support */
|
|
||||||
|
|
||||||
#ifndef HAVE_GROUP_AFFINITY
|
|
||||||
typedef struct _GROUP_AFFINITY {
|
|
||||||
KAFFINITY Mask;
|
|
||||||
WORD Group;
|
|
||||||
WORD Reserved[3];
|
|
||||||
} GROUP_AFFINITY, *PGROUP_AFFINITY;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_PROCESSOR_RELATIONSHIP
|
|
||||||
typedef struct _PROCESSOR_RELATIONSHIP {
|
|
||||||
BYTE Flags;
|
|
||||||
BYTE Reserved[21];
|
|
||||||
WORD GroupCount;
|
|
||||||
GROUP_AFFINITY GroupMask[ANYSIZE_ARRAY];
|
|
||||||
} PROCESSOR_RELATIONSHIP, *PPROCESSOR_RELATIONSHIP;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_NUMA_NODE_RELATIONSHIP
|
|
||||||
typedef struct _NUMA_NODE_RELATIONSHIP {
|
|
||||||
DWORD NodeNumber;
|
|
||||||
BYTE Reserved[20];
|
|
||||||
GROUP_AFFINITY GroupMask;
|
|
||||||
} NUMA_NODE_RELATIONSHIP, *PNUMA_NODE_RELATIONSHIP;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_CACHE_RELATIONSHIP
|
|
||||||
typedef struct _CACHE_RELATIONSHIP {
|
|
||||||
BYTE Level;
|
|
||||||
BYTE Associativity;
|
|
||||||
WORD LineSize;
|
|
||||||
DWORD CacheSize;
|
|
||||||
PROCESSOR_CACHE_TYPE Type;
|
|
||||||
BYTE Reserved[20];
|
|
||||||
GROUP_AFFINITY GroupMask;
|
|
||||||
} CACHE_RELATIONSHIP, *PCACHE_RELATIONSHIP;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_PROCESSOR_GROUP_INFO
|
|
||||||
typedef struct _PROCESSOR_GROUP_INFO {
|
|
||||||
BYTE MaximumProcessorCount;
|
|
||||||
BYTE ActiveProcessorCount;
|
|
||||||
BYTE Reserved[38];
|
|
||||||
KAFFINITY ActiveProcessorMask;
|
|
||||||
} PROCESSOR_GROUP_INFO, *PPROCESSOR_GROUP_INFO;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_GROUP_RELATIONSHIP
|
|
||||||
typedef struct _GROUP_RELATIONSHIP {
|
|
||||||
WORD MaximumGroupCount;
|
|
||||||
WORD ActiveGroupCount;
|
|
||||||
ULONGLONG Reserved[2];
|
|
||||||
PROCESSOR_GROUP_INFO GroupInfo[ANYSIZE_ARRAY];
|
|
||||||
} GROUP_RELATIONSHIP, *PGROUP_RELATIONSHIP;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX
|
|
||||||
typedef struct _SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX {
|
|
||||||
LOGICAL_PROCESSOR_RELATIONSHIP Relationship;
|
|
||||||
DWORD Size;
|
|
||||||
_ANONYMOUS_UNION
|
|
||||||
union {
|
|
||||||
PROCESSOR_RELATIONSHIP Processor;
|
|
||||||
NUMA_NODE_RELATIONSHIP NumaNode;
|
|
||||||
CACHE_RELATIONSHIP Cache;
|
|
||||||
GROUP_RELATIONSHIP Group;
|
|
||||||
/* Odd: no member to tell the cpu mask of the package... */
|
|
||||||
} DUMMYUNIONNAME;
|
|
||||||
} SYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX, *PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_PSAPI_WORKING_SET_EX_BLOCK
|
|
||||||
typedef union _PSAPI_WORKING_SET_EX_BLOCK {
|
|
||||||
ULONG_PTR Flags;
|
|
||||||
struct {
|
|
||||||
unsigned Valid :1;
|
|
||||||
unsigned ShareCount :3;
|
|
||||||
unsigned Win32Protection :11;
|
|
||||||
unsigned Shared :1;
|
|
||||||
unsigned Node :6;
|
|
||||||
unsigned Locked :1;
|
|
||||||
unsigned LargePage :1;
|
|
||||||
};
|
|
||||||
} PSAPI_WORKING_SET_EX_BLOCK;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef HAVE_PSAPI_WORKING_SET_EX_INFORMATION
|
|
||||||
typedef struct _PSAPI_WORKING_SET_EX_INFORMATION {
|
|
||||||
PVOID VirtualAddress;
|
|
||||||
PSAPI_WORKING_SET_EX_BLOCK VirtualAttributes;
|
|
||||||
} PSAPI_WORKING_SET_EX_INFORMATION;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* TODO: SetThreadIdealProcessor */
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_thread_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_thread_t thread, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
if (flags & HWLOC_CPUBIND_NOMEMBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* TODO: groups SetThreadGroupAffinity */
|
|
||||||
/* The resulting binding is always strict */
|
|
||||||
DWORD mask = hwloc_bitmap_to_ulong(hwloc_set);
|
|
||||||
if (!SetThreadAffinityMask(thread, mask))
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* TODO: SetThreadGroupAffinity to get affinity */
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_thisthread_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_win_set_thread_cpubind(topology, GetCurrentThread(), hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_thisthread_membind(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
hwloc_cpuset_t cpuset;
|
|
||||||
|
|
||||||
if ((policy != HWLOC_MEMBIND_DEFAULT && policy != HWLOC_MEMBIND_BIND)
|
|
||||||
|| flags & HWLOC_MEMBIND_NOCPUBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_cpuset_from_nodeset(topology, cpuset, nodeset);
|
|
||||||
ret = hwloc_win_set_thisthread_cpubind(topology, cpuset, flags & HWLOC_MEMBIND_STRICT?HWLOC_CPUBIND_STRICT:0);
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_proc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_pid_t proc, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
if (flags & HWLOC_CPUBIND_NOMEMBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* TODO: groups, hard: has to manually bind all threads into the other group,
|
|
||||||
* and the bind the process inside the group */
|
|
||||||
/* The resulting binding is always strict */
|
|
||||||
DWORD mask = hwloc_bitmap_to_ulong(hwloc_set);
|
|
||||||
if (!SetProcessAffinityMask(proc, mask))
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
hwloc_cpuset_t cpuset;
|
|
||||||
|
|
||||||
if ((policy != HWLOC_MEMBIND_DEFAULT && policy != HWLOC_MEMBIND_BIND)
|
|
||||||
|| flags & HWLOC_MEMBIND_NOCPUBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_cpuset_from_nodeset(topology, cpuset, nodeset);
|
|
||||||
ret = hwloc_win_set_proc_cpubind(topology, pid, cpuset, flags & HWLOC_MEMBIND_STRICT?HWLOC_CPUBIND_STRICT:0);
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_get_proc_cpubind(hwloc_topology_t topology __hwloc_attribute_unused, hwloc_pid_t proc, hwloc_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
DWORD_PTR proc_mask, sys_mask;
|
|
||||||
if (flags & HWLOC_CPUBIND_NOMEMBIND) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
/* TODO: groups, GetProcessGroupAffinity, or merge SetThreadGroupAffinity for all threads */
|
|
||||||
if (!GetProcessAffinityMask(proc, &proc_mask, &sys_mask))
|
|
||||||
return -1;
|
|
||||||
hwloc_bitmap_from_ulong(hwloc_set, proc_mask);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_get_proc_membind(hwloc_topology_t topology, hwloc_pid_t pid, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
hwloc_cpuset_t cpuset = hwloc_bitmap_alloc();
|
|
||||||
ret = hwloc_win_get_proc_cpubind(topology, pid, cpuset, flags & HWLOC_MEMBIND_STRICT?HWLOC_CPUBIND_STRICT:0);
|
|
||||||
if (!ret) {
|
|
||||||
*policy = HWLOC_MEMBIND_BIND;
|
|
||||||
hwloc_cpuset_to_nodeset(topology, cpuset, nodeset);
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_thisproc_cpubind(hwloc_topology_t topology, hwloc_const_bitmap_t hwloc_set, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_win_set_proc_cpubind(topology, GetCurrentProcess(), hwloc_set, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_set_thisproc_membind(hwloc_topology_t topology, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_win_set_proc_membind(topology, GetCurrentProcess(), nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_get_thisproc_cpubind(hwloc_topology_t topology, hwloc_bitmap_t hwloc_cpuset, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_win_get_proc_cpubind(topology, GetCurrentProcess(), hwloc_cpuset, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_get_thisproc_membind(hwloc_topology_t topology, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
return hwloc_win_get_proc_membind(topology, GetCurrentProcess(), nodeset, policy, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
static LPVOID WINAPI (*VirtualAllocExNumaProc)(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect, DWORD nndPreferred);
|
|
||||||
static BOOL WINAPI (*VirtualFreeExProc)(HANDLE hProcess, LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType);
|
|
||||||
static BOOL WINAPI (*QueryWorkingSetExProc)(HANDLE hProcess, PVOID pv, DWORD cb);
|
|
||||||
|
|
||||||
static int hwloc_win_get_VirtualAllocExNumaProc(void) {
|
|
||||||
if (VirtualAllocExNumaProc == NULL) {
|
|
||||||
FARPROC alloc_fun = NULL, free_fun = NULL;
|
|
||||||
HMODULE kernel32;
|
|
||||||
|
|
||||||
kernel32 = LoadLibrary("kernel32.dll");
|
|
||||||
if (kernel32) {
|
|
||||||
alloc_fun = GetProcAddress(kernel32, "VirtualAllocExNuma");
|
|
||||||
free_fun = GetProcAddress(kernel32, "VirtualFreeEx");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!alloc_fun || !free_fun) {
|
|
||||||
VirtualAllocExNumaProc = (FARPROC) -1;
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
VirtualAllocExNumaProc = alloc_fun;
|
|
||||||
VirtualFreeExProc = free_fun;
|
|
||||||
} else if ((FARPROC) VirtualAllocExNumaProc == (FARPROC)-1) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
hwloc_win_alloc(hwloc_topology_t topology __hwloc_attribute_unused, size_t len) {
|
|
||||||
return VirtualAlloc(NULL, len, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void *
|
|
||||||
hwloc_win_alloc_membind(hwloc_topology_t topology __hwloc_attribute_unused, size_t len, hwloc_const_nodeset_t nodeset, hwloc_membind_policy_t policy, int flags) {
|
|
||||||
int node;
|
|
||||||
|
|
||||||
switch (policy) {
|
|
||||||
case HWLOC_MEMBIND_DEFAULT:
|
|
||||||
case HWLOC_MEMBIND_BIND:
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
errno = ENOSYS;
|
|
||||||
return hwloc_alloc_or_fail(topology, len, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (flags & HWLOC_MEMBIND_STRICT) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hwloc_bitmap_weight(nodeset) != 1) {
|
|
||||||
/* Not a single node, can't do this */
|
|
||||||
errno = EXDEV;
|
|
||||||
return hwloc_alloc_or_fail(topology, len, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
node = hwloc_bitmap_first(nodeset);
|
|
||||||
return VirtualAllocExNumaProc(GetCurrentProcess(), NULL, len, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE, node);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_free_membind(hwloc_topology_t topology __hwloc_attribute_unused, void *addr, size_t len __hwloc_attribute_unused) {
|
|
||||||
if (!addr)
|
|
||||||
return 0;
|
|
||||||
if (!VirtualFreeExProc(GetCurrentProcess(), addr, 0, MEM_RELEASE))
|
|
||||||
return -1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hwloc_win_get_QueryWorkingSetExProc(void) {
|
|
||||||
if (QueryWorkingSetExProc == NULL) {
|
|
||||||
FARPROC fun = NULL;
|
|
||||||
HMODULE kernel32, psapi;
|
|
||||||
|
|
||||||
kernel32 = LoadLibrary("kernel32.dll");
|
|
||||||
if (kernel32)
|
|
||||||
fun = GetProcAddress(kernel32, "K32QueryWorkingSetEx");
|
|
||||||
if (!fun) {
|
|
||||||
psapi = LoadLibrary("psapi.dll");
|
|
||||||
if (psapi)
|
|
||||||
fun = GetProcAddress(psapi, "QueryWorkingSetEx");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!fun) {
|
|
||||||
QueryWorkingSetExProc = (FARPROC) -1;
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryWorkingSetExProc = fun;
|
|
||||||
} else if ((FARPROC) QueryWorkingSetExProc == (FARPROC)-1) {
|
|
||||||
errno = ENOSYS;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc_win_get_area_membind(hwloc_topology_t topology __hwloc_attribute_unused, const void *addr, size_t len, hwloc_nodeset_t nodeset, hwloc_membind_policy_t * policy, int flags)
|
|
||||||
{
|
|
||||||
SYSTEM_INFO SystemInfo;
|
|
||||||
DWORD page_size;
|
|
||||||
|
|
||||||
GetSystemInfo(&SystemInfo);
|
|
||||||
page_size = SystemInfo.dwPageSize;
|
|
||||||
|
|
||||||
uintptr_t start = (((uintptr_t) addr) / page_size) * page_size;
|
|
||||||
unsigned nb = (((uintptr_t) addr + len - start) + page_size - 1) / page_size;
|
|
||||||
|
|
||||||
if (!nb)
|
|
||||||
nb = 1;
|
|
||||||
|
|
||||||
{
|
|
||||||
PSAPI_WORKING_SET_EX_INFORMATION pv[nb];
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
for (i = 0; i < nb; i++)
|
|
||||||
pv[i].VirtualAddress = (void*) (start + i * page_size);
|
|
||||||
if (!QueryWorkingSetExProc(GetCurrentProcess(), &pv, sizeof(pv)))
|
|
||||||
return -1;
|
|
||||||
*policy = HWLOC_MEMBIND_BIND;
|
|
||||||
if (flags & HWLOC_MEMBIND_STRICT) {
|
|
||||||
unsigned node = pv[0].VirtualAttributes.Node;
|
|
||||||
for (i = 1; i < nb; i++) {
|
|
||||||
if (pv[i].VirtualAttributes.Node != node) {
|
|
||||||
errno = EXDEV;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hwloc_bitmap_only(nodeset, node);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
hwloc_bitmap_zero(nodeset);
|
|
||||||
for (i = 0; i < nb; i++)
|
|
||||||
hwloc_bitmap_set(nodeset, pv[i].VirtualAttributes.Node);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_windows(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
BOOL WINAPI (*GetLogicalProcessorInformationProc)(PSYSTEM_LOGICAL_PROCESSOR_INFORMATION Buffer, PDWORD ReturnLength);
|
|
||||||
BOOL WINAPI (*GetLogicalProcessorInformationExProc)(LOGICAL_PROCESSOR_RELATIONSHIP relationship, PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX Buffer, PDWORD ReturnLength);
|
|
||||||
BOOL WINAPI (*GetNumaAvailableMemoryNodeProc)(UCHAR Node, PULONGLONG AvailableBytes);
|
|
||||||
BOOL WINAPI (*GetNumaAvailableMemoryNodeExProc)(USHORT Node, PULONGLONG AvailableBytes);
|
|
||||||
SYSTEM_INFO SystemInfo;
|
|
||||||
|
|
||||||
DWORD length;
|
|
||||||
|
|
||||||
HMODULE kernel32;
|
|
||||||
|
|
||||||
GetSystemInfo(&SystemInfo);
|
|
||||||
|
|
||||||
kernel32 = LoadLibrary("kernel32.dll");
|
|
||||||
if (kernel32) {
|
|
||||||
GetLogicalProcessorInformationProc = GetProcAddress(kernel32, "GetLogicalProcessorInformation");
|
|
||||||
GetNumaAvailableMemoryNodeProc = GetProcAddress(kernel32, "GetNumaAvailableMemoryNode");
|
|
||||||
GetNumaAvailableMemoryNodeExProc = GetProcAddress(kernel32, "GetNumaAvailableMemoryNodeEx");
|
|
||||||
GetLogicalProcessorInformationExProc = GetProcAddress(kernel32, "GetLogicalProcessorInformationEx");
|
|
||||||
|
|
||||||
if (!GetLogicalProcessorInformationExProc && GetLogicalProcessorInformationProc) {
|
|
||||||
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION procInfo;
|
|
||||||
unsigned id;
|
|
||||||
unsigned i;
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
|
|
||||||
length = 0;
|
|
||||||
procInfo = NULL;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if (GetLogicalProcessorInformationProc(procInfo, &length))
|
|
||||||
break;
|
|
||||||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
|
||||||
return;
|
|
||||||
procInfo = realloc(procInfo, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < length / sizeof(*procInfo); i++) {
|
|
||||||
|
|
||||||
/* Ignore non-data caches */
|
|
||||||
if (procInfo[i].Relationship == RelationCache
|
|
||||||
&& procInfo[i].Cache.Type != CacheUnified
|
|
||||||
&& procInfo[i].Cache.Type != CacheData)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
id = -1;
|
|
||||||
switch (procInfo[i].Relationship) {
|
|
||||||
case RelationNumaNode:
|
|
||||||
type = HWLOC_OBJ_NODE;
|
|
||||||
id = procInfo[i].NumaNode.NodeNumber;
|
|
||||||
break;
|
|
||||||
case RelationProcessorPackage:
|
|
||||||
type = HWLOC_OBJ_SOCKET;
|
|
||||||
break;
|
|
||||||
case RelationCache:
|
|
||||||
type = HWLOC_OBJ_CACHE;
|
|
||||||
break;
|
|
||||||
case RelationProcessorCore:
|
|
||||||
type = HWLOC_OBJ_CORE;
|
|
||||||
break;
|
|
||||||
case RelationGroup:
|
|
||||||
default:
|
|
||||||
type = HWLOC_OBJ_GROUP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = hwloc_alloc_setup_object(type, id);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_debug("%s#%u mask %lx\n", hwloc_obj_type_string(type), id, procInfo[i].ProcessorMask);
|
|
||||||
hwloc_bitmap_from_ulong(obj->cpuset, procInfo[i].ProcessorMask);
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
{
|
|
||||||
ULONGLONG avail;
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, id);
|
|
||||||
if ((GetNumaAvailableMemoryNodeExProc && GetNumaAvailableMemoryNodeExProc(id, &avail))
|
|
||||||
|| (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail)))
|
|
||||||
obj->memory.local_memory = avail;
|
|
||||||
obj->memory.page_types_len = 2;
|
|
||||||
obj->memory.page_types = malloc(2 * sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, 2 * sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types_len = 1;
|
|
||||||
obj->memory.page_types[0].size = SystemInfo.dwPageSize;
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
obj->memory.page_types_len++;
|
|
||||||
obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
obj->attr->cache.size = procInfo[i].Cache.Size;
|
|
||||||
obj->attr->cache.linesize = procInfo[i].Cache.LineSize;
|
|
||||||
obj->attr->cache.depth = procInfo[i].Cache.Level;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
obj->attr->group.depth = procInfo[i].Relationship == RelationGroup;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
free(procInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (GetLogicalProcessorInformationExProc) {
|
|
||||||
PSYSTEM_LOGICAL_PROCESSOR_INFORMATION_EX procInfoTotal, procInfo;
|
|
||||||
|
|
||||||
unsigned id;
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
hwloc_obj_type_t type;
|
|
||||||
|
|
||||||
length = 0;
|
|
||||||
procInfoTotal = NULL;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
if (GetLogicalProcessorInformationExProc(RelationAll, procInfoTotal, &length))
|
|
||||||
break;
|
|
||||||
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
|
|
||||||
return;
|
|
||||||
procInfoTotal = realloc(procInfoTotal, length);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (procInfo = procInfoTotal;
|
|
||||||
(void*) procInfo < (void*) ((unsigned long) procInfoTotal + length);
|
|
||||||
procInfo = (void*) ((unsigned long) procInfo + procInfo->Size)) {
|
|
||||||
unsigned num, i;
|
|
||||||
GROUP_AFFINITY *GroupMask;
|
|
||||||
|
|
||||||
/* Ignore non-data caches */
|
|
||||||
if (procInfo->Relationship == RelationCache
|
|
||||||
&& procInfo->Cache.Type != CacheUnified
|
|
||||||
&& procInfo->Cache.Type != CacheData)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
id = -1;
|
|
||||||
switch (procInfo->Relationship) {
|
|
||||||
case RelationNumaNode:
|
|
||||||
type = HWLOC_OBJ_NODE;
|
|
||||||
num = 1;
|
|
||||||
GroupMask = &procInfo->NumaNode.GroupMask;
|
|
||||||
id = procInfo->NumaNode.NodeNumber;
|
|
||||||
break;
|
|
||||||
case RelationProcessorPackage:
|
|
||||||
type = HWLOC_OBJ_SOCKET;
|
|
||||||
num = procInfo->Processor.GroupCount;
|
|
||||||
GroupMask = procInfo->Processor.GroupMask;
|
|
||||||
break;
|
|
||||||
case RelationCache:
|
|
||||||
type = HWLOC_OBJ_CACHE;
|
|
||||||
num = 1;
|
|
||||||
GroupMask = &procInfo->Cache.GroupMask;
|
|
||||||
break;
|
|
||||||
case RelationProcessorCore:
|
|
||||||
type = HWLOC_OBJ_CORE;
|
|
||||||
num = procInfo->Processor.GroupCount;
|
|
||||||
GroupMask = procInfo->Processor.GroupMask;
|
|
||||||
break;
|
|
||||||
case RelationGroup:
|
|
||||||
/* So strange an interface... */
|
|
||||||
for (id = 0; id < procInfo->Group.ActiveGroupCount; id++) {
|
|
||||||
KAFFINITY mask;
|
|
||||||
obj = hwloc_alloc_setup_object(HWLOC_OBJ_GROUP, id);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
mask = procInfo->Group.GroupInfo[id].ActiveProcessorMask;
|
|
||||||
hwloc_debug("group %u %d cpus mask %lx\n", id,
|
|
||||||
procInfo->Group.GroupInfo[id].ActiveProcessorCount, mask);
|
|
||||||
hwloc_bitmap_from_ith_ulong(obj->cpuset, id, mask);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
default:
|
|
||||||
/* Don't know how to get the mask. */
|
|
||||||
hwloc_debug("unknown relation %d\n", procInfo->Relationship);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = hwloc_alloc_setup_object(type, id);
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (i = 0; i < num; i++) {
|
|
||||||
hwloc_debug("%s#%u %d: mask %d:%lx\n", hwloc_obj_type_string(type), id, i, GroupMask[i].Group, GroupMask[i].Mask);
|
|
||||||
hwloc_bitmap_from_ith_ulong(obj->cpuset, GroupMask[i].Group, GroupMask[i].Mask);
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (type) {
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
{
|
|
||||||
ULONGLONG avail;
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_set(obj->nodeset, id);
|
|
||||||
if ((GetNumaAvailableMemoryNodeExProc && GetNumaAvailableMemoryNodeExProc(id, &avail))
|
|
||||||
|| (GetNumaAvailableMemoryNodeProc && GetNumaAvailableMemoryNodeProc(id, &avail)))
|
|
||||||
obj->memory.local_memory = avail;
|
|
||||||
obj->memory.page_types = malloc(2 * sizeof(*obj->memory.page_types));
|
|
||||||
memset(obj->memory.page_types, 0, 2 * sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types_len = 1;
|
|
||||||
obj->memory.page_types[0].size = SystemInfo.dwPageSize;
|
|
||||||
#ifdef HAVE__SC_LARGE_PAGESIZE
|
|
||||||
obj->memory.page_types_len++;
|
|
||||||
obj->memory.page_types[1].size = sysconf(_SC_LARGE_PAGESIZE);
|
|
||||||
#endif
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
obj->attr->cache.size = procInfo->Cache.CacheSize;
|
|
||||||
obj->attr->cache.linesize = procInfo->Cache.LineSize;
|
|
||||||
obj->attr->cache.depth = procInfo->Cache.Level;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
hwloc_insert_object_by_cpuset(topology, obj);
|
|
||||||
}
|
|
||||||
free(procInfoTotal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* add PU objects */
|
|
||||||
hwloc_setup_pu_level(topology, hwloc_fallback_nbprocessors(topology));
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "Windows");
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_set_windows_hooks(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
topology->set_proc_cpubind = hwloc_win_set_proc_cpubind;
|
|
||||||
topology->get_proc_cpubind = hwloc_win_get_proc_cpubind;
|
|
||||||
topology->set_thread_cpubind = hwloc_win_set_thread_cpubind;
|
|
||||||
topology->set_thisproc_cpubind = hwloc_win_set_thisproc_cpubind;
|
|
||||||
topology->get_thisproc_cpubind = hwloc_win_get_thisproc_cpubind;
|
|
||||||
topology->set_thisthread_cpubind = hwloc_win_set_thisthread_cpubind;
|
|
||||||
/* TODO: get_last_cpu_location: use GetCurrentProcessorNumber */
|
|
||||||
|
|
||||||
topology->set_proc_membind = hwloc_win_set_proc_membind;
|
|
||||||
topology->get_proc_membind = hwloc_win_get_proc_membind;
|
|
||||||
topology->set_thisproc_membind = hwloc_win_set_thisproc_membind;
|
|
||||||
topology->get_thisproc_membind = hwloc_win_get_thisproc_membind;
|
|
||||||
topology->set_thisthread_membind = hwloc_win_set_thisthread_membind;
|
|
||||||
|
|
||||||
if (!hwloc_win_get_VirtualAllocExNumaProc()) {
|
|
||||||
topology->alloc_membind = hwloc_win_alloc_membind;
|
|
||||||
topology->alloc = hwloc_win_alloc;
|
|
||||||
topology->free_membind = hwloc_win_free_membind;
|
|
||||||
topology->support.membind->bind_membind = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!hwloc_win_get_QueryWorkingSetExProc())
|
|
||||||
topology->get_area_membind = hwloc_win_get_area_membind;
|
|
||||||
}
|
|
|
@ -1,535 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2010 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2010-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2010-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* This backend is only used when the operating system does not export
|
|
||||||
* the necessary hardware topology information to user-space applications.
|
|
||||||
* Currently, only the FreeBSD backend relies on this x86 backend.
|
|
||||||
*
|
|
||||||
* Other backends such as Linux have their own way to retrieve various
|
|
||||||
* pieces of hardware topology information from the operating system
|
|
||||||
* on various architectures, without having to use this x86-specific code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
#include <private/cpuid.h>
|
|
||||||
#include <private/misc.h>
|
|
||||||
|
|
||||||
struct cacheinfo {
|
|
||||||
unsigned type;
|
|
||||||
unsigned level;
|
|
||||||
unsigned nbthreads_sharing;
|
|
||||||
|
|
||||||
unsigned linesize;
|
|
||||||
unsigned linepart;
|
|
||||||
unsigned ways;
|
|
||||||
unsigned sets;
|
|
||||||
unsigned size;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct procinfo {
|
|
||||||
unsigned present;
|
|
||||||
unsigned apicid;
|
|
||||||
unsigned max_log_proc;
|
|
||||||
unsigned max_nbcores;
|
|
||||||
unsigned max_nbthreads;
|
|
||||||
unsigned socketid;
|
|
||||||
unsigned logprocid;
|
|
||||||
unsigned threadid;
|
|
||||||
unsigned coreid;
|
|
||||||
unsigned *otherids;
|
|
||||||
unsigned levels;
|
|
||||||
unsigned numcaches;
|
|
||||||
struct cacheinfo *cache;
|
|
||||||
};
|
|
||||||
|
|
||||||
enum cpuid_type {
|
|
||||||
intel,
|
|
||||||
amd,
|
|
||||||
unknown
|
|
||||||
};
|
|
||||||
|
|
||||||
static void fill_amd_cache(struct procinfo *infos, unsigned level, unsigned cpuid)
|
|
||||||
{
|
|
||||||
struct cacheinfo *cache;
|
|
||||||
unsigned cachenum;
|
|
||||||
unsigned size = 0;
|
|
||||||
|
|
||||||
if (level == 1)
|
|
||||||
size = ((cpuid >> 24)) << 10;
|
|
||||||
else if (level == 2)
|
|
||||||
size = ((cpuid >> 16)) << 10;
|
|
||||||
else if (level == 3)
|
|
||||||
size = ((cpuid >> 18)) << 19;
|
|
||||||
if (!size)
|
|
||||||
return;
|
|
||||||
|
|
||||||
cachenum = infos->numcaches++;
|
|
||||||
infos->cache = realloc(infos->cache, infos->numcaches*sizeof(*infos->cache));
|
|
||||||
cache = &infos->cache[cachenum];
|
|
||||||
|
|
||||||
cache->type = 1;
|
|
||||||
cache->level = level;
|
|
||||||
if (level <= 2)
|
|
||||||
cache->nbthreads_sharing = 1;
|
|
||||||
else
|
|
||||||
cache->nbthreads_sharing = infos->max_log_proc;
|
|
||||||
cache->linesize = cpuid & 0xff;
|
|
||||||
cache->linepart = 0;
|
|
||||||
if (level == 1)
|
|
||||||
cache->ways = (cpuid >> 16) & 0xff;
|
|
||||||
else {
|
|
||||||
static const unsigned ways_tab[] = { 0, 1, 2, 0, 4, 0, 8, 0, 16, 0, 32, 48, 64, 96, 128, 0 };
|
|
||||||
unsigned ways = (cpuid >> 12) & 0xf;
|
|
||||||
cache->ways = ways_tab[ways];
|
|
||||||
}
|
|
||||||
cache->size = size;
|
|
||||||
cache->sets = 0;
|
|
||||||
|
|
||||||
hwloc_debug("cache L%u t%u linesize %u ways %u size %uKB\n", cache->level, cache->nbthreads_sharing, cache->linesize, cache->ways, cache->size >> 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Fetch information from the processor itself thanks to cpuid and store it in
|
|
||||||
* infos for summarize to analyze them globally */
|
|
||||||
static void look_proc(struct procinfo *infos, unsigned highest_cpuid, unsigned highest_ext_cpuid, enum cpuid_type cpuid_type)
|
|
||||||
{
|
|
||||||
unsigned eax, ebx, ecx = 0, edx;
|
|
||||||
unsigned cachenum;
|
|
||||||
struct cacheinfo *cache;
|
|
||||||
|
|
||||||
infos->present = 1;
|
|
||||||
|
|
||||||
eax = 0x01;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
infos->apicid = ebx >> 24;
|
|
||||||
if (edx & (1 << 28))
|
|
||||||
infos->max_log_proc = 1 << hwloc_flsl(((ebx >> 16) & 0xff) - 1);
|
|
||||||
else
|
|
||||||
infos->max_log_proc = 1;
|
|
||||||
hwloc_debug("APIC ID 0x%02x max_log_proc %u\n", infos->apicid, infos->max_log_proc);
|
|
||||||
infos->socketid = infos->apicid / infos->max_log_proc;
|
|
||||||
infos->logprocid = infos->apicid % infos->max_log_proc;
|
|
||||||
infos->coreid = (unsigned) -1;
|
|
||||||
infos->threadid = (unsigned) -1;
|
|
||||||
hwloc_debug("phys %u thread %u\n", infos->socketid, infos->logprocid);
|
|
||||||
|
|
||||||
/* Intel doesn't actually provide 0x80000008 information */
|
|
||||||
if (cpuid_type != intel && highest_ext_cpuid >= 0x80000008) {
|
|
||||||
unsigned coreidsize;
|
|
||||||
eax = 0x80000008;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
coreidsize = (ecx >> 12) & 0xf;
|
|
||||||
hwloc_debug("core ID size: %u\n", coreidsize);
|
|
||||||
if (!coreidsize) {
|
|
||||||
infos->max_nbcores = (ecx & 0xff) + 1;
|
|
||||||
} else
|
|
||||||
infos->max_nbcores = 1 << coreidsize;
|
|
||||||
hwloc_debug("Thus max # of cores: %u\n", infos->max_nbcores);
|
|
||||||
/* Still no multithreaded AMD */
|
|
||||||
infos->max_nbthreads = 1 ;
|
|
||||||
hwloc_debug("and max # of threads: %u\n", infos->max_nbthreads);
|
|
||||||
infos->threadid = infos->logprocid % infos->max_nbthreads;
|
|
||||||
infos->coreid = infos->logprocid / infos->max_nbthreads;
|
|
||||||
hwloc_debug("this is thread %u of core %u\n", infos->threadid, infos->coreid);
|
|
||||||
}
|
|
||||||
|
|
||||||
infos->numcaches = 0;
|
|
||||||
infos->cache = NULL;
|
|
||||||
|
|
||||||
/* Intel doesn't actually provide 0x80000005 information */
|
|
||||||
if (cpuid_type != intel && highest_ext_cpuid >= 0x80000005) {
|
|
||||||
eax = 0x80000005;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
fill_amd_cache(infos, 1, ecx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Intel doesn't actually provide 0x80000006 information */
|
|
||||||
if (cpuid_type != intel && highest_ext_cpuid >= 0x80000006) {
|
|
||||||
eax = 0x80000006;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
fill_amd_cache(infos, 2, ecx);
|
|
||||||
fill_amd_cache(infos, 3, edx);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* AMD doesn't actually provide 0x04 information */
|
|
||||||
if (cpuid_type != amd && highest_cpuid >= 0x04) {
|
|
||||||
cachenum = 0;
|
|
||||||
for (cachenum = 0; ; cachenum++) {
|
|
||||||
unsigned type;
|
|
||||||
eax = 0x04;
|
|
||||||
ecx = cachenum;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
type = eax & 0x1f;
|
|
||||||
|
|
||||||
hwloc_debug("cache %u type %u\n", cachenum, type);
|
|
||||||
|
|
||||||
if (type == 0)
|
|
||||||
break;
|
|
||||||
if (type == 2)
|
|
||||||
/* Instruction cache */
|
|
||||||
continue;
|
|
||||||
infos->numcaches++;
|
|
||||||
}
|
|
||||||
|
|
||||||
cache = infos->cache = malloc(infos->numcaches * sizeof(*infos->cache));
|
|
||||||
|
|
||||||
for (cachenum = 0; ; cachenum++) {
|
|
||||||
unsigned linesize, linepart, ways, sets;
|
|
||||||
unsigned type;
|
|
||||||
eax = 0x04;
|
|
||||||
ecx = cachenum;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
|
|
||||||
type = eax & 0x1f;
|
|
||||||
|
|
||||||
if (type == 0)
|
|
||||||
break;
|
|
||||||
if (type == 2)
|
|
||||||
/* Instruction cache */
|
|
||||||
continue;
|
|
||||||
|
|
||||||
cache->type = type;
|
|
||||||
|
|
||||||
cache->level = (eax >> 5) & 0x7;
|
|
||||||
cache->nbthreads_sharing = ((eax >> 14) & 0xfff) + 1;
|
|
||||||
infos->max_nbcores = ((eax >> 26) & 0x3f) + 1;
|
|
||||||
|
|
||||||
cache->linesize = linesize = (ebx & 0xfff) + 1;
|
|
||||||
cache->linepart = linepart = ((ebx >> 12) & 0x3ff) + 1;
|
|
||||||
cache->ways = ways = ((ebx >> 22) & 0x3ff) + 1;
|
|
||||||
cache->sets = sets = ecx + 1;
|
|
||||||
cache->size = linesize * linepart * ways * sets;
|
|
||||||
|
|
||||||
hwloc_debug("cache %u type %u L%u t%u c%u linesize %u linepart %u ways %u sets %u, size %uKB\n", cachenum, cache->type, cache->level, cache->nbthreads_sharing, infos->max_nbcores, linesize, linepart, ways, sets, cache->size >> 10);
|
|
||||||
infos->max_nbthreads = infos->max_log_proc / infos->max_nbcores;
|
|
||||||
hwloc_debug("thus %u threads\n", infos->max_nbthreads);
|
|
||||||
infos->threadid = infos->logprocid % infos->max_nbthreads;
|
|
||||||
infos->coreid = infos->logprocid / infos->max_nbthreads;
|
|
||||||
hwloc_debug("this is thread %u of core %u\n", infos->threadid, infos->coreid);
|
|
||||||
|
|
||||||
cache++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cpuid_type == intel && highest_cpuid >= 0x0b) {
|
|
||||||
unsigned level, apic_nextshift, apic_number, apic_type, apic_id = 0, apic_shift = 0, id;
|
|
||||||
for (level = 0; ; level++) {
|
|
||||||
ecx = level;
|
|
||||||
eax = 0x0b;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
if (!eax && !ebx)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (level) {
|
|
||||||
infos->levels = level;
|
|
||||||
infos->otherids = malloc(level * sizeof(*infos->otherids));
|
|
||||||
for (level = 0; ; level++) {
|
|
||||||
ecx = level;
|
|
||||||
eax = 0x0b;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
if (!eax && !ebx)
|
|
||||||
break;
|
|
||||||
apic_nextshift = eax & 0x1f;
|
|
||||||
apic_number = ebx & 0xffff;
|
|
||||||
apic_type = (ecx & 0xff00) >> 8;
|
|
||||||
apic_id = edx;
|
|
||||||
id = (apic_id >> apic_shift) & ((1 << (apic_nextshift - apic_shift)) - 1);
|
|
||||||
hwloc_debug("x2APIC %08x %d: nextshift %d num %2d type %d id %2d\n", apic_id, level, apic_nextshift, apic_number, apic_type, id);
|
|
||||||
infos->apicid = apic_id;
|
|
||||||
infos->otherids[level] = UINT_MAX;
|
|
||||||
switch (apic_type) {
|
|
||||||
case 1:
|
|
||||||
infos->threadid = id;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
infos->coreid = id;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
hwloc_debug("x2APIC %d: unknown type %d\n", level, apic_type);
|
|
||||||
infos->otherids[level] = apic_id >> apic_shift;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
apic_shift = apic_nextshift;
|
|
||||||
}
|
|
||||||
infos->socketid = apic_id >> apic_shift;
|
|
||||||
hwloc_debug("x2APIC remainder: %d\n", infos->socketid);
|
|
||||||
} else
|
|
||||||
infos->otherids = NULL;
|
|
||||||
} else
|
|
||||||
infos->otherids = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Analyse information stored in infos, and build topology levels accordingly */
|
|
||||||
static void summarize(hwloc_topology_t topology, struct procinfo *infos, unsigned nbprocs)
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t complete_cpuset = hwloc_bitmap_alloc();
|
|
||||||
unsigned i, j, l, level;
|
|
||||||
int one = -1;
|
|
||||||
|
|
||||||
for (i = 0; i < nbprocs; i++)
|
|
||||||
if (infos[i].present) {
|
|
||||||
hwloc_bitmap_set(complete_cpuset, i);
|
|
||||||
one = i;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (one == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Look for sockets */
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t sockets_cpuset = hwloc_bitmap_dup(complete_cpuset);
|
|
||||||
hwloc_bitmap_t socket_cpuset;
|
|
||||||
hwloc_obj_t sock;
|
|
||||||
|
|
||||||
while ((i = hwloc_bitmap_first(sockets_cpuset)) != (unsigned) -1) {
|
|
||||||
unsigned socketid = infos[i].socketid;
|
|
||||||
|
|
||||||
socket_cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (j = i; j < nbprocs; j++) {
|
|
||||||
if (infos[j].socketid == socketid) {
|
|
||||||
hwloc_bitmap_set(socket_cpuset, j);
|
|
||||||
hwloc_bitmap_clr(sockets_cpuset, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sock = hwloc_alloc_setup_object(HWLOC_OBJ_SOCKET, socketid);
|
|
||||||
sock->cpuset = socket_cpuset;
|
|
||||||
hwloc_debug_1arg_bitmap("os socket %u has cpuset %s\n",
|
|
||||||
socketid, socket_cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, sock);
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(sockets_cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look for unknown objects */
|
|
||||||
if (infos[one].otherids) {
|
|
||||||
for (level = infos[one].levels-1; level <= infos[one].levels-1; level--) {
|
|
||||||
if (infos[one].otherids[level] != UINT_MAX) {
|
|
||||||
hwloc_bitmap_t unknowns_cpuset = hwloc_bitmap_dup(complete_cpuset);
|
|
||||||
hwloc_bitmap_t unknown_cpuset;
|
|
||||||
hwloc_obj_t unknown;
|
|
||||||
|
|
||||||
while ((i = hwloc_bitmap_first(unknowns_cpuset)) != (unsigned) -1) {
|
|
||||||
unsigned unknownid = infos[i].otherids[level];
|
|
||||||
|
|
||||||
unknown_cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (j = i; j < nbprocs; j++) {
|
|
||||||
if (infos[j].otherids[level] == unknownid) {
|
|
||||||
hwloc_bitmap_set(unknown_cpuset, j);
|
|
||||||
hwloc_bitmap_clr(unknowns_cpuset, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
unknown = hwloc_alloc_setup_object(HWLOC_OBJ_MISC, unknownid);
|
|
||||||
unknown->cpuset = unknown_cpuset;
|
|
||||||
unknown->os_level = level;
|
|
||||||
hwloc_debug_2args_bitmap("os unknown%d %u has cpuset %s\n",
|
|
||||||
level, unknownid, unknown_cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, unknown);
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(unknowns_cpuset);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look for cores */
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t cores_cpuset = hwloc_bitmap_dup(complete_cpuset);
|
|
||||||
hwloc_bitmap_t core_cpuset;
|
|
||||||
hwloc_obj_t core;
|
|
||||||
|
|
||||||
while ((i = hwloc_bitmap_first(cores_cpuset)) != (unsigned) -1) {
|
|
||||||
unsigned socketid = infos[i].socketid;
|
|
||||||
unsigned coreid = infos[i].coreid;
|
|
||||||
|
|
||||||
if (coreid == (unsigned) -1) {
|
|
||||||
hwloc_bitmap_clr(cores_cpuset, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
core_cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (j = i; j < nbprocs; j++) {
|
|
||||||
if (infos[j].coreid == (unsigned) -1) {
|
|
||||||
hwloc_bitmap_clr(cores_cpuset, j);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (infos[j].socketid == socketid && infos[j].coreid == coreid) {
|
|
||||||
hwloc_bitmap_set(core_cpuset, j);
|
|
||||||
hwloc_bitmap_clr(cores_cpuset, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
core = hwloc_alloc_setup_object(HWLOC_OBJ_CORE, coreid);
|
|
||||||
core->cpuset = core_cpuset;
|
|
||||||
hwloc_debug_1arg_bitmap("os core %u has cpuset %s\n",
|
|
||||||
coreid, core_cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, core);
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(cores_cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Look for caches */
|
|
||||||
/* First find max level */
|
|
||||||
level = 0;
|
|
||||||
for (i = 0; i < nbprocs; i++)
|
|
||||||
for (j = 0; j < infos[i].numcaches; j++)
|
|
||||||
if (infos[i].cache[j].level > level)
|
|
||||||
level = infos[i].cache[j].level;
|
|
||||||
|
|
||||||
while (level > 0) {
|
|
||||||
/* Look for caches at level level */
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t caches_cpuset = hwloc_bitmap_dup(complete_cpuset);
|
|
||||||
hwloc_bitmap_t cache_cpuset;
|
|
||||||
hwloc_obj_t cache;
|
|
||||||
|
|
||||||
while ((i = hwloc_bitmap_first(caches_cpuset)) != (unsigned) -1) {
|
|
||||||
unsigned socketid = infos[i].socketid;
|
|
||||||
|
|
||||||
for (l = 0; l < infos[i].numcaches; l++) {
|
|
||||||
if (infos[i].cache[l].level == level)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (l == infos[i].numcaches) {
|
|
||||||
/* no cache Llevel in i, odd */
|
|
||||||
hwloc_bitmap_clr(caches_cpuset, i);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
unsigned cacheid = infos[i].apicid / infos[i].cache[l].nbthreads_sharing;
|
|
||||||
|
|
||||||
cache_cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (j = i; j < nbprocs; j++) {
|
|
||||||
unsigned l2;
|
|
||||||
for (l2 = 0; l2 < infos[j].numcaches; l2++) {
|
|
||||||
if (infos[j].cache[l2].level == level)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (l2 == infos[j].numcaches) {
|
|
||||||
/* no cache Llevel in j, odd */
|
|
||||||
hwloc_bitmap_clr(caches_cpuset, j);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (infos[j].socketid == socketid && infos[j].apicid / infos[j].cache[l2].nbthreads_sharing == cacheid) {
|
|
||||||
hwloc_bitmap_set(cache_cpuset, j);
|
|
||||||
hwloc_bitmap_clr(caches_cpuset, j);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cache = hwloc_alloc_setup_object(HWLOC_OBJ_CACHE, cacheid);
|
|
||||||
cache->attr->cache.depth = level;
|
|
||||||
cache->attr->cache.size = infos[i].cache[l].size;
|
|
||||||
cache->attr->cache.linesize = infos[i].cache[l].linesize;
|
|
||||||
cache->cpuset = cache_cpuset;
|
|
||||||
hwloc_debug_2args_bitmap("os L%u cache %u has cpuset %s\n",
|
|
||||||
level, cacheid, cache_cpuset);
|
|
||||||
hwloc_insert_object_by_cpuset(topology, cache);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(caches_cpuset);
|
|
||||||
}
|
|
||||||
level--;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nbprocs; i++) {
|
|
||||||
free(infos[i].cache);
|
|
||||||
if (infos[i].otherids)
|
|
||||||
free(infos[i].otherids);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#define INTEL_EBX ('G' | ('e'<<8) | ('n'<<16) | ('u'<<24))
|
|
||||||
#define INTEL_EDX ('i' | ('n'<<8) | ('e'<<16) | ('I'<<24))
|
|
||||||
#define INTEL_ECX ('n' | ('t'<<8) | ('e'<<16) | ('l'<<24))
|
|
||||||
|
|
||||||
#define AMD_EBX ('A' | ('u'<<8) | ('t'<<16) | ('h'<<24))
|
|
||||||
#define AMD_EDX ('e' | ('n'<<8) | ('t'<<16) | ('i'<<24))
|
|
||||||
#define AMD_ECX ('c' | ('A'<<8) | ('M'<<16) | ('D'<<24))
|
|
||||||
|
|
||||||
void hwloc_look_x86(struct hwloc_topology *topology, unsigned nbprocs)
|
|
||||||
{
|
|
||||||
/* This function must always be here, but it's ok if it's empty. */
|
|
||||||
#if defined(HWLOC_HAVE_CPUID)
|
|
||||||
unsigned eax, ebx, ecx = 0, edx;
|
|
||||||
hwloc_bitmap_t orig_cpuset;
|
|
||||||
unsigned i;
|
|
||||||
unsigned highest_cpuid;
|
|
||||||
unsigned highest_ext_cpuid;
|
|
||||||
struct procinfo *infos = NULL;
|
|
||||||
enum cpuid_type cpuid_type = unknown;
|
|
||||||
|
|
||||||
if (!hwloc_have_cpuid())
|
|
||||||
return;
|
|
||||||
|
|
||||||
infos = malloc(sizeof(struct procinfo) * nbprocs);
|
|
||||||
if (NULL == infos) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
eax = 0x00;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
highest_cpuid = eax;
|
|
||||||
if (ebx == INTEL_EBX && ecx == INTEL_ECX && edx == INTEL_EDX)
|
|
||||||
cpuid_type = intel;
|
|
||||||
if (ebx == AMD_EBX && ecx == AMD_ECX && edx == AMD_EDX)
|
|
||||||
cpuid_type = amd;
|
|
||||||
|
|
||||||
hwloc_debug("highest cpuid %x, cpuid type %u\n", highest_cpuid, cpuid_type);
|
|
||||||
if (highest_cpuid < 0x01) {
|
|
||||||
goto free;
|
|
||||||
}
|
|
||||||
|
|
||||||
eax = 0x80000000;
|
|
||||||
hwloc_cpuid(&eax, &ebx, &ecx, &edx);
|
|
||||||
highest_ext_cpuid = eax;
|
|
||||||
|
|
||||||
hwloc_debug("highest extended cpuid %x\n", highest_ext_cpuid);
|
|
||||||
|
|
||||||
orig_cpuset = hwloc_bitmap_alloc();
|
|
||||||
|
|
||||||
if (topology->get_thisthread_cpubind && topology->set_thisthread_cpubind) {
|
|
||||||
if (!topology->get_thisthread_cpubind(topology, orig_cpuset, HWLOC_CPUBIND_STRICT)) {
|
|
||||||
hwloc_bitmap_t cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (i = 0; i < nbprocs; i++) {
|
|
||||||
hwloc_bitmap_only(cpuset, i);
|
|
||||||
if (topology->set_thisthread_cpubind(topology, cpuset, HWLOC_CPUBIND_STRICT))
|
|
||||||
continue;
|
|
||||||
look_proc(&infos[i], highest_cpuid, highest_ext_cpuid, cpuid_type);
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
topology->set_thisthread_cpubind(topology, orig_cpuset, 0);
|
|
||||||
hwloc_bitmap_free(orig_cpuset);
|
|
||||||
summarize(topology, infos, nbprocs);
|
|
||||||
goto free;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (topology->get_thisproc_cpubind && topology->set_thisproc_cpubind) {
|
|
||||||
if (!topology->get_thisproc_cpubind(topology, orig_cpuset, HWLOC_CPUBIND_STRICT)) {
|
|
||||||
hwloc_bitmap_t cpuset = hwloc_bitmap_alloc();
|
|
||||||
for (i = 0; i < nbprocs; i++) {
|
|
||||||
hwloc_bitmap_only(cpuset, i);
|
|
||||||
if (topology->set_thisproc_cpubind(topology, cpuset, HWLOC_CPUBIND_STRICT))
|
|
||||||
continue;
|
|
||||||
look_proc(&infos[i], highest_cpuid, highest_ext_cpuid, cpuid_type);
|
|
||||||
}
|
|
||||||
hwloc_bitmap_free(cpuset);
|
|
||||||
topology->set_thisproc_cpubind(topology, orig_cpuset, 0);
|
|
||||||
hwloc_bitmap_free(orig_cpuset);
|
|
||||||
summarize(topology, infos, nbprocs);
|
|
||||||
goto free;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
hwloc_add_object_info(topology->levels[0][0], "Backend", "x86");
|
|
||||||
|
|
||||||
free:
|
|
||||||
if (NULL != infos) {
|
|
||||||
free(infos);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,700 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2011 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
#ifdef HWLOC_HAVE_XML
|
|
||||||
|
|
||||||
#include <libxml/parser.h>
|
|
||||||
#include <libxml/tree.h>
|
|
||||||
|
|
||||||
#include <assert.h>
|
|
||||||
#include <strings.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_backend_xml_init(struct hwloc_topology *topology, const char *xmlpath, const char *xmlbuffer, int buflen)
|
|
||||||
{
|
|
||||||
xmlDoc *doc = NULL;
|
|
||||||
|
|
||||||
assert(topology->backend_type == HWLOC_BACKEND_NONE);
|
|
||||||
|
|
||||||
LIBXML_TEST_VERSION;
|
|
||||||
|
|
||||||
if (xmlpath)
|
|
||||||
doc = xmlReadFile(xmlpath, NULL, 0);
|
|
||||||
else if (xmlbuffer)
|
|
||||||
doc = xmlReadMemory(xmlbuffer, buflen, "", NULL, 0);
|
|
||||||
if (!doc)
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
topology->backend_params.xml.doc = doc;
|
|
||||||
topology->is_thissystem = 0;
|
|
||||||
topology->backend_type = HWLOC_BACKEND_XML;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_backend_xml_exit(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
assert(topology->backend_type == HWLOC_BACKEND_XML);
|
|
||||||
xmlFreeDoc((xmlDoc*)topology->backend_params.xml.doc);
|
|
||||||
topology->backend_type = HWLOC_BACKEND_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************
|
|
||||||
********* XML import *********
|
|
||||||
******************************/
|
|
||||||
|
|
||||||
static void hwloc__xml_import_node(struct hwloc_topology *topology, struct hwloc_obj *parent, xmlNode *node, int depth);
|
|
||||||
|
|
||||||
static const xmlChar *
|
|
||||||
hwloc__xml_import_attr_value(xmlAttr *attr)
|
|
||||||
{
|
|
||||||
xmlNode *subnode;
|
|
||||||
/* use the first valid attribute content */
|
|
||||||
for (subnode = attr->children; subnode; subnode = subnode->next) {
|
|
||||||
if (subnode->type == XML_TEXT_NODE) {
|
|
||||||
if (subnode->content && subnode->content[0] != '\0' && subnode->content[0] != '\n')
|
|
||||||
return subnode->content;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml attr node type %u\n", subnode->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_object_attr(struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *obj,
|
|
||||||
const xmlChar *_name, const xmlChar *_value)
|
|
||||||
{
|
|
||||||
const char *name = (const char *) _name;
|
|
||||||
const char *value = (const char *) _value;
|
|
||||||
|
|
||||||
if (!strcmp(name, "type")) {
|
|
||||||
/* already handled */
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (!strcmp(name, "os_level"))
|
|
||||||
obj->os_level = strtoul(value, NULL, 10);
|
|
||||||
else if (!strcmp(name, "os_index"))
|
|
||||||
obj->os_index = strtoul(value, NULL, 10);
|
|
||||||
else if (!strcmp(name, "cpuset")) {
|
|
||||||
obj->cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->cpuset, value);
|
|
||||||
} else if (!strcmp(name, "complete_cpuset")) {
|
|
||||||
obj->complete_cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->complete_cpuset,value);
|
|
||||||
} else if (!strcmp(name, "online_cpuset")) {
|
|
||||||
obj->online_cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->online_cpuset, value);
|
|
||||||
} else if (!strcmp(name, "allowed_cpuset")) {
|
|
||||||
obj->allowed_cpuset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->allowed_cpuset, value);
|
|
||||||
} else if (!strcmp(name, "nodeset")) {
|
|
||||||
obj->nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->nodeset, value);
|
|
||||||
} else if (!strcmp(name, "complete_nodeset")) {
|
|
||||||
obj->complete_nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->complete_nodeset, value);
|
|
||||||
} else if (!strcmp(name, "allowed_nodeset")) {
|
|
||||||
obj->allowed_nodeset = hwloc_bitmap_alloc();
|
|
||||||
hwloc_bitmap_sscanf(obj->allowed_nodeset, value);
|
|
||||||
} else if (!strcmp(name, "name"))
|
|
||||||
obj->name = strdup(value);
|
|
||||||
|
|
||||||
else if (!strcmp(name, "cache_size")) {
|
|
||||||
unsigned long long lvalue = strtoull(value, NULL, 10);
|
|
||||||
if (obj->type == HWLOC_OBJ_CACHE)
|
|
||||||
obj->attr->cache.size = lvalue;
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring cache_size attribute for non-cache object type\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (!strcmp(name, "cache_linesize")) {
|
|
||||||
unsigned long lvalue = strtoul(value, NULL, 10);
|
|
||||||
if (obj->type == HWLOC_OBJ_CACHE)
|
|
||||||
obj->attr->cache.linesize = lvalue;
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring cache_linesize attribute for non-cache object type\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (!strcmp(name, "local_memory"))
|
|
||||||
obj->memory.local_memory = strtoull(value, NULL, 10);
|
|
||||||
|
|
||||||
else if (!strcmp(name, "depth")) {
|
|
||||||
unsigned long lvalue = strtoul(value, NULL, 10);
|
|
||||||
switch (obj->type) {
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
obj->attr->cache.depth = lvalue;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
obj->attr->group.depth = lvalue;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "ignoring depth attribute for object type without depth\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*************************
|
|
||||||
* deprecated (from 1.0)
|
|
||||||
*/
|
|
||||||
else if (!strcmp(name, "dmi_board_vendor")) {
|
|
||||||
hwloc_add_object_info(obj, "DMIBoardVendor", strdup(value));
|
|
||||||
}
|
|
||||||
else if (!strcmp(name, "dmi_board_name")) {
|
|
||||||
hwloc_add_object_info(obj, "DMIBoardName", strdup(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************
|
|
||||||
* deprecated (from 0.9)
|
|
||||||
*/
|
|
||||||
else if (!strcmp(name, "memory_kB")) {
|
|
||||||
unsigned long long lvalue = strtoull(value, NULL, 10);
|
|
||||||
switch (obj->type) {
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
obj->attr->cache.size = lvalue << 10;
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
case HWLOC_OBJ_SYSTEM:
|
|
||||||
obj->memory.local_memory = lvalue << 10;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "ignoring memory_kB attribute for object type without memory\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!strcmp(name, "huge_page_size_kB")) {
|
|
||||||
unsigned long lvalue = strtoul(value, NULL, 10);
|
|
||||||
switch (obj->type) {
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
case HWLOC_OBJ_SYSTEM:
|
|
||||||
if (!obj->memory.page_types) {
|
|
||||||
obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types_len = 1;
|
|
||||||
}
|
|
||||||
obj->memory.page_types[0].size = lvalue << 10;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "ignoring huge_page_size_kB attribute for object type without huge pages\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (!strcmp(name, "huge_page_free")) {
|
|
||||||
unsigned long lvalue = strtoul(value, NULL, 10);
|
|
||||||
switch (obj->type) {
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
case HWLOC_OBJ_SYSTEM:
|
|
||||||
if (!obj->memory.page_types) {
|
|
||||||
obj->memory.page_types = malloc(sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types_len = 1;
|
|
||||||
}
|
|
||||||
obj->memory.page_types[0].count = lvalue;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
fprintf(stderr, "ignoring huge_page_free attribute for object type without huge pages\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* end of deprecated (from 0.9)
|
|
||||||
*******************************/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring unknown object attribute %s\n", name);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_object_node(struct hwloc_topology *topology, struct hwloc_obj *parent, struct hwloc_obj *obj, xmlNode *node, int depth)
|
|
||||||
{
|
|
||||||
xmlAttr *attr = NULL;
|
|
||||||
|
|
||||||
/* first determine the object type */
|
|
||||||
for (attr = node->properties; attr; attr = attr->next) {
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE && !strcmp((const char*) attr->name, "type")) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (!value) {
|
|
||||||
fprintf(stderr, "ignoring xml object without type attr %s\n", (const char*) value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
obj->type = hwloc_obj_type_of_string((const char*) value);
|
|
||||||
if (obj->type == (hwloc_obj_type_t)-1) {
|
|
||||||
fprintf(stderr, "ignoring unknown object type %s\n", (const char*) value);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (obj->type == HWLOC_OBJ_TYPE_MAX) {
|
|
||||||
fprintf(stderr, "ignoring object without type\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process attributes now that the type is known */
|
|
||||||
for (attr = node->properties; attr; attr = attr->next) {
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (value)
|
|
||||||
hwloc__xml_import_object_attr(topology, obj, attr->name, value);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml object attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (depth > 0) { /* root object is already in place */
|
|
||||||
/* add object */
|
|
||||||
hwloc_insert_object_by_parent(topology, parent, obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process children */
|
|
||||||
if (node->children)
|
|
||||||
hwloc__xml_import_node(topology, obj, node->children, depth+1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_pagetype_node(struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *obj, xmlNode *node)
|
|
||||||
{
|
|
||||||
uint64_t size = 0, count = 0;
|
|
||||||
xmlAttr *attr = NULL;
|
|
||||||
|
|
||||||
for (attr = node->properties; attr; attr = attr->next) {
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (value) {
|
|
||||||
if (!strcmp((char *) attr->name, "size"))
|
|
||||||
size = strtoul((char *) value, NULL, 10);
|
|
||||||
else if (!strcmp((char *) attr->name, "count"))
|
|
||||||
count = strtoul((char *) value, NULL, 10);
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring unknown pagetype attribute %s\n", (char *) attr->name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml pagetype attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (size) {
|
|
||||||
int idx = obj->memory.page_types_len;
|
|
||||||
obj->memory.page_types = realloc(obj->memory.page_types, (idx+1)*sizeof(*obj->memory.page_types));
|
|
||||||
obj->memory.page_types_len = idx+1;
|
|
||||||
obj->memory.page_types[idx].size = size;
|
|
||||||
obj->memory.page_types[idx].count = count;
|
|
||||||
} else
|
|
||||||
fprintf(stderr, "ignoring pagetype attribute without size\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_distances_node(struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *obj, xmlNode *node)
|
|
||||||
{
|
|
||||||
unsigned long reldepth = 0, nbobjs = 0;
|
|
||||||
float latbase = 0;
|
|
||||||
xmlAttr *attr = NULL;
|
|
||||||
xmlNode *subnode;
|
|
||||||
|
|
||||||
for (attr = node->properties; attr; attr = attr->next) {
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (value) {
|
|
||||||
if (!strcmp((char *) attr->name, "nbobjs"))
|
|
||||||
nbobjs = strtoul((char *) value, NULL, 10);
|
|
||||||
else if (!strcmp((char *) attr->name, "relative_depth"))
|
|
||||||
reldepth = strtoul((char *) value, NULL, 10);
|
|
||||||
else if (!strcmp((char *) attr->name, "latency_base"))
|
|
||||||
latbase = (float) atof((char *) value);
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring unknown distances attribute %s\n", (char *) attr->name);
|
|
||||||
} else
|
|
||||||
fprintf(stderr, "ignoring unexpected xml distances attr name `%s' with no value\n", (const char*) attr->name);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml distances attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nbobjs && reldepth && latbase) {
|
|
||||||
int idx = obj->distances_count;
|
|
||||||
unsigned nbcells, i;
|
|
||||||
float *matrix, latmax = 0;
|
|
||||||
|
|
||||||
nbcells = 0;
|
|
||||||
if (node->children)
|
|
||||||
for(subnode = node->children; subnode; subnode = subnode->next)
|
|
||||||
if (subnode->type == XML_ELEMENT_NODE)
|
|
||||||
nbcells++;
|
|
||||||
if (nbcells != nbobjs*nbobjs) {
|
|
||||||
fprintf(stderr, "ignoring distances with %u cells instead of %lu\n", nbcells, nbobjs*nbobjs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj->distances = realloc(obj->distances, (idx+1)*sizeof(*obj->distances));
|
|
||||||
obj->distances_count = idx+1;
|
|
||||||
obj->distances[idx] = malloc(sizeof(**obj->distances));
|
|
||||||
obj->distances[idx]->relative_depth = reldepth;
|
|
||||||
obj->distances[idx]->nbobjs = nbobjs;
|
|
||||||
obj->distances[idx]->latency = matrix = malloc(nbcells*sizeof(float));
|
|
||||||
obj->distances[idx]->latency_base = latbase;
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
for(subnode = node->children; subnode; subnode = subnode->next)
|
|
||||||
if (subnode->type == XML_ELEMENT_NODE) {
|
|
||||||
/* read one cell */
|
|
||||||
for (attr = subnode->properties; attr; attr = attr->next)
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (value) {
|
|
||||||
if (!strcmp((char *) attr->name, "value")) {
|
|
||||||
float val = (float) atof((char *) value);
|
|
||||||
matrix[i] = val;
|
|
||||||
if (val > latmax)
|
|
||||||
latmax = val;
|
|
||||||
} else
|
|
||||||
fprintf(stderr, "ignoring unknown distance attribute %s\n", (char *) attr->name);
|
|
||||||
} else
|
|
||||||
fprintf(stderr, "ignoring unexpected xml distance attr name `%s' with no value\n", (const char*) attr->name);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml distance attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
/* next matrix cell */
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
obj->distances[idx]->latency_max = latmax;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_info_node(struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *obj, xmlNode *node)
|
|
||||||
{
|
|
||||||
char *infoname = NULL;
|
|
||||||
char *infovalue = NULL;
|
|
||||||
xmlAttr *attr = NULL;
|
|
||||||
|
|
||||||
for (attr = node->properties; attr; attr = attr->next) {
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (value) {
|
|
||||||
if (!strcmp((char *) attr->name, "name"))
|
|
||||||
infoname = (char *) value;
|
|
||||||
else if (!strcmp((char *) attr->name, "value"))
|
|
||||||
infovalue = (char *) value;
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring unknown info attribute %s\n", (char *) attr->name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml info attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (infoname)
|
|
||||||
/* empty strings are ignored by libxml */
|
|
||||||
hwloc_add_object_info(obj, infoname, infovalue ? infovalue : "");
|
|
||||||
else
|
|
||||||
fprintf(stderr, "ignoring info attribute without name\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_node(struct hwloc_topology *topology, struct hwloc_obj *parent, xmlNode *node, int depth)
|
|
||||||
{
|
|
||||||
for (; node; node = node->next) {
|
|
||||||
if (node->type == XML_ELEMENT_NODE) {
|
|
||||||
if (!strcmp((const char*) node->name, "object")) {
|
|
||||||
/* object attributes */
|
|
||||||
struct hwloc_obj *obj;
|
|
||||||
if (depth)
|
|
||||||
obj = hwloc_alloc_setup_object(HWLOC_OBJ_TYPE_MAX, -1);
|
|
||||||
else
|
|
||||||
obj = topology->levels[0][0];
|
|
||||||
hwloc__xml_import_object_node(topology, parent, obj, node, depth);
|
|
||||||
|
|
||||||
} else if (!strcmp((const char*) node->name, "page_type")) {
|
|
||||||
hwloc__xml_import_pagetype_node(topology, parent, node);
|
|
||||||
|
|
||||||
} else if (!strcmp((const char*) node->name, "info")) {
|
|
||||||
hwloc__xml_import_info_node(topology, parent, node);
|
|
||||||
|
|
||||||
} else if (!strcmp((const char*) node->name, "distances")) {
|
|
||||||
hwloc__xml_import_distances_node(topology, parent, node);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
/* unknown class */
|
|
||||||
fprintf(stderr, "ignoring unexpected node class `%s'\n", (const char*) node->name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else if (node->type == XML_TEXT_NODE) {
|
|
||||||
if (node->content && node->content[0] != '\0' && node->content[0] != '\n')
|
|
||||||
fprintf(stderr, "ignoring object text content %s\n", (const char*) node->content);
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml node type %u\n", node->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_import_topology_node(struct hwloc_topology *topology, xmlNode *node)
|
|
||||||
{
|
|
||||||
xmlAttr *attr = NULL;
|
|
||||||
|
|
||||||
if (strcmp((const char *) node->name, "topology") && strcmp((const char *) node->name, "root")) {
|
|
||||||
/* root node should be in "topology" class (or "root" if importing from < 1.0) */
|
|
||||||
fprintf(stderr, "ignoring object of class `%s' not at the top the xml hierarchy\n", (const char *) node->name);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process attributes */
|
|
||||||
for (attr = node->properties; attr; attr = attr->next) {
|
|
||||||
if (attr->type == XML_ATTRIBUTE_NODE) {
|
|
||||||
const xmlChar *value = hwloc__xml_import_attr_value(attr);
|
|
||||||
if (value) {
|
|
||||||
fprintf(stderr, "ignoring unknown root attribute %s\n", (char *) attr->name);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
fprintf(stderr, "ignoring unexpected xml root attr type %u\n", attr->type);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* process children */
|
|
||||||
if (node->children)
|
|
||||||
hwloc__xml_import_node(topology, NULL, node->children, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_look_xml(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
xmlNode* root_node;
|
|
||||||
xmlDtd *dtd;
|
|
||||||
|
|
||||||
topology->support.discovery->pu = 1;
|
|
||||||
|
|
||||||
dtd = xmlGetIntSubset((xmlDoc*) topology->backend_params.xml.doc);
|
|
||||||
if (!dtd)
|
|
||||||
fprintf(stderr, "Loading XML topology without DTD\n");
|
|
||||||
else if (strcmp((char *) dtd->SystemID, "hwloc.dtd"))
|
|
||||||
fprintf(stderr, "Loading XML topology with wrong DTD SystemID (%s instead of %s)\n",
|
|
||||||
(char *) dtd->SystemID, "hwloc.dtd");
|
|
||||||
|
|
||||||
root_node = xmlDocGetRootElement((xmlDoc*) topology->backend_params.xml.doc);
|
|
||||||
|
|
||||||
hwloc__xml_import_topology_node(topology, root_node);
|
|
||||||
if (root_node->next)
|
|
||||||
fprintf(stderr, "ignoring non-first root nodes\n");
|
|
||||||
|
|
||||||
/* keep the "Backend" information intact */
|
|
||||||
/* we could add "BackendSource=XML" to notify that XML was used between the actual backend and here */
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc_xml__check_distances(struct hwloc_topology *topology, hwloc_obj_t obj)
|
|
||||||
{
|
|
||||||
hwloc_obj_t child;
|
|
||||||
unsigned i=0;
|
|
||||||
while (i<obj->distances_count) {
|
|
||||||
unsigned depth = obj->depth + obj->distances[i]->relative_depth;
|
|
||||||
unsigned nbobjs = hwloc_get_nbobjs_inside_cpuset_by_depth(topology, obj->cpuset, depth);
|
|
||||||
if (nbobjs != obj->distances[i]->nbobjs) {
|
|
||||||
fprintf(stderr, "ignoring invalid distance matrix with %u objs instead of %u\n",
|
|
||||||
obj->distances[i]->nbobjs, nbobjs);
|
|
||||||
hwloc_free_logical_distances(obj->distances[i]);
|
|
||||||
memmove(&obj->distances[i], &obj->distances[i+1], (obj->distances_count-i-1)*sizeof(*obj->distances));
|
|
||||||
obj->distances_count--;
|
|
||||||
} else
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
child = obj->first_child;
|
|
||||||
while (child != NULL) {
|
|
||||||
hwloc_xml__check_distances(topology, child);
|
|
||||||
child = child->next_sibling;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
hwloc_xml_check_distances(struct hwloc_topology *topology)
|
|
||||||
{
|
|
||||||
/* now that the topology tree has been properly setup,
|
|
||||||
* check that our distance matrice sizes make sense */
|
|
||||||
hwloc_xml__check_distances(topology, topology->levels[0][0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/******************************
|
|
||||||
********* XML export *********
|
|
||||||
******************************/
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_export_object (hwloc_topology_t topology, hwloc_obj_t obj, xmlNodePtr root_node)
|
|
||||||
{
|
|
||||||
xmlNodePtr node = NULL, ptnode = NULL, dnode = NULL, dcnode = NULL;
|
|
||||||
char *cpuset = NULL;
|
|
||||||
char tmp[255];
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
/* xmlNewChild() creates a new node, which is "attached" as child node
|
|
||||||
* of root_node node. */
|
|
||||||
node = xmlNewChild(root_node, NULL, BAD_CAST "object", NULL);
|
|
||||||
xmlNewProp(node, BAD_CAST "type", BAD_CAST hwloc_obj_type_string(obj->type));
|
|
||||||
sprintf(tmp, "%d", obj->os_level);
|
|
||||||
xmlNewProp(node, BAD_CAST "os_level", BAD_CAST tmp);
|
|
||||||
if (obj->os_index != (unsigned) -1) {
|
|
||||||
sprintf(tmp, "%u", obj->os_index);
|
|
||||||
xmlNewProp(node, BAD_CAST "os_index", BAD_CAST tmp);
|
|
||||||
}
|
|
||||||
if (obj->cpuset) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->cpuset);
|
|
||||||
xmlNewProp(node, BAD_CAST "cpuset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
if (obj->complete_cpuset) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->complete_cpuset);
|
|
||||||
xmlNewProp(node, BAD_CAST "complete_cpuset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
if (obj->online_cpuset) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->online_cpuset);
|
|
||||||
xmlNewProp(node, BAD_CAST "online_cpuset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
if (obj->allowed_cpuset) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->allowed_cpuset);
|
|
||||||
xmlNewProp(node, BAD_CAST "allowed_cpuset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
if (obj->nodeset && !hwloc_bitmap_isfull(obj->nodeset)) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->nodeset);
|
|
||||||
xmlNewProp(node, BAD_CAST "nodeset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
if (obj->complete_nodeset && !hwloc_bitmap_isfull(obj->complete_nodeset)) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->complete_nodeset);
|
|
||||||
xmlNewProp(node, BAD_CAST "complete_nodeset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
if (obj->allowed_nodeset && !hwloc_bitmap_isfull(obj->allowed_nodeset)) {
|
|
||||||
hwloc_bitmap_asprintf(&cpuset, obj->allowed_nodeset);
|
|
||||||
xmlNewProp(node, BAD_CAST "allowed_nodeset", BAD_CAST cpuset);
|
|
||||||
free(cpuset);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj->name)
|
|
||||||
xmlNewProp(node, BAD_CAST "name", BAD_CAST obj->name);
|
|
||||||
|
|
||||||
switch (obj->type) {
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
sprintf(tmp, "%llu", (unsigned long long) obj->attr->cache.size);
|
|
||||||
xmlNewProp(node, BAD_CAST "cache_size", BAD_CAST tmp);
|
|
||||||
sprintf(tmp, "%u", obj->attr->cache.depth);
|
|
||||||
xmlNewProp(node, BAD_CAST "depth", BAD_CAST tmp);
|
|
||||||
sprintf(tmp, "%u", (unsigned) obj->attr->cache.linesize);
|
|
||||||
xmlNewProp(node, BAD_CAST "cache_linesize", BAD_CAST tmp);
|
|
||||||
break;
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
sprintf(tmp, "%u", obj->attr->group.depth);
|
|
||||||
xmlNewProp(node, BAD_CAST "depth", BAD_CAST tmp);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj->memory.local_memory) {
|
|
||||||
sprintf(tmp, "%llu", (unsigned long long) obj->memory.local_memory);
|
|
||||||
xmlNewProp(node, BAD_CAST "local_memory", BAD_CAST tmp);
|
|
||||||
}
|
|
||||||
for(i=0; i<obj->memory.page_types_len; i++) {
|
|
||||||
ptnode = xmlNewChild(node, NULL, BAD_CAST "page_type", NULL);
|
|
||||||
sprintf(tmp, "%llu", (unsigned long long) obj->memory.page_types[i].size);
|
|
||||||
xmlNewProp(ptnode, BAD_CAST "size", BAD_CAST tmp);
|
|
||||||
sprintf(tmp, "%llu", (unsigned long long) obj->memory.page_types[i].count);
|
|
||||||
xmlNewProp(ptnode, BAD_CAST "count", BAD_CAST tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0; i<obj->infos_count; i++) {
|
|
||||||
ptnode = xmlNewChild(node, NULL, BAD_CAST "info", NULL);
|
|
||||||
xmlNewProp(ptnode, BAD_CAST "name", BAD_CAST obj->infos[i].name);
|
|
||||||
xmlNewProp(ptnode, BAD_CAST "value", BAD_CAST obj->infos[i].value);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0; i<obj->distances_count; i++) {
|
|
||||||
unsigned nbobjs = obj->distances[i]->nbobjs;
|
|
||||||
unsigned j;
|
|
||||||
dnode = xmlNewChild(node, NULL, BAD_CAST "distances", NULL);
|
|
||||||
sprintf(tmp, "%u", nbobjs);
|
|
||||||
xmlNewProp(dnode, BAD_CAST "nbobjs", BAD_CAST tmp);
|
|
||||||
sprintf(tmp, "%u", obj->distances[i]->relative_depth);
|
|
||||||
xmlNewProp(dnode, BAD_CAST "relative_depth", BAD_CAST tmp);
|
|
||||||
sprintf(tmp, "%f", obj->distances[i]->latency_base);
|
|
||||||
xmlNewProp(dnode, BAD_CAST "latency_base", BAD_CAST tmp);
|
|
||||||
for(j=0; j<nbobjs*nbobjs; j++) {
|
|
||||||
dcnode = xmlNewChild(dnode, NULL, BAD_CAST "latency", NULL);
|
|
||||||
sprintf(tmp, "%f", obj->distances[i]->latency[j]);
|
|
||||||
xmlNewProp(dcnode, BAD_CAST "value", BAD_CAST tmp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj->arity) {
|
|
||||||
unsigned x;
|
|
||||||
for (x=0; x<obj->arity; x++)
|
|
||||||
hwloc__xml_export_object (topology, obj->children[x], node);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
hwloc__xml_export_topology_info (hwloc_topology_t topology __hwloc_attribute_unused, xmlNodePtr root_node __hwloc_attribute_unused)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static xmlDocPtr
|
|
||||||
hwloc__topology_prepare_export(hwloc_topology_t topology)
|
|
||||||
{
|
|
||||||
xmlDocPtr doc = NULL; /* document pointer */
|
|
||||||
xmlNodePtr root_node = NULL; /* root pointer */
|
|
||||||
xmlDtdPtr dtd = NULL; /* DTD pointer */
|
|
||||||
|
|
||||||
LIBXML_TEST_VERSION;
|
|
||||||
|
|
||||||
/* Creates a new document, a node and set it as a root node. */
|
|
||||||
doc = xmlNewDoc(BAD_CAST "1.0");
|
|
||||||
root_node = xmlNewNode(NULL, BAD_CAST "topology");
|
|
||||||
xmlDocSetRootElement(doc, root_node);
|
|
||||||
|
|
||||||
/* Creates a DTD declaration. Isn't mandatory. */
|
|
||||||
dtd = xmlCreateIntSubset(doc, BAD_CAST "topology", NULL, BAD_CAST "hwloc.dtd");
|
|
||||||
|
|
||||||
hwloc__xml_export_object (topology, hwloc_get_root_obj(topology), root_node);
|
|
||||||
|
|
||||||
hwloc__xml_export_topology_info (topology, root_node);
|
|
||||||
|
|
||||||
return doc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void hwloc_topology_export_xml(hwloc_topology_t topology, const char *filename)
|
|
||||||
{
|
|
||||||
xmlDocPtr doc = hwloc__topology_prepare_export(topology);
|
|
||||||
xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1);
|
|
||||||
xmlFreeDoc(doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
void hwloc_topology_export_xmlbuffer(hwloc_topology_t topology, char **xmlbuffer, int *buflen)
|
|
||||||
{
|
|
||||||
xmlDocPtr doc = hwloc__topology_prepare_export(topology);
|
|
||||||
xmlDocDumpFormatMemoryEnc(doc, (xmlChar **)xmlbuffer, buflen, "UTF-8", 1);
|
|
||||||
xmlFreeDoc(doc);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* HWLOC_HAVE_XML */
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,350 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2009 CNRS
|
|
||||||
* Copyright © 2009-2011 INRIA. All rights reserved.
|
|
||||||
* Copyright © 2009-2010 Université Bordeaux 1
|
|
||||||
* Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved.
|
|
||||||
* See COPYING in top-level directory.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <private/autogen/config.h>
|
|
||||||
#include <hwloc.h>
|
|
||||||
#include <private/private.h>
|
|
||||||
#include <private/misc.h>
|
|
||||||
#include <private/debug.h>
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_type_depth (struct hwloc_topology *topology, hwloc_obj_type_t type)
|
|
||||||
{
|
|
||||||
return topology->type_depth[type];
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_obj_type_t
|
|
||||||
hwloc_get_depth_type (hwloc_topology_t topology, unsigned depth)
|
|
||||||
{
|
|
||||||
if (depth >= topology->nb_levels)
|
|
||||||
return (hwloc_obj_type_t) -1;
|
|
||||||
return topology->levels[depth][0]->type;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned
|
|
||||||
hwloc_get_nbobjs_by_depth (struct hwloc_topology *topology, unsigned depth)
|
|
||||||
{
|
|
||||||
if (depth >= topology->nb_levels)
|
|
||||||
return 0;
|
|
||||||
return topology->level_nbobjects[depth];
|
|
||||||
}
|
|
||||||
|
|
||||||
struct hwloc_obj *
|
|
||||||
hwloc_get_obj_by_depth (struct hwloc_topology *topology, unsigned depth, unsigned idx)
|
|
||||||
{
|
|
||||||
if (depth >= topology->nb_levels)
|
|
||||||
return NULL;
|
|
||||||
if (idx >= topology->level_nbobjects[depth])
|
|
||||||
return NULL;
|
|
||||||
return topology->levels[depth][idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned hwloc_get_closest_objs (struct hwloc_topology *topology, struct hwloc_obj *src, struct hwloc_obj **objs, unsigned max)
|
|
||||||
{
|
|
||||||
struct hwloc_obj *parent, *nextparent, **src_objs;
|
|
||||||
int i,src_nbobjects;
|
|
||||||
unsigned stored = 0;
|
|
||||||
|
|
||||||
if (!src->cpuset)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
src_nbobjects = topology->level_nbobjects[src->depth];
|
|
||||||
src_objs = topology->levels[src->depth];
|
|
||||||
|
|
||||||
parent = src;
|
|
||||||
while (stored < max) {
|
|
||||||
while (1) {
|
|
||||||
nextparent = parent->parent;
|
|
||||||
if (!nextparent)
|
|
||||||
goto out;
|
|
||||||
if (!nextparent->cpuset || !hwloc_bitmap_isequal(parent->cpuset, nextparent->cpuset))
|
|
||||||
break;
|
|
||||||
parent = nextparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!nextparent->cpuset)
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* traverse src's objects and find those that are in nextparent and were not in parent */
|
|
||||||
for(i=0; i<src_nbobjects; i++) {
|
|
||||||
if (hwloc_bitmap_isincluded(src_objs[i]->cpuset, nextparent->cpuset)
|
|
||||||
&& !hwloc_bitmap_isincluded(src_objs[i]->cpuset, parent->cpuset)) {
|
|
||||||
objs[stored++] = src_objs[i];
|
|
||||||
if (stored == max)
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
parent = nextparent;
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
return stored;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
hwloc__get_largest_objs_inside_cpuset (struct hwloc_obj *current, hwloc_const_bitmap_t set,
|
|
||||||
struct hwloc_obj ***res, int *max)
|
|
||||||
{
|
|
||||||
int gotten = 0;
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
/* the caller must ensure this */
|
|
||||||
if (*max <= 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (hwloc_bitmap_isequal(current->cpuset, set)) {
|
|
||||||
**res = current;
|
|
||||||
(*res)++;
|
|
||||||
(*max)--;
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i=0; i<current->arity; i++) {
|
|
||||||
hwloc_bitmap_t subset = hwloc_bitmap_dup(set);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* split out the cpuset part corresponding to this child and see if there's anything to do */
|
|
||||||
if (current->children[i]->cpuset) {
|
|
||||||
hwloc_bitmap_and(subset, subset, current->children[i]->cpuset);
|
|
||||||
if (hwloc_bitmap_iszero(subset)) {
|
|
||||||
hwloc_bitmap_free(subset);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = hwloc__get_largest_objs_inside_cpuset (current->children[i], subset, res, max);
|
|
||||||
gotten += ret;
|
|
||||||
hwloc_bitmap_free(subset);
|
|
||||||
|
|
||||||
/* if no more room to store remaining objects, return what we got so far */
|
|
||||||
if (!*max)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
return gotten;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_get_largest_objs_inside_cpuset (struct hwloc_topology *topology, hwloc_const_bitmap_t set,
|
|
||||||
struct hwloc_obj **objs, int max)
|
|
||||||
{
|
|
||||||
struct hwloc_obj *current = topology->levels[0][0];
|
|
||||||
|
|
||||||
if (!current->cpuset || !hwloc_bitmap_isincluded(set, current->cpuset))
|
|
||||||
return -1;
|
|
||||||
|
|
||||||
if (max <= 0)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return hwloc__get_largest_objs_inside_cpuset (current, set, &objs, &max);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
hwloc_obj_type_string (hwloc_obj_type_t obj)
|
|
||||||
{
|
|
||||||
switch (obj)
|
|
||||||
{
|
|
||||||
case HWLOC_OBJ_SYSTEM: return "System";
|
|
||||||
case HWLOC_OBJ_MACHINE: return "Machine";
|
|
||||||
case HWLOC_OBJ_MISC: return "Misc";
|
|
||||||
case HWLOC_OBJ_GROUP: return "Group";
|
|
||||||
case HWLOC_OBJ_NODE: return "NUMANode";
|
|
||||||
case HWLOC_OBJ_SOCKET: return "Socket";
|
|
||||||
case HWLOC_OBJ_CACHE: return "Cache";
|
|
||||||
case HWLOC_OBJ_CORE: return "Core";
|
|
||||||
case HWLOC_OBJ_PU: return "PU";
|
|
||||||
default: return "Unknown";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_obj_type_t
|
|
||||||
hwloc_obj_type_of_string (const char * string)
|
|
||||||
{
|
|
||||||
if (!strcasecmp(string, "System")) return HWLOC_OBJ_SYSTEM;
|
|
||||||
if (!strcasecmp(string, "Machine")) return HWLOC_OBJ_MACHINE;
|
|
||||||
if (!strcasecmp(string, "Misc")) return HWLOC_OBJ_MISC;
|
|
||||||
if (!strcasecmp(string, "Group")) return HWLOC_OBJ_GROUP;
|
|
||||||
if (!strcasecmp(string, "NUMANode") || !strcasecmp(string, "Node")) return HWLOC_OBJ_NODE;
|
|
||||||
if (!strcasecmp(string, "Socket")) return HWLOC_OBJ_SOCKET;
|
|
||||||
if (!strcasecmp(string, "Cache")) return HWLOC_OBJ_CACHE;
|
|
||||||
if (!strcasecmp(string, "Core")) return HWLOC_OBJ_CORE;
|
|
||||||
if (!strcasecmp(string, "PU") || !strcasecmp(string, "proc") /* backward compatiliby with 0.9 */) return HWLOC_OBJ_PU;
|
|
||||||
return (hwloc_obj_type_t) -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#define hwloc_memory_size_printf_value(_size, _verbose) \
|
|
||||||
((_size) < (10ULL<<20) || _verbose ? (((_size)>>9)+1)>>1 : (_size) < (10ULL<<30) ? (((_size)>>19)+1)>>1 : (((_size)>>29)+1)>>1)
|
|
||||||
#define hwloc_memory_size_printf_unit(_size, _verbose) \
|
|
||||||
((_size) < (10ULL<<20) || _verbose ? "KB" : (_size) < (10ULL<<30) ? "MB" : "GB")
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_obj_type_snprintf(char * __hwloc_restrict string, size_t size, hwloc_obj_t obj, int verbose)
|
|
||||||
{
|
|
||||||
hwloc_obj_type_t type = obj->type;
|
|
||||||
switch (type) {
|
|
||||||
case HWLOC_OBJ_MISC:
|
|
||||||
case HWLOC_OBJ_SYSTEM:
|
|
||||||
case HWLOC_OBJ_MACHINE:
|
|
||||||
case HWLOC_OBJ_NODE:
|
|
||||||
case HWLOC_OBJ_SOCKET:
|
|
||||||
case HWLOC_OBJ_CORE:
|
|
||||||
case HWLOC_OBJ_PU:
|
|
||||||
return hwloc_snprintf(string, size, "%s", hwloc_obj_type_string(type));
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
return hwloc_snprintf(string, size, "L%u%s", obj->attr->cache.depth, verbose ? hwloc_obj_type_string(type): "");
|
|
||||||
case HWLOC_OBJ_GROUP:
|
|
||||||
/* TODO: more pretty presentation? */
|
|
||||||
return hwloc_snprintf(string, size, "%s%u", hwloc_obj_type_string(type), obj->attr->group.depth);
|
|
||||||
default:
|
|
||||||
if (size > 0)
|
|
||||||
*string = '\0';
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_obj_attr_snprintf(char * __hwloc_restrict string, size_t size, hwloc_obj_t obj, const char * separator, int verbose)
|
|
||||||
{
|
|
||||||
const char *prefix = "";
|
|
||||||
char *tmp = string;
|
|
||||||
ssize_t tmplen = size;
|
|
||||||
int ret = 0;
|
|
||||||
int res;
|
|
||||||
|
|
||||||
/* make sure we output at least an empty string */
|
|
||||||
if (size)
|
|
||||||
*string = '\0';
|
|
||||||
|
|
||||||
/* print memory attributes */
|
|
||||||
res = 0;
|
|
||||||
if (verbose) {
|
|
||||||
if (obj->memory.local_memory)
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%slocal=%lu%s%stotal=%lu%s",
|
|
||||||
prefix,
|
|
||||||
(unsigned long) hwloc_memory_size_printf_value(obj->memory.total_memory, verbose),
|
|
||||||
hwloc_memory_size_printf_unit(obj->memory.total_memory, verbose),
|
|
||||||
separator,
|
|
||||||
(unsigned long) hwloc_memory_size_printf_value(obj->memory.local_memory, verbose),
|
|
||||||
hwloc_memory_size_printf_unit(obj->memory.local_memory, verbose));
|
|
||||||
else if (obj->memory.total_memory)
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%stotal=%lu%s",
|
|
||||||
prefix,
|
|
||||||
(unsigned long) hwloc_memory_size_printf_value(obj->memory.total_memory, verbose),
|
|
||||||
hwloc_memory_size_printf_unit(obj->memory.total_memory, verbose));
|
|
||||||
} else {
|
|
||||||
if (obj->memory.total_memory)
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%s%lu%s",
|
|
||||||
prefix,
|
|
||||||
(unsigned long) hwloc_memory_size_printf_value(obj->memory.total_memory, verbose),
|
|
||||||
hwloc_memory_size_printf_unit(obj->memory.total_memory, verbose));
|
|
||||||
}
|
|
||||||
if (res < 0)
|
|
||||||
return -1;
|
|
||||||
ret += res;
|
|
||||||
if (ret > 0)
|
|
||||||
prefix = separator;
|
|
||||||
if (res >= tmplen)
|
|
||||||
res = tmplen>0 ? tmplen - 1 : 0;
|
|
||||||
tmp += res;
|
|
||||||
tmplen -= res;
|
|
||||||
|
|
||||||
/* printf type-specific attributes */
|
|
||||||
res = 0;
|
|
||||||
switch (obj->type) {
|
|
||||||
case HWLOC_OBJ_CACHE:
|
|
||||||
if (verbose)
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%s%lu%s%sline=%u",
|
|
||||||
prefix,
|
|
||||||
(unsigned long) hwloc_memory_size_printf_value(obj->attr->cache.size, verbose),
|
|
||||||
hwloc_memory_size_printf_unit(obj->attr->cache.size, verbose),
|
|
||||||
separator, obj->attr->cache.linesize);
|
|
||||||
else
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%s%lu%s",
|
|
||||||
prefix,
|
|
||||||
(unsigned long) hwloc_memory_size_printf_value(obj->attr->cache.size, verbose),
|
|
||||||
hwloc_memory_size_printf_unit(obj->attr->cache.size, verbose));
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (res < 0)
|
|
||||||
return -1;
|
|
||||||
ret += res;
|
|
||||||
if (ret > 0)
|
|
||||||
prefix = separator;
|
|
||||||
if (res >= tmplen)
|
|
||||||
res = tmplen>0 ? tmplen - 1 : 0;
|
|
||||||
tmp += res;
|
|
||||||
tmplen -= res;
|
|
||||||
|
|
||||||
/* printf infos */
|
|
||||||
if (verbose) {
|
|
||||||
unsigned i;
|
|
||||||
for(i=0; i<obj->infos_count; i++) {
|
|
||||||
if (strchr(obj->infos[i].value, ' '))
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%s%s=\"%s\"",
|
|
||||||
prefix,
|
|
||||||
obj->infos[i].name, obj->infos[i].value);
|
|
||||||
else
|
|
||||||
res = hwloc_snprintf(tmp, tmplen, "%s%s=%s",
|
|
||||||
prefix,
|
|
||||||
obj->infos[i].name, obj->infos[i].value);
|
|
||||||
if (res < 0)
|
|
||||||
return -1;
|
|
||||||
ret += res;
|
|
||||||
if (res >= tmplen)
|
|
||||||
res = tmplen>0 ? tmplen - 1 : 0;
|
|
||||||
tmp += res;
|
|
||||||
tmplen -= res;
|
|
||||||
if (ret > 0)
|
|
||||||
prefix = separator;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int
|
|
||||||
hwloc_obj_snprintf(char *string, size_t size,
|
|
||||||
struct hwloc_topology *topology __hwloc_attribute_unused, struct hwloc_obj *l, const char *_indexprefix, int verbose)
|
|
||||||
{
|
|
||||||
const char *indexprefix = _indexprefix ? _indexprefix : "#";
|
|
||||||
char os_index[12] = "";
|
|
||||||
char type[64];
|
|
||||||
char attr[128];
|
|
||||||
int attrlen;
|
|
||||||
|
|
||||||
if (l->os_index != (unsigned) -1) {
|
|
||||||
hwloc_snprintf(os_index, 12, "%s%u", indexprefix, l->os_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
hwloc_obj_type_snprintf(type, sizeof(type), l, verbose);
|
|
||||||
attrlen = hwloc_obj_attr_snprintf(attr, sizeof(attr), l, " ", verbose);
|
|
||||||
|
|
||||||
if (attrlen > 0)
|
|
||||||
return hwloc_snprintf(string, size, "%s%s(%s)", type, os_index, attr);
|
|
||||||
else
|
|
||||||
return hwloc_snprintf(string, size, "%s%s", type, os_index);
|
|
||||||
}
|
|
||||||
|
|
||||||
int hwloc_obj_cpuset_snprintf(char *str, size_t size, size_t nobj, struct hwloc_obj * const *objs)
|
|
||||||
{
|
|
||||||
hwloc_bitmap_t set = hwloc_bitmap_alloc();
|
|
||||||
int res;
|
|
||||||
unsigned i;
|
|
||||||
|
|
||||||
hwloc_bitmap_zero(set);
|
|
||||||
for(i=0; i<nobj; i++)
|
|
||||||
if (objs[i]->cpuset)
|
|
||||||
hwloc_bitmap_or(set, set, objs[i]->cpuset);
|
|
||||||
|
|
||||||
res = hwloc_bitmap_snprintf(str, size, set);
|
|
||||||
hwloc_bitmap_free(set);
|
|
||||||
return res;
|
|
||||||
}
|
|
Loading…
Reference in New Issue