Skip to content

Commit 32c5a08

Browse files
committed
[adaptivecpp] Add support for SYCL with adaptiveCpp
1 parent 09590d0 commit 32c5a08

File tree

9 files changed

+126
-4
lines changed

9 files changed

+126
-4
lines changed

.github/workflows/root-ci-config/buildconfig/global.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
adaptivecpp=ON
12
alien=OFF
23
all=OFF
34
arrow=OFF

cmake/modules/RootBuildOptions.cmake

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ endfunction()
7777
# The default value can be changed as many times as we wish before calling ROOT_APPLY_OPTIONS()
7878
#--------------------------------------------------------------------------------------------------
7979

80+
ROOT_BUILD_OPTION(adaptivecpp ON "Build AdaptiveCPP, for SYCL support")
8081
ROOT_BUILD_OPTION(arrow OFF "Enable support for Apache Arrow")
8182
ROOT_BUILD_OPTION(asimage ON "Enable support for image processing via libAfterImage")
8283
ROOT_BUILD_OPTION(asserts OFF "Enable asserts (defaults to ON for CMAKE_BUILD_TYPE=Debug and/or dev=ON)")

cmake/modules/SearchInstalledSoftware.cmake

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ macro(ROOT_CHECK_CONNECTION_AND_DISABLE_OPTION option_name)
6161
endif()
6262
endmacro()
6363

64+
# Building adaptivecpp requires an internet connection, if we're not side-loading the source directory
65+
if(adaptivecpp AND NOT DEFINED ADAPTIVECPP_SOURCE_DIR)
66+
ROOT_CHECK_CONNECTION_AND_DISABLE_OPTION("adaptivecpp")
67+
endif()
68+
6469
# Building Clad requires an internet connection, if we're not side-loading the source directory
6570
if(clad AND NOT DEFINED CLAD_SOURCE_DIR)
6671
ROOT_CHECK_CONNECTION_AND_DISABLE_OPTION("clad")

core/metacling/src/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ if (clad)
108108
else()
109109
set(CLING_PLUGIN_LINK_LIBS -Wl,--whole-archive cladPlugin cladDifferentiator -Wl,--no-whole-archive)
110110
endif()
111-
if(TARGET clang)
111+
# This will cause a cyclic dependency in adaptiveCpp, as it requires clang to build
112+
if(TARGET clang AND NOT adaptivecpp)
112113
# Link our clad libraries to clang. If users use the clang from ROOT they will
113114
# also be able to use clad out of the box.
114115
add_dependencies(clang clad)

interpreter/CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,10 @@ set(LLVM_FORCE_USE_OLD_TOOLCHAIN ON CACHE BOOL "")
5353
# found before (because the user turned on cuda or tmva-gpu), this will not have
5454
# an effect, which is fine.
5555
# (Note that the option is very counter-intuitive: We turn *on* disabling it...)
56-
set(CMAKE_DISABLE_FIND_PACKAGE_CUDA ON)
56+
# Special case when we want to build cling with adaptiveCpp
57+
if(NOT adaptivecpp)
58+
set(CMAKE_DISABLE_FIND_PACKAGE_CUDA ON)
59+
endif()
5760

5861
# will be set again in case NOT builtin_llvm
5962
set(LLVM_DIR "${CMAKE_CURRENT_BINARY_DIR}/llvm-project/llvm")
@@ -120,7 +123,7 @@ if(clingtest)
120123
endif()
121124
ROOT_ADD_TEST(clingtest-check-cling COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target check-cling
122125
ENVIRONMENT ${CLINGTEST_EXECUTABLE})
123-
else()
126+
elseif(NOT adaptivecpp) # AdaptiveCPP needs hipsycl::rt symbols to be exposed
124127
#---Build LLVM/Clang with symbol visibility=hidden--------------------------------------------------
125128
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
126129
set(CMAKE_C_VISIBILITY_PRESET hidden)
@@ -390,6 +393,9 @@ if (builtin_clang)
390393
${CLANG_BINARY_DIR}/include
391394
CACHE STRING "Clang include directories.")
392395
set(CLANG_CMAKE_DIR "${CMAKE_BINARY_DIR}/lib/cmake/clang/")
396+
set(CLANG_EXECUTABLE_PATH
397+
"${LLVM_BINARY_DIR}/bin/clang${CMAKE_EXECUTABLE_SUFFIX}"
398+
CACHE STRING "Path to just‐built clang (if builtin_clang).")
393399
else()
394400
find_package(Clang REQUIRED CONFIG)
395401
message(STATUS "Found Clang ${CLANG_PACKAGE_VERSION} in ${CLANG_CMAKE_DIR}")

