This repository serve as a backup for my Maxwell-TD code
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

314 lines
9.1 KiB

# The variable CMAKE_CXX_STANDARD and related were introduced in CMake v3.1
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CMAKE_COLOR_MAKEFILE ON)
set(VERBOSE_BUILD ON)
# Require C++14 and disable compiler-specific extensions
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(DEFAULT_BUILD_TYPE "Release")
include("./config/defaults.cmake")
message(CUDA_ARCH = ${CUDA_ARCH})
#-------------------------------------------------------------------------------
# Project name and version
#-------------------------------------------------------------------------------
project(DGTD LANGUAGES CXX)
set(${PROJECT_NAME}_VERSION 0.0.0)
# Prohibit in-source build
if (${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR})
message(FATAL_ERROR
"DGTD does not support in-source CMake builds at this time.")
endif (${PROJECT_SOURCE_DIR} STREQUAL ${PROJECT_BINARY_DIR})
# Enable languages.
enable_language(CXX)
if (CUDA_NON_HEAVY)
message("CUDA_NON_HEAVY is ON")
else()
if (NOT CUDA_GPU_ZERO_COPY)
message("CUDA HEAVY MODE 1 is ON")
else()
message("CUDA HEAVY MODE 2 ZERO COPY is ON")
endif()
endif()
message(CUDA_ARCH = ${CUDA_ARCH})
if (DGTD_USE_CUDA OR DGTD_USE_CUDA_OPENCL)
# DGTD_USE_CUDA requires CMake 3.8 or newer (for direct CUDA support)
cmake_minimum_required(VERSION 3.8 FATAL_ERROR)
# Use ${CMAKE_CXX_COMPILER} as the cuda host compiler.
if (NOT CMAKE_CUDA_HOST_COMPILER)
set(CMAKE_CUDA_HOST_COMPILER ${CMAKE_CXX_COMPILER})
endif()
enable_language(CUDA)
set(CMAKE_CUDA_STANDARD 14)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_EXTENSIONS OFF)
# Find CUDA ARCH VERSION
include(FindCUDA/select_compute_arch)
CUDA_DETECT_INSTALLED_GPUS(INSTALLED_GPU_CCS)
set(INSTALLED_GPU_CCS "60;61;70;75;80;86")
list(GET INSTALLED_GPU_CCS 0 ARCH_NUMBER)
set(CUDA_ARCH "sm_${ARCH_NUMBER}")
set(CUDA_COMPUTE "compute_${ARCH_NUMBER}")
message(--------------------------------------------)
message(CUDA_ARCH = ${CUDA_ARCH})
message(CUDA_COMPUTE = ${CUDA_COMPUTE})
message(--------------------------------------------)
set(CUDA_FLAGS "--expt-extended-lambda --compiler-options -fPIC")
set(CUDA_FLAGS "-gencode code=${CUDA_ARCH},arch=${CUDA_COMPUTE} ${CUDA_FLAGS}")
string(REGEX REPLACE "^sm_" "" ARCH_NUMBER "${CUDA_ARCH}")
if ("${CUDA_ARCH}" STREQUAL "sm_${ARCH_NUMBER}")
set(CMAKE_CUDA_ARCHITECTURES "${ARCH_NUMBER}")
else()
message(FATAL_ERROR "Unknown CUDA_ARCH: ${CUDA_ARCH}")
endif()
message(STATUS "Using CUDA architecture: ${CUDA_ARCH}")
set(CUDA_FLAGS "-ccbin=${CMAKE_CXX_COMPILER} ${CUDA_FLAGS}")
set(CMAKE_CUDA_HOST_LINK_LAUNCHER ${CMAKE_CXX_COMPILER})
set(CMAKE_CUDA_FLAGS "${CUDA_FLAGS}" CACHE STRING "CUDA flags set for DGTD" FORCE)
set(CUSPARSE_FOUND TRUE)
set(CUSPARSE_LIBRARIES "cusparse")
endif()
# OpenCL
if(DGTD_USE_OPENCL OR DGTD_USE_CUDA_OPENCL)
find_package(OpenCL REQUIRED)
include_directories(${OpenCL_INCLUDE_DIRS})
link_directories(${OpenCL_LIBRARY})
endif()
if(DGTD_USE_OPENCL)
add_definitions(-DDGTD_USE_OPENCL)
endif()
# Suppress warnings about MACOSX_RPATH
set(CMAKE_MACOSX_RPATH OFF CACHE BOOL "")
# CMake needs to know where to find things
set(DGTD_CMAKE_PATH ${PROJECT_SOURCE_DIR}/config)
set(CMAKE_MODULE_PATH ${DGTD_CMAKE_PATH})
# Load DGTD CMake utilities.
include(CmakeUtilities)
#-------------------------------------------------------------------------------
# Process configuration options
#-------------------------------------------------------------------------------
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -no-pie -lpthread")
# DGTD_DEBUG
if (CMAKE_BUILD_TYPE MATCHES "Debug|debug|DEBUG")
set(DGTD_DEBUG ON)
else()
set(DGTD_DEBUG OFF)
endif()
# BLAS, LAPACK
#set(BLA_VENDOR OpenBLAS) # OpenBLAS can also be used to substitute LAPACK
# find_package(BLAS REQUIRED)
# find_package(LAPACK REQUIRED)
# message(STATUS BLAS found: ${BLAS_LIBRARIES})
# MKL
set(ENV{MKLROOT} "/opt/intel/oneapi/mkl/latest")
find_package(MKL CONFIG REQUIRED)
if (DGTD_USE_CUDA)
add_definitions(-DDGTD_USE_CUDA)
endif()
if (DGTD_USE_CUDA_OPENCL)
add_definitions(-DDGTD_USE_CUDA_OPENCL)
endif()
if (DGTD_USE_DOUBLE)
add_definitions(-DDGTD_USE_DOUBLE)
endif()
if (DGTD_USE_DOUBLE_TS)
add_definitions(-DDGTD_USE_DOUBLE_TS)
endif()
if (DGTD_WRITE_SURF_FIELDS)
add_definitions(-DDGTD_WRITE_SURF_FIELDS)
endif()
if (DGTD_INCIDENT_FIELDS)
add_definitions(-DDGTD_INCIDENT_FIELDS)
endif()
if (CUDA_NON_HEAVY)
add_definitions(-DCUDA_NON_HEAVY)
endif()
if (CUDA_GPU_ZERO_COPY)
add_definitions(-DCUDA_GPU_ZERO_COPY)
endif()
if (DGTD_USE_LTS)
add_definitions(-DDGTD_USE_LTS)
endif()
# OpenMP
if (DGTD_USE_OPENMP)
find_package(OpenMP REQUIRED)
set(OPENMP_LIBRARIES ${OpenMP_CXX_LIBRARIES})
if (OPENMP_FOUND)
message(STATUS "DGTD: using package OpenMP")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
if (DGTD_USE_CUDA OR DGTD_USE_CUDA_OPENCL)
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Xcompiler=${OpenMP_CXX_FLAGS}")
endif()
endif()
add_definitions(-DDGTD_USE_OPENMP)
endif()
message(STATUS "DGTD build type: CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
message(STATUS "DGTD version: v${DGTD_VERSION_STRING}")
#-------------------------------------------------------------------------------
# Define and configure the DGTD library
#-------------------------------------------------------------------------------
# Headers and sources
set(SOURCES "")
set(HEADERS "")
set(DGTD_SOURCE_DIRS fem utils)
foreach(DIR IN LISTS DGTD_SOURCE_DIRS)
add_subdirectory(${DIR})
endforeach()
if (DGTD_USE_CUDA OR DGTD_USE_CUDA_OPENCL)
set_source_files_properties(${SOURCES} PROPERTIES LANGUAGE CUDA)
endif()
add_subdirectory(config)
set(MASTER_HEADERS
${PROJECT_SOURCE_DIR}/MaxwellTD.cpp
${PROJECT_SOURCE_DIR}/dgtd-performance.hpp)
set(_lib_path "${CMAKE_INSTALL_PREFIX}/lib")
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH ON CACHE BOOL "")
set(CMAKE_INSTALL_RPATH "${_lib_path}" CACHE PATH "")
set(CMAKE_INSTALL_NAME_DIR "${_lib_path}" CACHE PATH "")
set(DGTD_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE PATH "The DGTD source directory" FORCE)
set(DGTD_INSTALL_DIR ${CMAKE_INSTALL_PREFIX} CACHE PATH "The DGTD install directory" FORCE)
# add the directory as -I to the compilation command line
include_directories(${PROJECT_SOURCE_DIR}/utils)
# include_directories(${PROJECT_SOURCE_DIR}/utils/lapack-3.9.1/CBLAS/include)
include_directories("/opt/intel/oneapi/mkl/latest/include")
include_directories("/usr/local/cuda/include")
include_directories(${PROJECT_SOURCE_DIR}/fem)
link_directories(${PROJECT_SOURCE_DIR}/lib)
link_directories("/opt/intel/oneapi/mkl/latest/lib/intel64")
link_directories("/usr/local/cuda/lib64/")
# Declaring the library
set(DGTD_ALL ${SOURCES} ${HEADERS} ${MASTER_HEADERS})
foreach(FNAME IN LISTS DGTD_ALL)
message(${FNAME})
endforeach()
# --------------------------------------
# Executable Name
set(EXE_NAME maxwelltd)
if (DGTD_USE_CUDA)
set(EXE_NAME ${EXE_NAME}_CUDA)
if (DGTD_USE_CUDA_OPENCL)
set(EXE_NAME ${EXE_NAME}_OPENCL)
endif()
if (NOT CUDA_NON_HEAVY)
if (CUDA_GPU_ZERO_COPY)
set(EXE_NAME ${EXE_NAME}_HEAVYZEROCOPY)
else()
set(EXE_NAME ${EXE_NAME}_HEAVY)
endif()
endif()
else()
set(EXE_NAME ${EXE_NAME}_CPU)
endif()
if (DGTD_USE_LTS)
set(EXE_NAME ${EXE_NAME}_LTS)
endif()
if (DGTD_USE_DOUBLE)
set(EXE_NAME ${EXE_NAME}_DOUBLEpre)
else()
set(EXE_NAME ${EXE_NAME}_FLOATpre)
endif()
if (DGTD_USE_DOUBLE_TS)
set(EXE_NAME ${EXE_NAME}_DOUBLEpro)
else()
set(EXE_NAME ${EXE_NAME}_FLOATpro)
endif()
# --------------------------------------
add_executable(${EXE_NAME} ${DGTD_ALL})
# lapack should be put before blas and cblas
# removed vtr quadrature tensor
target_link_libraries(${EXE_NAME} mkl_rt m register metis5 vtkIO vtkzlib vtkFiltering vtkCommon gfortran gomp dl pthread fftw3 cudart cublas cusolver)
# target_link_libraries(${EXE_NAME} m register lapack blas metis5 vtkIO vtkzlib vtkFiltering vtkCommon gfortran gomp dl pthread fftw3 cusolver cublas)
# EMoffice_Base --> m vtr tensor quadrature register
if(DGTD_USE_OPENCL OR DGTD_USE_CUDA_OPENCL)
target_link_libraries (${EXE_NAME} ${OpenCL_LIBRARY})
endif()
if(DGTD_USE_CUDA OR DGTD_USE_CUDA_OPENCL)
include_directories(${EXE_NAME} ${CUDA_INCLUDE_DIRS})
target_link_libraries (${EXE_NAME} ${CUDA_LIBRARIES})
endif()
set_target_properties(${EXE_NAME} PROPERTIES VERSION "${dgtd_VERSION}")
set_target_properties(${EXE_NAME} PROPERTIES SOVERSION "${dgtd_VERSION}")
set_target_properties(${EXE_NAME} PROPERTIES POSITION_INDEPENDENT_CODE ON)
if (DGTD_USE_CUDA OR DGTD_USE_CUDA_OPENCL)
set_target_properties(${EXE_NAME} PROPERTIES CUDA_SEPARABLE_COMPILATION ON CUDA_RESOLVE_DEVICE_SYMBOLS ON)
endif ()
# If building out-of-source, define DGTD_CONFIG_FILE to point to the config file inside the build directory.
if (NOT ("${PROJECT_SOURCE_DIR}" STREQUAL "${PROJECT_BINARY_DIR}"))
target_compile_definitions(${EXE_NAME} PRIVATE "DGTD_CONFIG_FILE=\"${PROJECT_BINARY_DIR}/config/_config.hpp\"")
endif()