From b2cb6ced60be899c52b1bc1973c6f12f0e8324ec Mon Sep 17 00:00:00 2001
From: Thorsten Hater <24411438+thorstenhater@users.noreply.github.com>
Date: Fri, 21 Jan 2022 17:31:40 +0100
Subject: [PATCH] CMake CUDA clean-up. (#1804)

- Bump CMake to 3.18 for better CUDA support.
- Clean-up our use of said support.
- Remove old cruft and workarounds.
- Maintenance in CI: enable MacOS 11; bump CMake versions to 3.18 / 3.22; bump bors CMake to 3.18

Fixes #1790
---
 .github/workflows/basic.yml   | 18 +++++-----
 CMakeLists.txt                | 63 +++++++++++------------------------
 ci/release/build.Dockerfile   |  4 +--
 doc/install/build_install.rst |  2 +-
 test/CMakeLists.txt           |  1 -
 5 files changed, 31 insertions(+), 57 deletions(-)

diff --git a/.github/workflows/basic.yml b/.github/workflows/basic.yml
index 7fe497c5..c4492e85 100644
--- a/.github/workflows/basic.yml
+++ b/.github/workflows/basic.yml
@@ -19,7 +19,7 @@ jobs:
             cc:    "gcc-8",
             cxx:   "g++-8",
             py:    "3.6",
-            cmake: "3.12.x",
+            cmake: "3.18.x",
             mpi:   "ON",
             simd:  "OFF"
           }
@@ -29,7 +29,7 @@ jobs:
             cc:    "clang-8",
             cxx:   "clang++-8",
             py:    "3.6",
-            cmake: "3.12.x",
+            cmake: "3.18.x",
             mpi:   "ON",
             simd:  "OFF"
           }
@@ -39,7 +39,7 @@ jobs:
             cc:    "clang",
             cxx:   "clang++",
             py:    "3.6",
-            cmake: "3.12.x",
+            cmake: "3.18.x",
             mpi:   "ON",
             simd:  "OFF"
           }
@@ -49,7 +49,7 @@ jobs:
             cc:    "gcc-10",
             cxx:   "g++-10",
             py:    "3.9",
-            cmake: "3.19.x",
+            cmake: "3.22.x",
             mpi:   "ON",
             simd:  "OFF"
           }
@@ -59,7 +59,7 @@ jobs:
             cc:    "gcc-10",
             cxx:   "g++-10",
             py:    "3.9",
-            cmake: "3.19.x",
+            cmake: "3.22.x",
             mpi:   "OFF",
             simd:  "ON"
           }
@@ -69,17 +69,17 @@ jobs:
             cc:    "clang-10",
             cxx:   "clang++-10",
             py:    "3.9",
-            cmake: "3.19.x",
+            cmake: "3.22.x",
             mpi:   "ON",
             simd:  "OFF"
           }
         - {
             name:  "MacOS Max",
-            os:    "macos-10.15", # TODO: 11.0 is still private preview, fix later.
+            os:    "macos-11",
             cc:    "clang",
             cxx:   "clang++",
             py:    "3.9",
-            cmake: "3.19.x",
+            cmake: "3.22.x",
             mpi:   "ON",
             simd:  "OFF"
           }
@@ -98,7 +98,7 @@ jobs:
           sudo apt-get update
           sudo apt-get install -y "clang-8" "lldb-8" "lld-8" "clang-format-8" g++-8
       - name: Set up cmake
-        uses: jwlawson/actions-setup-cmake@v1.7
+        uses: jwlawson/actions-setup-cmake@v1.12
         with:
           cmake-version: ${{ matrix.config.cmake }}
       - name: Set up Python
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ace085f3..3853cf47 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,6 +1,9 @@
-cmake_minimum_required(VERSION 3.12)
+cmake_minimum_required(VERSION 3.18)
 include(CMakeDependentOption)
 