interpreter/cling/CMakeLists.txt

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,21 @@ set(CLING_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})
128128
set(LLVM_TOOLS_BINARY_DIR "${LLVM_BINARY_DIR}/bin")
129129
if(DEFINED CLING_ROOT_BUILD)
130130
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${LLVM_TOOLS_BINARY_DIR}")
131+
132+
if(adaptivecpp)
133+
# Hack for now to make it work with adaptiveCpp without making more changes
134+
# Ensure runtime ACPP directory exists to prevent SYCL from running
135+
set(ACPP_RUNTIME_DIRECTORY "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/../lib/hipSYCL/")
136+
file(MAKE_DIRECTORY ${ACPP_RUNTIME_DIRECTORY})
137+
file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib/hipSYCL/bitcode)
138+
139+
# Create a symbolic link to the bitcode directory
140+
execute_process(
141+
COMMAND ${CMAKE_COMMAND} -E create_symlink
142+
"${CMAKE_BINARY_DIR}/lib/hipSYCL/bitcode"
143+
"${ACPP_RUNTIME_DIRECTORY}/bitcode"
144+
)
145+
endif()
131146
endif()
132147

133148
if( CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR AND NOT MSVC_IDE )
@@ -236,7 +251,7 @@ if(MSVC)
236251
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std:c++14")
237252
endif()
238253
endif()
239-
else()
254+
elseif(NOT adaptivecpp) # adaptivecpp does not build with -fno-rtti
240255
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
241256
endif()
242257

@@ -470,6 +485,60 @@ if (TARGET clang-headers)
470485
list(APPEND LLVM_COMMON_DEPENDS clang-headers)
471486
endif()
472487

488+
if(adaptivecpp)
489+
# Use ADAPTIVE_CPP_SOURCE_DIR variable if it is defined in the CMake
490+
# configuration
491+
if(NOT DEFINED ADAPTIVE_CPP_SOURCE_DIR)
492+
set(ADAPTIVE_CPP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/AdaptiveCpp)
493+
endif()
494+
495+
set(HIPSYCL_NO_FIBERS ON)
496+
set(WITH_OPENCL_BACKEND OFF)
497+
set(WITH_LEVEL_ZERO_BACKEND OFF)
498+
499+
add_compile_definitions(CLING_WITH_ADAPTIVECPP)
500+
501+
list(INSERT CMAKE_MODULE_PATH 0 "${ADAPTIVE_CPP_SOURCE_DIR}/cmake/")
502+
503+
set(ADAPTIVE_CPP_HEADER_BUILD_PATH
504+
"${CMAKE_CURRENT_BINARY_DIR}/include/AdaptiveCpp")
505+
set(ADAPTIVE_CPP_HEADER_INSTALL_PATH
506+
"${CMAKE_INSTALL_PREFIX}/include/AdaptiveCpp")
507+
508+
add_subdirectory(${ADAPTIVE_CPP_SOURCE_DIR})
509+
set(ACPP_EXPORTS
510+
acpp-common
511+
acpp-rt
512+
acpp-clang-cbs
513+
acpp-clang
514+
llvm-to-backend
515+
llvm-to-host
516+
rt-backend-omp)
517+
518+
if(WITH_CUDA_BACKEND)
519+
list(APPEND ACPP_EXPORTS llvm-to-ptx rt-backend-cuda)
520+
endif()
521+
522+
if(WITH_OPENCL_BACKEND)
523+
list(APPEND ACPP_EXPORTS llvm-to-spirv rt-backend-ocl ocl-cxx-headers ocl-headers)
524+
endif()
525+
526+
if(WITH_ROCM_BACKEND)
527+
list(APPEND ACPP_EXPORTS llvm-to-amdgpu rt-backend-hip)
528+
endif()
529+
530+
foreach(target IN LISTS ACPP_EXPORTS)
531+
install(TARGETS ${target} EXPORT ClingTargets)
532+
endforeach()
533+
534+
set_property(GLOBAL APPEND PROPERTY CLING_EXPORTS ${ACPP_EXPORTS})
535+
536+
if(TARGET intrinsics_gen)
537+
add_dependencies(acpp-clang-cbs intrinsics_gen)
538+
add_dependencies(llvm-to-backend intrinsics_gen)
539+
endif()
540+
endif()
541+
473542
add_subdirectory(include/cling/Interpreter)
474543
add_subdirectory(lib)
475544

