blob: 1d89a6d0b811584e821f88d48bb2d2d1decfbbc4 [file] [log] [blame]
# SOLLVE OpenMP Offloading Validation & Verification Suite
# https://crpl.cis.udel.edu/ompvvsollve/
include(External)
remove_definitions(-w)
remove_definitions(-Werror=date-time)
option(TEST_SUITE_FORCE_ALL "Execute all SOLLVE V&V tests, even those known to be unsupported by Clang" OFF)
set(TEST_SUITE_OFFLOADING_C_FLAGS --offload-arch=native CACHE STRING "Compiler arguments for OpenMP offloading for C")
set(TEST_SUITE_OFFLOADING_CXX_FLAGS --offload-arch=native CACHE STRING "Compiler arguments for OpenMP offloading for CXX")
set(TEST_SUITE_OFFLOADING_Fortran_FLAGS --offload-arch=native CACHE STRING "Compiler arguments for OpenMP offloading for Fortran")
set(TEST_SUITE_OFFLOADING_C_LDFLAGS --offload-arch=native CACHE STRING "Linker arguments for OpenMP offloading")
set(TEST_SUITE_OFFLOADING_CXX_LDFLAGS --offload-arch=native CACHE STRING "Linker arguments for OpenMP offloading")
set(TEST_SUITE_OFFLOADING_Fortran_LDFLAGS --offload-arch=native CACHE STRING "Linker arguments for OpenMP offloading")
set(ALL_LIST_OPTIONS
AMD
INTEL
NVIDIA
REGRESSION
)
set(CHOOSEN_LISTS)
set(REGRESSION)
set(INTEL)
include(sollvevv_nvidia_tests.cmake)
include(sollvevv_amd_tests.cmake)
function (add_sollvevv LANG)
set(_includedir "${TEST_SUITE_SOLLVEVV_ROOT}/ompvv" )
if ("${LANG}" STREQUAL "Fortran" AND NOT TEST_SUITE_FORTRAN)
return ()
endif ()
if (NOT OpenMP_${LANG}_FOUND)
message(FATAL_ERROR "OpenMP for ${LANG} not found")
return ()
endif ()
#if (OpenMP_${LANG}_VERSION VERSION_LESS "4.5")
# message(FATAL_ERROR "OpenMP version ${OpenMP_${LANG}_VERSION} too old")
#endif ()
if ("${LANG}" STREQUAL "C")
set(_langext ".c")
elseif ("${LANG}" STREQUAL "CXX")
set(_langext ".cpp")
elseif ("${LANG}" STREQUAL "Fortran")
set(_langext ".F90")
else ()
message(FATAL_ERROR "Unsupported languge ${LANG}")
endif ()
file(GLOB_RECURSE _tests_sources RELATIVE "${TEST_SUITE_SOLLVEVV_ROOT}/tests" "${TEST_SUITE_SOLLVEVV_ROOT}/tests/*${_langext}" )
foreach (_file IN LISTS _tests_sources)
get_filename_component(_ext "${_file}" EXT)
get_filename_component(_basename "${_file}" NAME_WE)
get_filename_component(_directory "${_file}" DIRECTORY)
string(REPLACE "." "" _ext "${_ext}")
string(REPLACE "/" "_" _directory "${_directory}")
string(REPLACE "." "" _directory "${_directory}")
set(_name "omptargetvv-${_basename}-${_directory}-${_ext}")
if (NOT TEST_SUITE_FORCE_ALL AND NOT "${_file}" IN_LIST CHOOSEN_LISTS)
message(STATUS "Skipping SOLLVE V&V test ${_file}")
continue ()
endif ()
# Create a directory for the test
set(test_dir "${CMAKE_BINARY_DIR}/${_name}")
file(MAKE_DIRECTORY ${test_dir})
llvm_test_run()
llvm_test_executable(${_name} "${TEST_SUITE_SOLLVEVV_ROOT}/tests/${_file}")
target_include_directories(${_name} PRIVATE "${_includedir}")
target_link_libraries(${_name} PUBLIC OpenMP::OpenMP_${_lang} m)
# Add -fopenmp to linker command line; for some reason this is not done by target_link_libraries.
target_link_options(${_name} PRIVATE ${OpenMP_${LANG}_FLAGS})
set_target_properties(${_name} PROPERTIES Fortran_MODULE_DIRECTORY ${test_dir})
# CMake's find_package(OpenMP) currently does not not introspect flags necessary for offloading.
target_compile_options(${_name} PUBLIC ${TEST_SUITE_OFFLOADING_${LANG}_FLAGS})
target_link_options(${_name} PUBLIC ${TEST_SUITE_OFFLOADING_${LANG}_LDFLAGS})
endforeach ()
endfunction ()
llvm_externals_find(TEST_SUITE_SOLLVEVV_ROOT "sollve_vv" "OpenMP Offloading Validation & Verification Suite")
if(TEST_SUITE_SOLLVEVV_ROOT AND NOT TEST_SUITE_BENCHMARKING_ONLY)
if(OpenMP_FOUND)
message(STATUS "Adding OpenMP Offloading Validiation & Verification")
else()
message(STATUS "NOT using OpenMP Validiation & Verification because OpenMP was not found")
return()
endif()
list(REMOVE_DUPLICATES SYSTEM_GPU)
foreach(list_option ${SYSTEM_GPU})
string(TOUPPER ${list_option} list_option)
if(list_option IN_LIST ALL_LIST_OPTIONS)
if(list_option STREQUAL "AMD")
list(APPEND CHOOSEN_LISTS ${AMD})
message(STATUS "adding AMD")
endif()
if(list_option STREQUAL "NVIDIA")
list(APPEND CHOOSEN_LISTS ${NVIDIA})
message(STATUS "adding NVIDIA")
endif()
if(list_option STREQUAL "INTEL")
list(APPEND CHOOSEN_LISTS ${INTEL})
message(STATUS "adding INTEL")
endif()
if(list_option STREQUAL "REGRESSION")
list(APPEND CHOOSEN_LISTS ${REGRESSION})
message(STATUS "adding REGRESSION")
endif()
else()
message(STATUS "Option is unrecognized (${list_option})")
endif()
endforeach()
list(REMOVE_DUPLICATES CHOOSEN_LISTS)
foreach (_lang in C CXX Fortran)
if(CMAKE_${_lang}_COMPILER)
add_sollvevv(${_lang})
endif()
endforeach ()
endif ()