xref: /llvm-project/mlir/lib/ExecutionEngine/CMakeLists.txt (revision 047e8e47c1f9d872aec835b915935802e195c555)
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