/**
* @file: README
* CVS: $Id$
* @author: Asim YarKhan
* yarkhan@icl.utk.edu
* @defgroup papi_components Components
* @brief Component Specific Readme file: libmsr
*/
/** @page component_readme Component Readme
@section Component Specific Information
libmsr/
NOTE: This libmsr component is an initial version, and has been tested
with libmsr (v0.1.17 11/2015) and the msr_safe kernel module (19/2015
version).
https://github.com/scalability-llnl/libmsr
https://github.com/scalability-llnl/msr-safe
The PAPI libmsr component supports measuring and capping power usage
on recent Intel architectures using the RAPL interface exposed through
MSRs (model-specific registers).
Lawrence Livermore National Laboratory has released a library (libmsr)
designed to provide a simple, safe, consistent interface to several of
the model-specific registers (MSRs) in Intel processors. The problem
is that permitting open access to the MSRs on a machine can be a
safety hazard, so access to MSRs is usually limited. In order to
encourage system administrators to give wider access to the MSRs on a
machine, LLNL has released a Linux kernel module (msr_safe) which
provides safer, white-listed access to the MSRs.
PAPI has created a libmsr component that can provide read and write
access to the information and controls exposed via the libmsr library.
This PAPI component introduces a new ability for PAPI; it is the first
case where PAPI is writing information to a counter as well as reading
the data from the counter.
--------------------------------------------------
ENABLE ACCESS TO THE MSRS (MODEL SPECIFIC REGISTERS)
https://github.com/scalability-llnl/msr-safe
To use this component, the system will need to provide access to Model
Specific Registers (MSRs) from user space. The actions described
below will generally require superuser ability. Note, these actions
may have security and performance consequences, so please make sure
you know what you are doing.
OPTION 1: EITHER: Enable MSR access using msr-safe
Install the msr-safe module from LLNL,
lsmod | grep msr (should show msr_safe)
Use chmod to set site-appropriate access permissions (e.g. 766) for
/dev/cpu/*/msr_safe /dev/cpu/msr_batch /dev/cpu/msr_whitelist
Load a whitelist appropriate for your machine
e.g. for SandyBridge:
cat msr-safe/whitelists/wl_062D > /dev/cpu/msr_whitelist
OPTION 2: OR: Enable MSR access via the filesystem and elevated permissions.
Or, enable access to the standard MSRs filesystem
For Linux kernel version < 3.7, using only file system checks
chmod 666 /dev/cpu/*/msr
For Linux kernel version >= 3.7, using capabilities
chmod 666 /dev/cpu/*/msr
The final executable needs CAP_SYS_RWIO to open MSR device files [1]
setcap cap_sys_rawio=ep <user_executable>
The final executable cannot be on a shared network partition.
The dynamic linker on most operating systems will remove variables
that control dynamic linking from the environment of executables
with extended rights, such as setuid executables or executables
with raised capabilities. One such variable is
LD_LIBRARY_PATH. Therefore, executables that have the RAWIO
capability can only load shared libraries from default system
directories.
One can work around this restriction by either installing the
shared libraries in system directories, linking statically against
those libraries, or using the -rpath linker option to specify the
full path to the shared libraries during the linking step.
--------------------------------------------------
COMPILE THE LIBMSR LIBRARY TO ACCESS THE MSRS
https://github.com/scalability-llnl/libmsr
Get the library and follow the instructions to build using CMake.
This library contains a subdirectory, test, which will exercise the
functionality.
--------------------------------------------------
CONFIGURING THE PAPI LIBMSR COMPONENT
Set libmsr library and header files by configuring within the component.
% cd <papi_dir>/src/components/libmsr
% ./configure --with-libmsr-incdir=<PATH> --with-libmsr-libdir=<PATH>
Then, at the higher src dirctory, configure with this component
% cd <papi_dir>/src
% ./configure --with-components="libmsr"
or if you want to specify the compilers and enable debug.
% ./configure CC=gcc F77=gfortran --with-debug --with-components="libmsr"
Finally, follow the standard PAPI build (make) instructions
% make
To use the module, make sure that the libraries are accessible.
% export LD_LIBRARY_PATH=${PAPIDIR}/src:${PAPIDIR}/src/libpfm4/lib:${LIBMSRDIR}/lib:${LD_LIBRARY_PATH}
To check the installation, the following should show some available counters
% ./utils/papi_native_avail | grep libmsr
To check the installation, the following should some counter values
% ./utils/papi_native_avail -e "libmsr:::PKG_WATTS:PACKAGE0"
% ./utils/papi_command_line "libmsr:::PKG_WATTS:PACKAGE0"
% ./utils/papi_command_line "libmsr:::PKG_DELTA_ENERGY:PACKAGE0"
--------------------------------------------------
USE THE PAPI LIBMSR COMPONENT
See the components/libmsr/utils/README file for instructions. This
test demonstrates how to write power constraints, and gives an
estimate of the overheads for reading and writing information to the
RAPL MSRs.
[1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=c903f0456bc69176912dee6dd25c6a66ee1aed00
*/