* As promised to George and per #93, add macros for hinting to the compiler
whether an if statement is likely to be taken and for prefetching memory. Current macros: OPAL_LIKELY(expression) OPAL_UNLIKELY(expression) OPAL_PREFETC(address) This commit was SVN r10278.
Этот коммит содержится в:
родитель
a4030ad2d9
Коммит
4c80624fb3
@ -8,7 +8,7 @@ dnl of Tennessee Research Foundation. All rights
|
|||||||
dnl reserved.
|
dnl reserved.
|
||||||
dnl Copyright (c) 2004-2006 High Performance Computing Center Stuttgart,
|
dnl Copyright (c) 2004-2006 High Performance Computing Center Stuttgart,
|
||||||
dnl University of Stuttgart. All rights reserved.
|
dnl University of Stuttgart. All rights reserved.
|
||||||
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
dnl Copyright (c) 2004-2006 The Regents of the University of California.
|
||||||
dnl All rights reserved.
|
dnl All rights reserved.
|
||||||
dnl $COPYRIGHT$
|
dnl $COPYRIGHT$
|
||||||
dnl
|
dnl
|
||||||
@ -153,6 +153,38 @@ AC_DEFUN([OMPI_SETUP_CC],[
|
|||||||
unset add
|
unset add
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# see if the C compiler supports __builtin_expect
|
||||||
|
AC_CACHE_CHECK([if $CC supports __builtin_expect],
|
||||||
|
[ompi_cv_cc_supports___builtin_expect],
|
||||||
|
[AC_TRY_COMPILE([],
|
||||||
|
[void *ptr = (void*) 0;
|
||||||
|
if (__builtin_expect (ptr != NULL, 1)) return 0;],
|
||||||
|
[ompi_cv_cc_supports___builtin_expect="yes"],
|
||||||
|
[ompi_cv_cc_supports___builtin_expect="no"])])
|
||||||
|
if test "$ompi_cv_cc_supports___builtin_expect" = "yes" ; then
|
||||||
|
have_builtin_expect=1
|
||||||
|
else
|
||||||
|
have_builtin_expect=0
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED([OMPI_C_HAVE_BUILTIN_EXPECT], [$have_builtin_expect],
|
||||||
|
[Whether C compiler supports __builtin_expect])
|
||||||
|
|
||||||
|
# see if the C compiler supports __builtin_prefetch
|
||||||
|
AC_CACHE_CHECK([if $CC supports __builtin_prefetch],
|
||||||
|
[ompi_cv_cc_supports___builtin_prefetch],
|
||||||
|
[AC_TRY_COMPILE([],
|
||||||
|
[int ptr;
|
||||||
|
__builtin_prefetch(&ptr);],
|
||||||
|
[ompi_cv_cc_supports___builtin_prefetch="yes"],
|
||||||
|
[ompi_cv_cc_supports___builtin_prefetch="no"])])
|
||||||
|
if test "$ompi_cv_cc_supports___builtin_prefetch" = "yes" ; then
|
||||||
|
have_builtin_prefetch=1
|
||||||
|
else
|
||||||
|
have_builtin_prefetch=0
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED([OMPI_C_HAVE_BUILTIN_PREFETCH], [$have_builtin_prefetch],
|
||||||
|
[Whether C compiler supports __builtin_prefetch])
|
||||||
|
|
||||||
# Preload the optflags for the case where the user didn't specify
|
# Preload the optflags for the case where the user didn't specify
|
||||||
# any. If we're using GNU compilers, use -O3 (since it GNU
|
# any. If we're using GNU compilers, use -O3 (since it GNU
|
||||||
# doesn't require all compilation units to be compiled with the
|
# doesn't require all compilation units to be compiled with the
|
||||||
|
@ -8,7 +8,7 @@ dnl of Tennessee Research Foundation. All rights
|
|||||||
dnl reserved.
|
dnl reserved.
|
||||||
dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
dnl Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
||||||
dnl University of Stuttgart. All rights reserved.
|
dnl University of Stuttgart. All rights reserved.
|
||||||
dnl Copyright (c) 2004-2005 The Regents of the University of California.
|
dnl Copyright (c) 2004-2006 The Regents of the University of California.
|
||||||
dnl All rights reserved.
|
dnl All rights reserved.
|
||||||
dnl $COPYRIGHT$
|
dnl $COPYRIGHT$
|
||||||
dnl
|
dnl
|
||||||
@ -135,6 +135,42 @@ AC_DEFUN([OMPI_SETUP_CXX],[
|
|||||||
# config/cxx_find_template_parameters.m4
|
# config/cxx_find_template_parameters.m4
|
||||||
OMPI_CXX_FIND_TEMPLATE_PARAMETERS
|
OMPI_CXX_FIND_TEMPLATE_PARAMETERS
|
||||||
|
|
||||||
|
# see if the C++ compiler supports __builtin_expect
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_CACHE_CHECK([if $CXX supports __builtin_expect],
|
||||||
|
[ompi_cv_cxx_supports___builtin_expect],
|
||||||
|
[AC_TRY_COMPILE([],
|
||||||
|
[void *ptr = (void*) 0;
|
||||||
|
if (__builtin_expect (ptr != NULL, 1)) return 0;],
|
||||||
|
[ompi_cv_cxx_supports___builtin_expect="yes"],
|
||||||
|
[ompi_cv_cxx_supports___builtin_expect="no"])])
|
||||||
|
if test "$ompi_cv_cxx_supports___builtin_expect" = "yes" ; then
|
||||||
|
have_builtin_expect=1
|
||||||
|
else
|
||||||
|
have_builtin_expect=0
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED([OMPI_CXX_HAVE_BUILTIN_EXPECT], [$have_builtin_expect],
|
||||||
|
[Whether C++ compiler supports __builtin_expect])
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
|
# see if the C compiler supports __builtin_prefetch
|
||||||
|
AC_LANG_PUSH(C++)
|
||||||
|
AC_CACHE_CHECK([if $CXX supports __builtin_prefetch],
|
||||||
|
[ompi_cv_cxx_supports___builtin_prefetch],
|
||||||
|
[AC_TRY_COMPILE([],
|
||||||
|
[int ptr;
|
||||||
|
__builtin_prefetch(&ptr);],
|
||||||
|
[ompi_cv_cxx_supports___builtin_prefetch="yes"],
|
||||||
|
[ompi_cv_cxx_supports___builtin_prefetch="no"])])
|
||||||
|
if test "$ompi_cv_cxx_supports___builtin_prefetch" = "yes" ; then
|
||||||
|
have_builtin_prefetch=1
|
||||||
|
else
|
||||||
|
have_builtin_prefetch=0
|
||||||
|
fi
|
||||||
|
AC_DEFINE_UNQUOTED([OMPI_CXX_HAVE_BUILTIN_PREFETCH], [$have_builtin_prefetch],
|
||||||
|
[Whether C++ compiler supports __builtin_prefetch])
|
||||||
|
AC_LANG_POP(C++)
|
||||||
|
|
||||||
# If we are on HP-UX, ensure that we're using aCC
|
# If we are on HP-UX, ensure that we're using aCC
|
||||||
case "$host" in
|
case "$host" in
|
||||||
*hpux*)
|
*hpux*)
|
||||||
|
58
opal/include/opal/prefetch.h
Обычный файл
58
opal/include/opal/prefetch.h
Обычный файл
@ -0,0 +1,58 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2004-2006 The Regents of the University of California.
|
||||||
|
* All rights reserved.
|
||||||
|
* $COPYRIGHT$
|
||||||
|
*
|
||||||
|
* Additional copyrights may follow
|
||||||
|
*
|
||||||
|
* $HEADER$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* Compiler-specific prefetch functions
|
||||||
|
*
|
||||||
|
* A small set of prefetch / prediction interfaces for using compiler
|
||||||
|
* directives to improve memory prefetching and branch prediction
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef OPAL_PREFETCH_H
|
||||||
|
#define OPAL_PREFETCH_H
|
||||||
|
|
||||||
|
#if defined(c_plusplus) || defined(__cplusplus)
|
||||||
|
/* C++ code */
|
||||||
|
|
||||||
|
#if OMPI_CXX_HAVE_BUILTIN_EXPECT
|
||||||
|
#define OPAL_LIKELY(expression) __builtin_expect(!!(expression), 1)
|
||||||
|
#define OPAL_UNLIKELY(expression) __builtin_expect(!!(expression), 0)
|
||||||
|
#else
|
||||||
|
#define OPAL_LIKELY(expression) (expression)
|
||||||
|
#define OPAL_UNLIKELY(expression) (expression)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if OMPI_CXX_HAVE_BUILTIN_PREFETCH
|
||||||
|
#define OPAL_PREFETCH(address) __builtin_prefetch(address)
|
||||||
|
#else
|
||||||
|
#define OPAL_PREFETCH(address)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* C code */
|
||||||
|
|
||||||
|
#if OMPI_C_HAVE_BUILTIN_EXPECT
|
||||||
|
#define OPAL_LIKELY(expression) __builtin_expect(!!(expression), 1)
|
||||||
|
#define OPAL_UNLIKELY(expression) __builtin_expect(!!(expression), 0)
|
||||||
|
#else
|
||||||
|
#define OPAL_LIKELY(expression) (expression)
|
||||||
|
#define OPAL_UNLIKELY(expression) (expression)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if OMPI_C_HAVE_BUILTIN_PREFETCH
|
||||||
|
#define OPAL_PREFETCH(address) __builtin_prefetch(address)
|
||||||
|
#else
|
||||||
|
#define OPAL_PREFETCH(address)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
Загрузка…
x
Ссылка в новой задаче
Block a user