Squashed 'third_party/eigen/' content from commit 61d72f6

Change-Id: Iccc90fa0b55ab44037f018046d2fcffd90d9d025
git-subtree-dir: third_party/eigen
git-subtree-split: 61d72f6383cfa842868c53e30e087b0258177257
diff --git a/bench/benchVecAdd.cpp b/bench/benchVecAdd.cpp
new file mode 100644
index 0000000..ce8e1e9
--- /dev/null
+++ b/bench/benchVecAdd.cpp
@@ -0,0 +1,135 @@
+
+#include <iostream>
+#include <Eigen/Core>
+#include <bench/BenchTimer.h>
+using namespace Eigen;
+
+#ifndef SIZE
+#define SIZE 50
+#endif
+
+#ifndef REPEAT
+#define REPEAT 10000
+#endif
+
+typedef float Scalar;
+
+__attribute__ ((noinline)) void benchVec(Scalar* a, Scalar* b, Scalar* c, int size);
+__attribute__ ((noinline)) void benchVec(MatrixXf& a, MatrixXf& b, MatrixXf& c);
+__attribute__ ((noinline)) void benchVec(VectorXf& a, VectorXf& b, VectorXf& c);
+
+int main(int argc, char* argv[])
+{
+    int size = SIZE * 8;
+    int size2 = size * size;
+    Scalar* a = internal::aligned_new<Scalar>(size2);
+    Scalar* b = internal::aligned_new<Scalar>(size2+4)+1;
+    Scalar* c = internal::aligned_new<Scalar>(size2); 
+    
+    for (int i=0; i<size; ++i)
+    {
+        a[i] = b[i] = c[i] = 0;
+    }
+    
+    BenchTimer timer;
+    
+    timer.reset();
+    for (int k=0; k<10; ++k)
+    {
+        timer.start();
+        benchVec(a, b, c, size2);
+        timer.stop();
+    }
+    std::cout << timer.value() << "s  " << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << " GFlops\n";
+    return 0;
+    for (int innersize = size; innersize>2 ; --innersize)
+    {
+        if (size2%innersize==0)
+        {
+            int outersize = size2/innersize;
+            MatrixXf ma = Map<MatrixXf>(a, innersize, outersize );
+            MatrixXf mb = Map<MatrixXf>(b, innersize, outersize );
+            MatrixXf mc = Map<MatrixXf>(c, innersize, outersize );
+            timer.reset();
+            for (int k=0; k<3; ++k)
+            {
+                timer.start();
+                benchVec(ma, mb, mc);
+                timer.stop();
+            }
+            std::cout << innersize << " x " << outersize << "  " << timer.value() << "s   " << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << " GFlops\n";
+        }
+    }
+    
+    VectorXf va = Map<VectorXf>(a, size2);
+    VectorXf vb = Map<VectorXf>(b, size2);
+    VectorXf vc = Map<VectorXf>(c, size2);
+    timer.reset();
+    for (int k=0; k<3; ++k)
+    {
+        timer.start();
+        benchVec(va, vb, vc);
+        timer.stop();
+    }
+    std::cout << timer.value() << "s   " << (double(size2*REPEAT)/timer.value())/(1024.*1024.*1024.) << " GFlops\n";
+
+    return 0;
+}
+
+void benchVec(MatrixXf& a, MatrixXf& b, MatrixXf& c)
+{
+    for (int k=0; k<REPEAT; ++k)
+        a = a + b;
+}
+
+void benchVec(VectorXf& a, VectorXf& b, VectorXf& c)
+{
+    for (int k=0; k<REPEAT; ++k)
+        a = a + b;
+}
+
+void benchVec(Scalar* a, Scalar* b, Scalar* c, int size)
+{
+    typedef internal::packet_traits<Scalar>::type PacketScalar;
+    const int PacketSize = internal::packet_traits<Scalar>::size;
+    PacketScalar a0, a1, a2, a3, b0, b1, b2, b3;
+    for (int k=0; k<REPEAT; ++k)
+        for (int i=0; i<size; i+=PacketSize*8)
+        {
+//             a0 = internal::pload(&a[i]);
+//             b0 = internal::pload(&b[i]);
+//             a1 = internal::pload(&a[i+1*PacketSize]);
+//             b1 = internal::pload(&b[i+1*PacketSize]);
+//             a2 = internal::pload(&a[i+2*PacketSize]);
+//             b2 = internal::pload(&b[i+2*PacketSize]);
+//             a3 = internal::pload(&a[i+3*PacketSize]);
+//             b3 = internal::pload(&b[i+3*PacketSize]);
+//             internal::pstore(&a[i], internal::padd(a0, b0));
+//             a0 = internal::pload(&a[i+4*PacketSize]);
+//             b0 = internal::pload(&b[i+4*PacketSize]);
+//             
+//             internal::pstore(&a[i+1*PacketSize], internal::padd(a1, b1));
+//             a1 = internal::pload(&a[i+5*PacketSize]);
+//             b1 = internal::pload(&b[i+5*PacketSize]);
+//             
+//             internal::pstore(&a[i+2*PacketSize], internal::padd(a2, b2));
+//             a2 = internal::pload(&a[i+6*PacketSize]);
+//             b2 = internal::pload(&b[i+6*PacketSize]);
+//             
+//             internal::pstore(&a[i+3*PacketSize], internal::padd(a3, b3));
+//             a3 = internal::pload(&a[i+7*PacketSize]);
+//             b3 = internal::pload(&b[i+7*PacketSize]);
+//             
+//             internal::pstore(&a[i+4*PacketSize], internal::padd(a0, b0));
+//             internal::pstore(&a[i+5*PacketSize], internal::padd(a1, b1));
+//             internal::pstore(&a[i+6*PacketSize], internal::padd(a2, b2));
+//             internal::pstore(&a[i+7*PacketSize], internal::padd(a3, b3));
+            
+            internal::pstore(&a[i+2*PacketSize], internal::padd(internal::ploadu(&a[i+2*PacketSize]), internal::ploadu(&b[i+2*PacketSize])));
+            internal::pstore(&a[i+3*PacketSize], internal::padd(internal::ploadu(&a[i+3*PacketSize]), internal::ploadu(&b[i+3*PacketSize])));
+            internal::pstore(&a[i+4*PacketSize], internal::padd(internal::ploadu(&a[i+4*PacketSize]), internal::ploadu(&b[i+4*PacketSize])));
+            internal::pstore(&a[i+5*PacketSize], internal::padd(internal::ploadu(&a[i+5*PacketSize]), internal::ploadu(&b[i+5*PacketSize])));
+            internal::pstore(&a[i+6*PacketSize], internal::padd(internal::ploadu(&a[i+6*PacketSize]), internal::ploadu(&b[i+6*PacketSize])));
+            internal::pstore(&a[i+7*PacketSize], internal::padd(internal::ploadu(&a[i+7*PacketSize]), internal::ploadu(&b[i+7*PacketSize])));
+        }
+}