Skip to content
Draft
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
2 changes: 1 addition & 1 deletion openmp/runtime/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -273,7 +273,7 @@ set(LIBOMP_INC_DIR ${LIBOMP_SRC_DIR}/include)
set(LIBOMP_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR})

# Enabling Fortran if it is needed
if(${LIBOMP_FORTRAN_MODULES})
if(${LIBOMP_FORTRAN_MODULES} OR NOT "${LIBOMP_FORTRAN_MODULES_COMPILER}" STREQUAL "")
enable_language(Fortran)
endif()
# Enable MASM Compiler if it is needed (Windows only)
Expand Down
42 changes: 42 additions & 0 deletions openmp/runtime/src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,48 @@ elseif(${LIBOMP_FORTRAN_MODULES})
set(BUILD_FORTRAN_MODULES True)
endif()

if(BUILD_FORTRAN_MODULES)
if(NOT LIBOMP_FORTRAN_MODULES AND ${LIBOMP_FORTRAN_MODULES_COMPILER} STREQUAL "")
message(FATAL_ERROR
"Generating OpenMP Fortran modules now requires LIBOMP_FORTRAN_MODULES=ON "
"or LIBOMP_FORTRAN_MODULES_COMPILER to be set so the adaptor implementations "
"can be compiled and linked into libomp.")
endif()
target_sources(omp PRIVATE kmp_ftn_support.f90)
set_source_files_properties(kmp_ftn_support.f90
PROPERTIES COMPILE_FLAGS "${LIBOMP_CONFIGURED_FFLAGS}")
add_dependencies(omp libomp-mod)
# Determine Fortran runtime libraries to link
# For LLVM flang, we need flang_rt.runtime (newer)
set(_LIBOMP_FORTRAN_LIBS "")
if(CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang" OR CMAKE_Fortran_COMPILER_ID MATCHES "Flang")
# Derive paths from Fortran compiler location
get_filename_component(_FC_DIR "${CMAKE_Fortran_COMPILER}" DIRECTORY)
get_filename_component(_FC_PREFIX "${_FC_DIR}" DIRECTORY)

# Try to find the flang runtime in clang resource directory
# Path: <prefix>/lib/clang/<version>/lib/<target>/libflang_rt.runtime.a
file(GLOB _FLANG_RT_CANDIDATES
"${_FC_PREFIX}/lib/clang/*/lib/*/libflang_rt.runtime.a"
)
if(_FLANG_RT_CANDIDATES)
list(GET _FLANG_RT_CANDIDATES 0 _FLANG_RT_LIB)
Copy link
Member

Choose a reason for hiding this comment

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

IIUC this just takes the first libflang_rt.runtime.a. This will likely if compiling more than one flang_rt for another target, or of building libflang_rt.runtime.so instead.

list(APPEND _LIBOMP_FORTRAN_LIBS "${_FLANG_RT_LIB}")
else()
message(WARNING "Could not find LLVM Flang runtime libraries. "
"libomp may fail to link.")
endif()
elseif(CMAKE_Fortran_COMPILER_ID STREQUAL "GNU")
set(_LIBOMP_FORTRAN_LIBS gfortran)
else()
# Fallback to CMake's auto-detected libs
set(_LIBOMP_FORTRAN_LIBS ${CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES})
endif()
if(_LIBOMP_FORTRAN_LIBS)
target_link_libraries(omp ${_LIBOMP_FORTRAN_LIBS})
endif()
endif()

# Move files to exports/ directory if requested
if(${LIBOMP_COPY_EXPORTS})
include(LibompExports)
Expand Down
1 change: 1 addition & 0 deletions openmp/runtime/src/exports_so.txt
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ VERSION {
ompt_libomp_connect; # OMPT libomptarget interface

ompc_*; # omp.h renames some standard functions to ompc_*.
_QMomp_*; # Fortran module procedures (flang name mangling).
kmp_*; # Intel extensions.
kmpc_*; # Intel extensions.
__kmpc_*; # Functions called by compiler-generated code.
Expand Down
14 changes: 14 additions & 0 deletions openmp/runtime/src/include/omp_lib.F90.var
Original file line number Diff line number Diff line change
Expand Up @@ -904,6 +904,18 @@
integer, intent(in) :: resources(*)
end function omp_get_submemspace

function omp_get_uid_from_device(device_num) result(uid)
use omp_lib_kinds
integer (kind=omp_integer_kind), intent(in) :: device_num
character (:), pointer :: uid
end function omp_get_uid_from_device

function omp_get_device_from_uid(uid) result(device_num)
use omp_lib_kinds
character (len=*), intent(in) :: uid
integer (kind=omp_integer_kind) :: device_num
end function omp_get_device_from_uid

! ***
! *** kmp_* entry points
! ***
Expand Down Expand Up @@ -1150,6 +1162,8 @@
public :: omp_realloc
public :: omp_free
public :: omp_in_explicit_task
public :: omp_get_uid_from_device
public :: omp_get_device_from_uid
public :: kmp_set_stacksize
public :: kmp_set_stacksize_s
public :: kmp_set_blocktime
Expand Down
11 changes: 11 additions & 0 deletions openmp/runtime/src/include/omp_lib.h.var
Original file line number Diff line number Diff line change
Expand Up @@ -976,6 +976,17 @@
integer, intent(in) :: resources(*)
end function omp_get_submemspace

function omp_get_uid_from_device(device_num) result(uid)
import
integer (kind=omp_integer_kind), intent(in) :: device_num
character (:), pointer :: uid
end function omp_get_uid_from_device

function omp_get_device_from_uid(uid) result(device_num)
import
character (len=*), intent(in) :: uid
integer (kind=omp_integer_kind) :: device_num
end function omp_get_device_from_uid

! ***
! *** kmp_* entry points
Expand Down
50 changes: 50 additions & 0 deletions openmp/runtime/src/kmp_ftn_cdecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,56 @@ char const __kmp_version_ftncdecl[] =
#define FTN_STDCALL /* no stdcall */
#include "kmp_ftn_os.h"
#include "kmp_ftn_entry.h"

#if KMP_FTN_ENTRIES == KMP_FTN_PLAIN
#define FTN_GET_UID_FROM_DEVICE omp_get_uid_from_device
#define FTN_GET_DEVICE_FROM_UID omp_get_device_from_uid
#endif
#if KMP_FTN_ENTRIES == KMP_FTN_APPEND
#define FTN_GET_UID_FROM_DEVICE omp_get_uid_from_device_
#define FTN_GET_DEVICE_FROM_UID omp_get_device_from_uid_
#endif
#if KMP_FTN_ENTRIES == KMP_FTN_UPPER
#define FTN_GET_UID_FROM_DEVICE OMP_GET_UID_FROM_DEVICE
#define FTN_GET_DEVICE_FROM_UID OMP_GET_DEVICE_FROM_UID
#endif
#if KMP_FTN_ENTRIES == KMP_FTN_UAPPEND
#define FTN_GET_UID_FROM_DEVICE OMP_GET_UID_FROM_DEVICE_
#define FTN_GET_DEVICE_FROM_UID OMP_GET_DEVICE_FROM_UID_
#endif

extern "C" {
const char *FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_UID_FROM_DEVICE)(int device_num)
KMP_WEAK_ATTRIBUTE_EXTERNAL;
const char *FTN_STDCALL
KMP_EXPAND_NAME(FTN_GET_UID_FROM_DEVICE)(int device_num) {
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return nullptr;
#else
const char *(*fptr)(int);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_uid_from_device")))
return (*fptr)(device_num);
// Returns the same string as used by libomptarget
return "HOST";
#endif
}
int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DEVICE_FROM_UID)(const char *device_uid)
KMP_WEAK_ATTRIBUTE_EXTERNAL;
int FTN_STDCALL
KMP_EXPAND_NAME(FTN_GET_DEVICE_FROM_UID)(const char *device_uid) {
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return omp_invalid_device;
#else
int (*fptr)(const char *);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_device_from_uid")))
return (*fptr)(device_uid);
return KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)();
#endif
}

