Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add python support to ITT API #145

Merged
merged 13 commits into from
Jun 20, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions pyitt/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
*.pyc
build
dist
pyitt.egg-info
venv
__pycache__
.coverage
11 changes: 11 additions & 0 deletions pyitt/MANIFEST.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
include README.md
include MANIFEST.in
include pyproject.toml
include setup.py
recursive-include pyitt *.py
recursive-include pyitt.native *.cpp *.hpp
recursive-include ../include *.h
recursive-include ../LICENSES *
recursive-include ../src *
include ../README.md
include ../SECURITY.md
106 changes: 106 additions & 0 deletions pyitt/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
# pyitt

pyitt is a Python binding to Intel Instrumentation and Tracing Technology (ITT) API. It provides a convenient way
to mark up the Python code for further performance analysis using performance analyzers from Intel like Intel VTune
or others.

pyitt supports following ITT APIs:
- Collection Control API
- Domain API
- Event API
- Id API
- String Handle API
- Task API
- Thread Naming API

## Usage

The main goal of the project is to provide the ability to instrument a Python code using ITT API in the Pythonic way.
pyitt provides wrappers that simplify markup of Python code.

```python
import pyitt

@pyitt.task
def workload():
pass

workload()
```

`pyitt.task` can be used as a decorator. In this case, the name of a callable object (`workload` function in this
example) will be used as a name of the task and the task will be attributed to a default domain named 'pyitt'.
If you want to change the default name and/or other parameters for the task (e.g. task domain), you can pass
them as arguments to `pyitt.task`:

```python
import pyitt

@pyitt.task('My Task', domain='My Task Domain')
def workload():
pass

workload()
```

Also, `pyitt.task` returns the object that can be used as a context manager:

```python
import pyitt

with pyitt.task():
# some code here...
pass
```

If the task name is not specified, the `pyitt.task` uses call site information (filename and line number) to give
the name to the task. A custom name for the task and other task parameters can be specified via arguments
for `pyitt.task` in the same way as for the decorator form.

## Installation

[TODO] pyitt package is available on PyPi and can be installed in the usual way for the supported configurations:

[TODO] pip install intel-pyitt

## Build

The native part of pyitt module is written using C++20 standard, therefore you need a compiler that supports this
standard, for example GCC-10 for Linux and Visual Studio 2022 for Windows.

### Ubuntu 22.04

1. Install the compiler and Python utilities to build module:

sudo apt install gcc g++ python3-pip

2. Clone the repository:

git clone --recurse-submodules https://github.com/intel/ittapi.git

3. Build and install pyitt:

cd pyitt
pip install .

### Windows 10/11

1. Install [Python 3.8+](https://www.python.org/downloads/) together with pip utility.

2. Install [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/).
Make sure that "Desktop development with C++" workload is selected.

3. Clone the repository

git clone --recurse-submodules https://github.com/intel/ittapi.git

4. Build and install pyitt

cd pyitt
pip install .

## References

- [Instrumentation and Tracing Technology APIs](https://www.intel.com/content/www/us/en/docs/vtune-profiler/user-guide/2023-0/instrumentation-and-tracing-technology-apis.html)
- [Intel® VTune™ Profiler User Guide - Task Analysis](https://www.intel.com/content/www/us/en/docs/vtune-profiler/user-guide/2023-0/task-analysis.html)
- [Intel® Graphics Performance Analyzers User Guide - Instrumentation and Tracing Technology API Support](https://www.intel.com/content/www/us/en/docs/gpa/user-guide/2022-4/instrumentation-and-tracing-technology-apis.html)
33 changes: 33 additions & 0 deletions pyitt/pyitt.native/collection_control.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "collection_control.hpp"

#include <ittnotify.h>


namespace pyitt
{

PyObject* pause(PyObject* self, PyObject* Py_UNUSED(args))
{
Py_BEGIN_ALLOW_THREADS;
__itt_pause();
Py_END_ALLOW_THREADS;
Py_RETURN_NONE;
}

PyObject* resume(PyObject* self, PyObject* Py_UNUSED(args))
{
Py_BEGIN_ALLOW_THREADS;
__itt_resume();
Py_END_ALLOW_THREADS;
Py_RETURN_NONE;
}

PyObject* detach(PyObject* self, PyObject* Py_UNUSED(args))
{
Py_BEGIN_ALLOW_THREADS;
__itt_detach();
Py_END_ALLOW_THREADS;
Py_RETURN_NONE;
}

} // namespace pyitt
14 changes: 14 additions & 0 deletions pyitt/pyitt.native/collection_control.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once

#define PY_SSIZE_T_CLEAN
#include <Python.h>


namespace pyitt
{

PyObject* pause(PyObject* self, PyObject* args);
PyObject* resume(PyObject* self, PyObject* args);
PyObject* detach(PyObject* self, PyObject* args);

} // namespace pyitt
Loading