Skip to content

Commit

Permalink
[Libomptarget] Consolidate CPU offloading into 'host' directory (llvm…
Browse files Browse the repository at this point in the history
…#86014)

Summary:
All of these CPU targets use the same underlying implementation. We
should consolidate them into a single target to make it easier to update
this to a static library based approach. I have decided to call this the
'host' target so it can be given a single name. We still only build
these if the system processor matches and we are on Linux.
  • Loading branch information
jhuber6 authored Mar 20, 2024
1 parent 61b24c6 commit a7d5f73
Show file tree
Hide file tree
Showing 10 changed files with 118 additions and 186 deletions.
99 changes: 1 addition & 98 deletions openmp/libomptarget/plugins-nextgen/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,106 +11,9 @@
##===----------------------------------------------------------------------===##

add_subdirectory(common)

# void build_generic_elf64(string tmachine, string tmachine_name, string tmachine_libname,
# string tmachine_llvm, string tmachine_triple, string elf_machine_id);
# - build a plugin for an ELF based generic 64-bit target based on libffi.
# - tmachine: name of the machine processor as used in the cmake build system.
# - tmachine_name: name of the machine to be printed with the debug messages.
# - tmachine_libname: machine name to be appended to the plugin library name.
# - tmachine_llvm: LLVM triple for the processor
# - tmachine_triple: GNU target triple
macro(build_generic_elf64 tmachine tmachine_name tmachine_libname tmachine_llvm tmachine_triple elf_machine_id)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "${tmachine}$")
# Define macro to be used as prefix of the runtime messages for this target.
add_definitions("-DTARGET_NAME=${tmachine_name}")

# Define debug prefix. TODO: This should be automatized in the Debug.h but
# it requires changing the original plugins.
add_definitions(-DDEBUG_PREFIX="TARGET ${tmachine_name} RTL")

# Define the macro with the ELF e_machine for this target.
add_definitions("-DTARGET_ELF_ID=${elf_machine_id}")

# Define target triple
add_definitions("-DLIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE=${tmachine_llvm}")

add_llvm_library("omptarget.rtl.${tmachine_libname}"
SHARED

${CMAKE_CURRENT_SOURCE_DIR}/../generic-elf-64bit/src/rtl.cpp

ADDITIONAL_HEADER_DIRS
${LIBOMPTARGET_INCLUDE_DIR}

LINK_LIBS
PRIVATE
PluginCommon
${OPENMP_PTHREAD_LIB}

NO_INSTALL_RPATH
BUILDTREE_ONLY
)

if(LIBOMPTARGET_DEP_LIBFFI_FOUND)
libomptarget_say("Building ${tmachine_libname} plugin linked with libffi")
if(FFI_STATIC_LIBRARIES)
target_link_libraries(
"omptarget.rtl.${tmachine_libname}" PRIVATE FFI::ffi_static)
else()
target_link_libraries(
"omptarget.rtl.${tmachine_libname}" PRIVATE FFI::ffi)
endif()
else()
libomptarget_say("Building ${tmachine_libname} plugin for dlopened libffi")
target_sources("omptarget.rtl.${tmachine_libname}" PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../generic-elf-64bit/dynamic_ffi/ffi.cpp)
target_include_directories("omptarget.rtl.${tmachine_libname}" PRIVATE
${CMAKE_CURRENT_SOURCE_DIR}/../generic-elf-64bit/dynamic_ffi)
endif()

if(OMPT_TARGET_DEFAULT AND LIBOMPTARGET_OMPT_SUPPORT)
target_link_libraries("omptarget.rtl.${tmachine_libname}" PRIVATE OMPT)
endif()

if(LIBOMP_HAVE_VERSION_SCRIPT_FLAG)
target_link_libraries("omptarget.rtl.${tmachine_libname}" PRIVATE
"-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/../exports")
endif()

# Install plugin under the lib destination folder.
install(TARGETS "omptarget.rtl.${tmachine_libname}"
LIBRARY DESTINATION "${OPENMP_INSTALL_LIBDIR}")
set_target_properties("omptarget.rtl.${tmachine_libname}" PROPERTIES
INSTALL_RPATH "$ORIGIN" BUILD_RPATH "$ORIGIN:${CMAKE_CURRENT_BINARY_DIR}/.."
POSITION_INDEPENDENT_CODE ON
CXX_VISIBILITY_PRESET protected)

target_include_directories("omptarget.rtl.${tmachine_libname}" PRIVATE
${LIBOMPTARGET_INCLUDE_DIR})

