1
1
This commit was SVN r19589.
Этот коммит содержится в:
Jeff Squyres 2008-09-19 14:49:53 +00:00
родитель 7d119a1c3b
Коммит b1ff61b19e
4 изменённых файлов: 150 добавлений и 99 удалений

Просмотреть файл

@ -13,7 +13,54 @@ $HEADER$
=========================================================================== ===========================================================================
This is the Portable Linux Processor Affinity (PLPA) package This is the Portable Linux Processor Affinity (PLPA) package
(pronounced "pli-pa"). It is intended for developers who wish to use (pronounced "pli-pa"). The PLPA has evolved over time to provide the
following capabilities:
1. Provide a stable API on Linux for processor affinity (Linux has
provided three different API signatures over time).
2. Provide a simple API that translates between Linux processor ID and
(socket ID, core ID) tuples, and allows querying processor topology
information on supported platforms.
3. Provide a command-line executable (plpa-taskset(1)) that provides
all the same functionality as the venerable taskset(1) command, and
several extensions, including the ability to bind processes to
specific (socket, core) tuples on supported platforms.
Note that the PLPA is fully embeddable, meaning that it can be wholly
contained in larger software packages that wish to have a single,
stable version of processor affinity API functionality. See below for
more details on embedding.
Also note that PLPA's socket/core and other topology information is
only available on certain platforms. Specifically, PLPA reads the
/sys filesystem to glean its information; if your system does not
export processor topology information through /sys, the PLPA cannot
provide that information. For example, AMD/Intel processor topology
support was included in Linux kernel v2.6.16, but POWER processor
topology information is not yet supported as of Linux kernel v2.6.26.
In a world where the processor counts in hosts are [again] increasing,
particularly where at least some of them are NUMA-based architectures,
processor affinity is becoming more important. We hope that the PLPA
is helpful to you. Enjoy.
Note that if you're looking into processor affinity, and if you're on
a NUMA machine, you probably also want to look into libnuma:
ftp://ftp.suse.com/pub/people/ak/numa/
If you are a developer, keep reading. If you are a system
administrator or other end-user, you're probably more interested in
using the plpa-info(1) and plpa-taskset(1) executable commands; see
the output of "plpa-info" and "plpa-taskset --help" for more
information.
===========================================================================
The following text is specific technical information about the
original problem that PLPA Was created to solve.
The original intent for the PLPA was for developers who wished to use
Linux processor affinity via the sched_setaffinity() and Linux processor affinity via the sched_setaffinity() and
sched_getaffinity() library calls, but don't want to wade through the sched_getaffinity() library calls, but don't want to wade through the
morass of 3 different APIs that have been offered through the life of morass of 3 different APIs that have been offered through the life of
@ -38,30 +85,13 @@ that developers can write to. It provides three things:
2. A run-time test and dispatch that will invoke the Right back-end 2. A run-time test and dispatch that will invoke the Right back-end
API depending on what back-end API the system you are running on API depending on what back-end API the system you are running on
has. has.
3. Mapping information between (socket, core) tuples and Linux virtual 3. Mapping information between (socket ID, core ID) tuples and Linux
processor IDs. virtual processor IDs.
This package is actually pretty small. It does not attempt to have
many extra bells and whistles. Anyone could write it and package it.
We did it simply because it appears that no one else has yet done
this. In a world where larger scale SMPs are [again] becoming more
common, particularly where at least some of them are NUMA-based
architectures, processor affinity is going to become more and more
important. Just because developers have not yet realized that they
have this problem does not mean that they won't evenutally figure it
out. :-)
Note that if you're looking into processor affinity, if you're on a
NUMA machine, you probably also want to look into libnuma:
ftp://ftp.suse.com/pub/people/ak/numa/
We hope that PLPA helps you.
=========================================================================== ===========================================================================
What, exactly, is the problem? What, exactly, is the problem? History.
------------------------------ ----------------------------------------
There are at least 3 different ways that sched_setaffinity is There are at least 3 different ways that sched_setaffinity is
implemented in glibc (only one of which is documented in the implemented in glibc (only one of which is documented in the
@ -204,31 +234,37 @@ How do I use PLPA?
There are three main uses of the PLPA: There are three main uses of the PLPA:
1. Using the plpa-info executable to check if your system supports 1. Using the plpa-info(1) executable to check if your system supports
processor affinity and the PLPA can determine which to use at run-time. processor affinity and the PLPA can determine which to use at
2. Developers using the PLPA library to enable source and binary Linux run-time.
processor affinity portability. 2. Developers using the PLPA library both to enable source and binary
3. Using the plpa-taskset executable to bind arbitrary executables to Linux processor affinity portability, and to write
Linux virtual procesor IDs and/or specific sockets/core. processor-topology-aware applications.
3. Using the plpa-taskset(1) executable to bind arbitrary executables
to Linux virtual processor IDs and/or specific socket/core tuples.
In more detail: In more detail:
1. The plpa-info executable is a simple call into the PLPA library 1. The plpa-info(1) executable is a few simple calls into the PLPA
that checks which API variant the system it is running on has. If library that checks which API variant the system it is running on
the kernel supports processor affinity and the PLPA is able to has. If the kernel supports processor affinity and the PLPA is
figure out which API variant to use, it prints "Kernel affinity able to figure out which API variant to use, it prints "Kernel
support: no". Other responses indicate an error. affinity support: no". Other responses indicate an error. The
"--topo" switch will print out basic topology information about
your system, if supported.
Since the PLPA library abstracts this kind of problem away, this is Since the PLPA library abstracts this kind of problem away, this is
more a diagnostic tool than anything else. Note that plpa-info is more a diagnostic tool than anything else.
*only* compiled and installed if PLPA is installed as a standalone
package (see below).
See "plpa-info --help" for more information. A man page does not See "plpa-info --help" for more information. A man page does not
yet exist, unfortunately. yet exist, unfortunately.
Note that plpa-info is *only* compiled and installed if PLPA is
installed as a standalone package (see below).
2. Developers can use this package by including the <plpa.h> header 2. Developers can use this package by including the <plpa.h> header
file and using the following prototypes: file and using the following prototypes for setting and getting
processor affinity:
int plpa_sched_setaffinity(pid_t pid, size_t cpusetsize, int plpa_sched_setaffinity(pid_t pid, size_t cpusetsize,
const plpa_cpu_set_t *cpuset); const plpa_cpu_set_t *cpuset);
@ -259,15 +295,32 @@ In more detail:
Note that all four macros take a *pointer* to a plpa_cpu_set_t, as Note that all four macros take a *pointer* to a plpa_cpu_set_t, as
denoted by "&cpuset" in the descriptions above. denoted by "&cpuset" in the descriptions above.
The following API functions are also available on kernels that Also note that he PLPA distinguishes between Linux processor,
support topology information (e.g., 2.6.16 or later): socket, and core IDs and processor, socket, and core numbers. The
*Linux IDs* are kernel-assigned integer values that do not
necessarily start with zero and are not necessarily contiguous.
The *numbers* start with 0 and are contiguous to (N-1). The
numbers are therefore mainly a human convenience; they may or may
not exactly correspond to the Linux IDs; it is safest to assume
that they do not.
The following API functions are also available on supported
platforms with kernels that support topology information (e.g.,
AMD/Intel platforms with Linux kernel v2.6.16 or later). The list
below is a summary only; see plpa.h for a specific list of function
signatures:
- plpa_have_topology_information()
Will return 1 if the PLPA is able to provide topology
information, 0 otherwise. If 0 is returned, all the functions
below will return a negative value to signify a graceful failure.
- plpa_map_to_processor_id() - plpa_map_to_processor_id()
Take a (socket_id, core_id) tuple and map it to a Linux processor Take a (socket ID, core ID) tuple and map it to a Linux processor
ID ID
- plpa_map_to_socket_core() - plpa_map_to_socket_core()
Take a Linux processor ID and map it to a (socket_id, core_id) Take a Linux processor ID and map it to a (socket ID, core ID)
tuple tuple
- plpa_get_processor_info() - plpa_get_processor_info()
@ -296,15 +349,24 @@ In more detail:
(starting with 0) (starting with 0)
- plpa_get_core_flags() - plpa_get_core_flags()
Return whether a (socket_id,core_id) tuple exists, and if so, if Return whether a (socket ID,core ID) tuple exists, and if so, if
it is online it is online
- plpa_set_cache_behavior() - plpa_set_cache_behavior()
Tell PLPA to use (or not) a local cache for the topology Tell PLPA to use (or not) a local cache for the topology
information, or to refresh the cache right now information, or to refresh the cache right now
*** NOTE: Topology information (i.e., (socket_id, core_id) tuples) - plpa_finalize()
are not reported for offline processors. Hence, if any Release all internal resources allocated and maintained by the
PLPA. It is permissible to invoke other PLPA functions after
plpa_finalize(), but if you want to release PLPA's resources, you
will need to invoke plpa_finalize() again. Note that it is not
necessary (but harmless) to invoke plpa_finalize() on systems
where plpa_have_topology_information() returns that the topology
information is not supported.
*** NOTE: Topology information (i.e., (socket ID, core ID) tuples)
may not be reported for offline processors. Hence, if any
processors are offline, the socket/core values returned by PLPA processors are offline, the socket/core values returned by PLPA
will likely change once the processor is brought back online. will likely change once the processor is brought back online.
Sorry; this is how the Linux kernel works -- there's nothing Sorry; this is how the Linux kernel works -- there's nothing
@ -313,41 +375,16 @@ In more detail:
The above functions are slightly more documented in plpa.h. The above functions are slightly more documented in plpa.h.
Contributions of real man pages would be greatly appreciated. Contributions of real man pages would be greatly appreciated.
On unsupported kernels, a negative value is returned to indicate 3. The plpa-taskset(1) executable represents an evolution of the
graceful failure. Additionally, the function
plpa_have_topology_information() can be called to determine whether
a kernel supports the topology information or not. It returns 1 if
the information is available (and therefore the above plpa_*()
functions return meaningful values) or 0 if the information is
unavailable (and therefore the above plpa_*() functions return a
negative value indicating failure).
Note that invoking any of the topology functions (including
plpa_have_topology_information()) will allocate memory from the
heap. To release this memory, call plpa_finalize().
Note that the special case of invoking any of the topology
functions on an unsupported kernel will not allocate any memory;
invoking plpa_finalize() is therefore unnecessary, but harmless.
See plpa.h for a bit more information on these functions. Detailed
documentation such as man pages is still lacking, unfortunately.
3. The plpa-taskset executable represents an evolution of the
venerable "taskset(1)" command. It allows binding of arbitrary venerable "taskset(1)" command. It allows binding of arbitrary
processes to specific Linux virtual processors and/or specific processes to specific Linux processor IDs and/or specific (socket
sockets/cores. It supports all the same command line syntax of the ID, core ID) tuples. It supports all the same command line syntax
taskset command, but also supports additional syntax for specifying of the taskset(1) command, but also supports additional syntax for
sockets/cores (plpa-taskset will figure out the mapping from the specifying socket and core IDs. Hence, you can launch
socket/core specification to the appropriate Linux virtual processor-bound jobs without needing to modify their source code to
processor IDs). call the PLPA library. See "plpa-taskset --help" for more
information on the command line options available, and brief
Hence, you can launch processor-bound jobs without needing to examples of usage. A man page does not yet exist, unfortunately.
modify their source code to call the PLPA library.
See "plpa-taskset --help" for more information on the command line
options available, and brief examples of usage. A man page does
not yet exist, unfortunately.
=========================================================================== ===========================================================================
@ -372,7 +409,8 @@ step as root or some other privileged user.
- <plpa.h> in $includedir (typically $prefix/include) - <plpa.h> in $includedir (typically $prefix/include)
- libplpa.la and libplpa.a and/or libplpa.so in $libdir (typically - libplpa.la and libplpa.a and/or libplpa.so in $libdir (typically
$prefix/lib) $prefix/lib)
- plpa-info executable in $bindir (typically $prefix/bin) - plpa-info(1) executable in $bindir (typically $prefix/bin)
- plpa-taskset(1) executable in $bindir (typically $prefix/bin)
Note that since PLPA builds itself with GNU Libtool, it can be built Note that since PLPA builds itself with GNU Libtool, it can be built
as a static or shared library (or both). The default is to build a as a static or shared library (or both). The default is to build a
@ -388,8 +426,8 @@ as root or some privileged user).
=========================================================================== ===========================================================================
How do I include PLPA in my software package? How do I include/embed PLPA in my software package?
--------------------------------------------- ---------------------------------------------------
It can be desirable to include PLPA in a larger software package It can be desirable to include PLPA in a larger software package
(be sure to check out the LICENSE file) so that users don't have to (be sure to check out the LICENSE file) so that users don't have to
@ -400,7 +438,7 @@ with it?).
When used in "included" mode, PLPA will: When used in "included" mode, PLPA will:
- not install any header files - not install any header files
- not build or install plpa-info or plpa-taskset - not build or install any executables
- not build libplpa.* -- instead, it will build libplpa_included.* - not build libplpa.* -- instead, it will build libplpa_included.*
There are two ways to put PLPA into "included" mode. From the There are two ways to put PLPA into "included" mode. From the
@ -483,6 +521,7 @@ PLPA_INIT *must* be invoked if using the m4 macros):
Here's an example of integrating with a larger project named sandbox: Here's an example of integrating with a larger project named sandbox:
----------
shell$ cd sandbox shell$ cd sandbox
shell$ cp -r /somewhere/else/plpa-<version> plpa shell$ cp -r /somewhere/else/plpa-<version> plpa
shell$ edit acinclude.m4 shell$ edit acinclude.m4
@ -491,6 +530,7 @@ shell$ edit Makefile.am
...add "plpa" to SUBDIRS... ...add "plpa" to SUBDIRS...
...add "$(top_builddir)/plpa/src/libplpa/libplpa_included.la" to ...add "$(top_builddir)/plpa/src/libplpa/libplpa_included.la" to
my executable's LDADD line... my executable's LDADD line...
...add "-I$(top_builddir)/plpa/src/libplpa" to AM_CPPFLAGS
shell$ edit configure.ac shell$ edit configure.ac
...add "PLPA_INCLUDED" line... ...add "PLPA_INCLUDED" line...
...add "PLPA_SET_SYMBOL_PREFIX(sandbox_plpa_)" line... ...add "PLPA_SET_SYMBOL_PREFIX(sandbox_plpa_)" line...
@ -507,6 +547,7 @@ shell$ ./configure
...lots of output... ...lots of output...
shell$ make shell$ make
...lots of output... ...lots of output...
----------
=========================================================================== ===========================================================================
@ -527,6 +568,8 @@ int main(int argc, char* argv[]) {
plpa_api_type_t p; plpa_api_type_t p;
if (0 == plpa_api_probe(&p) && PLPA_PROBE_OK == p) { if (0 == plpa_api_probe(&p) && PLPA_PROBE_OK == p) {
printf("All is good!\n"); printf("All is good!\n");
} else {
printf("Looks like PLPA is not working\n");
} }
return 0; return 0;
} }
@ -567,10 +610,9 @@ the BSD license.
How do I get involved in PLPA? How do I get involved in PLPA?
------------------------------ ------------------------------
Hopefully, PLPA is so simple that it won't need to be modified much The PLPA continues to evolve, particularly as core counts increase and
after its first few releases. However, it is possible that we'll need internal host topology becomes more important. We want to hear your
to modify the run-time test if new variants of the Linux processor opinions.
affinity API emerge.
The best way to report bugs, send comments, or ask questions is to The best way to report bugs, send comments, or ask questions is to
sign up on the user's mailing list: sign up on the user's mailing list:
@ -586,3 +628,10 @@ list:
http://www.open-mpi.org/mailman/listinfo.cgi/plpa-users http://www.open-mpi.org/mailman/listinfo.cgi/plpa-users
Thanks for your time. Thanks for your time.
LocalWords: pli plpa taskset sys AMD sched setaffinity getaffinity Ick pid sg
LocalWords: len distros cpusetsize const cpu cpuset fdset ISSET MDK num CLR
LocalWords: etaffinity includedir libplpa libdir bindir acinclude INIT init
LocalWords: INLCLUDED config SUBDIRS contrib CONDITIONALs cd cp builddir src
LocalWords: executable's LDADD CPPFLAGS aclocal autoconf libtoolize automake
LocalWords: argc argv api printf lplpa gcc

