1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
cmake_minimum_required(VERSION 3.5...3.27)
project(VeryFastTree)
set(CMAKE_CXX_STANDARD 11)
option(USE_SHARED "enable/disable linking of system shared libraries" OFF)
option(USE_NATIVE "enable/disable system's processor architecture optimization (linux)" ON)
option(USE_SEE2 "enable/disable SSE2 in windows (linux default)" ON)
option(USE_SEE4 "enable/disable SSE4.1" OFF)
option(USE_AVX "enable/disable AVX" OFF)
option(USE_AVX2 "enable/disable AVX2" OFF)
option(USE_AVX512 "enable/disable AVX512" OFF)
option(USE_CUDA "enable/disable CUDA" OFF)
set(CUDA_ARCH "80" CACHE STRING "change CUDA Architecture")
add_definitions(-DCLI11_BOOST_OPTIONAL=0)
add_definitions(-DNDEBUG)
ADD_SUBDIRECTORY("libs/CLI11")
ADD_SUBDIRECTORY("libs/bxzstr")
if (USE_SHARED AND NOT MSVC)
set(LIBRARIES z bz2)
else ()
ADD_SUBDIRECTORY("libs/boost-align")
ADD_SUBDIRECTORY("libs/boost-core")
ADD_SUBDIRECTORY("libs/boost-sort")
ADD_SUBDIRECTORY("libs/bzip2")
ADD_SUBDIRECTORY("libs/zlib")
ADD_SUBDIRECTORY("libs/robin-map")
ADD_SUBDIRECTORY("libs/xxhash")
set(LIBRARIES boost-core boost-sort boost-align robin_map xxhash zlibstatic bzip2static)
endif ()
set(LIBRARIES CLI11 bxzstr ${LIBRARIES} )
set(SOURCE_FILES
src/operations/BasicOperations.tcc
src/operations/BasicOperations.h
src/operations/SSE128Operations.tcc
src/operations/SSE128Operations.h
src/operations/AVX256Operations.tcc
src/operations/AVX256Operations.h
src/operations/AVX512Operations.tcc
src/operations/AVX512Operations.h
src/impl/VeryFastTreeDouble.cpp
src/impl/VeryFastTreeDoubleAVX256.cpp
src/impl/VeryFastTreeDoubleAVX512.cpp
src/impl/VeryFastTreeDoubleCuda.cpp
src/impl/VeryFastTreeDoubleSSE128.cpp
src/impl/VeryFastTreeFloat.cpp
src/impl/VeryFastTreeFloatAVX256.cpp
src/impl/VeryFastTreeFloatAVX512.cpp
src/impl/VeryFastTreeFloatCuda.cpp
src/impl/VeryFastTreeFloatSSE128.cpp
src/Knuth.cpp
src/Knuth.h
src/Options.h
src/Constants.h
src/Debug.h
src/DiskMemory.cpp
src/DiskMemory.h
src/Utils.h
src/HashTable.h
src/DistanceMatrix.tcc
src/DistanceMatrix.h
src/TransitionMatrix.tcc
src/TransitionMatrix.h
src/NeighbourJoining.tcc
src/NeighbourJoining.h
src/Alignment.cpp
src/Alignment.h
src/VeryFastTreeImpl.tcc
src/VeryFastTree.cpp
src/VeryFastTree.h
main.cpp
)
if (USE_CUDA)
message("WARNING!! CUDA is only a experimental feature")
set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH})
set(USE_CUDA 1)
enable_language(CUDA)
find_package(CUDAToolkit)
set(SOURCE_FILES
${SOURCE_FILES}
src/operations/CudaOperations.h
src/operations/CudaOperations.cu
)
set(LIBRARIES ${LIBRARIES} CUDA::cublas)
else ()
set(USE_CUDA 0)
endif ()
if (MSVC)
ADD_SUBDIRECTORY("libs/mman-win32")
set(LIBRARIES ${LIBRARIES} mman-win32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W2 /O2 /EHsc /bigobj /DUSE_CUDA=${USE_CUDA}")
if (USE_AVX512)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX512 /D__AVX512F__=1 /D__AVX2__=1 /D__AVX__=1")
elseif (USE_AVX2)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2 /D__AVX2__=1 /D__AVX__=1")
elseif (USE_AVX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX /D__AVX__=1")
elseif (USE_SEE4)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2 /D__SSE4_1__=1 /D__SSE2__=1")
elseif (USE_SEE2)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2 /D__SSE2__=1")
endif ()
else ()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -O3 -DUSE_CUDA=${USE_CUDA}")
if (USE_AVX512)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx512f")
elseif (USE_AVX2)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx2")
elseif (USE_AVX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mavx")
elseif (USE_SEE4)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.1")
endif ()
if (USE_NATIVE)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
endif ()
endif ()
find_package(OpenMP)
if(NOT TARGET OpenMP::OpenMP_CXX)
find_package(Threads REQUIRED)
add_library(OpenMP::OpenMP_CXX IMPORTED INTERFACE)
set_property(TARGET OpenMP::OpenMP_CXX PROPERTY INTERFACE_COMPILE_OPTIONS ${OpenMP_CXX_FLAGS})
set_property(TARGET OpenMP::OpenMP_CXX PROPERTY INTERFACE_LINK_LIBRARIES ${OpenMP_CXX_FLAGS} Threads::Threads)
endif()
add_executable(${PROJECT_NAME} ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} OpenMP::OpenMP_CXX ${LIBRARIES})
install(TARGETS ${PROJECT_NAME} DESTINATION bin)
|