Skip to content

[Libomptarget] Consolidate CPU offloading into 'host' directory #86014

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 20, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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")
Comment on lines +82 to +86
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is incorrect, because it is specifying a big-endian triple (powerpc64-ibm-linux-gnu) when the host is little-endian (ppc64le). The ppc64le and ppc64 $CMAKE_SYSTEM_PROCESSOR values need to be handled separately.

cc @tuliom

Copy link
Contributor

@tuliom tuliom Apr 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tstellar Agreed. It's worth mentioning that using powerpc64le in triples is more frequent than ppc64le.
This is the first time I see -ibm being used for a ppc64*-linux system.
Is the usage of -ibm really necessary? And what it means?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I made #88773. Using the vendor field doesn't really do anything for these triples. It's the same as x86_64-pc-linux-gnu which doesn't make a difference except for runtime directory stuff.

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)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There's a missing "PRIVATE" on this line, which caused the build to break on SystemZ. Fixed in cb07194.

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.