2 changes: 1 addition & 1 deletion openmp/runtime/src/kmp_runtime.c
Original file line number Diff line number Diff line change
Expand Up @@ -8450,7 +8450,7 @@ __kmp_determine_reduction_method( ident_t *loc, kmp_int32 global_tid,
int atomic_available = FAST_REDUCTION_ATOMIC_METHOD_GENERATED;
int tree_available = FAST_REDUCTION_TREE_METHOD_GENERATED;

#if KMP_ARCH_X86_64
#if KMP_ARCH_X86_64 || KMP_ARCH_PPC64

#if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN
#if KMP_MIC
Expand Down
3 changes: 2 additions & 1 deletion openmp/runtime/src/kmp_settings.c
Original file line number Diff line number Diff line change
Expand Up @@ -536,6 +536,7 @@ __kmp_stg_parse_file(

static char * par_range_to_print = NULL;

#ifdef KMP_DEBUG
static void
__kmp_stg_parse_par_range(
char const * name,
Expand Down Expand Up @@ -614,7 +615,7 @@ __kmp_stg_parse_par_range(
break;
}
} // __kmp_stg_parse_par_range

#endif

int
__kmp_initial_threads_capacity( int req_nproc )
Expand Down
29 changes: 24 additions & 5 deletions openmp/runtime/src/makefile.mk
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,9 @@ endif
ifeq "$(CPLUSPLUS)" "on"
ifeq "$(os)" "win"
c-flags += -TP
else ifeq "$(arch)" "ppc64"
# c++0x on ppc64 linux removes definition of preproc. macros, needed in .hs
c-flags += -x c++ -std=gnu++0x
else
ifneq "$(filter gcc clang,$(c))" ""
c-flags += -x c++ -std=c++0x
Expand Down Expand Up @@ -373,7 +376,7 @@ ifeq "$(os)" "lin"
ld-flags-extra += -lirc_pic
endif
endif
ifeq "$(filter 32 32e 64,$(arch))" ""
ifeq "$(filter 32 32e 64 ppc64,$(arch))" ""
ld-flags-extra += $(shell pkg-config --libs libffi)
endif
else
Expand Down Expand Up @@ -469,7 +472,14 @@ ifneq "$(os)" "win"
endif
cpp-flags += -D KMP_LIBRARY_FILE=\"$(lib_file)\"
cpp-flags += -D KMP_VERSION_MAJOR=$(VERSION)
cpp-flags += -D CACHE_LINE=64

# customize ppc64 cache line size to 128, 64 otherwise
ifeq "$(arch)" "ppc64"
cpp-flags += -D CACHE_LINE=128
else
cpp-flags += -D CACHE_LINE=64
endif

cpp-flags += -D KMP_ADJUST_BLOCKTIME=1
cpp-flags += -D BUILD_PARALLEL_ORDERED
cpp-flags += -D KMP_ASM_INTRINS
Expand Down Expand Up @@ -584,9 +594,12 @@ ifneq "$(os)" "win"
ifeq "$(arch)" "arm"
z_Linux_asm$(obj) : \
cpp-flags += -D KMP_ARCH_ARM
else
else ifeq "$(arch)" "ppc64"
z_Linux_asm$(obj) : \
cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
cpp-flags += -D KMP_ARCH_PPC64
else
z_Linux_asm$(obj) : \
cpp-flags += -D KMP_ARCH_X86$(if $(filter 32e,$(arch)),_64)
endif
endif

Expand Down Expand Up @@ -735,7 +748,9 @@ endif
else # 5
lib_c_items += kmp_gsupport
endif
# ifneq "$(arch)" "ppc64"
lib_asm_items += z_Linux_asm
# endif
endif
endif

Expand Down Expand Up @@ -1397,9 +1412,13 @@ ifneq "$(filter %-dyna win-%,$(os)-$(LINK_TYPE))" ""
td_exp += libc.so.6
td_exp += ld-linux-armhf.so.3
endif
ifeq "$(arch)" "ppc64"
td_exp += libc.so.6
td_exp += ld64.so.1
endif
td_exp += libdl.so.2
td_exp += libgcc_s.so.1
ifeq "$(filter 32 32e 64,$(arch))" ""
ifeq "$(filter 32 32e 64 ppc64,$(arch))" ""
td_exp += libffi.so.6
td_exp += libffi.so.5
endif
Expand Down
9 changes: 8 additions & 1 deletion openmp/runtime/src/thirdparty/ittnotify/ittnotify_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,11 @@
# define ITT_ARCH_ARM 4
#endif /* ITT_ARCH_ARM */

#ifndef ITT_ARCH_PPC64
# define ITT_ARCH_PPC64 5
#endif /* ITT_ARCH_PPC64 */


#ifndef ITT_ARCH
# if defined _M_IX86 || defined __i386__
# define ITT_ARCH ITT_ARCH_IA32
Expand All @@ -141,6 +146,8 @@
# define ITT_ARCH ITT_ARCH_IA64
# elif defined _M_ARM || __arm__
# define ITT_ARCH ITT_ARCH_ARM
# elif defined __powerpc64__
# define ITT_ARCH ITT_ARCH_PPC64
# endif
#endif

Expand Down Expand Up @@ -274,7 +281,7 @@ ITT_INLINE long __TBB_machine_fetchadd4(volatile void* ptr, long addend)
: "memory");
return result;
}
#elif ITT_ARCH==ITT_ARCH_ARM
#elif ITT_ARCH==ITT_ARCH_ARM || ITT_ARCH==ITT_ARCH_PPC64
#define __TBB_machine_fetchadd4(addr, val) __sync_fetch_and_add(addr, val)
#endif /* ITT_ARCH==ITT_ARCH_IA64 */
#ifndef ITT_SIMPLE_INIT
Expand Down
12 changes: 11 additions & 1 deletion openmp/runtime/src/z_Linux_asm.s
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ __kmp_unnamed_critical_addr:
#endif /* KMP_GOMP_COMPAT */


