1add_mlir_library(MLIRTargetLLVM 2 ModuleToObject.cpp 3 4 ADDITIONAL_HEADER_DIRS 5 ${MLIR_MAIN_INCLUDE_DIR}/mlir/Target/LLVM 6 7 DEPENDS 8 intrinsics_gen 9 10 LINK_COMPONENTS 11 Core 12 IPO 13 IRReader 14 Linker 15 MC 16 Passes 17 Support 18 Target 19 LINK_LIBS PUBLIC 20 MLIRExecutionEngineUtils 21 MLIRTargetLLVMIRExport 22) 23 24if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD) 25 set(NVPTX_LIBS 26 NVPTXCodeGen 27 NVPTXDesc 28 NVPTXInfo 29 ) 30endif() 31 32add_mlir_dialect_library(MLIRNVVMTarget 33 NVVM/Target.cpp 34 35 OBJECT 36 37 ADDITIONAL_HEADER_DIRS 38 ${MLIR_MAIN_INCLUDE_DIR}/mlir/Dialect/LLVMIR 39 40 LINK_COMPONENTS 41 ${NVPTX_LIBS} 42 43 LINK_LIBS PUBLIC 44 MLIRIR 45 MLIRExecutionEngineUtils 46 MLIRSupport 47 MLIRGPUDialect 48 MLIRTargetLLVM 49 MLIRNVVMToLLVMIRTranslation 50 ) 51 52if ("NVPTX" IN_LIST LLVM_TARGETS_TO_BUILD) 53 # Find the CUDA toolkit. 54 find_package(CUDAToolkit) 55 56 if(CUDAToolkit_FOUND) 57 # Get the CUDA toolkit path. The path is needed for detecting `libdevice.bc`. 58 # These extra steps are needed because of a bug on CMake. 59 # See: https://gitlab.kitware.com/cmake/cmake/-/issues/24858 60 # TODO: Bump the MLIR CMake version to 3.26.4 and switch to 61 # ${CUDAToolkit_LIBRARY_ROOT} 62 if(NOT DEFINED ${CUDAToolkit_LIBRARY_ROOT}) 63 get_filename_component(MLIR_CUDAToolkit_ROOT ${CUDAToolkit_BIN_DIR} 64 DIRECTORY ABSOLUTE) 65 else() 66 set(MLIR_CUDAToolkit_ROOT ${CUDAToolkit_LIBRARY_ROOT}) 67 endif() 68 69 # Add the `nvptxcompiler` library. 70 if(MLIR_ENABLE_NVPTXCOMPILER) 71 # Find the `nvptxcompiler` library. 72 # TODO: Bump the MLIR CMake version to 3.25 and use `CUDA::nvptxcompiler_static`. 73 find_library(MLIR_NVPTXCOMPILER_LIB_PATH nvptxcompiler_static 74 PATHS ${CUDAToolkit_LIBRARY_DIR} NO_DEFAULT_PATH) 75 76 # Fail if `nvptxcompiler_static` couldn't be found. 77 if(MLIR_NVPTXCOMPILER_LIB_PATH STREQUAL "MLIR_NVPTXCOMPILER_LIB_PATH-NOTFOUND") 78 message(FATAL_ERROR 79 "Requested using the `nvptxcompiler` library backend but it couldn't be found.") 80 endif() 81 82 add_library(MLIR_NVPTXCOMPILER_LIB STATIC IMPORTED GLOBAL) 83 # Downstream projects can modify this path and use it in CMake. For example: 84 # add_library(MLIR_NVPTXCOMPILER_LIB STATIC IMPORTED GLOBAL) 85 # set_property(TARGET MLIR_NVPTXCOMPILER_LIB PROPERTY IMPORTED_LOCATION ${...}) 86 # where `...` is to be replaced with the path to the library. 87 set_property(TARGET MLIR_NVPTXCOMPILER_LIB PROPERTY IMPORTED_LOCATION ${MLIR_NVPTXCOMPILER_LIB_PATH}) 88 # Link against `nvptxcompiler_static`. TODO: use `CUDA::nvptxcompiler_static`. 89 target_link_libraries(MLIRNVVMTarget PRIVATE MLIR_NVPTXCOMPILER_LIB) 90 target_include_directories(obj.MLIRNVVMTarget PUBLIC ${CUDAToolkit_INCLUDE_DIRS}) 91 92 # Add the `nvfatbin` library. 93 find_library(MLIR_NVFATBIN_LIB_PATH nvfatbin_static 94 PATHS ${CUDAToolkit_LIBRARY_DIR} NO_DEFAULT_PATH) 95 # Fail if `nvfatbin_static` couldn't be found. 96 if(MLIR_NVFATBIN_LIB_PATH STREQUAL "MLIR_NVFATBIN_LIB_PATH-NOTFOUND") 97 message(FATAL_ERROR 98 "Requested using the static `nvptxcompiler` library which requires the \ 99 'nvfatbin` library, but it couldn't be found.") 100 endif() 101 102 add_library(MLIR_NVFATBIN_LIB STATIC IMPORTED GLOBAL) 103 set_property(TARGET MLIR_NVFATBIN_LIB PROPERTY IMPORTED_LOCATION ${MLIR_NVFATBIN_LIB_PATH}) 104 target_link_libraries(MLIRNVVMTarget PRIVATE MLIR_NVFATBIN_LIB) 105 endif() 106 else() 107 # Fail if `MLIR_ENABLE_NVPTXCOMPILER` is enabled and the toolkit couldn't be found. 108 if(MLIR_ENABLE_NVPTXCOMPILER) 109 message(FATAL_ERROR 110 "Requested using the `nvptxcompiler` library backend but it couldn't be found.") 111 endif() 112 endif() 113 message(VERBOSE "MLIR default CUDA toolkit path: ${MLIR_CUDAToolkit_ROOT}") 114 115 # Define the `CUDAToolkit` path. 116 target_compile_definitions(obj.MLIRNVVMTarget 117 PRIVATE 118 __DEFAULT_CUDATOOLKIT_PATH__="${MLIR_CUDAToolkit_ROOT}" 119 ) 120endif() 121 122 123function(embed_binary_to_src file output_file symbol) 124 file(READ ${file} filedata HEX) 125 # Convert hex data for C compatibility 126 string(REGEX REPLACE "([0-9a-f][0-9a-f])" "0x\\1," filedata ${filedata}) 127 # Write data to output file 128 file(WRITE ${output_file} "const char ${symbol}[] = {${filedata}};\nconst int ${symbol}_size = sizeof(${symbol});\n") 129endfunction() 130 131set(MLIR_NVVM_EMBED_LIBDEVICE 0 CACHE BOOL "Embed CUDA libdevice.bc in the binary at build time instead of looking it up at runtime") 132if (MLIR_NVVM_EMBED_LIBDEVICE) 133 if (NOT MLIR_NVVM_LIBDEVICE_PATH) 134 if(CUDAToolkit_FOUND) 135 find_file(MLIR_NVVM_LIBDEVICE_PATH libdevice.10.bc 136 PATHS ${CUDAToolkit_LIBRARY_ROOT} 137 PATH_SUFFIXES "nvvm/libdevice" NO_DEFAULT_PATH REQUIRED) 138 else() 139 message(FATAL_ERROR 140 "Requested using the `nvptxcompiler` library backend but it couldn't be found.") 141 endif() 142 endif() 143 144 embed_binary_to_src(${MLIR_NVVM_LIBDEVICE_PATH} ${CMAKE_CURRENT_BINARY_DIR}/libdevice_embedded.c _mlir_embedded_libdevice) 145 add_mlir_library(MLIRNVVMLibdevice 146 ${CMAKE_CURRENT_BINARY_DIR}/libdevice_embedded.c 147 ) 148 target_link_libraries(MLIRNVVMTarget PRIVATE MLIRNVVMLibdevice) 149 target_compile_definitions(obj.MLIRNVVMTarget 150 PRIVATE 151 MLIR_NVVM_EMBED_LIBDEVICE=1 152 ) 153else() 154 target_compile_definitions(obj.MLIRNVVMTarget 155 PRIVATE 156 MLIR_NVVM_EMBED_LIBDEVICE=0 157 ) 158endif() 159 160 161if (MLIR_ENABLE_ROCM_CONVERSIONS) 162 set(AMDGPU_LIBS 163 AMDGPUAsmParser 164 AMDGPUCodeGen 165 AMDGPUDesc 166 AMDGPUInfo 167 ) 168endif() 169 170add_mlir_dialect_library(MLIRROCDLTarget 171 ROCDL/Target.cpp 172 ROCDL/Utils.cpp 173 174 OBJECT 175 176 LINK_COMPONENTS 177 FrontendOffloading 178 MCParser 179 ${AMDGPU_LIBS} 180 181 LINK_LIBS PUBLIC 182 MLIRIR 183 MLIRExecutionEngineUtils 184 MLIRSupport 185 MLIRGPUDialect 186 MLIRTargetLLVM 187 MLIRROCDLToLLVMIRTranslation 188 ) 189 190if(MLIR_ENABLE_ROCM_CONVERSIONS) 191 if (DEFINED ROCM_PATH) 192 set(DEFAULT_ROCM_PATH "${ROCM_PATH}" CACHE PATH "Fallback path to search for ROCm installs") 193 elseif(DEFINED ENV{ROCM_PATH}) 194 set(DEFAULT_ROCM_PATH "$ENV{ROCM_PATH}" CACHE PATH "Fallback path to search for ROCm installs") 195 else() 196 if (WIN32) 197 # Avoid setting an UNIX path for Windows. 198 # TODO: Eventually migrate to FindHIP once it becomes a part of CMake. 199 set(DEFAULT_ROCM_PATH "" CACHE PATH "Fallback path to search for ROCm installs") 200 else() 201 set(DEFAULT_ROCM_PATH "/opt/rocm" CACHE PATH "Fallback path to search for ROCm installs") 202 endif() 203 endif() 204 message(VERBOSE "MLIR Default ROCM toolkit path: ${DEFAULT_ROCM_PATH}") 205 206 target_compile_definitions(obj.MLIRROCDLTarget 207 PRIVATE 208 __DEFAULT_ROCM_PATH__="${DEFAULT_ROCM_PATH}" 209 ) 210endif() 211 212