-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy pathCMakeLists.txt
217 lines (185 loc) · 6.29 KB
/
CMakeLists.txt
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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
# Copyright(c) Microsoft Corporation.
# Licensed under the MIT License.
# Learn a lot from the MLC - LLM Project
# https: // github.com/mlc-ai/mlc-llm/blob/main/CMakeLists.txt
cmake_minimum_required(VERSION 3.18)
project(TILE_LANG C CXX)
# Set default build type to Release if not provided
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
# Define a custom macro for globbing files with conditional CONFIGURE_DEPENDS
if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.12.0")
macro(tilelang_file_glob glob variable)
file(${glob} ${variable} CONFIGURE_DEPENDS ${ARGN})
endmacro()
else()
macro(tilelang_file_glob glob variable)
file(${glob} ${variable} ${ARGN})
endmacro()
endif()
# Handle TVM prebuild path or use default configuration
if(DEFINED TVM_PREBUILD_PATH)
message(STATUS "TVM_PREBUILD_PATH: ${TVM_PREBUILD_PATH}")
if(EXISTS ${TVM_PREBUILD_PATH}/config.cmake)
include(${TVM_PREBUILD_PATH}/config.cmake)
endif()
else()
if(EXISTS ${CMAKE_BINARY_DIR}/config.cmake)
include(${CMAKE_BINARY_DIR}/config.cmake)
elseif(EXISTS ${CMAKE_SOURCE_DIR}/config.cmake)
include(${CMAKE_SOURCE_DIR}/config.cmake)
endif()
# Set default build type to RelWithDebInfo if not provided
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Build type" FORCE)
message(STATUS "Setting default build type to ${CMAKE_BUILD_TYPE}")
endif()
endif()
# include cmake modules
include(CheckCXXCompilerFlag)
# Enable static runtime build if required
if(TILE_LANG_INSTALL_STATIC_LIB)
set(BUILD_STATIC_RUNTIME ON)
endif()
# Enforce CUDA standard
if(USE_CUDA)
set(CMAKE_CUDA_STANDARD 17)
endif()
# Enforce HIP standard
if(USE_ROCM)
set(CMAKE_HIP_STANDARD 17)
check_cxx_compiler_flag("-std=c++17" SUPPORT_CXX17)
set(CMAKE_CXX_FLAGS "-D__HIP_PLATFORM_AMD__ ${CMAKE_CXX_FLAGS}")
endif()
# Enforce C++ standard
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
# Locate TVM source directory
if(NOT DEFINED TVM_SOURCE_DIR)
if(DEFINED ENV{TVM_SOURCE_DIR})
set(TVM_SOURCE_DIR "$ENV{TVM_SOURCE_DIR}")
else()
set(TVM_SOURCE_DIR ${PROJECT_SOURCE_DIR}/3rdparty/tvm)
endif()
endif()
# Handle TVM prebuild or build TVM from source
if(DEFINED TVM_PREBUILD_PATH)
message(STATUS "Using prebuilt TVM from ${TVM_PREBUILD_PATH}")
add_library(tvm SHARED IMPORTED)
set_target_properties(tvm PROPERTIES
IMPORTED_LOCATION "${TVM_PREBUILD_PATH}/libtvm.so"
INTERFACE_INCLUDE_DIRECTORIES "${TVM_PREBUILD_PATH}/../include"
)
add_library(tvm_runtime SHARED IMPORTED)
set_target_properties(tvm_runtime PROPERTIES
IMPORTED_LOCATION "${TVM_PREBUILD_PATH}/libtvm_runtime.so"
INTERFACE_INCLUDE_DIRECTORIES "${TVM_PREBUILD_PATH}/../include"
)
else()
message(STATUS "Building TVM from source at ${TVM_SOURCE_DIR}")
add_subdirectory(${TVM_SOURCE_DIR} tvm EXCLUDE_FROM_ALL)
endif()
# Collect source files
tilelang_file_glob(GLOB TILE_LANG_SRCS
src/*.cc
src/layout/*.cc
src/transform/*.cc
src/op/*.cc
src/target/utils.cc
src/target/codegen_cpp.cc
src/target/rt_mod_cpp.cc
)
# Include CUDA source files if CUDA is enabled
if(USE_CUDA)
tilelang_file_glob(GLOB TILE_LANG_CUDA_SRCS
src/runtime/*.cc
src/target/codegen_cuda.cc
src/target/rt_mod_cuda.cc
)
list(APPEND TILE_LANG_SRCS ${TILE_LANG_CUDA_SRCS})
endif()
# Include ROCm source files if ROCm is enabled
if(USE_ROCM)
tilelang_file_glob(GLOB TILE_LANG_HIP_SRCS
src/target/codegen_hip.cc
src/target/rt_mod_hip.cc
)
list(APPEND TILE_LANG_SRCS ${TILE_LANG_HIP_SRCS})
endif()
message(STATUS "Collected source files: ${TILE_LANG_SRCS}")
# Add TileLang object library
add_library(tilelang_objs OBJECT ${TILE_LANG_SRCS})
# Include directories for TileLang
set(TILE_LANG_INCLUDES
${TVM_SOURCE_DIR}/include
${TVM_SOURCE_DIR}/src
${TVM_SOURCE_DIR}/3rdparty/dlpack/include
${TVM_SOURCE_DIR}/3rdparty/dmlc-core/include
)
# Find CUDA Toolkit
if(USE_CUDA)
find_package(CUDAToolkit REQUIRED)
if(NOT CUDAToolkit_FOUND)
message(FATAL_ERROR "CUDA Toolkit not found. Please set CUDAToolkit_ROOT.")
endif()
message(STATUS "CUDA Toolkit includes: ${CUDAToolkit_INCLUDE_DIRS}")
list(APPEND TILE_LANG_INCLUDES ${CUDAToolkit_INCLUDE_DIRS})
endif(USE_CUDA)
# Find ROCM Toolkit
if(USE_ROCM)
find_rocm(${USE_ROCM})
message(STATUS "USE_ROCM: ${USE_ROCM}")
if(ROCM_FOUND)
# always set the includedir
# avoid global retrigger of cmake
include_directories(SYSTEM ${ROCM_INCLUDE_DIRS})
add_definitions(-D__HIP_PLATFORM_HCC__=1)
else()
message(FATAL_ERROR "ROCM Toolkit not found. Please set HIP_ROOT.")
endif(ROCM_FOUND)
message(STATUS "ROCM Toolkit includes: ${ROCM_INCLUDE_DIRS}")
list(APPEND TILE_LANG_INCLUDES ${ROCM_INCLUDE_DIRS})
endif(USE_ROCM)
# Define compile-time macros
set(TILE_LANG_COMPILE_DEFS
DMLC_USE_LOGGING_LIBRARY=<tvm/runtime/logging.h>
__STDC_FORMAT_MACROS=1
PICOJSON_USE_INT64
)
# Set target properties for object library
target_include_directories(tilelang_objs PRIVATE ${TILE_LANG_INCLUDES})
target_compile_definitions(tilelang_objs PRIVATE ${TILE_LANG_COMPILE_DEFS})
target_compile_definitions(tilelang_objs PRIVATE -DTILE_LANG_EXPORTS)
# Shared library
add_library(tilelang SHARED $<TARGET_OBJECTS:tilelang_objs>)
target_link_libraries(tilelang PUBLIC tvm_runtime)
# Static library
add_library(tilelang_static STATIC $<TARGET_OBJECTS:tilelang_objs>)
add_dependencies(tilelang_static tvm_runtime)
set_target_properties(tilelang_static PROPERTIES OUTPUT_NAME tilelang)
# Debug build type-specific definitions
if(CMAKE_BUILD_TYPE STREQUAL "Debug")
target_compile_definitions(tilelang PRIVATE "TVM_LOG_DEBUG")
target_compile_definitions(tilelang_objs PRIVATE "TVM_LOG_DEBUG")
target_compile_definitions(tilelang_static PRIVATE "TVM_LOG_DEBUG")
endif()
# Module shared library
add_library(tilelang_module SHARED $<TARGET_OBJECTS:tilelang_objs>)
target_link_libraries(tilelang_module PUBLIC tvm)
# Install targets
if(TILE_LANG_INSTALL_STATIC_LIB)
install(TARGETS tilelang_static tvm_runtime
LIBRARY DESTINATION lib${LIB_SUFFIX}
)
else()
if(DEFINED TVM_PREBUILD_PATH)
install(TARGETS tilelang tilelang_module
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib${LIB_SUFFIX}
)
else()
install(TARGETS tvm_runtime tilelang tilelang_module
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib${LIB_SUFFIX}
)
endif()
endif()