Skip to content

Commit 6ee76bc

Browse files
Merge pull request #818 from IntelPython/improve-coverage
2 parents 0232bed + ca01db1 commit 6ee76bc

20 files changed

+203
-398
lines changed

.github/workflows/generate-coverage.yaml

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -85,26 +85,7 @@ jobs:
8585
shell: bash -l {0}
8686
run: |
8787
source /opt/intel/oneapi/setvars.sh
88-
export _SAVED_PATH=${PATH}
89-
export PATH=$(dirname $(dirname $(which icx)))/bin-llvm:${PATH}
90-
python setup.py develop -- \
91-
-G "Ninja" \
92-
-DCMAKE_BUILD_TYPE=Debug \
93-
-DCMAKE_C_COMPILER:PATH=icx \
94-
-DCMAKE_CXX_COMPILER:PATH=icpx \
95-
-DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON \
96-
-DDPCTL_GENERATE_COVERAGE=ON \
97-
-DDPCTL_BUILD_CAPI_TESTS=ON \
98-
-DDPCTL_COVERAGE_REPORT_OUTPUT_DIR=$(pwd)
99-
pushd $(find _skbuild -name cmake-build)
100-
cmake --build . --target lcov-genhtml || exit 1
101-
popd
102-
export PATH=${_SAVED_PATH}
103-
unset _SAVED_PATH
104-
python -c "import dpctl; print(dpctl.__version__); dpctl.lsplatform()" || exit 1
105-
pytest -q -ra --disable-warnings --cov-config pyproject.toml --cov dpctl \
106-
--cov-report term-missing --pyargs dpctl -vv \
107-
--ignore=dpctl/tensor/libtensor/tests
88+
python scripts/gen_coverage.py
10889
10990
- name: Install coverall dependencies
11091
shell: bash -l {0}
@@ -115,8 +96,21 @@ jobs:
11596
- name: Upload coverage data to coveralls.io
11697
shell: bash -l {0}
11798
run: |
118-
coveralls-lcov -v -n $(find _skbuild -name dpctl.lcov) > dpctl-c-api-coverage.json
119-
coveralls --service=github --merge=dpctl-c-api-coverage.json
99+
coveralls-lcov -v -n \
100+
$(find _skbuild -name dpctl.lcov) > dpctl-c-api-coverage.json
101+
coveralls-lcov -v -n \
102+
$(find . -name dpctl_pytest.lcov) > pytest-dpctl-c-api-coverage.json
103+
# merge json files
104+
python -c "import json; \
105+
fh1 = open('dpctl-c-api-coverage.json', 'r'); \
106+
f1 = json.load(fh1); fh1.close(); \
107+
fh2 = open('pytest-dpctl-c-api-coverage.json', 'r'); \
108+
f2 = json.load(fh2); fh2.close(); \
109+
f3 = {'source_files': f1['source_files'] + f2['source_files']}; \
110+
fh3 = open('combined-dpctl-c-api-coverage.json', 'w'); \
111+
json.dump(f3, fh3); fh3.close()" || exit 1
112+
# merge combined file with coverage data and upload
113+
coveralls --service=github --merge=combined-dpctl-c-api-coverage.json
120114
env:
121115
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
122116
COVERALLS_PARALLEL: true

.github/workflows/generate-docs.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@ jobs:
6868
-DCMAKE_BUILD_TYPE=Debug \
6969
-DCMAKE_C_COMPILER:PATH=icx \
7070
-DCMAKE_CXX_COMPILER:PATH=icpx \
71-
-DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON \
7271
-DDPCTL_GENERATE_DOCS=ON \
7372
-DDPCTL_ENABLE_DOXYREST=ON \
7473
-DDoxyrest_DIR=`pwd`/doxyrest-2.1.2-linux-amd64

