|
|
|
|
@ -26,7 +26,6 @@ set_version(
|
|
|
|
|
GIT_DESCRIBE_VAR full_git_describe
|
|
|
|
|
CUSTOM_VERSION_FILE "${CMAKE_SOURCE_DIR}/.VERSION")
|
|
|
|
|
message( STATUS "Building PSBLAS1 version: ${full_git_describe}" )
|
|
|
|
|
|
|
|
|
|
#------------------------------------------
|
|
|
|
|
# Name project and specify source languages
|
|
|
|
|
#------------------------------------------
|
|
|
|
|
@ -76,6 +75,14 @@ else()
|
|
|
|
|
)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
#----------------------------------------------------
|
|
|
|
|
# Define -frecursive for GNU Fortran Compiler
|
|
|
|
|
#----------------------------------------------------
|
|
|
|
|
if ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU" )
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -frecursive")
|
|
|
|
|
message(STATUS "GNU Fortran COMPILER ${CMAKE_Fortran_FLAGS};")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message(STATUS "cmake flags? ${CMAKE_Fortran_FLAGS};")
|
|
|
|
|
|
|
|
|
|
@ -83,53 +90,78 @@ endif()
|
|
|
|
|
# Fortran name mangling introspection
|
|
|
|
|
#------------------------------------
|
|
|
|
|
include("${CMAKE_CURRENT_LIST_DIR}/cmake/CapitalizeString.cmake")
|
|
|
|
|
include(FortranCInterface)
|
|
|
|
|
CapitalizeString(${FortranCInterface_GLOBAL__CASE} fc_case)
|
|
|
|
|
message(STATUS "Name mangling capitalization: ${fc_case}")
|
|
|
|
|
message(STATUS "Name mangling fortran global suffix underscore: ${FortranCInterface_GLOBAL__SUFFIX}")
|
|
|
|
|
if(FortranCInterface_GLOBAL__SUFFIX STREQUAL "")
|
|
|
|
|
add_compile_options("-D${fc_case}Case")
|
|
|
|
|
elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "_")
|
|
|
|
|
add_compile_options("-D${fc_case}Underscore")
|
|
|
|
|
elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "__")
|
|
|
|
|
add_compile_options("-D${fc_case}DoubleUnderscore")
|
|
|
|
|
else()
|
|
|
|
|
message( FATAL_ERROR "Fortran name mangling suffix, \'${FortranCInterface_GLOBAL__SUFFIX}\', unknown to PSBLAS")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message(STATUS "win? ${WIN32};")
|
|
|
|
|
if(TRUE )#NOT ${WIN32})
|
|
|
|
|
#include(FortranCInterface)
|
|
|
|
|
#CapitalizeString(${FortranCInterface_GLOBAL__CASE} fc_case)
|
|
|
|
|
#message(STATUS "Name mangling capitalization: ${fc_case}")
|
|
|
|
|
#message(STATUS "Name mangling fortran global suffix underscore: ${FortranCInterface_GLOBAL__SUFFIX}")
|
|
|
|
|
#if(FortranCInterface_GLOBAL__SUFFIX STREQUAL "")
|
|
|
|
|
# add_compile_options("-D${fc_case}Case")
|
|
|
|
|
#elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "_")
|
|
|
|
|
# add_compile_options("-D${fc_case}Underscore")
|
|
|
|
|
#elseif(FortranCInterface_GLOBAL__SUFFIX STREQUAL "__")
|
|
|
|
|
# add_compile_options("-D${fc_case}DoubleUnderscore")
|
|
|
|
|
#else()
|
|
|
|
|
# message( FATAL_ERROR "Fortran name mangling suffix, \'${FortranCInterface_GLOBAL__SUFFIX}\', unknown to PSBLAS")
|
|
|
|
|
#endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# message(STATUS "win? ${WIN32};")
|
|
|
|
|
#if(TRUE)#NOT ${WIN32})
|
|
|
|
|
#previous check did not work if WIN32 is empty string
|
|
|
|
|
#----------------------------------------------
|
|
|
|
|
# Determine system endian-ness and pointer size
|
|
|
|
|
#----------------------------------------------
|
|
|
|
|
include(TestBigEndian)
|
|
|
|
|
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
|
|
|
|
|
if(IS_BIG_ENDIAN)
|
|
|
|
|
message( STATUS "System appears to be big endian.")
|
|
|
|
|
else()
|
|
|
|
|
message( STATUS "System appears to be little endian.")
|
|
|
|
|
add_compile_options(-DLittleEndian)
|
|
|
|
|
endif()
|
|
|
|
|
include(CheckTypeSize)
|
|
|
|
|
CHECK_TYPE_SIZE("void *" VOID_P_SIZE LANGUAGE C)
|
|
|
|
|
if(${VOID_P_SIZE} EQUAL 8)
|
|
|
|
|
add_compile_options(-DPtr64Bits)
|
|
|
|
|
endif()
|
|
|
|
|
message(STATUS "Have 64bit pointers")
|
|
|
|
|
# include(TestBigEndian)
|
|
|
|
|
# TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
|
|
|
|
|
# if(IS_BIG_ENDIAN)
|
|
|
|
|
# message( STATUS "System appears to be big endian.")
|
|
|
|
|
# else()
|
|
|
|
|
# message( STATUS "System appears to be little endian.")
|
|
|
|
|
# add_compile_options(-DLittleEndian)
|
|
|
|
|
# endif()
|
|
|
|
|
# include(CheckTypeSize)
|
|
|
|
|
# CHECK_TYPE_SIZE("void *" VOID_P_SIZE LANGUAGE C)
|
|
|
|
|
# if(${VOID_P_SIZE} EQUAL 8)
|
|
|
|
|
# add_compile_options(-DPtr64Bits)
|
|
|
|
|
# endif()
|
|
|
|
|
# message(STATUS "Have 64bit pointers")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#add define values for integer size (IPKx) and long size (LPKx)
|
|
|
|
|
CHECK_TYPE_SIZE("int" INT_SIZE LANGUAGE C)
|
|
|
|
|
CHECK_TYPE_SIZE("long" LONG_SIZE LANGUAGE C)
|
|
|
|
|
message(STATUS "INT SIZE ${INT_SIZE}")
|
|
|
|
|
#endif()
|
|
|
|
|
|
|
|
|
|
add_compile_options(-DIPK${INT_SIZE})
|
|
|
|
|
add_compile_options(-DLPK${LONG_SIZE})
|
|
|
|
|
message(STATUS "Using compiler ${CMAKE_C_COMPILER};")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set default values for IPK_SIZE and LPK_SIZE
|
|
|
|
|
set(DEFAULT_IPK_SIZE 4)
|
|
|
|
|
set(DEFAULT_LPK_SIZE 8)
|
|
|
|
|
|
|
|
|
|
# Allow user to override with command line definitions
|
|
|
|
|
if(NOT DEFINED CMAKE_PSB_IPK)
|
|
|
|
|
set(CMAKE_PSB_IPK ${DEFAULT_IPK_SIZE} CACHE STRING "Size of IPK (default: 4)")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(NOT DEFINED CMAKE_PSB_LPK)
|
|
|
|
|
set(CMAKE_PSB_LPK ${DEFAULT_LPK_SIZE} CACHE STRING "Size of LPK (default: 8)")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Use the passed values
|
|
|
|
|
set(IPK_SIZE ${CMAKE_PSB_IPK})
|
|
|
|
|
set(LPK_SIZE ${CMAKE_PSB_LPK})
|
|
|
|
|
# Define IPKDEF and LPKDEF based on the sizes
|
|
|
|
|
set(PSB_IPKDEF "#define PSB_IPK${IPK_SIZE}")
|
|
|
|
|
set(PSB_LPKDEF "#define PSB_LPK${LPK_SIZE}")
|
|
|
|
|
|
|
|
|
|
# Output the definitions for verification
|
|
|
|
|
message(STATUS "Using IPKDEF: ${PSB_IPKDEF}")
|
|
|
|
|
message(STATUS "Using LPKDEF: ${PSB_LPKDEF}")
|
|
|
|
|
|
|
|
|
|
#add_compile_options(-DPSB_IPK${IPK_SIZE})
|
|
|
|
|
#add_compile_options(-DPSB_LPK${LPK_SIZE})
|
|
|
|
|
# Add PSB_IPK/LPK flag only for fortran files.
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_IPK${IPK_SIZE}")
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_LPK${LPK_SIZE}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -149,7 +181,8 @@ end
|
|
|
|
|
SRC_EXT f90
|
|
|
|
|
)
|
|
|
|
|
if(HAVE_MOVE_ALLOC)
|
|
|
|
|
add_compile_options(-DHAVE_MOVE_ALLOC)
|
|
|
|
|
#add_compile_options(-DHAVE_MOVE_ALLOC)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DHAVE_MOVE_ALLOC")
|
|
|
|
|
message(STATUS "-DHAVE_MOVE_ALLOC")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
@ -158,8 +191,9 @@ CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
SRC_EXT f90
|
|
|
|
|
)
|
|
|
|
|
if(HAVE_VOLATILE)
|
|
|
|
|
add_compile_options(-DHAVE_VOLATILE)
|
|
|
|
|
message(STATUS "-DHAVE_VOLATILE")
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_VOLATILE)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_VOLATILE")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_VOLATILE")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
"use ISO_FORTRAN_ENV ; end"
|
|
|
|
|
@ -167,8 +201,9 @@ CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
SRC_EXT f90
|
|
|
|
|
)
|
|
|
|
|
if(HAVE_ISO_FORTRAN_ENV)
|
|
|
|
|
add_compile_options(-DHAVE_ISO_FORTRAN_ENV)
|
|
|
|
|
message(STATUS "-DHAVE_ISO_FORTRAN_ENV")
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_ISO_FORTRAN_ENV)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_ISO_FORTRAN_ENV")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_ISO_FORTRAN_ENV")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
"flush(5); end"
|
|
|
|
|
@ -176,8 +211,9 @@ CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
SRC_EXT f90
|
|
|
|
|
)
|
|
|
|
|
if(HAVE_FLUSH_STMT)
|
|
|
|
|
add_compile_options(-DHAVE_FLUSH_STMT)
|
|
|
|
|
message(STATUS "-DHAVE_FLUSH_STMT")
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_FLUSH_STMT)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_FLUSH_STMT")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_FLUSH_STMT")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
"
|
|
|
|
|
@ -202,8 +238,9 @@ end program"
|
|
|
|
|
SRC_EXT f90
|
|
|
|
|
)
|
|
|
|
|
if(HAVE_FINAL)
|
|
|
|
|
add_compile_options(-DHAVE_FINAL)
|
|
|
|
|
message(STATUS "-DHAVE_FINAL")
|
|
|
|
|
# add_compile_options(-DPSB_HAVE_FINAL)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_FINAL")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_FINAL")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
"
|
|
|
|
|
@ -222,8 +259,9 @@ end program"
|
|
|
|
|
HAVE_MOLD
|
|
|
|
|
SRC_EXT f90)
|
|
|
|
|
if(HAVE_MOLD)
|
|
|
|
|
add_compile_options(-DHAVE_MOLD)
|
|
|
|
|
message(STATUS "-DHAVE_MOLD")
|
|
|
|
|
# add_compile_options(-DPSB_HAVE_MOLD)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_MOLD")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_MOLD")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
"
|
|
|
|
|
@ -239,8 +277,9 @@ end program "
|
|
|
|
|
HAVE_EXTENDS_TYPE_OF
|
|
|
|
|
SRC_EXT f90)
|
|
|
|
|
if(HAVE_EXTENDS_TYPE_OF)
|
|
|
|
|
add_compile_options(-DHAVE_EXTENDS_TYPE_OF)
|
|
|
|
|
message(STATUS "-DHAVE_EXTENDS_TYPE_OF")
|
|
|
|
|
# add_compile_options(-DPSB_HAVE_EXTENDS_TYPE_OF)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_EXTENDS_TYPE_OF")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_EXTENDS_TYPE_OF")
|
|
|
|
|
endif()
|
|
|
|
|
CHECK_Fortran_SOURCE_COMPILES(
|
|
|
|
|
"
|
|
|
|
|
@ -261,8 +300,9 @@ end program"
|
|
|
|
|
HAVE_SAME_TYPE_AS
|
|
|
|
|
SRC_EXT f90)
|
|
|
|
|
if(HAVE_SAME_TYPE_AS)
|
|
|
|
|
add_compile_options(-DHAVE_SAME_TYPE_AS)
|
|
|
|
|
message(STATUS "-DHAVE_SAME_TYPE_AS")
|
|
|
|
|
# add_compile_options(-DPSB_HAVE_SAME_TYPE_AS)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_SAME_TYPE_AS")
|
|
|
|
|
message(STATUS "-DPSB_HAVE_SAME_TYPE_AS")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
#----------------------------------------------------------------------------
|
|
|
|
|
@ -307,18 +347,19 @@ https://github.com/sourceryinstitute/OpenCoarrays/issues/317.
|
|
|
|
|
include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH})
|
|
|
|
|
message(STATUS "${MPI_C_INCLUDE_PATH}; ${MPI_Fortran_INCLUDE_PATH};; ${CMAKE_Fortran_LINK_FLAGS} ;")
|
|
|
|
|
if(MPI_Fortran_HAVE_F90_MODULE OR MPI_Fortran_HAVE_F08_MODULE)
|
|
|
|
|
add_compile_options(-DMPI_MOD)
|
|
|
|
|
message(STATUS "-DMPI_MOD")
|
|
|
|
|
add_compile_options(-DPSB_MPI_MOD)
|
|
|
|
|
message(STATUS "-DPSB_MPI_MOD")
|
|
|
|
|
#add_compile_options(-DSERIAL_MPI) # Is it right??
|
|
|
|
|
#message(STATUS "-DSERIAL_MPI")
|
|
|
|
|
endif()
|
|
|
|
|
set(SERIAL_MPI OFF)
|
|
|
|
|
set(PSB_SERIAL_MPI OFF)
|
|
|
|
|
|
|
|
|
|
else()
|
|
|
|
|
message(STATUS "MPI not found, serial ahead")
|
|
|
|
|
add_compile_options(-DSERIAL_MPI)
|
|
|
|
|
add_compile_options(-DMPI_MOD)
|
|
|
|
|
set(SERIAL_MPI ON)
|
|
|
|
|
add_compile_options(-DPSB_SERIAL_MPI)
|
|
|
|
|
add_compile_options(-DPSB_MPI_MOD)
|
|
|
|
|
set(PSB_SERIAL_MPI ON)
|
|
|
|
|
set(CSERIALMPI "#define PSB_SERIAL_MPI")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
#-------------------------------------------------------
|
|
|
|
|
@ -338,7 +379,9 @@ if(NOT APPLE)
|
|
|
|
|
endif()
|
|
|
|
|
find_package(BLAS REQUIRED)
|
|
|
|
|
find_package(LAPACK REQUIRED)
|
|
|
|
|
add_compile_options(-DHAVE_LAPACK)
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_LAPACK)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_LAPACK")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#--------------------------------
|
|
|
|
|
@ -347,14 +390,187 @@ add_compile_options(-DHAVE_LAPACK)
|
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/cmake/FindMETIS.cmake)
|
|
|
|
|
find_package(METIS)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(METIS_FOUND)
|
|
|
|
|
message(STATUS "METIS PATH ${METIS_INCLUDES} and metis libraries ${METIS_LIBRARIES}")
|
|
|
|
|
# Make sure this path is correct
|
|
|
|
|
# set(METISINCFILE "metis.h") # Adjust this to your actual path
|
|
|
|
|
|
|
|
|
|
# Specify the configuration file
|
|
|
|
|
# set(HEADER_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/util/psb_metis_int.h.in")
|
|
|
|
|
# set(HEADER_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/psb_metis_int.h")
|
|
|
|
|
|
|
|
|
|
# Configure the header file
|
|
|
|
|
#configure_file(${HEADER_TEMPLATE} ${HEADER_OUTPUT} @ONLY)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Check for real sizes using try_compile
|
|
|
|
|
include(CheckCSourceCompiles)
|
|
|
|
|
|
|
|
|
|
# Function to check the size of a type
|
|
|
|
|
function(check_metis_real_type type_name)
|
|
|
|
|
set(source_code "
|
|
|
|
|
#include <metis.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
int main() {
|
|
|
|
|
printf(\"%zu\\n\", sizeof(${type_name}));
|
|
|
|
|
return 0;
|
|
|
|
|
}")
|
|
|
|
|
|
|
|
|
|
# Create a temporary source file
|
|
|
|
|
file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c" "${source_code}")
|
|
|
|
|
|
|
|
|
|
# Try to compile it
|
|
|
|
|
try_compile(COMPILER_RESULT "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp"
|
|
|
|
|
"${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c")
|
|
|
|
|
|
|
|
|
|
# Check the result and read the output
|
|
|
|
|
if (COMPILER_RESULT)
|
|
|
|
|
execute_process(COMMAND "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size"
|
|
|
|
|
OUTPUT_VARIABLE type_size)
|
|
|
|
|
string(STRIP "${type_size}" type_size)
|
|
|
|
|
if (type_name STREQUAL "float")
|
|
|
|
|
set(PSB_METIS_REAL_32 "${type_size}" PARENT_SCOPE)
|
|
|
|
|
# add_definitions(-DPSB_METIS_REAL_32)
|
|
|
|
|
set(CREALMETIS "#define PSB_METIS_REAL_32" PARENT_SCOPE)
|
|
|
|
|
elseif (type_name STREQUAL "double")
|
|
|
|
|
set(PSB_METIS_REAL_64 "${type_size}" PARENT_SCOPE)
|
|
|
|
|
#add_definitions(-DPSB_METIS_REAL_64)
|
|
|
|
|
set(CREALMETIS "#define PSB_METIS_REAL_64" PARENT_SCOPE)
|
|
|
|
|
endif()
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "Failed to compile test for type size: ${type_name}")
|
|
|
|
|
endif()
|
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
# Check for both float and double
|
|
|
|
|
check_metis_real_type(float)
|
|
|
|
|
check_metis_real_type(double)
|
|
|
|
|
|
|
|
|
|
# Set HAVE_METIS if METIS is found
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_METIS)
|
|
|
|
|
# set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_METIS")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Determine METIS_INDEX based on real type sizes
|
|
|
|
|
if(DEFINED PSB_METIS_REAL_32)
|
|
|
|
|
set(METIS_INDEX 32)
|
|
|
|
|
elseif(DEFINED PSB_METIS_REAL_64)
|
|
|
|
|
set(METIS_INDEX 64)
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "Neither METIS_REAL_32 nor METIS_REAL_64 is defined.")
|
|
|
|
|
set(METIS_INDEX 64) # Default to 64 if not defined
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Check conditions for LPK_SIZE and METIS_INDEX
|
|
|
|
|
if(LPK_SIZE STREQUAL "4")
|
|
|
|
|
if(METIS_INDEX STREQUAL "64")
|
|
|
|
|
# Mismatch between METIS size and PSBLAS LPK
|
|
|
|
|
message(FATAL " Mismatch between metis ${METIS_INDEX} size and psblas LPK size ${LPK_SIZE}")
|
|
|
|
|
set(METIS_FOUND FALSE)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(LPK_SIZE STREQUAL "8")
|
|
|
|
|
if(METIS_INDEX STREQUAL "32")
|
|
|
|
|
# Mismatch between METIS size and PSBLAS LPK
|
|
|
|
|
message(FATAL " Mismatch between metis ${METIS_INDEX} size and psblas LPK size ${LPK_SIZE}")
|
|
|
|
|
set(METIS_FOUND FALSE)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(METIS_FOUND)
|
|
|
|
|
|
|
|
|
|
# Make sure this path is correct
|
|
|
|
|
set(METISINCFILE "metis.h") # Adjust this to your actual path
|
|
|
|
|
|
|
|
|
|
# Specify the configuration file
|
|
|
|
|
set(HEADER_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/util/psb_metis_int.h.in")
|
|
|
|
|
set(HEADER_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/psb_metis_int.h")
|
|
|
|
|
|
|
|
|
|
# Configure the header file
|
|
|
|
|
configure_file(${HEADER_TEMPLATE} ${HEADER_OUTPUT} @ONLY)
|
|
|
|
|
|
|
|
|
|
# Set HAVE_METIS if METIS is found and coherent with the system settings
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_METIS)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_METIS")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(CHAVEMETIS "#define PSB_HAVE_METIS")
|
|
|
|
|
set(CINTMETIS "#define PSB_METIS_${METIS_INDEX}")
|
|
|
|
|
# set(CREALMETIS "#define PSB_METIS_REAL_${LPK_SIZE}")
|
|
|
|
|
# Configure the header file
|
|
|
|
|
configure_file(${HEADER_TEMPLATE} ${HEADER_OUTPUT} @ONLY)
|
|
|
|
|
# Set HAVE_METIS if METIS is found
|
|
|
|
|
#add_compile_options(-DPSB_HAVE_METIS)
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_METIS")
|
|
|
|
|
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#---------------------------------------------------
|
|
|
|
|
# Use standardized GNU install directory conventions
|
|
|
|
|
#---------------------------------------------------
|
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
|
#set(mod_dir_tail "${${CMAKE_PROJECT_NAME}_dist_string}_${CMAKE_Fortran_COMPILER_ID}-${CMAKE_Fortran_COMPILER_VERSION}")
|
|
|
|
|
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}/${${CMAKE_PROJECT_NAME}_dist_string}-tests")
|
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}")
|
|
|
|
|
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
|
|
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
|
|
|
|
|
#set(CMAKE_INSTALL_LIBDIR "lib" CACHE STRING "Library install directory")
|
|
|
|
|
#set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE STRING "Include directory")
|
|
|
|
|
#set(CMAKE_INSTALL_MODULDIR "modules" CACHE STRING "Modules directory")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#Ser variables exportable for other projects
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message(STATUS "Initial CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}")
|
|
|
|
|
set(PSB_CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX})
|
|
|
|
|
|
|
|
|
|
if(NOT PSB_CMAKE_INSTALL_LIBDIR)
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_LIBDIR is set to default value lib")
|
|
|
|
|
set(CMAKE_INSTALL_LIBDIR "lib" CACHE STRING "Library install directory" FORCE)
|
|
|
|
|
set(PSB_CMAKE_INSTALL_LIBDIR ${CMAKE_INSTALL_LIBDIR})
|
|
|
|
|
else()
|
|
|
|
|
set(CMAKE_INSTALL_LIBDIR ${PSB_CMAKE_INSTALL_LIBDIR})
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_LIBDIR is set to: ${CMAKE_INSTALL_LIBDIR}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(NOT PSB_CMAKE_INSTALL_INCLUDEDIR)
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_INCLUDEDIR is set to default value lib")
|
|
|
|
|
set(CMAKE_INSTALL_INCLUDEDIR "include" CACHE STRING "Include directory" FORCE)
|
|
|
|
|
set(PSB_CMAKE_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
|
|
|
|
|
else()
|
|
|
|
|
set(CMAKE_INSTALL_INCLUDEDIR ${PSB_CMAKE_INSTALL_INCLUDEDIR})
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_INCLUDEDIR is set to: ${CMAKE_INSTALL_INCLUDEDIR}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(NOT PSB_CMAKE_INSTALL_MODULDIR)
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_MODULDIR is set to default value lib")
|
|
|
|
|
set(CMAKE_INSTALL_MODULDIR "modules" CACHE STRING "Modules directory" FORCE)
|
|
|
|
|
set(PSB_CMAKE_INSTALL_MODULDIR ${CMAKE_INSTALL_MODULDIR})
|
|
|
|
|
else()
|
|
|
|
|
set(CMAKE_INSTALL_MODULDIR ${PSB_CMAKE_INSTALL_MODULDIR})
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_MODULDIR is set to: ${CMAKE_INSTALL_MODULDIR}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------
|
|
|
|
|
# Turn on testing/ctest capabilities
|
|
|
|
|
@ -386,7 +602,7 @@ define_property(TARGET
|
|
|
|
|
install(EXPORT ${CMAKE_PROJECT_NAME}-targets
|
|
|
|
|
FILE ${CMAKE_PROJECT_NAME}Config.cmake
|
|
|
|
|
NAMESPACE ${CMAKE_PROJECT_NAME}::
|
|
|
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake"
|
|
|
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -397,15 +613,16 @@ write_basic_package_version_file(
|
|
|
|
|
COMPATIBILITY SameMajorVersion
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
configure_file("${CMAKE_SOURCE_DIR}/cmake/pkg/${CMAKE_PROJECT_NAME}Config.cmake.in"
|
|
|
|
|
configure_file("${CMAKE_SOURCE_DIR}/cmake/${CMAKE_PROJECT_NAME}Config.cmake.in"
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${CMAKE_PROJECT_NAME}Config.cmake" @ONLY)
|
|
|
|
|
|
|
|
|
|
install(
|
|
|
|
|
FILES
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${CMAKE_PROJECT_NAME}Config.cmake"
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake"
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}Targets.cmake"
|
|
|
|
|
DESTINATION
|
|
|
|
|
"${CMAKE_INSTALL_LIBDIR}/cmake/psblas"
|
|
|
|
|
"${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
#------------------------------------------
|
|
|
|
|
@ -434,6 +651,82 @@ if(MPI_FOUND)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Optionally check for CUDA requirement
|
|
|
|
|
option(PSB_BUILD_CUDA "Build CUDA code" OFF)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(IPK_SIZE EQUAL 8)
|
|
|
|
|
set(PSB_BUILD_CUDA OFF)
|
|
|
|
|
message(STATUS "IPK8 is not compatible with CUDA. Cuda is now OFF ${PSB_BUILD_CUDA}")
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(PSB_BUILD_CUDA)
|
|
|
|
|
|
|
|
|
|
#if(NOT DEFINED PSB_CUDA_PATH)
|
|
|
|
|
# set(PSB_CUDA_PATH "/opt/cuda/12.8")
|
|
|
|
|
#endif()
|
|
|
|
|
# Include the CMakeLists for the cuda library
|
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/cuda/CMakeLists.txt)
|
|
|
|
|
include_directories("${PSB_CUDA_PATH}/include")
|
|
|
|
|
message(STATUS "${PSB_CUDA_PATH}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# find_package(CUDA REQUIRED)
|
|
|
|
|
|
|
|
|
|
enable_language(CUDA)
|
|
|
|
|
message(STATUS "Enabled CUDA ${CMAKE_CUDA_COMPILER_VERSION} ${CMAKE_CUDA_ARCHITECTURES};; ${CMAKE_CUDA_HOST_COMPILER_VERSION};")
|
|
|
|
|
find_package(CUDAToolkit)
|
|
|
|
|
message(STATUS "Enabled CUDA throguh find ${CUDAToolkit_VERSION_MAJOR} ${CUDAToolkit_VERSION};; ${CUDAToolkit_VERSION_MINOR};")
|
|
|
|
|
#compute cuda versio for psblas
|
|
|
|
|
math(EXPR PSB_CUDA_VERSION "${CUDAToolkit_VERSION_MAJOR} * 1000 + ${CUDAToolkit_VERSION_MINOR} * 10")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message(STATUS "cuda version called has given ${PSB_CUDA_VERSION}:")
|
|
|
|
|
|
|
|
|
|
# Check for CUDA version
|
|
|
|
|
# set(PSB_CUDA_VERSION 12800)
|
|
|
|
|
if(PSB_CUDA_VERSION)
|
|
|
|
|
message(STATUS "CUDA version: ${PSB_CUDA_VERSION}")
|
|
|
|
|
|
|
|
|
|
# Define macros for CUDA version
|
|
|
|
|
# add_definitions(-DPSB_HAVE_CUDA)
|
|
|
|
|
# add_definitions(-DPSB_CUDA_VERSION=${PSB_CUDA_VERSION})
|
|
|
|
|
# math(EXPR PSB_CUDA_SHORT_VERSION "${PSB_CUDA_VERSION} / 1000")
|
|
|
|
|
# add_definitions(-DPSB_CUDA_SHORT_VERSION=${PSB_CUDA_SHORT_VERSION})
|
|
|
|
|
set(PSB_CUDA_SHORT_VERSION ${CUDAToolkit_VERSION_MAJOR})
|
|
|
|
|
message(STATUS "cuda version called has given ${PSB_CUDA_SHORT_VERSION}:")
|
|
|
|
|
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_CUDA")
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_CUDA_VERSION=${PSB_CUDA_VERSION}")
|
|
|
|
|
set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_CUDA_SHORT_VERSION=${PSB_CUDA_SHORT_VERSION}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set(CHAVECUDA "#define PSB_HAVE_CUDA")
|
|
|
|
|
set(CSHORTVCUDA "#define PSB_CUDA_SHORT_VERSION ${PSB_CUDA_SHORT_VERSION}")
|
|
|
|
|
set(CVERSIONCUDA "#define PSB_CUDA_VERSION ${PSB_CUDA_VERSION}")
|
|
|
|
|
|
|
|
|
|
else()
|
|
|
|
|
message(FATAL_ERROR "CUDA version not found!")
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
#------------------------------------------
|
|
|
|
|
# Configure the psb_config.h file
|
|
|
|
|
#------------------------------------------
|
|
|
|
|
|
|
|
|
|
message(STATUS "bin dir ${CMAKE_CURRENT_BINARY_DIR}; source dir ${CMAKE_CURRENT_SOURCE_DIR};;")
|
|
|
|
|
configure_file(
|
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/base/modules/psb_config.h.in
|
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/include/psb_config.h
|
|
|
|
|
@ONLY # Replace variables only
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#---------------------------------------
|
|
|
|
|
# Add the PSBLAS libraries and utilities
|
|
|
|
|
#---------------------------------------
|
|
|
|
|
@ -449,6 +742,15 @@ include(${CMAKE_CURRENT_LIST_DIR}/base/CMakeLists.txt)
|
|
|
|
|
|
|
|
|
|
include_directories("${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach(path IN LISTS base_header_C_files)
|
|
|
|
|
|
|
|
|
|
# Copy the header file to the include directory
|
|
|
|
|
file(COPY "${path}" DESTINATION "${CMAKE_BINARY_DIR}/include")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
endforeach()
|
|
|
|
|
|
|
|
|
|
if(WIN32)
|
|
|
|
|
add_library(psb_base_C STATIC ${base_source_C_files})
|
|
|
|
|
target_compile_definitions(psb_base_C
|
|
|
|
|
@ -582,7 +884,14 @@ if(WIN32)
|
|
|
|
|
PUBLIC psb_util_C)
|
|
|
|
|
endif()
|
|
|
|
|
else()
|
|
|
|
|
|
|
|
|
|
if(METIS_FOUND)
|
|
|
|
|
foreach(file IN LISTS util_source_C_metis_files)
|
|
|
|
|
list(APPEND util_source_C_files file)
|
|
|
|
|
endforeach()
|
|
|
|
|
endif()
|
|
|
|
|
add_library(psb_util_C OBJECT ${util_source_C_files})
|
|
|
|
|
|
|
|
|
|
add_library(util ${util_source_files} $<TARGET_OBJECTS:psb_util_C>)
|
|
|
|
|
endif()
|
|
|
|
|
set_target_properties(util
|
|
|
|
|
@ -596,77 +905,19 @@ target_include_directories(util PUBLIC
|
|
|
|
|
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/modules>
|
|
|
|
|
$<INSTALL_INTERFACE:modules>)
|
|
|
|
|
target_link_libraries(util PUBLIC base prec)
|
|
|
|
|
if(METIS_FOUND)
|
|
|
|
|
message(STATUS "METIS PATH ${METIS_INCLUDES} and metis libraries ${METIS_LIBRARIES}")
|
|
|
|
|
# Make sure this path is correct
|
|
|
|
|
set(METISINCFILE "metis.h") # Adjust this to your actual path
|
|
|
|
|
|
|
|
|
|
# Specify the configuration file
|
|
|
|
|
set(HEADER_TEMPLATE "${CMAKE_CURRENT_SOURCE_DIR}/util/psb_metis_int.h.in")
|
|
|
|
|
set(HEADER_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/include/psb_metis_int.h")
|
|
|
|
|
|
|
|
|
|
# Configure the header file
|
|
|
|
|
configure_file(${HEADER_TEMPLATE} ${HEADER_OUTPUT} @ONLY)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Check for real sizes using try_compile
|
|
|
|
|
include(CheckCSourceCompiles)
|
|
|
|
|
|
|
|
|
|
# Function to check the size of a type
|
|
|
|
|
function(check_metis_real_type type_name)
|
|
|
|
|
set(source_code "
|
|
|
|
|
#include <metis.h>
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
int main() {
|
|
|
|
|
printf(\"%zu\\n\", sizeof(${type_name}));
|
|
|
|
|
return 0;
|
|
|
|
|
}")
|
|
|
|
|
|
|
|
|
|
# Create a temporary source file
|
|
|
|
|
file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c" "${source_code}")
|
|
|
|
|
|
|
|
|
|
# Try to compile it
|
|
|
|
|
try_compile(COMPILER_RESULT "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp"
|
|
|
|
|
"${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c")
|
|
|
|
|
|
|
|
|
|
# Check the result and read the output
|
|
|
|
|
if (COMPILER_RESULT)
|
|
|
|
|
execute_process(COMMAND "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size"
|
|
|
|
|
OUTPUT_VARIABLE type_size)
|
|
|
|
|
string(STRIP "${type_size}" type_size)
|
|
|
|
|
if (type_name STREQUAL "float")
|
|
|
|
|
set(METIS_REAL_32 "${type_size}")
|
|
|
|
|
add_definitions(-DMETIS_REAL_32)
|
|
|
|
|
elseif (type_name STREQUAL "double")
|
|
|
|
|
set(METIS_REAL_64 "${type_size}")
|
|
|
|
|
add_definitions(-DMETIS_REAL_64)
|
|
|
|
|
endif()
|
|
|
|
|
else()
|
|
|
|
|
message(WARNING "Failed to compile test for type size: ${type_name}")
|
|
|
|
|
endif()
|
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
# Check for both float and double
|
|
|
|
|
check_metis_real_type(float)
|
|
|
|
|
check_metis_real_type(double)
|
|
|
|
|
|
|
|
|
|
# Set HAVE_METIS if METIS is found
|
|
|
|
|
add_compile_options(-DHAVE_METIS)
|
|
|
|
|
|
|
|
|
|
if(METIS_FOUND)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
target_include_directories(util
|
|
|
|
|
PUBLIC ${METIS_INCLUDES})
|
|
|
|
|
target_include_directories(psb_util_C
|
|
|
|
|
PUBLIC ${METIS_INCLUDES})
|
|
|
|
|
target_link_libraries(util
|
|
|
|
|
PUBLIC ${METIS_LIBRARIES})
|
|
|
|
|
target_compile_definitions(psb_util_C
|
|
|
|
|
PUBLIC HAVE_METIS_)
|
|
|
|
|
target_compile_definitions(util
|
|
|
|
|
PUBLIC HAVE_METIS)
|
|
|
|
|
# target_compile_definitions(psb_util_C
|
|
|
|
|
# PUBLIC PSB_HAVE_METIS) #TDDO: CHECK IF THAT _ IS CORRECT
|
|
|
|
|
# target_compile_definitions(util
|
|
|
|
|
# PUBLIC PSB_HAVE_METIS)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -683,7 +934,7 @@ include_directories(${CMAKE_BINARY_DIR}/include)
|
|
|
|
|
|
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/cbind/CMakeLists.txt)
|
|
|
|
|
if(WIN32)
|
|
|
|
|
add_library(psb_cbind_C STATIC ${base_source_C_files})
|
|
|
|
|
add_library(psb_cbind_C STATIC ${cbind_source_C_files})
|
|
|
|
|
target_compile_definitions(psb_cbind_C
|
|
|
|
|
PRIVATE -DWIN32 -D_LIB -DWIN64)
|
|
|
|
|
set_target_properties(psb_cbind_C
|
|
|
|
|
@ -697,7 +948,8 @@ if(WIN32)
|
|
|
|
|
PUBLIC psb_cbind_C)
|
|
|
|
|
else()
|
|
|
|
|
add_library(cbind_C OBJECT ${cbind_source_C_files})
|
|
|
|
|
add_library(cbind ${cbind_source_files})
|
|
|
|
|
add_library(cbind ${cbind_source_files} $<TARGET_OBJECTS:cbind_C>)
|
|
|
|
|
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -758,6 +1010,118 @@ message(STATUS "Copied .h files to ${CMAKE_BINARY_DIR}/include")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#########################################
|
|
|
|
|
####### BUILD CUDA LIBRARY ##############
|
|
|
|
|
#########################################
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Optionally check for CUDA requirement
|
|
|
|
|
#option(PSB_BUILD_CUDA "Build CUDA code" OFF)
|
|
|
|
|
|
|
|
|
|
if(PSB_BUILD_CUDA)
|
|
|
|
|
|
|
|
|
|
# if(NOT DEFINED PSB_CUDA_PATH)
|
|
|
|
|
# set(PSB_CUDA_PATH "/opt/cuda/12.8")
|
|
|
|
|
#endif()
|
|
|
|
|
# Include the CMakeLists for the cbind library
|
|
|
|
|
#include(${CMAKE_CURRENT_LIST_DIR}/cuda/CMakeLists.txt)
|
|
|
|
|
#include_directories("${PSB_CUDA_PATH}/include")
|
|
|
|
|
#message(STATUS "${PSB_CUDA_PATH}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# find_package(CUDA REQUIRED)
|
|
|
|
|
|
|
|
|
|
#enable_language(CUDA)
|
|
|
|
|
|
|
|
|
|
# Check for CUDA version
|
|
|
|
|
#set(PSB_CUDA_VERSION 12800)
|
|
|
|
|
#if(PSB_CUDA_VERSION)
|
|
|
|
|
# message(STATUS "CUDA version: ${PSB_CUDA_VERSION}")
|
|
|
|
|
|
|
|
|
|
# Define macros for CUDA version
|
|
|
|
|
# add_definitions(-DPSB_HAVE_CUDA)
|
|
|
|
|
# add_definitions(-DPSB_CUDA_VERSION=${PSB_CUDA_VERSION})
|
|
|
|
|
#math(EXPR PSB_CUDA_SHORT_VERSION "${PSB_CUDA_VERSION} / 1000")
|
|
|
|
|
# add_definitions(-DPSB_CUDA_SHORT_VERSION=${PSB_CUDA_SHORT_VERSION})
|
|
|
|
|
|
|
|
|
|
#set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_CUDA")
|
|
|
|
|
#set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_CUDA_VERSION=${PSB_CUDA_VERSION}")
|
|
|
|
|
#set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_CUDA_SHORT_VERSION=${PSB_CUDA_SHORT_VERSION}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#set(CHAVECUDA "#define PSB_HAVE_CUDA")
|
|
|
|
|
#set(CSHORTVCUDA "#define PSB_CUDA_SHORT_VERSION ${PSB_CUDA_SHORT_VERSION}")
|
|
|
|
|
#set(CVERSIONCUDA "#define PSB_CUDA_VERSION ${PSB_CUDA_VERSION}")
|
|
|
|
|
|
|
|
|
|
#else()
|
|
|
|
|
#message(FATAL_ERROR "CUDA version not found!")
|
|
|
|
|
#endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Define the CUDA library
|
|
|
|
|
#if(WIN32)
|
|
|
|
|
#add_library(psb_cuda_C STATIC ${cuda_source_files})
|
|
|
|
|
#target_compile_definitions(psb_cuda_C
|
|
|
|
|
# PRIVATE -DWIN32 -D_LIB -DWIN64)
|
|
|
|
|
#set_target_properties(psb_cuda_C
|
|
|
|
|
# PROPERTIES
|
|
|
|
|
# LINKER_LANGUAGE C
|
|
|
|
|
# POSITION_INDEPENDENT_CODE TRUE)
|
|
|
|
|
#target_link_libraries(psb_cuda_C
|
|
|
|
|
# PUBLIC kernel32 user32 shell32)
|
|
|
|
|
#else()
|
|
|
|
|
#add_library(psb_cuda_C OBJECT ${cuda_source_files})
|
|
|
|
|
#endif()
|
|
|
|
|
|
|
|
|
|
foreach(path IN LISTS cuda_header_C_files)
|
|
|
|
|
|
|
|
|
|
# Copy the header file to the include directory
|
|
|
|
|
file(COPY "${path}" DESTINATION "${CMAKE_BINARY_DIR}/include")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
endforeach()
|
|
|
|
|
message(STATUS "Copied .h files to ${CMAKE_BINARY_DIR}/include")
|
|
|
|
|
foreach(path IN LISTS cuda_header_cu_files)
|
|
|
|
|
|
|
|
|
|
# Copy the header file to the include directory
|
|
|
|
|
file(COPY "${path}" DESTINATION "${CMAKE_BINARY_DIR}/include")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
endforeach()
|
|
|
|
|
message(STATUS "Copied .cuh files to ${CMAKE_BINARY_DIR}/include")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
add_library(psb_cuda_C OBJECT ${cuda_source_C_files} ${cuda_source_cu_files})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Create the main CUDA library
|
|
|
|
|
add_library(cuda ${cuda_source_files})
|
|
|
|
|
|
|
|
|
|
# Set properties for the CUDA library
|
|
|
|
|
set_target_properties(cuda
|
|
|
|
|
PROPERTIES
|
|
|
|
|
POSITION_INDEPENDENT_CODE TRUE
|
|
|
|
|
OUTPUT_NAME psb_cuda
|
|
|
|
|
LINKER_LANGUAGE C)
|
|
|
|
|
|
|
|
|
|
# Include directories for the CUDA library
|
|
|
|
|
target_include_directories(cuda PUBLIC
|
|
|
|
|
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/modules> # Path for building
|
|
|
|
|
$<INSTALL_INTERFACE:modules> # Path for installation
|
|
|
|
|
#/opt/cuda/12.8/include
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Link with other necessary libraries
|
|
|
|
|
target_link_libraries(cuda PUBLIC base prec linsolve ext util)
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(MPI_FOUND)
|
|
|
|
|
# Copy mpi.mod from the first available path in MPI_Fortran_INCLUDE_PATH
|
|
|
|
|
set(MPI_MOD_COPIED FALSE)
|
|
|
|
|
@ -804,11 +1168,31 @@ message(STATUS "\t\t ${CMAKE_INSTALL_LIBDIR}")
|
|
|
|
|
# DESTINATION include
|
|
|
|
|
#)
|
|
|
|
|
|
|
|
|
|
install(DIRECTORY "${CMAKE_BINARY_DIR}/include" DESTINATION "include"
|
|
|
|
|
FILES_MATCHING PATTERN "*.h")
|
|
|
|
|
#install(DIRECTORY "${CMAKE_BINARY_DIR}/include" DESTINATION "include"
|
|
|
|
|
# FILES_MATCHING PATTERN "*.h")
|
|
|
|
|
|
|
|
|
|
#install(DIRECTORY "${CMAKE_BINARY_DIR}/modules" DESTINATION "modules"
|
|
|
|
|
# FILES_MATCHING PATTERN "*.mod")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#install(DIRECTORY "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" DESTINATION "include"
|
|
|
|
|
# FILES_MATCHING PATTERN "*.h")
|
|
|
|
|
|
|
|
|
|
#install(DIRECTORY "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_MODULDIR}" DESTINATION "modules"
|
|
|
|
|
# FILES_MATCHING PATTERN "*.mod")
|
|
|
|
|
|
|
|
|
|
# Install header files
|
|
|
|
|
install(DIRECTORY ${CMAKE_BINARY_DIR}/include/
|
|
|
|
|
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}" # This will place headers in <prefix>/include
|
|
|
|
|
FILES_MATCHING PATTERN "*.h"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Install module files
|
|
|
|
|
install(DIRECTORY ${CMAKE_BINARY_DIR}/modules/
|
|
|
|
|
DESTINATION "${CMAKE_INSTALL_MODULDIR}" # This will place .mod files in <prefix>/modules
|
|
|
|
|
FILES_MATCHING PATTERN "*.mod"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
install(DIRECTORY "${CMAKE_BINARY_DIR}/modules" DESTINATION "modules"
|
|
|
|
|
FILES_MATCHING PATTERN "*.mod")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
install(TARGETS base prec linsolve ext util cbind
|
|
|
|
|
@ -817,7 +1201,14 @@ install(TARGETS base prec linsolve ext util cbind
|
|
|
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(PSB_BUILD_CUDA)
|
|
|
|
|
install(TARGETS cuda
|
|
|
|
|
EXPORT ${CMAKE_PROJECT_NAME}-targets
|
|
|
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
|
|
|
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
if(WIN32)
|
|
|
|
|
install(TARGETS psb_base_C
|
|
|
|
|
@ -834,26 +1225,67 @@ if(WIN32)
|
|
|
|
|
endif()
|
|
|
|
|
endif()
|
|
|
|
|
|
|
|
|
|
# Step 2: Create the configuration file from the template
|
|
|
|
|
configure_package_config_file(
|
|
|
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/psblasConfig.cmake.in"
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/psblasConfig.cmake"
|
|
|
|
|
INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/psblas"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
# Step 3: Install the generated config files
|
|
|
|
|
install(FILES
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/psblasConfig.cmake"
|
|
|
|
|
"${CMAKE_CURRENT_BINARY_DIR}/psblasConfigVersion.cmake"
|
|
|
|
|
DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/psblas"
|
|
|
|
|
)
|
|
|
|
|
#configure_package_config_file(
|
|
|
|
|
# INSTALL_DESTINATION "${CMAKE_INSTALL_PREFIX}/cmake/psblas"
|
|
|
|
|
#)
|
|
|
|
|
|
|
|
|
|
#install(FILES
|
|
|
|
|
# "${CMAKE_CURRENT_BINARY_DIR}/psblasConfig.cmake"
|
|
|
|
|
# "${CMAKE_CURRENT_BINARY_DIR}/psblasConfigVersion.cmake"
|
|
|
|
|
# DESTINATION "${CMAKE_INSTALL_PREFIX}/cmake/psblas"
|
|
|
|
|
#)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Step 4: Export targets so that the build directory can be used directly
|
|
|
|
|
export(
|
|
|
|
|
EXPORT ${CMAKE_PROJECT_NAME}-targets
|
|
|
|
|
FILE "${CMAKE_CURRENT_BINARY_DIR}/psblasTargets.cmake"
|
|
|
|
|
NAMESPACE psblas::
|
|
|
|
|
NAMESPACE ${CMAKE_PROJECT_NAME}::
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set the installation directory for the test files
|
|
|
|
|
set(INSTALL_TEST_DIR "${CMAKE_INSTALL_PREFIX}/samples" CACHE PATH "Installation directory for sample files")
|
|
|
|
|
|
|
|
|
|
function(install_directory_recursive source_dir install_base_dir) # Function to install a directory and its subdirectories recursively
|
|
|
|
|
file(GLOB_RECURSE ALL_FILES RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}" "${source_dir}/*")
|
|
|
|
|
|
|
|
|
|
foreach(FILE_PATH IN LISTS ALL_FILES)
|
|
|
|
|
# Construct the full source and destination paths
|
|
|
|
|
set(FULL_SOURCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${source_dir}/${FILE_PATH}")
|
|
|
|
|
set(FULL_INSTALL_PATH "${install_base_dir}/${FILE_PATH}")
|
|
|
|
|
|
|
|
|
|
# Check if it's a directory
|
|
|
|
|
if(IS_DIRECTORY "${FULL_SOURCE_PATH}")
|
|
|
|
|
# Create the directory in the install destination
|
|
|
|
|
file(MAKE_DIRECTORY "${FULL_INSTALL_PATH}")
|
|
|
|
|
else()
|
|
|
|
|
# Install the file
|
|
|
|
|
install(FILES "${FULL_SOURCE_PATH}" DESTINATION "${install_base_dir}" RENAME "${FILE_PATH}")
|
|
|
|
|
endif()
|
|
|
|
|
endforeach()
|
|
|
|
|
endfunction()
|
|
|
|
|
|
|
|
|
|
# Install cbind/test directory
|
|
|
|
|
install_directory_recursive(cbind/test "${INSTALL_TEST_DIR}/cbind")
|
|
|
|
|
|
|
|
|
|
# Install test/fileread directory
|
|
|
|
|
install_directory_recursive(test/fileread "${INSTALL_TEST_DIR}/fileread")
|
|
|
|
|
|
|
|
|
|
# Install test/pdegen directory
|
|
|
|
|
install_directory_recursive(test/pdegen "${INSTALL_TEST_DIR}/pdegen")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX} - ${PSB_CMAKE_INSTALL_PREFIX};")
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR} - ${PSB_CMAKE_INSTALL_LIBDIR};")
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_INCLUDEDIR: ${CMAKE_INSTALL_INCLUDEDIR} - ${PSB_CMAKE_INSTALL_INCLUDEDIR};")
|
|
|
|
|
message(STATUS "CMAKE_INSTALL_MODULDIR: ${CMAKE_INSTALL_MODULDIR} - ${PSB_CMAKE_INSTALL_MODULDIR};")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------
|
|
|
|
|
# Add PSBLAS tests
|
|
|
|
|
#-----------------
|
|
|
|
|
|