1# Exclude these from libMLIR.so because the JIT infrastructure 2# is a big dependency which most don't need. 3 4set(LLVM_OPTIONAL_SOURCES 5 ArmRunnerUtils.cpp 6 ArmSMEStubs.cpp 7 AsyncRuntime.cpp 8 CRunnerUtils.cpp 9 CudaRuntimeWrappers.cpp 10 SparseTensorRuntime.cpp 11 ExecutionEngine.cpp 12 Float16bits.cpp 13 RocmRuntimeWrappers.cpp 14 RunnerUtils.cpp 15 OptUtils.cpp 16 JitRunner.cpp 17 SpirvCpuRuntimeWrappers.cpp 18 SyclRuntimeWrappers.cpp 19 VulkanRuntimeWrappers.cpp 20 VulkanRuntime.cpp 21 VulkanRuntime.h 22 ) 23 24# Use a separate library for OptUtils, to avoid pulling in the entire JIT and 25# codegen infrastructure. Unlike MLIRExecutionEngine, this is part of 26# libMLIR.so. 27add_mlir_library(MLIRExecutionEngineUtils 28 OptUtils.cpp 29 30 ADDITIONAL_HEADER_DIRS 31 ${MLIR_MAIN_INCLUDE_DIR}/mlir/ExecutionEngine 32 33 DEPENDS 34 intrinsics_gen 35 36 LINK_COMPONENTS 37 Analysis 38 Core 39 Coroutines 40 AggressiveInstCombine 41 InstCombine 42 ScalarOpts 43 Vectorize 44 TransformUtils 45 IPO 46 Passes 47 TargetParser 48 ) 49 50if(NOT MLIR_ENABLE_EXECUTION_ENGINE) 51 return() 52endif() 53 54if(LLVM_USE_INTEL_JITEVENTS) 55 set(LLVM_JIT_LISTENER_LIB 56 IntelJITEvents) 57endif(LLVM_USE_INTEL_JITEVENTS) 58 59if(LLVM_USE_PERF) 60 set(LLVM_JIT_LISTENER_LIB 61 PerfJITEvents) 62endif(LLVM_USE_PERF) 63 64add_mlir_library(MLIRExecutionEngine 65 ExecutionEngine.cpp 66 67 EXCLUDE_FROM_LIBMLIR 68 69 ADDITIONAL_HEADER_DIRS 70 ${MLIR_MAIN_INCLUDE_DIR}/mlir/ExecutionEngine 71 72 DEPENDS 73 intrinsics_gen 74 75 LINK_COMPONENTS 76 Core 77 Coroutines 78 ExecutionEngine 79 Object 80 OrcJIT 81 JITLink 82 Analysis 83 AggressiveInstCombine 84 InstCombine 85 MC 86 ScalarOpts 87 Target 88 Vectorize 89 TransformUtils 90 nativecodegen 91 IPO 92 Passes 93 ${LLVM_JIT_LISTENER_LIB} 94 ) 95 96mlir_target_link_libraries(MLIRExecutionEngine PUBLIC 97 MLIRBuiltinToLLVMIRTranslation 98 MLIRExecutionEngineUtils 99 MLIRLLVMDialect 100 MLIRLLVMToLLVMIRTranslation 101 MLIROpenMPToLLVMIRTranslation 102 MLIRTargetLLVMIRExport 103 ) 104 105if(LLVM_BUILD_LLVM_DYLIB AND NOT (WIN32 OR MINGW OR CYGWIN)) # Does not build on windows currently, see #106859 106 # Build a shared library for the execution engine. Some downstream projects 107 # use this library to build their own CPU runners while preserving dynamic 108 # linkage. 109 add_mlir_library(MLIRExecutionEngineShared 110 ExecutionEngine.cpp 111 SHARED 112 113 EXCLUDE_FROM_LIBMLIR 114 115 ADDITIONAL_HEADER_DIRS 116 ${MLIR_MAIN_INCLUDE_DIR}/mlir/ExecutionEngine 117 118 # Ensures that all necessary dependencies are resolved. 119 DEPENDS 120 MLIRExecutionEngine 121 122 LINK_LIBS PUBLIC 123 LLVM 124 MLIR 125 ) 126endif() 127 128get_property(dialect_libs GLOBAL PROPERTY MLIR_DIALECT_LIBS) 129add_mlir_library(MLIRJitRunner 130 JitRunner.cpp 131 132 EXCLUDE_FROM_LIBMLIR 133 134 DEPENDS 135 intrinsics_gen 136 137 LINK_COMPONENTS 138 Core 139 OrcJIT 140 JITLink 141 142 LINK_LIBS PUBLIC 143 MLIRExecutionEngine 144) 145mlir_target_link_libraries(MLIRJitRunner PUBLIC 146 ${dialect_libs} 147 MLIRFuncDialect 148 MLIRFuncToLLVM 149 MLIRIR 150 MLIRParser 151 MLIRLLVMToLLVMIRTranslation 152 MLIRTargetLLVMIRExport 153 MLIRTransforms 154 MLIRSupport 155) 156 157# When -fPIC is not provided, shared libraries cannot be built if it links against 158# non-PIC code. 159if(LLVM_ENABLE_PIC) 160 add_mlir_library(mlir_float16_utils 161 SHARED 162 Float16bits.cpp 163 164 EXCLUDE_FROM_LIBMLIR 165 ) 166 set_property(TARGET mlir_float16_utils PROPERTY CXX_STANDARD 17) 167 target_compile_definitions(mlir_float16_utils PRIVATE mlir_float16_utils_EXPORTS) 168 169 add_subdirectory(SparseTensor) 170 171 add_mlir_library(mlir_c_runner_utils 172 SHARED 173 CRunnerUtils.cpp 174 SparseTensorRuntime.cpp 175 176 EXCLUDE_FROM_LIBMLIR 177 178 LINK_LIBS PUBLIC 179 mlir_float16_utils 180 MLIRSparseTensorEnums 181 MLIRSparseTensorRuntime 182 ) 183 set_property(TARGET mlir_c_runner_utils PROPERTY CXX_STANDARD 17) 184 target_compile_definitions(mlir_c_runner_utils PRIVATE mlir_c_runner_utils_EXPORTS) 185 186 add_mlir_library(mlir_runner_utils 187 SHARED 188 RunnerUtils.cpp 189 190 EXCLUDE_FROM_LIBMLIR 191 192 LINK_LIBS PUBLIC 193 mlir_float16_utils 194 ) 195 target_compile_definitions(mlir_runner_utils PRIVATE mlir_runner_utils_EXPORTS) 196 197 add_mlir_library(mlir_async_runtime 198 SHARED 199 AsyncRuntime.cpp 200 201 EXCLUDE_FROM_LIBMLIR 202 203 LINK_LIBS PUBLIC 204 ${LLVM_PTHREAD_LIB} 205 ) 206 set_property(TARGET mlir_async_runtime PROPERTY CXX_VISIBILITY_PRESET hidden) 207 target_compile_definitions(mlir_async_runtime PRIVATE mlir_async_runtime_EXPORTS) 208 if(CMAKE_SYSTEM_NAME STREQUAL "Linux") 209 # Don't export symbols from link-time dependencies, these are internal 210 # implementation details. 211 # FIXME: Add a similar fix for Windows. 212 target_link_options(mlir_async_runtime PRIVATE "-Wl,-exclude-libs,ALL") 213 endif() 214 215 add_mlir_library(mlir_arm_sme_abi_stubs 216 SHARED 217 ArmSMEStubs.cpp) 218 target_compile_definitions(mlir_arm_sme_abi_stubs PRIVATE mlir_arm_sme_abi_stubs_EXPORTS) 219 220 add_mlir_library(mlir_arm_runner_utils 221 SHARED 222 ArmRunnerUtils.cpp) 223 224 if(MLIR_ENABLE_CUDA_RUNNER) 225 # Configure CUDA support. Using check_language first allows us to give a 226 # custom error message. 227 include(CheckLanguage) 228 check_language(CUDA) 229 if (CMAKE_CUDA_COMPILER) 230 enable_language(CUDA) 231 else() 232 message(SEND_ERROR 233 "Building the mlir cuda runner requires a working CUDA install") 234 endif() 235 236 # We need the libcuda.so library. 237 find_library(CUDA_RUNTIME_LIBRARY cuda HINTS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES} REQUIRED) 238 239 add_mlir_library(mlir_cuda_runtime 240 SHARED 241 CudaRuntimeWrappers.cpp 242 243 EXCLUDE_FROM_LIBMLIR 244 ) 245 set_property(TARGET mlir_cuda_runtime PROPERTY CXX_STANDARD 14) 246 247 target_include_directories(mlir_cuda_runtime 248 PRIVATE 249 ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} 250 ) 251 target_link_libraries(mlir_cuda_runtime 252 PRIVATE 253 ${CUDA_RUNTIME_LIBRARY} 254 ) 255 256 if(MLIR_ENABLE_CUDA_CUSPARSE) 257 # Find the libcusparse.so library if CUSPARSE build is requested. 258 find_library(CUDA_CUSPARSE_LIBRARY cusparse HINTS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES} REQUIRED) 259 260 target_link_libraries(mlir_cuda_runtime 261 PRIVATE 262 ${CUDA_CUSPARSE_LIBRARY} 263 ) 264 target_compile_definitions(mlir_cuda_runtime 265 PRIVATE 266 MLIR_ENABLE_CUDA_CUSPARSE=1 267 ) 268 269 if(MLIR_ENABLE_CUDA_CUSPARSELT) 270 # Find the libcusparseLt.so library in package manager default path if 271 # CUSPARSELT build is requested. libcusparseLt.so provides sm80+ tensor 272 # core support for 2:4 sparsity acceleration. 273 find_library(CUDA_CUSPARSELT_LIBRARY cusparseLt HINTS ${CMAKE_CUDA_IMPLICIT_LINK_DIRECTORIES} REQUIRED) 274 find_path(CUDA_CUSPARSELT_HEADER cusparseLt.h HINTS ${CMAKE_CUDA_TOOLKIT_INCLUDE_DIRECTORIES} REQUIRED) 275 target_include_directories(mlir_cuda_runtime 276 PRIVATE 277 ${CUDA_CUSPARSELT_HEADER} 278 ) 279 target_link_libraries(mlir_cuda_runtime 280 PRIVATE 281 ${CUDA_CUSPARSELT_LIBRARY} 282 ) 283 target_compile_definitions(mlir_cuda_runtime 284 PRIVATE 285 MLIR_ENABLE_CUDA_CUSPARSELT=1 286 ) 287 endif() 288 endif() 289 endif() 290 291 if(MLIR_ENABLE_ROCM_RUNNER) 292 # Configure ROCm support. 293 if (NOT DEFINED ROCM_PATH) 294 if (NOT DEFINED ENV{ROCM_PATH}) 295 set(ROCM_PATH "/opt/rocm" CACHE PATH "Path to which ROCm has been installed") 296 else() 297 set(ROCM_PATH $ENV{ROCM_PATH} CACHE PATH "Path to which ROCm has been installed") 298 endif() 299 endif() 300 # A lot of the ROCm CMake files expect to find their own dependencies in 301 # CMAKE_PREFIX_PATH and don't respect PATHS or HINTS :( . 302 # Therefore, temporarily add the ROCm path to CMAKE_PREFIX_PATH so we can 303 # load HIP, then remove it 304 set(REAL_CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}") 305 list(APPEND CMAKE_PREFIX_PATH ${ROCM_PATH} "${ROCM_PATH}/hip") 306 find_package(hip REQUIRED) 307 set(CMAKE_PREFIX_PATH "${REAL_CMAKE_PREFIX_PATH}") 308 309 if (NOT DEFINED ROCM_TEST_CHIPSET) 310 find_program(ROCM_AGENT_ENUMERATOR rocm_agent_enumerator "${ROCM_PATH}/bin" /usr/bin /usr/local/bin) 311 if(ROCM_AGENT_ENUMERATOR) 312 execute_process(COMMAND "${ROCM_AGENT_ENUMERATOR}" 313 OUTPUT_VARIABLE AGENTS_STRING 314 ERROR_VARIABLE AGENTS_STRING 315 RESULT_VARIABLE AGENT_ENUMERATOR_RESULT) 316 else() 317 message(SEND_ERROR "Could not find rocm_agent_enumerator") 318 endif() 319 if (NOT AGENT_ENUMERATOR_RESULT EQUAL 0) 320 message(SEND_ERROR "Could not run rocm_agent_enumerator and ROCM_TEST_CHIPSET is not defined") 321 set(AGENTS_STRING "") 322 endif() 323 string(STRIP AGENTS_STRING ${AGENTS_STRING}) 324 string(REPLACE "\n" ";" AGENTS_LIST ${AGENTS_STRING}) 325 list(FILTER AGENTS_LIST EXCLUDE REGEX "gfx000") 326 if (AGENTS_LIST STREQUAL "") 327 message(SEND_ERROR "No non-CPU ROCm agents found on the system, and ROCM_TEST_CHIPSET is not defined") 328 else() 329 list(GET AGENTS_LIST 0 FIRST_AGENT) 330 set(ROCM_TEST_CHIPSET ${FIRST_AGENT} CACHE STRING "Chipset for which to compile ROCm integration tests") 331 message(STATUS "Compiling integration tests for ${ROCM_TEST_CHIPSET}") 332 endif() 333 endif() 334 335 add_mlir_library(mlir_rocm_runtime 336 SHARED 337 RocmRuntimeWrappers.cpp 338 339 EXCLUDE_FROM_LIBMLIR 340 ) 341 342 # Supress compiler warnings from HIP headers 343 check_cxx_compiler_flag(-Wno-c++98-compat-extra-semi 344 CXX_SUPPORTS_NO_CXX98_COMPAT_EXTRA_SEMI_FLAG) 345 if (CXX_SUPPORTS_CXX98_COMPAT_EXTRA_SEMI_FLAG) 346 target_compile_options(mlir_rocm_runtime PRIVATE 347 "-Wno-c++98-compat-extra-semi") 348 endif() 349 check_cxx_compiler_flag(-Wno-return-type-c-linkage 350 CXX_SUPPORTS_WNO_RETURN_TYPE_C_LINKAGE_FLAG) 351 if (CXX_SUPPORTS_WNO_RETURN_TYPE_C_LINKAGE_FLAG) 352 target_compile_options(mlir_rocm_runtime PRIVATE 353 "-Wno-return-type-c-linkage") 354 endif() 355 check_cxx_compiler_flag(-Wno-nested-anon-types 356 CXX_SUPPORTS_WNO_NESTED_ANON_TYPES_FLAG) 357 if (CXX_SUPPORTS_WNO_NESTED_ANON_TYPES_FLAG) 358 target_compile_options(mlir_rocm_runtime PRIVATE 359 "-Wno-nested-anon-types") 360 endif() 361 check_cxx_compiler_flag(-Wno-gnu-anonymous-struct 362 CXX_SUPPORTS_WNO_GNU_ANONYMOUS_STRUCT_FLAG) 363 if (CXX_SUPPORTS_WNO_GNU_ANONYMOUS_STRUCT_FLAG) 364 target_compile_options(mlir_rocm_runtime PRIVATE 365 "-Wno-gnu-anonymous-struct") 366 endif() 367 368 set_property(TARGET mlir_rocm_runtime 369 PROPERTY INSTALL_RPATH_USE_LINK_PATH ON) 370 371 target_link_libraries(mlir_rocm_runtime 372 PUBLIC 373 hip::host hip::amdhip64 374 ) 375 endif() 376 377 if(MLIR_ENABLE_SYCL_RUNNER) 378 find_package(SyclRuntime) 379 380 if(NOT SyclRuntime_FOUND) 381 message(FATAL_ERROR "syclRuntime not found. Please set check oneapi installation and run setvars.sh.") 382 endif() 383 384 find_package(LevelZero) 385 386 if(NOT LevelZero_FOUND) 387 message(FATAL_ERROR "LevelZero not found. Please set LEVEL_ZERO_DIR.") 388 endif() 389 390 add_mlir_library(mlir_sycl_runtime 391 SHARED 392 SyclRuntimeWrappers.cpp 393 394 EXCLUDE_FROM_LIBMLIR 395 ) 396 397 check_cxx_compiler_flag("-frtti" CXX_HAS_FRTTI_FLAG) 398 if(NOT CXX_HAS_FRTTI_FLAG) 399 message(FATAL_ERROR "CXX compiler does not accept flag -frtti") 400 endif() 401 target_compile_options (mlir_sycl_runtime PUBLIC -fexceptions -frtti) 402 403 target_include_directories(mlir_sycl_runtime PRIVATE 404 ${MLIR_INCLUDE_DIRS} 405 ) 406 407 target_link_libraries(mlir_sycl_runtime PRIVATE LevelZero::LevelZero SyclRuntime::SyclRuntime) 408 409 set_property(TARGET mlir_sycl_runtime APPEND PROPERTY BUILD_RPATH "${LevelZero_LIBRARIES_DIR}" "${SyclRuntime_LIBRARIES_DIR}") 410 endif() 411 412 if(MLIR_ENABLE_SPIRV_CPU_RUNNER) 413 add_mlir_library(mlir_spirv_cpu_runtime 414 SHARED 415 SpirvCpuRuntimeWrappers.cpp 416 417 EXCLUDE_FROM_LIBMLIR 418 ) 419 420 target_compile_definitions(mlir_spirv_cpu_runtime 421 PRIVATE 422 mlir_spirv_cpu_runtime_EXPORTS) 423 endif() 424 425 if (MLIR_ENABLE_VULKAN_RUNNER) 426 find_package(Vulkan) 427 428 # If Vulkan is not found try a path specified by VULKAN_SDK. 429 if (NOT Vulkan_FOUND) 430 if ("$ENV{VULKAN_SDK}" STREQUAL "") 431 message(FATAL_ERROR "Vulkan not found through CMake; please provide " 432 "VULKAN_SDK path as an environment variable") 433 endif() 434 435 find_library(Vulkan_LIBRARY vulkan HINTS "$ENV{VULKAN_SDK}/lib" REQUIRED) 436 if (Vulkan_LIBRARY) 437 set(Vulkan_FOUND ON) 438 set(Vulkan_INCLUDE_DIR "$ENV{VULKAN_SDK}/include") 439 message(STATUS "Found Vulkan: " ${Vulkan_LIBRARY}) 440 endif() 441 endif() 442 443 if (NOT Vulkan_FOUND) 444 message(FATAL_ERROR "Cannot find Vulkan library") 445 endif() 446 447 add_llvm_library(mlir_vulkan_runtime SHARED 448 VulkanRuntimeWrappers.cpp 449 VulkanRuntime.cpp 450 ) 451 452 target_include_directories(mlir_vulkan_runtime 453 PUBLIC 454 ${Vulkan_INCLUDE_DIR} 455 ) 456 457 # *IMPORTANT*: This library cannot depend on LLVM libraries. Otherwise, 458 # it may cause LLVM version conflict when used together with other shared 459 # libraries depending on LLVM. Notably, Mesa, who implements Vulkan 460 # drivers on Linux, depends on the system libLLVM.so. 461 target_link_libraries(mlir_vulkan_runtime 462 PUBLIC 463 ${Vulkan_LIBRARY} 464 ) 465 endif() 466endif() 467