Skip to content

Commit 39e0700

Browse files
Merge pull request #1400 from IntelPython/use-IntelSYCL-cmake-script
Use IntelSYCL cmake script
2 parents 08cc479 + 550b20e commit 39e0700

File tree

16 files changed

+253
-136
lines changed

16 files changed

+253
-136
lines changed

.github/workflows/conda-package.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ jobs:
102102
run: |
103103
echo "WHEELS_OUTPUT_FOLDER=$GITHUB_WORKSPACE${{ runner.os == 'Linux' && '/' || '\\' }}" >> $GITHUB_ENV
104104
- name: Build conda package
105+
env:
106+
OVERRIDE_INTEL_IPO: 1 # IPO requires more resources that GH actions VM provides
105107
run: conda build --no-test --python ${{ matrix.python }} -c intel -c conda-forge --override-channels conda-recipe
106108
- name: Upload artifact
107109
uses: actions/upload-artifact@v3

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ option(DPCTL_GENERATE_COVERAGE
1818
OFF
1919
)
2020

21-
find_package(IntelDPCPP REQUIRED PATHS ${CMAKE_SOURCE_DIR}/cmake NO_DEFAULT_PATH)
21+
find_package(IntelSYCL REQUIRED PATHS ${CMAKE_SOURCE_DIR}/cmake NO_DEFAULT_PATH)
2222

2323
add_subdirectory(libsyclinterface)
2424

cmake/IntelDPCPPConfig.cmake renamed to cmake/IntelSYCLConfig.cmake

Lines changed: 99 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#
2-
# Modifications, Copyright (C) 2021 Intel Corporation
2+
# Modifications, Copyright (C) 2022 Intel Corporation
33
#
44
# This software and the related documents are Intel copyrighted materials, and
55
# your use of them is governed by the express license under which they were
@@ -15,19 +15,19 @@
1515
# file Copyright.txt or https://cmake.org/licensing for details.
1616

1717
#[=======================================================================[.rst:
18-
IntelDPCPPConfig
18+
IntelSYCLConfig
1919
-------
2020
21-
DPCPP Library to verify DPCPP/SYCL compatability of CMAKE_CXX_COMPILER
21+
Library to verify SYCL compatability of CMAKE_CXX_COMPILER
2222
and passes relevant compiler flags.
2323
2424
Result Variables
2525
^^^^^^^^^^^^^^^^
2626
2727
This will define the following variables:
2828
29-
``IntelDPCPP_FOUND``
30-
True if the system has the DPCPP library.
29+
``IntelSYCL_FOUND``
30+
True if the system has the SYCL library.
3131
``SYCL_LANGUAGE_VERSION``
3232
The SYCL language spec version by Compiler.
3333
``SYCL_INCLUDE_DIR``
@@ -37,35 +37,39 @@ This will define the following variables:
3737
``SYCL_FLAGS``
3838
SYCL specific flags for the compiler.
3939
40+
``IntelSYCL::SYCL_CXX``
41+
Target for using Intel SYCL (DPC++). The following properties are defined
42+
for the target: ``INTERFACE_COMPILE_OPTIONS``, ``INTERFACE_LINK_OPTIONS``,
43+
``INTERFACE_INCLUDE_DIRECTORIES``, and ``INTERFACE_LINK_DIRECTORIES``
44+
4045
Cache Variables
4146
^^^^^^^^^^^^^^^
4247
43-
The following cache variables may also be set:
48+
The following cache variable may also be set:
4449
45-
``SYCL_INCLUDE_DIR``
46-
The directory containing ``sycl.hpp``.
47-
``SYCL_LIBRARY_DIR``
48-
The path to the SYCL library.
49-
``SYCL_FLAGS``
50-
SYCL specific flags for the compiler.
5150
``SYCL_LANGUAGE_VERSION``
5251
The SYCL language spec version by Compiler.
5352
5453
55-
.. note::
54+
.. Note::
5655
57-
For now, user needs to set -DCMAKE_CXX_COMPILER or environment of
56+
1. User needs to set -DCMAKE_CXX_COMPILER or environment of
5857
CXX pointing to SYCL compatible compiler ( eg: icx, clang++, icpx)
5958
60-
Note: do not set to DPCPP compiler. If set to a Compiler family
61-
that supports dpcpp ( eg: IntelLLVM) both DPCPP and SYCL
62-
features are enabled.
6359
64-
And add this package to user's Cmake config file.
60+
2. Add this package to user's Cmake config file.
61+
62+
.. code-block:: cmake
63+
64+
find_package(IntelSYCL REQUIRED)
65+
66+
3. Add sources to target through add_sycl_to_target()
6567
6668
.. code-block:: cmake
6769
68-
find_package(IntelDPCPP REQUIRED)
70+
# Compile specific sources for SYCL and build target for SYCL
71+
add_executable(target_proj A.cpp B.cpp offload1.cpp offload2.cpp)
72+
add_sycl_to_target(TARGET target_proj SOURCES offload1.cpp offload2.cpp)
6973
7074
#]=======================================================================]
7175

