diff --git a/CMakeLists.txt b/CMakeLists.txt index caee9160e6..b45e544eca 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,6 +29,7 @@ option(DPCTL_TARGET_CUDA "Build DPCTL to target CUDA devices" OFF ) +option(DPCTL_WITH_REDIST "Build DPCTL assuming DPC++ redistributable is installed into Python prefix" OFF) find_package(IntelSYCL REQUIRED PATHS ${CMAKE_SOURCE_DIR}/cmake NO_DEFAULT_PATH) diff --git a/conda-recipe/bld.bat b/conda-recipe/bld.bat index 84403b6d3f..8cb076af5c 100644 --- a/conda-recipe/bld.bat +++ b/conda-recipe/bld.bat @@ -10,7 +10,7 @@ if DEFINED OVERRIDE_INTEL_IPO ( set "CMAKE_ARGS=%CMAKE_ARGS% -DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=FALSE" ) -FOR %%V IN (14.0.0 14 15.0.0 15 16.0.0 16 17.0.0 17) DO @( +FOR %%V IN (17.0.0 17 18.0.0 18 19.0.0 19) DO @( REM set DIR_HINT if directory exists IF EXIST "%BUILD_PREFIX%\Library\lib\clang\%%V\" ( SET "SYCL_INCLUDE_DIR_HINT=%BUILD_PREFIX%\Library\lib\clang\%%V" diff --git a/conda-recipe/build.sh b/conda-recipe/build.sh index dec613d814..1ca6329e3a 100755 --- a/conda-recipe/build.sh +++ b/conda-recipe/build.sh @@ -1,7 +1,7 @@ #!/bin/bash # This is necessary to help DPC++ find Intel libraries such as SVML, IRNG, etc in build prefix -export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${BUILD_PREFIX}/lib" +export LIBRARY_PATH="$LIBRARY_PATH:${BUILD_PREFIX}/lib" # Intel LLVM must cooperate with compiler and sysroot from conda echo "--gcc-toolchain=${BUILD_PREFIX} --sysroot=${BUILD_PREFIX}/${HOST}/sysroot -target ${HOST}" > icpx_for_conda.cfg @@ -22,7 +22,7 @@ export CMAKE_GENERATOR=Ninja # Make CMake verbose export VERBOSE=1 -CMAKE_ARGS="${CMAKE_ARGS} -DDPCTL_LEVEL_ZERO_INCLUDE_DIR=${PREFIX}/include/level_zero" +CMAKE_ARGS="${CMAKE_ARGS} -DDPCTL_LEVEL_ZERO_INCLUDE_DIR=${PREFIX}/include/level_zero -DDPCTL_WITH_REDIST=ON" # -wnx flags mean: --wheel --no-isolation --skip-dependency-check ${PYTHON} -m build -w -n -x @@ -43,7 +43,3 @@ ${PYTHON} -m pip install dist/dpctl*.whl \ if [[ -d "${WHEELS_OUTPUT_FOLDER}" ]]; then cp dist/dpctl*.whl "${WHEELS_OUTPUT_FOLDER[@]}" fi - -# need to create this folder so ensure that .dpctl-post-link.sh can work correctly -mkdir -p $PREFIX/etc/OpenCL/vendors -echo "dpctl creates symbolic link to system installed /etc/OpenCL/vendors/intel.icd as a work-around." > $PREFIX/etc/OpenCL/vendors/.dpctl_readme diff --git a/conda-recipe/meta.yaml b/conda-recipe/meta.yaml index 0678453e9b..482d54d6ef 100644 --- a/conda-recipe/meta.yaml +++ b/conda-recipe/meta.yaml @@ -29,7 +29,8 @@ requirements: - pip >=24.0 - level-zero-devel >=1.16 - pybind11 >=2.12 - - {{ pin_compatible('dpcpp-cpp-rt', min_pin='x.x', max_pin='x') }} + - {{ pin_compatible('intel-sycl-rt', min_pin='x.x', max_pin='x') }} + - {{ pin_compatible('intel-cmplr-lib-rt', min_pin='x.x', max_pin='x') }} # Ensure we are using latest version of setuptools, since we don't need # editable environments for release. - setuptools >=69 @@ -48,7 +49,7 @@ requirements: - tomli # [py<311] run: - python - - {{ pin_compatible('dpcpp-cpp-rt', min_pin='x.x', max_pin='x') }} + - {{ pin_compatible('intel-sycl-rt', min_pin='x.x', max_pin='x') }} - {{ pin_compatible('intel-cmplr-lib-rt', min_pin='x.x', max_pin='x') }} - numpy diff --git a/dpctl/CMakeLists.txt b/dpctl/CMakeLists.txt index d481f0fb41..921a4fbf86 100644 --- a/dpctl/CMakeLists.txt +++ b/dpctl/CMakeLists.txt @@ -105,7 +105,7 @@ set(CMAKE_INSTALL_RPATH "$ORIGIN") function(build_dpctl_ext _trgt _src _dest) set(options SYCL) - cmake_parse_arguments(BUILD_DPCTL_EXT "${options}" "" "" ${ARGN}) + cmake_parse_arguments(BUILD_DPCTL_EXT "${options}" "RELATIVE_PATH" "" ${ARGN}) add_cython_target(${_trgt} ${_src} CXX OUTPUT_VAR _generated_src) set(_cythonize_trgt "${_trgt}_cythonize_pyx") Python_add_library(${_trgt} MODULE WITH_SOABI ${_generated_src}) @@ -146,6 +146,14 @@ function(build_dpctl_ext _trgt _src _dest) get_filename_component(_generated_src_dir_dir ${_generated_src_dir} DIRECTORY) # TODO: do not set directory if we did not generate header target_include_directories(${_trgt} INTERFACE ${_generated_src_dir_dir}) + set(_rpath_value "$ORIGIN") + if (BUILD_DPCTL_EXT_RELATIVE_PATH) + set(_rpath_value "${_rpath_value}/${BUILD_DPCTL_EXT_RELATIVE_PATH}") + endif() + if (DPCTL_WITH_REDIST) + set(_rpath_value "${_rpath_value}:${_rpath_value}/../../..") + endif() + set_target_properties(${_trgt} PROPERTIES INSTALL_RPATH ${_rpath_value}) install(TARGETS ${_trgt} LIBRARY DESTINATION ${_dest}) diff --git a/dpctl/memory/CMakeLists.txt b/dpctl/memory/CMakeLists.txt index cccc30b505..161f67ecba 100644 --- a/dpctl/memory/CMakeLists.txt +++ b/dpctl/memory/CMakeLists.txt @@ -1,7 +1,7 @@ set(_cy_file ${CMAKE_CURRENT_SOURCE_DIR}/_memory.pyx) get_filename_component(_trgt ${_cy_file} NAME_WLE) -build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/memory" SYCL) +build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/memory" SYCL RELATIVE_PATH "..") # _memory include _opaque_smart_ptr.hpp target_include_directories(${_trgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers) diff --git a/dpctl/program/CMakeLists.txt b/dpctl/program/CMakeLists.txt index 3e7598c817..e55d5b0e08 100644 --- a/dpctl/program/CMakeLists.txt +++ b/dpctl/program/CMakeLists.txt @@ -2,6 +2,6 @@ file(GLOB _cython_sources *.pyx) foreach(_cy_file ${_cython_sources}) get_filename_component(_trgt ${_cy_file} NAME_WLE) - build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/program") + build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/program" RELATIVE_PATH "..") target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers) endforeach() diff --git a/dpctl/tensor/CMakeLists.txt b/dpctl/tensor/CMakeLists.txt index 2bc811a1c9..f05309a16d 100644 --- a/dpctl/tensor/CMakeLists.txt +++ b/dpctl/tensor/CMakeLists.txt @@ -1,7 +1,7 @@ file(GLOB _cython_sources *.pyx) foreach(_cy_file ${_cython_sources}) get_filename_component(_trgt ${_cy_file} NAME_WLE) - build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/tensor") + build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/tensor" RELATIVE_PATH "..") target_include_directories(${_trgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/include) target_link_libraries(DpctlCAPI INTERFACE ${_trgt}_headers) endforeach() @@ -311,5 +311,12 @@ foreach(python_module_name ${_py_trgts}) # TODO: update source so they refernece individual libraries instead of # dpctl4pybind11.hpp. It will allow to simplify dependency tree target_link_libraries(${python_module_name} PRIVATE DpctlCAPI) + if (DPCTL_WITH_REDIST) + set_target_properties( + ${python_module_name} + PROPERTIES + INSTALL_RPATH "$ORIGIN/../../../.." + ) + endif() install(TARGETS ${python_module_name} DESTINATION "dpctl/tensor") endforeach() diff --git a/dpctl/utils/CMakeLists.txt b/dpctl/utils/CMakeLists.txt index 2a8494032a..fa000787cf 100644 --- a/dpctl/utils/CMakeLists.txt +++ b/dpctl/utils/CMakeLists.txt @@ -2,40 +2,18 @@ file(GLOB _cython_sources *.pyx) foreach(_cy_file ${_cython_sources}) get_filename_component(_trgt ${_cy_file} NAME_WLE) - build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/utils") + build_dpctl_ext(${_trgt} ${_cy_file} "dpctl/utils" RELATIVE_PATH "..") endforeach() +set(_pybind11_targets) + set(python_module_name _device_queries) set(_module_src ${CMAKE_CURRENT_SOURCE_DIR}/src/device_queries.cpp) pybind11_add_module(${python_module_name} MODULE ${_module_src} ) add_sycl_to_target(TARGET ${python_module_name} SOURCES ${_module_src}) -if(DPCTL_GENERATE_COVERAGE) - if(DPCTL_GENERATE_COVERAGE_FOR_PYBIND11_EXTENSIONS) - target_compile_options(${python_module_name} - PRIVATE -fprofile-instr-generate -fcoverage-mapping - ) - endif() - target_link_options(${python_module_name} - PRIVATE -fprofile-instr-generate -fcoverage-mapping - ) -endif() -if(_dpctl_sycl_targets) - # make fat binary - target_compile_options( - ${python_module_name} - PRIVATE - -fsycl-targets=${_dpctl_sycl_targets} - ) - target_link_options( - ${python_module_name} - PRIVATE - -fsycl-targets=${_dpctl_sycl_targets} - ) -endif() -target_link_libraries(${python_module_name} PRIVATE DpctlCAPI) -install(TARGETS ${python_module_name} DESTINATION "dpctl/utils") +list(APPEND _pybind11_targets ${python_module_name}) set(python_module_name _seq_order_keeper) @@ -43,30 +21,52 @@ set(_module_src ${CMAKE_CURRENT_SOURCE_DIR}/src/order_keeper.cpp) pybind11_add_module(${python_module_name} MODULE ${_module_src} ) -target_include_directories(${python_module_name} PRIVATE ${CUMAKE_CURRENT_SOURCE_DIR}/src) +target_include_directories(${python_module_name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src) add_sycl_to_target(TARGET ${python_module_name} SOURCES ${_module_src}) -if(DPCTL_GENERATE_COVERAGE) - if(DPCTL_GENERATE_COVERAGE_FOR_PYBIND11_EXTENSIONS) - target_compile_options(${python_module_name} - PRIVATE -fprofile-instr-generate -fcoverage-mapping - ) - endif() - target_link_options(${python_module_name} - PRIVATE -fprofile-instr-generate -fcoverage-mapping - ) -endif() -if(_dpctl_sycl_targets) - # make fat binary - target_compile_options( - ${python_module_name} - PRIVATE - -fsycl-targets=${_dpctl_sycl_targets} - ) - target_link_options( - ${python_module_name} +list(APPEND _pybind11_targets ${python_module_name}) + +set(_linker_options "LINKER:${DPCTL_LDFLAGS}") +foreach(python_module_name ${_pybind11_targets}) + target_compile_options(${python_module_name} PRIVATE -fno-sycl-id-queries-fit-in-int) + target_link_options(${python_module_name} PRIVATE -fsycl-device-code-split=per_kernel) + target_include_directories(${python_module_name} PRIVATE - -fsycl-targets=${_dpctl_sycl_targets} + ${CMAKE_CURRENT_SOURCE_DIR}/libtensor/include + ${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/ ) -endif() -target_link_libraries(${python_module_name} PRIVATE DpctlCAPI) -install(TARGETS ${python_module_name} DESTINATION "dpctl/utils") + target_link_options(${python_module_name} PRIVATE ${_linker_options}) + if(DPCTL_GENERATE_COVERAGE) + if(DPCTL_GENERATE_COVERAGE_FOR_PYBIND11_EXTENSIONS) + target_compile_options(${python_module_name} + PRIVATE -fprofile-instr-generate -fcoverage-mapping + ) + endif() + target_link_options(${python_module_name} + PRIVATE -fprofile-instr-generate -fcoverage-mapping + ) + endif() + if(_dpctl_sycl_targets) + # make fat binary + target_compile_options( + ${python_module_name} + PRIVATE + -fsycl-targets=${_dpctl_sycl_targets} + ) + target_link_options( + ${python_module_name} + PRIVATE + -fsycl-targets=${_dpctl_sycl_targets} + ) + endif() + # TODO: update source so they refernece individual libraries instead of + # dpctl4pybind11.hpp. It will allow to simplify dependency tree + target_link_libraries(${python_module_name} PRIVATE DpctlCAPI) + if (DPCTL_WITH_REDIST) + set_target_properties( + ${python_module_name} + PROPERTIES + INSTALL_RPATH "$ORIGIN/../../../.." + ) + endif() + install(TARGETS ${python_module_name} DESTINATION "dpctl/utils") +endforeach() diff --git a/libsyclinterface/CMakeLists.txt b/libsyclinterface/CMakeLists.txt index 71c5c80656..56dfc24391 100644 --- a/libsyclinterface/CMakeLists.txt +++ b/libsyclinterface/CMakeLists.txt @@ -314,6 +314,11 @@ target_include_directories(DPCTLSyclInterfaceHeaders INTERFACE ${CMAKE_CURRENT_SOURCE_DIR}/include ) +if (DPCTL_WITH_REDIST) + cmake_path(RELATIVE_PATH CMAKE_SOURCE_DIR BASE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE _relative_path) + set_target_properties(DPCTLSyclInterface PROPERTIES INSTALL_RPATH "$ORIGIN/${_relative_path}/../../") +endif() + install(TARGETS DPCTLSyclInterface LIBRARY diff --git a/libsyclinterface/cmake/modules/FindIntelSyclCompiler.cmake b/libsyclinterface/cmake/modules/FindIntelSyclCompiler.cmake index faa1d7df51..202b1223a2 100644 --- a/libsyclinterface/cmake/modules/FindIntelSyclCompiler.cmake +++ b/libsyclinterface/cmake/modules/FindIntelSyclCompiler.cmake @@ -119,7 +119,7 @@ if(${clangxx_result} MATCHES "0") if("x${CMAKE_SYSTEM_NAME}" STREQUAL "xWindows") find_file( IntelSyclCompiler_SYCL_LIBRARY - NAMES "sycl.lib" "sycl6.lib" "sycl7.lib" + NAMES "sycl.lib" "sycl6.lib" "sycl7.lib" "sycl8.lib" PATHS ${IntelSyclCompiler_LIBRARY_DIR} ) find_file(