+# Make CUDA support throw errors if architectures remain unclear
+cmake_policy(SET CMP0104 NEW)
+
 file(READ VERSION FULL_VERSION_STRING)
 string(STRIP "${FULL_VERSION_STRING}" FULL_VERSION_STRING)
 string(REGEX MATCH "^[0-9]+(\\.[0-9]+)?(\\.[0-9]+)?(\\.[0-9]+)?" numeric_version "${FULL_VERSION_STRING}")
@@ -90,7 +93,7 @@ option(ARB_WITH_PYTHON "enable Python front end" OFF)
 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
 include(GitSubmodule) # required for check_git_submodule
 include(ErrorTarget)  # reguired for add_error_target
-include(FindThreadsCudaFix) # bug work around
+include(FindCUDAToolkit)
 
 # Set release as the default build type (CMake default is debug.)
 
@@ -100,40 +103,26 @@ if (NOT CMAKE_BUILD_TYPE)
     set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "debug" "release")
 endif()
 
-# When we find threads, prefer not to use the -pthread option
-# in order to avoid a CMake 3.12 issue.
-set(THREADS_PREFER_PTHREAD_FLAG OFF)
-
-# Add CUDA as a language if GPU support requested.
-# (This has to be set early so as to enable CUDA tests in generator
-# expressions.)
-
+# Add CUDA as a language if GPU support requested. (This has to be set early so
+# as to enable CUDA tests in generator expressions.)
 if(ARB_GPU STREQUAL "cuda")
     set(ARB_WITH_NVCC TRUE)
-
-    # CMake 18 and later set the default CUDA architecture for
-    # each target according to CMAKE_CUDA_ARCHITECTURES.
-    if (NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
-        set(CMAKE_CUDA_ARCHITECTURES 60 70 80)
-    endif()
-
-    # This fixes nvcc picking up a wrong host compiler for linking, causing issues
-    # with outdated libraries, eg libstdc++ and std::filesystem. Must happend before
-    # all calls to enable_language(CUDA)
+    # This fixes nvcc picking up a wrong host compiler for linking, causing
+    # issues with outdated libraries, eg libstdc++ and std::filesystem. Must
+    # happen before all calls to enable_language(CUDA)
     set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
-
     enable_language(CUDA)
-
-    # Despite native CUDA support, the CUDA package is still required to export
-    # the cuda library dependencies from the installed target.
-    find_package(CUDA 10 REQUIRED)
-
+    find_package(CUDAToolkit)
+    if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES)
+        if(CUDAToolkit_VERSION_MAJOR GREATER 10)
+            set(CMAKE_CUDA_ARCHITECTURES 60 70 80)
+        else()
+            set(CMAKE_CUDA_ARCHITECTURES 60 70)
+        endif()
+    endif()
 elseif(ARB_GPU STREQUAL "cuda-clang")
     set(ARB_WITH_CUDA_CLANG TRUE)
-
-    # The CUDA package is needed for clang compilation for the same reasons as above.
-    # enable_langaue(CUDA) has a bug with clang
-    find_package(CUDA 10 REQUIRED)
+    enable_language(CUDA)
 elseif(ARB_GPU STREQUAL "hip")
     set(ARB_WITH_HIP_CLANG TRUE)
 endif()
@@ -320,7 +309,6 @@ endif()
 #-----------------
 
 find_package(Threads REQUIRED)
-find_threads_cuda_fix()
 target_link_libraries(arbor-private-deps INTERFACE Threads::Threads)
 
 list(APPEND arbor_export_dependencies "Threads")
@@ -357,31 +345,18 @@ if(ARB_WITH_GPU)
 
     if(ARB_WITH_NVCC OR ARB_WITH_CUDA_CLANG)
         target_include_directories(arborenv-private-deps INTERFACE ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES})
-
         add_compile_options(
                 "$<$<COMPILE_LANGUAGE:CUDA>:-Xcudafe=--diag_suppress=integer_sign_change>"
                 "$<$<COMPILE_LANGUAGE:CUDA>:-Xcudafe=--diag_suppress=unsigned_compare_with_zero>")
     endif()
 