#if KMP_ARCH_X86
#if KMP_ARCH_X86 && !KMP_ARCH_PPC64

// -----------------------------------------------------------------------
// microtasking routines specifically written for IA-32 architecture
Expand Down Expand Up @@ -1585,6 +1585,16 @@ __kmp_unnamed_critical_addr:
.size __kmp_unnamed_critical_addr,4
#endif /* KMP_ARCH_ARM */

#if KMP_ARCH_PPC64
.data
.comm .gomp_critical_user_,32,8
.data
.align 8
.global __kmp_unnamed_critical_addr
__kmp_unnamed_critical_addr:
.8byte .gomp_critical_user_
.size __kmp_unnamed_critical_addr,8
#endif /* KMP_ARCH_PPC64 */

#if defined(__linux__)
.section .note.GNU-stack,"",@progbits
Expand Down
121 changes: 108 additions & 13 deletions openmp/runtime/src/z_Linux_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#include <sys/resource.h>
#include <sys/syscall.h>

#if KMP_OS_LINUX
#if KMP_OS_LINUX && !KMP_OS_CNK
# include <sys/sysinfo.h>
# if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
// We should really include <futex.h>, but that causes compatibility problems on different
Expand Down Expand Up @@ -61,7 +61,7 @@
#include <fcntl.h>

// For non-x86 architecture
#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)
# include <stdbool.h>
# include <ffi.h>
#endif
Expand Down Expand Up @@ -110,7 +110,7 @@ __kmp_print_cond( char *buffer, kmp_cond_align_t *cond )
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */

#if KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED
#if ( KMP_OS_LINUX && KMP_AFFINITY_SUPPORTED)

/*
* Affinity support
Expand Down Expand Up @@ -147,6 +147,19 @@ __kmp_print_cond( char *buffer, kmp_cond_align_t *cond )
# error Wrong code for getaffinity system call.
# endif /* __NR_sched_getaffinity */

