Skip to content

Commit ef4f22e

Browse files
[Offload] Add MPI Plugin
Co-authored-by: Guilherme Valarini <[email protected]>
1 parent 7c1b289 commit ef4f22e

27 files changed

+2422
-2
lines changed

offload/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ if (NOT LIBOMPTARGET_LLVM_INCLUDE_DIRS)
151151
message(FATAL_ERROR "Missing definition for LIBOMPTARGET_LLVM_INCLUDE_DIRS")
152152
endif()
153153

154-
set(LIBOMPTARGET_ALL_PLUGIN_TARGETS amdgpu cuda host)
154+
set(LIBOMPTARGET_ALL_PLUGIN_TARGETS amdgpu cuda mpi host)
155155
set(LIBOMPTARGET_PLUGINS_TO_BUILD "all" CACHE STRING
156156
"Semicolon-separated list of plugins to use: cuda, amdgpu, host or \"all\".")
157157

@@ -182,6 +182,7 @@ set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} powerpc64-ibm-linux-g
182182
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} powerpc64-ibm-linux-gnu-LTO")
183183
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} x86_64-pc-linux-gnu")
184184
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} x86_64-pc-linux-gnu-LTO")
185+
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} x86_64-pc-linux-gnu-mpi")
185186
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda")
186187
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda-LTO")
187188
set (LIBOMPTARGET_ALL_TARGETS "${LIBOMPTARGET_ALL_TARGETS} nvptx64-nvidia-cuda-JIT-LTO")
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
##===----------------------------------------------------------------------===##
2+
#
3+
# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
# See https://llvm.org/LICENSE.txt for license information.
5+
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
#
7+
##===----------------------------------------------------------------------===##
8+
#
9+
# Build a plugin for a MPI machine if available.
10+
#
11+
##===----------------------------------------------------------------------===##
12+
13+
# Looking for MPI...
14+
find_package(MPI QUIET)
15+
16+
set(LIBOMPTARGET_DEP_MPI_FOUND ${MPI_CXX_FOUND})
17+
set(LIBOMPTARGET_DEP_MPI_LIBRARIES ${MPI_CXX_LIBRARIES})
18+
set(LIBOMPTARGET_DEP_MPI_INCLUDE_DIRS ${MPI_CXX_INCLUDE_DIRS})
19+
set(LIBOMPTARGET_DEP_MPI_COMPILE_FLAGS ${MPI_CXX_COMPILE_FLAGS})
20+
set(LIBOMPTARGET_DEP_MPI_LINK_FLAGS ${MPI_CXX_LINK_FLAGS})
21+
22+
mark_as_advanced(
23+
LIBOMPTARGET_DEP_MPI_FOUND
24+
LIBOMPTARGET_DEP_MPI_LIBRARIES
25+
LIBOMPTARGET_DEP_MPI_INCLUDE_DIRS
26+
LIBOMPTARGET_DEP_MPI_COMPILE_FLAGS
27+
LIBOMPTARGET_DEP_MPI_LINK_FLAGS)
28+
29+
if(NOT(CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(ppc64le)$" AND CMAKE_SYSTEM_NAME MATCHES "Linux"))
30+
libomptarget_say("Not building MPI offloading plugin: only support MPI in Linux x86_64 or ppc64le hosts.")
31+
return()
32+
elseif(NOT LIBOMPTARGET_DEP_LIBFFI_FOUND)
33+
libomptarget_say("Not building MPI offloading plugin: libffi dependency not found.")
34+
return()
35+
elseif(NOT LIBOMPTARGET_DEP_MPI_FOUND)
36+
libomptarget_say("Not building MPI offloading plugin: MPI not found in system.")
37+
return()
38+
endif()
39+
40+
libomptarget_say("Building MPI NextGen offloading plugin.")
41+
42+
# Create the library and add the default arguments.
43+
add_target_library(omptarget.rtl.mpi MPI)
44+
45+
target_sources(omptarget.rtl.mpi PRIVATE
46+
src/EventSystem.cpp
47+
src/rtl.cpp
48+
)
49+
50+
if(FFI_STATIC_LIBRARIES)
51+
target_link_libraries(omptarget.rtl.mpi PRIVATE FFI::ffi_static)
52+
else()
53+
target_link_libraries(omptarget.rtl.mpi PRIVATE FFI::ffi)
54+
endif()
55+
56+
target_link_libraries(omptarget.rtl.mpi PRIVATE
57+
${LIBOMPTARGET_DEP_MPI_LIBRARIES}
58+
${LIBOMPTARGET_DEP_MPI_LINK_FLAGS}
59+
)
60+
61+
# Add include directories
62+
target_include_directories(omptarget.rtl.mpi PRIVATE
63+
${LIBOMPTARGET_INCLUDE_DIR})
64+
65+
# Install plugin under the lib destination folder.
66+
install(TARGETS omptarget.rtl.mpi
67+
LIBRARY DESTINATION "${OFFLOAD_INSTALL_LIBDIR}")
68+
set_target_properties(omptarget.rtl.mpi PROPERTIES
69+
INSTALL_RPATH "$ORIGIN" BUILD_RPATH "$ORIGIN:${CMAKE_CURRENT_BINARY_DIR}/..")
70+
71+
if(LIBOMPTARGET_DEP_MPI_COMPILE_FLAGS)
72+
set_target_properties(omptarget.rtl.mpi PROPERTIES
73+
COMPILE_FLAGS "${LIBOMPTARGET_DEP_MPI_COMPILE_FLAGS}")
74+
endif()
75+
76+
# Set C++20 as the target standard for this plugin.
77+
set_target_properties(omptarget.rtl.mpi
78+
PROPERTIES
79+
CXX_STANDARD 20
80+
CXX_STANDARD_REQUIRED ON)
81+
82+
# Configure testing for the MPI plugin.
83+
list(APPEND LIBOMPTARGET_TESTED_PLUGINS "omptarget.rtl.mpi")
84+
# Report to the parent scope that we are building a plugin for MPI.
85+
set(LIBOMPTARGET_TESTED_PLUGINS "${LIBOMPTARGET_TESTED_PLUGINS}" PARENT_SCOPE)
86+
87+
# Define the target specific triples and ELF machine values.
88+
set(LIBOMPTARGET_SYSTEM_TARGETS
89+
"${LIBOMPTARGET_SYSTEM_TARGETS} x86_64-pc-linux-gnu-mpi" PARENT_SCOPE)
90+
91+
# MPI Device Binary
92+
llvm_add_tool(OPENMP llvm-offload-mpi-device src/EventSystem.cpp src/MPIDeviceMain.cpp)
93+
94+
llvm_update_compile_flags(llvm-offload-mpi-device)
95+
96+
target_link_libraries(llvm-offload-mpi-device PRIVATE
97+
${LIBOMPTARGET_DEP_MPI_LIBRARIES}
98+
${LIBOMPTARGET_DEP_MPI_LINK_FLAGS}
99+
LLVMSupport
100+
omp
101+
)
102+
103+
if(FFI_STATIC_LIBRARIES)
104+
target_link_libraries(llvm-offload-mpi-device PRIVATE FFI::ffi_static)
105+
else()
106+
target_link_libraries(llvm-offload-mpi-device PRIVATE FFI::ffi)
107+
endif()
108+
109+
target_include_directories(llvm-offload-mpi-device PRIVATE
110+
${LIBOMPTARGET_INCLUDE_DIR}
111+
${LIBOMPTARGET_DEP_MPI_INCLUDE_DIRS}
112+
)
113+
114+
if(LIBOMPTARGET_DEP_MPI_COMPILE_FLAGS)
115+
set_target_properties(llvm-offload-mpi-device PROPERTIES
116+
COMPILE_FLAGS "${LIBOMPTARGET_DEP_MPI_COMPILE_FLAGS}"
117+
)
118+
endif()
119+
120+
set_target_properties(llvm-offload-mpi-device
121+
PROPERTIES
122+
CXX_STANDARD 20
123+
CXX_STANDARD_REQUIRED ON
124+
)
125+
126+
target_compile_definitions(llvm-offload-mpi-device PRIVATE
127+
DEBUG_PREFIX="OFFLOAD MPI DEVICE")

0 commit comments

Comments
 (0)