Skip to content

Commit 7887847

Browse files
committed
feat: library support
1 parent 4a7009c commit 7887847

File tree

7 files changed

+197
-63
lines changed

7 files changed

+197
-63
lines changed

.vscode/settings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@
122122
// Cmake
123123
"cmake.configureArgs": [
124124
"-DSAVE_JITS_TO_FILE=ON",
125-
"-DUSE_OPENMP=ON"
125+
"-DMLC_USE_OPENMP=ON"
126126
],
127127

128128
"todo-tree.filtering.excludeGlobs": [

CMakeLists.txt

Lines changed: 179 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1-
2-
cmake_minimum_required(VERSION 3.10.0)
1+
cmake_minimum_required(VERSION 3.28.0)
32
project(MachineLearningCompiler VERSION 0.1.0 LANGUAGES C CXX ASM)
43

4+
if(NOT (UNIX AND CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64|arm)"))
5+
message(FATAL_ERROR "Only arm on Linux is supported.")
6+
endif()
7+
8+
59
# Set default build type to Release if not specified
610
if(NOT CMAKE_BUILD_TYPE)
711
set(CMAKE_BUILD_TYPE "Release")
@@ -31,17 +35,18 @@ if(SAVE_JITS_TO_FILE)
3135
# set per target
3236
endif()
3337

34-
option(USE_OPENMP "Use OpenMP for parallelization of the TensorOperation" ON)
38+
option(MLC_USE_OPENMP "Use OpenMP for parallelization of the Tensor Operation" ON)
3539

36-
if(USE_OPENMP)
40+
if(MLC_USE_OPENMP)
3741
find_package(OpenMP REQUIRED)
3842

3943
if(OpenMP_CXX_FOUND)
4044
add_compile_options(-fopenmp)
41-
add_compile_definitions(USE_OPENMP)
45+
add_compile_definitions(MLC_USE_OPENMP)
4246
endif()
4347
endif()
4448

49+
option(BUILD_SHARED_LIBS "Build using shared libraries" ON)
4550

4651
# ==============================================================
4752
# Setup compile Flags
@@ -57,25 +62,29 @@ set(CMAKE_VERBOSE_MAKEFILE off)
5762
# ==============================================================
5863
# Fetch external libs
5964
# ==============================================================
60-
Include(FetchContent)
61-
62-
FetchContent_Declare(
63-
Catch2
64-
GIT_REPOSITORY https://github.com/catchorg/Catch2
65-
GIT_TAG v3.8.1
66-
)
67-
FetchContent_MakeAvailable(Catch2)
68-
69-
# set(BENCHMARK_DOWNLOAD_DEPENDENCIES on)
70-
set(BENCHMARK_ENABLE_GTEST_TESTS off)
71-
set(BENCHMARK_ENABLE_TESTING off)
72-
73-
FetchContent_Declare(
74-
google_benchmark
75-
GIT_REPOSITORY https://github.com/google/benchmark
76-
GIT_TAG v1.9.2
77-
)
78-
FetchContent_MakeAvailable(google_benchmark)
65+
if(PROJECT_IS_TOP_LEVEL)
66+
Include(FetchContent)
67+
68+
FetchContent_Declare(
69+
Catch2
70+
GIT_REPOSITORY https://github.com/catchorg/Catch2
71+
GIT_TAG v3.8.1
72+
EXCLUDE_FROM_ALL
73+
)
74+
FetchContent_MakeAvailable(Catch2)
75+
76+
# set(BENCHMARK_DOWNLOAD_DEPENDENCIES on)
77+
set(BENCHMARK_ENABLE_GTEST_TESTS off)
78+
set(BENCHMARK_ENABLE_TESTING off)
79+
80+
FetchContent_Declare(
81+
google_benchmark
82+
GIT_REPOSITORY https://github.com/google/benchmark
83+
GIT_TAG v1.9.2
84+
EXCLUDE_FROM_ALL
85+
)
86+
FetchContent_MakeAvailable(google_benchmark)
87+
endif()
7988

8089
# ==============================================================
8190
# Source files
@@ -299,44 +308,161 @@ endforeach()
299308
# =============================================================
300309
# TARGETS
301310
# =============================================================
302-
# tests
303-
add_executable(tests "${SOURCE_FILEPATHS}" "${TEST_FILEPATHS}")
304-
if(SAVE_JITS_TO_FILE)
305-
target_compile_definitions(tests PUBLIC SAVE_JITS_TO_FILE)
306-
endif(SAVE_JITS_TO_FILE)
311+
if(PROJECT_IS_TOP_LEVEL)
312+
# tests
313+
add_executable(tests "${SOURCE_FILEPATHS}" "${TEST_FILEPATHS}")
314+
if(SAVE_JITS_TO_FILE)
315+
target_compile_definitions(tests PUBLIC SAVE_JITS_TO_FILE)
316+
endif(SAVE_JITS_TO_FILE)
307317

308-
target_link_libraries(tests PRIVATE Catch2::Catch2WithMain)
318+
target_link_libraries(tests PRIVATE Catch2::Catch2WithMain)
309319

310-
if(OpenMP_CXX_FOUND)
311-
target_link_libraries(tests PRIVATE OpenMP::OpenMP_CXX)
312-
endif()
320+
if(OpenMP_CXX_FOUND)
321+
target_link_libraries(tests PRIVATE OpenMP::OpenMP_CXX)
322+
endif()
313323

314-
# tests sanitized
315-
add_executable(tests_sanitized "${SOURCE_FILEPATHS}" "${TEST_FILEPATHS}")
316-
if(SAVE_JITS_TO_FILE)
317-
target_compile_definitions(tests_sanitized PUBLIC SAVE_JITS_TO_FILE)
318-
endif(SAVE_JITS_TO_FILE)
324+
# tests sanitized
325+
add_executable(tests_sanitized "${SOURCE_FILEPATHS}" "${TEST_FILEPATHS}")
326+
if(SAVE_JITS_TO_FILE)
327+
target_compile_definitions(tests_sanitized PUBLIC SAVE_JITS_TO_FILE)
328+
endif(SAVE_JITS_TO_FILE)
319329

320-
target_compile_options(tests_sanitized PRIVATE -g -fsanitize=float-divide-by-zero -fsanitize=bounds -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer)
321-
target_link_options(tests_sanitized PRIVATE -g -fsanitize=address -fsanitize=undefined)
322-
target_link_libraries(tests_sanitized PRIVATE Catch2::Catch2WithMain)
330+
target_compile_options(tests_sanitized PRIVATE -g -fsanitize=float-divide-by-zero -fsanitize=bounds -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer)
331+
target_link_options(tests_sanitized PRIVATE -g -fsanitize=address -fsanitize=undefined)
332+
target_link_libraries(tests_sanitized PRIVATE Catch2::Catch2WithMain)
323333

324-
if(OpenMP_CXX_FOUND)
325-
target_link_libraries(tests_sanitized PRIVATE OpenMP::OpenMP_CXX)
326-
endif()
334+
if(MLC_USE_OPENMP AND OpenMP_CXX_FOUND)
335+
target_link_libraries(tests_sanitized PRIVATE OpenMP::OpenMP_CXX)
336+
endif()
327337

328-
# benchmarks
329-
add_executable(benchmarks "${SOURCE_FILEPATHS}" "${BENCH_FILEPATHS}")
338+
# benchmarks
339+
add_executable(benchmarks "${SOURCE_FILEPATHS}" "${BENCH_FILEPATHS}")
330340

331-
target_link_libraries(benchmarks PRIVATE benchmark::benchmark_main)
332-
if(OpenMP_CXX_FOUND)
333-
target_link_libraries(benchmarks PRIVATE OpenMP::OpenMP_CXX)
341+
target_link_libraries(benchmarks PRIVATE benchmark::benchmark_main)
342+
if(MLC_USE_OPENMP AND OpenMP_CXX_FOUND)
343+
target_link_libraries(benchmarks PRIVATE OpenMP::OpenMP_CXX)
344+
endif()
334345
endif()
335346

336347
# ==============================================================
337348
# Ctest setup
338349
# ==============================================================
339-
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
340-
include(CTest)
341-
include(Catch)
342-
catch_discover_tests(tests)
350+
if(PROJECT_IS_TOP_LEVEL)
351+
list(APPEND CMAKE_MODULE_PATH ${catch2_SOURCE_DIR}/extras)
352+
include(CTest)
353+
include(Catch)
354+
catch_discover_tests(tests)
355+
endif()
356+
357+
# ==============================================================
358+
# Library Setup
359+
# ==============================================================
360+
361+
if(PROJECT_IS_TOP_LEVEL)
362+
if(DEFINED CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
363+
message(
364+
STATUS
365+
"CMAKE_INSTALL_PREFIX is not set\n"
366+
" ├ Default value: ${CMAKE_INSTALL_PREFIX}\n"
367+
" └ Will set it to ${CMAKE_SOURCE_DIR}/install"
368+
)
369+
set(CMAKE_INSTALL_PREFIX
370+
"${CMAKE_SOURCE_DIR}/install"
371+
CACHE PATH "Where the library will be installed to" FORCE
372+
)
373+
else()
374+
message(
375+
STATUS
376+
"CMAKE_INSTALL_PREFIX was already set\n"
377+
" └ Current value: ${CMAKE_INSTALL_PREFIX}"
378+
)
379+
endif()
380+
endif()
381+
382+
add_library(${PROJECT_NAME})
383+
384+
target_sources(${PROJECT_NAME}
385+
PRIVATE
386+
"${SOURCE_FILEPATHS}"
387+
)
388+
389+
target_include_directories(${PROJECT_NAME}
390+
PRIVATE
391+
# where the library itself will look for its internal headers
392+
${CMAKE_CURRENT_SOURCE_DIR}/src/interface
393+
${CMAKE_CURRENT_SOURCE_DIR}/src/main
394+
${CMAKE_CURRENT_SOURCE_DIR}/src/main/kernels
395+
${CMAKE_CURRENT_SOURCE_DIR}/src/main/kernels/unary
396+
${CMAKE_CURRENT_SOURCE_DIR}/src/main/arm_instructions
397+
${CMAKE_CURRENT_SOURCE_DIR}/src/main/arm_instructions/base
398+
${CMAKE_CURRENT_SOURCE_DIR}/src/main/arm_instructions/register
399+
${CMAKE_CURRENT_SOURCE_DIR}/src/main/arm_instructions/simd_fp
400+
${CMAKE_CURRENT_SOURCE_DIR}/src/test
401+
${CMAKE_CURRENT_SOURCE_DIR}/src/test/kernels
402+
${CMAKE_CURRENT_SOURCE_DIR}/src/test/kernels/unary
403+
${CMAKE_CURRENT_SOURCE_DIR}/src/test/arm_instructions
404+
${CMAKE_CURRENT_SOURCE_DIR}/src/test/arm_instructions/base
405+
${CMAKE_CURRENT_SOURCE_DIR}/src/test/arm_instructions/simd_fp
406+
PUBLIC
407+
# using the project name as additional directory to include <project_name>/header.h instead of header.h if it is included as internal library
408+
# where top-level project will look for the library's public headers
409+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/${PROJECT_NAME}>
410+
# where external projects will look for the library's public headers
411+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
412+
)
413+
414+
if(MLC_USE_OPENMP AND OpenMP_CXX_FOUND)
415+
target_link_libraries(${PROJECT_NAME} PRIVATE OpenMP::OpenMP_CXX)
416+
endif()
417+
418+
# without it public headers won't get installed
419+
set(public_headers
420+
include/${PROJECT_NAME}/tensor.h
421+
)
422+
set_target_properties(${PROJECT_NAME} PROPERTIES PUBLIC_HEADER ${public_headers})
423+
424+
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d")
425+
426+
# definitions of CMAKE_INSTALL_LIBDIR, CMAKE_INSTALL_INCLUDEDIR and others
427+
include(GNUInstallDirs)
428+
429+
# install the target and create export-set
430+
install(TARGETS ${PROJECT_NAME}
431+
EXPORT "${PROJECT_NAME}Targets"
432+
# these get default values from GNUInstallDirs, no need to set them
433+
#RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # bin
434+
#LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib
435+
#ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # lib
436+
# except for public headers, as we want them to be inside a library folder
437+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} # include/SomeLibrary
438+
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # include
439+
)
440+
441+
set(namespace mlc)
442+
443+
# generate and install export file
444+
install(EXPORT "${PROJECT_NAME}Targets"
445+
FILE "${PROJECT_NAME}Targets.cmake"
446+
NAMESPACE ${namespace}::
447+
DESTINATION cmake
448+
)
449+
450+
include(CMakePackageConfigHelpers)
451+
452+
# generate the version file for the config file
453+
write_basic_package_version_file(
454+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
455+
VERSION "${version}"
456+
COMPATIBILITY AnyNewerVersion
457+
)
458+
# create config file
459+
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
460+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
461+
INSTALL_DESTINATION cmake
462+
)
463+
# install config files
464+
install(FILES
465+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
466+
"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
467+
DESTINATION cmake
468+
)

Config.cmake.in

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
@PACKAGE_INIT@
2+
3+
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
4+
5+
check_required_components(@PROJECT_NAME@)
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Tensor::einsum(std::vector<Tensor> inputs, Tensor &output, std::string tree, dim_sizes)
2+
3+
Tensor::contraction(Tensor input0, Tensor input1, Tensor &output) Tensor::unary(Tensor &inOut, op)

src/main/TensorOperation.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -703,7 +703,7 @@ void mini_jit::TensorOperation::execute_dimension(int64_t index_dim, char const
703703
bool is_first = first_access;
704704
bool is_last = last_access;
705705

706-
#ifdef USE_OPENMP
706+
#ifdef MLC_USE_OPENMP
707707
#pragma omp parallel for if (dim_size > 1)
708708
#endif
709709
for (int64_t iDim = 0; iDim < dim_size; iDim++)

src/main/TensorOptimization.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ void mini_jit::TensorOptimization::_primitive_identification(TensorConfig &confi
179179

180180
void mini_jit::TensorOptimization::_shared_identification(TensorConfig &config)
181181
{
182-
#ifdef USE_OPENMP
182+
#ifdef MLC_USE_OPENMP
183183
release_assert(config.dim_types.size() == config.dim_sizes.size(),
184184
"Expected the dimension types size to match the dimension sizes size.");
185185

@@ -210,7 +210,7 @@ void mini_jit::TensorOptimization::_shared_identification(TensorConfig &config)
210210
}
211211
#else
212212
(void)config;
213-
#endif // USE_OPENMP
213+
#endif // MLC_USE_OPENMP
214214
}
215215

216216
void mini_jit::TensorOptimization::_dimension_reordering_shared(TensorConfig &config)

src/main/TensorOptimization.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,23 @@
22
#define MINI_JIT_TENSOROPTIMIZATION_H
33

44
#include "TensorConfig.h"
5-
#ifdef USE_OPENMP
5+
#ifdef MLC_USE_OPENMP
66
#include <omp.h>
7-
#endif // USE_OPENMP
7+
#endif // MLC_USE_OPENMP
88

99
namespace mini_jit
1010
{
1111
class TensorOptimization
1212
{
1313
private:
14-
#ifdef USE_OPENMP
14+
#ifdef MLC_USE_OPENMP
1515
/// @brief The number of processors to use for parallel work
1616
const int thread_count = omp_get_max_threads();
1717

1818
#else
1919
/// @brief The number of processors to use for parallel work
2020
const int thread_count = 1;
21-
#endif // USE_OPENMP
21+
#endif // MLC_USE_OPENMP
2222

2323
/// @brief The inbalanced percentage of parallelism that can be achieved.
2424
const double maximum_inbalanced_parallel_precentage = 1.0 / 100; // 1%
@@ -36,8 +36,8 @@ namespace mini_jit
3636
* @param primitive_k1 The k1 primitive index.
3737
* @param primitive_k2 The k2 primitive index.
3838
*/
39-
void _reorder_helper_adjust_index(int32_t index, int32_t adjust_index, int32_t &primitive_m, int32_t &primitive_n, int32_t &primitive_k1,
40-
int32_t &primitive_k2);
39+
void _reorder_helper_adjust_index(int32_t index, int32_t adjust_index, int32_t &primitive_m, int32_t &primitive_n,
40+
int32_t &primitive_k1, int32_t &primitive_k2);
4141

4242
/**
4343
* @brief Runs the optimization primitive identification.

0 commit comments

Comments
 (0)