-
     if(ARB_WITH_NVCC)
-        target_compile_options(arbor-private-deps INTERFACE
-            $<$<COMPILE_LANGUAGE:CUDA>:-gencode=arch=compute_60,code=sm_60>)
-        target_compile_options(arbor-private-deps INTERFACE
-            $<$<COMPILE_LANGUAGE:CUDA>:-gencode=arch=compute_70,code=sm_70>)
-        if (${CUDA_VERSION_MAJOR} GREATER 10)
-            target_compile_options(arbor-private-deps INTERFACE
-                $<$<COMPILE_LANGUAGE:CUDA>:-gencode=arch=compute_80,code=sm_80>)
-        endif()
-
         target_compile_definitions(arbor-private-deps INTERFACE ARB_CUDA)
         target_compile_definitions(arborenv-private-deps INTERFACE ARB_CUDA)
-
     elseif(ARB_WITH_CUDA_CLANG)
         set(clang_options_ -DARB_CUDA -xcuda --cuda-gpu-arch=sm_60 --cuda-gpu-arch=sm_70 --cuda-gpu-arch=sm_80 --cuda-path=${CUDA_TOOLKIT_ROOT_DIR})
         target_compile_options(arbor-private-deps INTERFACE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
         target_compile_options(arborenv-private-deps INTERFACE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
-
     elseif(ARB_WITH_HIP_CLANG)
         set(clang_options_ -DARB_HIP -xhip --amdgpu-target=gfx906 --amdgpu-target=gfx900)
         target_compile_options(arbor-private-deps INTERFACE $<$<COMPILE_LANGUAGE:CXX>:${clang_options_}>)
diff --git a/ci/release/build.Dockerfile b/ci/release/build.Dockerfile
index fd67d5ce..5da2aeea 100644
--- a/ci/release/build.Dockerfile
+++ b/ci/release/build.Dockerfile
@@ -20,8 +20,8 @@ RUN apt-get update -qq && apt-get install -qq -y --no-install-recommends \
     rm -rf /var/lib/apt/lists/*
 
 # Install cmake
-RUN wget -q "https://github.com/Kitware/CMake/releases/download/v3.12.4/cmake-3.12.4-Linux-x86_64.tar.gz" -O cmake.tar.gz && \
-    echo "486edd6710b5250946b4b199406ccbf8f567ef0e23cfe38f7938b8c78a2ffa5f cmake.tar.gz" | sha256sum --check --quiet && \
+RUN wget -q "https://github.com/Kitware/CMake/releases/download/v3.18.6/cmake-3.18.6-Linux-x86_64.tar.gz" -O cmake.tar.gz && \
+    echo "87136646867ed65e935d6bacd44d52a740c448ad0806f6897d8c3d47ce438c8b cmake.tar.gz" | sha256sum --check --quiet && \
     tar --strip-components=1 -xzf cmake.tar.gz -C /usr/local && \
     rm -rf cmake.tar.gz
 
diff --git a/doc/install/build_install.rst b/doc/install/build_install.rst
index 95a75fa4..2555b4ce 100644
--- a/doc/install/build_install.rst
+++ b/doc/install/build_install.rst
@@ -28,7 +28,7 @@ with very few tools.
     Tool        Notes
     =========== ============================================
     Git         To check out the code, minimum version 2.0.
-    CMake       To set up the build, minimum version 3.12.
+    CMake       To set up the build, minimum version 3.18.
     compiler    A C++17 compiler. See `compilers <install-compilers_>`_.
     =========== ============================================
 
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index 7010a1a7..db3e8e7e 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -1,5 +1,4 @@
 find_package(Threads REQUIRED)
-find_threads_cuda_fix()
 
 add_library(gtest EXCLUDE_FROM_ALL STATIC gtest-all.cpp)
 target_include_directories(gtest PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
-- 
GitLab