mirror of
https://gitlab.kitware.com/vtk/vtk-m
synced 2024-09-19 18:45:43 +00:00
153 lines
6.4 KiB
CMake
153 lines
6.4 KiB
CMake
##============================================================================
|
|
## Copyright (c) Kitware, Inc.
|
|
## All rights reserved.
|
|
## See LICENSE.txt for details.
|
|
## This software is distributed WITHOUT ANY WARRANTY; without even
|
|
## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
## PURPOSE. See the above copyright notice for more information.
|
|
##
|
|
## Copyright 2014 Sandia Corporation.
|
|
## Copyright 2014 UT-Battelle, LLC.
|
|
## Copyright 2014 Los Alamos National Security.
|
|
##
|
|
## Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
|
|
## the U.S. Government retains certain rights in this software.
|
|
##
|
|
## Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
|
|
## Laboratory (LANL), the U.S. Government retains certain rights in
|
|
## this software.
|
|
##============================================================================
|
|
|
|
if (VTKm_CUDA_initialize_complete)
|
|
return()
|
|
endif (VTKm_CUDA_initialize_complete)
|
|
|
|
vtkm_configure_device(Base)
|
|
|
|
if (VTKm_Base_FOUND)
|
|
|
|
set(VTKm_CUDA_FOUND ${VTKm_ENABLE_CUDA})
|
|
if (NOT VTKm_CUDA_FOUND)
|
|
message(STATUS "This build of VTK-m does not include CUDA.")
|
|
endif ()
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Find CUDA library.
|
|
#---------------------------------------------------------------------------
|
|
if (VTKm_CUDA_FOUND)
|
|
find_package(CUDA)
|
|
mark_as_advanced(CUDA_BUILD_CUBIN
|
|
CUDA_BUILD_EMULATION
|
|
CUDA_HOST_COMPILER
|
|
CUDA_SDK_ROOT_DIR
|
|
CUDA_SEPARABLE_COMPILATION
|
|
CUDA_TOOLKIT_ROOT_DIR
|
|
CUDA_VERBOSE_BUILD
|
|
)
|
|
|
|
if (NOT CUDA_FOUND)
|
|
message(STATUS "CUDA not found")
|
|
set(VTKm_CUDA_FOUND)
|
|
endif ()
|
|
endif ()
|
|
|
|
if(VTKm_CUDA_FOUND)
|
|
#---------------------------------------------------------------------------
|
|
# Setup build flags for CUDA
|
|
#---------------------------------------------------------------------------
|
|
# Populates CUDA_NVCC_FLAGS with the best set of flags to compile for a
|
|
# given GPU architecture. The majority of developers should leave the
|
|
# option at the default of 'native' which uses system introspection to
|
|
# determine the smallest numerous of virtual and real architectures it
|
|
# should target.
|
|
#
|
|
# The option of 'all' is provided for people generating libraries that
|
|
# will deployed to any number of machines, it will compile all CUDA code
|
|
# for all major virtual architectures, guaranteeing that the code will run
|
|
# anywhere.
|
|
#
|
|
#
|
|
# 1 - native
|
|
# - Uses system introspection to determine compile flags
|
|
# 2 - fermi
|
|
# - Uses: --generate-code arch=compute_20,code=compute_20
|
|
# 3 - kepler
|
|
# - Uses: --generate-code arch=compute_30,code=compute_30
|
|
# - Uses: --generate-code arch=compute_35,code=compute_35
|
|
# 4 - maxwell
|
|
# - Uses: --generate-code arch=compute_50,code=compute_50
|
|
# - Uses: --generate-code arch=compute_52,code=compute_52
|
|
# 5 - all
|
|
# - Uses: --generate-code arch=compute_20,code=compute_20
|
|
# - Uses: --generate-code arch=compute_30,code=compute_30
|
|
# - Uses: --generate-code arch=compute_35,code=compute_35
|
|
# - Uses: --generate-code arch=compute_50,code=compute_50
|
|
#
|
|
|
|
#specify the property
|
|
set(VTKm_CUDA_Architecture "native" CACHE STRING "Which GPU Architecture(s) to compile for")
|
|
set_property(CACHE VTKm_CUDA_Architecture PROPERTY STRINGS native fermi kepler maxwell all)
|
|
|
|
#detect what the propery is set too
|
|
if(VTKm_CUDA_Architecture STREQUAL "native")
|
|
#run execute_process to do auto_detection
|
|
execute_process(COMMAND "${CUDA_NVCC_EXECUTABLE}" "-ccbin" "${CMAKE_CXX_COMPILER}" "--run" "${CMAKE_CURRENT_LIST_DIR}/VTKmDetectCUDAVersion.cxx"
|
|
RESULT_VARIABLE ran_properly
|
|
OUTPUT_VARIABLE run_output)
|
|
|
|
if(ran_properly EQUAL 0)
|
|
#find the position of the "--generate-code" output. With some compilers such as
|
|
#msvc we get compile output plus run output. So we need to strip out just the
|
|
#run output
|
|
string(FIND "${run_output}" "--generate-code" position)
|
|
string(SUBSTRING "${run_output}" ${position} -1 run_output)
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} ${run_output}")
|
|
else()
|
|
message(STATUS "Unable to run \"${CUDA_NVCC_EXECUTABLE}\" to autodetect GPU architecture."
|
|
"Falling back to fermi, please manually specify if you want something else.")
|
|
set(VTKm_CUDA_Architecture "fermi")
|
|
endif()
|
|
|
|
elseif(VTKm_CUDA_Architecture STREQUAL "fermi")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_20,code=compute_20")
|
|
elseif(VTKm_CUDA_Architecture STREQUAL "kepler")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_30,code=compute_30")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_35,code=compute_35")
|
|
elseif(VTKm_CUDA_Architecture STREQUAL "maxwell")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_50,code=compute_50")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_52,code=compute_52")
|
|
elseif(VTKm_CUDA_Architecture STREQUAL "all")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_20,code=compute_20")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_30,code=compute_30")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_35,code=compute_35")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_50,code=compute_50")
|
|
set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --generate-code arch=compute_52,code=compute_52")
|
|
endif()
|
|
endif()
|
|
|
|
#---------------------------------------------------------------------------
|
|
# Find Thrust library.
|
|
#---------------------------------------------------------------------------
|
|
if (VTKm_CUDA_FOUND)
|
|
find_package(Thrust)
|
|
|
|
if (NOT THRUST_FOUND)
|
|
message(STATUS "Thrust not found")
|
|
set(VTKm_CUDA_FOUND)
|
|
endif ()
|
|
endif ()
|
|
|
|
endif () # VTKm_Base_FOUND
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# Set up all these dependent packages (if they were all found).
|
|
#-----------------------------------------------------------------------------
|
|
if (VTKm_CUDA_FOUND)
|
|
set(VTKm_INCLUDE_DIRS
|
|
${VTKm_INCLUDE_DIRS}
|
|
${THRUST_INCLUDE_DIRS}
|
|
)
|
|
|
|
set(VTKm_CUDA_initialize_complete TRUE)
|
|
endif (VTKm_CUDA_FOUND)
|