CUDA: Lower minimum device architecture check to sm_60.

libeigen/eigen!2975

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 994f2e2..d5dde5c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -715,7 +715,7 @@
   endif()
 
   set(EIGEN_CUDA_CXX_FLAGS "" CACHE STRING "Additional flags to pass to the cuda compiler.")
-  set(EIGEN_CUDA_COMPUTE_ARCH "" CACHE STRING "The CUDA compute architecture(s) to target when compiling CUDA code, as a ;-separated list of sm_XX numbers (e.g. 75;90). Empty selects sm_70, or sm_75 with CUDA 13 and later, which dropped Volta.")
+  set(EIGEN_CUDA_COMPUTE_ARCH "" CACHE STRING "The CUDA compute architecture(s) to target when compiling CUDA code, as a ;-separated list of sm_XX numbers (e.g. 75;90). Empty selects sm_60, or sm_75 with CUDA 13 and later, which dropped Pascal and Volta.")
 
   option(EIGEN_TEST_SYCL "Add Sycl support." OFF)
   if(EIGEN_TEST_SYCL)
diff --git a/Eigen/src/Core/arch/GPU/PacketMath.h b/Eigen/src/Core/arch/GPU/PacketMath.h
index e5a6597..e65bc1f 100644
--- a/Eigen/src/Core/arch/GPU/PacketMath.h
+++ b/Eigen/src/Core/arch/GPU/PacketMath.h
@@ -19,7 +19,7 @@
 namespace internal {
 
 // Read-only data cached load (__ldg) and native FP16 arithmetic are available
-// on all supported GPU architectures (sm_70+ for CUDA, GFX906+ for HIP).
+// on all supported GPU architectures (sm_60+ for CUDA, GFX906+ for HIP).
 
 // We need to distinguish ‘clang as the CUDA compiler’ from ‘clang as the host compiler,
 // invoked by NVCC’ (e.g. on MacOS). The former needs to see both host and device implementation
diff --git a/Eigen/src/Core/util/Macros.h b/Eigen/src/Core/util/Macros.h
index d4a41c0..8e6e0e7 100644
--- a/Eigen/src/Core/util/Macros.h
+++ b/Eigen/src/Core/util/Macros.h
@@ -603,11 +603,11 @@
 #endif
 
 // Native FP16 packet math intrinsics (e.g. __hfma2, h2exp, h2log) are only
-// declared by the CUDA headers when __CUDA_ARCH__ >= 530. Eigen's documented
-// floor is sm_70, so guard the device pass with a clear error rather than
-// surfacing as "identifier `__hfma2` is undefined" deep inside PacketMath.h.
-#if defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH < 700
-#error "Eigen requires CUDA compute capability >= 7.0 (sm_70). Compile with -arch=sm_70 or higher."
+// declared by the CUDA headers when __CUDA_ARCH__ >= 530. Guard the device
+// pass with a clear error rather than surfacing as "identifier `__hfma2` is
+// undefined" deep inside PacketMath.h.
+#if defined(EIGEN_CUDA_ARCH) && EIGEN_CUDA_ARCH < 600
+#error "Eigen requires CUDA compute capability >= 6.0 (sm_60). Compile with -arch=sm_60 or higher."
 #endif
 
 #if defined(__HIPCC__) && !defined(EIGEN_NO_HIP) && !defined(__SYCL_DEVICE_ONLY__)
diff --git a/ci/build.linux.gitlab-ci.yml b/ci/build.linux.gitlab-ci.yml
index 28c1032..953787e 100644
--- a/ci/build.linux.gitlab-ci.yml
+++ b/ci/build.linux.gitlab-ci.yml
@@ -284,10 +284,11 @@
   variables:
     # Additional flags passed to the cuda compiler.
     EIGEN_CI_CUDA_CXX_FLAGS: ""
-    # Default architecture coverage spans the GPUs used by CI: GitLab's SaaS
-    # runners are Tesla T4 (sm_75), and eigen-gpu-testing-001.gcloud is an L4
-    # (sm_89). Jobs tied to one runner pool may override this set below.
-    EIGEN_CI_CUDA_COMPUTE_ARCH: "75;89"
+    # Default architecture coverage spans the minimum supported architecture
+    # (sm_60) and the GPUs used by CI: GitLab's SaaS runners are Tesla T4
+    # (sm_75), and eigen-gpu-testing-001.gcloud is an L4 (sm_89). Jobs tied to
+    # one runner pool may override this set below.
+    EIGEN_CI_CUDA_COMPUTE_ARCH: "60;75;89"
     EIGEN_CI_BUILD_TARGET: buildtests_gpu
     EIGEN_CI_TEST_CUDA_CLANG: "off"
     EIGEN_CI_TEST_CUDA_NVC: "off"
diff --git a/cmake/EigenTesting.cmake b/cmake/EigenTesting.cmake
index ae5944b..ed47a68 100644
--- a/cmake/EigenTesting.cmake
+++ b/cmake/EigenTesting.cmake
@@ -90,14 +90,14 @@
 # ccache does not cache; expect those as misses in the statistics.
 # Resolve EIGEN_CUDA_COMPUTE_ARCH once find_package(CUDA) has set CUDA_VERSION.
 # The cache entry defaults to empty, which selects the oldest architecture the
-# toolkit still compiles for: sm_70, Eigen's documented floor (see Macros.h),
-# or sm_75 from CUDA 13 on, which dropped offline compilation for Volta.  Sets
-# the directory-scope variable the arch flags are built from; an explicit cache
-# value is used as given.
+# toolkit still compiles for: sm_60, Eigen's documented floor (see Macros.h),
+# or sm_75 from CUDA 13 on, which dropped offline compilation for Pascal and
+# Volta. Sets the directory-scope variable the arch flags are built from; an
+# explicit cache value is used as given.
 macro(ei_cuda_resolve_compute_arch)
   if("${EIGEN_CUDA_COMPUTE_ARCH}" STREQUAL "")
     if(CUDA_VERSION VERSION_LESS 13.0)
-      set(EIGEN_CUDA_COMPUTE_ARCH 70)
+      set(EIGEN_CUDA_COMPUTE_ARCH 60)
     else()
       set(EIGEN_CUDA_COMPUTE_ARCH 75)
     endif()