@@ -83,25 +87,33 @@ endif()
8387

8488
string(COMPARE EQUAL "${CMAKE_CXX_COMPILER}" "" nocmplr)
8589
if(nocmplr)
86-
set(IntelDPCPP_FOUND False)
90+
set(IntelSYCL_FOUND False)
8791
set(SYCL_REASON_FAILURE "SYCL: CMAKE_CXX_COMPILER not set!!")
88-
set(IntelDPCPP_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
92+
set(IntelSYCL_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
93+
endif()
94+
95+
# Check if a Compiler ID is being set. project() should be set prior to find_package()
96+
97+
if("x${CMAKE_CXX_COMPILER_ID}" STREQUAL "x")
98+
set(IntelSYCL_FOUND False)
99+
set(SYCL_REASON_FAILURE "CMake CXX Compiler family is not set. Please make sure find_package(IntelSYCL) is called after project()!!")
100+
set(IntelSYCL_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
101+
return()
89102
endif()
90103

91104
# Check for known compiler family that supports SYCL
92105

93106
if( NOT "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang" AND
94107
NOT "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntelLLVM")
95-
set(IntelDPCPP_FOUND False)
108+
set(IntelSYCL_FOUND False)
96109
set(SYCL_REASON_FAILURE "Unsupported compiler family ${CMAKE_CXX_COMPILER_ID} and compiler ${CMAKE_CXX_COMPILER}!!")
97-
set(IntelDPCPP_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
110+
set(IntelSYCL_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
98111
return()
99112
endif()
100113

101114
# Assume that CXX Compiler supports SYCL and then test to verify.
102115
set(SYCL_COMPILER ${CMAKE_CXX_COMPILER})
103116

104-
105117
# Function to write a test case to verify SYCL features.
106118

107119
function(SYCL_FEATURE_TEST_WRITE src)
@@ -144,7 +156,7 @@ function(SYCL_FEATURE_TEST_BUILD TEST_SRC_FILE TEST_EXE)
144156
OUTPUT_VARIABLE output ERROR_VARIABLE output
145157
OUTPUT_FILE ${SYCL_TEST_DIR}/Compile.log
146158
RESULT_VARIABLE result
147-
TIMEOUT 20
159+
TIMEOUT 60
148160
)
149161

150162
# Verify if test case build properly.
@@ -168,12 +180,12 @@ function(SYCL_FEATURE_TEST_RUN TEST_EXE)
168180
WORKING_DIRECTORY ${SYCL_TEST_DIR}
169181
OUTPUT_VARIABLE output ERROR_VARIABLE output
170182
RESULT_VARIABLE result
171-
TIMEOUT 20
183+
TIMEOUT 60
172184
)
173185

174186
# Verify the test execution output.
175187
if(test_result)
176-
set(IntelDPCPP_FOUND False)
188+
set(IntelSYCL_FOUND False)
177189
set(SYCL_REASON_FAILURE "SYCL: feature test execution failed!!")
178190
endif()
179191
# TODO: what iff the result is false.. error or ignore?
@@ -236,14 +248,14 @@ set(SYCL_LINK_FLAGS "")
236248
# Based on Compiler ID, add support for SYCL
237249
if( "x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xClang" OR
238250
"x${CMAKE_CXX_COMPILER_ID}" STREQUAL "xIntelLLVM")
239-
set(SYCL_FLAGS "-fsycl ")
240-
set(SYCL_LINK_FLAGS "-fsycl ")
251+
list(APPEND SYCL_FLAGS "-fsycl")
252+
list(APPEND SYCL_LINK_FLAGS "-fsycl")
241253
endif()
242254

243255
# TODO verify if this is needed
244256
# Windows: Add Exception handling
245257
if(WIN32)
246-
set(SYCL_FLAGS "${SYCL_FLAGS} /EHsc")
258+
list(APPEND SYCL_FLAGS "/EHsc")
247259
endif()
248260

249261
set(SYCL_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SYCL_FLAGS}")
@@ -273,32 +285,76 @@ SYCL_FEATURE_TEST_EXTRACT(${test_output})
273285
# define macro SYCL_LANGUAGE_VERSION
274286
string(COMPARE EQUAL "${SYCL_LANGUAGE_VERSION}" "" nosycllang)
275287
if(nosycllang)
276-
set(IntelDPCPP_FOUND False)
288+
set(IntelSYCL_FOUND False)
277289
set(SYCL_REASON_FAILURE "SYCL: It appears that the ${CMAKE_CXX_COMPILER} does not support SYCL")
278-
set(IntelDPCPP_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
290+
set(IntelSYCL_NOT_FOUND_MESSAGE "${SYCL_REASON_FAILURE}")
279291
endif()
280292

281293
# Placeholder for identifying various implemenations of SYCL compilers.
282294
# for now, set to the CMAKE_CXX_COMPILER_ID
283295
set(SYCL_IMPLEMENTATION_ID "${CMAKE_CXX_COMPILER_ID}")
284296

285-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SYCL_FLAGS}")
286-
set(CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS} ${SYCL_LINK_FLAGS}")
297+
message(DEBUG "The SYCL compiler is ${SYCL_COMPILER}")
298+
message(DEBUG "The SYCL Flags are ${SYCL_FLAGS}")
299+
message(DEBUG "The SYCL Language Version is ${SYCL_LANGUAGE_VERSION}")
287300

288-
message(STATUS "Echo from ${CMAKE_CURRENT_SOURCE_DIR}/IntelDPCPPConfig.cmake")
289-
message(STATUS "The SYCL compiler is ${SYCL_COMPILER}")
290-
message(STATUS "The SYCL Flags are ${SYCL_FLAGS}")
291-
message(STATUS "The SYCL Language Version is ${SYCL_LANGUAGE_VERSION}")
301+
add_library(IntelSYCL::SYCL_CXX INTERFACE IMPORTED)
302+
set_property(TARGET IntelSYCL::SYCL_CXX PROPERTY
303+
INTERFACE_COMPILE_OPTIONS ${SYCL_FLAGS})
304+
set_property(TARGET IntelSYCL::SYCL_CXX PROPERTY
305+
INTERFACE_LINK_OPTIONS ${SYCL_LINK_FLAGS})
306+
set_property(TARGET IntelSYCL::SYCL_CXX PROPERTY
307+
INTERFACE_INCLUDE_DIRECTORIES ${SYCL_INCLUDE_DIR})
308+
set_property(TARGET IntelSYCL::SYCL_CXX PROPERTY
309+
INTERFACE_LINK_DIRECTORIES ${SYCL_LIBRARY_DIR})
292310

293311
find_package_handle_standard_args(
294-
IntelDPCPP
295-
FOUND_VAR IntelDPCPP_FOUND
312+
IntelSYCL
313+
FOUND_VAR IntelSYCL_FOUND
296314
REQUIRED_VARS SYCL_INCLUDE_DIR SYCL_LIBRARY_DIR SYCL_FLAGS
297315
VERSION_VAR SYCL_LANGUAGE_VERSION
298316
REASON_FAILURE_MESSAGE "${SYCL_REASON_FAILURE}")
299317

300318
# Include in Cache
301319
set(SYCL_LANGUAGE_VERSION "${SYCL_LANGUAGE_VERSION}" CACHE STRING "SYCL Language version")
302-
set(SYCL_INCLUDE_DIR "${SYCL_INCLUDE_DIR}" CACHE FILEPATH "SYCL Include directory")
303-
set(SYCL_LIBRARY_DIR "${SYCL_LIBRARY_DIR}" CACHE FILEPATH "SYCL Library Directory")
304-
set(SYCL_FLAGS "${SYCL_FLAGS}" CACHE STRING "SYCL flags for the compiler")
320+
321+
function(add_sycl_to_target)
322+
323+
set(one_value_args TARGET)
324+
set(multi_value_args SOURCES)
325+
cmake_parse_arguments(SYCL
326+
""
327+
"${one_value_args}"
328+
"${multi_value_args}"
329+
${ARGN})
330+
331+
332+
get_target_property(__sycl_cxx_options IntelSYCL::SYCL_CXX INTERFACE_COMPILE_OPTIONS)
333+
get_target_property(__sycl_cxx_include_directories IntelSYCL::SYCL_CXX INTERFACE_INCLUDE_DIRECTORIES)
334+
335+
if(NOT ${ARGC})
336+
message(FATAL_ERROR " add_sycl_to_target() does not have any arguments")
337+
elseif(${ARGC} EQUAL 1)
338+
message(WARNING "add_sycl_to_target() have only one argument specified.. assuming the target to be ${ARGV}.
339+
Adding sycl to all sources but that may effect compilation times")
340+
set(SYCL_TARGET ${ARGV})
341+
endif()
342+
343+
if(NOT SYCL_SOURCES)
344+
message(WARNING "add_sycl_to_target() does not have sources specified.. Adding sycl to all sources but that may effect compilation times")
345+
target_compile_options(${SYCL_TARGET} PUBLIC ${__sycl_cxx_options})
346+
target_include_directories(${SYCL_TARGET} PUBLIC ${__sycl_cxx_include_directories})
347+
endif()
348+
349+
foreach(source ${SYCL_SOURCES})
350+
set_source_files_properties(${source} PROPERTIES COMPILE_OPTIONS "${__sycl_cxx_options}")
351+
set_source_files_properties(${source} PROPERTIES INCLUDE_DIRECTORIES "${__sycl_cxx_include_directories}")
352+
endforeach()
353+
354+
get_target_property(__sycl_link_options
355+
IntelSYCL::SYCL_CXX INTERFACE_LINK_OPTIONS)
356+
target_link_options(${SYCL_TARGET} PRIVATE "${__sycl_link_options}")
357+
get_target_property(__sycl_link_directories
358+
IntelSYCL::SYCL_CXX INTERFACE_LINK_DIRECTORIES)
359+
target_link_directories(${SYCL_TARGET} PUBLIC "${__sycl_link_directories}")
360+
endfunction(add_sycl_to_target)

conda-recipe/bld.bat

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ set "INCLUDE=%BUILD_PREFIX%\include;%INCLUDE%"
66
"%PYTHON%" setup.py clean --all
77
set "SKBUILD_ARGS=-G Ninja -- -DCMAKE_C_COMPILER:PATH=icx -DCMAKE_CXX_COMPILER:PATH=icx -DCMAKE_VERBOSE_MAKEFILE:BOOL=ON"
88

9+
REM Overriding IPO is useful for building in resources constrained VMs (public CI)
10+
if DEFINED OVERRIDE_INTEL_IPO (
11+
set "SKBUILD_ARGS=%SKBUILD_ARGS% -DCMAKE_INTERPROCEDURAL_OPTIMIZATION:BOOL=FALSE"
12+
)
13+
914
FOR %%V IN (14.0.0 14 15.0.0 15 16.0.0 16 17.0.0 17) DO @(
1015
REM set DIR_HINT if directory exists
1116
IF EXIST "%BUILD_PREFIX%\Library\lib\clang\%%V\" (

conda-recipe/meta.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ build:
99
number: {{ GIT_DESCRIBE_NUMBER }}
1010
script_env:
1111
- WHEELS_OUTPUT_FOLDER
12+
- OVERRIDE_INTEL_IPO # [win]
1213

1314
requirements:
1415
build:

dpctl/CMakeLists.txt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ elseif(UNIX)
5858
string(CONCAT CXXFLAGS
5959
"${WARNING_FLAGS}"
6060
"${SDL_FLAGS}"
61-
"-fsycl "
6261
)
6362
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O3 ${CFLAGS}")
6463
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 ${CXXFLAGS}")
@@ -137,10 +136,15 @@ add_custom_target(
137136
set(CMAKE_INSTALL_RPATH "$ORIGIN")
138137

139138
function(build_dpctl_ext _trgt _src _dest)
139+
set(options SYCL)
140+
cmake_parse_arguments(BUILD_DPCTL_EXT "${options}" "" "" ${ARGN})
140141
add_cython_target(${_trgt} ${_src} CXX OUTPUT_VAR _generated_src)
141142
set(_cythonize_trgt "${_trgt}_cythonize_pyx")
142143
add_custom_target(${_cythonize_trgt} DEPENDS ${_src})
143-
python_add_library(${_trgt} MODULE ${_generated_src})
144+
Python_add_library(${_trgt} MODULE WITH_SOABI ${_generated_src})
145+
if (BUILD_DPCTL_EXT_SYCL)
146+
add_sycl_to_target(TARGET ${_trgt} SOURCES ${_generated_src})
147+
endif()
144148
target_include_directories(${_trgt} PRIVATE ${NumPy_INCLUDE_DIR} ${DPCTL_INCLUDE_DIR})
145149
add_dependencies(${_trgt} _build_time_create_dpctl_include_copy ${_cythonize_trgt})
146150
if (DPCTL_GENERATE_COVERAGE)
@@ -185,14 +189,18 @@ function(build_dpctl_ext _trgt _src _dest)
185189
install(TARGETS ${_trgt} LIBRARY DESTINATION ${_dest})
186190
endfunction()
187191

188-
file(GLOB _cython_sources *.pyx)
192+
file(GLOB _cython_sources ${CMAKE_CURRENT_SOURCE_DIR}/*.pyx)
193+
list(REMOVE_ITEM _cython_sources ${CMAKE_CURRENT_SOURCE_DIR}/_sycl_queue.pyx)
189194
foreach(_cy_file ${_cython_sources})
190195
get_filename_component(_trgt ${_cy_file} NAME_WLE)
191196
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl")
192197
endforeach()
193198

199+
set(_cy_file ${CMAKE_CURRENT_SOURCE_DIR}/_sycl_queue.pyx)
200+
get_filename_component(_trgt ${_cy_file} NAME_WLE)
201+
build_dpctl_ext(${_trgt} ${_cy_file} "dpctl" SYCL)
194202
# _sycl_queue include _host_task_util.hpp
195-
target_include_directories(_sycl_queue PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
203+
target_include_directories(${_trgt} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
196204

197205
add_subdirectory(program)
198206
add_subdirectory(memory)

dpctl/tensor/CMakeLists.txt

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,7 @@ if(WIN32)
3030
endif()
3131
endif()
3232

33-
set(python_module_name _tensor_impl)
34-
pybind11_add_module(${python_module_name} MODULE
33+
set(_tensor_impl_sources
3534
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/tensor_py.cpp
3635
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/accumulators.cpp
3736
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/simplify_iteration_space.cpp
@@ -52,16 +51,29 @@ pybind11_add_module(${python_module_name} MODULE
5251
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/repeat.cpp
5352
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/reduction_over_axis.cpp
5453
)
54+
55+
set(python_module_name _tensor_impl)
56+
pybind11_add_module(${python_module_name} MODULE ${_tensor_impl_sources})
57+
add_sycl_to_target(TARGET ${python_module_name} SOURCES ${_tensor_impl_sources})
5558
set(_clang_prefix "")
5659
if (WIN32)
5760
set(_clang_prefix "/clang:")
5861
endif()
59-
set_source_files_properties(
62+
63+
set(_no_fast_math_sources
6064
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/full_ctor.cpp
6165
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/linear_sequences.cpp
6266
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions.cpp
6367
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/reduction_over_axis.cpp
64-
PROPERTIES COMPILE_OPTIONS "${_clang_prefix}-fno-fast-math")
68+
)
69+
foreach(_src_fn ${_no_fast_math_sources})
70+
get_source_file_property(_cmpl_options_prop ${_src_fn} COMPILE_OPTIONS)
71+
set(_combined_options_prop ${_cmpl_options_prop} "${_clang_prefix}-fno-fast-math")
72+
set_source_files_properties(
73+
${_src_fn}
74+
PROPERTIES COMPILE_OPTIONS "${_combined_options_prop}"
75+
)
76+
endforeach()
6577
if (UNIX)
6678
set_source_files_properties(
6779
${CMAKE_CURRENT_SOURCE_DIR}/libtensor/source/elementwise_functions.cpp

dpctl/utils/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@ add_custom_target(_dpctl4pybind11_header_ready
1616
)
1717

1818
set(python_module_name _device_queries)
19+
set(_module_src ${CMAKE_CURRENT_SOURCE_DIR}/src/device_queries.cpp)
1920
pybind11_add_module(${python_module_name} MODULE
20-
${CMAKE_CURRENT_SOURCE_DIR}/src/device_queries.cpp
21+
${_module_src}
2122
)
23+
add_sycl_to_target(TARGET ${python_module_name} SOURCES ${_module_src})
2224
target_include_directories(${python_module_name}
2325
PRIVATE
2426
${CMAKE_CURRENT_SOURCE_DIR}/../include

0 commit comments

Comments
 (0)