]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add two new methods to VectorizedArray 8426/head
authorpeterrum <peterrmuench@gmail.com>
Sun, 28 Jul 2019 13:06:22 +0000 (15:06 +0200)
committerpeterrum <peterrmuench@gmail.com>
Mon, 29 Jul 2019 19:59:32 +0000 (21:59 +0200)
doc/news/changes/minor/20190729PeterMunch [new file with mode: 0644]
include/deal.II/base/symmetric_tensor.h
include/deal.II/base/vectorization.h
tests/base/vectorization_11.cc [moved from tests/base/vectorization_make_vectorized_array_01.cc with 84% similarity]
tests/base/vectorization_11.output [moved from tests/base/vectorization_make_vectorized_array_01.output with 55% similarity]
tests/base/vectorization_11.output.avx [moved from tests/base/vectorization_make_vectorized_array_01.output.avx with 52% similarity]
tests/base/vectorization_11.output.avx512 [moved from tests/base/vectorization_make_vectorized_array_01.output.avx512 with 52% similarity]
tests/base/vectorization_11.output.sse2 [moved from tests/base/vectorization_make_vectorized_array_01.output.sse2 with 53% similarity]

diff --git a/doc/news/changes/minor/20190729PeterMunch b/doc/news/changes/minor/20190729PeterMunch
new file mode 100644 (file)
index 0000000..e8ed0a0
--- /dev/null
@@ -0,0 +1,4 @@
+New: Amend VectorizedArray with a default constructor and 
+a constructor taking a scalar value.
+<br>
+(Peter Munch, 2019/07/29)
index 2c4252560d2db68c0b2091313743407516538622..8b54f3b69a57536c2c30137dc94a82423f06f06c 100644 (file)
@@ -3536,16 +3536,7 @@ operator*(const SymmetricTensor<rank_, dim, Number> &t,
   // (as well as with switched arguments and double<->float).
   using product_type = typename ProductType<Number, OtherNumber>::type;
   SymmetricTensor<rank_, dim, product_type> tt(t);
-  // we used to shorten the following by 'tt *= product_type(factor);'
-  // which requires that a converting constructor
-  // 'product_type::product_type(const OtherNumber) is defined.
-  // however, a user-defined constructor is not allowed for aggregates,
-  // e.g. VectorizedArray. therefore, we work around this issue using a
-  // copy-assignment operator 'product_type::operator=(const OtherNumber)'
-  // which we assume to be defined.
-  product_type new_factor;
-  new_factor = factor;
-  tt *= new_factor;
+  tt *= product_type(factor);
   return tt;
 }
 
index c582929593fa207231729089c535b448057a584b..3af4a2adc5e3af6cb8a31c400461263fde822236 100644 (file)
@@ -224,6 +224,20 @@ public:
   // POD means that there should be no user-defined constructors, destructors
   // and copy functions (the standard is somewhat relaxed in C++2011, though).
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const Number scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function assigns a scalar to this class.
    */
@@ -666,6 +680,20 @@ public:
    */
   static const unsigned int n_array_elements = 8;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const double scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function can be used to set all data fields to a given scalar.
    */
@@ -1085,6 +1113,20 @@ public:
    */
   static const unsigned int n_array_elements = 16;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const float scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function can be used to set all data fields to a given scalar.
    */
@@ -1555,6 +1597,20 @@ public:
    */
   static const unsigned int n_array_elements = 4;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const double scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function can be used to set all data fields to a given scalar.
    */
@@ -1943,6 +1999,20 @@ public:
    */
   static const unsigned int n_array_elements = 8;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const float scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function can be used to set all data fields to a given scalar.
    */
@@ -2352,6 +2422,20 @@ public:
    */
   static const unsigned int n_array_elements = 2;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const double scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function can be used to set all data fields to a given scalar.
    */
@@ -2703,6 +2787,20 @@ public:
    * This function can be used to set all data fields to a given scalar.
    */
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const float scalar)
+  {
+    this->operator=(scalar);
+  }
+
   DEAL_II_ALWAYS_INLINE
   VectorizedArray &
   operator=(const float x)
@@ -3067,6 +3165,20 @@ public:
    */
   static const unsigned int n_array_elements = 2;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const double scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function assigns a scalar to this class.
    */
@@ -3285,6 +3397,20 @@ public:
    */
   static const unsigned int n_array_elements = 4;
 
+  /**
+   * Default empty constructor, leaving the data in an uninitialized state
+   * similar to float/double.
+   */
+  VectorizedArray() = default;
+
+  /**
+   * Construct an array with the given scalar broadcast to all lanes
+   */
+  VectorizedArray(const float scalar)
+  {
+    this->operator=(scalar);
+  }
+
   /**
    * This function assigns a scalar to this class.
    */
similarity index 84%
rename from tests/base/vectorization_make_vectorized_array_01.cc
rename to tests/base/vectorization_11.cc
index 9067b826bab838df914570c51200600dab7d613e..f6b76d3a015d5a9779ae7774135f40a8a2a177ea 100644 (file)
@@ -52,20 +52,25 @@ struct Tester<double>
   test()
   {
     do_test(make_vectorized_array<double>(2.0), 2.0);
+    do_test(VectorizedArray<double>(2.0), 2.0);
 
 #if DEAL_II_COMPILER_VECTORIZATION_LEVEL >= 3 && defined(__AVX512F__)
     do_test(make_vectorized_array<VectorizedArray<double, 8>>(2.0), 2.0);
+    do_test(VectorizedArray<double, 8>(2.0), 2.0);
 #endif
 
 #if DEAL_II_COMPILER_VECTORIZATION_LEVEL >= 2 && defined(__AVX__)
     do_test(make_vectorized_array<VectorizedArray<double, 4>>(2.0), 2.0);
+    do_test(VectorizedArray<double, 4>(2.0), 2.0);
 #endif
 
 #if DEAL_II_COMPILER_VECTORIZATION_LEVEL >= 1 && defined(__SSE2__)
     do_test(make_vectorized_array<VectorizedArray<double, 2>>(2.0), 2.0);
+    do_test(VectorizedArray<double, 2>(2.0), 2.0);
 #endif
 
     do_test(make_vectorized_array<VectorizedArray<double, 1>>(2.0), 2.0);
+    do_test(VectorizedArray<double, 1>(2.0), 2.0);
   }
 };
 
