diff --git a/External/CMakeLists.txt b/External/CMakeLists.txt index 70e5376256..d01cb00747 100644 --- a/External/CMakeLists.txt +++ b/External/CMakeLists.txt @@ -6,3 +6,4 @@ add_subdirectory(Povray) add_subdirectory(SPEC) add_subdirectory(skidmarks10) add_subdirectory(sollve_vv) +add_subdirectory(OpenACCV_V) diff --git a/External/OpenACCV_V/CMakeLists.txt b/External/OpenACCV_V/CMakeLists.txt new file mode 100644 index 0000000000..5cc7b91ab2 --- /dev/null +++ b/External/OpenACCV_V/CMakeLists.txt @@ -0,0 +1,52 @@ +# OpenACCV&V Validation & Verification Suite +# https://github.com/OpenACCUserGroup/OpenACCV-V + +include(External) + +option(TEST_SUITE_FORCE_ALL "Execute all OpenACC V&V tests, even those known to be unsupported by Clang" OFF) + +set(TEST_SUITE_OFFLOADING_FLAGS --offload-arch=native CACHE STRING "Compiler arguments for offloading") +set(TEST_SUITE_OFFLOADING_LDFLAGS --offload-arch=native CACHE STRING "Linker arguments for offloading") + +function (add_OpenACC_vv LANG) + 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_OpenACCVV_ROOT}/Tests" "${TEST_SUITE_OpenACCVV_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}") + set(_name "acctargetvv-${_basename}.${_ext}") + + llvm_test_run() + + llvm_test_executable(${_name} "${TEST_SUITE_OpenACCVV_ROOT}/Tests/${_file}") + + # CMake's find_package(OpenACC) currently does not not introspect flags necessary for offloading. + target_compile_options(${_name} PUBLIC ${TEST_SUITE_OFFLOADING_FLAGS}) + target_link_options(${_name} PUBLIC ${TEST_SUITE_OFFLOADING_LDFLAGS}) + endforeach () +endfunction () + +llvm_externals_find(TEST_SUITE_OpenACCVV_ROOT "OpenACCV_V" "OpenACC Offloading Validation & Verification Suite") + +if(TEST_SUITE_OpenACCVV_ROOT AND NOT TEST_SUITE_BENCHMARKING_ONLY) + if(${CMAKE_VERSION} VERSION_LESS 3.25) + message(STATUS "The cmake version must be at least 3.25 to perform OpenACC tests") + endif() + + foreach (_lang in C CXX Fortran) + if(CMAKE_${_lang}_COMPILER) + add_OpenACC_vv(${_lang}) + endif() + endforeach () +endif () diff --git a/External/OpenACCV_V/README b/External/OpenACCV_V/README new file mode 100644 index 0000000000..914d45ca65 --- /dev/null +++ b/External/OpenACCV_V/README @@ -0,0 +1,52 @@ +OpenACC Validation & Verification Suite +https://github.com/OpenACCUserGroup/OpenACCV-V + +This directory contains a CMakeLists.txt for the OpenACC +Validation and Verification Suite so it can be built as part +of the LLVM test-suite. Its sources are not part of the test-suite but +have to be fetched separately from https://github.com/OpenACCUserGroup/OpenACCV-V + +The sources are expected either in ${TEST_SUITE_OpenACCVV_ROOT} or +where TEST_SUITE_OpenACCVV_ROOT is CMake configure variables. If none of +them are set, it will look into +${CMAKE_SOURCE_DIR}/Extern/External/OpenACC_vv where +CMAKE_SOURCE_DIR is the root directory of the test-suite sources. + +The CMakeLists.txt will search for all C 、C++ and Fortran source files of the +OpenACC V&V suite, compile and run them. That is, running llvm-lit +(or "make check") will require a compatible accelerator on the running +machine. + +OpenACC support is autodetected by CMake, but clang requires additional +flags to enable offloading. An example run is: + +$ cd /path/to/llvm-test-suit +$ mkdir build +$ cd build +$ cmake -GNinja -DTEST_SUITE_FORTRAN=ON \ + -DTEST_SUITE_BENCHMARKING_ONLY=OFF \ + -DTEST_SUITE_RUN_BENCHMARKS=ON \ + -DTEST_SUITE_COLLECT_STATS=OFF \ + -DTEST_SUITE_SUBDIRS="External/OpenACCV_V" \ + -DCMAKE_BUILD_TYPE=Release \ + -DTEST_SUITE_OpenACCVV_ROOT=/path/to/OpenACCV_V \ + -DTEST_SUITE_COLLECT_CODE_SIZE=OFF \ + -DTEST_SUITE_LIT=${HOME}/path/to/llvm-project/build/bin/llvm-lit \ + -DCMAKE_C_COMPILER=${HOME}/install/llvm/bin/clang \ + -DCMAKE_CXX_COMPILER=${HOME}/install/llvm/bin/clang++ \ + -DCMAKE_Fortran_COMPILER=${HOME}/install/llvm/bin/flang \ + -DTEST_SUITE_OFFLOADING_FLAGS="-fopenacc;-lm;-foffload='-lm';" \ + -DTEST_SUITE_OFFLOADING_LDFLAGS="-fopenacc;-lm;-foffload='-lm';" \ + ../ + +To make: +$ LD_LIBRARY_PATH=${HOME}/install/llvm-project/release/lib +$ ninja check + +To run: +The test results are saved in the reule file +$ llvm-lit -svj1 --shuffle --xunit-xml-output=result-xunit.xml . + +Attention: + Because find_package(OpenACC) is used in this test case, attempting to execute this test case requires cmake version >= 3.25 + take a closer look at FindOpenACC in cmake:https://cmake.org/cmake/help/latest/module/FindOpenACC.html