From 2edce427a8b17d1d2192c1ee4a2227b6eb2971a0 Mon Sep 17 00:00:00 2001 From: Xing Xue <57193974+xingxue-ibm@users.noreply.github.com> Date: Mon, 8 Jan 2024 08:33:00 -0500 Subject: [PATCH] [openmp][AIX]Initial changes for porting to AIX (#76841) This PR contains initial changes for building and testing libomp on AIX. More changes will follow. - `KMP_OS_AIX` is defined for the AIX platform - `KMP_ARCH_PPC` is defined for 32-bit PPC - `KMP_ARCH_PPC_XCOFF` and `KMP_ARCH_PPC64_XCOFF` are for 32- and 64-bit XCOFF object formats respectively - Assembly file `z_AIX_asm.S` is used for AIX specific assembly code and will be added in a separate PR - The target library is disabled because AIX does not have the device support - OMPT is temporarily disabled --- openmp/CMakeLists.txt | 3 +- openmp/cmake/OpenMPTesting.cmake | 3 ++ openmp/runtime/CMakeLists.txt | 21 +++++++++--- .../runtime/cmake/LibompGetArchitecture.cmake | 2 ++ openmp/runtime/cmake/config-ix.cmake | 3 +- openmp/runtime/src/CMakeLists.txt | 6 +++- openmp/runtime/src/kmp.h | 7 ++++ openmp/runtime/src/kmp_config.h.cmake | 2 +- openmp/runtime/src/kmp_ftn_entry.h | 2 +- openmp/runtime/src/kmp_global.cpp | 2 +- openmp/runtime/src/kmp_gsupport.cpp | 3 +- openmp/runtime/src/kmp_os.h | 9 +++--- openmp/runtime/src/kmp_platform.h | 32 +++++++++++++++---- openmp/runtime/src/kmp_runtime.cpp | 8 ++--- openmp/runtime/src/kmp_settings.cpp | 4 +-- openmp/runtime/src/kmp_wrapper_getpid.h | 5 +++ openmp/runtime/src/z_Linux_util.cpp | 21 +++++++++--- openmp/runtime/test/lit.cfg | 12 +++++++ 18 files changed, 112 insertions(+), 33 deletions(-) diff --git a/openmp/CMakeLists.txt b/openmp/CMakeLists.txt index 307c8dbbc0c3b..c1c79f8e0ca93 100644 --- a/openmp/CMakeLists.txt +++ b/openmp/CMakeLists.txt @@ -94,7 +94,8 @@ set(ENABLE_LIBOMPTARGET ON) # Since the device plugins are only supported on Linux anyway, # there is no point in trying to compile libomptarget on other OSes. # 32-bit systems are not supported either. -if (APPLE OR WIN32 OR WASM OR NOT "cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES OR NOT CMAKE_SIZEOF_VOID_P EQUAL 8) +if (APPLE OR WIN32 OR WASM OR NOT "cxx_std_17" IN_LIST CMAKE_CXX_COMPILE_FEATURES + OR NOT CMAKE_SIZEOF_VOID_P EQUAL 8 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX") set(ENABLE_LIBOMPTARGET OFF) endif() diff --git a/openmp/cmake/OpenMPTesting.cmake b/openmp/cmake/OpenMPTesting.cmake index a771efdf9e69a..df41956dadd4f 100644 --- a/openmp/cmake/OpenMPTesting.cmake +++ b/openmp/cmake/OpenMPTesting.cmake @@ -55,6 +55,9 @@ if (${OPENMP_STANDALONE_BUILD}) if (MSVC OR XCODE) set(DEFAULT_LIT_ARGS "${DEFAULT_LIT_ARGS} --no-progress-bar") endif() + if (${CMAKE_SYSTEM_NAME} MATCHES "AIX") + set(DEFAULT_LIT_ARGS "${DEFAULT_LIT_ARGS} --time-tests --timeout=1800") + endif() set(OPENMP_LIT_ARGS "${DEFAULT_LIT_ARGS}" CACHE STRING "Options for lit.") separate_arguments(OPENMP_LIT_ARGS) else() diff --git a/openmp/runtime/CMakeLists.txt b/openmp/runtime/CMakeLists.txt index 80064170db193..041b60efac5ce 100644 --- a/openmp/runtime/CMakeLists.txt +++ b/openmp/runtime/CMakeLists.txt @@ -30,7 +30,7 @@ if(${OPENMP_STANDALONE_BUILD}) # If adding a new architecture, take a look at cmake/LibompGetArchitecture.cmake libomp_get_architecture(LIBOMP_DETECTED_ARCH) set(LIBOMP_ARCH ${LIBOMP_DETECTED_ARCH} CACHE STRING - "The architecture to build for (x86_64/i386/arm/ppc64/ppc64le/aarch64/mic/mips/mips64/riscv64/loongarch64/ve/s390x/wasm32).") + "The architecture to build for (x86_64/i386/arm/ppc/ppc64/ppc64le/aarch64/mic/mips/mips64/riscv64/loongarch64/ve/s390x/wasm32).") # Should assertions be enabled? They are on by default. set(LIBOMP_ENABLE_ASSERTIONS TRUE CACHE BOOL "enable assertions?") @@ -51,8 +51,10 @@ else() # Part of LLVM build set(LIBOMP_ARCH x86_64) elseif(LIBOMP_NATIVE_ARCH MATCHES "powerpc64le") set(LIBOMP_ARCH ppc64le) - elseif(LIBOMP_NATIVE_ARCH MATCHES "powerpc") + elseif(LIBOMP_NATIVE_ARCH MATCHES "powerpc64") set(LIBOMP_ARCH ppc64) + elseif(LIBOMP_NATIVE_ARCH MATCHES "powerpc") + set(LIBOMP_ARCH ppc) elseif(LIBOMP_NATIVE_ARCH MATCHES "aarch64") set(LIBOMP_ARCH aarch64) elseif(LIBOMP_NATIVE_ARCH MATCHES "arm64") @@ -89,7 +91,7 @@ if(LIBOMP_ARCH STREQUAL "aarch64") endif() endif() -libomp_check_variable(LIBOMP_ARCH 32e x86_64 32 i386 arm ppc64 ppc64le aarch64 aarch64_a64fx mic mips mips64 riscv64 loongarch64 ve s390x wasm32) +libomp_check_variable(LIBOMP_ARCH 32e x86_64 32 i386 arm ppc ppc64 ppc64le aarch64 aarch64_a64fx mic mips mips64 riscv64 loongarch64 ve s390x wasm32) set(LIBOMP_LIB_TYPE normal CACHE STRING "Performance,Profiling,Stubs library (normal/profile/stubs)") @@ -128,8 +130,14 @@ set(LIBOMP_ASMFLAGS "" CACHE STRING "Appended user specified assembler flags.") set(LIBOMP_LDFLAGS "" CACHE STRING "Appended user specified linker flags.") -set(LIBOMP_LIBFLAGS "" CACHE STRING - "Appended user specified linked libs flags. (e.g., -lm)") +if("${LIBOMP_ARCH}" STREQUAL "ppc" AND ${CMAKE_SYSTEM_NAME} MATCHES "AIX") + # PPC (32-bit) on AIX needs libatomic for __atomic_load_8, etc. + set(LIBOMP_LIBFLAGS "-latomic" CACHE STRING + "Appended user specified linked libs flags. (e.g., -lm)") +else() + set(LIBOMP_LIBFLAGS "" CACHE STRING + "Appended user specified linked libs flags. (e.g., -lm)") +endif() set(LIBOMP_FFLAGS "" CACHE STRING "Appended user specified Fortran compiler flags. These are only used if LIBOMP_FORTRAN_MODULES==TRUE.") @@ -171,12 +179,15 @@ set(LOONGARCH64 FALSE) set(VE FALSE) set(S390X FALSE) set(WASM FALSE) +set(PPC FALSE) if("${LIBOMP_ARCH}" STREQUAL "i386" OR "${LIBOMP_ARCH}" STREQUAL "32") # IA-32 architecture set(IA32 TRUE) elseif("${LIBOMP_ARCH}" STREQUAL "x86_64" OR "${LIBOMP_ARCH}" STREQUAL "32e") # Intel(R) 64 architecture set(INTEL64 TRUE) elseif("${LIBOMP_ARCH}" STREQUAL "arm") # ARM architecture set(ARM TRUE) +elseif("${LIBOMP_ARCH}" STREQUAL "ppc") # PPC32 architecture + set(PPC TRUE) elseif("${LIBOMP_ARCH}" STREQUAL "ppc64") # PPC64BE architecture set(PPC64BE TRUE) set(PPC64 TRUE) diff --git a/openmp/runtime/cmake/LibompGetArchitecture.cmake b/openmp/runtime/cmake/LibompGetArchitecture.cmake index cd85267020bd6..d7f81870f9ef4 100644 --- a/openmp/runtime/cmake/LibompGetArchitecture.cmake +++ b/openmp/runtime/cmake/LibompGetArchitecture.cmake @@ -41,6 +41,8 @@ function(libomp_get_architecture return_arch) #error ARCHITECTURE=ppc64le #elif defined(__powerpc64__) #error ARCHITECTURE=ppc64 + #elif defined(__powerpc__) && !defined(__powerpc64__) + #error ARCHITECTURE=ppc #elif defined(__mips__) && defined(__mips64) #error ARCHITECTURE=mips64 #elif defined(__mips__) && !defined(__mips64) diff --git a/openmp/runtime/cmake/config-ix.cmake b/openmp/runtime/cmake/config-ix.cmake index 90b9af4cd3829..76f471a443806 100644 --- a/openmp/runtime/cmake/config-ix.cmake +++ b/openmp/runtime/cmake/config-ix.cmake @@ -333,7 +333,8 @@ else() (LIBOMP_ARCH STREQUAL loongarch64) OR (LIBOMP_ARCH STREQUAL s390x)) AND # OS supported? - ((WIN32 AND LIBOMP_HAVE_PSAPI) OR APPLE OR (NOT WIN32 AND LIBOMP_HAVE_WEAK_ATTRIBUTE))) + ((WIN32 AND LIBOMP_HAVE_PSAPI) OR APPLE OR + (NOT (WIN32 OR ${CMAKE_SYSTEM_NAME} MATCHES "AIX") AND LIBOMP_HAVE_WEAK_ATTRIBUTE))) set(LIBOMP_HAVE_OMPT_SUPPORT TRUE) else() set(LIBOMP_HAVE_OMPT_SUPPORT FALSE) diff --git a/openmp/runtime/src/CMakeLists.txt b/openmp/runtime/src/CMakeLists.txt index 8b2445ac58bf0..619d4f7ba4582 100644 --- a/openmp/runtime/src/CMakeLists.txt +++ b/openmp/runtime/src/CMakeLists.txt @@ -108,7 +108,11 @@ else() # Unix specific files libomp_append(LIBOMP_CXXFILES z_Linux_util.cpp) libomp_append(LIBOMP_CXXFILES kmp_gsupport.cpp) - libomp_append(LIBOMP_GNUASMFILES z_Linux_asm.S) # Unix assembly file + if(${CMAKE_SYSTEM_NAME} MATCHES "AIX") + libomp_append(LIBOMP_GNUASMFILES z_AIX_asm.S) # AIX assembly file + else() + libomp_append(LIBOMP_GNUASMFILES z_Linux_asm.S) # Unix assembly file + endif() endif() libomp_append(LIBOMP_CXXFILES thirdparty/ittnotify/ittnotify_static.cpp LIBOMP_USE_ITT_NOTIFY) libomp_append(LIBOMP_CXXFILES kmp_debugger.cpp LIBOMP_USE_DEBUGGER) diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h index 3dbf8c71c48d3..c287a31e0b1b5 100644 --- a/openmp/runtime/src/kmp.h +++ b/openmp/runtime/src/kmp.h @@ -1192,6 +1192,9 @@ extern void __kmp_init_target_task(); // Minimum stack size for pthread for VE is 4MB. // https://www.hpc.nec/documents/veos/en/glibc/Difference_Points_glibc.htm #define KMP_DEFAULT_STKSIZE ((size_t)(4 * 1024 * 1024)) +#elif KMP_OS_AIX +// The default stack size for worker threads on AIX is 4MB. +#define KMP_DEFAULT_STKSIZE ((size_t)(4 * 1024 * 1024)) #else #define KMP_DEFAULT_STKSIZE ((size_t)(1024 * 1024)) #endif @@ -1354,6 +1357,10 @@ extern kmp_uint64 __kmp_now_nsec(); /* TODO: tune for KMP_OS_WASI */ #define KMP_INIT_WAIT 1024U /* initial number of spin-tests */ #define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */ +#elif KMP_OS_AIX +/* TODO: tune for KMP_OS_AIX */ +#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */ +#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */ #endif #if KMP_ARCH_X86 || KMP_ARCH_X86_64 diff --git a/openmp/runtime/src/kmp_config.h.cmake b/openmp/runtime/src/kmp_config.h.cmake index 5f04301c91c60..b0cd0ed296e7f 100644 --- a/openmp/runtime/src/kmp_config.h.cmake +++ b/openmp/runtime/src/kmp_config.h.cmake @@ -100,7 +100,7 @@ #define ENABLE_LIBOMPTARGET OPENMP_ENABLE_LIBOMPTARGET // Configured cache line based on architecture -#if KMP_ARCH_PPC64 +#if KMP_ARCH_PPC64 || KMP_ARCH_PPC # define CACHE_LINE 128 #elif KMP_ARCH_AARCH64_A64FX # define CACHE_LINE 256 diff --git a/openmp/runtime/src/kmp_ftn_entry.h b/openmp/runtime/src/kmp_ftn_entry.h index d54c5bfd10fe9..713561734c481 100644 --- a/openmp/runtime/src/kmp_ftn_entry.h +++ b/openmp/runtime/src/kmp_ftn_entry.h @@ -582,7 +582,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) { int gtid; #if KMP_OS_DARWIN || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ - KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS + KMP_OS_OPENBSD || KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_AIX gtid = __kmp_entry_gtid(); #elif KMP_OS_WINDOWS if (!__kmp_init_parallel || diff --git a/openmp/runtime/src/kmp_global.cpp b/openmp/runtime/src/kmp_global.cpp index b132f38fd3b08..5017cd3de4be5 100644 --- a/openmp/runtime/src/kmp_global.cpp +++ b/openmp/runtime/src/kmp_global.cpp @@ -172,7 +172,7 @@ int __kmp_ncores = 0; int __kmp_chunk = 0; int __kmp_force_monotonic = 0; int __kmp_abort_delay = 0; -#if KMP_OS_LINUX && defined(KMP_TDATA_GTID) +#if (KMP_OS_LINUX || KMP_OS_AIX) && defined(KMP_TDATA_GTID) int __kmp_gtid_mode = 3; /* use __declspec(thread) TLS to store gtid */ int __kmp_adjust_gtid_mode = FALSE; #elif KMP_OS_WINDOWS diff --git a/openmp/runtime/src/kmp_gsupport.cpp b/openmp/runtime/src/kmp_gsupport.cpp index 78af395335498..88189659a2341 100644 --- a/openmp/runtime/src/kmp_gsupport.cpp +++ b/openmp/runtime/src/kmp_gsupport.cpp @@ -357,7 +357,8 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_ORDERED_END)(void) { // They come in two flavors: 64-bit unsigned, and either 32-bit signed // (IA-32 architecture) or 64-bit signed (Intel(R) 64). -#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM +#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \ + KMP_ARCH_PPC #define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4 #define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4 #define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4 diff --git a/openmp/runtime/src/kmp_os.h b/openmp/runtime/src/kmp_os.h index 4ffe9f2d8c953..6862fd89b6302 100644 --- a/openmp/runtime/src/kmp_os.h +++ b/openmp/runtime/src/kmp_os.h @@ -176,7 +176,8 @@ typedef unsigned long long kmp_uint64; #define KMP_UINT64_SPEC "llu" #endif /* KMP_OS_UNIX */ -#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM +#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \ + KMP_ARCH_PPC #define KMP_SIZE_T_SPEC KMP_UINT32_SPEC #elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || \ KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \ @@ -186,7 +187,7 @@ typedef unsigned long long kmp_uint64; #error "Can't determine size_t printf format specifier." #endif -#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_WASM +#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_WASM || KMP_ARCH_PPC #define KMP_SIZE_T_MAX (0xFFFFFFFF) #else #define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF) @@ -1046,7 +1047,7 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v); #if KMP_ARCH_PPC64 || KMP_ARCH_ARM || KMP_ARCH_AARCH64 || KMP_ARCH_MIPS || \ KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \ - KMP_ARCH_VE || KMP_ARCH_S390X + KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC #if KMP_OS_WINDOWS #undef KMP_MB #define KMP_MB() std::atomic_thread_fence(std::memory_order_seq_cst) @@ -1146,7 +1147,7 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v); KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), \ (kmp_int64)(b), (kmp_int64)(c)) -#if KMP_ARCH_X86 || KMP_ARCH_MIPS || KMP_ARCH_WASM +#if KMP_ARCH_X86 || KMP_ARCH_MIPS || KMP_ARCH_WASM || KMP_ARCH_PPC // What about ARM? #define TCR_PTR(a) ((void *)TCR_4(a)) #define TCW_PTR(a, b) TCW_4((a), (b)) diff --git a/openmp/runtime/src/kmp_platform.h b/openmp/runtime/src/kmp_platform.h index 45f411b9c2194..c06f46db2d496 100644 --- a/openmp/runtime/src/kmp_platform.h +++ b/openmp/runtime/src/kmp_platform.h @@ -82,15 +82,20 @@ #define KMP_OS_WASI 1 #endif +#if (defined _AIX) +#undef KMP_OS_AIX +#define KMP_OS_AIX 1 +#endif + #if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \ KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD + \ - KMP_OS_SOLARIS + KMP_OS_WASI) + KMP_OS_SOLARIS + KMP_OS_WASI + KMP_OS_AIX) #error Unknown OS #endif #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS || \ - KMP_OS_WASI + KMP_OS_WASI || KMP_OS_AIX #undef KMP_OS_UNIX #define KMP_OS_UNIX 1 #endif @@ -102,7 +107,8 @@ #define KMP_ARCH_AARCH64 0 #define KMP_ARCH_PPC64_ELFv1 0 #define KMP_ARCH_PPC64_ELFv2 0 -#define KMP_ARCH_PPC64 (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1) +#define KMP_ARCH_PPC64_XCOFF 0 +#define KMP_ARCH_PPC_XCOFF 0 #define KMP_ARCH_MIPS 0 #define KMP_ARCH_MIPS64 0 #define KMP_ARCH_RISCV64 0 @@ -134,13 +140,23 @@ #undef KMP_ARCH_X86 #define KMP_ARCH_X86 1 #elif defined __powerpc64__ -#if defined(_CALL_ELF) && _CALL_ELF == 2 +#if defined(_CALL_ELF) +#if _CALL_ELF == 2 #undef KMP_ARCH_PPC64_ELFv2 #define KMP_ARCH_PPC64_ELFv2 1 #else #undef KMP_ARCH_PPC64_ELFv1 #define KMP_ARCH_PPC64_ELFv1 1 #endif +#elif defined KMP_OS_AIX +#undef KMP_ARCH_PPC64_XCOFF +#define KMP_ARCH_PPC64_XCOFF 1 +#endif +#elif defined(__powerpc__) && defined(KMP_OS_AIX) +#undef KMP_ARCH_PPC_XCOFF +#define KMP_ARCH_PPC_XCOFF 1 +#undef KMP_ARCH_PPC +#define KMP_ARCH_PPC 1 #elif defined __aarch64__ #undef KMP_ARCH_AARCH64 #define KMP_ARCH_AARCH64 1 @@ -207,6 +223,9 @@ #define KMP_ARCH_WASM 1 #endif +#define KMP_ARCH_PPC64 \ + (KMP_ARCH_PPC64_ELFv2 || KMP_ARCH_PPC64_ELFv1 || KMP_ARCH_PPC64_XCOFF) + #if defined(__MIC__) || defined(__MIC2__) #define KMP_MIC 1 #if __MIC2__ || __KNC__ @@ -224,7 +243,8 @@ /* Specify 32 bit architectures here */ #define KMP_32_BIT_ARCH \ - (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM) + (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM || \ + KMP_ARCH_PPC) // Platforms which support Intel(R) Many Integrated Core Architecture #define KMP_MIC_SUPPORTED \ @@ -234,7 +254,7 @@ #if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \ KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \ KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \ - KMP_ARCH_S390X + KMP_ARCH_WASM) + KMP_ARCH_S390X + KMP_ARCH_WASM + KMP_ARCH_PPC) #error Unknown or unsupported architecture #endif diff --git a/openmp/runtime/src/kmp_runtime.cpp b/openmp/runtime/src/kmp_runtime.cpp index 4e1074a893a28..fc5e8405a415e 100644 --- a/openmp/runtime/src/kmp_runtime.cpp +++ b/openmp/runtime/src/kmp_runtime.cpp @@ -8901,7 +8901,7 @@ __kmp_determine_reduction_method( #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD || \ - KMP_OS_SOLARIS || KMP_OS_WASI + KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX int teamsize_cutoff = 4; @@ -8926,14 +8926,14 @@ __kmp_determine_reduction_method( #error "Unknown or unsupported OS" #endif // KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || // KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD || - // KMP_OS_SOLARIS || KMP_OS_WASI + // KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX #elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS || \ - KMP_ARCH_WASM + KMP_ARCH_WASM || KMP_ARCH_PPC #if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \ KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HURD || KMP_OS_SOLARIS || \ - KMP_OS_WASI + KMP_OS_WASI || KMP_OS_AIX // basic tuning diff --git a/openmp/runtime/src/kmp_settings.cpp b/openmp/runtime/src/kmp_settings.cpp index e731bf45e8eee..30a4c05fe76b3 100644 --- a/openmp/runtime/src/kmp_settings.cpp +++ b/openmp/runtime/src/kmp_settings.cpp @@ -6171,9 +6171,9 @@ void __kmp_env_initialize(char const *string) { // specifier, even as substrings. // // I can't find a case-insensitive version of strstr on Windows* OS. - // Use the case-sensitive version for now. + // Use the case-sensitive version for now. AIX does the same. -#if KMP_OS_WINDOWS +#if KMP_OS_WINDOWS || KMP_OS_AIX #define FIND strstr #else #define FIND strcasestr diff --git a/openmp/runtime/src/kmp_wrapper_getpid.h b/openmp/runtime/src/kmp_wrapper_getpid.h index f9d7f4804fbc6..d31c6e80f75df 100644 --- a/openmp/runtime/src/kmp_wrapper_getpid.h +++ b/openmp/runtime/src/kmp_wrapper_getpid.h @@ -17,7 +17,9 @@ // On Unix-like systems (Linux* OS and OS X*) getpid() is declared in standard // headers. +#if !defined(KMP_OS_AIX) #include +#endif #include #include #if KMP_OS_DARWIN @@ -31,6 +33,9 @@ #define __kmp_gettid() _lwp_self() #elif KMP_OS_OPENBSD #define __kmp_gettid() getthrid() +#elif KMP_OS_AIX +#include +#define __kmp_gettid() pthread_self() #elif defined(SYS_gettid) // Hopefully other Unix systems define SYS_gettid syscall for getting os thread // id diff --git a/openmp/runtime/src/z_Linux_util.cpp b/openmp/runtime/src/z_Linux_util.cpp index c2df8895e8875..f01fa647c4d42 100644 --- a/openmp/runtime/src/z_Linux_util.cpp +++ b/openmp/runtime/src/z_Linux_util.cpp @@ -29,7 +29,9 @@ #include #endif // KMP_OS_LINUX #include +#if !KMP_OS_AIX #include +#endif #include #include #include @@ -1832,7 +1834,7 @@ static int __kmp_get_xproc(void) { __kmp_type_convert(sysconf(_SC_NPROCESSORS_CONF), &(r)); #elif KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || KMP_OS_OPENBSD || \ - KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI + KMP_OS_HURD || KMP_OS_SOLARIS || KMP_OS_WASI || KMP_OS_AIX __kmp_type_convert(sysconf(_SC_NPROCESSORS_ONLN), &(r)); @@ -2210,9 +2212,9 @@ int __kmp_is_address_mapped(void *addr) { } #elif KMP_OS_WASI found = (int)addr < (__builtin_wasm_memory_size(0) * PAGESIZE); -#elif KMP_OS_DRAGONFLY || KMP_OS_SOLARIS +#elif KMP_OS_DRAGONFLY || KMP_OS_SOLARIS || KMP_OS_AIX - // FIXME(DragonFly, Solaris): Implement this + // FIXME(DragonFly, Solaris, AIX): Implement this found = 1; #else @@ -2317,7 +2319,7 @@ int __kmp_get_load_balance(int max) { // Open "/proc/" directory. proc_dir = opendir("/proc"); if (proc_dir == NULL) { - // Cannot open "/prroc/". Probably the kernel does not support it. Return an + // Cannot open "/proc/". Probably the kernel does not support it. Return an // error now and in subsequent calls. running_threads = -1; permanent_error = 1; @@ -2330,9 +2332,14 @@ int __kmp_get_load_balance(int max) { proc_entry = readdir(proc_dir); while (proc_entry != NULL) { +#if KMP_OS_AIX + // Proc entry name starts with a digit. Assume it is a process' directory. + if (isdigit(proc_entry->d_name[0])) { +#else // Proc entry is a directory and name starts with a digit. Assume it is a // process' directory. if (proc_entry->d_type == DT_DIR && isdigit(proc_entry->d_name[0])) { +#endif #ifdef KMP_DEBUG ++total_processes; @@ -2376,7 +2383,11 @@ int __kmp_get_load_balance(int max) { task_entry = readdir(task_dir); while (task_entry != NULL) { // It is a directory and name starts with a digit. +#if KMP_OS_AIX + if (isdigit(task_entry->d_name[0])) { +#else if (proc_entry->d_type == DT_DIR && isdigit(task_entry->d_name[0])) { +#endif // Construct complete stat file path. Easiest way would be: // __kmp_str_buf_print( & stat_path, "%s/%s/stat", task_path.str, @@ -2486,7 +2497,7 @@ int __kmp_get_load_balance(int max) { #if !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_MIC || \ ((KMP_OS_LINUX || KMP_OS_DARWIN) && KMP_ARCH_AARCH64) || \ KMP_ARCH_PPC64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \ - KMP_ARCH_ARM || KMP_ARCH_VE || KMP_ARCH_S390X) + KMP_ARCH_ARM || KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC_XCOFF) // we really only need the case with 1 argument, because CLANG always build // a struct of pointers to shared variables referenced in the outlined function diff --git a/openmp/runtime/test/lit.cfg b/openmp/runtime/test/lit.cfg index 27ff057c85f60..4a457f4cc41f7 100644 --- a/openmp/runtime/test/lit.cfg +++ b/openmp/runtime/test/lit.cfg @@ -108,6 +108,18 @@ if config.has_ompt: if config.has_ompx_taskgraph: config.available_features.add("ompx_taskgraph") +if config.operating_system == 'AIX': + config.available_features.add("aix") + object_mode = os.environ.get('OBJECT_MODE', '32') + if object_mode == '64': + config.test_flags += " -m64" + elif object_mode == '32': + # Set user data area to 2GB since the default size 256MB in 32-bit mode + # is not sufficient to run LIT tests on systems that have a lot of + # CPUs when creating one worker thread for each CPU and each worker + # thread uses 4MB stack size. + config.test_flags += " -Wl,-bmaxdata:0x80000000" + if 'Linux' in config.operating_system: config.available_features.add("linux")