@@ -76,20 +81,25 @@ struct Tester<float>
   test()
   {
     do_test(make_vectorized_array<float>(2.0), 2.0);
+    do_test(VectorizedArray<float>(2.0), 2.0);
 
 #if DEAL_II_COMPILER_VECTORIZATION_LEVEL >= 3 && defined(__AVX512F__)
     do_test(make_vectorized_array<VectorizedArray<float, 16>>(2.0), 2.0);
+    do_test(VectorizedArray<float, 16>(2.0), 2.0);
 #endif
 
 #if DEAL_II_COMPILER_VECTORIZATION_LEVEL >= 2 && defined(__AVX__)
     do_test(make_vectorized_array<VectorizedArray<float, 8>>(2.0), 2.0);
+    do_test(VectorizedArray<float, 8>(2.0), 2.0);
 #endif
 
 #if DEAL_II_COMPILER_VECTORIZATION_LEVEL >= 1 && defined(__SSE2__)
     do_test(make_vectorized_array<VectorizedArray<float, 4>>(2.0), 2.0);
+    do_test(VectorizedArray<float, 4>(2.0), 2.0);
 #endif
 
     do_test(make_vectorized_array<VectorizedArray<float, 1>>(2.0), 2.0);
+    do_test(VectorizedArray<float, 1>(2.0), 2.0);
   }
 };
 
similarity index 55%
rename from tests/base/vectorization_make_vectorized_array_01.output
rename to tests/base/vectorization_11.output
index bb0c0e3cbe346ebe9128b69139ab0013d1a7ae03..4aa88b6fe4755f5259de6178b0cc24b7e0c952d0 100644 (file)
@@ -2,6 +2,10 @@
 DEAL::double:
 DEAL::  test 1 array elements
 DEAL::  test 1 array elements
+DEAL::  test 1 array elements
+DEAL::  test 1 array elements
 DEAL::float:
 DEAL::  test 1 array elements
 DEAL::  test 1 array elements
+DEAL::  test 1 array elements
+DEAL::  test 1 array elements
similarity index 52%
rename from tests/base/vectorization_make_vectorized_array_01.output.avx
rename to tests/base/vectorization_11.output.avx
index 4951c758d0316a8dd783d117aaa7206f04871bd4..431f41e210aff414f4022faa0e656ff1a40add94 100644 (file)
@@ -2,10 +2,18 @@
 DEAL::double:
 DEAL::  test 4 array elements
 DEAL::  test 4 array elements
+DEAL::  test 4 array elements
+DEAL::  test 4 array elements
 DEAL::  test 2 array elements
+DEAL::  test 2 array elements
+DEAL::  test 1 array elements
 DEAL::  test 1 array elements
 DEAL::float:
 DEAL::  test 8 array elements
 DEAL::  test 8 array elements
+DEAL::  test 8 array elements
+DEAL::  test 8 array elements
 DEAL::  test 4 array elements
+DEAL::  test 4 array elements
+DEAL::  test 1 array elements
 DEAL::  test 1 array elements
similarity index 52%
rename from tests/base/vectorization_make_vectorized_array_01.output.avx512
rename to tests/base/vectorization_11.output.avx512
index 225e32e7737cdb078247ef314e36c921c358c0bc..8d0eca80cbd016317c806cf15c6c4d5866349d5f 100644 (file)
@@ -2,12 +2,22 @@
 DEAL::double:
 DEAL::  test 8 array elements
 DEAL::  test 8 array elements
+DEAL::  test 8 array elements
+DEAL::  test 8 array elements
+DEAL::  test 4 array elements
 DEAL::  test 4 array elements
 DEAL::  test 2 array elements
+DEAL::  test 2 array elements
+DEAL::  test 1 array elements
 DEAL::  test 1 array elements
 DEAL::float:
 DEAL::  test 16 array elements
 DEAL::  test 16 array elements
+DEAL::  test 16 array elements
+DEAL::  test 16 array elements
+DEAL::  test 8 array elements
 DEAL::  test 8 array elements
 DEAL::  test 4 array elements
+DEAL::  test 4 array elements
+DEAL::  test 1 array elements
 DEAL::  test 1 array elements
similarity index 53%
rename from tests/base/vectorization_make_vectorized_array_01.output.sse2
rename to tests/base/vectorization_11.output.sse2
index fffb0c67e3f3b973191210437b98c1d5ec611df5..60dc91825f3bc15ca5264188bb86a9e9977f0e13 100644 (file)
@@ -2,8 +2,14 @@
 DEAL::double:
 DEAL::  test 2 array elements
 DEAL::  test 2 array elements
+DEAL::  test 2 array elements
+DEAL::  test 2 array elements
+DEAL::  test 1 array elements
 DEAL::  test 1 array elements
 DEAL::float:
 DEAL::  test 4 array elements
 DEAL::  test 4 array elements
+DEAL::  test 4 array elements
+DEAL::  test 4 array elements
+DEAL::  test 1 array elements
 DEAL::  test 1 array elements

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.