?????????? ????????? - ??????????????? - /home/agenciai/public_html/cd38d8/hwloc.tar
???????
examples/sharedcaches.c 0000644 00000005430 15125521641 0011147 0 ustar 00 /* This example program looks for caches shared between this process * and another one based on their current binding. * * Copyright © 2014-2018 Inria. All rights reserved. * See COPYING in top-level directory. */ #include "hwloc.h" #include <errno.h> #include <stdio.h> #include <string.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif int main(int argc, char *argv[]) { pid_t hispid; hwloc_topology_t topology; hwloc_bitmap_t set, hisset; hwloc_obj_t obj; int err; /* find the pid of the other process, otherwise use my own pid */ if (argc >= 2) { hispid = atoi(argv[1]); } else { hispid = getpid(); } /* create a topology with instruction caches enables */ err = hwloc_topology_init(&topology); if (err < 0) { fprintf(stderr, "failed to initialize the topology\n"); return EXIT_FAILURE; } hwloc_topology_set_icache_types_filter(topology, HWLOC_TYPE_FILTER_KEEP_ALL); err = hwloc_topology_load(topology); if (err < 0) { fprintf(stderr, "failed to load the topology\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* find where I am running */ set = hwloc_bitmap_alloc(); if (!set) { fprintf(stderr, "failed to allocate my bitmap\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } err = hwloc_get_cpubind(topology, set, 0); if (err < 0) { fprintf(stderr, "failed to get my binding\n"); hwloc_bitmap_free(set); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* find where the other process is running */ hisset = hwloc_bitmap_alloc(); if (!hisset) { fprintf(stderr, "failed to allocate his bitmap\n"); hwloc_bitmap_free(set); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* FIXME: on windows, hispid should be replaced with OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, hispid); */ err = hwloc_get_proc_cpubind(topology, hispid, hisset, 0); if (err < 0) { fprintf(stderr, "failed to get his binding\n"); hwloc_bitmap_free(hisset); hwloc_bitmap_free(set); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* merge both process binding into mine */ hwloc_bitmap_or(set, set, hisset); /* find the smallest object covering this set */ obj = hwloc_get_obj_covering_cpuset(topology, set); /* display parents of type cache */ while (obj) { if (hwloc_obj_type_is_cache(obj->type)) { char type[64]; char attr[64]; hwloc_obj_type_snprintf(type, sizeof(type), obj, 0); hwloc_obj_attr_snprintf(attr, sizeof(attr), obj, ", ", 0); printf("Found object %s with attributes %s\n", type, attr); } /* next parent up in the tree */ obj = obj->parent; } hwloc_bitmap_free(hisset); hwloc_bitmap_free(set); hwloc_topology_destroy(topology); return EXIT_SUCCESS; } examples/Makefile_x86_64 0000644 00000122377 15125521641 0011056 0 ustar 00 # Makefile.in generated by automake 1.16.3 from Makefile.am. # doc/examples/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2020 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. # Copyright © 2009-2018 Inria. All rights reserved. # Copyright © 2009-2013, 2017 Université Bordeaux # Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. # See COPYING in top-level directory. # # Make sure that the documentation examples work # am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/hwloc pkgincludedir = $(includedir)/hwloc pkglibdir = $(libdir)/hwloc pkglibexecdir = $(libexecdir)/hwloc 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 = x86_64-redhat-linux-gnu host_triplet = x86_64-redhat-linux-gnu target_triplet = x86_64-redhat-linux-gnu TESTS = hwloc-hello$(EXEEXT) $(am__EXEEXT_1) am__append_1 = hwloc-hello-cpp check_PROGRAMS = $(am__EXEEXT_2) cpuset+bitmap+cpubind$(EXEEXT) \ nodeset+membind+policy$(EXEEXT) get-knl-modes$(EXEEXT) \ gpu$(EXEEXT) $(am__EXEEXT_3) am__append_2 = sharedcaches subdir = doc/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/hwloc.m4 \ $(top_srcdir)/config/hwloc_check_attributes.m4 \ $(top_srcdir)/config/hwloc_check_vendor.m4 \ $(top_srcdir)/config/hwloc_check_visibility.m4 \ $(top_srcdir)/config/hwloc_components.m4 \ $(top_srcdir)/config/hwloc_internal.m4 \ $(top_srcdir)/config/hwloc_pkg.m4 \ $(top_srcdir)/config/libtool.m4 \ $(top_srcdir)/config/ltoptions.m4 \ $(top_srcdir)/config/ltsugar.m4 \ $(top_srcdir)/config/ltversion.m4 \ $(top_srcdir)/config/lt~obsolete.m4 \ $(top_srcdir)/config/netloc.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/private/autogen/config.h \ $(top_builddir)/include/hwloc/autogen/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__EXEEXT_1 = hwloc-hello-cpp$(EXEEXT) am__EXEEXT_2 = hwloc-hello$(EXEEXT) $(am__EXEEXT_1) am__EXEEXT_3 = sharedcaches$(EXEEXT) cpuset_bitmap_cpubind_SOURCES = cpuset+bitmap+cpubind.c cpuset_bitmap_cpubind_OBJECTS = cpuset+bitmap+cpubind.$(OBJEXT) cpuset_bitmap_cpubind_LDADD = $(LDADD) cpuset_bitmap_cpubind_DEPENDENCIES = \ $(HWLOC_top_builddir)/hwloc/libhwloc.la AM_V_lt = $(am__v_lt_$(V)) am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) am__v_lt_0 = --silent am__v_lt_1 = get_knl_modes_SOURCES = get-knl-modes.c get_knl_modes_OBJECTS = get-knl-modes.$(OBJEXT) get_knl_modes_LDADD = $(LDADD) get_knl_modes_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la gpu_SOURCES = gpu.c gpu_OBJECTS = gpu.$(OBJEXT) gpu_LDADD = $(LDADD) gpu_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la hwloc_hello_SOURCES = hwloc-hello.c hwloc_hello_OBJECTS = hwloc-hello.$(OBJEXT) hwloc_hello_LDADD = $(LDADD) hwloc_hello_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la am_hwloc_hello_cpp_OBJECTS = hwloc-hello-cpp.$(OBJEXT) hwloc_hello_cpp_OBJECTS = $(am_hwloc_hello_cpp_OBJECTS) hwloc_hello_cpp_LDADD = $(LDADD) hwloc_hello_cpp_DEPENDENCIES = \ $(HWLOC_top_builddir)/hwloc/libhwloc.la nodeset_membind_policy_SOURCES = nodeset+membind+policy.c nodeset_membind_policy_OBJECTS = nodeset+membind+policy.$(OBJEXT) nodeset_membind_policy_LDADD = $(LDADD) nodeset_membind_policy_DEPENDENCIES = \ $(HWLOC_top_builddir)/hwloc/libhwloc.la sharedcaches_SOURCES = sharedcaches.c sharedcaches_OBJECTS = sharedcaches.$(OBJEXT) sharedcaches_LDADD = $(LDADD) sharedcaches_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir)/include/private/autogen -I$(top_builddir)/include/hwloc/autogen depcomp = $(SHELL) $(top_srcdir)/./config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cpuset+bitmap+cpubind.Po \ ./$(DEPDIR)/get-knl-modes.Po ./$(DEPDIR)/gpu.Po \ ./$(DEPDIR)/hwloc-hello-cpp.Po ./$(DEPDIR)/hwloc-hello.Po \ ./$(DEPDIR)/nodeset+membind+policy.Po \ ./$(DEPDIR)/sharedcaches.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_$(V)) am__v_CXX_ = $(am__v_CXX_$(AM_DEFAULT_VERBOSITY)) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_$(V)) am__v_CXXLD_ = $(am__v_CXXLD_$(AM_DEFAULT_VERBOSITY)) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = cpuset+bitmap+cpubind.c get-knl-modes.c gpu.c hwloc-hello.c \ $(hwloc_hello_cpp_SOURCES) nodeset+membind+policy.c \ sharedcaches.c DIST_SOURCES = cpuset+bitmap+cpubind.c get-knl-modes.c gpu.c \ hwloc-hello.c $(hwloc_hello_cpp_SOURCES) \ nodeset+membind+policy.c sharedcaches.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red='[0;31m'; \ grn='[0;32m'; \ lgn='[1;32m'; \ blu='[1;34m'; \ mgn='[0;35m'; \ brg='[1m'; \ std='[m'; \ fi; \ } 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__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = .test LOG_DRIVER = $(SHELL) $(top_srcdir)/./config/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/./config/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/./config/depcomp \ $(top_srcdir)/./config/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = ${SHELL} '/builddir/build/BUILD/hwloc-2.4.1/config/missing' aclocal-1.16 AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = ar AS = as AUTOCONF = ${SHELL} '/builddir/build/BUILD/hwloc-2.4.1/config/missing' autoconf AUTOHEADER = ${SHELL} '/builddir/build/BUILD/hwloc-2.4.1/config/missing' autoheader AUTOMAKE = ${SHELL} '/builddir/build/BUILD/hwloc-2.4.1/config/missing' automake-1.16 AWK = gawk BASH = /bin/sh BUNZIPP = bunzip2 CC = gcc CCDEPMODE = depmode=none CC_FOR_BUILD = gcc CFLAGS = -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection CONFIGURE_DEPENDENCIES = $(top_srcdir)/VERSION CPP = gcc -E CPPFLAGS = CXX = g++ CXXCPP = g++ -E CXXDEPMODE = depmode=none CXXFLAGS = -O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -fstack-protector-strong -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -march=x86-64-v2 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps DIFF = /usr/bin/diff DLLTOOL = false DOXYGEN = /usr/bin/doxygen DSYMUTIL = DUMPBIN = ECHO_C = ECHO_N = -n ECHO_T = EGREP = /usr/bin/grep -E EPSTOPDF = EXEEXT = FGREP = /usr/bin/grep -F FIG2DEV = /usr/bin/fig2dev GREP = /usr/bin/grep GS = /usr/bin/gs HWLOC_CAIRO_CFLAGS = -I/usr/include/cairo -I/usr/include/glib-2.0 -I/usr/lib64/glib-2.0/include -I/usr/include/sysprof-4 -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/harfbuzz -I/usr/include/libxml2 -pthread HWLOC_CAIRO_LIBS = -lcairo HWLOC_CFLAGS = -fvisibility=hidden HWLOC_CPPFLAGS = -I"$(HWLOC_top_builddir)"/include -I"$(HWLOC_top_srcdir)"/include HWLOC_CUDA_LIBS = HWLOC_DIFF_U = -u HWLOC_DIFF_W = -w HWLOC_DL_LIBS = HWLOC_EMBEDDED_CFLAGS = HWLOC_EMBEDDED_CPPFLAGS = HWLOC_EMBEDDED_LDADD = HWLOC_EMBEDDED_LDFLAGS = HWLOC_EMBEDDED_LIBS = HWLOC_GL_LIBS = HWLOC_HAVE_LIBXML2 = 1 HWLOC_HAVE_NVML = 0 HWLOC_HAVE_OPENCL = 0 HWLOC_HAVE_RSMI = 0 HWLOC_LDFLAGS = HWLOC_LIBS = -lm HWLOC_LIBS_PRIVATE = -lpthread HWLOC_LIBXML2_CFLAGS = -I/usr/include/libxml2 HWLOC_LIBXML2_LIBS = -lxml2 HWLOC_LTDL_LIBS = HWLOC_MS_LIB = HWLOC_MS_LIB_ARCH = X64 HWLOC_NUMA_CFLAGS = HWLOC_NUMA_LIBS = -lnuma HWLOC_NVML_LIBS = HWLOC_OPENCL_CFLAGS = HWLOC_OPENCL_LDFLAGS = HWLOC_OPENCL_LIBS = HWLOC_PCIACCESS_CFLAGS = HWLOC_PCIACCESS_LIBS = -lpciaccess HWLOC_PLUGINS_DIR = $(libdir)/hwloc HWLOC_PLUGINS_PATH = $(libdir)/hwloc HWLOC_PS_LIBS = HWLOC_RELEASE_DATE = Feb 11, 2021 HWLOC_REQUIRES = HWLOC_RSMI_LIBS = HWLOC_TERMCAP_LIBS = -ltermcap HWLOC_VERSION = 2.4.1 HWLOC_W3_GENERATOR = /usr/bin/lynx -dump -nolist HWLOC_X11_CPPFLAGS = HWLOC_X11_LIBS = -lX11 HWLOC_XML_LOCALIZED = 0 HWLOC_runstatedir = /run HWLOC_top_builddir = /builddir/build/BUILD/hwloc-2.4.1 HWLOC_top_srcdir = /builddir/build/BUILD/hwloc-2.4.1 INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LD = /usr/bin/ld -m elf_x86_64 LDFLAGS = -Wl,-z,relro -Wl,--as-needed -Wl,-z,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 LIBOBJS = LIBS = LIBTOOL = $(SHELL) $(top_builddir)/libtool LIPO = LN_S = ln -s LTLIBOBJS = LT_SYS_LIBRARY_PATH = /usr/lib64: LYNX = /usr/bin/lynx MAKEINDEX = /usr/bin/makeindex MAKEINFO = ${SHELL} '/builddir/build/BUILD/hwloc-2.4.1/config/missing' makeinfo MANIFEST_TOOL = : MKDIR_P = /usr/bin/mkdir -p MPI_CPPFLAGS = MPI_LDADD = NETLOC_CFLAGS = NETLOC_CPPFLAGS = NETLOC_EMBEDDED_CFLAGS = NETLOC_EMBEDDED_CPPFLAGS = NETLOC_EMBEDDED_LDADD = NETLOC_EMBEDDED_LIBS = NETLOC_LDFLAGS = NETLOC_LIBS = NETLOC_LIBS_PRIVATE = NM = /usr/bin/nm -B NMEDIT = OBJDUMP = objdump OBJEXT = o OTOOL = OTOOL64 = PACKAGE = hwloc PACKAGE_BUGREPORT = https://github.com/open-mpi/hwloc/issues PACKAGE_NAME = hwloc PACKAGE_STRING = hwloc 2.4.1 PACKAGE_TARNAME = hwloc PACKAGE_URL = PACKAGE_VERSION = 2.4.1 PATH_SEPARATOR = : PDFLATEX = /usr/bin/pdflatex PKG_CONFIG = /usr/bin/x86_64-redhat-linux-gnu-pkg-config RANLIB = ranlib SED = /usr/bin/sed SET_MAKE = SHELL = /bin/sh STRIP = strip VERSION = 2.4.1 W3M = XMKMF = XMLLINT = xmllint X_CFLAGS = X_EXTRA_LIBS = X_LIBS = X_PRE_LIBS = abs_builddir = /builddir/build/BUILD/hwloc-2.4.1/doc/examples abs_srcdir = /builddir/build/BUILD/hwloc-2.4.1/doc/examples abs_top_builddir = /builddir/build/BUILD/hwloc-2.4.1 abs_top_srcdir = /builddir/build/BUILD/hwloc-2.4.1 ac_ct_AR = ar ac_ct_CC = ac_ct_CXX = ac_ct_DUMPBIN = am__include = include am__leading_dot = . am__quote = am__tar = tar --format=ustar -chf - "$$tardir" am__untar = tar -xf - bindir = /usr/bin build = x86_64-redhat-linux-gnu build_alias = x86_64-redhat-linux-gnu build_cpu = x86_64 build_os = linux-gnu build_vendor = redhat builddir = . datadir = /usr/share datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = /usr host = x86_64-redhat-linux-gnu host_alias = x86_64-redhat-linux-gnu host_cpu = x86_64 host_os = linux-gnu host_vendor = redhat htmldir = ${docdir} includedir = /usr/include infodir = /usr/share/info install_sh = ${SHELL} /builddir/build/BUILD/hwloc-2.4.1/config/install-sh libdir = /usr/lib64 libexecdir = /usr/libexec libhwloc_so_version = 19:1:4 libnetloc_so_version = 0:0:0 localedir = ${datarootdir}/locale localstatedir = /var mandir = /usr/share/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr program_transform_name = s&^&& psdir = ${docdir} sbindir = /usr/sbin sharedstatedir = /var/lib srcdir = . sysconfdir = /etc target = x86_64-redhat-linux-gnu target_alias = target_cpu = x86_64 target_os = linux-gnu target_vendor = redhat top_build_prefix = ../../ top_builddir = ../.. top_srcdir = ../.. xz = AM_CFLAGS = $(HWLOC_CFLAGS) AM_CPPFLAGS = $(HWLOC_CPPFLAGS) AM_LDFLAGS = $(HWLOC_LDFLAGS) LDADD = $(HWLOC_top_builddir)/hwloc/libhwloc.la DEPENDENCIES = $(LDADD) hwloc_hello_cpp_SOURCES = hwloc-hello-cpp.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(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) --foreign doc/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/examples/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list cpuset+bitmap+cpubind$(EXEEXT): $(cpuset_bitmap_cpubind_OBJECTS) $(cpuset_bitmap_cpubind_DEPENDENCIES) $(EXTRA_cpuset_bitmap_cpubind_DEPENDENCIES) @rm -f cpuset+bitmap+cpubind$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cpuset_bitmap_cpubind_OBJECTS) $(cpuset_bitmap_cpubind_LDADD) $(LIBS) get-knl-modes$(EXEEXT): $(get_knl_modes_OBJECTS) $(get_knl_modes_DEPENDENCIES) $(EXTRA_get_knl_modes_DEPENDENCIES) @rm -f get-knl-modes$(EXEEXT) $(AM_V_CCLD)$(LINK) $(get_knl_modes_OBJECTS) $(get_knl_modes_LDADD) $(LIBS) gpu$(EXEEXT): $(gpu_OBJECTS) $(gpu_DEPENDENCIES) $(EXTRA_gpu_DEPENDENCIES) @rm -f gpu$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gpu_OBJECTS) $(gpu_LDADD) $(LIBS) hwloc-hello$(EXEEXT): $(hwloc_hello_OBJECTS) $(hwloc_hello_DEPENDENCIES) $(EXTRA_hwloc_hello_DEPENDENCIES) @rm -f hwloc-hello$(EXEEXT) $(AM_V_CCLD)$(LINK) $(hwloc_hello_OBJECTS) $(hwloc_hello_LDADD) $(LIBS) hwloc-hello-cpp$(EXEEXT): $(hwloc_hello_cpp_OBJECTS) $(hwloc_hello_cpp_DEPENDENCIES) $(EXTRA_hwloc_hello_cpp_DEPENDENCIES) @rm -f hwloc-hello-cpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(hwloc_hello_cpp_OBJECTS) $(hwloc_hello_cpp_LDADD) $(LIBS) nodeset+membind+policy$(EXEEXT): $(nodeset_membind_policy_OBJECTS) $(nodeset_membind_policy_DEPENDENCIES) $(EXTRA_nodeset_membind_policy_DEPENDENCIES) @rm -f nodeset+membind+policy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nodeset_membind_policy_OBJECTS) $(nodeset_membind_policy_LDADD) $(LIBS) sharedcaches$(EXEEXT): $(sharedcaches_OBJECTS) $(sharedcaches_DEPENDENCIES) $(EXTRA_sharedcaches_DEPENDENCIES) @rm -f sharedcaches$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sharedcaches_OBJECTS) $(sharedcaches_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c #include ./$(DEPDIR)/cpuset+bitmap+cpubind.Po # am--include-marker #include ./$(DEPDIR)/get-knl-modes.Po # am--include-marker #include ./$(DEPDIR)/gpu.Po # am--include-marker #include ./$(DEPDIR)/hwloc-hello-cpp.Po # am--include-marker #include ./$(DEPDIR)/hwloc-hello.Po # am--include-marker #include ./$(DEPDIR)/nodeset+membind+policy.Po # am--include-marker #include ./$(DEPDIR)/sharedcaches.Po # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: # $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ # $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ # $(am__mv) $$depbase.Tpo $$depbase.Po # $(AM_V_CC)source='$<' object='$@' libtool=no # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) $(AM_V_CC)$(COMPILE) -c -o $@ $< .c.obj: # $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ # $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ # $(am__mv) $$depbase.Tpo $$depbase.Po # $(AM_V_CC)source='$<' object='$@' libtool=no # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: # $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ # $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ # $(am__mv) $$depbase.Tpo $$depbase.Plo # $(AM_V_CC)source='$<' object='$@' libtool=yes # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< .cpp.o: # $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ # $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ # $(am__mv) $$depbase.Tpo $$depbase.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) $(AM_V_CXX)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: # $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ # $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ # $(am__mv) $$depbase.Tpo $$depbase.Po # $(AM_V_CXX)source='$<' object='$@' libtool=no # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) $(AM_V_CXX)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: # $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ # $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ # $(am__mv) $$depbase.Tpo $$depbase.Plo # $(AM_V_CXX)source='$<' object='$@' libtool=yes # DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) $(AM_V_CXX)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? hwloc-hello.log: hwloc-hello$(EXEEXT) @p='hwloc-hello$(EXEEXT)'; \ b='hwloc-hello'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) hwloc-hello-cpp.log: hwloc-hello-cpp$(EXEEXT) @p='hwloc-hello-cpp$(EXEEXT)'; \ b='hwloc-hello-cpp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) #.test$(EXEEXT).log: # @p='$<'; \ # $(am__set_b); \ # $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ # --log-file $$b.log --trs-file $$b.trs \ # $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ # "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) 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-checkPROGRAMS clean-generic clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/cpuset+bitmap+cpubind.Po -rm -f ./$(DEPDIR)/get-knl-modes.Po -rm -f ./$(DEPDIR)/gpu.Po -rm -f ./$(DEPDIR)/hwloc-hello-cpp.Po -rm -f ./$(DEPDIR)/hwloc-hello.Po -rm -f ./$(DEPDIR)/nodeset+membind+policy.Po -rm -f ./$(DEPDIR)/sharedcaches.Po -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-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 ./$(DEPDIR)/cpuset+bitmap+cpubind.Po -rm -f ./$(DEPDIR)/get-knl-modes.Po -rm -f ./$(DEPDIR)/gpu.Po -rm -f ./$(DEPDIR)/hwloc-hello-cpp.Po -rm -f ./$(DEPDIR)/hwloc-hello.Po -rm -f ./$(DEPDIR)/nodeset+membind+policy.Po -rm -f ./$(DEPDIR)/sharedcaches.Po -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: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ check-am clean clean-checkPROGRAMS clean-generic clean-libtool \ clean-local cscopelist-am ctags ctags-am 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-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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile hwloc-hello-cpp.cpp: $(srcdir)/hwloc-hello.c cp -f $(srcdir)/hwloc-hello.c $@ clean-local: rm -f hwloc-hello-cpp.cpp # 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: examples/nodeset+membind+policy.c 0000644 00000011635 15125521641 0013101 0 ustar 00 /* This example program plays with: * - finding and counting NUMA nodes * - manipulating nodesets * - memory binding and binding policies * * Copyright © 2014-2018 Inria. All rights reserved. * See COPYING in top-level directory. */ #include "hwloc.h" #include <errno.h> #include <stdio.h> #include <string.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif #include <assert.h> int main(void) { hwloc_topology_t topology; hwloc_bitmap_t set; hwloc_const_bitmap_t cset; hwloc_membind_policy_t policy; const struct hwloc_topology_support *support; int nbnodes; hwloc_obj_t obj; char *buffer, *s; unsigned i; int err; /* create a topology */ err = hwloc_topology_init(&topology); if (err < 0) { fprintf(stderr, "failed to initialize the topology\n"); return EXIT_FAILURE; } err = hwloc_topology_load(topology); if (err < 0) { fprintf(stderr, "failed to load the topology\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* retrieve the entire set of NUMA nodes and count them */ cset = hwloc_topology_get_topology_nodeset(topology); nbnodes = hwloc_bitmap_weight(cset); /* there's always at least one NUMA node */ assert(nbnodes > 0); printf("there are %d nodes in the machine\n", nbnodes); /* get the process memory binding as a nodeset */ set = hwloc_bitmap_alloc(); if (!set) { fprintf(stderr, "failed to allocate a bitmap\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } err = hwloc_get_membind(topology, set, &policy, HWLOC_MEMBIND_BYNODESET); if (err < 0) { fprintf(stderr, "failed to retrieve my memory binding and policy\n"); hwloc_topology_destroy(topology); hwloc_bitmap_free(set); return EXIT_FAILURE; } /* print the corresponding NUMA nodes */ hwloc_bitmap_asprintf(&s, set); printf("bound to nodeset %s with contains:\n", s); free(s); hwloc_bitmap_foreach_begin(i, set) { obj = hwloc_get_numanode_obj_by_os_index(topology, i); printf(" node #%u (OS index %u) with %llu bytes of memory\n", obj->logical_index, i, (unsigned long long) obj->attr->numanode.local_memory); } hwloc_bitmap_foreach_end(); hwloc_bitmap_free(set); /* check alloc+bind support */ support = hwloc_topology_get_support(topology); if (support->membind->bind_membind) { printf("BIND memory binding policy is supported\n"); } else { printf("BIND memory binding policy is NOT supported\n"); } if (support->membind->alloc_membind) { printf("Allocating bound memory is supported\n"); } else { printf("Allocating bound memory is NOT supported\n"); } /* allocate memory of each nodes */ printf("allocating memory on each node\n"); obj = NULL; buffer = NULL; while ((obj = hwloc_get_next_obj_by_type(topology, HWLOC_OBJ_NUMANODE, obj)) != NULL) { buffer = hwloc_alloc_membind(topology, 4096, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_STRICT|HWLOC_MEMBIND_BYNODESET); if (!buffer) { fprintf(stderr, "failed to allocate memory on node %u\n", obj->os_index); hwloc_topology_destroy(topology); return EXIT_SUCCESS; } /* now the application must manually manage these different buffers on different nodes */ } /* check where buffer is allocated */ set = hwloc_bitmap_alloc(); if (!set) { fprintf(stderr, "failed to allocate a bitmap\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } err = hwloc_get_area_membind(topology, buffer, 4096, set, &policy, HWLOC_MEMBIND_BYNODESET); if (err < 0) { fprintf(stderr, "failed to retrieve the buffer binding and policy\n"); hwloc_topology_destroy(topology); hwloc_bitmap_free(set); return EXIT_FAILURE; } /* check the binding policy, it should be what we requested above, * but may be different if the implementation of different policies * is identical for the current operating system (e.g. if BIND is the DEFAULT). */ printf("buffer membind policy is %d while we requested %d\n", policy, HWLOC_MEMBIND_BIND); /* print the corresponding NUMA nodes */ hwloc_bitmap_asprintf(&s, set); printf("buffer bound to nodeset %s with contains:\n", s); free(s); hwloc_bitmap_foreach_begin(i, set) { obj = hwloc_get_numanode_obj_by_os_index(topology, i); printf(" node #%u (OS index %u) with %llu bytes of memory\n", obj->logical_index, i, (unsigned long long) obj->attr->numanode.local_memory); } hwloc_bitmap_foreach_end(); hwloc_bitmap_free(set); /* try to migrate the buffer to the first node */ obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, 0); err = hwloc_set_area_membind(topology, buffer, 4096, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_MIGRATE|HWLOC_MEMBIND_BYNODESET); if (err < 0) { fprintf(stderr, "failed to migrate buffer\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } hwloc_topology_destroy(topology); return EXIT_SUCCESS; } examples/Makefile.in 0000644 00000124411 15125521641 0010434 0 ustar 00 # Makefile.in generated by automake 1.16.3 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2020 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-2018 Inria. All rights reserved. # Copyright © 2009-2013, 2017 Université Bordeaux # Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. # See COPYING in top-level directory. # # Make sure that the documentation examples work # VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) 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@ TESTS = hwloc-hello$(EXEEXT) $(am__EXEEXT_1) @HWLOC_HAVE_CXX_TRUE@am__append_1 = hwloc-hello-cpp check_PROGRAMS = $(am__EXEEXT_2) cpuset+bitmap+cpubind$(EXEEXT) \ nodeset+membind+policy$(EXEEXT) get-knl-modes$(EXEEXT) \ gpu$(EXEEXT) $(am__EXEEXT_3) @HWLOC_HAVE_WINDOWS_FALSE@am__append_2 = sharedcaches subdir = doc/examples ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/config/hwloc.m4 \ $(top_srcdir)/config/hwloc_check_attributes.m4 \ $(top_srcdir)/config/hwloc_check_vendor.m4 \ $(top_srcdir)/config/hwloc_check_visibility.m4 \ $(top_srcdir)/config/hwloc_components.m4 \ $(top_srcdir)/config/hwloc_internal.m4 \ $(top_srcdir)/config/hwloc_pkg.m4 \ $(top_srcdir)/config/libtool.m4 \ $(top_srcdir)/config/ltoptions.m4 \ $(top_srcdir)/config/ltsugar.m4 \ $(top_srcdir)/config/ltversion.m4 \ $(top_srcdir)/config/lt~obsolete.m4 \ $(top_srcdir)/config/netloc.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/include/private/autogen/config.h \ $(top_builddir)/include/hwloc/autogen/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = @HWLOC_HAVE_CXX_TRUE@am__EXEEXT_1 = hwloc-hello-cpp$(EXEEXT) am__EXEEXT_2 = hwloc-hello$(EXEEXT) $(am__EXEEXT_1) @HWLOC_HAVE_WINDOWS_FALSE@am__EXEEXT_3 = sharedcaches$(EXEEXT) cpuset_bitmap_cpubind_SOURCES = cpuset+bitmap+cpubind.c cpuset_bitmap_cpubind_OBJECTS = cpuset+bitmap+cpubind.$(OBJEXT) cpuset_bitmap_cpubind_LDADD = $(LDADD) cpuset_bitmap_cpubind_DEPENDENCIES = \ $(HWLOC_top_builddir)/hwloc/libhwloc.la AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = get_knl_modes_SOURCES = get-knl-modes.c get_knl_modes_OBJECTS = get-knl-modes.$(OBJEXT) get_knl_modes_LDADD = $(LDADD) get_knl_modes_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la gpu_SOURCES = gpu.c gpu_OBJECTS = gpu.$(OBJEXT) gpu_LDADD = $(LDADD) gpu_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la hwloc_hello_SOURCES = hwloc-hello.c hwloc_hello_OBJECTS = hwloc-hello.$(OBJEXT) hwloc_hello_LDADD = $(LDADD) hwloc_hello_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la am_hwloc_hello_cpp_OBJECTS = hwloc-hello-cpp.$(OBJEXT) hwloc_hello_cpp_OBJECTS = $(am_hwloc_hello_cpp_OBJECTS) hwloc_hello_cpp_LDADD = $(LDADD) hwloc_hello_cpp_DEPENDENCIES = \ $(HWLOC_top_builddir)/hwloc/libhwloc.la nodeset_membind_policy_SOURCES = nodeset+membind+policy.c nodeset_membind_policy_OBJECTS = nodeset+membind+policy.$(OBJEXT) nodeset_membind_policy_LDADD = $(LDADD) nodeset_membind_policy_DEPENDENCIES = \ $(HWLOC_top_builddir)/hwloc/libhwloc.la sharedcaches_SOURCES = sharedcaches.c sharedcaches_OBJECTS = sharedcaches.$(OBJEXT) sharedcaches_LDADD = $(LDADD) sharedcaches_DEPENDENCIES = $(HWLOC_top_builddir)/hwloc/libhwloc.la AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/include/private/autogen -I$(top_builddir)/include/hwloc/autogen depcomp = $(SHELL) $(top_srcdir)/./config/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/cpuset+bitmap+cpubind.Po \ ./$(DEPDIR)/get-knl-modes.Po ./$(DEPDIR)/gpu.Po \ ./$(DEPDIR)/hwloc-hello-cpp.Po ./$(DEPDIR)/hwloc-hello.Po \ ./$(DEPDIR)/nodeset+membind+policy.Po \ ./$(DEPDIR)/sharedcaches.Po am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CXXFLAGS) $(CXXFLAGS) AM_V_CXX = $(am__v_CXX_@AM_V@) am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) am__v_CXX_0 = @echo " CXX " $@; am__v_CXX_1 = CXXLD = $(CXX) CXXLINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) am__v_CXXLD_0 = @echo " CXXLD " $@; am__v_CXXLD_1 = SOURCES = cpuset+bitmap+cpubind.c get-knl-modes.c gpu.c hwloc-hello.c \ $(hwloc_hello_cpp_SOURCES) nodeset+membind+policy.c \ sharedcaches.c DIST_SOURCES = cpuset+bitmap+cpubind.c get-knl-modes.c gpu.c \ hwloc-hello.c $(hwloc_hello_cpp_SOURCES) \ nodeset+membind+policy.c sharedcaches.c am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__tty_colors_dummy = \ mgn= red= grn= lgn= blu= brg= std=; \ am__color_tests=no am__tty_colors = { \ $(am__tty_colors_dummy); \ if test "X$(AM_COLOR_TESTS)" = Xno; then \ am__color_tests=no; \ elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ am__color_tests=yes; \ elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ am__color_tests=yes; \ fi; \ if test $$am__color_tests = yes; then \ red='[0;31m'; \ grn='[0;32m'; \ lgn='[1;32m'; \ blu='[1;34m'; \ mgn='[0;35m'; \ brg='[1m'; \ std='[m'; \ fi; \ } 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__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__recheck_rx = ^[ ]*:recheck:[ ]* am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* # A command that, given a newline-separated list of test names on the # standard input, print the name of the tests that are to be re-run # upon "make recheck". am__list_recheck_tests = $(AWK) '{ \ recheck = 1; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ { \ if ((getline line2 < ($$0 ".log")) < 0) \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ { \ recheck = 0; \ break; \ } \ else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ { \ break; \ } \ }; \ if (recheck) \ print $$0; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # A command that, given a newline-separated list of test names on the # standard input, create the global log from their .trs and .log files. am__create_global_log = $(AWK) ' \ function fatal(msg) \ { \ print "fatal: making $@: " msg | "cat >&2"; \ exit 1; \ } \ function rst_section(header) \ { \ print header; \ len = length(header); \ for (i = 1; i <= len; i = i + 1) \ printf "="; \ printf "\n\n"; \ } \ { \ copy_in_global_log = 1; \ global_test_result = "RUN"; \ while ((rc = (getline line < ($$0 ".trs"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".trs"); \ if (line ~ /$(am__global_test_result_rx)/) \ { \ sub("$(am__global_test_result_rx)", "", line); \ sub("[ ]*$$", "", line); \ global_test_result = line; \ } \ else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ copy_in_global_log = 0; \ }; \ if (copy_in_global_log) \ { \ rst_section(global_test_result ": " $$0); \ while ((rc = (getline line < ($$0 ".log"))) != 0) \ { \ if (rc < 0) \ fatal("failed to read from " $$0 ".log"); \ print line; \ }; \ printf "\n"; \ }; \ close ($$0 ".trs"); \ close ($$0 ".log"); \ }' # Restructured Text title. am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } # Solaris 10 'make', and several other traditional 'make' implementations, # pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it # by disabling -e (using the XSI extension "set +e") if it's set. am__sh_e_setup = case $$- in *e*) set +e;; esac # Default flags passed to test drivers. am__common_driver_flags = \ --color-tests "$$am__color_tests" \ --enable-hard-errors "$$am__enable_hard_errors" \ --expect-failure "$$am__expect_failure" # To be inserted before the command running the test. Creates the # directory for the log if needed. Stores in $dir the directory # containing $f, in $tst the test, in $log the log. Executes the # developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and # passes TESTS_ENVIRONMENT. Set up options for the wrapper that # will run the test scripts (or their associated LOG_COMPILER, if # thy have one). am__check_pre = \ $(am__sh_e_setup); \ $(am__vpath_adj_setup) $(am__vpath_adj) \ $(am__tty_colors); \ srcdir=$(srcdir); export srcdir; \ case "$@" in \ */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ *) am__odir=.;; \ esac; \ test "x$$am__odir" = x"." || test -d "$$am__odir" \ || $(MKDIR_P) "$$am__odir" || exit $$?; \ if test -f "./$$f"; then dir=./; \ elif test -f "$$f"; then dir=; \ else dir="$(srcdir)/"; fi; \ tst=$$dir$$f; log='$@'; \ if test -n '$(DISABLE_HARD_ERRORS)'; then \ am__enable_hard_errors=no; \ else \ am__enable_hard_errors=yes; \ fi; \ case " $(XFAIL_TESTS) " in \ *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ am__expect_failure=yes;; \ *) \ am__expect_failure=no;; \ esac; \ $(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) # A shell command to get the names of the tests scripts with any registered # extension removed (i.e., equivalently, the names of the test logs, with # the '.log' extension removed). The result is saved in the shell variable # '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, # we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", # since that might cause problem with VPATH rewrites for suffix-less tests. # See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. am__set_TESTS_bases = \ bases='$(TEST_LOGS)'; \ bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ bases=`echo $$bases` AM_TESTSUITE_SUMMARY_HEADER = ' for $(PACKAGE_STRING)' RECHECK_LOGS = $(TEST_LOGS) AM_RECURSIVE_TARGETS = check recheck TEST_SUITE_LOG = test-suite.log TEST_EXTENSIONS = @EXEEXT@ .test LOG_DRIVER = $(SHELL) $(top_srcdir)/./config/test-driver LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) am__set_b = \ case '$@' in \ */*) \ case '$*' in \ */*) b='$*';; \ *) b=`echo '$@' | sed 's/\.log$$//'`; \ esac;; \ *) \ b='$*';; \ esac am__test_logs1 = $(TESTS:=.log) am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) TEST_LOGS = $(am__test_logs2:.test.log=.log) TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/./config/test-driver TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ $(TEST_LOG_FLAGS) am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/./config/depcomp \ $(top_srcdir)/./config/test-driver DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AS = @AS@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BASH = @BASH@ BUNZIPP = @BUNZIPP@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CC_FOR_BUILD = @CC_FOR_BUILD@ CFLAGS = @CFLAGS@ CONFIGURE_DEPENDENCIES = @CONFIGURE_DEPENDENCIES@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CXX = @CXX@ CXXCPP = @CXXCPP@ CXXDEPMODE = @CXXDEPMODE@ CXXFLAGS = @CXXFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIFF = @DIFF@ DLLTOOL = @DLLTOOL@ DOXYGEN = @DOXYGEN@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EPSTOPDF = @EPSTOPDF@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ FIG2DEV = @FIG2DEV@ GREP = @GREP@ GS = @GS@ HWLOC_CAIRO_CFLAGS = @HWLOC_CAIRO_CFLAGS@ HWLOC_CAIRO_LIBS = @HWLOC_CAIRO_LIBS@ HWLOC_CFLAGS = @HWLOC_CFLAGS@ HWLOC_CPPFLAGS = @HWLOC_CPPFLAGS@ HWLOC_CUDA_LIBS = @HWLOC_CUDA_LIBS@ HWLOC_DIFF_U = @HWLOC_DIFF_U@ HWLOC_DIFF_W = @HWLOC_DIFF_W@ HWLOC_DL_LIBS = @HWLOC_DL_LIBS@ HWLOC_EMBEDDED_CFLAGS = @HWLOC_EMBEDDED_CFLAGS@ HWLOC_EMBEDDED_CPPFLAGS = @HWLOC_EMBEDDED_CPPFLAGS@ HWLOC_EMBEDDED_LDADD = @HWLOC_EMBEDDED_LDADD@ HWLOC_EMBEDDED_LDFLAGS = @HWLOC_EMBEDDED_LDFLAGS@ HWLOC_EMBEDDED_LIBS = @HWLOC_EMBEDDED_LIBS@ HWLOC_GL_LIBS = @HWLOC_GL_LIBS@ HWLOC_HAVE_LIBXML2 = @HWLOC_HAVE_LIBXML2@ HWLOC_HAVE_NVML = @HWLOC_HAVE_NVML@ HWLOC_HAVE_OPENCL = @HWLOC_HAVE_OPENCL@ HWLOC_HAVE_RSMI = @HWLOC_HAVE_RSMI@ HWLOC_LDFLAGS = @HWLOC_LDFLAGS@ HWLOC_LIBS = @HWLOC_LIBS@ HWLOC_LIBS_PRIVATE = @HWLOC_LIBS_PRIVATE@ HWLOC_LIBXML2_CFLAGS = @HWLOC_LIBXML2_CFLAGS@ HWLOC_LIBXML2_LIBS = @HWLOC_LIBXML2_LIBS@ HWLOC_LTDL_LIBS = @HWLOC_LTDL_LIBS@ HWLOC_MS_LIB = @HWLOC_MS_LIB@ HWLOC_MS_LIB_ARCH = @HWLOC_MS_LIB_ARCH@ HWLOC_NUMA_CFLAGS = @HWLOC_NUMA_CFLAGS@ HWLOC_NUMA_LIBS = @HWLOC_NUMA_LIBS@ HWLOC_NVML_LIBS = @HWLOC_NVML_LIBS@ HWLOC_OPENCL_CFLAGS = @HWLOC_OPENCL_CFLAGS@ HWLOC_OPENCL_LDFLAGS = @HWLOC_OPENCL_LDFLAGS@ HWLOC_OPENCL_LIBS = @HWLOC_OPENCL_LIBS@ HWLOC_PCIACCESS_CFLAGS = @HWLOC_PCIACCESS_CFLAGS@ HWLOC_PCIACCESS_LIBS = @HWLOC_PCIACCESS_LIBS@ HWLOC_PLUGINS_DIR = @HWLOC_PLUGINS_DIR@ HWLOC_PLUGINS_PATH = @HWLOC_PLUGINS_PATH@ HWLOC_PS_LIBS = @HWLOC_PS_LIBS@ HWLOC_RELEASE_DATE = @HWLOC_RELEASE_DATE@ HWLOC_REQUIRES = @HWLOC_REQUIRES@ HWLOC_RSMI_LIBS = @HWLOC_RSMI_LIBS@ HWLOC_TERMCAP_LIBS = @HWLOC_TERMCAP_LIBS@ HWLOC_VERSION = @HWLOC_VERSION@ HWLOC_W3_GENERATOR = @HWLOC_W3_GENERATOR@ HWLOC_X11_CPPFLAGS = @HWLOC_X11_CPPFLAGS@ HWLOC_X11_LIBS = @HWLOC_X11_LIBS@ HWLOC_XML_LOCALIZED = @HWLOC_XML_LOCALIZED@ HWLOC_runstatedir = @HWLOC_runstatedir@ 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@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ LYNX = @LYNX@ MAKEINDEX = @MAKEINDEX@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MKDIR_P = @MKDIR_P@ MPI_CPPFLAGS = @MPI_CPPFLAGS@ MPI_LDADD = @MPI_LDADD@ NETLOC_CFLAGS = @NETLOC_CFLAGS@ NETLOC_CPPFLAGS = @NETLOC_CPPFLAGS@ NETLOC_EMBEDDED_CFLAGS = @NETLOC_EMBEDDED_CFLAGS@ NETLOC_EMBEDDED_CPPFLAGS = @NETLOC_EMBEDDED_CPPFLAGS@ NETLOC_EMBEDDED_LDADD = @NETLOC_EMBEDDED_LDADD@ NETLOC_EMBEDDED_LIBS = @NETLOC_EMBEDDED_LIBS@ NETLOC_LDFLAGS = @NETLOC_LDFLAGS@ NETLOC_LIBS = @NETLOC_LIBS@ NETLOC_LIBS_PRIVATE = @NETLOC_LIBS_PRIVATE@ 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@ PDFLATEX = @PDFLATEX@ PKG_CONFIG = @PKG_CONFIG@ RANLIB = @RANLIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ W3M = @W3M@ XMKMF = @XMKMF@ XMLLINT = @XMLLINT@ X_CFLAGS = @X_CFLAGS@ X_EXTRA_LIBS = @X_EXTRA_LIBS@ X_LIBS = @X_LIBS@ X_PRE_LIBS = @X_PRE_LIBS@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_CXX = @ac_ct_CXX@ 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@ libhwloc_so_version = @libhwloc_so_version@ libnetloc_so_version = @libnetloc_so_version@ 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@ xz = @xz@ AM_CFLAGS = $(HWLOC_CFLAGS) AM_CPPFLAGS = $(HWLOC_CPPFLAGS) AM_LDFLAGS = $(HWLOC_LDFLAGS) LDADD = $(HWLOC_top_builddir)/hwloc/libhwloc.la DEPENDENCIES = $(LDADD) hwloc_hello_cpp_SOURCES = hwloc-hello-cpp.cpp all: all-am .SUFFIXES: .SUFFIXES: .c .cpp .lo .log .o .obj .test .test$(EXEEXT) .trs $(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) --foreign doc/examples/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --foreign doc/examples/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__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ 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): clean-checkPROGRAMS: @list='$(check_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list cpuset+bitmap+cpubind$(EXEEXT): $(cpuset_bitmap_cpubind_OBJECTS) $(cpuset_bitmap_cpubind_DEPENDENCIES) $(EXTRA_cpuset_bitmap_cpubind_DEPENDENCIES) @rm -f cpuset+bitmap+cpubind$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cpuset_bitmap_cpubind_OBJECTS) $(cpuset_bitmap_cpubind_LDADD) $(LIBS) get-knl-modes$(EXEEXT): $(get_knl_modes_OBJECTS) $(get_knl_modes_DEPENDENCIES) $(EXTRA_get_knl_modes_DEPENDENCIES) @rm -f get-knl-modes$(EXEEXT) $(AM_V_CCLD)$(LINK) $(get_knl_modes_OBJECTS) $(get_knl_modes_LDADD) $(LIBS) gpu$(EXEEXT): $(gpu_OBJECTS) $(gpu_DEPENDENCIES) $(EXTRA_gpu_DEPENDENCIES) @rm -f gpu$(EXEEXT) $(AM_V_CCLD)$(LINK) $(gpu_OBJECTS) $(gpu_LDADD) $(LIBS) hwloc-hello$(EXEEXT): $(hwloc_hello_OBJECTS) $(hwloc_hello_DEPENDENCIES) $(EXTRA_hwloc_hello_DEPENDENCIES) @rm -f hwloc-hello$(EXEEXT) $(AM_V_CCLD)$(LINK) $(hwloc_hello_OBJECTS) $(hwloc_hello_LDADD) $(LIBS) hwloc-hello-cpp$(EXEEXT): $(hwloc_hello_cpp_OBJECTS) $(hwloc_hello_cpp_DEPENDENCIES) $(EXTRA_hwloc_hello_cpp_DEPENDENCIES) @rm -f hwloc-hello-cpp$(EXEEXT) $(AM_V_CXXLD)$(CXXLINK) $(hwloc_hello_cpp_OBJECTS) $(hwloc_hello_cpp_LDADD) $(LIBS) nodeset+membind+policy$(EXEEXT): $(nodeset_membind_policy_OBJECTS) $(nodeset_membind_policy_DEPENDENCIES) $(EXTRA_nodeset_membind_policy_DEPENDENCIES) @rm -f nodeset+membind+policy$(EXEEXT) $(AM_V_CCLD)$(LINK) $(nodeset_membind_policy_OBJECTS) $(nodeset_membind_policy_LDADD) $(LIBS) sharedcaches$(EXEEXT): $(sharedcaches_OBJECTS) $(sharedcaches_DEPENDENCIES) $(EXTRA_sharedcaches_DEPENDENCIES) @rm -f sharedcaches$(EXEEXT) $(AM_V_CCLD)$(LINK) $(sharedcaches_OBJECTS) $(sharedcaches_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpuset+bitmap+cpubind.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-knl-modes.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gpu.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hwloc-hello-cpp.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hwloc-hello.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nodeset+membind+policy.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sharedcaches.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< .cpp.o: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< .cpp.obj: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .cpp.lo: @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ @am__fastdepCXX_TRUE@ $(LTCXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Plo @AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ 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-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ 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" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags # Recover from deleted '.trs' file; this should ensure that # "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create # both 'foo.log' and 'foo.trs'. Break the recipe in two subshells # to avoid problems with "make -n". .log.trs: rm -f $< $@ $(MAKE) $(AM_MAKEFLAGS) $< # Leading 'am--fnord' is there to ensure the list of targets does not # expand to empty, as could happen e.g. with make check TESTS=''. am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) am--force-recheck: @: $(TEST_SUITE_LOG): $(TEST_LOGS) @$(am__set_TESTS_bases); \ am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ redo_bases=`for i in $$bases; do \ am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ done`; \ if test -n "$$redo_bases"; then \ redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ if $(am__make_dryrun); then :; else \ rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ fi; \ fi; \ if test -n "$$am__remaking_logs"; then \ echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ "recursion detected" >&2; \ elif test -n "$$redo_logs"; then \ am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ fi; \ if $(am__make_dryrun); then :; else \ st=0; \ errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ for i in $$redo_bases; do \ test -f $$i.trs && test -r $$i.trs \ || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ test -f $$i.log && test -r $$i.log \ || { echo "$$errmsg $$i.log" >&2; st=1; }; \ done; \ test $$st -eq 0 || exit 1; \ fi @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ ws='[ ]'; \ results=`for b in $$bases; do echo $$b.trs; done`; \ test -n "$$results" || results=/dev/null; \ all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ if test `expr $$fail + $$xpass + $$error` -eq 0; then \ success=true; \ else \ success=false; \ fi; \ br='==================='; br=$$br$$br$$br$$br; \ result_count () \ { \ if test x"$$1" = x"--maybe-color"; then \ maybe_colorize=yes; \ elif test x"$$1" = x"--no-color"; then \ maybe_colorize=no; \ else \ echo "$@: invalid 'result_count' usage" >&2; exit 4; \ fi; \ shift; \ desc=$$1 count=$$2; \ if test $$maybe_colorize = yes && test $$count -gt 0; then \ color_start=$$3 color_end=$$std; \ else \ color_start= color_end=; \ fi; \ echo "$${color_start}# $$desc $$count$${color_end}"; \ }; \ create_testsuite_report () \ { \ result_count $$1 "TOTAL:" $$all "$$brg"; \ result_count $$1 "PASS: " $$pass "$$grn"; \ result_count $$1 "SKIP: " $$skip "$$blu"; \ result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ result_count $$1 "FAIL: " $$fail "$$red"; \ result_count $$1 "XPASS:" $$xpass "$$red"; \ result_count $$1 "ERROR:" $$error "$$mgn"; \ }; \ { \ echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ $(am__rst_title); \ create_testsuite_report --no-color; \ echo; \ echo ".. contents:: :depth: 2"; \ echo; \ for b in $$bases; do echo $$b; done \ | $(am__create_global_log); \ } >$(TEST_SUITE_LOG).tmp || exit 1; \ mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ if $$success; then \ col="$$grn"; \ else \ col="$$red"; \ test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ fi; \ echo "$${col}$$br$${std}"; \ echo "$${col}Testsuite summary"$(AM_TESTSUITE_SUMMARY_HEADER)"$${std}"; \ echo "$${col}$$br$${std}"; \ create_testsuite_report --maybe-color; \ echo "$$col$$br$$std"; \ if $$success; then :; else \ echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ if test -n "$(PACKAGE_BUGREPORT)"; then \ echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ fi; \ echo "$$col$$br$$std"; \ fi; \ $$success || exit 1 check-TESTS: $(check_PROGRAMS) @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ log_list=`for i in $$bases; do echo $$i.log; done`; \ trs_list=`for i in $$bases; do echo $$i.trs; done`; \ log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ exit $$?; recheck: all $(check_PROGRAMS) @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) @set +e; $(am__set_TESTS_bases); \ bases=`for i in $$bases; do echo $$i; done \ | $(am__list_recheck_tests)` || exit 1; \ log_list=`for i in $$bases; do echo $$i.log; done`; \ log_list=`echo $$log_list`; \ $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ am__force_recheck=am--force-recheck \ TEST_LOGS="$$log_list"; \ exit $$? hwloc-hello.log: hwloc-hello$(EXEEXT) @p='hwloc-hello$(EXEEXT)'; \ b='hwloc-hello'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) hwloc-hello-cpp.log: hwloc-hello-cpp$(EXEEXT) @p='hwloc-hello-cpp$(EXEEXT)'; \ b='hwloc-hello-cpp'; \ $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) .test.log: @p='$<'; \ $(am__set_b); \ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ --log-file $$b.log --trs-file $$b.trs \ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ "$$tst" $(AM_TESTS_FD_REDIRECT) @am__EXEEXT_TRUE@.test$(EXEEXT).log: @am__EXEEXT_TRUE@ @p='$<'; \ @am__EXEEXT_TRUE@ $(am__set_b); \ @am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ @am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ @am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ @am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(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 $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) $(MAKE) $(AM_MAKEFLAGS) check-TESTS check: check-am all-am: Makefile installdirs: 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) 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-checkPROGRAMS clean-generic clean-libtool clean-local \ mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/cpuset+bitmap+cpubind.Po -rm -f ./$(DEPDIR)/get-knl-modes.Po -rm -f ./$(DEPDIR)/gpu.Po -rm -f ./$(DEPDIR)/hwloc-hello-cpp.Po -rm -f ./$(DEPDIR)/hwloc-hello.Po -rm -f ./$(DEPDIR)/nodeset+membind+policy.Po -rm -f ./$(DEPDIR)/sharedcaches.Po -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-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 ./$(DEPDIR)/cpuset+bitmap+cpubind.Po -rm -f ./$(DEPDIR)/get-knl-modes.Po -rm -f ./$(DEPDIR)/gpu.Po -rm -f ./$(DEPDIR)/hwloc-hello-cpp.Po -rm -f ./$(DEPDIR)/hwloc-hello.Po -rm -f ./$(DEPDIR)/nodeset+membind+policy.Po -rm -f ./$(DEPDIR)/sharedcaches.Po -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: .MAKE: check-am install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-TESTS \ check-am clean clean-checkPROGRAMS clean-generic clean-libtool \ clean-local cscopelist-am ctags ctags-am 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-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 \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ pdf pdf-am ps ps-am recheck tags tags-am uninstall \ uninstall-am .PRECIOUS: Makefile hwloc-hello-cpp.cpp: $(srcdir)/hwloc-hello.c cp -f $(srcdir)/hwloc-hello.c $@ clean-local: rm -f hwloc-hello-cpp.cpp # 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: examples/hwloc-hello-cpp.cpp 0000644 00000013656 15125521641 0012100 0 ustar 00 /* Example hwloc API program. * * See other examples under doc/examples/ in the source tree * for more details. * * Copyright © 2009-2016 Inria. All rights reserved. * Copyright © 2009-2011 Université Bordeaux * 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 type[32], attr[1024]; unsigned i; hwloc_obj_type_snprintf(type, sizeof(type), obj, 0); printf("%*s%s", 2*depth, "", type); if (obj->os_index != (unsigned) -1) printf("#%u", obj->os_index); hwloc_obj_attr_snprintf(attr, sizeof(attr), obj, " ", 0); if (*attr) printf("(%s)", attr); printf("\n"); 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; void *m; 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_type_snprintf(string, sizeof(string), 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 packages. *****************************************************************/ depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PACKAGE); if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) { printf("*** The number of packages is unknown\n"); } else { printf("*** %u package(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 (hwloc_obj_type_is_cache(obj->type)) { 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/hyper-threaded). */ 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. There's always at least one. */ n = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NUMANODE); obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, n - 1); size = 1024*1024; m = hwloc_alloc_membind(topology, size, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); hwloc_free(topology, m, size); m = malloc(size); hwloc_set_area_membind(topology, m, size, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); free(m); /* Destroy topology object. */ hwloc_topology_destroy(topology); return 0; } examples/gpu.c 0000644 00000006305 15125521641 0007327 0 ustar 00 /* This example program plays with: * - finding GPU OS devices * - getting CUDA and OpenCL attributes * - displaying the locality of the GPU * * Copyright © 2009-2019 Inria. All rights reserved. * Copyright © 2009-2011,2017 Université Bordeaux * Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. * See COPYING in top-level directory. */ #include "hwloc.h" #include <errno.h> #include <stdio.h> #include <string.h> int main(void) { hwloc_topology_t topology; hwloc_obj_t obj; unsigned n, i; int devid, platformid; const char *dev; /* Allocate, initialize and load topology object. */ hwloc_topology_init(&topology); hwloc_topology_set_io_types_filter(topology, HWLOC_TYPE_FILTER_KEEP_IMPORTANT); hwloc_topology_load(topology); /* Find CUDA devices through the corresponding OS devices */ n = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_OS_DEVICE); for (i = 0; i < n ; i++) { const char *s; obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_OS_DEVICE, i); printf("%s:\n", obj->name); /* obj->attr->osdev.type is HWLOC_OBJ_OSDEV_COPROC */ s = hwloc_obj_get_info_by_name(obj, "Backend"); /* obj->subtype also contains CUDA or OpenCL since v2.0 */ if (s && !strcmp(s, "CUDA")) { /* This is a CUDA device */ assert(!strncmp(obj->name, "cuda", 4)); devid = atoi(obj->name + 4); printf("CUDA device %d\n", devid); s = hwloc_obj_get_info_by_name(obj, "GPUModel"); if (s) printf("Model: %s\n", s); s = hwloc_obj_get_info_by_name(obj, "CUDAGlobalMemorySize"); if (s) printf("Memory: %s\n", s); s = hwloc_obj_get_info_by_name(obj, "CUDAMultiProcessors"); if (s) { int mp = atoi(s); s = hwloc_obj_get_info_by_name(obj, "CUDACoresPerMP"); if (s) { int mp_cores = atoi(s); printf("Cores: %d\n", mp * mp_cores); } } } if (s && !strcmp(s, "OpenCL")) { /* This is an OpenCL device */ assert(!strncmp(obj->name, "opencl", 6)); platformid = atoi(obj->name + 6); printf("OpenCL platform %d\n", platformid); dev = strchr(obj->name + 6, 'd'); devid = atoi(dev + 1); printf("OpenCL device %d\n", devid); s = hwloc_obj_get_info_by_name(obj, "GPUModel"); if (s) printf("Model: %s\n", s); s = hwloc_obj_get_info_by_name(obj, "OpenCLGlobalMemorySize"); if (s) printf("Memory: %s\n", s); } /* One can also use helpers from hwloc/cuda.h, hwloc/cudart.h, * hwloc/opencl.h */ /* Find out cpuset this is connected to */ while (obj && (!obj->cpuset || hwloc_bitmap_iszero(obj->cpuset))) obj = obj->parent; if (obj) { char *cpuset_string; char name[16]; hwloc_obj_type_snprintf(name, sizeof(name), obj, 0); hwloc_bitmap_asprintf(&cpuset_string, obj->cpuset); printf("Location: %s P#%u\n", name, obj->os_index); printf("Cpuset: %s\n", cpuset_string); } printf("\n"); } /* Destroy topology object. */ hwloc_topology_destroy(topology); return 0; } examples/cpuset+bitmap+cpubind.c 0000644 00000012210 15125521641 0012717 0 ustar 00 /* This example program plays with: * - retrieving and changing CPU binding of current process and thread * - retrieving the location where the current thread executes * - combining/modifying cpusets using the bitmap API * * Copyright © 2014-2018 Inria. All rights reserved. * See COPYING in top-level directory. */ #include "hwloc.h" #include <errno.h> #include <stdio.h> #include <string.h> #ifdef HAVE_UNISTD_H #include <unistd.h> #endif int main(void) { hwloc_topology_t topology; hwloc_bitmap_t set, set2; hwloc_const_bitmap_t cset_available, cset_all; hwloc_obj_t obj; char *buffer; char type[64]; unsigned i; int err; /* create a topology */ err = hwloc_topology_init(&topology); if (err < 0) { fprintf(stderr, "failed to initialize the topology\n"); return EXIT_FAILURE; } err = hwloc_topology_load(topology); if (err < 0) { fprintf(stderr, "failed to load the topology\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* retrieve the entire set of available PUs */ cset_available = hwloc_topology_get_topology_cpuset(topology); /* retrieve the CPU binding of the current entire process */ set = hwloc_bitmap_alloc(); if (!set) { fprintf(stderr, "failed to allocate a bitmap\n"); hwloc_topology_destroy(topology); return EXIT_FAILURE; } err = hwloc_get_cpubind(topology, set, HWLOC_CPUBIND_PROCESS); if (err < 0) { fprintf(stderr, "failed to get cpu binding\n"); hwloc_bitmap_free(set); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* display the processing units that cannot be used by this process */ if (hwloc_bitmap_isequal(set, cset_available)) { printf("this process can use all available processing units in the system\n"); } else { /* compute the set where we currently cannot run. * we can't modify cset_available because it's a system read-only one, * so we do set = available &~ set */ hwloc_bitmap_andnot(set, cset_available, set); hwloc_bitmap_asprintf(&buffer, set); printf("process cannot use %d process units (%s) among %d in the system\n", hwloc_bitmap_weight(set), buffer, hwloc_bitmap_weight(cset_available)); free(buffer); /* restore set where it was before the &~ operation above */ hwloc_bitmap_andnot(set, cset_available, set); } /* print the smallest object covering the current process binding */ obj = hwloc_get_obj_covering_cpuset(topology, set); hwloc_obj_type_snprintf(type, sizeof(type), obj, 0); printf("process is bound within object %s logical index %u\n", type, obj->logical_index); /* retrieve the single PU where the current thread actually runs within this process binding */ set2 = hwloc_bitmap_alloc(); if (!set2) { fprintf(stderr, "failed to allocate a bitmap\n"); hwloc_bitmap_free(set); hwloc_topology_destroy(topology); return EXIT_FAILURE; } err = hwloc_get_last_cpu_location(topology, set2, HWLOC_CPUBIND_THREAD); if (err < 0) { fprintf(stderr, "failed to get last cpu location\n"); hwloc_bitmap_free(set); hwloc_bitmap_free(set2); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* sanity checks that are not actually needed but help the reader */ /* this thread runs within the process binding */ assert(hwloc_bitmap_isincluded(set2, set)); /* this thread runs on a single PU at a time */ assert(hwloc_bitmap_weight(set2) == 1); /* print the logical number of the PU where that thread runs */ /* extract the PU OS index from the bitmap */ i = hwloc_bitmap_first(set2); obj = hwloc_get_pu_obj_by_os_index(topology, i); printf("thread is now running on PU logical index %u (OS/physical index %u)\n", obj->logical_index, i); /* migrate this single thread to where other PUs within the current binding */ hwloc_bitmap_andnot(set2, set, set2); err = hwloc_set_cpubind(topology, set2, HWLOC_CPUBIND_THREAD); if (err < 0) { fprintf(stderr, "failed to set thread binding\n"); hwloc_bitmap_free(set); hwloc_bitmap_free(set2); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* reprint the PU where that thread runs */ err = hwloc_get_last_cpu_location(topology, set2, HWLOC_CPUBIND_THREAD); if (err < 0) { fprintf(stderr, "failed to get last cpu location\n"); hwloc_bitmap_free(set); hwloc_bitmap_free(set2); hwloc_topology_destroy(topology); return EXIT_FAILURE; } /* print the logical number of the PU where that thread runs */ /* extract the PU OS index from the bitmap */ i = hwloc_bitmap_first(set2); obj = hwloc_get_pu_obj_by_os_index(topology, i); printf("thread is running on PU logical index %u (OS/physical index %u)\n", obj->logical_index, i); hwloc_bitmap_free(set); hwloc_bitmap_free(set2); /* retrieve the entire set of all PUs */ cset_all = hwloc_topology_get_complete_cpuset(topology); if (hwloc_bitmap_isequal(cset_all, cset_available)) { printf("all hardware PUs are available\n"); } else { printf("only %d hardware PUs are available in the machine among %d\n", hwloc_bitmap_weight(cset_available), hwloc_bitmap_weight(cset_all)); } hwloc_topology_destroy(topology); return EXIT_SUCCESS; } examples/get-knl-modes.c 0000644 00000001614 15125521641 0011200 0 ustar 00 /* This example program shows how to retrieve Knights Landing * memory and cluster modes. * See "Custom string infos" in the documentation for details * about these attributes. * * Copyright © 2015-2016, 2015 Intel * Copyright © 2016 Inria. All rights reserved. * See COPYING in top-level directory. */ #include <stdio.h> #include <stdlib.h> #include "hwloc.h" int main(void) { hwloc_topology_t topology; hwloc_obj_t root; const char *cluster_mode; const char *memory_mode; hwloc_topology_init(&topology); hwloc_topology_load(topology); root = hwloc_get_root_obj(topology); cluster_mode = hwloc_obj_get_info_by_name(root, "ClusterMode"); memory_mode = hwloc_obj_get_info_by_name(root, "MemoryMode"); printf ("ClusterMode is '%s' MemoryMode is '%s'\n", cluster_mode ? cluster_mode : "NULL", memory_mode ? memory_mode : "NULL"); hwloc_topology_destroy(topology); return 0; } examples/hwloc-hello.c 0000644 00000013656 15125521641 0010760 0 ustar 00 /* Example hwloc API program. * * See other examples under doc/examples/ in the source tree * for more details. * * Copyright © 2009-2016 Inria. All rights reserved. * Copyright © 2009-2011 Université Bordeaux * 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 type[32], attr[1024]; unsigned i; hwloc_obj_type_snprintf(type, sizeof(type), obj, 0); printf("%*s%s", 2*depth, "", type); if (obj->os_index != (unsigned) -1) printf("#%u", obj->os_index); hwloc_obj_attr_snprintf(attr, sizeof(attr), obj, " ", 0); if (*attr) printf("(%s)", attr); printf("\n"); 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; void *m; 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_type_snprintf(string, sizeof(string), 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 packages. *****************************************************************/ depth = hwloc_get_type_depth(topology, HWLOC_OBJ_PACKAGE); if (depth == HWLOC_TYPE_DEPTH_UNKNOWN) { printf("*** The number of packages is unknown\n"); } else { printf("*** %u package(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 (hwloc_obj_type_is_cache(obj->type)) { 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/hyper-threaded). */ 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. There's always at least one. */ n = hwloc_get_nbobjs_by_type(topology, HWLOC_OBJ_NUMANODE); obj = hwloc_get_obj_by_type(topology, HWLOC_OBJ_NUMANODE, n - 1); size = 1024*1024; m = hwloc_alloc_membind(topology, size, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); hwloc_free(topology, m, size); m = malloc(size); hwloc_set_area_membind(topology, m, size, obj->nodeset, HWLOC_MEMBIND_BIND, HWLOC_MEMBIND_BYNODESET); free(m); /* Destroy topology object. */ hwloc_topology_destroy(topology); return 0; } examples/Makefile.am 0000644 00000001500 15125521641 0010414 0 ustar 00 # Copyright © 2009-2018 Inria. All rights reserved. # Copyright © 2009-2013, 2017 Université Bordeaux # Copyright © 2009-2010 Cisco Systems, Inc. All rights reserved. # See COPYING in top-level directory. # # Make sure that the documentation examples work # AM_CFLAGS = $(HWLOC_CFLAGS) AM_CPPFLAGS = $(HWLOC_CPPFLAGS) AM_LDFLAGS = $(HWLOC_LDFLAGS) LDADD = $(HWLOC_top_builddir)/hwloc/libhwloc.la DEPENDENCIES = $(LDADD) TESTS = hwloc-hello if HWLOC_HAVE_CXX TESTS += hwloc-hello-cpp endif HWLOC_HAVE_CXX check_PROGRAMS = $(TESTS) cpuset+bitmap+cpubind nodeset+membind+policy get-knl-modes gpu if !HWLOC_HAVE_WINDOWS check_PROGRAMS += sharedcaches endif hwloc-hello-cpp.cpp: $(srcdir)/hwloc-hello.c cp -f $(srcdir)/hwloc-hello.c $@ clean-local: rm -f hwloc-hello-cpp.cpp hwloc_hello_cpp_SOURCES = hwloc-hello-cpp.cpp VERSION 0000644 00000003257 15125521641 0005625 0 ustar 00 # 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. # Please update HWLOC_VERSION* in contrib/windows/hwloc_config.h too. major=2 minor=4 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= # The date when this release was created date="Feb 11, 2021" # If snapshot=1, then use the value from snapshot_version as the # entire hwloc version (i.e., ignore major, minor, release, and # greek). This is only set to 1 when making snapshot tarballs. snapshot=0 snapshot_version=${major}.${minor}.${release}${greek}-git # 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 git master (and developer branches) # is always 0:0:0. # 2. Version numbers are described in the Libtool current:revision:age # format. libhwloc_so_version=19:1:4 libnetloc_so_version=0:0:0 # Please also update the <TargetName> lines in contrib/windows/libhwloc.vcxproj NEWS 0000644 00000257577 15125521641 0005274 0 ustar 00 Copyright © 2009 CNRS Copyright © 2009-2021 Inria. All rights reserved. Copyright © 2009-2013 Université Bordeaux Copyright © 2009-2011 Cisco Systems, Inc. All rights reserved. Copyright © 2020 Hewlett Packard Enterprise. 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. Version 2.4.1 ------------- * Fix AMD OpenCL device locality when PCI bus or device number >= 128. Thanks to Edgar Leon for reporting the issue. + Applications using any of the following inline functions must be recompiled to get the fix: hwloc_opencl_get_device_pci_busid() hwloc_opencl_get_device_cpuset(), hwloc_opencl_get_device_osdev(). * Fix the ranking of cpukinds on non-Windows systems, thanks to Ivan Kochin for the report. * Fix the insertion of custom Groups after loading the topology, thanks to Scott Hicks. * Add support for CPU0 being offline in Linux, thanks to Garrett Clay. * Fix missing x86 Package and Core objects FreeBSD/NetBSD. Thanks to Thibault Payet and Yuri Victorovich for the report. * Fix the import of very large distances with heterogeneous object types. * Fix a memory leak in the Linux backend, thanks to Perceval Anichini. Version 2.4.0 ------------- * API + Add hwloc/cpukinds.h for reporting information about hybrid CPUs. - Use Linux cpufreq frequencies to rank cores by efficiency. - Use x86 CPUID hybrid leaf and future Linux kernels sysfs CPU type files to identify Intel Atom and Core cores. - Use the Windows native EfficiencyClass to separate kinds. * Backends + Properly handle Linux kernel 5.10+ exposing ACPI HMAT information with knowledge of Generic Initiators. * Tools + lstopo has new --cpukinds and --no-cpukinds options for showing CPU kinds or not in textual and graphical modes respectively. + hwloc-calc has a new --cpukind option for filtering PUs by kind. + hwloc-annotate has a new cpukind command for modifying CPU kinds. * Misc + Fix hwloc_bitmap_nr_ulongs(), thanks to Norbert Eicker. + Add a documentation section about "Topology Attributes: Distances, Memory Attributes and CPU Kinds". + Silence some spurious warnings in the OpenCL backend and when showing process binding with lstopo --ps. Version 2.3.0 ------------- * API + Add hwloc/memattrs.h for exposing latency/bandwidth information between initiators (CPU sets for now) and target NUMA nodes, typically on heterogeneous platforms. - When available, bandwidths and latencies are read from the ACPI HMAT table exposed by Linux kernel 5.2+. - Attributes may also be customized to expose user-defined performance information. + Add hwloc_get_local_numanode_objs() for listing NUMA nodes that are local to some locality. + The new topology flag HWLOC_TOPOLOGY_FLAG_IMPORT_SUPPORT causes support arrays to be loaded from XML exported with hwloc 2.3+. - hwloc_topology_get_support() now returns an additional "misc" array with feature "imported_support" set when support was imported. + Add hwloc_topology_refresh() to refresh internal caches after modifying the topology and before consulting the topology in a multithread context. * Backends + Add a ROCm SMI backend and a hwloc/rsmi.h helper file for getting the locality of AMD GPUs, now exposed as "rsmi" OS devices. Thanks to Mike Li. + Remove POWER device-tree-based topology on Linux, (it was disabled by default since 2.1). * Tools + Command-line options for specifying flags now understand comma-separated lists of flag names (substrings). + hwloc-info and hwloc-calc have new --local-memory --local-memory-flags and --best-memattr options for reporting local memory nodes and filtering by memory attributes. + hwloc-bind has a new --best-memattr option for filtering by memory attributes among the memory binding set. + Tools that have a --restrict option may now receive a nodeset or some custom flags for restricting the topology. + lstopo now has a --thickness option for changing line thickness in the graphical output. + Fix lstopo drawing when autoresizing on Windows 10. + Pressing the F5 key in lstopo X11 and Windows graphical/interactive outputs now refreshes the display according to the current topology and binding. + Add a tikz lstopo graphical backend to generate picture easily included into LaTeX documents. Thanks to Clement Foyer. * Misc + The default installation path of the Bash completion file has changed to ${datadir}/bash-completion/completions/hwloc. Thanks to Tomasz Kłoczko. Version 2.2.0 ------------- * API + Add hwloc_bitmap_singlify_by_core() to remove SMT from a given cpuset, thanks to Florian Reynier for the suggestion. + Add --enable-32bits-pci-domain to stop ignoring PCI devices with domain >16bits (e.g. 10000:02:03.4). Enabling this option breaks the library ABI. Thanks to Dylan Simon for the help. * Backends + Add support for Linux cgroups v2. + Add NUMA support for FreeBSD. + Add get_last_cpu_location support for FreeBSD. + Remove support for Intel Xeon Phi (MIC, Knights Corner) co-processors. * Tools + Add --uid to filter the hwloc-ps output by uid on Linux. + Add a GRAPHICAL OUTPUT section in the manpage of lstopo. * Misc + Use the native dlopen instead of libltdl, unless --disable-plugin-dlopen is passed at configure time. Version 2.1.0 ------------- * API + Add a new "Die" object (HWLOC_OBJ_DIE) for upcoming x86 processors with multiple dies per package, in the x86 and Linux backends. + Add the new HWLOC_OBJ_MEMCACHE object type for memory-side caches. - They are filtered-out by default, except in command-line tools. - They are only available on very recent platforms running Linux 5.2+ and uptodate ACPI tables. - The KNL MCDRAM in cache mode is still exposed as a L3 unless HWLOC_KNL_MSCACHE_L3=0 in the environment. + Add HWLOC_RESTRICT_FLAG_BYNODESET and _REMOVE_MEMLESS for restricting topologies based on some memory nodes. + Add hwloc_topology_set_components() for blacklisting some components from being enabled in a topology. + Add hwloc_bitmap_nr_ulongs() and hwloc_bitmap_from/to_ulongs(), thanks to Junchao Zhang for the suggestion. + Improve the API for dealing with disallowed resources - HWLOC_TOPOLOGY_FLAG_WHOLE_SYSTEM is replaced with FLAG_INCLUDE_DISALLOWED and --whole-system command-line options with --disallowed. . Former names are still accepted for backward compatibility. - Add hwloc_topology_allow() for changing allowed sets after load(). - Add the HWLOC_ALLOW=all environment variable to totally ignore administrative restrictions such as Linux Cgroups. - Add disallowed_pu and disallowed_numa bits to the discovery support structure. + Group objects have a new "dont_merge" attribute to prevent them from being automatically merged with identical parent or children. + Add more distances-related features: - Add hwloc_distances_get_name() to retrieve a string describing what a distances structure contain. - Add hwloc_distances_get_by_name() to retrieve distances structures based on their name. - Add hwloc_distances_release_remove() - Distances may now cover objects of different types with new kind HWLOC_DISTANCES_KIND_HETEROGENEOUS_TYPES. * Backends + Add support for Linux 5.3 new sysfs cpu topology files with Die information. + Add support for Intel v2 Extended Topology Enumeration in the x86 backend. + Improve memory locality on Linux by using HMAT initiators (exposed since Linux 5.2+), and NUMA distances for CPU-less NUMA nodes. + The x86 backend now properly handles offline CPUs. + Detect the locality of NVIDIA GPU OpenCL devices. + Ignore NUMA nodes that correspond to NVIDIA GPU by default. - They may be unignored if HWLOC_KEEP_NVIDIA_GPU_NUMA_NODES=1 in the environment. - Fix their CPU locality and add info attributes to identify them. Thanks to Max Katz and Edgar Leon for the help. + Add support for IBM S/390 drawers. + Rework the heuristics for discovering KNL Cluster and Memory modes to stop assuming all CPUs are online (required for mOS support). Thanks to Sharath K Bhat for testing patches. + Ignore NUMA node information from AMD topoext in the x86 backend, unless HWLOC_X86_TOPOEXT_NUMANODES=1 is set in the environment. + Expose Linux DAX devices as hwloc Block OS devices. + Remove support for /proc/cpuinfo-only topology discovery in Linux kernel prior to 2.6.16. + Disable POWER device-tree-based topology on Linux by default. - It may be reenabled by setting HWLOC_USE_DT=1 in the environment. + Discovery components are now divided in phases that may be individually blacklisted. - The linuxio component has been merged back into the linux component. * Tools + lstopo - lstopo factorizes objects by default in the graphical output when there are more than 4 identical children. . New options --no-factorize and --factorize may be used to configure this. . Hit the 'f' key to disable factorizing in interactive outputs. - Both logical and OS/physical indexes are now displayed by default for PU and NUMA nodes. - The X11 and Windows interactive outputs support many keyboard shortcuts to dynamically customize the attributes, legend, etc. - Add --linespacing and change default margins and linespacing. - Add --allow for changing allowed sets. - Add a native SVG backend. Its graphical output may be slightly less pretty than Cairo (still used by default if available) but the SVG code provides attributes to manipulate objects from HTML/JS. See dynamic_SVG_example.html for an example. + Add --nodeset options to hwloc-calc for converting between cpusets and nodesets. + Add --no-smt to lstopo, hwloc-bind and hwloc-calc to ignore multiple PU in SMT cores. + hwloc-annotate may annotate multiple locations at once. + Add a HTML/JS version of hwloc-ps. See contrib/hwloc-ps.www/README. + Add bash completions. * Misc + Add several FAQ entries in "Compatibility between hwloc versions" about API version, ABI, XML, Synthetic strings, and shmem topologies. Version 2.0.4 (also included in 1.11.13 when appropriate) ------------- * Add support for Linux 5.3 new sysfs cpu topology files with Die information. * Add support for Intel v2 Extended Topology Enumeration in the x86 backend. * Tiles, Modules and Dies are exposed as Groups for now. + HWLOC_DONT_MERGE_DIE_GROUPS=1 may be set in the environment to prevent Die groups from being automatically merged with identical parent or children. * Ignore NUMA node information from AMD topoext in the x86 backend, unless HWLOC_X86_TOPOEXT_NUMANODES=1 is set in the environment. * Group objects have a new "dont_merge" attribute to prevent them from being automatically merged with identical parent or children. Version 2.0.3 (also included in 1.11.12 when appropriate) ------------- * Fix build on Cygwin, thanks to Marco Atzeri for the patches. * Fix a corner case of hwloc_topology_restrict() where children would become out-of-order. * Fix the return length of export_xmlbuffer() functions to always include the ending \0. * Fix lstopo --children-order argument parsing. Version 2.0.2 (also included in 1.11.11 when appropriate) ------------- * Add support for Hygon Dhyana processors in the x86 backend, thanks to Pu Wen for the patch. * Fix symbol renaming to also rename internal components, thanks to Evan Ramos for the patch. * Fix build on HP-UX, thanks to Richard Lloyd for reporting the issues. * Detect PCI link speed without being root on Linux >= 4.13. * Add HWLOC_VERSION* macros to the public headers, thanks to Gilles Gouaillardet for the suggestion. Version 2.0.1 (also included in 1.11.10 when relevant) ------------- * Bump the library soname to 15:0:0 to avoid conflicts with hwloc 1.11.x releases. The hwloc 2.0.0 soname was buggy (12:0:0), applications will have to be recompiled. * Serialize pciaccess discovery to fix concurrent topology loads in multiple threads. * Fix hwloc-dump-hwdata to only process SMBIOS information that correspond to the KNL and KNM configuration. * Add a heuristic for guessing KNL/KNM memory and cluster modes when hwloc-dump-hwdata could not run as root earlier. * Add --no-text lstopo option to remove text from some boxes in the graphical output. Mostly useful for removing Group labels. * Some minor fixes to memory binding. Version 2.0.0 ------------- *** The ABI of the library has changed. *** For instance some hwloc_obj fields were reordered, added or removed, see below. + HWLOC_API_VERSION and hwloc_get_api_version() now give 0x00020000. + See "How do I handle ABI breaks and API upgrades ?" in the FAQ and "Upgrading to hwloc 2.0 API" in the documentation. * Major API changes + Memory, I/O and Misc objects are now stored in dedicated children lists, not in the usual children list that is now only used for CPU-side objects. - hwloc_get_next_child() may still be used to iterate over these 4 lists of children at once. - hwloc_obj_type_is_normal(), _memory() and _io() may be used to check the kind of a given object type. + Topologies always have at least one NUMA object. On non-NUMA machines, a single NUMA object is added to describe the entire machine memory. The NUMA level cannot be ignored anymore. + The NUMA level is special since NUMA nodes are not in the main hierarchy of objects anymore. Its depth is a fake negative depth that should not be compared with normal levels. - If all memory objects are attached to parents at the same depth, it may be retrieved with hwloc_get_memory_parents_depth(). + The HWLOC_OBJ_CACHE type is replaced with 8 types HWLOC_OBJ_L[1-5]CACHE and HWLOC_OBJ_L[1-3]ICACHE that remove the need to disambiguate levels when looking for caches with _by_type() functions. - New hwloc_obj_type_is_{,d,i}cache() functions may be used to check whether a given type is a cache. + Reworked ignoring/filtering API - Replace hwloc_topology_ignore*() functions with hwloc_topology_set_type_filter() and hwloc_topology_set_all_types_filter(). . Contrary to hwloc_topology_ignore_{type,all}_keep_structure() which removed individual objects, HWLOC_TYPE_FILTER_KEEP_STRUCTURE only removes entire levels (so that topology do not become too asymmetric). - Remove HWLOC_TOPOLOGY_FLAG_ICACHES in favor of hwloc_topology_set_icache_types_filter() with HWLOC_TYPE_FILTER_KEEP_ALL. - Remove HWLOC_TOPOLOGY_FLAG_IO_DEVICES, _IO_BRIDGES and _WHOLE_IO in favor of hwloc_topology_set_io_types_filter() with HWLOC_TYPE_FILTER_KEEP_ALL or HWLOC_TYPE_FILTER_KEEP_IMPORTANT. + The distance API has been completely reworked. It is now described in hwloc/distances.h. + Return values - Most functions in hwloc/bitmap.h now return an int that may be negative in case of failure to realloc/extend the internal storage of a bitmap. - hwloc_obj_add_info() also returns an int in case allocations fail. * Minor API changes + Object attributes - obj->memory is removed. . local_memory and page_types attributes are now in obj->attr->numanode . total_memory moves obj->total_memory. - Objects do not have allowed_cpuset and allowed_nodeset anymore. They are only available for the entire topology using hwloc_topology_get_allowed_cpuset() and hwloc_topology_get_allowed_nodeset(). - Objects now have a "subtype" field that supersedes former "Type" and "CoProcType" info attributes. + Object and level depths are now signed ints. + Object string printing and parsing - hwloc_type_sscanf() deprecates the old hwloc_obj_type_sscanf(). - hwloc_type_sscanf_as_depth() is added to convert a type name into a level depth. - hwloc_obj_cpuset_snprintf() is deprecated in favor of hwloc_bitmap_snprintf(). + Misc objects - Replace hwloc_topology_insert_misc_object_by_cpuset() with hwloc_topology_insert_group_object() to precisely specify the location of an additional hierarchy level in the topology. - Misc objects have their own level and depth to iterate over all of them. - Misc objects may now only be inserted as a leaf object with hwloc_topology_insert_misc_object() which deprecates hwloc_topology_insert_misc_object_by_parent(). + hwloc_topology_restrict() doesn't remove objects that contain memory by default anymore. - The list of existing restrict flags was modified. + The discovery support array now contains some NUMA specific bits. + XML export functions take an additional flags argument, for instance for exporting XMLs that are compatible with hwloc 1.x. + Functions diff_load_xml*(), diff_export_xml*() and diff_destroy() in hwloc/diff.h do not need a topology as first parameter anymore. + hwloc_parse_cpumap_file () superseded by hwloc_linux_read_path_as_cpumask() in hwloc/linux.h. + HWLOC_MEMBIND_DEFAULT and HWLOC_MEMBIND_FIRSTTOUCH were clarified. * New APIs and Features + Add hwloc/shmem.h for sharing topologies between processes running on the same machine (for reducing the memory footprint). + Add the experimental netloc subproject. It is disabled by default and can be enabled with --enable-netloc. It currently brings command-line tools to gather and visualize the topology of InfiniBand fabrics, and an API to convert such topologies into Scotch architectures for process mapping. See the documentation for details. * Removed APIs and features + Remove the online_cpuset from struct hwloc_obj. Offline PUs get unknown topologies on Linux nowadays, and wrong topology on Solaris. Other OS do not support them. And one cannot do much about them anyway. Just keep them in complete_cpuset. + Remove the now-unused "System" object type HWLOC_OBJ_SYSTEM, defined to MACHINE for backward compatibility. + The almost-unused "os_level" attribute has been removed from the hwloc_obj structure. + Remove the custom interface for assembling the topologies of different nodes as well as the hwloc-assembler tools. + hwloc_topology_set_fsroot() is removed, the environment variable HWLOC_FSROOT may be used for the same remote testing/debugging purpose. + Remove the deprecated hwloc_obj_snprintf(), hwloc_obj_type_of_string(), hwloc_distribute[v](). * Remove Myrinet Express interoperability (hwloc/myriexpress.h). + Remove Kerrighed support from the Linux backend. + Remove Tru64 (OSF/1) support. - Remove HWLOC_MEMBIND_REPLICATE which wasn't available anywhere else. * Backend improvements + Linux - OS devices do not have to be attached through PCI anymore, for instance enabling the discovery of NVDIMM block devices. - Remove the dependency on libnuma. - Add a SectorSize attribute to block OS devices. + Mac OS X - Fix detection of cores and hyperthreads. - Add CPUVendor, Model, ... attributes. + Windows - Add get_area_memlocation(). * Tools + lstopo and hwloc-info have a new --filter option matching the new filtering API. + lstopo can be given --children-order=plain to force a basic displaying of memory and normal children together below their parent. + hwloc-distances was removed and replaced with lstopo --distances. * Misc + Exports - Exporting to synthetic now ignores I/O and Misc objects. + PCI discovery - Separate OS device discovery from PCI discovery. Only the latter is disabled with --disable-pci at configure time. Both may be disabled with --disable-io. - The `linuxpci' component is now renamed into `linuxio'. - The old `libpci' component name from hwloc 1.6 is not supported anymore, only the `pci' name from hwloc 1.7 is now recognized. - The HWLOC_PCI_<domain>_<bus>_LOCALCPUS environment variables are superseded with a single HWLOC_PCI_LOCALITY where bus ranges may be specified. - Do not set PCI devices and bridges name automatically. Vendor and device names are already in info attributes. + Components and discovery - Add HWLOC_SYNTHETIC environment variable to enforce a synthetic topology as if hwloc_topology_set_synthetic() had been called. - HWLOC_COMPONENTS doesn't support xml or synthetic component attributes anymore, they should be passed in HWLOC_XMLFILE or HWLOC_SYNTHETIC instead. - HWLOC_COMPONENTS takes precedence over other environment variables for selecting components. + hwloc now requires a C99 compliant compiler. Version 1.11.13 (also included in 2.0.4) --------------- * Add support for Linux 5.3 new sysfs cpu topology files with Die information. * Add support for Intel v2 Extended Topology Enumeration in the x86 backend. * Tiles, Modules and Dies are exposed as Groups for now. + HWLOC_DONT_MERGE_DIE_GROUPS=1 may be set in the environment to prevent Die groups from being automatically merged with identical parent or children. * Ignore NUMA node information from AMD topoext in the x86 backend, unless HWLOC_X86_TOPOEXT_NUMANODES=1 is set in the environment. * Group objects have a new "dont_merge" attribute to prevent them from being automatically merged with identical parent or children. Version 1.11.12 (also included in 2.0.3) --------------- * Fix a corner case of hwloc_topology_restrict() where children would become out-of-order. * Fix the return length of export_xmlbuffer() functions to always include the ending \0. Version 1.11.11 (also included in 2.0.2) --------------- * Add support for Hygon Dhyana processors in the x86 backend, thanks to Pu Wen for the patch. * Fix symbol renaming to also rename internal components, thanks to Evan Ramos for the patch. * Fix build on HP-UX, thanks to Richard Lloyd for reporting the issues. * Detect PCI link speed without being root on Linux >= 4.13. Version 1.11.10 (also included in 2.0.1) --------------- * Fix detection of cores and hyperthreads on Mac OS X. * Serialize pciaccess discovery to fix concurrent topology loads in multiple threads. * Fix first touch area memory binding on Linux when thread memory binding is different. * Some minor fixes to memory binding. * Fix hwloc-dump-hwdata to only process SMBIOS information that correspond to the KNL and KNM configuration. * Add a heuristic for guessing KNL/KNM memory and cluster modes when hwloc-dump-hwdata could not run as root earlier. * Fix discovery of NVMe OS devices on Linux >= 4.0. * Add get_area_memlocation() on Windows. * Add CPUVendor, Model, ... attributes on Mac OS X. Version 1.11.9 -------------- * Add support for Zhaoxin ZX-C and ZX-D processors in the x86 backend, thanks to Jeff Zhao for the patch. * Fix AMD Epyc 24-core L3 cache locality in the x86 backend. * Don't crash in the x86 backend when the CPUID vendor string is unknown. * Fix the missing pu discovery support bit on some OS. * Fix the management of the lstopoStyle info attribute for custom colors. * Add verbose warnings when failing to load hwloc v2.0+ XMLs. Version 1.11.8 -------------- * Multiple Solaris improvements, thanks to Maureen Chew for the help: + Detect caches on Sparc. + Properly detect allowed/disallowed PUs and NUMA nodes with processor sets. + Add hwloc_get_last_cpu_location() support for the current thread. * Add support for CUDA compute capability 7.0 and fix support for 6.[12]. * Tools improvements + Fix search for objects by physical index in command-line tools. + Add missing "cpubind:get_thisthread_last_cpu_location" in the output of hwloc-info --support. + Add --pid and --name to specify target processes in hwloc-ps. + Display thread names in lstopo and hwloc-ps on Linux. * Doc improvements + Add a FAQ entry about building on Windows. + Install missing sub-manpage for hwloc_obj_add_info() and hwloc_obj_get_info_by_name(). Version 1.11.7 -------------- * Fix hwloc-bind --membind for CPU-less NUMA nodes (again). Thanks to Gilles Gouaillardet for reporting the issue. * Fix a memory leak on IBM S/390 platforms running Linux. * Fix a memory leak when forcing the x86 backend first on amd64/topoext platforms running Linux. * Command-line tools now support "hbm" instead "numanode" for filtering only high-bandwidth memory nodes when selecting locations. + hwloc-bind also support --hbm and --no-hbm for filtering only or no HBM nodes. Thanks to Nicolas Denoyelle for the suggestion. * Add --children and --descendants to hwloc-info for listing object children or object descendants of a specific type. * Add --no-index, --index, --no-attrs, --attrs to disable/enable display of index numbers or attributes in the graphical lstopo output. * Try to gather hwloc-dump-hwdata output from all possible locations in hwloc-gather-topology. * Updates to the documentation of locations in hwloc(7) and command-line tools manpages. Version 1.11.6 -------------- * Make the Linux discovery about twice faster, especially on the CPU side, by trying to avoid sysfs file accesses as much as possible. * Add support for AMD Family 17h processors (Zen) SMT cores in the Linux and x86 backends. * Add the HWLOC_TOPOLOGY_FLAG_THISSYSTEM_ALLOWED_RESOURCES flag (and the HWLOC_THISSYSTEM_ALLOWED_RESOURCES environment variable) for reading the set of allowed resources from the local operating system even if the topology was loaded from XML or synthetic. * Fix hwloc_bitmap_set/clr_range() for infinite ranges that do not overlap currently defined ranges in the bitmap. * Don't reset the lstopo zoom scale when moving the X11 window. * lstopo now has --flags for manually setting topology flags. * hwloc_get_depth_type() returns HWLOC_TYPE_DEPTH_UNKNOWN for Misc objects. Version 1.11.5 -------------- * Add support for Knights Mill Xeon Phi, thanks to Piotr Luc for the patch. * Reenable distance gathering on Solaris, disabled by mistake since v1.0. Thanks to TU Wien for the help. * Fix hwloc_get_*obj*_inside_cpuset() functions to ignore objects with empty CPU sets, for instance, CPU-less NUMA nodes such as KNL MCDRAM. Thanks to Nicolas Denoyelle for the report. * Fix XML import of multiple distance matrices. * Add a FAQ entry about "hwloc is only a structural model, it ignores performance models, memory bandwidth, etc.?" Version 1.11.4 -------------- * Add MemoryMode and ClusterMode attributes in the Machine object on KNL. Add doc/examples/get-knl-modes.c for an example of retrieving them. Thanks to Grzegorz Andrejczuk. * Fix Linux build with -m32 with respect to libudev. Thanks to Paul Hargrove for reporting the issue. * Fix build with Visual Studio 2015, thanks to Eloi Gaudry for reporting the issue and providing the patch. * Don't forget to display OS device children in the graphical lstopo. * Fix a memory leak on Solaris, thanks to Bryon Gloden for the patch. * Properly handle realloc() failures, thanks to Bryon Gloden for reporting the issue. * Fix lstopo crash in ascii/fig/windows outputs when some objects have a lstopoStyle info attribute. Version 1.11.3 -------------- * Bug fixes + Fix a memory leak on Linux S/390 hosts with books. + Fix /proc/mounts parsing on Linux by using mntent.h. Thanks to Nathan Hjelm for reporting the issue. + Fix a x86 infinite loop on VMware due to the x2APIC feature being advertised without actually being fully supported. Thanks to Jianjun Wen for reporting the problem and testing the patch. + Fix the return value of hwloc_alloc() on mmap() failure. Thanks to Hugo Brunie for reporting the issue. + Fix the return value of command-line tools in some error cases. + Do not break individual thread bindings during x86 backend discovery in a multithreaded process. Thanks to Farouk Mansouri for the report. + Fix hwloc-bind --membind for CPU-less NUMA nodes. + Fix some corner cases in the XML export/import of application userdata. * API Improvements + Add HWLOC_MEMBIND_BYNODESET flag so that membind() functions accept either cpusets or nodesets. + Add hwloc_get_area_memlocation() to check where pages are actually allocated. Only implemented on Linux for now. - There's no _nodeset() variant, but the new flag HWLOC_MEMBIND_BYNODESET is supported. + Make hwloc_obj_type_sscanf() parse back everything that may be outputted by hwloc_obj_type_snprintf(). * Detection Improvements + Allow the x86 backend to add missing cache levels, so that it completes what the Solaris backend lacks. Thanks to Ryan Zezeski for reporting the issue. + Do not filter-out FibreChannel PCI adapters by default anymore. Thanks to Matt Muggeridge for the report. + Add support for CUDA compute capability 6.x. * Tools + Add --support to hwloc-info to list supported features, just like with hwloc_topology_get_support(). - Also add --objects and --topology to explicitly switch between the default modes. + Add --tid to let hwloc-bind operate on individual threads on Linux. + Add --nodeset to let hwloc-bind report memory binding as NUMA node sets. + hwloc-annotate and lstopo don't drop application userdata from XMLs anymore. - Add --cu to hwloc-annotate to drop these application userdata. + Make the hwloc-dump-hwdata dump directory configurable through configure options such as --runstatedir or --localstatedir. * Misc Improvements + Add systemd service template contrib/systemd/hwloc-dump-hwdata.service for launching hwloc-dump-hwdata at boot on Linux. Thanks to Grzegorz Andrejczuk. + Add HWLOC_PLUGINS_BLACKLIST environment variable to prevent some plugins from being loaded. Thanks to Alexandre Denis for the suggestion. + Small improvements for various Windows build systems, thanks to Jonathan L Peyton and Marco Atzeri. Version 1.11.2 -------------- * Improve support for Intel Knights Landing Xeon Phi on Linux: + Group local NUMA nodes of normal memory (DDR) and high-bandwidth memory (MCDRAM) together through "Cluster" groups so that the local MCDRAM is easy to find. - See "How do I find the local MCDRAM NUMA node on Intel Knights Landing Xeon Phi?" in the documentation. - For uniformity across all KNL configurations, always have a NUMA node object even if the host is UMA. + Fix the detection of the memory-side cache: - Add the hwloc-dump-hwdata superuser utility to dump SMBIOS information into /var/run/hwloc/ as root during boot, and load this dumped information from the hwloc library at runtime. - See "Why do I need hwloc-dump-hwdata for caches on Intel Knights Landing Xeon Phi?" in the documentation. Thanks to Grzegorz Andrejczuk for the patches and for the help. * The x86 and linux backends may now be combined for discovering CPUs through x86 CPUID and memory from the Linux kernel. This is useful for working around buggy CPU information reported by Linux (for instance the AMD Bulldozer/Piledriver bug below). Combination is enabled by passing HWLOC_COMPONENTS=x86 in the environment. * Fix L3 cache sharing on AMD Opteron 63xx (Piledriver) and 62xx (Bulldozer) in the x86 backend. Thanks to many users who helped. * Fix the overzealous L3 cache sharing fix added to the x86 backend in 1.11.1 for AMD Opteron 61xx (Magny-Cours) processors. * The x86 backend may now add the info attribute Inclusive=0 or 1 to caches it discovers, or to caches discovered by other backends earlier. Thanks to Guillaume Beauchamp for the patch. * Fix the management on alloc_membind() allocation failures on AIX, HP-UX and OSF/Tru64. * Fix spurious failures to load with ENOMEM on AIX in case of Misc objects below PUs. * lstopo improvements in X11 and Windows graphical mode: + Add + - f 1 shortcuts to manually zoom-in, zoom-out, reset the scale, or fit the entire window. + Display all keyboard shortcuts in the console. * Debug messages may be disabled at runtime by passing HWLOC_DEBUG_VERBOSE=0 in the environment when --enable-debug was passed to configure. * Add a FAQ entry "What are these Group objects in my topology?". Version 1.11.1 -------------- * Detection fixes + Hardwire the topology of Fujitsu K-computer, FX10, FX100 servers to workaround buggy Linux kernels. Thanks to Takahiro Kawashima and Gilles Gouaillardet. + Fix L3 cache information on AMD Opteron 61xx Magny-Cours processors in the x86 backend. Thanks to Guillaume Beauchamp for the patch. + Detect block devices directly attached to PCI without a controller, for instance NVMe disks. Thanks to Barry M. Tannenbaum. + Add the PCISlot attribute to all PCI functions instead of only the first one. * Miscellaneous internal fixes + Ignore PCI bridges that could fail assertions by reporting buggy secondary-subordinate bus numbers Thanks to George Bosilca for reporting the issue. + Fix an overzealous assertion when inserting an intermediate Group object while Groups are totally ignored. + Fix a memory leak on Linux on AMD processors with dual-core compute units. Thanks to Bob Benner. + Fix a memory leak on failure to load a xml diff file. + Fix some segfaults when inputting an invalid synthetic description. + Fix a segfault when plugins fail to find core symbols. Thanks to Guy Streeter. * Many fixes and improvements in the Windows backend: + Fix the discovery of more than 32 processors and multiple processor groups. Thanks to Barry M. Tannenbaum for the help. + Add thread binding set support in case of multiple process groups. + Add thread binding get support. + Add get_last_cpu_location() support for the current thread. + Disable the unsupported process binding in case of multiple processor groups. + Fix/update the Visual Studio support under contrib/windows. Thanks to Eloi Gaudry for the help. * Tools fixes + Fix a segfault when displaying logical indexes in the graphical lstopo. Thanks to Guillaume Mercier for reporting the issue. + Fix lstopo linking with X11 libraries, for instance on Mac OS X. Thanks to Scott Atchley and Pierre Ramet for reporting the issue. + hwloc-annotate, hwloc-diff and hwloc-patch do not drop unavailable resources from the output anymore and those may be annotated as well. + Command-line tools may now import XML from the standard input with -i -.xml + Add missing documentation for the hwloc-info --no-icaches option. Version 1.11.0 -------------- * API + Socket objects are renamed into Package to align with the terminology used by processor vendors. The old HWLOC_OBJ_SOCKET type and "Socket" name are still supported for backward compatibility. + HWLOC_OBJ_NODE is replaced with HWLOC_OBJ_NUMANODE for clarification. HWLOC_OBJ_NODE is still supported for backward compatibility. "Node" and "NUMANode" strings are supported as in earlier releases. * Detection improvements + Add support for Intel Knights Landing Xeon Phi. Thanks to Grzegorz Andrejczuk and Lukasz Anaczkowski. + Add Vendor, Model, Revision, SerialNumber, Type and LinuxDeviceID info attributes to Block OS devices on Linux. Thanks to Vineet Pedaballe for the help. - Add --disable-libudev to avoid dependency on the libudev library. + Add "MemoryModule" Misc objects with information about DIMMs, on Linux when privileged and when I/O is enabled. Thanks to Vineet Pedaballe for the help. + Add a PCISlot attribute to PCI devices on Linux when supported to identify the physical PCI slot where the board is plugged. + Add CPUStepping info attribute on x86 processors, thanks to Thomas Röhl for the suggestion. + Ignore the device-tree on non-Power architectures to avoid buggy detection on ARM. Thanks to Orion Poplawski for reporting the issue. + Work-around buggy Xeon E5v3 BIOS reporting invalid PCI-NUMA affinity for the PCI links on the second processor. + Add support for CUDA compute capability 5.x, thanks Benjamin Worpitz. + Many fixes to the x86 backend - Add L1i and fix L2/L3 type on old AMD processors without topoext support. - Fix Intel CPU family and model numbers when basic family isn't 6 or 15. - Fix package IDs on recent AMD processors. - Fix misc issues due to incomplete APIC IDs on x2APIC processors. - Avoid buggy discovery on old SGI Altix UVs with non-unique APIC IDs. + Gather total machine memory on NetBSD. * Tools + lstopo - Collapse identical PCI devices unless --no-collapse is given. This avoids gigantic outputs when a PCI device contains dozens of identical virtual functions. - The ASCII art output is now called "ascii", for instance in "lstopo -.ascii". The former "txt" extension is retained for backward compatibility. - Automatically scales graphical box width to the inner text in Cairo, ASCII and Windows outputs. - Add --rect to lstopo to force rectangular layout even for NUMA nodes. - Add --restrict-flags to configure the behavior of --restrict. - Objects may have a "Type" info attribute to specify a better type name and display it in lstopo. - Really export all verbose information to the given output file. + hwloc-annotate - May now operate on all types of objects, including I/O. - May now insert Misc objects in the topology. - Do not drop instruction caches and I/O devices from the output anymore. + Fix lstopo path in hwloc-gather-topology after install. * Misc + Fix hwloc/cudart.h for machines with multiple PCI domains, thanks to Imre Kerr for reporting the problem. + Fix PCI Bridge-specific depth attribute. + Fix hwloc_bitmap_intersect() for two infinite bitmaps. + Fix some corner cases in the building of levels on large NUMA machines with non-uniform NUMA groups and I/Os. + Improve the performance of object insertion by cpuset for large topologies. + Prefix verbose XML import errors with the source name. + Improve pkg-config checks and error messages. + Fix excluding after a component with an argument in the HWLOC_COMPONENTS environment variable. * Documentation + Fix the recommended way in documentation and examples to allocate memory on some node, it should use HWLOC_MEMBIND_BIND. Thanks to Nicolas Bouzat for reporting the issue. + Add a "Miscellaneous objects" section in the documentation. + Add a FAQ entry "What happens to my topology if I disable symmetric multithreading, hyper-threading, etc. ?" to the documentation. Version 1.10.1 -------------- * Actually remove disallowed NUMA nodes from nodesets when the whole-system flag isn't enabled. * Fix the gathering of PCI domains. Thanks to James Custer for reporting the issue and providing a patch. * Fix the merging of identical parent and child in presence of Misc objects. Thanks to Dave Love for reporting the issue. * Fix some misordering of children when merging with ignore_keep_structure() in partially allowed topologies. * Fix an overzealous assertion in the debug code when running on a single-PU host with I/O. Thanks to Thomas Van Doren for reporting the issue. * Don't forget to setup NUMA node object nodesets in x86 backend (for BSDs) and OSF/Tru64 backend. * Fix cpuid-x86 build error with gcc -O3 on x86-32. Thanks to Thomas Van Doren for reporting the issue. * Fix support for future very large caches in the x86 backend. * Fix vendor/device names for SR-IOV PCI devices on Linux. * Fix an unlikely crash in case of buggy hierarchical distance matrix. * Fix PU os_index on some AIX releases. Thanks to Hendryk Bockelmann and Erik Schnetter for helping debugging. * Fix hwloc_bitmap_isincluded() in case of infinite sets. * Change hwloc-ls.desktop into a lstopo.desktop and only install it if lstopo is built with Cairo/X11 support. It cannot work with a non-graphical lstopo or hwloc-ls. * Add support for the renaming of Socket into Package in future releases. * Add support for the replacement of HWLOC_OBJ_NODE with HWLOC_OBJ_NUMANODE in future releases. * Clarify the documentation of distance matrices in hwloc.h and in the manpage of the hwloc-distances. Thanks to Dave Love for the suggestion. * Improve some error messages by displaying more information about the hwloc library in use. * Document how to deal with the ABI break when upgrading to the upcoming 2.0 See "How do I handle ABI breaks and API upgrades ?" in the FAQ. Version 1.10.0 -------------- * API + Add hwloc_topology_export_synthetic() to export a topology to a synthetic string without using lstopo. See the Synthetic topologies section in the documentation. + Add hwloc_topology_set/get_userdata() to let the application save a private pointer in the topology whenever it needs a way to find its own object corresponding to a topology. + Add hwloc_get_numanode_obj_by_os_index() and document that this function as well as hwloc_get_pu_obj_by_os_index() are good at converting nodesets and cpusets into objects. + hwloc_distrib() does not ignore any objects anymore when there are too many of them. They get merged with others instead. Thanks to Tim Creech for reporting the issue. * Tools + hwloc-bind --get <command-line> now executes the command after displaying the binding instead of ignoring the command entirely. Thanks to John Donners for the suggestion. + Clarify that memory sizes shown in lstopo are local by default unless specified (total memory added in the root object). * Synthetic topologies + Synthetic topology descriptions may now specify attributes such as memory sizes and OS indexes. See the Synthetic topologies section in the documentation. + lstopo now exports in this fully-detailed format by default. The new option --export-synthetic-flags may be used to revert back the old format. * Documentation + Add the doc/examples/ subdirectory with several real-life examples, including the already existing hwloc-hello.C for basics. Thanks to Rob Aulwes for the suggestion. + Improve the documentation of CPU and memory binding in the API. + Add a FAQ entry about operating system errors, especially on AMD platforms with buggy cache information. + Add a FAQ entry about loading many topologies in a single program. * Misc + Work around buggy Linux kernels reporting 2 sockets instead 1 socket with 2 NUMA nodes for each Xeon E5 v3 (Haswell) processor. + pciutils/libpci support is now removed since libpciaccess works well and there's also a Linux-specific PCI backend. For the record, pciutils was GPL and therefore disabled by default since v1.6.2. + Add --disable-cpuid configure flag to work around buggy processor simulators reporting invalid CPUID information. Thanks for Andrew Friedley for reporting the issue. + Fix a racy use of libltdl when manipulating multiple topologies in different threads. Thanks to Andra Hugo for reporting the issue and testing patches. + Fix some build failures in private/misc.h. Thanks to Pavan Balaji and Ralph Castain for the reports. + Fix failures to detect X11/Xutil.h on some Solaris platforms. Thanks to Siegmar Gross for reporting the failure. + The plugin ABI has changed, this release will not load plugins built against previous hwloc releases. Version 1.9.1 ------------- * Fix a crash when the PCI locality is invalid. Attach to the root object instead. Thanks to Nicolas Denoyelle for reporting the issue. * Fix -f in lstopo manpage. Thanks to Jirka Hladky for reporting the issue. * Fix hwloc_obj_type_sscanf() and others when strncasecmp() is not properly available. Thanks to Nick Papior Andersen for reporting the problem. * Mark Linux file descriptors as close-on-exec to avoid leaks on exec. * Fix some minor memory leaks. Version 1.9.0 ------------- * API + Add hwloc_obj_type_sscanf() to extend hwloc_obj_type_of_string() with type-specific attributes such as Cache/Group depth and Cache type. hwloc_obj_type_of_string() is moved to hwloc/deprecated.h. + Add hwloc_linux_get_tid_last_cpu_location() for retrieving the last CPU where a Linux thread given by TID ran. + Add hwloc_distrib() to extend the old hwloc_distribute[v]() functions. hwloc_distribute[v]() is moved to hwloc/deprecated.h. + Don't mix total and local memory when displaying verbose object attributes with hwloc_obj_attr_snprintf() or in lstopo. * Backends + Add CPUVendor, CPUModelNumber and CPUFamilyNumber info attributes for x86, ia64 and Xeon Phi sockets on Linux, to extend the x86-specific support added in v1.8.1. Requested by Ralph Castain. + Add many CPU- and Platform-related info attributes on ARM and POWER platforms, in the Machine and Socket objects. + Add CUDA info attributes describing the number of multiprocessors and cores and the size of the global, shared and L2 cache memories in CUDA OS devices. + Add OpenCL info attributes describing the number of compute units and the global memory size in OpenCL OS devices. + The synthetic backend now accepts extended types such as L2Cache, L1i or Group3. lstopo also exports synthetic strings using these extended types. * Tools + lstopo - Do not overwrite output files by default anymore. Pass -f or --force to enforce it. - Display OpenCL, CUDA and Xeon Phi numbers of cores and memory sizes in the graphical output. - Fix export to stdout when specifying a Cairo-based output type with --of. + hwloc-ps - Add -e or --get-last-cpu-location to report where processes/threads run instead of where they are bound. - Report locations as likely-more-useful objects such as Cores or Sockets instead of Caches when possible. + hwloc-bind - Fix failure on Windows when not using --pid. - Add -e as a synonym to --get-last-cpu-location. + hwloc-distrib - Add --reverse to distribute using last objects first and singlify into last bits first. Thanks to Jirka Hladky for the suggestion. + hwloc-info - Report unified caches when looking for data or instruction cache ancestor objects. * Misc + Add experimental Visual Studio support under contrib/windows. Thanks to Eloi Gaudry for his help and for providing the first draft. + Fix some overzealous assertions and warnings about the ordering of objects on a level with respect to cpusets. The ordering is only guaranteed for complete cpusets (based on the first bit in sets). + Fix some memory leaks when importing xml diffs and when exporting a "too complex" entry. Version 1.8.1 ------------- * Fix the cpuid code on Windows 64bits so that the x86 backend gets enabled as expected and can populate CPU information. Thanks to Robin Scher for reporting the problem. * Add CPUVendor/CPUModelNumber/CPUFamilyNumber attributes when running on x86 architecture. Thanks to Ralph Castain for the suggestion. * Work around buggy BIOS reporting duplicate NUMA nodes on Linux. Thanks to Jeff Becker for reporting the problem and testing the patch. * Add a name to the lstopo graphical window. Thanks to Michael Prokop for reporting the issue. Version 1.8.0 ------------- * New components + Add the "linuxpci" component that always works on Linux even when libpciaccess and libpci aren't available (and even with a modified file-system root). By default the old "pci" component runs first because "linuxpci" lacks device names (obj->name is always NULL). * API + Add the topology difference API in hwloc/diff.h for manipulating many similar topologies. + Add hwloc_topology_dup() for duplicating an entire topology. + hwloc.h and hwloc/helper.h have been reorganized to clarify the documentation sections. The actual inline code has moved out of hwloc.h into the new hwloc/inlines.h. + Deprecated functions are now in hwloc/deprecated.h, and not in the official documentation anymore. * Tools + Add hwloc-diff and hwloc-patch tools together with the new diff API. + Add hwloc-compress-dir to (de)compress an entire directory of XML files using hwloc-diff and hwloc-patch. + Object colors in the graphical output of lstopo may be changed by adding a "lstopoStyle" info attribute. See CUSTOM COLORS in the lstopo(1) manpage for details. Thanks to Jirka Hladky for discussing the idea. + hwloc-gather-topology may now gather I/O-related files on Linux when --io is given. Only the linuxpci component supports discovering I/O objects from these extended tarballs. + hwloc-annotate now supports --ri to remove/replace info attributes with a given name. + hwloc-info supports "root" and "all" special locations for dumping information about the root object. + lstopo now supports --append-legend to append custom lines of text to the legend in the graphical output. Thanks to Jirka Hladky for discussing the idea. + hwloc-calc and friends have a more robust parsing of locations given on the command-line and they report useful error messages about it. + Add --whole-system to hwloc-bind, hwloc-calc, hwloc-distances and hwloc-distrib, and add --restrict to hwloc-bind for uniformity among tools. * Misc + Calling hwloc_topology_load() or hwloc_topology_set_*() on an already loaded topology now returns an error (deprecated since release 1.6.1). + Fix the initialisation of cpusets and nodesets in Group objects added when inserting PCI hostbridges. + Never merge Group objects that were added explicitly by the user with hwloc_custom_insert_group_object_by_parent(). + Add a sanity check during dynamic plugin loading to prevent some crashes when hwloc is dynamically loaded by another plugin mechanisms. + Add --with-hwloc-plugins-path to specify the install/load directories of plugins. + Add the MICSerialNumber info attribute to the root object when running hwloc inside a Xeon Phi to match the same attribute in the MIC OS device when running in the host. Version 1.7.2 ------------- * Do not create invalid block OS devices on very old Linux kernel such as RHEL4 2.6.9. * Fix PCI subvendor/device IDs. * Fix the management of Misc objects inserted by parent. Thanks to Jirka Hladky for reporting the problem. * Add a Port<n>State into attribute to OpenFabrics OS devices. * Add a MICSerialNumber info attribute to Xeon PHI/MIC OS devices. * Improve verbose error messages when failing to load from XML. Version 1.7.1 ------------- * Fix a failed assertion in the distance grouping code when loading a XML file that already contains some groups. Thanks to Laercio Lima Pilla for reporting the problem. * Remove unexpected Group objects when loading XML topologies with I/O objects and NUMA distances. Thanks to Elena Elkina for reporting the problem and testing patches. * Fix PCI link speed discovery when using libpciaccess. * Fix invalid libpciaccess virtual function device/vendor IDs when using SR-IOV PCI devices on Linux. * Fix GL component build with old NVCtrl releases. Thanks to Jirka Hladky for reporting the problem. * Fix embedding breakage caused by libltdl. Thanks to Pavan Balaji for reporting the problem. * Always use the system-wide libltdl instead of shipping one inside hwloc. * Document issues when enabling plugins while embedding hwloc in another project, in the documentation section Embedding hwloc in Other Software. * Add a FAQ entry "How to get useful topology information on NetBSD?" in the documentation. * Somes fixes in the renaming code for embedding. * Miscellaneous minor build fixes. Version 1.7.0 ------------- * New operating system backends + Add BlueGene/Q compute node kernel (CNK) support. See the FAQ in the documentation for details. Thanks to Jeff Hammond, Christopher Samuel and Erik Schnetter for their help. + Add NetBSD support, thanks to Aleksej Saushev. * New I/O device discovery + Add co-processor OS devices such as "mic0" for Intel Xeon Phi (MIC) on Linux. Thanks to Jerome Vienne for helping. + Add co-processor OS devices such as "cuda0" for NVIDIA CUDA-capable GPUs. + Add co-processor OS devices such as "opencl0d0" for OpenCL GPU devices on the AMD OpenCL implementation. + Add GPU OS devices such as ":0.0" for NVIDIA X11 displays. + Add GPU OS devices such as "nvml0" for NVIDIA GPUs. Thanks to Marwan Abdellah and Stefan Eilemann for helping. These new OS devices have some string info attributes such as CoProcType, GPUModel, etc. to better identify them. See the I/O Devices and Attributes documentation sections for details. * New components + Add the "opencl", "cuda", "nvml" and "gl" components for I/O device discovery. + "nvml" also improves the discovery of NVIDIA GPU PCIe link speed. All of these new components may be built as plugins. They may also be disabled entirely by passing --disable-opencl/cuda/nvml/gl to configure. See the I/O Devices, Components and Plugins, and FAQ documentation sections for details. * API + Add hwloc_topology_get_flags(). + Add hwloc/plugins.h for building external plugins. See the Adding new discovery components and plugins section. * Interoperability + Add hwloc/opencl.h, hwloc/nvml.h, hwloc/gl.h and hwloc/intel-mic.h to retrieve the locality of OS devices that correspond to AMD OpenCL GPU devices or indexes, to NVML devices or indexes, to NVIDIA X11 displays, or to Intel Xeon Phi (MIC) device indexes. + Add new helpers in hwloc/cuda.h and hwloc/cudart.h to convert between CUDA devices or indexes and hwloc OS devices. + Add hwloc_ibv_get_device_osdev() and clarify the requirements of the OpenFabrics Verbs helpers in hwloc/openfabrics-verbs.h. * Tools + hwloc-info is not only a synonym of lstopo -s anymore, it also dumps information about objects given on the command-line. * Documentation + Add a section "Existing components and plugins". + Add a list of common OS devices in section "Software devices". + Add a new FAQ entry "Why is lstopo slow?" about lstopo slowness issues because of GPUs. + Clarify the documentation of inline helpers in hwloc/myriexpress.h and hwloc/openfabrics-verbs.h. * Misc + Improve cache detection on AIX. + The HWLOC_COMPONENTS variable now excludes the components whose names are prefixed with '-'. + lstopo --ignore PU now works when displaying the topology in graphical and textual mode (not when exporting to XML). + Make sure I/O options always appear in lstopo usage, not only when using pciutils/libpci. + Remove some unneeded Linux specific includes from some interoperability headers. + Fix some inconsistencies in hwloc-distrib and hwloc-assembler-remote manpages. Thanks to Guy Streeter for the report. + Fix a memory leak on AIX when getting memory binding. + Fix many small memory leaks on Linux. + The `libpci' component is now called `pci' but the old name is still accepted in the HWLOC_COMPONENTS variable for backward compatibility. Version 1.6.2 ------------- * Use libpciaccess instead of pciutils/libpci by default for I/O discovery. pciutils/libpci is only used if --enable-libpci is given to configure because its GPL license may taint hwloc. See the Installation section in the documentation for details. * Fix get_cpubind on Solaris when bound to a single PU with processor_bind(). Thanks to Eugene Loh for reporting the problem and providing a patch. Version 1.6.1 ------------- * Fix some crash or buggy detection in the x86 backend when Linux cgroups/cpusets restrict the available CPUs. * Fix the pkg-config output with --libs --static. Thanks to Erik Schnetter for reporting one of the problems. * Fix the output of hwloc-calc -H --hierarchical when using logical indexes in the output. * Calling hwloc_topology_load() multiple times on the same topology is officially deprecated. hwloc will warn in such cases. * Add some documentation about existing plugins/components, package dependencies, and I/O devices specification on the command-line. Version 1.6.0 ------------- * Major changes + Reorganize the backend infrastructure to support dynamic selection of components and dynamic loading of plugins. For details, see the new documentation section Components and plugins. - The HWLOC_COMPONENTS variable lets one replace the default discovery components. - Dynamic loading of plugins may be enabled with --enable-plugins (except on AIX and Windows). It will build libxml2 and libpci support as separated modules. This helps reducing the dependencies of the core hwloc library when distributed as a binary package. * Backends + Add CPUModel detection on Darwin and x86/FreeBSD. Thanks to Robin Scher for providing ways to implement this. + The x86 backend now adds CPUModel info attributes to socket objects created by other backends that do not natively support this attribute. + Fix detection on FreeBSD in case of cpuset restriction. Thanks to Sebastian Kuzminsky for reporting the problem. * XML + Add hwloc_topology_set_userdata_import/export_callback(), hwloc_export_obj_userdata() and _userdata_base64() to let applications specify how to save/restore the custom data they placed in the userdata private pointer field of hwloc objects. * Tools + Add hwloc-annotate program to add string info attributes to XML topologies. + Add --pid-cmd to hwloc-ps to append the output of a command to each PID line. May be used for showing Open MPI process ranks, see the hwloc-ps(1) manpage for details. + hwloc-bind now exits with an error if binding fails; the executable is not launched unless binding suceeeded or --force was given. + Add --quiet to hwloc-calc and hwloc-bind to hide non-fatal error messages. + Fix command-line pid support in windows tools. + All programs accept --verbose as a synonym to -v. * Misc + Fix some DIR descriptor leaks on Linux. + Fix I/O device lists when some were filtered out after a XML import. + Fix the removal of I/O objects when importing a I/O-enabled XML topology without any I/O topology flag. + When merging objects with HWLOC_IGNORE_TYPE_KEEP_STRUCTURE or lstopo --merge, compare object types before deciding which one of two identical object to remove (e.g. keep sockets in favor of caches). + Add some GUID- and LID-related info attributes to OpenFabrics OS devices. + Only add CPUType socket attributes on Solaris/Sparc. Other cases don't report reliable information (Solaris/x86), and a replacement is available as the Architecture string info in the Machine object. + Add missing Backend string info on Solaris in most cases. + Document object attributes and string infos in a new Attributes section in the documentation. + Add a section about Synthetic topologies in the documentation. Version 1.5.2 (some of these changes are in 1.6.2 but not in 1.6) ------------- * Use libpciaccess instead of pciutils/libpci by default for I/O discovery. pciutils/libpci is only used if --enable-libpci is given to configure because its GPL license may taint hwloc. See the Installation section in the documentation for details. * Fix get_cpubind on Solaris when bound to a single PU with processor_bind(). Thanks to Eugene Loh for reporting the problem and providing a patch. * Fix some DIR descriptor leaks on Linux. * Fix I/O device lists when some were filtered out after a XML import. * Add missing Backend string info on Solaris in most cases. * Fix the removal of I/O objects when importing a I/O-enabled XML topology without any I/O topology flag. * Fix the output of hwloc-calc -H --hierarchical when using logical indexes in the output. * Fix the pkg-config output with --libs --static. Thanks to Erik Schnetter for reporting one of the problems. Version 1.5.1 ------------- * Fix block OS device detection on Linux kernel 3.3 and later. Thanks to Guy Streeter for reporting the problem and testing the fix. * Fix the cpuid code in the x86 backend (for FreeBSD). Thanks to Sebastian Kuzminsky for reporting problems and testing patches. * Fix 64bit detection on FreeBSD. * Fix some corner cases in the management of the thissystem flag with respect to topology flags and environment variables. * Fix some corner cases in command-line parsing checks in hwloc-distrib and hwloc-distances. * Make sure we do not miss some block OS devices on old Linux kernels when a single PCI device has multiple IDE hosts/devices behind it. * Do not disable I/O devices or instruction caches in hwloc-assembler output. Version 1.5.0 ------------- * Backends + Do not limit the number of processors to 1024 on Solaris anymore. + Gather total machine memory on FreeBSD. Thanks to Cyril Roelandt. + XML topology files do not depend on the locale anymore. Float numbers such as NUMA distances or PCI link speeds now always use a dot as a decimal separator. + Add instruction caches detection on Linux, AIX, Windows and Darwin. + Add get_last_cpu_location() support for the current thread on AIX. + Support binding on AIX when threads or processes were bound with bindprocessor(). Thanks to Hendryk Bockelmann for reporting the issue and testing patches, and to Farid Parpia for explaining the binding interfaces. + Improve AMD topology detection in the x86 backend (for FreeBSD) using the topoext feature. * API + Increase HWLOC_API_VERSION to 0x00010500 so that API changes may be detected at build-time. + Add a cache type attribute describind Data, Instruction and Unified caches. Caches with different types but same depth (for instance L1d and L1i) are placed on different levels. + Add hwloc_get_cache_type_depth() to retrieve the hwloc level depth of of the given cache depth and type, for instance L1i or L2. It helps disambiguating the case where hwloc_get_type_depth() returns HWLOC_TYPE_DEPTH_MULTIPLE. + Instruction caches are ignored unless HWLOC_TOPOLOGY_FLAG_ICACHES is passed to hwloc_topology_set_flags() before load. + Add hwloc_ibv_get_device_osdev_by_name() OpenFabrics helper in openfabrics-verbs.h to find the hwloc OS device object corresponding to an OpenFabrics device. * Tools + Add lstopo-no-graphics, a lstopo built without graphical support to avoid dependencies on external libraries such as Cairo and X11. When supported, graphical outputs are only available in the original lstopo program. - Packagers splitting lstopo and lstopo-no-graphics into different packages are advised to use the alternatives system so that lstopo points to the best available binary. + Instruction caches are enabled in lstopo by default. Use --no-icaches to disable them. + Add -t/--threads to show threads in hwloc-ps. * Removal of obsolete components + Remove the old cpuset interface (hwloc/cpuset.h) which is deprecated and superseded by the bitmap API (hwloc/bitmap.h) since v1.1. hwloc_cpuset and nodeset types are still defined, but all hwloc_cpuset_* compatibility wrappers are now gone. + Remove Linux libnuma conversion helpers for the deprecated and broken nodemask_t interface. + Remove support for "Proc" type name, it was superseded by "PU" in v1.0. + Remove hwloc-mask symlinks, it was replaced by hwloc-calc in v1.0. * Misc + Fix PCIe 3.0 link speed computation. + Non-printable characters are dropped from strings during XML export. + Fix importing of escaped characters with the minimalistic XML backend. + Assert hwloc_is_thissystem() in several I/O related helpers. + Fix some memory leaks in the x86 backend for FreeBSD. + Minor fixes to ease native builds on Windows. + Limit the number of retries when operating on all threads within a process on Linux if the list of threads is heavily getting modified. Version 1.4.3 ------------- * This release is only meant to fix the pciutils license issue when upgrading to hwloc v1.5 or later is not possible. It contains several other minor fixes but ignores many of them that are only in v1.5 or later. * Use libpciaccess instead of pciutils/libpci by default for I/O discovery. pciutils/libpci is only used if --enable-libpci is given to configure because its GPL license may taint hwloc. See the Installation section in the documentation for details. * Fix PCIe 3.0 link speed computation. * Fix importing of escaped characters with the minimalistic XML backend. * Fix a memory leak in the x86 backend. Version 1.4.2 ------------- * Fix build on Solaris 9 and earlier when fabsf() is not a compiler built-in. Thanks to Igor Galić for reporting the problem. * Fix support for more than 32 processors on Windows. Thanks to Hartmut Kaiser for reporting the problem. * Fix process-wide binding and cpulocation routines on Linux when some threads disappear in the meantime. Thanks to Vlad Roubtsov for reporting the issue. * Make installed scripts executable. Thanks to Jirka Hladky for reporting the problem. * Fix libtool revision management when building for Windows. This fix was also released as hwloc v1.4.1.1 Windows builds. Thanks to Hartmut Kaiser for reporting the problem. * Fix the __hwloc_inline keyword in public headers when compiling with a C++ compiler. * Add Port info attribute to network OS devices inside OpenFabrics PCI devices so as to identify which interface corresponds to which port. * Document requirements for interoperability helpers: I/O devices discovery is required for some of them; the topology must match the current host for most of them. Version 1.4.1 (contains all 1.3.2 changes) ------------- * Fix hwloc_alloc_membind, thanks Karl Napf for reporting the issue. * Fix memory leaks in some get_membind() functions. * Fix helpers converting from Linux libnuma to hwloc (hwloc/linux-libnuma.h) in case of out-of-order NUMA node ids. * Fix some overzealous assertions in the distance grouping code. * Workaround BIOS reporting empty I/O locality in CUDA and OpenFabrics helpers on Linux. Thanks to Albert Solernou for reporting the problem. * Install a valgrind suppressions file hwloc-valgrind.supp (see the FAQ). * Fix memory binding documentation. Thanks to Karl Napf for reporting the issues. Version 1.4.0 (does not contain all 1.3.2 changes) ------------- * Major features + Add "custom" interface and "assembler" tools to build multi-node topology. See the Multi-node Topologies section in the documentation for details. * Interface improvements + Add symmetric_subtree object attribute to ease assumptions when consulting regular symmetric topologies. + Add a CPUModel and CPUType info attribute to Socket objects on Linux and Solaris. + Add hwloc_get_obj_index_inside_cpuset() to retrieve the "logical" index of an object within a subtree of the topology. + Add more NVIDIA CUDA helpers in cuda.h and cudart.h to find hwloc objects corresponding to CUDA devices. * Discovery improvements + Add a group object above partial distance matrices to make sure the matrices are available in the final topology, except when this new object would contradict the existing hierarchy. + Grouping by distances now also works when loading from XML. + Fix some corner cases in object insertion, for instance when dealing with NUMA nodes without any CPU. * Backends + Implement hwloc_get_area_membind() on Linux. + Honor I/O topology flags when importing from XML. + Further improve XML-related error checking and reporting. + Hide synthetic topology error messages unless HWLOC_SYNTHETIC_VERBOSE=1. * Tools + Add synthetic exporting of symmetric topologies to lstopo. + lstopo --horiz and --vert can now be applied to some specific object types. + lstopo -v -p now displays distance matrices with physical indexes. + Add hwloc-distances utility to list distances. * Documentation + Fix and/or document the behavior of most inline functions in hwloc/helper.h when the topology contains some I/O or Misc objects. + Backend documentation enhancements. * Bug fixes + Fix missing last bit in hwloc_linux_get_thread_cpubind(). Thanks to Carolina Gómez-Tostón Gutiérrez for reporting the issue. + Fix FreeBSD build without cpuid support. + Fix several Windows build issues. + Fix inline keyword definition in public headers. + Fix dependencies in the embedded library. + Improve visibility support detection. Thanks to Dave Love for providing the patch. + Remove references to internal symbols in the tools. Version 1.3.3 ------------- * This release is only meant to fix the pciutils license issue when upgrading to hwloc v1.4 or later is not possible. It contains several other minor fixes but ignores many of them that are only in v1.4 or later. * Use libpciaccess instead of pciutils/libpci by default for I/O discovery. pciutils/libpci is only used if --enable-libpci is given to configure because its GPL license may taint hwloc. See the Installation section in the documentation for details. Version 1.3.2 ------------- * Fix missing last bit in hwloc_linux_get_thread_cpubind(). Thanks to Carolina Gómez-Tostón Gutiérrez for reporting the issue. * Fix build with -mcmodel=medium. Thanks to Devendar Bureddy for reporting the issue. * Fix build with Solaris Studio 12 compiler when XML is disabled. Thanks to Paul H. Hargrove for reporting the problem. * Fix installation with old GNU sed, for instance on Red Hat 8. Thanks to Paul H. Hargrove for reporting the problem. * Fix PCI locality when Linux cgroups restrict the available CPUs. * Fix floating point issue when grouping by distance on mips64 architecture. Thanks to Paul H. Hargrove for reporting the problem. * Fix conversion from/to Linux libnuma when some NUMA nodes have no memory. * Fix support for gccfss compilers with broken ffs() support. Thanks to Paul H. Hargrove for reporting the problem and providing a patch. * Fix FreeBSD build without cpuid support. * Fix several Windows build issues. * Fix inline keyword definition in public headers. * Fix dependencies in the embedded library. * Detect when a compiler such as xlc may not report compile errors properly, causing some configure checks to be wrong. Thanks to Paul H. Hargrove for reporting the problem and providing a patch. * Improve visibility support detection. Thanks to Dave Love for providing the patch. * Remove references to internal symbols in the tools. * Fix installation on systems with limited command-line size. Thanks to Paul H. Hargrove for reporting the problem. * Further improve XML-related error checking and reporting. Version 1.3.1 ------------- * Fix pciutils detection with pkg-config when not installed in standard directories. * Fix visibility options detection with the Solaris Studio compiler. Thanks to Igor Galić and Terry Dontje for reporting the problems. * Fix support for old Linux sched.h headers such as those found on Red Hat 8. Thanks to Paul H. Hargrove for reporting the problems. * Fix inline and attribute support for Solaris compilers. Thanks to Dave Love for reporting the problems. * Print a short summary at the end of the configure output. Thanks to Stefan Eilemann for the suggestion. * Add --disable-libnuma configure option to disable libnuma-based memory binding support on Linux. Thanks to Rayson Ho for the suggestion. * Make hwloc's configure script properly obey $PKG_CONFIG. Thanks to Nathan Phillip Brink for raising the issue. * Silence some harmless pciutils warnings, thanks to Paul H. Hargrove for reporting the problem. * Fix the documentation with respect to hwloc_pid_t and hwloc_thread_t being either pid_t and pthread_t on Unix, or HANDLE on Windows. Version 1.3.0 ------------- * Major features + Add I/O devices and bridges to the topology using the pciutils library. Only enabled after setting the relevant flag with hwloc_topology_set_flags() before hwloc_topology_load(). See the I/O Devices section in the documentation for details. * Discovery improvements + Add associativity to the cache attributes. + Add support for s390/z11 "books" on Linux. + Add the HWLOC_GROUPING_ACCURACY environment variable to relax distance-based grouping constraints. See the Environment Variables section in the documentation for details about grouping behavior and configuration. + Allow user-given distance matrices to remove or replace those discovered by the OS backend. * XML improvements + XML is now always supported: a minimalistic custom import/export code is used when libxml2 is not available. It is only guaranteed to read XML files generated by hwloc. + hwloc_topology_export_xml() and export_xmlbuffer() now return an integer. + Add hwloc_free_xmlbuffer() to free the buffer allocated by hwloc_topology_export_xmlbuffer(). + Hide XML topology error messages unless HWLOC_XML_VERBOSE=1. * Minor API updates + Add hwloc_obj_add_info to customize object info attributes. * Tools + lstopo now displays I/O devices by default. Several options are added to configure the I/O discovery. + hwloc-calc and hwloc-bind now accept I/O devices as input. + Add --restrict option to hwloc-calc and hwloc-distribute. + Add --sep option to change the output field separator in hwloc-calc. + Add --whole-system option to hwloc-ps. Version 1.2.2 ------------- * Fix build on AIX 5.2, thanks Utpal Kumar Ray for the report. * Fix XML import of very large page sizes or counts on 32bits platform, thanks to Karsten Hopp for the RedHat ticket. * Fix crash when administrator limitations such as Linux cgroup require to restrict distance matrices. Thanks to Ake Sandgren for reporting the problem. * Fix the removal of objects such as AMD Magny-Cours dual-node sockets in case of administrator restrictions. * Improve error reporting and messages in case of wrong synthetic topology description. * Several other minor internal fixes and documentation improvements. 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 (formerly named "libtopology") ----------- * First release. AUTHORS 0000644 00000003010 15125521641 0005610 0 ustar 00 hwloc Authors ============= The following cumulative list contains the names of most individuals who have committed code to the hwloc repository (either directly or through a third party). Name Affiliation(s) --------------------------- -------------------- Grzegorz Andrejczuk Intel Cédric Augonnet University of Bordeaux Guillaume Beauchamp Inria Ahmad Boissetri Binzagr Inria Cyril Bordage Inria Nicholas Buroker UWL Christopher M. Cantalupo Intel Jérôme Clet-Ortega University of Bordeaux Ludovic Courtès Inria Clément Foyer Inria Nathalie Furmento CNRS Bryon Gloden Brice Goglin Inria Gilles Gouaillardet RIST Valentin Hoyet Inria Joshua Hursey UWL Alexey Kardashevskiy IBM Rob Latham ANL Douglas MacFarland UWL Marc Marí BSC Jonathan L Peyton Intel Piotr Luc Intel Antoine Rougier intern from University of Bordeaux Jeff Squyres Cisco Samuel Thibault University of Bordeaux Jean-Yves VET DDN Benjamin Worpitz Jeff Zhao Zhaoxin Affiliaion abbreviations: ------------------------- ANL = Argonne National Lab BSC = Barcelona Supercomputing Center Cisco = Cisco Systems, Inc. CNRS = Centre national de la recherche scientifique (France) UWL = University of Wisconsin-La Crosse hwloc-a4.pdf 0000644 00004662176 15125521641 0006705 0 ustar 00 %PDF-1.5 %���� 2 0 obj << /Type /ObjStm /N 100 /First 830 /Length 1641 /Filter /FlateDecode >> stream xڽY�r�6}�W�1��m�/3��4I�f&��:�_lI�Ց-W�8��ȣ� � ��}H��잃ł�3�g� -Y`�i&8��3�p��:S�J0�=)��f %s�2i���hY08��� �^J�SC����clX00�1��r ��zʹ�-a�$���U�`��x@�b���@������>,� O�Jʁ�Lj�-�-�g� E/�s�)8���y�p���{7�)�5�T�y�](�V��f`P����N�9\z.�c�#�1d ��6G#x�I��:@14`C��Zk12�'�`x�QS�hb��A�� ��L����y��*Obp�`DE��1�a�d���8<��8 <���e�E/0e������x��w��*oy�8P ������1~�K(��u�v���������Ȉ��=hs���)E�!���\��s&v��6'��Qz�υh���8��Rq�!�(8 ����v|Ǝ?ξ����jx}q�Ϗ�{�v��|���9�"6�\�x�56���f����x��ϱ��fHOMc3��26-4��p9���N<G-d�bsK����� ,���mɺ,Y�y�2�8;���W�[ ���P�#s27�_��:���nB�|��y�}�}�b���Tq��C20#�T�=�=�$�q��$5�ha�%�&t���A��̈́_����~�������#�����1O 08#7�4�z(��%r/�8[ �*�K��>�_7�f&j���c�z�Ǹ�N�U7hu �t���+��H=��(;zS�+cؕ%�L�e�O �<%�� W��)Y�#Q�O��,�4%���&�؛�$��%�&���8�eK�춑_(4]�B�<�']�H�<��;�gff2���njW���*�2�\����r�VyU����!�fTN�����������3z��*�Ry9��T4�0\��_�xn=�p�3=��Φ=%C&�ꧤ�υ�Ƙ� m�M�)s��wt��r�C���YO��.:&K��U����Uɦ*�T�6wJ�aɦ.��6�IkV�iJ6M��Qf�ӵ�[�`�!� ɕ,�zK��h��L+�q �/��O �5��X�ɫ=�B�֙���"��P X�3`��a�m�墘qyo��ྦ�wJ�î�;M�&�ǐ ���Q�r�I2�U#��<I�#���8�hl�����tP�-mfr�m-������F&o ����娰�:I˓y����n�2iϵ�c�Ӯ}���u����J�/E�w�DGě�o��yJŎ��NȒ�"�����.W~�|�qBe�������+����n�� &/�y<"�7%�&_�7o�V$�e�6���ww6(�mK~����#��ŷ�^S���4u~L�Z!z������'��@��Q��6���o�)Yr���\�v�����}���~� w�0S ��w' q��f�D���;!������i9p�n��,!�����l��C��][J���.��;א�����i�4��*�I��Us{}��o��k� �˝b�}F�g�J��]Tu.�'~�y>����� �<Sϔ�r�C���`� endstream endobj 203 0 obj << /Type /ObjStm /N 100 /First 915 /Length 2381 /Filter /FlateDecode >> stream x��[Y�E~ׯ�G��5]gw���X�k�<��#�.Ԓ����%p����*Y�X"x�VI]G�_efe��e�K]� >�O�3��n�Rj�����SE-���+�M�(��y�4|Ĺ(c� 3� ��"JhT0�`Sf2!��JB�6ˈ����`�Y�lĈKaV�%M?�jh���J�~V��ZKh��n�.0�9������3�?�ZB��PhT��� �q�2�W�1kUf-�^��ШY�@n�9�Sshh6�0�굆�Y�� ��jJh ����Y�����7��P'�4M��`l�d�F�ШA��R�ܪ U� U�y�v��P���+�z�2z��t]�r`���+`�J�r$`��E�+-khTEՀ�,X5'�XQ+�؊Z��,ؔ�ܪ�Q �L�(�`�K1 _S)�F����<��Yɸ4�CKi�4- L ���N`Fh)ӯ�� � ����Hh�>�U� ��ؒ1ifc%�!:����ZF�'�VmZ���LH �t������` -X��`�Z �2X��a�0�,����$(l8-�1�ȴ�}�iq�y��~[�</>�w�lrXn7�f�����F�����MY����ͅcK�˛R���;s9���\f�w:ܙ�/�a����Kg.;zwi.slMΧ��\6�a�k�ͥ�ɗxw���U��չ?��V�B/p��xwsu &�vw��Ǭteg�R�/�=N��� [���x�s��-іG�1C>9��wصE�'t��xoM�yO�ލ�RL���\^�Y��/���<l��J���5�5��|pQ��1��'��3n��)���tc���� � ��3�:�̥��s��J��)�u� ��3�W�$G1u齢���\9�`���-��\y��1���4�Rg=����XFH����;@Y[d���V�Cdۄ�"��Bw�� ;�Q==�yx��S��&��|a�|x�q�l��f|P3b�op�e�y-"�0�cT91� _]�P�\����uQ�!��RH���Ҝz���Q��ı����"+��̱� p�:�(.�K'�]�(��$-Jbm�Y_�WN���8�M�Ϧ�;4ɑ��͐/TA_����r�g4����a���G�7��G��Րj���n2�6�Rv�O.���ǎ��U\*..�k�K;�Ac9����_�wM���e��耦��o�{�n��U�d�&N����s4��'�O��r���c�[?sr��5� Ӵ,V����5K���غ��'��* >)���F��p����_���ь�ӹ�PF3B�g5>{%{ �F�d�c���+���uk��ܫ��8����v���h> J|�E�d��lR���.\E �avB��t{'�X���7�_�=��֢��x��,����E~��R �F�\G��h��Q�Ǖ�#�N�f�f�P�����,���`%t���J�Ӕ&O���'RFfPFfQ&F�E���>��WE�<��%�[�<8�͝��±�͵&�r�p��{�#�4�NT�S�XЧe.T����~A�5Gܩ�X�g�]<�^;tL-M%�3pԩ8.hƻ�p��;���a��� ܚ��^�m�]�]��skW�nL^z��W�q� h�J;�b��jK@mZ��<p�|^_� ��o�h�v�17��u��I�5�Q�c�q����}�fϢ�� w��S�|�u:�)�p�� ̩�,[� ��'����{zn]҇p[�n�>�=g��i����jm�9E�c�yw=}/��fO'9:\m�Ǟ�o��n�M<�M<�Cm.�v�"R�^�䞒��P����4g��ˁ��(���"˶��w*|�9��쁆�M������P�>Gv�deI_Y���K��̰�L���|��pz>���+����ȳ�� �F���ڢ<�{��j��fiuZ�F�?����L�S�`t�轴��Hp��ﲟ�R�|a}���?��.ڽ�|m�s?�%b#2�����������}��C�|��U}[$��2�Q�42��S-(3,(��4B�i]���&�t�I��CK�vG���@��u��&��a� �/=�W�N~��2�IK���,��#�ٞ��"�-F����o�{}���o��P����ȿ �3���?�%=%�2(� ��g��g�q�YcL�;�> 8� ���� �:| ��;�������c�h.�J���� ��92�_WH Gf�#���y��V�. �����|O+��J��&u�U��߯�v��J���<`��~�T*��B���2���H�T����%S endstream endobj 404 0 obj << /Type /ObjStm /N 100 /First 897 /Length 1989 /Filter /FlateDecode >> stream x��ZKs9��W�H8��TE��e��x,{��;!K�]�1����=E$�z� �E�hԏ��uKQqRQi�9�2�)J��Y��0API��qE,g����5VJLd�PV�`�P�` ӄ� �B��Dp #��G$ad ����-t`X� 5�9�^q9BNqeX�3\Y��.)h�d�!%��Rn�i �tW�&Ec��D(�>B�<W�u4̓ Gh�(hpT��ZI�9:8ޔ54:t6�H%A���1�1D�ZJ�� �2�*�#:GQ=z+�%X�PMC k&�D�3��Q��! �B����z�� �ԕ�G�h~� �f�c jn`�����8��Δ F�T��B'��$@���ELE�:� �����Q;�`���H��p �� Y�l���` >����4Z�Gaer$ h�� ��-��������u A���$M� ت �@8+�@��<-�1����G`e�n�hU!��c ȁ�!��1�=�(�J�� F� ��K��|@B�V���[r�l�nE��{͢n/W�)�Sy@>��;�Z��>���b���HlNA �>�f��gl��̰i������\�{�mw�n��=�vv�rw�G7��I�w'|q�m�i�ؕ[�9���=�Ô���=���u�;<w�7#ǑU3���ٷ؝�����ub��r��-f#,f��?����g�N�����^D��f��ƃ�à��;��f�*⍛���w@��L�غ=s�xs X|X��������n�Oc�#��B�HϿ�y�͋(2W��V!�\D���Զ�B�H�W���^>�_�4�)B� B �q>]&��{��^j݂�!�P# P�nn"f��G}�X�Gm�M�1�A�;z��`[��*;c7�p����WED�q�n�)5�P0���;�\�)l��:y\39��N悱ʤ�|5j�5�IW^���Aj;q�_�Y�3��'�I{���w��Q��W��qb�/��^f��P_�^{9h���'���>�W��P2(1�b�չγ�N���G��C��| wu�>4�~��� F��B��;�D /��<�L���)d� Č~�1�h@x��u"yzo�d��AD����)�ωKd�8Uk�� c��`K���Ҽ�U$�Δ!����]s�_����*�W��~��{ܮ>qȟR��Hwh{�;|�6��[�i���D<O��!�L&��� ��:,ot��V۰�jD�9Y������*ʭ�=e��N��+=5p���?�$�&����L_U�sɅ���`�j�f�^��j�'��s��6��Bg��CP)��J�}��:\�2����.ҽ.һʽy��q» �-�"���h����A���W�+�I��Ph������6���ҬFv��|���U����MȬ>0��M��`�vD�����eHe>�6�F��6?v�_�q�)� �c���=��g�MHV�X���v���)�Ӡ3Q��i%�0=�ɋI`�lym��@�µ������Z�.l�e����&���H���Y��l��}�3�EMy��<r�%��D� q�\>�l�d�Yb@d�td=�DٰPb?wn=q�����o a ��m��H�|?��C/\�%22�R�q���(b�ިsW_�]ɪTXx�2w˰����6��:�^�-�&�xzo�F%���`�h��y����K��HH �ny�ĩsM�yl�y�'�e��y�'��G�̣2u��;��:܇{瓦d���\,����^�?]�[�{���9�(|:R�����d��o�A�y���G²�\�ޙ�%��b����'a�nË�ehȈ<����fN^=�qT�>�C�� ���_0��|�����Ӟ�О�Y�))V�<d�˾���0y��Q���?(���G���'�7n��J�`�W�V7 endstream endobj 605 0 obj << /Type /ObjStm /N 100 /First 894 /Length 1484 /Filter /FlateDecode >> stream x��Z�n7}�W�1 �����{��hR�"ˎ�֖KJ���EE�J+-��b�f�!9�37r);i�Na Qh���B[����O/�!�4����у��PR�iJ9����Q(�4�i�,s��<�'�v��C�J�:,�"˱)9p��V�um@#`���:@ A[��!�=s�Ф�� �:��$|t�X�Artv� ����sQ�ky�F��kȣ�;a*3 ����&