# elif KMP_ARCH_PPC64
# ifndef __NR_sched_setaffinity
# define __NR_sched_setaffinity 222
# elif __NR_sched_setaffinity != 222
# error Wrong code for setaffinity system call.
# endif /* __NR_sched_setaffinity */
# ifndef __NR_sched_getaffinity
# define __NR_sched_getaffinity 223
# elif __NR_sched_getaffinity != 223
# error Wrong code for getaffinity system call.
# endif /* __NR_sched_getaffinity */


# else
# error Unknown or unsupported architecture

Expand Down Expand Up @@ -445,7 +458,7 @@ __kmp_change_thread_affinity_mask( int gtid, kmp_affin_mask_t *new_mask,
/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */

#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
#if KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) && !KMP_OS_CNK

int
__kmp_futex_determine_capable()
Expand All @@ -462,7 +475,7 @@ __kmp_futex_determine_capable()
return retval;
}

#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM)
#endif // KMP_OS_LINUX && (KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_ARM) && !KMP_OS_CNK

/* ------------------------------------------------------------------------ */
/* ------------------------------------------------------------------------ */
Expand All @@ -481,7 +494,7 @@ __kmp_test_then_or32( volatile kmp_int32 *p, kmp_int32 d )
old_value = TCR_4( *p );
new_value = old_value | d;

while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
while ( ! KMP_COMPARE_AND_STORE_REL32 ( p, old_value, new_value ) )
{
KMP_CPU_PAUSE();
old_value = TCR_4( *p );
Expand All @@ -498,7 +511,7 @@ __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
old_value = TCR_4( *p );
new_value = old_value & d;

while ( ! __kmp_compare_and_store32 ( p, old_value, new_value ) )
while ( ! KMP_COMPARE_AND_STORE_REL32 ( p, old_value, new_value ) )
{
KMP_CPU_PAUSE();
old_value = TCR_4( *p );
Expand All @@ -507,7 +520,7 @@ __kmp_test_then_and32( volatile kmp_int32 *p, kmp_int32 d )
return old_value;
}

# if KMP_ARCH_X86
# if KMP_ARCH_X86 || KMP_ARCH_PPC64
kmp_int64
__kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
{
Expand All @@ -516,7 +529,7 @@ __kmp_test_then_add64( volatile kmp_int64 *p, kmp_int64 d )
old_value = TCR_8( *p );
new_value = old_value + d;

while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
while ( ! KMP_COMPARE_AND_STORE_REL64 ( p, old_value, new_value ) )
{
KMP_CPU_PAUSE();
old_value = TCR_8( *p );
Expand All @@ -533,7 +546,7 @@ __kmp_test_then_or64( volatile kmp_int64 *p, kmp_int64 d )

old_value = TCR_8( *p );
new_value = old_value | d;
while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
while ( ! KMP_COMPARE_AND_STORE_REL64 ( p, old_value, new_value ) )
{
KMP_CPU_PAUSE();
old_value = TCR_8( *p );
Expand All @@ -549,7 +562,7 @@ __kmp_test_then_and64( volatile kmp_int64 *p, kmp_int64 d )

old_value = TCR_8( *p );
new_value = old_value & d;
while ( ! __kmp_compare_and_store64 ( p, old_value, new_value ) )
while ( ! KMP_COMPARE_AND_STORE_REL64 ( p, old_value, new_value ) )
{
KMP_CPU_PAUSE();
old_value = TCR_8( *p );
Expand Down Expand Up @@ -2527,7 +2540,7 @@ __kmp_get_load_balance( int max )
#endif // USE_LOAD_BALANCE


#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
#if KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)

int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
void *p_argv[] )
Expand Down Expand Up @@ -2561,7 +2574,89 @@ int __kmp_invoke_microtask( microtask_t pkfn, int gtid, int tid, int argc,
return 1;
}

#endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64)
#endif // KMP_COMPILER_GCC && !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_ARCH_PPC64)

#if KMP_ARCH_PPC64

// 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
int
__kmp_invoke_microtask( microtask_t pkfn,
int gtid, int tid,
int argc, void *p_argv[] ) {
switch (argc) {
default:
fprintf(stderr, "Too many args to microtask: %d!\n", argc);
fflush(stderr);
exit(-1);
case 0:
(*pkfn)(&gtid, &tid);
break;
case 1:
(*pkfn)(&gtid, &tid, p_argv[0]);
break;
case 2:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1]);
break;
case 3:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2]);
break;
case 4:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3]);
break;
case 5:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4]);
break;
case 6:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5]);
break;
case 7:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6]);
break;
case 8:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7]);
break;
case 9:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8]);
break;
case 10:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9]);
break;
case 11:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10]);
break;
case 12:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
p_argv[11]);
break;
case 13:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
p_argv[11], p_argv[12]);
break;
case 14:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
p_argv[11], p_argv[12], p_argv[13]);
break;
case 15:
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
p_argv[11], p_argv[12], p_argv[13], p_argv[14]);
break;
}

