|
| 1 | +cmake_minimum_required(VERSION 3.22) |
| 2 | +project(Tensorium LANGUAGES C CXX) |
1 | 3 |
|
2 | | -cmake_minimum_required(VERSION 3.12) |
3 | | -project(tensorium_bindings LANGUAGES CXX) |
| 4 | +option(USE_MPI "Enable MPI support" OFF) |
| 5 | +option(USE_KNL "Tune for Intel KNL" OFF) |
| 6 | +option(AVX512 "Enable AVX-512" OFF) |
| 7 | +option(VERBOSE "Verbose runtime logs" OFF) |
| 8 | +option(DEBUG "Build with debug symbols" OFF) |
| 9 | +option(BUILD_PLUGINS "Build Clang/LLVM plugins" ON) |
| 10 | +option(BUILD_TESTS "Build test executables" ON) |
| 11 | +option(BUILD_PYBIND "Build Python bindings" OFF) |
4 | 12 |
|
5 | 13 | set(CMAKE_CXX_STANDARD 17) |
6 | 14 | set(CMAKE_CXX_STANDARD_REQUIRED ON) |
7 | | -set(CMAKE_POSITION_INDEPENDENT_CODE ON) |
| 15 | +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) |
8 | 16 |
|
9 | | -add_compile_options(-O3 -march=native -mavx2 -mfma -Wignored-attributes) |
10 | | -add_compile_options(-Wno-ignored-attributes) |
11 | | -find_package(pybind11 REQUIRED) |
| 17 | +message(STATUS "Detecting architecture...") |
12 | 18 |
|
13 | | -find_package(OpenMP REQUIRED) |
| 19 | +if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|AMD64") |
| 20 | + message(STATUS "→ Building for x86_64 (AVX/AVX2/AVX512 enabled)") |
| 21 | + add_compile_definitions(TENSORIUM_X86) |
| 22 | + add_compile_options(-mavx2 -mfma) |
| 23 | +elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64") |
| 24 | + message(STATUS "→ Building for ARM64 / Apple Silicon (NEON enabled)") |
| 25 | + add_compile_definitions(TENSORIUM_ARM) |
| 26 | +else() |
| 27 | + message(WARNING "→ Unknown architecture: ${CMAKE_SYSTEM_PROCESSOR}, using scalar fallback.") |
| 28 | + add_compile_definitions(TENSORIUM_FALLBACK) |
| 29 | +endif() |
14 | 30 |
|
15 | | -include_directories(${CMAKE_SOURCE_DIR}/includes) |
16 | 31 |
|
17 | | -pybind11_add_module(tensorium ./Pybind/bindings.cpp) |
| 32 | +# |
| 33 | +find_package(CUDAToolkit QUIET) |
18 | 34 |
|
19 | | -target_link_libraries(tensorium PRIVATE OpenMP::OpenMP_CXX) |
20 | | -# install(TARGETS tensorium |
21 | | -# LIBRARY DESTINATION ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}) |
| 35 | +execute_process( |
| 36 | + COMMAND bash -c "command -v nvidia-smi >/dev/null && nvidia-smi --query-gpu=name --format=csv,noheader | head -n 1 || echo none" |
| 37 | + OUTPUT_VARIABLE GPU_NAME OUTPUT_STRIP_TRAILING_WHITESPACE |
| 38 | +) |
22 | 39 |
|
| 40 | +if (NOT GPU_NAME STREQUAL "none") |
| 41 | + message(STATUS "Detected NVIDIA GPU: ${GPU_NAME}") |
| 42 | + add_compile_definitions(TENSORIUM_GPU_PRESENT) |
| 43 | +else() |
| 44 | + message(WARNING "⚠️ Aucun GPU NVIDIA détecté (ou nvidia-smi absent)") |
| 45 | +endif() |
23 | 46 |
|
| 47 | + |
| 48 | +option(USE_CUDA "Enable CUDA kernels (requires nvcc)" OFF) |
| 49 | + |
| 50 | +if (USE_CUDA) |
| 51 | + if (NOT CUDAToolkit_FOUND) |
| 52 | + message(FATAL_ERROR "USE_CUDA=ON mais aucun CUDA toolkit détecté ⚠️") |
| 53 | + endif() |
| 54 | + |
| 55 | + message(STATUS "CUDA toolkit found at: ${CUDAToolkit_ROOT}") |
| 56 | + message(STATUS "→ Version: ${CUDAToolkit_VERSION}") |
| 57 | + add_compile_definitions(TENSORIUM_CUDA) |
| 58 | + |
| 59 | + enable_language(CUDA) |
| 60 | + set(CMAKE_CUDA_COMPILER "${CUDAToolkit_NVCC_EXECUTABLE}") |
| 61 | + message(STATUS "Using NVCC for CUDA compilation: ${CMAKE_CUDA_COMPILER}") |
| 62 | + |
| 63 | + set(CMAKE_CUDA_ARCHITECTURES 61 70 75 80 86 90) |
| 64 | + add_compile_definitions(TENSORIUM_CUDA_ARCH=${CMAKE_CUDA_ARCHITECTURES}) |
| 65 | + |
| 66 | + # Flags NVCC (propres) |
| 67 | + set(CMAKE_CUDA_STANDARD 17) |
| 68 | + set(CMAKE_CUDA_STANDARD_REQUIRED ON) |
| 69 | + set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -O3 -Xcompiler=-fPIC") |
| 70 | + set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --use_fast_math -lineinfo -Wno-deprecated-gpu-targets") |
| 71 | + |
| 72 | + include_directories(${CUDAToolkit_INCLUDE_DIRS}) |
| 73 | + link_directories(${CUDAToolkit_LIBRARY_DIR}) |
| 74 | + |
| 75 | + message(STATUS "→ CUDA architectures: ${CMAKE_CUDA_ARCHITECTURES}") |
| 76 | + |
| 77 | +else() |
| 78 | + message(STATUS "CUDA support disabled (USE_CUDA=OFF)") |
| 79 | + add_compile_definitions(TENSORIUM_NO_CUDA) |
| 80 | +endif() |
| 81 | + |
| 82 | +include_directories(${CMAKE_SOURCE_DIR}/Includes) |
| 83 | + |
| 84 | +if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "amd64") |
| 85 | + message(STATUS "Configuring for x86_64: enabling AVX2/FMA or AVX512") |
| 86 | + set(BASE_FLAGS "-O3 -mtune=native -Wno-ignored-attributes -Rpass-analysis=tensorium-align") |
| 87 | + set(AVX2_FLAGS "-mfma -mavx2") |
| 88 | + set(AVX512_FLAGS "-mfma -mavx512f -mavx512cd") |
| 89 | + if(AVX512) |
| 90 | + set(CMAKE_CXX_FLAGS "${BASE_FLAGS} ${AVX512_FLAGS}") |
| 91 | + else() |
| 92 | + set(CMAKE_CXX_FLAGS "${BASE_FLAGS} ${AVX2_FLAGS}") |
| 93 | + endif() |
| 94 | +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64" OR CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") |
| 95 | + message(STATUS "Configuring for Apple Silicon ARM64: disabling AVX flags") |
| 96 | + set(CMAKE_CXX_FLAGS "-O3 -mcpu=apple-m1 -Wno-ignored-attributes") |
| 97 | +else() |
| 98 | + message(WARNING "Unknown architecture (${CMAKE_SYSTEM_PROCESSOR}); using generic optimization flags.") |
| 99 | + set(CMAKE_CXX_FLAGS "-O3 -mtune=native") |
| 100 | +endif() |
| 101 | + |
| 102 | +if(DEBUG) |
| 103 | + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") |
| 104 | +endif() |
| 105 | +if(VERBOSE) |
| 106 | + add_compile_definitions(VERBOSE) |
| 107 | +endif() |
| 108 | + |
| 109 | +message(STATUS "Detected architecture: ${CMAKE_SYSTEM_PROCESSOR}") |
| 110 | + |
| 111 | +if(APPLE) |
| 112 | + if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64") |
| 113 | + message(STATUS "Configuring OpenMP manually for macOS ARM64 (Apple Clang)") |
| 114 | + set(OPENMP_INCLUDE_PATH "/opt/homebrew/opt/libomp/include") |
| 115 | + set(OPENMP_LIB_PATH "/opt/homebrew/opt/libomp/lib") |
| 116 | + set(OPENMP_LIB "omp") |
| 117 | + elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") |
| 118 | + message(STATUS "Using OpenMP for macOS x86_64 (Intel)") |
| 119 | + find_package(OpenMP) |
| 120 | + if(OpenMP_CXX_FOUND) |
| 121 | + set(OPENMP_LIB "OpenMP::OpenMP_CXX") |
| 122 | + endif() |
| 123 | + endif() |
| 124 | +else() |
| 125 | + find_package(OpenMP) |
| 126 | + if(OpenMP_CXX_FOUND) |
| 127 | + set(OPENMP_LIB "OpenMP::OpenMP_CXX") |
| 128 | + endif() |
| 129 | +endif() |
| 130 | + |
| 131 | +if(BUILD_PLUGINS) |
| 132 | + add_subdirectory(Plugins) |
| 133 | +endif() |
| 134 | + |
| 135 | +if(BUILD_TESTS) |
| 136 | + add_subdirectory(Tests) |
| 137 | +endif() |
0 commit comments