[Openmp-commits] [openmp] r230033 - Detect Intel MIC architecture and set some defaults at run time instead of build time.

Andrey Churbanov Andrey.Churbanov at intel.com
Fri Feb 20 10:14:44 PST 2015


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;
+            }
     }
     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;





More information about the Openmp-commits mailing list