return 1;
}

#endif

// end of file //

4 changes: 4 additions & 0 deletions openmp/runtime/tools/lib/Platform.pm
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ sub canon_arch($) {
$arch = "32e";
} elsif ( $arch =~ m{\Aarm(?:v7\D*)?\z} ) {
$arch = "arm";
} elsif ( $arch =~ m{\Appc64} ) {
$arch = "ppc64";
} else {
$arch = undef;
}; # if
Expand Down Expand Up @@ -159,6 +161,8 @@ sub target_options() {
$_host_arch = "32e";
} elsif ( $hardware_platform eq "arm" ) {
$_host_arch = "arm";
} elsif ( $hardware_platform eq "ppc64" ) {
$_host_arch = "ppc64";
} else {
die "Unsupported host hardware platform: \"$hardware_platform\"; stopped";
}; # if
Expand Down
2 changes: 2 additions & 0 deletions openmp/runtime/tools/lib/Uname.pm
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,8 @@ if ( 0 ) {
$values{ hardware_platform } = "x86_64";
} elsif ( $values{ machine } =~ m{\Aarmv7\D*\z} ) {
$values{ hardware_platform } = "arm";
} elsif ( $values{ machine } =~ m{\Appc64\z} ) {
$values{ hardware_platform } = "ppc64";
} else {
die "Unsupported machine (\"$values{ machine }\") returned by POSIX::uname(); stopped";
}; # if
Expand Down
6 changes: 3 additions & 3 deletions openmp/runtime/tools/src/common-defs.mk
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ endif
# Description:
# The function return printable name of specified architecture, IA-32 architecture or Intel(R) 64.
#
legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(if $(filter arm,$(1)),ARM,$(error Bad architecture specified: $(1))))))
legal_arch = $(if $(filter 32,$(1)),IA-32,$(if $(filter 32e,$(1)),Intel(R) 64,$(if $(filter l1,$(1)),L1OM,$(if $(filter arm,$(1)),ARM,$(if $(filter ppc64,$(1)),PPC64,$(error Bad architecture specified: $(1)))))))

# Synopsis:
# var_name = $(call check_variable,var,list)
Expand Down Expand Up @@ -128,9 +128,9 @@ endif
# --------------------------------------------------------------------------------------------------

os := $(call check_variable,os,lin lrb mac win)
arch := $(call check_variable,arch,32 32e 64 arm)
arch := $(call check_variable,arch,32 32e 64 arm ppc64)
platform := $(os)_$(arch)
platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lrb_32e mac_32 mac_32e win_32 win_32e win_64)
platform := $(call check_variable,platform,lin_32 lin_32e lin_64 lin_arm lrb_32e mac_32 mac_32e win_32 win_32e win_64 lin_ppc64)
# oa-opts means "os and arch options". They are passed to almost all perl scripts.
oa-opts := --os=$(os) --arch=$(arch)

Expand Down