.github/workflows/os-llvm-sycl-build.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,6 @@ jobs:
9797
export OCL_ICD_FILENAMES=libintelocl.so:libintelocl_emu.so
9898
clang++ --version
9999
sycl-ls
100-
python setup.py develop -- -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -DDPCTL_DPCPP_HOME_DIR=$(dirname $(dirname $(which clang))) -DDPCTL_DPCPP_FROM_ONEAPI=OFF
100+
python setup.py develop -- -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++
101101
python -c "import dpctl; dpctl.lsplatform()" || exit 1
102102
SYCL_ENABLE_HOST_DEVICE=1 python -m pytest -v dpctl/tests

CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,12 @@ project(dpctl
88
set(CMAKE_CXX_STANDARD 17)
99
set(CMAKE_CXX_STANDARD_REQUIRED True)
1010

11+
# Option to generate code coverage report using llvm-cov and lcov.
12+
option(DPCTL_GENERATE_COVERAGE
13+
"Build dpctl with coverage instrumentation"
14+
OFF
15+
)
16+
1117
find_package(IntelDPCPP REQUIRED PATHS ${CMAKE_SOURCE_DIR}/cmake NO_DEFAULT_PATH)
1218

1319
add_subdirectory(libsyclinterface)

conda-recipe/bld.bat

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ set "LIB=%BUILD_PREFIX%\Library\lib;%BUILD_PREFIX%\compiler\lib;%LIB%"
44
set "INCLUDE=%BUILD_PREFIX%\include;%INCLUDE%"
55

66
"%PYTHON%" setup.py clean --all
7-
set "SKBUILD_ARGS=-- -G Ninja -DDPCTL_DPCPP_HOME_DIR=%BUILD_PREFIX%\Library -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON"
7+
set "SKBUILD_ARGS=-- -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icx"
88
set "SYCL_INCLUDE_DIR_HINT=%BUILD_PREFIX%\Library\lib\clang\14.0.0"
99

1010
set "PLATFORM_DIR=%PREFIX%\Library\share\cmake-3.22\Modules\Platform"

conda-recipe/build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export LDFLAGS="$LDFLAGS -Wl,-rpath,$PREFIX/lib"
77

88
${PYTHON} setup.py clean --all
99
export CMAKE_GENERATOR="Ninja"
10-
SKBUILD_ARGS="-- -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON -DDPCTL_DPCPP_HOME_DIR=${BUILD_PREFIX}"
10+
SKBUILD_ARGS="-- -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx"
1111
echo "${PYTHON} setup.py install ${SKBUILD_ARGS}"
1212

1313
# Workaround for:

docs/docfiles/user_guides/QuickStart.rst

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -152,21 +152,21 @@ Once the prerequisites are installed, building using ``scikit-build`` involves t
152152

153153
.. code-block:: bash
154154
155-
python setup.py install -- -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON
155+
python setup.py install -- -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx
156156
157157
, and to develop:
158158

159159
.. code-block:: bash
160160
161-
python setup.py develop -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON
161+
python setup.py develop -G Ninja -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icpx
162162
163163
On Windows, use ``icx`` for both C and CXX compilers.
164164

165165
Developing on Linux can also be done using driver script:
166166

167167
.. code-block:: bash
168168
169-
python scripts/build_locally.py --oneapi
169+
python scripts/build_locally.py
170170
171171
172172
Building using custom dpcpp
@@ -180,13 +180,13 @@ Following steps in `Build and install with scikit-build`_ use command line optio
180180

181181
.. code-block:: bash
182182
183-
python setup.py develop -- -G Ninja -DCMAKE_C_COMPILER:PATH=clang -DCMAKE_CXX_COMPILER:PATH=clang++ -DDPCTL_ENABLE_LO_PROGRAM_CREATION=ONE -DDPCTL_DPCPP_HOME_DIR=${DPCPP_ROOT}/llvm/build -DDPCTL_DPCPP_FROM_ONEAPI=OFF
183+
python setup.py develop -- -G Ninja -DCMAKE_C_COMPILER:PATH=$(which clang) -DCMAKE_CXX_COMPILER:PATH=$(which clang++)
184184
185185
Alterantively, the driver script can be used
186186

187187
.. code-block:: bash
188188
189-
python scripts/build_locally.py --c-compiler=clang --cxx-compiler=clang++ --compiler-root=${DPCPP_ROOT}/llvm/build
189+
python scripts/build_locally.py --c-compiler=$(which clang) --cxx-compiler=$(which clang++)
190190
191191
Available options and their descriptions can be retrieved using option
192192
:code:`--help`.
@@ -264,7 +264,6 @@ library.
264264
-DDPCPP_INSTALL_DIR=${DPCPP_ROOT} \
265265
-DCMAKE_C_COMPILER:PATH=${DPCPP_ROOT}/bin/icx \
266266
-DCMAKE_CXX_COMPILER:PATH=${DPCPP_ROOT}/bin/dpcpp \
267-
-DDPCTL_ENABLE_LO_PROGRAM_CREATION=ON \
268267
-DDPCTL_BUILD_CAPI_TESTS=ON \
269268
..
270269

libsyclinterface/CMakeLists.txt

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,22 @@ project(
77

88
# Load our CMake modules to search for DPCPP and Level Zero
99
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules/")
10+
1011
find_package(Git REQUIRED)
1112

12-
option(DPCTL_DPCPP_HOME_DIR
13-
"The installation home for the DPC++ toolchain compiler."
14-
OFF
15-
)
16-
option(DPCTL_DPCPP_FROM_ONEAPI
17-
"Indicates whether DPCTL_DPCPP_HOME_DIR points to a oneAPI installation."
18-
ON
19-
)
13+
if(NOT DEFINED IntelDPCPP_FOUND OR NOT IntelDPCPP_FOUND)
14+
find_package(IntelDPCPP REQUIRED)
15+
endif()
16+
2017
# Option to turn on support for creating Level Zero interoperability programs
2118
# from a SPIR-V binary file.
22-
option(DPCTL_ENABLE_LO_PROGRAM_CREATION
19+
option(DPCTL_ENABLE_L0_PROGRAM_CREATION
2320
"Enable Level Zero Program creation from SPIR-V"
24-
OFF
21+
ON
2522
)
2623
# Option to generate code coverage report using llvm-cov and lcov.
2724
option(DPCTL_GENERATE_COVERAGE
28-
"Build dpctl C API with coverage instrumentation instrumentation"
25+
"Build dpctl C API with coverage instrumentation"
2926
OFF
3027
)
3128
# Option to output html coverage report at a specific location.
@@ -45,14 +42,15 @@ option(DPCTL_ENABLE_GLOG
4542
)
4643

4744
# Minimum version requirement only when oneAPI dpcpp is used.
45+
find_package(IntelDPCPP REQUIRED)
4846
if(DPCTL_DPCPP_FROM_ONEAPI)
4947
find_package(IntelSycl 2021.3.0 REQUIRED)
5048
else()
5149
find_package(IntelSycl REQUIRED)
5250
endif()
5351

54-
if(DPCTL_ENABLE_LO_PROGRAM_CREATION)
55-
set(DPCTL_ENABLE_LO_PROGRAM_CREATION 1)
52+
if(DPCTL_ENABLE_L0_PROGRAM_CREATION)
53+
set(DPCTL_ENABLE_L0_PROGRAM_CREATION 1)
5654
include(GetLevelZeroHeaders)
5755
get_level_zero_headers()
5856
if (UNIX)
@@ -156,20 +154,42 @@ file(GLOB_RECURSE helper_sources
156154
${CMAKE_CURRENT_SOURCE_DIR}/helper/source/*.cpp
157155
)
158156

157+
# Enable code coverage related settings
158+
if(DPCTL_GENERATE_COVERAGE)
159+
include(SetupCoverage)
160+
setup_coverage_generation()
161+
162+
# Turn on DPCTL_BUILD_CAPI_TESTS as building tests is needed to generate
163+
# coverage reports.
164+
set(DPCTL_BUILD_CAPI_TESTS "ON")
165+
if(DPCTL_COVERAGE_REPORT_OUTPUT_DIR)
166+
set(COVERAGE_OUTPUT_DIR ${DPCTL_COVERAGE_REPORT_OUTPUT_DIR})
167+
else()
168+
set(COVERAGE_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
169+
endif()
170+
message(STATUS "Coverage reports to be saved at ${COVERAGE_OUTPUT_DIR}")
171+
endif()
172+
159173
add_library(DPCTLSyclInterface
160174
SHARED
161175
${sources}
162176
${helper_sources}
163177
)
164178

179+
if(DPCTL_GENERATE_COVERAGE)
180+
target_link_options(DPCTLSyclInterface
181+
PRIVATE -fprofile-instr-generate -fcoverage-mapping
182+
)
183+
endif()
184+
165185
target_include_directories(DPCTLSyclInterface
166186
PUBLIC
167187
${CMAKE_CURRENT_SOURCE_DIR}/include/
168188
${CMAKE_CURRENT_SOURCE_DIR}/include/Support
169189
${CMAKE_CURRENT_SOURCE_DIR}/include/Config
170190
PRIVATE
171191
${CMAKE_CURRENT_SOURCE_DIR}/helper/include/
172-
${IntelSycl_SYCL_INCLUDE_DIR}
192+
${SYCL_INCLUDE_DIR}
173193
)
174194
target_link_libraries(DPCTLSyclInterface
175195
PRIVATE ${IntelSycl_SYCL_LIBRARY}
@@ -201,7 +221,7 @@ set_target_properties(DPCTLSyclInterface
201221
SOVERSION ${VERSION_MAJOR}
202222
)
203223

204-
if(DPCTL_ENABLE_LO_PROGRAM_CREATION)
224+
if(DPCTL_ENABLE_L0_PROGRAM_CREATION)
205225
target_include_directories(DPCTLSyclInterface
206226
PRIVATE
207227
${LEVEL_ZERO_INCLUDE_DIR}
@@ -247,25 +267,6 @@ install(
247267
DESTINATION ${_include_destination}/Config
248268
)
249269

250-
# Enable code coverage related settings
251-
if(DPCTL_GENERATE_COVERAGE)
252-
# check if lcov is available
253-
find_package(Lcov REQUIRED)
254-
# check if llvm-cov version 11 is available
255-
find_package(LLVMCov 11 REQUIRED)
256-
# check if llvm-profdata is available
257-
find_package(LLVMProfdata REQUIRED)
258-
# Turn on DPCTL_BUILD_CAPI_TESTS as building tests is needed to generate
259-
# coverage reports.
260-
set(DPCTL_BUILD_CAPI_TESTS "ON")
261-
if(DPCTL_COVERAGE_REPORT_OUTPUT_DIR)
262-
set(COVERAGE_OUTPUT_DIR ${DPCTL_COVERAGE_REPORT_OUTPUT_DIR})
263-
else()
264-
set(COVERAGE_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
265-
endif()
266-
message(STATUS "Coverage reports to be saved at ${COVERAGE_OUTPUT_DIR}")
267-
endif()
268-
269270
# Add sub-directory to build the dpctl C API test cases
270271
if(DPCTL_BUILD_CAPI_TESTS)
271272
add_subdirectory(tests)

libsyclinterface/cmake/modules/FindIntelSycl.cmake

Lines changed: 6 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,7 @@
3333
# IntelSycl_OPENCL_LIBRARY
3434

3535
include(FindPackageHandleStandardArgs)
36-
37-
# Check if a specific DPC++ installation directory was provided then set
38-
# IntelSycl_ROOT to that path.
39-
if(DPCTL_DPCPP_HOME_DIR)
40-
set(IntelSycl_ROOT ${DPCTL_DPCPP_HOME_DIR})
41-
if(NOT DPCTL_DPCPP_FROM_ONEAPI)
42-
message(STATUS
43-
"Not using standard oneAPI installation, but IntelSycl at "
44-
${IntelSycl_ROOT}
45-
)
46-
endif()
47-
# If DPC++ installation was not specified, check for ONEAPI_ROOT
48-
elseif(DEFINED ENV{ONEAPI_ROOT})
49-
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
50-
set(IntelSycl_ROOT $ENV{ONEAPI_ROOT}/compiler/latest/windows)
51-
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
52-
set(IntelSycl_ROOT $ENV{ONEAPI_ROOT}/compiler/latest/linux)
53-
else()
54-
message(FATAL_ERROR "Unsupported system.")
55-
endif()
56-
else()
57-
message(FATAL_ERROR
58-
"Could not locate a DPC++ installation. Either pass the path to a "
59-
"custom location using DPCTL_DPCPP_HOME_DIR or set the "
60-
" ONEAPI_ROOT environment variable."
61-
)
62-
return()
63-
endif()
36+
find_package(IntelDPCPP REQUIRED)
6437

6538
# We will extract the version information from the compiler
6639
set(clangxx_cmd "${CMAKE_CXX_COMPILER}")
@@ -96,13 +69,13 @@ if(${clangxx_result} MATCHES "0")
9669
list(GET IntelSycl_VERSION_LIST1 0 IntelSycl_VERSION_MAJOR)
9770
list(GET IntelSycl_VERSION_LIST1 1 IntelSycl_VERSION_MINOR)
9871
list(GET IntelSycl_VERSION_LIST1 2 IntelSycl_VERSION_PATCH)
99-
set(IntelSycl_INCLUDE_DIR ${IntelSycl_ROOT}/include)
100-
set(IntelSycl_SYCL_INCLUDE_DIR ${IntelSycl_ROOT}/include/sycl)
101-
set(IntelSycl_LIBRARY_DIR ${IntelSycl_ROOT}/lib)
102-
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
72+
set(IntelSycl_INCLUDE_DIR ${SYCL_INCLUDE_DIR})
73+
set(IntelSycl_SYCL_INCLUDE_DIR ${SYCL_INCLUDE_DIR}/sycl)
74+
set(IntelSycl_LIBRARY_DIR ${SYCL_LIBRARY_DIR})
75+
if("x${CMAKE_SYSTEM_NAME}" STREQUAL "xWindows")
10376
set(IntelSycl_SYCL_LIBRARY ${IntelSycl_LIBRARY_DIR}/sycl.lib)
10477
set(IntelSycl_OPENCL_LIBRARY ${IntelSycl_LIBRARY_DIR}/OpenCL.lib)
105-
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
78+
elseif("x${CMAKE_SYSTEM_NAME}" STREQUAL "xLinux")
10679
set(IntelSycl_SYCL_LIBRARY ${IntelSycl_LIBRARY_DIR}/libsycl.so)
10780
set(IntelSycl_OPENCL_LIBRARY ${IntelSycl_LIBRARY_DIR}/libOpenCL.so)
10881
endif()
@@ -125,7 +98,6 @@ else()
12598
endif()
12699

127100
find_package_handle_standard_args(IntelSycl DEFAULT_MSG
128-
IntelSycl_ROOT
129101
IntelSycl_FOUND
130102
IntelSycl_VERSION
131103
IntelSycl_INCLUDE_DIR
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
2+
function(setup_coverage_generation)
3+
# check if lcov is available
4+
find_package(Lcov REQUIRED)
5+
# check if llvm-cov version 11 is available
6+
find_package(LLVMCov 11 REQUIRED)
7+
# check if llvm-profdata is available
8+
find_package(LLVMProfdata REQUIRED)
9+
10+
string(CONCAT PROFILE_FLAGS
11+
"-fprofile-instr-generate "
12+
"-fcoverage-mapping "
13+
"-fno-sycl-use-footer "
14+
"-DDPCTL_COVERAGE "
15+
)
16+
17+
# Add profiling flags
18+
set(CMAKE_CXX_FLAGS
19+
"${CMAKE_CXX_FLAGS} ${PROFILE_FLAGS}"
20+
PARENT_SCOPE
21+
)
22+
endfunction(setup_coverage_generation)

0 commit comments

Comments
 (0)