Просмотреть файл

@ -16,7 +16,7 @@ release=0
# requirement is that it must be entirely printable ASCII characters # requirement is that it must be entirely printable ASCII characters
# and have no white space. # and have no white space.
greek=b5 greek=rc1
# If want_svn=1, then the SVN r number will be included in the overall # If want_svn=1, then the SVN r number will be included in the overall
# PLPA version number in some form. # PLPA version number in some form.
@ -33,4 +33,4 @@ want_svn=0
# distribution tarball is being made from an SVN checkout, the value # distribution tarball is being made from an SVN checkout, the value
# of svn_r in this file is replaced with the output of "svnversion". # of svn_r in this file is replaced with the output of "svnversion".
svn_r=r213 svn_r=r217

20
opal/mca/paffinity/linux/plpa/configure поставляемый
Просмотреть файл

@ -1,6 +1,6 @@
#! /bin/sh #! /bin/sh
# Guess values for system-dependent variables and create Makefiles. # Guess values for system-dependent variables and create Makefiles.
# Generated by GNU Autoconf 2.62 for plpa 1.2b2. # Generated by GNU Autoconf 2.62 for plpa 1.2b6.
# #
# Report bugs to <http://www.open-mpi.org/community/help/>. # Report bugs to <http://www.open-mpi.org/community/help/>.
# #
@ -745,8 +745,8 @@ SHELL=${CONFIG_SHELL-/bin/sh}
# Identity of this package. # Identity of this package.
PACKAGE_NAME='plpa' PACKAGE_NAME='plpa'
PACKAGE_TARNAME='plpa' PACKAGE_TARNAME='plpa'
PACKAGE_VERSION='1.2b2' PACKAGE_VERSION='1.2b6'
PACKAGE_STRING='plpa 1.2b2' PACKAGE_STRING='plpa 1.2b6'
PACKAGE_BUGREPORT='http://www.open-mpi.org/community/help/' PACKAGE_BUGREPORT='http://www.open-mpi.org/community/help/'
# Factoring default headers for most tests. # Factoring default headers for most tests.
@ -1482,7 +1482,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing. # Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh. # This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF cat <<_ACEOF
\`configure' configures plpa 1.2b2 to adapt to many kinds of systems. \`configure' configures plpa 1.2b6 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]... Usage: $0 [OPTION]... [VAR=VALUE]...
@ -1552,7 +1552,7 @@ fi
if test -n "$ac_init_help"; then if test -n "$ac_init_help"; then
case $ac_init_help in case $ac_init_help in
short | recursive ) echo "Configuration of plpa 1.2b2:";; short | recursive ) echo "Configuration of plpa 1.2b6:";;
esac esac
cat <<\_ACEOF cat <<\_ACEOF
@ -1676,7 +1676,7 @@ fi
test -n "$ac_init_help" && exit $ac_status test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then if $ac_init_version; then
cat <<\_ACEOF cat <<\_ACEOF
plpa configure 1.2b2 plpa configure 1.2b6
generated by GNU Autoconf 2.62 generated by GNU Autoconf 2.62
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
@ -1690,7 +1690,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake. running configure, to aid debugging if configure makes a mistake.
It was created by plpa $as_me 1.2b2, which was It was created by plpa $as_me 1.2b6, which was
generated by GNU Autoconf 2.62. Invocation command line was generated by GNU Autoconf 2.62. Invocation command line was
$ $0 $@ $ $0 $@
@ -2408,7 +2408,7 @@ fi
# Define the identity of the package. # Define the identity of the package.
PACKAGE='plpa' PACKAGE='plpa'
VERSION='1.2b2' VERSION='1.2b6'
# Some tools Automake needs. # Some tools Automake needs.
@ -12669,7 +12669,7 @@ exec 6>&1
# report actual input values of CONFIG_FILES etc. instead of their # report actual input values of CONFIG_FILES etc. instead of their
# values after options handling. # values after options handling.
ac_log=" ac_log="
This file was extended by plpa $as_me 1.2b2, which was This file was extended by plpa $as_me 1.2b6, which was
generated by GNU Autoconf 2.62. Invocation command line was generated by GNU Autoconf 2.62. Invocation command line was
CONFIG_FILES = $CONFIG_FILES CONFIG_FILES = $CONFIG_FILES
@ -12722,7 +12722,7 @@ Report bugs to <bug-autoconf@gnu.org>."
_ACEOF _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_version="\\ ac_cs_version="\\
plpa config.status 1.2b2 plpa config.status 1.2b6
configured by $0, generated by GNU Autoconf 2.62, configured by $0, generated by GNU Autoconf 2.62,
with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"

Просмотреть файл

@ -285,7 +285,9 @@ static void load_cache(void)
} else { } else {
map_processor_id_to_tuple[i].online = 1; map_processor_id_to_tuple[i].online = 1;
} }
close(fd); if (fd >= 0) {
close(fd);
}
/* Core ID */ /* Core ID */
sprintf(path, "%s/devices/system/cpu/cpu%d/topology/core_id", sprintf(path, "%s/devices/system/cpu/cpu%d/topology/core_id",