Skip to content

Commit ed3476f

Browse files
Move dpctl_ext.tensor to dpnp.tensor (#2829)
This PR proposes a refactoring that migrates `dpctl_ext.tensor` module into `dpnp` package as `dpnp.tensor` Changes: 1. Moved `dpctl_ext/tensor/` directory to `dpnp/tensor/` 2. Updated all imports from `dpctl_ext.tensor` to `dpnp.tensor` across the codebase 3. Consolidated build: removed dpctl_ext/CMakeLists.txt, added build_dpnp_tensor_ext() to dpnp/CMakeLists.txt 4. Added `DPNP_BUILD_COMPONENTS` CMake option (`ALL/TENSOR_ONLY/SKIP_TENSOR`) for staged builds 5. Split coverage workflow into two steps to avoid memory issues 6. Updated include paths in all backend extension CMake files 7. Removed `dpctl_ext/` directory and cleaned up `.gitignore`
1 parent a31ab47 commit ed3476f

File tree

470 files changed

+385
-691
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

470 files changed

+385
-691
lines changed

.gitignore

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,8 @@ dpnp_pytest.*
2828
example3
2929

3030
*dpnp_backend*
31+
dpnp/include/dpnp/tensor/*.h
3132
dpnp/**/*.cpython*.so
3233
dpnp/**/*.pyd
3334
*~
3435
core
35-
36-
# TODO: revert to `dpctl/`
37-
# when dpnp fully migrates dpctl/tensor
38-
dpctl_ext/**/*.cpython*.so
39-
dpctl_ext/include/

CMakeLists.txt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,23 @@ project(
3737
)
3838

3939
option(DPNP_GENERATE_COVERAGE "Enable build DPNP with coverage instrumentation" OFF)
40+
option(
41+
DPNP_TENSOR_GENERATE_COVERAGE_FOR_PYBIND11_EXTENSIONS
42+
"Build dpnp tensor pybind11 offloading extensions with coverage instrumentation"
43+
OFF
44+
)
4045
option(DPNP_BACKEND_TESTS "Enable building of DPNP backend test suite" OFF)
4146
option(
4247
DPNP_WITH_REDIST
4348
"Build DPNP assuming DPC++ redistributable is installed into Python prefix"
4449
OFF
4550
)
51+
option(
52+
DPNP_TENSOR_OFFLOAD_COMPRESS
53+
"Build dpnp tensor using offload section compression feature of DPC++ to reduce \
54+
size of shared object with offloading sections"
55+
OFF
56+
)
4657

4758
set(CMAKE_CXX_STANDARD 17)
4859
set(CMAKE_CXX_STANDARD_REQUIRED True)
@@ -344,5 +355,4 @@ if(DEFINED SKBUILD)
344355
set(_ignore_me ${SKBUILD})
345356
endif()
346357

347-
add_subdirectory(dpctl_ext)
348358
add_subdirectory(dpnp)

dpctl_ext/CMakeLists.txt

Lines changed: 0 additions & 202 deletions
This file was deleted.

dpctl_ext/__init__.py

Lines changed: 0 additions & 27 deletions
This file was deleted.

dpnp/CMakeLists.txt

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,11 +86,96 @@ function(build_dpnp_cython_ext _trgt _src _dest)
8686
install(TARGETS ${_trgt} LIBRARY DESTINATION ${_dest})
8787
endfunction()
8888

89+
function(build_dpnp_tensor_ext _trgt _src _dest)
90+
set(options SYCL)
91+
cmake_parse_arguments(BUILD_DPNP_TENSOR "${options}" "RELATIVE_PATH" "" ${ARGN})
92+
add_cython_target(${_trgt} ${_src} CXX OUTPUT_VAR _generated_src)
93+
set(_cythonize_trgt "${_trgt}_cythonize_pyx")
94+
python_add_library(${_trgt} MODULE WITH_SOABI ${_generated_src})
95+
if(BUILD_DPNP_TENSOR_SYCL)
96+
add_sycl_to_target(TARGET ${_trgt} SOURCES ${_generated_src})
97+
target_compile_options(${_trgt} PRIVATE -fno-sycl-id-queries-fit-in-int)
98+
target_link_options(${_trgt} PRIVATE -fsycl-device-code-split=per_kernel)
99+
if(DPNP_TENSOR_OFFLOAD_COMPRESS)
100+
target_link_options(${_trgt} PRIVATE --offload-compress)
101+
endif()
102+
if(_dpnp_sycl_targets)
103+
# make fat binary
104+
target_compile_options(
105+
${_trgt}
106+
PRIVATE ${_dpnp_sycl_target_compile_options}
107+
)
108+
target_link_options(${_trgt} PRIVATE ${_dpnp_sycl_target_link_options})
109+
endif()
110+
endif()
111+
target_link_libraries(${_trgt} PRIVATE Python::NumPy)
112+
if(DPNP_GENERATE_COVERAGE)
113+
target_compile_definitions(${_trgt} PRIVATE CYTHON_TRACE=1 CYTHON_TRACE_NOGIL=1)
114+
if(BUILD_DPNP_TENSOR_SYCL)
115+
target_compile_options(${_trgt} PRIVATE -fno-sycl-use-footer)
116+
endif()
117+
endif()
118+
# Dpctl
119+
target_include_directories(${_trgt} PRIVATE ${Dpctl_INCLUDE_DIR})
120+
target_link_directories(${_trgt} PRIVATE ${Dpctl_INCLUDE_DIR}/..)
121+
target_link_libraries(${_trgt} PRIVATE DPCTLSyclInterface)
122+
set(_linker_options "LINKER:${DPNP_LDFLAGS}")
123+
target_link_options(${_trgt} PRIVATE ${_linker_options})
124+
get_filename_component(_name_wle ${_generated_src} NAME_WLE)
125+
get_filename_component(_generated_src_dir ${_generated_src} DIRECTORY)
126+
set(_generated_public_h "${_generated_src_dir}/${_name_wle}.h")
127+
set(_generated_api_h "${_generated_src_dir}/${_name_wle}_api.h")
128+
129+
# TODO: create separate folder inside build folder that contains only
130+
# headers related to this target and appropriate folder structure to
131+
# eliminate shadow dependencies
132+
# Go up two levels to build root for "dpnp/tensor/_usmarray.h" resolution
133+
get_filename_component(_parent_dir ${_generated_src_dir} DIRECTORY)
134+
get_filename_component(_build_root ${_parent_dir} DIRECTORY)
135+
# TODO: do not set directory if we did not generate header
136+
target_include_directories(${_trgt} INTERFACE ${_build_root})
137+
set(_rpath_value "$ORIGIN")
138+
if(BUILD_DPNP_TENSOR_RELATIVE_PATH)
139+
set(_rpath_value "${_rpath_value}/${BUILD_DPNP_TENSOR_RELATIVE_PATH}")
140+
endif()
141+
if(DPNP_WITH_REDIST)
142+
set(_rpath_value "${_rpath_value}:${_rpath_value}/../../..")
143+
endif()
144+
set_target_properties(${_trgt} PROPERTIES INSTALL_RPATH ${_rpath_value})
145+
146+
install(TARGETS ${_trgt} LIBRARY DESTINATION ${_dest})
147+
install(
148+
FILES ${_generated_api_h}
149+
DESTINATION ${CMAKE_INSTALL_PREFIX}/dpnp/include/${_dest}
150+
OPTIONAL
151+
)
152+
install(
153+
FILES ${_generated_public_h}
154+
DESTINATION ${CMAKE_INSTALL_PREFIX}/dpnp/include/${_dest}
155+
OPTIONAL
156+
)
157+
if(DPNP_GENERATE_COVERAGE)
158+
get_filename_component(_original_src_dir ${_src} DIRECTORY)
159+
file(RELATIVE_PATH _rel_dir ${CMAKE_SOURCE_DIR} ${_original_src_dir})
160+
install(FILES ${_generated_src} DESTINATION ${CMAKE_INSTALL_PREFIX}/${_rel_dir})
161+
endif()
162+
163+
# Create target with headers only, because python is managing all the
164+
# library imports at runtime
165+
set(_trgt_headers ${_trgt}_headers)
166+
add_library(${_trgt_headers} INTERFACE)
167+
add_dependencies(${_trgt_headers} ${_trgt})
168+
get_target_property(_trgt_headers_dir ${_trgt} INTERFACE_INCLUDE_DIRECTORIES)
169+
target_include_directories(${_trgt_headers} INTERFACE ${_trgt_headers_dir})
170+
endfunction()
171+
89172
function(build_dpnp_cython_ext_with_backend _trgt _src _dest)
90173
build_dpnp_cython_ext(${_trgt} ${_src} ${_dest})
91174
target_link_libraries(${_trgt} PRIVATE dpnp_backend_library)
92175
endfunction()
93176

177+
add_subdirectory(tensor)
178+
94179
add_subdirectory(backend)
95180
add_subdirectory(backend/extensions/blas)
96181
add_subdirectory(backend/extensions/fft)

dpnp/__init__.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,7 @@
6060
[os.getenv("PATH", ""), dll_path]
6161
)
6262

63-
# TODO: revert to `from dpctl.tensor...`
64-
# when dpnp fully migrates dpctl/tensor
65-
from dpctl_ext.tensor import __array_api_version__, DLDeviceType
63+
from .tensor import __array_api_version__, DLDeviceType
6664

6765
from .dpnp_array import dpnp_array as ndarray
6866
from .dpnp_array_api_info import __array_namespace_info__

dpnp/backend/extensions/blas/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ target_include_directories(
7171
PRIVATE
7272
${CMAKE_CURRENT_SOURCE_DIR}/../common
7373
${CMAKE_SOURCE_DIR}/dpnp/backend/include
74-
${CMAKE_SOURCE_DIR}/dpctl_ext/tensor/libtensor/include
74+
${CMAKE_SOURCE_DIR}/dpnp/tensor/libtensor/include
7575
)
7676

7777
# treat below headers as system to suppress the warnings there during the build

0 commit comments

Comments
 (0)