diff --git a/gpucublas/compute/CMakeLists.txt b/gpucublas/compute/CMakeLists.txt
index 1691581e744da88cf6cc0e631937e2bf94f7ef29..5f2987d984f4953d479665b25b494c1d2cf6a213 100644
--- a/gpucublas/compute/CMakeLists.txt
+++ b/gpucublas/compute/CMakeLists.txt
@@ -69,196 +69,7 @@ else()
 endif()
 
 if (CUDAToolkit_FOUND)
-  set(CMAKE_CUDA_STANDARD 11)
-
-  # Define the architectures (inspired from the MAGMA project)
-  set( CHAMELEON_CUDA_TARGETS "Kepler Maxwell Pascal Volta Ampere" CACHE STRING "CUDA architectures to compile for; one or more of Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Ampere, Hopper, or valid sm_[0-9][0-9]" )
-
-  # NVCC options for the different cards
-  # sm_xx is binary, compute_xx is PTX for forward compatibility
-  # MIN_ARCH is the lowest requested version
-
-  if(WIN32)
-    # Disable separable compilation on Windows because object linking list
-    # becomes too long when building multiple archs and MSVC throws errors
-    set(CUDA_SEPARABLE_COMPILATION OFF)
-  else()
-    set(CUDA_SEPARABLE_COMPILATION ON)
-  endif()
-
-  set(__cuda_architectures)
-
-  # Architectures by names
-  # ----------------------
-  if (CHAMELEON_CUDA_TARGETS MATCHES Fermi)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_20" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Kepler)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_30 sm_35 sm_37" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Maxwell)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_50" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Pascal)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_60" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Volta)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_70" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Turing)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_75" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Ampere)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_80" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES Hopper)
-    set( CHAMELEON_CUDA_TARGETS "${CHAMELEON_CUDA_TARGETS} sm_90" )
-  endif()
-
-  # Architectures versions
-  # ----------------------
-  if ( (CHAMELEON_CUDA_TARGETS MATCHES sm_20) AND (CUDA_VERSION VERSION_LESS "8.0") )
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 200 )
-    endif()
-    list(APPEND __cuda_architectures 20)
-    message( STATUS "    compile for CUDA arch 2.0 (Fermi)" )
-  endif()
-
-  if ( (CHAMELEON_CUDA_TARGETS MATCHES sm_30) AND (CUDA_VERSION VERSION_LESS "10.0") )
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 300 )
-    endif()
-    list(APPEND __cuda_architectures 30)
-    message( STATUS "    compile for CUDA arch 3.0 (Kepler)" )
-  endif()
-
-  if ( (CHAMELEON_CUDA_TARGETS MATCHES sm_35) AND (CUDA_VERSION VERSION_LESS "11.0") )
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 300 )
-    endif()
-    list(APPEND __cuda_architectures 35)
-    message( STATUS "    compile for CUDA arch 3.5 (Kepler)" )
-  endif()
-
-  if ( (CHAMELEON_CUDA_TARGETS MATCHES sm_50) AND (CUDA_VERSION VERSION_LESS "11.0") )
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 500 )
-    endif()
-    list(APPEND __cuda_architectures 50)
-    message( STATUS "    compile for CUDA arch 5.0 (Maxwell)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_52)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 520 )
-    endif()
-    list(APPEND __cuda_architectures 52)
-    message( STATUS "    compile for CUDA arch 5.2 (Maxwell)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_53)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 530 )
-    endif()
-    list(APPEND __cuda_architectures 53)
-    message( STATUS "    compile for CUDA arch 5.3 (Maxwell)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_60)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 600 )
-    endif()
-    list(APPEND __cuda_architectures 60)
-    message( STATUS "    compile for CUDA arch 6.0 (Pascal)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_61)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 610 )
-    endif()
-    list(APPEND __cuda_architectures 61)
-    message( STATUS "    compile for CUDA arch 6.1 (Pascal)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_62)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 620 )
-    endif()
-    list(APPEND __cuda_architectures 62)
-    message( STATUS "    compile for CUDA arch 6.2 (Pascal)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_70)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 700 )
-    endif()
-    list(APPEND __cuda_architectures 70)
-    message( STATUS "    compile for CUDA arch 7.0 (Volta)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_71)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 710 )
-    endif()
-    list(APPEND __cuda_architectures 71)
-    message( STATUS "    compile for CUDA arch 7.1 (Volta)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_75)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 750 )
-    endif()
-    list(APPEND __cuda_architectures 75)
-    message( STATUS "    compile for CUDA arch 7.5 (Turing)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_80)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 800 )
-    endif()
-    list(APPEND __cuda_architectures 80)
-    message( STATUS "    compile for CUDA arch 8.0 (Ampere)" )
-  endif()
-
-  if (CHAMELEON_CUDA_TARGETS MATCHES sm_90)
-    if (NOT MIN_ARCH)
-      set( MIN_ARCH 900 )
-    endif()
-    list(APPEND __cuda_architectures 90)
-    message( STATUS "    compile for CUDA arch 9.0 (Hopper)" )
-  endif()
-
-  if (NOT MIN_ARCH)
-    message( FATAL_ERROR "CHAMELEON_CUDA_TARGETS must contain one or more of Fermi, Kepler, Maxwell, Pascal, Volta, Turing, Ampere, or valid sm_[0-9][0-9]" )
-  endif()
-
-  # Remove extra
-  # ------------
-  if(CUDA_VERSION VERSION_GREATER_EQUAL "8.0")
-    list(REMOVE_ITEM __cuda_architectures "20" "21")
-  endif()
-
-  if(CUDA_VERSION VERSION_GREATER_EQUAL "9.0")
-    list(REMOVE_ITEM __cuda_architectures "20" "21")
-  endif()
-
-  if(CUDA_VERSION VERSION_GREATER_EQUAL "10.0")
-    list(REMOVE_ITEM __cuda_architectures "30" "32")
-  endif()
-
-  if(CUDA_VERSION VERSION_GREATER_EQUAL "11.0")
-    list(REMOVE_ITEM __cuda_architectures "35" "50")
-  endif()
-
-  set(CMAKE_CUDA_ARCHITECTURES "${__cuda_architectures}")
+  include(SetCMakeCudaArchitectures)
 
   set(ZSRC
     ${ZSRC}