]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Add variant of vectorized pow() 12214/head
authorJean-Paul Pelteret <jppelteret@gmail.com>
Sun, 16 May 2021 07:22:21 +0000 (09:22 +0200)
committerJean-Paul Pelteret <jppelteret@gmail.com>
Sun, 16 May 2021 07:26:12 +0000 (09:26 +0200)
include/deal.II/base/vectorization.h
tests/base/vectorization_13.cc
tests/base/vectorization_13.output
tests/base/vectorization_13.output.avx
tests/base/vectorization_13.output.avx512
tests/base/vectorization_13.output.sse2

index 851a2f2b074ce783480b983dad7bfe348dd71479..b780aa55170e0ec5eeebb3f20960e3f57d7ef0d7 100644 (file)
@@ -5432,6 +5432,30 @@ namespace std
 
 
 
+  /**
+   * Raises the given number @p x to the power @p p for a vectorized data
+   * field. The result is returned as vectorized array in the form
+   * <tt>{pow(x[0],p[0]), pow(x[1],p[1]), ...,
+   * pow(x[size()-1],p[size()-1])}</tt>.
+   *
+   * @relatesalso VectorizedArray
+   */
+  template <typename Number, std::size_t width>
+  inline ::dealii::VectorizedArray<Number, width>
+  pow(const ::dealii::VectorizedArray<Number, width> &x,
+      const ::dealii::VectorizedArray<Number, width> &p)
+  {
+    Number values[::dealii::VectorizedArray<Number, width>::size()];
+    for (unsigned int i = 0; i < dealii::VectorizedArray<Number, width>::size();
+         ++i)
+      values[i] = std::pow(x[i], p[i]);
+    ::dealii::VectorizedArray<Number, width> out;
+    out.load(&values[0]);
+    return out;
+  }
+
+
+
   /**
    * Compute the absolute value (modulus) of a vectorized data field. The
    * result is returned as vectorized array in the form <tt>{abs(x[0]),
index 535cf8211dee964177050a435138ad75e46cd664..a85dfae652aa6e806385adc8f399e3f70ca11e0e 100644 (file)
@@ -37,6 +37,21 @@ do_test(const VectorizedArrayType                      array,
 }
 
 
+template <typename VectorizedArrayType>
+void
+do_test(const VectorizedArrayType array, const VectorizedArrayType number)
+{
+  deallog << "  test " << VectorizedArrayType::size() << " array elements"
+          << std::endl;
+
+  auto exponentiated_array = std::pow(array, number);
+
+  for (unsigned int i = 0; i < VectorizedArrayType::size(); i++)
+    deallog << exponentiated_array[i] << " ";
+  deallog << std::endl;
+}
+
+
 int
 main()
 {
@@ -45,18 +60,30 @@ main()
 #if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 512
   do_test(VectorizedArray<double, 8>(2.0), 3.0);
   do_test(VectorizedArray<float, 16>(2.0), 3.0);
+
+  do_test(VectorizedArray<double, 8>(2.0), VectorizedArray<double, 8>(3.0));
+  do_test(VectorizedArray<float, 16>(2.0), VectorizedArray<float, 16>(3.0));
 #endif
 
 #if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 256
   do_test(VectorizedArray<double, 4>(2.0), 3.0);
   do_test(VectorizedArray<float, 8>(2.0), 3.0);
+
+  do_test(VectorizedArray<double, 4>(2.0), VectorizedArray<double, 4>(3.0));
+  do_test(VectorizedArray<float, 8>(2.0), VectorizedArray<float, 8>(3.0));
 #endif
 
 #if DEAL_II_VECTORIZATION_WIDTH_IN_BITS >= 128
   do_test(VectorizedArray<double, 2>(2.0), 3.0);
   do_test(VectorizedArray<float, 4>(2.0), 3.0);
+
+  do_test(VectorizedArray<double, 2>(2.0), VectorizedArray<double, 2>(3.0));
+  do_test(VectorizedArray<float, 4>(2.0), VectorizedArray<float, 4>(3.0));
 #endif
 
   do_test(VectorizedArray<double, 1>(2.0), 3.0);
   do_test(VectorizedArray<float, 1>(2.0), 3.0);
+
+  do_test(VectorizedArray<double, 1>(2.0), VectorizedArray<double, 1>(3.0));
+  do_test(VectorizedArray<float, 1>(2.0), VectorizedArray<float, 1>(3.0));
 }
index b255be5f415d0c373d8250d0009c78dd8395cc82..0256affa8a82f852e5d653c176e6640a0a720c5f 100644 (file)
@@ -3,3 +3,7 @@ DEAL::  test 1 array elements
 DEAL::8.00000 
 DEAL::  test 1 array elements
 DEAL::8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
index e8cc78758609830e3d9e61e79cda84e980d90a90..358a166d559c9e8957031e88526379be0ad279d6 100644 (file)
@@ -3,6 +3,14 @@ DEAL::  test 4 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 
 DEAL::  test 8 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 4 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 8 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 2 array elements
+DEAL::8.00000 8.00000 
+DEAL::  test 4 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 
 DEAL::  test 2 array elements
 DEAL::8.00000 8.00000 
 DEAL::  test 4 array elements
@@ -11,3 +19,7 @@ DEAL::  test 1 array elements
 DEAL::8.00000 
 DEAL::  test 1 array elements
 DEAL::8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
index 46df357ef7ff855566481ca0f2c8d804db326020..f11346db8c56d85d320db389802dfab74014ea32 100644 (file)
@@ -1,4 +1,8 @@
 
+DEAL::  test 8 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 16 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 
 DEAL::  test 8 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 
 DEAL::  test 16 array elements
@@ -7,10 +11,22 @@ DEAL::  test 4 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 
 DEAL::  test 8 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 4 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 8 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000 8.00000
 DEAL::  test 2 array elements
 DEAL::8.00000 8.00000 
 DEAL::  test 4 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 2 array elements
+DEAL::8.00000 8.00000 
+DEAL::  test 4 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
 DEAL::  test 1 array elements
 DEAL::8.00000 
 DEAL::  test 1 array elements
index 33e4e4f81ad791d21a3c2324863ce5e9402d1e4e..a74598cedc569a30b2244ed51fcb890196177857 100644 (file)
@@ -3,6 +3,14 @@ DEAL::  test 2 array elements
 DEAL::8.00000 8.00000 
 DEAL::  test 4 array elements
 DEAL::8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 2 array elements
+DEAL::8.00000 8.00000 
+DEAL::  test 4 array elements
+DEAL::8.00000 8.00000 8.00000 8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
+DEAL::  test 1 array elements
+DEAL::8.00000 
 DEAL::  test 1 array elements
 DEAL::8.00000 
 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.