# Copyright (c) 2013-2015 Mellanox Technologies, Inc.
#                         All rights reserved
# $COPYRIGHT$


* What is libibprof

- Libibprof is a profiling library for OFA verbs library and Mellanox MXM/HCOLL libraries.
- Libibprof has plugin for error injection into verb library API to simulate network failures.

It is a portable profiling infrastructure for parallel codes. It provides low-overhead performance
summary of the calls from libibverbs.so, libmxm.so, libhcoll.so libraries.



* Usage Examples:

** From verbs application

% LD_PRELOAD=libibprof.so ibv_devinfo

===============================================================================================

libibverbs                     :      count    total(ms)      avg(ms)      max(ms)      min(ms)
===============================================================================================
ibv_get_device_list            :          1       0.8897       0.8897       0.8897       0.8897
ibv_free_device_list           :          1       0.0001       0.0001       0.0001       0.0001
ibv_open_device                :          2       2.7479       1.3739       2.4120       0.3358
ibv_close_device               :          2       1.7194       0.8597       1.6812       0.0382
ibv_query_port                 :          4       1.8440       0.4610       0.8201       0.1702
ibv_exp_query_device           :          2       0.3972       0.1986       0.2835       0.1137
===============================================================================================
total                          :                  7.5982
===============================================================================================
wall time (%)                  :                  0.0010 %
===============================================================================================

<snip>

** From MPI:

% LD_PRELOAD=libibprof.so mpirun -x LD_PRELOAD -np 8 mpi_hello

Hello from task 1 on jenkins01!
Hello from task 3 on jenkins01!
Hello from task 5 on jenkins01!
Hello from task 7 on jenkins01!
Hello from task 2 on jenkins01!
Hello from task 6 on jenkins01!
Hello from task 0 on jenkins01!
Hello from task 4 on jenkins01!

===============================================================================================

libibverbs                     :      count    total(ms)      avg(ms)      max(ms)      min(ms)
===============================================================================================
ibv_get_device_list            :          1       2.6830       2.6830       2.6830       2.6830
ibv_free_device_list           :          1       0.0003       0.0003       0.0003       0.0003
ibv_open_device                :          1       0.4915       0.4915       0.4915       0.4915
ibv_close_device               :          1       0.0357       0.0357       0.0357       0.0357
ibv_create_comp_channel        :          2       0.0093       0.0047       0.0050       0.0044
ibv_destroy_comp_channel       :          2       0.0074       0.0037       0.0038       0.0037
ibv_query_port                 :          3       1.3320       0.4440       0.6961       0.1486
ibv_alloc_pd                   :          1       0.0041       0.0041       0.0041       0.0041
ibv_dealloc_pd                 :          1       0.0042       0.0042       0.0042       0.0042
ibv_dereg_mr                   :          3       2.2027       0.7342       1.4345       0.3286
ibv_create_cq                  :          3      12.4912       4.1637       6.6688       2.4448
ibv_poll_cq                    :        350       0.1092       0.0003       0.0021       0.0000

===============================================================================================

<snip>


* How to install:

  The libibprof package uses the GNU autotools compilation and installation
  framework.

    $ ./autogen.sh
    $ ./configure --prefix=<path to install>
    $ make
    $ make install

  To compile with debug symbols and information:

    $ ./configure --prefix=<path to install> --enable-debug

  Use special environment variable to tune debug output

    $ export IBPROF_TEST_MASK=0xFF

  Bit fields:
    0 - fatal
    1 - error
    2 - warn
    3 - info
    4 - trace

  To compile with custom OFED:

    $ ./configure --prefix=<path to install> --with-ofed=<path to ofed>

  Type './configure --help' for a list of all the configure
  options. Some of the options are generic autoconf options, while the ibprof
  specific options are prefixed with "IBPROF:" in the help text.

  Available modules can be managed during build procedure with CPPFLAGS (-DUSE_XXX=(0|1)):

    $ ./configure --prefix=<path to install> --with-ofed=<path to ofed> CPPFLAGS="-I/opt/mellanox/mxm/include -DUSE_MXM=1"


    USE_IBV  - libibverbs (set as default)
    USE_HCOL - libhcoll
    USE_MXM  - libmxm
    USE_PMIX - libpmix
    USE_SHMEM - liboshmem

  You also can enable/disable modules at runtime, it's not mean that they won't trap function calls, but it's a way to determine
  output from which modules you want to seen at the end of run. See example below.

    $ export IBPROF_MODE=USE_IBV=0,USE_HCOL=1

  Use this string to enable libibverbs and disable libhcoll profiling. Input string is case insensitive and separated by commas as
  shown in example.
  Possible values are:

    0 - none (transparent mode)
    1 - time profiling
    2 - error injection:
        IBPROF_ERR_SEED - value for random generator
        IBPROF_ERR_PERCENT - % of failures
    3 - verbose
        IBPROF_TEST_MASK - 5th bit should be ON

  You can separate information related processes in different files using

    $ export IBPROF_DUMP_FILE=<file>

  Special symbols in file name:

    %J - Job ID
    %H - Host name
    %T - Process ID (rank)

  Or you can use following options to prefix output from each process with it's hostname and pid

    $ export IBPROF_OUTPUT_PREFIX=1

  You can specify output format as xml to ease gathering results with parsing scripts.

    $ export IBPROF_FORMAT=xml

  Like IBPROF_MODE option, format option is also case insensitive.

  Use following variable to exclude first <count>  of measurements from result

    $ export IBPROF_WARMUP_NUMBER=<count>

  Set output time units using IBPROF_TIME_UNITS parameter, Possible values are:

    0 - seconds
    1 - milliseconds (default value)
    2 - microseconds

* How to use:

    $ LD_PRELOAD=<path to install>/lib/libibprof.so ibv_devinfo

* Measuring arbitrary intervals:

  In order to measure an arbitrary interval of code flow with ibprof one can use 2 APIs: ibprof_interval_start(int,char *), ibprof_interval_end(int).
  These two calls correspond to the start and end of the interval being measured respectively. The int argument to the calls is interval unique identifier,
  i.e. for the same interval int id for ibprof_interval_start and ibprof_interval_end should match and no other interval should use the same id.
  The char * argument is a string parameter that will be used in the output to describe the interval. For example:

  ibprof_interval_start(111, "some interval");
  <.... your code you want to profile ....>
  ibprof_interval_end(111);

  Don't forget to preload libibprof when running tests.

Good luck!

