]> https://gitweb.dealii.org/ - dealii.git/commitdiff
move EnableOpenMPSimdFor to parallel.h, update test 623/head
authorTimo Heister <timo.heister@gmail.com>
Sat, 28 Feb 2015 22:20:20 +0000 (17:20 -0500)
committerTimo Heister <timo.heister@gmail.com>
Sun, 1 Mar 2015 16:20:11 +0000 (11:20 -0500)
- move EnableOpenMPSimdFor struct into parallel.h so it is public
- use in tests/lac/intel-15-bug

include/deal.II/base/parallel.h
include/deal.II/lac/vector.templates.h
tests/lac/intel-15-bug.cc

index 8b9fc278e6e56efe06827e052172d7f6f9e91b18..67edaf695e924a8818cbce3f4adc00e3f85081f4 100644 (file)
@@ -44,6 +44,30 @@ namespace parallel
 {
   namespace internal
   {
+    /**
+     * Helper struct to tell us if we can use SIMD instructions for the given @p
+     * Number type.
+     */
+    template <typename Number>
+    struct EnableOpenMPSimdFor
+    {
+      static const bool value = true;
+    };
+
+#ifdef __INTEL_COMPILER
+    // Disable long double SIMD instructions on ICC. This is to work around a bug
+    // that generates wrong code at least up to intel 15 (see
+    // tests/lac/vector-vector, tests/lac/intel-15-bug, and the discussion at
+    // https://github.com/dealii/dealii/issues/598).
+    template <>
+    struct EnableOpenMPSimdFor<long double>
+    {
+      static const bool value = false;
+    };
+#endif
+
+
+
     /**
      * Convert a function object of type F into an object that can be applied
      * to all elements of a range of synchronous iterators.
index 0c832b59045cbf313089fe65666080d655aaf89d..2beda3f21a03081620b57e2fb4b927767f88ce71 100644 (file)
 
 DEAL_II_NAMESPACE_OPEN
 
-/**
- * Helper struct to tell us if we can use SIMD instructions for the given @p
- * Number type.
- */
-template <typename Number>
-struct EnableOpenMPSimdFor
-{
-  static const bool value = true;
-};
-
-#ifdef __INTEL_COMPILER
-// Disable long double SIMD instructions on ICC. This is to work around a bug
-// that generates wrong code at least up to intel 15 (see
-// tests/lac/vector-vector, tests/lac/intel-15-bug, and the discussion at
-// https://github.com/dealii/dealii/issues/598).
-template <>
-struct EnableOpenMPSimdFor<long double>
-{
-  static const bool value = false;
-};
-#endif
 
 
 namespace internal
@@ -181,7 +160,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -210,7 +189,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -240,7 +219,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -268,7 +247,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -296,7 +275,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -324,7 +303,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -355,7 +334,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -384,7 +363,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -416,7 +395,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -444,7 +423,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -473,7 +452,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -504,7 +483,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -537,7 +516,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
@@ -566,7 +545,7 @@ namespace internal
 
     void operator() (const size_type begin, const size_type end) const
     {
-      if (EnableOpenMPSimdFor<Number>::value)
+      if (parallel::internal::EnableOpenMPSimdFor<Number>::value)
         {
           DEAL_II_OPENMP_SIMD_PRAGMA
           for (size_type i=begin; i<end; ++i)
index ba9c68f0a47304b80677c3362f5d801f366510b3..2c066b71e37af18d4ec1fa7e6c5122ad04c35500 100644 (file)
@@ -15,7 +15,8 @@
 
 // intel 15.0 compiler bug. This is a simplification of tests/lac/vector-vector
 // It only triggers when using TBB (it will use two threads) and only with
-// SIMD for long double.
+// SIMD for long double. We now use dealii::parallel::internal::EnableOpenMPSimdFor
+// so the test passes.
 
 #include "../tests.h"
 #include <deal.II/base/logstream.h>
@@ -35,9 +36,18 @@ template <typename Number>
 
   void operator() (const tbb::blocked_range<size_type> &range) const
   {
+    if (dealii::parallel::internal::EnableOpenMPSimdFor<Number>::value)
+      {        
       DEAL_II_OPENMP_SIMD_PRAGMA
         for (size_type i=range.begin(); i<range.end(); ++i)
           val[i] += v_val[i];
+      }
+    else
+      {
+        for (size_type i=range.begin(); i<range.end(); ++i)
+          val[i] += v_val[i];
+      }
+    
   }
 };
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.