A thin python wrapper for the nvToolsExt (NVTX) library, using pybind11. This wrapper is meant to be as thin as possible -- so only provides minimal support. Currently supported features are:
- NVTX annotations:
nvtxRangePushAandnvtxRangePop - Function decorator:
PyNVTX.annotate - Automatic decorator generation
PyNVTX.annotate_all_methods(<class name>)
Ensure that the nvcc is in your PATH -- or alternatively ensure that the
CUDAHOME environment variable points to your local CUDA install. To install,
either
pip install PyNVTX
or clone this repo and
python setup.py install
You know what would suck? If including PyNVTX required CUDA to be installed?
Why? There are loads of applications that support CUDA, if available. And
default to the CPU-only version otherwise. PyNVTX is the same. If nvcc in
not in your PATH (nor in your CUDAHOME), then you'll see this warning:
*** WARNING: The nvcc binary could not be located in your $PATH. Either add it to your path, or set $CUDAHOME
(note that it will not warn you if you're installing with pip) and PyNVTX
will still install (it just won't do anything). You can check if a local
version of PyNVTX has been built with CUDA support by checking:
PyNVTX.cuda_enabled # True if compiled with CUDA supportimport PyNVTX as nvtx
nvtx.RangePushA("Doing some work")
# code to time goes here
nvtx.RangePop()The PyNVTX.annotate will put RangePushA and RangePop the the beginning and of
the function call:
import PyNVTX as nvtx
@nvtx.annotate("test_function")
def test():
# You code goes hereThe PyNVTX.annotate_all_methods will automatically decorate all methods in a
class, as well as all methods it inherits. A guard prevents accidentally
decorating any method twice. Eg.:
import PyNVTX as nvtx
class MyClassA(object):
def __init__(self):
pass
def f(self):
pass
class MyClassB(MyClassA):
def __init__(self):
pass
def g(self):
pass
nvtx.annotate_all_methods(MyClassB)Will instrument MyClassB's __init__, as well as f and g, but not
MyClassA's __init__.
Adding a class/method name to PyNVTX.REGISTRY will prevent it from being
instrumented by PyNVTX.annotate_all_methods. For example:
nvtx.REGISTRY.add(MyClassB, "f") # note the method name is a string
nvtx.annotate_all_methods(MyClassB)will not instrument f.
To get you started, take a look at test/test-nvtx.py