From 1c952554f267a06b7f45f52730f66b1ae07f08fc Mon Sep 17 00:00:00 2001 From: Aaron Jarmusch Date: Thu, 1 Feb 2024 11:16:47 -0800 Subject: [PATCH 1/4] [External] Add OpenACC_VV External Project --- CMakeLists.txt | 2 ++ External/CMakeLists.txt | 1 + External/OpenACCV_V/CMakeLists.txt | 54 ++++++++++++++++++++++++++++++ 3 files changed, 57 insertions(+) create mode 100644 External/OpenACCV_V/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 734980fbff..60ab3d1e2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,6 +247,8 @@ include(TestSuite) include(SingleMultiSource) # Needs by External/sollve_vv. find_package(OpenMP) +# Needs by External/OpenACCV_V. +find_package(OpenACC) # Fortran Helper Modules if(TEST_SUITE_FORTRAN) include(Fortran) diff --git a/External/CMakeLists.txt b/External/CMakeLists.txt index 785d22fb07..9583a98d6a 100644 --- a/External/CMakeLists.txt +++ b/External/CMakeLists.txt @@ -7,4 +7,5 @@ add_subdirectory(Povray) add_subdirectory(SPEC) add_subdirectory(skidmarks10) add_subdirectory(sollve_vv) +add_subdirectory(OpenACCV_V) add_subdirectory(smoke) diff --git a/External/OpenACCV_V/CMakeLists.txt b/External/OpenACCV_V/CMakeLists.txt new file mode 100644 index 0000000000..e9b5f95f62 --- /dev/null +++ b/External/OpenACCV_V/CMakeLists.txt @@ -0,0 +1,54 @@ +# 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}") + + target_link_options(${_name} PRIVATE ${OpenACC_${LANG}_FLAGS}) + + # 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 () From c42ff78687ac7a4debc6ccb50be09e9e905af1a5 Mon Sep 17 00:00:00 2001 From: Aaron Jarmusch Date: Thu, 1 Feb 2024 11:39:26 -0800 Subject: [PATCH 2/4] Adding README and documentation to CMakeLists --- External/OpenACCV_V/CMakeLists.txt | 1 + External/OpenACCV_V/README | 52 ++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 External/OpenACCV_V/README diff --git a/External/OpenACCV_V/CMakeLists.txt b/External/OpenACCV_V/CMakeLists.txt index e9b5f95f62..34b1f9b377 100644 --- a/External/OpenACCV_V/CMakeLists.txt +++ b/External/OpenACCV_V/CMakeLists.txt @@ -31,6 +31,7 @@ function (add_OpenACC_vv LANG) llvm_test_executable(${_name} "${TEST_SUITE_OPENACCVV_ROOT}/Tests/${_file}") + # Add -fopenmp to linker command line; only done with target_link_options. target_link_options(${_name} PRIVATE ${OpenACC_${LANG}_FLAGS}) # CMake's find_package(OpenACC) currently does not not introspect flags necessary for offloading. diff --git a/External/OpenACCV_V/README b/External/OpenACCV_V/README new file mode 100644 index 0000000000..bdd63b2444 --- /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="-lm;-foffload='-lm';" \ + -DTEST_SUITE_OFFLOADING_LDFLAGS="-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 From bf000ed4a7207588cfc9a0d6f6a2bfa9a89e98e1 Mon Sep 17 00:00:00 2001 From: Aaron Jarmusch Date: Tue, 6 Feb 2024 14:18:37 -0800 Subject: [PATCH 3/4] Fixing some typos in code --- External/OpenACCV_V/CMakeLists.txt | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/External/OpenACCV_V/CMakeLists.txt b/External/OpenACCV_V/CMakeLists.txt index 34b1f9b377..9c45eca645 100644 --- a/External/OpenACCV_V/CMakeLists.txt +++ b/External/OpenACCV_V/CMakeLists.txt @@ -8,7 +8,16 @@ option(TEST_SUITE_FORCE_ALL "Execute all OpenACC V&V tests, even those known to 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") +set(EXPECT_FAIL + ) + function (add_OpenACC_vv LANG) + + if (NOT OpenACC_${LANG}_FOUND) + message(FATAL_ERROR "OpenACC for $(LANG} not found ") + return () + endif () + if ("${LANG}" STREQUAL "C") set(_langext ".c") elseif ("${LANG}" STREQUAL "CXX") @@ -23,15 +32,21 @@ function (add_OpenACC_vv LANG) 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}") + + if (NOT TEST_SUITE_FORCE_ALL AND "$(_file)" IN_LIST EXPECT_FAIL) + message(STATUS "Skipping OpenACC V&V test ${_file}") + continue () + else () + message(STATUS "Compiling OpenACC V&V test ${_file}") + endif () llvm_test_run() llvm_test_executable(${_name} "${TEST_SUITE_OPENACCVV_ROOT}/Tests/${_file}") - # Add -fopenmp to linker command line; only done with target_link_options. + # Add -fopenacc to linker command line; only done with target_link_options. target_link_options(${_name} PRIVATE ${OpenACC_${LANG}_FLAGS}) # CMake's find_package(OpenACC) currently does not not introspect flags necessary for offloading. @@ -42,7 +57,15 @@ 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(OpenACC_FOUND) + message(STATUS "Adding OpenACC Validiation & Verification") + else() + message(STATUS "NOT using OpenACC Validiation & Verification because OpenACC was not found") + return() + endif() + if(${CMAKE_VERSION} VERSION_LESS 3.25) message(STATUS "The cmake version must be at least 3.25 to perform OpenACC tests") endif() From debca104efdb99e17a358656c7f77794813cfae6 Mon Sep 17 00:00:00 2001 From: Aaron Jarmusch Date: Tue, 6 Feb 2024 14:19:25 -0800 Subject: [PATCH 4/4] Added builtin support for -fexperimental-openacc-macro-override --- External/OpenACCV_V/CMakeLists.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/External/OpenACCV_V/CMakeLists.txt b/External/OpenACCV_V/CMakeLists.txt index 9c45eca645..979a13b2bc 100644 --- a/External/OpenACCV_V/CMakeLists.txt +++ b/External/OpenACCV_V/CMakeLists.txt @@ -46,6 +46,10 @@ function (add_OpenACC_vv LANG) llvm_test_executable(${_name} "${TEST_SUITE_OPENACCVV_ROOT}/Tests/${_file}") + if (ENABLE_EXPERIMENTAL_OPENACC_MACRO_OVERRIDE) + target_compile_options(${_name} PUBLIC -fexperimental-openacc-macro-override) + endif () + # Add -fopenacc to linker command line; only done with target_link_options. target_link_options(${_name} PRIVATE ${OpenACC_${LANG}_FLAGS})