if(LIBOMPTARGET_DEP_LIBFFI_FOUND)
list(APPEND LIBOMPTARGET_TESTED_PLUGINS "omptarget.rtl.${tmachine_libname}")
set(LIBOMPTARGET_TESTED_PLUGINS
"${LIBOMPTARGET_TESTED_PLUGINS}" PARENT_SCOPE)
set(LIBOMPTARGET_SYSTEM_TARGETS
"${LIBOMPTARGET_SYSTEM_TARGETS} ${tmachine_triple}
${tmachine_triple}-LTO" PARENT_SCOPE)
else()
libomptarget_say("Not generating ${tmachine_name} tests. LibFFI not found.")
endif()
else()
libomptarget_say("Not building ${tmachine_name} NextGen offloading plugin: machine not found in the system.")
endif()
endmacro()

add_subdirectory(aarch64)
add_subdirectory(amdgpu)
add_subdirectory(cuda)
add_subdirectory(ppc64)
add_subdirectory(ppc64le)
add_subdirectory(x86_64)
add_subdirectory(s390x)
add_subdirectory(host)

# Make sure the parent scope can see the plugins that will be created.
set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE)
Expand Down
17 changes: 0 additions & 17 deletions openmp/libomptarget/plugins-nextgen/aarch64/CMakeLists.txt

This file was deleted.

109 changes: 109 additions & 0 deletions openmp/libomptarget/plugins-nextgen/host/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
if(NOT CMAKE_SYSTEM_NAME MATCHES "Linux")
return()
endif()

# build_generic_elf64("s390x" "S390X" "s390x" "systemz" "s390x-ibm-linux-gnu" "22")
# build_generic_elf64("aarch64" "aarch64" "aarch64" "aarch64" "aarch64-unknown-linux-gnu" "183")
# build_generic_elf64("ppc64" "PPC64" "ppc64" "ppc64" "powerpc64-ibm-linux-gnu" "21")
# build_generic_elf64("x86_64" "x86_64" "x86_64" "x86_64" "x86_64-pc-linux-gnu" "62")
# build_generic_elf64("ppc64le" "PPC64le" "ppc64" "ppc64le" "powerpc64le-ibm-linux-gnu" "21")
set(supported_targets x86_64 aarch64 ppc64 ppc64le s390x)
if(NOT ${CMAKE_SYSTEM_PROCESSOR} IN_LIST supported_targets)
libomptarget_say("Not building ${machine} NextGen offloading plugin")
return()
endif()

set(machine ${CMAKE_SYSTEM_PROCESSOR})
if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le$")
set(machine ppc64)
endif()

add_llvm_library(omptarget.rtl.${machine} SHARED
src/rtl.cpp
ADDITIONAL_HEADER_DIRS
${LIBOMPTARGET_INCLUDE_DIR}
LINK_LIBS PRIVATE
PluginCommon
${OPENMP_PTHREAD_LIB}
NO_INSTALL_RPATH
BUILDTREE_ONLY
)

if(LIBOMPTARGET_DEP_LIBFFI_FOUND)
libomptarget_say("Building ${machine} plugin linked with libffi")
if(FFI_STATIC_LIBRARIES)
target_link_libraries(omptarget.rtl.${machine} PRIVATE FFI::ffi_static)
else()
target_link_libraries(omptarget.rtl.${machine} PRIVATE FFI::ffi)
endif()
else()
libomptarget_say("Building ${machine} plugin for dlopened libffi")
target_sources(omptarget.rtl.${machine} PRIVATE dynamic_ffi/ffi.cpp)
target_include_directories(omptarget.rtl.${machine} PRIVATE dynamic_ffi)
endif()

if(OMPT_TARGET_DEFAULT AND LIBOMPTARGET_OMPT_SUPPORT)
target_link_libraries(omptarget.rtl.${machine} PRIVATE OMPT)
endif()

if(LIBOMP_HAVE_VERSION_SCRIPT_FLAG)
target_link_libraries(omptarget.rtl.${machine} PRIVATE
"-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/../exports")
endif()

# Install plugin under the lib destination folder.
install(TARGETS omptarget.rtl.${machine}
LIBRARY DESTINATION "${OPENMP_INSTALL_LIBDIR}")
set_target_properties(omptarget.rtl.${machine} PROPERTIES
INSTALL_RPATH "$ORIGIN" BUILD_RPATH "$ORIGIN:${CMAKE_CURRENT_BINARY_DIR}/.."
POSITION_INDEPENDENT_CODE ON
CXX_VISIBILITY_PRESET protected)

target_include_directories(omptarget.rtl.${machine} PRIVATE
${LIBOMPTARGET_INCLUDE_DIR})