KMP_VERSION_SYMBOL(FTN_GET_UID_FROM_DEVICE, 60, "OMP_6.0");
KMP_VERSION_SYMBOL(FTN_GET_DEVICE_FROM_UID, 60, "OMP_6.0");
} // extern "C"
#else
"no";
#endif /* KMP_FTN_ENTRIES */
31 changes: 0 additions & 31 deletions openmp/runtime/src/kmp_ftn_entry.h
Original file line number Diff line number Diff line change
Expand Up @@ -1550,33 +1550,6 @@ int FTN_STDCALL FTN_GET_DEVICE_NUM(void) KMP_WEAK_ATTRIBUTE_EXTERNAL;
int FTN_STDCALL FTN_GET_DEVICE_NUM(void) {
return KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)();
}
const char *FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_UID_FROM_DEVICE)(int device_num)
KMP_WEAK_ATTRIBUTE_EXTERNAL;
const char *FTN_STDCALL
KMP_EXPAND_NAME(FTN_GET_UID_FROM_DEVICE)(int device_num) {
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return nullptr;
#else
const char *(*fptr)(int);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_uid_from_device")))
return (*fptr)(device_num);
// Returns the same string as used by libomptarget
return "HOST";
#endif
}
int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_DEVICE_FROM_UID)(const char *device_uid)
KMP_WEAK_ATTRIBUTE_EXTERNAL;
int FTN_STDCALL
KMP_EXPAND_NAME(FTN_GET_DEVICE_FROM_UID)(const char *device_uid) {
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return omp_invalid_device;
#else
int (*fptr)(const char *);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_device_from_uid")))
return (*fptr)(device_uid);
return KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)();
#endif
}