interpreter/cling/lib/Interpreter/BackendPasses.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@
2929
#include "llvm/Transforms/Scalar.h"
3030
#include "llvm/Transforms/Utils.h"
3131

32+
#ifdef CLING_WITH_ADAPTIVECPP
33+
#include "hipSYCL/compiler/GlobalsPruningPass.hpp"
34+
#include "hipSYCL/compiler/SMCPCompatPass.hpp"
35+
#include "hipSYCL/compiler/sscp/TargetSeparationPass.hpp"
36+
#endif
37+
3238
//#include "clang/Basic/LangOptions.h"
3339
//#include "clang/Basic/TargetOptions.h"
3440
#include "clang/Basic/CharInfo.h"
@@ -511,6 +517,19 @@ void BackendPasses::CreatePasses(int OptLevel, llvm::ModulePassManager& MPM,
511517
std::optional<PGOOptions> PGOOpt;
512518
PassBuilder PB(&m_TM, PTO, PGOOpt, &PIC);
513519

520+
#ifdef CLING_WITH_ADAPTIVECPP
521+
PB.registerOptimizerLastEPCallback(
522+
[](llvm::ModulePassManager& MPM, OptimizationLevel) {
523+
MPM.addPass(hipsycl::compiler::SMCPCompatPass{});
524+
MPM.addPass(hipsycl::compiler::GlobalsPruningPass{});
525+
});
526+
527+
PB.registerPipelineStartEPCallback(
528+
[&](llvm::ModulePassManager& MPM, OptimizationLevel Level) {
529+
MPM.addPass(hipsycl::compiler::TargetSeparationPass{""});
530+
});
531+
#endif
532+
514533
// Attempt to load pass plugins and register their callbacks with PB.
515534
for (auto& PluginFN : m_CGOpts.PassPlugins) {
516535
auto PassPlugin = PassPlugin::Load(PluginFN);

interpreter/cling/lib/Interpreter/CIFactory.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1385,6 +1385,19 @@ namespace {
13851385
argvCompile.push_back("-fno-omit-frame-pointer");
13861386
}
13871387

1388+
#ifdef CLING_WITH_ADAPTIVECPP
1389+
llvm::SmallString<256> adaptiveCppIncludePath(
1390+
ADAPTIVE_CPP_HEADER_INSTALL_PATH);
1391+
if (!llvm::sys::fs::exists(adaptiveCppIncludePath))
1392+
adaptiveCppIncludePath = ADAPTIVE_CPP_HEADER_BUILD_PATH;
1393+
argvCompile.push_back("-isystem");
1394+
argvCompile.push_back(adaptiveCppIncludePath.c_str());
1395+
argvCompile.push_back("-D__ACPP_ENABLE_LLVM_SSCP_TARGET__");
1396+
argvCompile.push_back("-Xclang");
1397+
argvCompile.push_back("-disable-O0-optnone");
1398+
if (!debuggingEnabled)
1399+
argvCompile.push_back("-ffp-contract=fast");
1400+
#endif
13881401
// Add host specific includes, -resource-dir if necessary, and -isysroot
13891402
std::string ClingBin = GetExecutablePath(argv[0]);
13901403
AddHostArguments(ClingBin, argvCompile, LLVMDir, COpts);

interpreter/cling/lib/Interpreter/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ set(LIBS
2323
clangLex
2424
)
2525

26+
if(adaptivecpp)
27+
list(APPEND LIBS acpp-clang acpp-rt)
28+
endif()
29+
2630
set(LLVM_LINK_COMPONENTS
2731
analysis
2832
core
@@ -294,6 +298,9 @@ if (UNIX)
294298
"
295299
#define CLING_CXX_INCL \"${CLING_CXX_HEADERS}\"
296300
#define CLING_INCLUDE_PATHS \"${CLING_INCLUDE_PATHS}\"
301+
302+
#define ADAPTIVE_CPP_HEADER_BUILD_PATH \"${ADAPTIVE_CPP_HEADER_BUILD_PATH}\"
303+
#define ADAPTIVE_CPP_HEADER_INSTALL_PATH \"${ADAPTIVE_CPP_HEADER_INSTALL_PATH}\"
297304
")
298305
if (CMAKE_OSX_SYSROOT)
299306
# CMAKE_OSX_SYSROOT hardcodes the concrete version of the sdk

0 commit comments

Comments
 (0)