if(LIBOMPTARGET_DEP_LIBFFI_FOUND)
list(APPEND LIBOMPTARGET_TESTED_PLUGINS omptarget.rtl.${machine})
set(LIBOMPTARGET_TESTED_PLUGINS
"${LIBOMPTARGET_TESTED_PLUGINS}" PARENT_SCOPE)
else()
libomptarget_say("Not generating ${tmachine_name} tests. LibFFI not found.")
endif()

# Define macro to be used as prefix of the runtime messages for this target.
target_compile_definitions(omptarget.rtl.${machine} PRIVATE TARGET_NAME=${machine})
# TODO: This should be automatized in Debug.h.
target_compile_definitions(omptarget.rtl.${machine} PRIVATE
DEBUG_PREFIX="TARGET ${machine} RTL")

# Define the target specific triples and ELF machine values.
if(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64le$" OR
CMAKE_SYSTEM_PROCESSOR MATCHES "ppc64$")
target_compile_definitions(omptarget.rtl.${machine} PRIVATE TARGET_ELF_ID=EM_PPC64)
target_compile_definitions(omptarget.rtl.${machine} PRIVATE
LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE="powerpc64-ibm-linux-gnu")
list(APPEND LIBOMPTARGET_SYSTEM_TARGETS
"powerpc64-ibm-linux-gnu" "powerpc64-ibm-linux-gnu-LTO")
set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64$")
target_compile_definitions(omptarget.rtl.${machine} PRIVATE TARGET_ELF_ID=EM_X86_64)
target_compile_definitions(omptarget.rtl.${machine} PRIVATE
LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE="x86_64-pc-linux-gnu")
list(APPEND LIBOMPTARGET_SYSTEM_TARGETS
"x86_64-pc-linux-gnu" "x86_64-pc-linux-gnu-LTO")
set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64$")
target_compile_definitions(omptarget.rtl.${machine} PRIVATE TARGET_ELF_ID=EM_AARCH64)
target_compile_definitions(omptarget.rtl.${machine} PRIVATE
LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE="aarch64-unknown-linux-gnu")
list(APPEND LIBOMPTARGET_SYSTEM_TARGETS
"aarch64-unknown-linux-gnu" "aarch64-unknown-linux-gnu-LTO")
set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "s390x$")
target_compile_definitions(omptarget.rtl.${machine} TARGET_ELF_ID=EM_S390)
target_compile_definitions(omptarget.rtl.${machine} PRIVATE
LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE="s390x-ibm-linux-gnu")
list(APPEND LIBOMPTARGET_SYSTEM_TARGETS
"s390x-ibm-linux-gnu" "s390x-ibm-linux-gnu-LTO")
set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE)
endif()
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,12 @@

// The ELF ID should be defined at compile-time by the build system.
#ifndef TARGET_ELF_ID
#define TARGET_ELF_ID ELF::EM_NONE
#define TARGET_ELF_ID EM_NONE
#endif

// The target triple should be defined at compile-time by the build system.
#ifndef LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE
#define LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE ""
#endif

namespace llvm {
Expand Down Expand Up @@ -395,7 +400,7 @@ struct GenELF64PluginTy final : public GenericPluginTy {
Error deinitImpl() override { return Plugin::success(); }

/// Get the ELF code to recognize the compatible binary images.
uint16_t getMagicElfBits() const override { return TARGET_ELF_ID; }
uint16_t getMagicElfBits() const override { return ELF::TARGET_ELF_ID; }

/// This plugin does not support exchanging data between two devices.
bool isDataExchangable(int32_t SrcDeviceId, int32_t DstDeviceId) override {
Expand All @@ -406,7 +411,7 @@ struct GenELF64PluginTy final : public GenericPluginTy {
Expected<bool> isELFCompatible(StringRef) const override { return true; }

Triple::ArchType getTripleArch() const override {
return Triple::LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE;
return llvm::Triple(LIBOMPTARGET_NEXTGEN_GENERIC_PLUGIN_TRIPLE).getArch();
}
};

Expand Down
17 changes: 0 additions & 17 deletions openmp/libomptarget/plugins-nextgen/ppc64/CMakeLists.txt

This file was deleted.

17 changes: 0 additions & 17 deletions openmp/libomptarget/plugins-nextgen/ppc64le/CMakeLists.txt

This file was deleted.

17 changes: 0 additions & 17 deletions openmp/libomptarget/plugins-nextgen/s390x/CMakeLists.txt

This file was deleted.

17 changes: 0 additions & 17 deletions openmp/libomptarget/plugins-nextgen/x86_64/CMakeLists.txt

This file was deleted.

0 comments on commit a7d5f73

Please sign in to comment.