Offload tests failed after introducing the new triple. This PR attempts to address that. It includes the changes in https://github.com/llvm/llvm-project/pull/208551. In addition, it also made following changes: - Updated flang builder that our buildbot uses; - Updated the CMakeLists for offload and AMDGPU device runtime (a little duplications to avoid breaking other buildbots); - Added per target linker path and mapping for lit substitution/features in lit config; - Updated hard-coded check lines in the tests. This PR reduces the failed offload tests from 246 to 2 on my test runs locally. Test results and the two failed tests: ``` Failed Tests (2): libomptarget :: amdgpu-amd-amdhsa :: offloading/fortran/declare-target-common-block-main.f90 libomptarget :: amdgpu-amd-amdhsa :: sanitizer/use_after_free_2.c Total Discovered Tests: 3478 Skipped : 77 (2.21%) Unsupported : 341 (9.80%) Passed : 3053 (87.78%) Expectedly Failed: 5 (0.14%) Failed : 2 (0.06%) ``` I was not able to identify the commits for the two failed tests yet (didn't look like flakiness), will try again later. Co-authored-by: Jan Patrick Lehr <JanPatrick.Lehr@amd.com>
112 lines
4.8 KiB
CMake
112 lines
4.8 KiB
CMake
# Ensure the compiler is a valid clang when building the GPU target.
|
|
set(req_ver "${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR}.${LLVM_VERSION_PATCH}")
|
|
if(LLVM_VERSION_MAJOR AND NOT (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" AND
|
|
${CMAKE_CXX_COMPILER_VERSION} VERSION_EQUAL "${req_ver}"))
|
|
message(WARNING "openmp for GPU requires an up-to-date clang. CMake compiler "
|
|
"'${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}' "
|
|
" is not 'Clang ${req_ver}'.")
|
|
endif()
|
|
|
|
set(src_files
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Allocator.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Configuration.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Debug.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Kernel.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/LibC.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Mapping.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Misc.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Parallelism.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Reduction.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/State.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Synchronization.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Tasking.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/DeviceUtils.cpp
|
|
${CMAKE_CURRENT_SOURCE_DIR}/src/Workshare.cpp
|
|
)
|
|
|
|
list(APPEND compile_options -flto)
|
|
list(APPEND compile_options -fvisibility=hidden)
|
|
list(APPEND compile_options -nogpulib)
|
|
list(APPEND compile_options -nostdlibinc)
|
|
list(APPEND compile_options -fno-rtti)
|
|
list(APPEND compile_options -fno-exceptions)
|
|
list(APPEND compile_options -fconvergent-functions)
|
|
list(APPEND compile_options -Wno-unknown-cuda-version)
|
|
|
|
if(LLVM_DEFAULT_TARGET_TRIPLE)
|
|
list(APPEND compile_options --target=${LLVM_DEFAULT_TARGET_TRIPLE})
|
|
endif()
|
|
|
|
# We disable the slp vectorizer during the runtime optimization to avoid
|
|
# vectorized accesses to the shared state. Generally, those are "good" but
|
|
# the optimizer pipeline (esp. Attributor) does not fully support vectorized
|
|
# instructions yet and we end up missing out on way more important constant
|
|
# propagation. That said, we will run the vectorizer again after the runtime
|
|
# has been linked into the user program.
|
|
list(APPEND compile_options "SHELL: -mllvm -vectorize-slp=false")
|
|
if("${LLVM_DEFAULT_TARGET_TRIPLE}" MATCHES "^amdgpu|^amdgcn" OR
|
|
"${CMAKE_CXX_COMPILER_TARGET}" MATCHES "^amdgpu|^amdgcn")
|
|
set(target_name "amdgpu")
|
|
list(APPEND compile_options "SHELL:-Xclang -mcode-object-version=none")
|
|
elseif("${LLVM_DEFAULT_TARGET_TRIPLE}" MATCHES "^nvptx" OR
|
|
"${CMAKE_CXX_COMPILER_TARGET}" MATCHES "^nvptx")
|
|
set(target_name "nvptx")
|
|
list(APPEND compile_options --cuda-feature=+ptx63)
|
|
elseif("${LLVM_DEFAULT_TARGET_TRIPLE}" MATCHES "^spirv" OR
|
|
"${CMAKE_CXX_COMPILER_TARGET}" MATCHES "^spirv")
|
|
set(target_name "spirv")
|
|
endif()
|
|
|
|
# Trick to combine these into a bitcode file via the linker's LTO pass.
|
|
add_executable(libompdevice ${src_files})
|
|
set_target_properties(libompdevice PROPERTIES
|
|
RUNTIME_OUTPUT_DIRECTORY "${LLVM_LIBRARY_OUTPUT_INTDIR}/${OPENMP_TARGET_SUBDIR}"
|
|
LINKER_LANGUAGE CXX
|
|
BUILD_RPATH ""
|
|
INSTALL_RPATH ""
|
|
RUNTIME_OUTPUT_NAME libomptarget-${target_name}.bc)
|
|
|
|
# If the user built with the GPU C library enabled we will use that instead.
|
|
if(TARGET libc)
|
|
target_compile_definitions(libompdevice PRIVATE OMPTARGET_HAS_LIBC)
|
|
endif()
|
|
target_compile_definitions(libompdevice PRIVATE SHARED_SCRATCHPAD_SIZE=512)
|
|
|
|
target_include_directories(libompdevice PRIVATE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/include
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../libc
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../../offload/include)
|
|
target_compile_options(libompdevice PRIVATE ${compile_options})
|
|
if(NOT "${LLVM_DEFAULT_TARGET_TRIPLE}" MATCHES "^spirv" AND
|
|
NOT "${CMAKE_CXX_COMPILER_TARGET}" MATCHES "^spirv")
|
|
target_link_options(libompdevice PRIVATE
|
|
"-flto" "-r" "-nostdlib" "-Wl,--lto-emit-llvm")
|
|
else()
|
|
target_link_options(libompdevice PRIVATE
|
|
"-nostdlib" "-emit-llvm")
|
|
endif()
|
|
|
|
if(LLVM_DEFAULT_TARGET_TRIPLE)
|
|
target_link_options(libompdevice PRIVATE "--target=${LLVM_DEFAULT_TARGET_TRIPLE}")
|
|
endif()
|
|
install(TARGETS libompdevice
|
|
PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ
|
|
DESTINATION ${OPENMP_INSTALL_LIBDIR}
|
|
COMPONENT openmp)
|
|
|
|
add_library(ompdevice.all_objs OBJECT IMPORTED)
|
|
set_property(TARGET ompdevice.all_objs APPEND PROPERTY IMPORTED_OBJECTS
|
|
${LLVM_LIBRARY_OUTPUT_INTDIR}/${OPENMP_TARGET_SUBDIR}/libomptarget-${target_name}.bc)
|
|
|
|
# Archive all the object files generated above into a static library
|
|
add_library(ompdevice STATIC)
|
|
add_dependencies(ompdevice libompdevice)
|
|
set_target_properties(ompdevice PROPERTIES
|
|
ARCHIVE_OUTPUT_DIRECTORY "${LLVM_LIBRARY_OUTPUT_INTDIR}/${OPENMP_TARGET_SUBDIR}"
|
|
LINKER_LANGUAGE CXX
|
|
)
|
|
target_link_libraries(ompdevice PRIVATE ompdevice.all_objs)
|
|
install(TARGETS ompdevice ARCHIVE DESTINATION "${OPENMP_INSTALL_LIBDIR}"
|
|
COMPONENT openmp)
|
|
|
|
openmp_register_meta_dep(ompdevice)
|