Skip to content

Commit b18e6f8

Browse files
committed
grid setup
2 parents 7610adc + 9e3dfd3 commit b18e6f8

File tree

19 files changed

+1636
-1350
lines changed

19 files changed

+1636
-1350
lines changed

CMakeLists.txt

Lines changed: 126 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,137 @@
1+
cmake_minimum_required(VERSION 3.22)
2+
project(Tensorium LANGUAGES C CXX)
13

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)
412

513
set(CMAKE_CXX_STANDARD 17)
614
set(CMAKE_CXX_STANDARD_REQUIRED ON)
7-
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
15+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
816

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...")
1218

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()
1430

15-
include_directories(${CMAKE_SOURCE_DIR}/includes)
1631

17-
pybind11_add_module(tensorium ./Pybind/bindings.cpp)
32+
#
33+
find_package(CUDAToolkit QUIET)
1834

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+
)
2239

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()
2346

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()

Makefile

Lines changed: 0 additions & 147 deletions
This file was deleted.

Plugins/CMakeLists.txt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
find_package(LLVM REQUIRED CONFIG)
2+
include_directories(${LLVM_INCLUDE_DIRS})
3+
add_definitions(${LLVM_DEFINITIONS})
4+
5+
# List of components to map to libraries
6+
set(LLVM_COMPONENTS
7+
Core
8+
Support
9+
IRReader
10+
Analysis
11+
Passes
12+
TransformUtils
13+
)
14+
15+
llvm_map_components_to_libnames(LLVM_LIBS ${LLVM_COMPONENTS})
16+
17+
# Tensorium Dispatch Plugin (Clang AST)
18+
add_library(TensoriumDispatchPlugin SHARED TensoriumDispatchPlugin.cpp)
19+
target_link_libraries(TensoriumDispatchPlugin PRIVATE clang-cpp ${LLVM_LIBS})
20+
21+
# Tensorium LLVM IR Plugin
22+
add_library(TensoriumLLVM_IRCheck SHARED TensoriumLLVM_IRCheck.cpp)
23+
target_link_libraries(TensoriumLLVM_IRCheck PRIVATE ${LLVM_LIBS})

Plugins/TensoriumDispatchPlugin.cpp

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,12 @@
66
#include "clang/Lex/Preprocessor.h"
77
#include "clang/Tooling/Tooling.h"
88
#include "llvm/Support/MemoryBuffer.h"
9+
#include <iostream>
10+
//
11+
// static int _ = []() {
12+
// std::cerr << "[TensoriumDispatchPlugin] Plugin loaded into Clang.\n";
13+
// return 0;
14+
// }();
915
// #include "LLVM_Handler.hpp"
1016
/**
1117
* @file TensoriumPlugin.cpp
@@ -59,7 +65,8 @@ class TensoriumASTConsumer : public ASTConsumer {
5965
// SourceLocation loc = FD->getBeginLoc();
6066
// for (const auto &entry : TensoriumTargetTable) {
6167
// if (Context.getSourceManager().isBeforeInTranslationUnit(entry.loc,
62-
// loc)) { std::string fname = FD->getNameAsString(); llvm::errs() << "[tensorium] Target("
68+
// loc)) { std::string fname = FD->getNameAsString();
69+
// llvm::errs() << "[tensorium] Target("
6370
// << entry.platform << ", " << entry.isa
6471
// << ") applies to function " << fname << "\n";
6572
//
@@ -300,6 +307,16 @@ class TensoriumPluginAction : public PluginASTAction {
300307

301308
} // namespace
302309

303-
/// @brief Register the plugin under the name "tensorium-dispatch"
304-
static FrontendPluginRegistry::Add<TensoriumPluginAction> X("tensorium-dispatch",
305-
"Handle #pragma tensorium directives");
310+
// @brief Register the plugin under the name "tensorium-dispatch"
311+
// Important: we avoid double-free issues by wrapping in a ManagedStatic,
312+
313+
#include "clang/Frontend/FrontendPluginRegistry.h"
314+
315+
//
316+
317+
using clang::FrontendPluginRegistry;
318+
319+
static FrontendPluginRegistry::Add<TensoriumPluginAction>
320+
X("tensorium-dispatch", "Handle #pragma tensorium directives");
321+
322+

Pybind/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
2+
find_package(pybind11 REQUIRED)
3+
pybind11_add_module(tensorium_bindings bindings.cpp)
4+
target_include_directories(tensorium_bindings PRIVATE ${CMAKE_SOURCE_DIR}/Includes)

Pybind/bindings.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
#include "Tensorium/Tensorium.hpp"
1+
#include "../includes/Tensorium/Tensorium.hpp"
22
#include <iostream>
3-
#include <omp.h>
3+
// #include <omp.h>
44
#include <pybind11/numpy.h>
55
#include <pybind11/pybind11.h>
66
#include <pybind11/stl.h>

0 commit comments

Comments
 (0)