We welcome your contributions!
To contribute, do one of the following:
- create an issue
- participate in discussions
- open a pull request from changes committed to your fork
of
dpctl
NOTE: Make sure to check the box
"[x] Allow edits from maintainers"to allow the proper functioning of automation bots. See Working with forks for more details.
We use clang-format for C++ code formatting.
To install, run:
conda install clang-toolsSee the default configuration used by dpctl in .clang-format.
Before each commit, run:
clang-format -style=file -i \
libsyclinterface/include/*.h \
libsyclinterface/include/Support/*.h \
libsyclinterface/source/*.cpp \
libsyclinterface/tests/*.cpp \
libsyclinterface/helper/include/*.h \
libsyclinterface/helper/source/*.cppNOTE: It is recommended to use
pre-committhat invokesclang-formatamong other linters as configured.
We use the following Python code style tools:
NOTE: Refer:
pyproject.tomland.flake8config files for current configurations.pre-commit-config.yamlfile for the versions of the tools
Run these three tools before each commit.
TIP: Refer your IDE docs to automate these checks or set up
pre-committo add git hooks.
A .pre-commit-config.yaml is included to run various checks before you
commit your code.
To setup pre-commit in your workflow, install:
pre-commit:pip install pre-commit- the git hook scripts:
pre-commit install
Every C API source file should have a header that describes the file’s basic purpose. The standard header looks like this:
//===----- dpctl_sycl_event_interface.h - C API for sycl::event -*-C++-*- ===//
//
// Data Parallel Control (dpctl)
//
// Copyright 2020-2022 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// This header declares a C API to a sub-set of the sycl::event interface.
///
//===----------------------------------------------------------------------===//
NOTE:
- The
-*- C++ -*-string on the first line tells Emacs* that it is a C++ file. The string is only needed for*.hheaders and should be omitted for*.cppfiles. Without the string, Emacs assumes the file is a C header.- The copyright year must be updated every calendar year.
- Each comment line should be a max of 80 chars.
- A Doxygen
\filetag describing the contents of the file must be provided. Note that the\filetag is inside a Doxygen comment block. It is defined by the///comment marker instead of the//comment marker used in the rest of the header.
Every Python and Cython file should only include the following license header:
# Data Parallel Control (dpctl)
#
# Copyright 2020-2022 Intel Corporation
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
The copyright year should be updated every calendar year.
We use Bandit to find common security issues in the Python code.
To install, run:
pip install banditBandit revision used: 1.7.0
Before each commit, run:
bandit -r dpctl -lllCode coverage, for both C and Python sources in dpctl, is generated for each pull request (PR). A PR cannot be merged if it leads to a drop in the code coverage by more than five percentage points. Therefore, write unit tests for your changes.
To check the code coverage for your code, follow these steps:
-
Install dependencies for C/C++ source.
For C/C++ source,
lcov,llvm-cov(>=11.0), andllvm-profdata(>=11.0) are required. If you have multiplellvm-covtools installed, set theLLVM_TOOLS_HOMEenvironment variable to make sure the correct one is used to generate coverage. -
Install dependencies for Python sources.
To generate the coverage data for dpctl Python sources, install
coverage:python -m pip install coverage[toml]
-
Build dpctl with code coverage support.
python scripts/gen_coverage.py --oneapi coverage html
The code coverage builds the C sources with debug symbols. For this reason, the coverage script builds the package in
developmode ofsetup.py.The coverage results for the C and Python sources are printed to the terminal during the build (
libsyclinterface) and pytest execution (Python). The detailed coverage reports for thelibsyclinterfacelibrary are saved to thedpctl-c-api-coveragedirectory. The Python coverage reports are saved to thehtmlcovdirectory.The coverage data for every PR is also available online at coveralls.io.
NOTE:
- Run
git clean -xdfto clean up the working tree before running a fresh build with code coverage data generation.- You may encounter the following error when generating coverage data:
The error is related to theerror: '../compat/unistd.h' file not found, did you mean 'compat/unistd.h'? # include "../compat/unistd.h" ^ 1 error generated.tclpackage. Uninstall thetclpackage to resolve it.
The libsyclinterface library responds to the DPCTL_VERBOSITY environment variable that controls the severity level of errors printed to the console.
Specify one of the following severity levels (in increasing order of severity): warning and error by running:
export DPCTL_VERBOSITY=warningMessages of a given severity are shown not only in the console for that severity but also for the higher severity. For example, the severity level warning outputs severity errors for error and warning to the console.
The dpctl error handler for libsyclinterface can be optionally configured to use glog.
To use glog, complete the following steps:
- Install glog package of the latest version
conda install glog- Build dpctl with the glog support
python scripts/build_locally.py --oneapi --glog- Use the
dpctl._diagnostics.syclinterface_diagnostics(verbosity="warning", log_dir=None)context manager to switch library diagnostics on for a block of a Python code. UseDPCTLService_InitLoggerandDPCTLService_ShutdownLoggerlibrary C functions during library development to initialize Google's logging library and de-initialize accordingly:
from dpctl._diagnostics import syclinterface_diagnostics
import dpctl
with syclinterface_diagnostics():
codeDPCTLService_InitLogger(const char *app_name, const char *log_dir);
DPCTLService_ShutdownLogger();Where:
*app_name- the name of the executable file (prefix for logs of various levels).*log_dir- a directory path for writing log files. SpecifyingNULLresults in logging tostd::cerr.
NOTE: If
InitGoogleLoggingis not called before the first use of the glog, the library self-initializes to thelogtostderrmode, and log files are not generated.