// Compiler will ensure that this is only called from host in sequential region
int FTN_STDCALL KMP_EXPAND_NAME(FTN_PAUSE_RESOURCE)(kmp_pause_status_t kind,
Expand Down Expand Up @@ -1933,10 +1906,6 @@ KMP_VERSION_SYMBOL(FTN_SET_AFFINITY_FORMAT, 50, "OMP_5.0");
// KMP_VERSION_SYMBOL(FTN_GET_SUPPORTED_ACTIVE_LEVELS, 50, "OMP_5.0");
// KMP_VERSION_SYMBOL(FTN_FULFILL_EVENT, 50, "OMP_5.0");

// OMP_6.0 versioned symbols
KMP_VERSION_SYMBOL(FTN_GET_UID_FROM_DEVICE, 60, "OMP_6.0");
KMP_VERSION_SYMBOL(FTN_GET_DEVICE_FROM_UID, 60, "OMP_6.0");

#endif // KMP_USE_VERSION_SYMBOLS

#ifdef __cplusplus
Expand Down
50 changes: 50 additions & 0 deletions openmp/runtime/src/kmp_ftn_extra.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,56 @@ char const __kmp_version_ftnextra[] =
#define FTN_STDCALL /* nothing to do */
#include "kmp_ftn_os.h"
#include "kmp_ftn_entry.h"

#if KMP_FTN_ENTRIES == KMP_FTN_PLAIN
#define FTN_KMP_GET_UID_FROM_DEVICE __kmp_get_uid_from_device
#define FTN_KMP_GET_DEVICE_FROM_UID __kmp_get_device_from_uid
#endif
#if KMP_FTN_ENTRIES == KMP_FTN_APPEND
#define FTN_KMP_GET_UID_FROM_DEVICE __kmp_get_uid_from_device_
#define FTN_KMP_GET_DEVICE_FROM_UID __kmp_get_device_from_uid_
#endif
#if KMP_FTN_ENTRIES == KMP_FTN_UPPER
#define FTN_KMP_GET_UID_FROM_DEVICE __KMP_GET_UID_FROM_DEVICE
#define FTN_KMP_GET_DEVICE_FROM_UID __KMP_GET_DEVICE_FROM_UID
#endif
#if KMP_FTN_ENTRIES == KMP_FTN_UAPPEND
#define FTN_KMP_GET_UID_FROM_DEVICE __KMP_GET_UID_FROM_DEVICE_
#define FTN_KMP_GET_DEVICE_FROM_UID __KMP_GET_DEVICE_FROM_UID_
#endif

extern "C" {
const char *FTN_STDCALL KMP_EXPAND_NAME(FTN_KMP_GET_UID_FROM_DEVICE)(
int device_num) KMP_WEAK_ATTRIBUTE_EXTERNAL;
const char *FTN_STDCALL
KMP_EXPAND_NAME(FTN_KMP_GET_UID_FROM_DEVICE)(int device_num) {
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return nullptr;
#else
const char *(*fptr)(int);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_uid_from_device")))
return (*fptr)(device_num);
// Returns the same string as used by libomptarget
return "HOST";
#endif
}
int FTN_STDCALL KMP_EXPAND_NAME(FTN_KMP_GET_DEVICE_FROM_UID)(
const char *device_uid) KMP_WEAK_ATTRIBUTE_EXTERNAL;
int FTN_STDCALL
KMP_EXPAND_NAME(FTN_KMP_GET_DEVICE_FROM_UID)(const char *device_uid) {
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
return omp_invalid_device;
#else
int (*fptr)(const char *);
if ((*(void **)(&fptr) = KMP_DLSYM_NEXT("omp_get_device_from_uid")))
return (*fptr)(device_uid);
return KMP_EXPAND_NAME(FTN_GET_INITIAL_DEVICE)();
#endif
}

KMP_VERSION_SYMBOL(FTN_KMP_GET_UID_FROM_DEVICE, 60, "OMP_6.0");
KMP_VERSION_SYMBOL(FTN_KMP_GET_DEVICE_FROM_UID, 60, "OMP_6.0");
} // extern "C"
#else
"no";
#endif /* KMP_FTN_ENTRIES */
Loading
Loading