[Openmp-commits] [openmp] r230033 - Detect Intel MIC architecture and set some defaults at run time instead of build time.
Hal Finkel
hfinkel at anl.gov
Wed Mar 18 11:41:39 PDT 2015
----- Original Message -----
> From: "Andrey Churbanov" <Andrey.Churbanov at intel.com>
> To: openmp-commits at cs.uiuc.edu
> Sent: Friday, February 20, 2015 12:14:44 PM
> Subject: [Openmp-commits] [openmp] r230033 - Detect Intel MIC architecture and set some defaults at run time instead
> of build time.
>
> Author: achurbanov
> Date: Fri Feb 20 12:14:43 2015
> New Revision: 230033
>
> URL: http://llvm.org/viewvc/llvm-project?rev=230033&view=rev
> Log:
> Detect Intel MIC architecture and set some defaults at run time
> instead of build time.
>
> Modified:
> openmp/trunk/runtime/src/kmp.h
> openmp/trunk/runtime/src/kmp_global.c
> openmp/trunk/runtime/src/kmp_runtime.c
> openmp/trunk/runtime/src/kmp_settings.c
>
> Modified: openmp/trunk/runtime/src/kmp.h
> URL:
> http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp.h?rev=230033&r1=230032&r2=230033&view=diff
> ==============================================================================
> --- openmp/trunk/runtime/src/kmp.h (original)
> +++ openmp/trunk/runtime/src/kmp.h Fri Feb 20 12:14:43 2015
> @@ -392,6 +392,16 @@ enum clock_function_type {
> };
> #endif /* KMP_OS_LINUX */
>
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> +enum mic_type {
> + non_mic,
> + mic1,
> + mic2,
> + mic3,
> + dummy
> +};
> +#endif
> +
> /*
> ------------------------------------------------------------------------
> */
> /* -- fast reduction stuff
> ------------------------------------------------ */
>
> @@ -976,12 +986,12 @@ extern unsigned int __kmp_place_core_off
> #endif
>
> #if KMP_ARCH_X86 || KMP_ARCH_X86_64
> -struct kmp_cpuid {
> +typedef struct kmp_cpuid {
> kmp_uint32 eax;
> kmp_uint32 ebx;
> kmp_uint32 ecx;
> kmp_uint32 edx;
> -};
> +} kmp_cpuid_t;
> extern void __kmp_x86_cpuid( int mode, int mode2, struct kmp_cpuid
> *p );
> # if KMP_ARCH_X86
> extern void __kmp_x86_pause( void );
> @@ -2618,6 +2628,10 @@ extern enum clock_function_type __kmp_cl
> extern int __kmp_clock_function_param;
> # endif /* KMP_OS_LINUX */
>
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> +extern enum mic_type __kmp_mic_type;
> +#endif
> +
> # ifdef USE_LOAD_BALANCE
> extern double __kmp_load_balance_interval; /* Interval for
> the load balance algorithm */
> # endif /* USE_LOAD_BALANCE */
>
> Modified: openmp/trunk/runtime/src/kmp_global.c
> URL:
> http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_global.c?rev=230033&r1=230032&r2=230033&view=diff
> ==============================================================================
> --- openmp/trunk/runtime/src/kmp_global.c (original)
> +++ openmp/trunk/runtime/src/kmp_global.c Fri Feb 20 12:14:43 2015
> @@ -212,6 +212,10 @@ enum clock_function_type __kmp_clock_fun
> int __kmp_clock_function_param;
> #endif /* KMP_OS_LINUX */
>
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> +enum mic_type __kmp_mic_type = non_mic;
> +#endif
> +
> #if KMP_AFFINITY_SUPPORTED
>
> # if KMP_GROUP_AFFINITY
>
> Modified: openmp/trunk/runtime/src/kmp_runtime.c
> URL:
> http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_runtime.c?rev=230033&r1=230032&r2=230033&view=diff
> ==============================================================================
> --- openmp/trunk/runtime/src/kmp_runtime.c (original)
> +++ openmp/trunk/runtime/src/kmp_runtime.c Fri Feb 20 12:14:43 2015
> @@ -5863,6 +5863,28 @@ __kmp_unregister_library( void ) {
> // End of Library registration stuff.
> //
> -------------------------------------------------------------------------------------------------
>
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> +
> +static void __kmp_check_mic_type()
> +{
> + kmp_cpuid_t cpuid_state = {0};
> + kmp_cpuid_t * cs_p = &cpuid_state;
> + cs_p->eax=1;
> + cs_p->ecx=0;
> + __asm__ __volatile__("cpuid"
> + : "+a" (cs_p->eax), "=b" (cs_p->ebx), "+c" (cs_p->ecx), "=d"
> (cs_p->edx));
> + // We don't support mic1 at the moment
> + if( (cs_p->eax & 0xff0) == 0xB10 ) {
> + __kmp_mic_type = mic2;
> + } else if( (cs_p->eax & 0xf0ff0) == 0x50670 ) {
> + __kmp_mic_type = mic3;
> + } else {
> + __kmp_mic_type = non_mic;
> + }
> +}
> +
> +#endif /* KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS) */
> +
> static void
> __kmp_do_serial_initialize( void )
> {
> @@ -5927,6 +5949,10 @@ __kmp_do_serial_initialize( void )
>
> __kmp_runtime_initialize();
>
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + __kmp_check_mic_type();
> +#endif
> +
> // Some global variable initialization moved here from
> kmp_env_initialize()
> #ifdef KMP_DEBUG
> kmp_diag = 0;
> @@ -5983,17 +6009,21 @@ __kmp_do_serial_initialize( void )
> #undef kmp_reduction_barrier_release_bb
> #undef kmp_reduction_barrier_gather_bb
> #endif // KMP_FAST_REDUCTION_BARRIER
> - #if KMP_MIC
> - // AC: plane=3,2, forkjoin=2,1 are optimal for 240 threads on
> KNC
> - __kmp_barrier_gather_branch_bits [ bs_plain_barrier ] = 3; //
> plane gather
> - __kmp_barrier_release_branch_bits[ bs_forkjoin_barrier ] = 1;
> // forkjoin release
> - __kmp_barrier_gather_pattern [ bs_forkjoin_barrier ] =
> bp_hierarchical_bar;
> - __kmp_barrier_release_pattern[ bs_forkjoin_barrier ] =
> bp_hierarchical_bar;
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + if( __kmp_mic_type != non_mic ) {
> + // AC: plane=3,2, forkjoin=2,1 are optimal for 240 threads
> on KNC
> + __kmp_barrier_gather_branch_bits [ bs_plain_barrier ] = 3;
> // plane gather
> + __kmp_barrier_release_branch_bits[ bs_forkjoin_barrier ] =
> 1; // forkjoin release
> + __kmp_barrier_gather_pattern [ bs_forkjoin_barrier ] =
> bp_hierarchical_bar;
> + __kmp_barrier_release_pattern[ bs_forkjoin_barrier ] =
> bp_hierarchical_bar;
> + }
> #if KMP_FAST_REDUCTION_BARRIER
> - __kmp_barrier_gather_pattern [ bs_reduction_barrier ] =
> bp_hierarchical_bar;
> - __kmp_barrier_release_pattern[ bs_reduction_barrier ] =
> bp_hierarchical_bar;
> + if( __kmp_mic_type != non_mic ) {
> + __kmp_barrier_gather_pattern [ bs_reduction_barrier ] =
> bp_hierarchical_bar;
> + __kmp_barrier_release_pattern[ bs_reduction_barrier ] =
> bp_hierarchical_bar;
> + }
> +#endif
> #endif
> - #endif
>
> // From KMP_CHECKS initialization
> #ifdef KMP_DEBUG
> @@ -7001,6 +7031,8 @@ __kmp_determine_reduction_method( ident_
>
> int team_size;
>
> + int teamsize_cutoff = 4;
> +
> KMP_DEBUG_ASSERT( loc ); // it would be nice to test ( loc !=
> 0 )
> KMP_DEBUG_ASSERT( lck ); // it would be nice to test ( lck !=
> 0 )
>
> @@ -7023,13 +7055,13 @@ __kmp_determine_reduction_method( ident_
> #if KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64
>
> #if KMP_OS_LINUX || KMP_OS_FREEBSD || KMP_OS_WINDOWS ||
> KMP_OS_DARWIN
> - #if KMP_MIC
> - #define REDUCTION_TEAMSIZE_CUTOFF 8
> - #else // KMP_MIC
> - #define REDUCTION_TEAMSIZE_CUTOFF 4
> - #endif // KMP_MIC
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + if( __kmp_mic_type != non_mic ) {
> + teamsize_cutoff = 8;
> + }
> +#endif
> if( tree_available ) {
> - if( team_size <= REDUCTION_TEAMSIZE_CUTOFF ) {
> + if( team_size <= teamsize_cutoff ) {
> if ( atomic_available ) {
> retval = atomic_reduce_block;
> }
>
> Modified: openmp/trunk/runtime/src/kmp_settings.c
> URL:
> http://llvm.org/viewvc/llvm-project/openmp/trunk/runtime/src/kmp_settings.c?rev=230033&r1=230032&r2=230033&view=diff
> ==============================================================================
> --- openmp/trunk/runtime/src/kmp_settings.c (original)
> +++ openmp/trunk/runtime/src/kmp_settings.c Fri Feb 20 12:14:43 2015
> @@ -2314,17 +2314,20 @@ __kmp_parse_affinity_env( char const * n
> }; // if
>
> if ( __kmp_affinity_gran == affinity_gran_default ) {
> -# if KMP_MIC
> - if( __kmp_affinity_verbose ||
> __kmp_affinity_warnings ) {
> - KMP_WARNING( AffGranUsing, "KMP_AFFINITY",
> "fine" );
> - }
> - __kmp_affinity_gran = affinity_gran_fine;
> -# else
> - if( __kmp_affinity_verbose ||
> __kmp_affinity_warnings ) {
> - KMP_WARNING( AffGranUsing, "KMP_AFFINITY",
> "core" );
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + if( __kmp_mic_type != non_mic ) {
> + if( __kmp_affinity_verbose ||
> __kmp_affinity_warnings ) {
> + KMP_WARNING( AffGranUsing, "KMP_AFFINITY",
> "fine" );
> + }
> + __kmp_affinity_gran = affinity_gran_fine;
> + } else
> +#endif
> + {
> + if( __kmp_affinity_verbose ||
> __kmp_affinity_warnings ) {
> + KMP_WARNING( AffGranUsing, "KMP_AFFINITY",
> "core" );
> + }
> + __kmp_affinity_gran = affinity_gran_core;
> }
> - __kmp_affinity_gran = affinity_gran_core;
> -# endif /* KMP_MIC */
> }
> } break;
> case affinity_scatter:
> @@ -3030,11 +3033,11 @@ __kmp_stg_parse_proc_bind( char const *
> // OMP_PROC_BIND => granularity=core,scatter elsewhere
> //
> __kmp_affinity_type = affinity_scatter;
> -# if KMP_MIC
> - __kmp_affinity_gran = affinity_gran_fine;
> -# else
> - __kmp_affinity_gran = affinity_gran_core;
> -# endif /* KMP_MIC */
> + if( __kmp_mic_type != non_mic ) {
> + __kmp_affinity_gran = affinity_gran_fine;
> + } else {
> + __kmp_affinity_gran = affinity_gran_core;
> + }
Should this use of __kmp_mic_type be guarded by (KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)) as the others?
-Hal
> }
> else {
> __kmp_affinity_type = affinity_none;
> @@ -5228,25 +5231,36 @@ __kmp_env_initialize( char const * strin
> else
> # endif /* OMP_40_ENABLED */
> if ( __kmp_affinity_type == affinity_default ) {
> -# if KMP_MIC
> - __kmp_affinity_type = affinity_scatter;
> -# if OMP_40_ENABLED
> - __kmp_nested_proc_bind.bind_types[0] =
> proc_bind_intel;
> -# endif
> -# else
> - __kmp_affinity_type = affinity_none;
> -# if OMP_40_ENABLED
> - __kmp_nested_proc_bind.bind_types[0] =
> proc_bind_false;
> -# endif
> -# endif
> +#if OMP_40_ENABLED
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + if( __kmp_mic_type != non_mic ) {
> + __kmp_nested_proc_bind.bind_types[0] =
> proc_bind_intel;
> + } else
> +#endif
> + {
> + __kmp_nested_proc_bind.bind_types[0] =
> proc_bind_false;
> + }
> +#endif /* OMP_40_ENABLED */
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + if( __kmp_mic_type != non_mic ) {
> + __kmp_affinity_type = affinity_scatter;
> + } else
> +#endif
> + {
> + __kmp_affinity_type = affinity_none;
> + }
> +
> }
> if ( ( __kmp_affinity_gran == affinity_gran_default
> )
> && ( __kmp_affinity_gran_levels < 0 ) ) {
> -# if KMP_MIC
> - __kmp_affinity_gran = affinity_gran_fine;
> -# else
> - __kmp_affinity_gran = affinity_gran_core;
> -# endif
> +#if KMP_ARCH_X86_64 && (KMP_OS_LINUX || KMP_OS_WINDOWS)
> + if( __kmp_mic_type != non_mic ) {
> + __kmp_affinity_gran = affinity_gran_fine;
> + } else
> +#endif
> + {
> + __kmp_affinity_gran = affinity_gran_core;
> + }
> }
> if ( __kmp_affinity_top_method ==
> affinity_top_method_default ) {
> __kmp_affinity_top_method =
> affinity_top_method_all;
>
>
> _______________________________________________
> Openmp-commits mailing list
> Openmp-commits at dcs-maillist2.engr.illinois.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/openmp-commits
>
--
Hal Finkel
Assistant Computational Scientist
Leadership Computing Facility
Argonne National Laboratory
More information about the Openmp-commits
mailing list