diff options
author | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2014-01-29 11:43:05 -0800 |
---|---|---|
committer | Benoit Steiner <benoit.steiner.goog@gmail.com> | 2014-01-29 11:43:05 -0800 |
commit | 64a85800bd3573a7da7a396fde9707dce87a58d9 (patch) | |
tree | 6f82e2c24497038548e594f00b8b29f9affe66b9 /test | |
parent | a7621809fe0fc7c65446ab9a83739ebe313004d4 (diff) |
Added support for AVX to Eigen.
Diffstat (limited to 'test')
-rw-r--r-- | test/packetmath.cpp | 35 | ||||
-rw-r--r-- | test/unalignedcount.cpp | 9 |
2 files changed, 28 insertions, 16 deletions
diff --git a/test/packetmath.cpp b/test/packetmath.cpp index 2c0519c41..d7c336c22 100644 --- a/test/packetmath.cpp +++ b/test/packetmath.cpp @@ -104,11 +104,12 @@ template<typename Scalar> void packetmath() const int PacketSize = internal::packet_traits<Scalar>::size; typedef typename NumTraits<Scalar>::Real RealScalar; - const int size = PacketSize*4; - EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4]; - EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4]; - EIGEN_ALIGN16 Packet packets[PacketSize*2]; - EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4]; + const int max_size = PacketSize > 4 ? PacketSize : 4; + const int size = PacketSize*max_size; + EIGEN_ALIGN32 Scalar data1[size]; + EIGEN_ALIGN32 Scalar data2[size]; + EIGEN_ALIGN32 Packet packets[PacketSize*2]; + EIGEN_ALIGN32 Scalar ref[size]; RealScalar refvalue = 0; for (int i=0; i<size; ++i) { @@ -140,6 +141,10 @@ template<typename Scalar> void packetmath() else if (offset==1) internal::palign<1>(packets[0], packets[1]); else if (offset==2) internal::palign<2>(packets[0], packets[1]); else if (offset==3) internal::palign<3>(packets[0], packets[1]); + else if (offset==4) internal::palign<4>(packets[0], packets[1]); + else if (offset==5) internal::palign<5>(packets[0], packets[1]); + else if (offset==6) internal::palign<6>(packets[0], packets[1]); + else if (offset==7) internal::palign<7>(packets[0], packets[1]); internal::pstore(data2, packets[0]); for (int i=0; i<PacketSize; ++i) @@ -212,9 +217,9 @@ template<typename Scalar> void packetmath_real() const int PacketSize = internal::packet_traits<Scalar>::size; const int size = PacketSize*4; - EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4]; - EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4]; - EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4]; + EIGEN_ALIGN32 Scalar data1[internal::packet_traits<Scalar>::size*4]; + EIGEN_ALIGN32 Scalar data2[internal::packet_traits<Scalar>::size*4]; + EIGEN_ALIGN32 Scalar ref[internal::packet_traits<Scalar>::size*4]; for (int i=0; i<size; ++i) { @@ -257,9 +262,9 @@ template<typename Scalar> void packetmath_notcomplex() typedef typename internal::packet_traits<Scalar>::type Packet; const int PacketSize = internal::packet_traits<Scalar>::size; - EIGEN_ALIGN16 Scalar data1[internal::packet_traits<Scalar>::size*4]; - EIGEN_ALIGN16 Scalar data2[internal::packet_traits<Scalar>::size*4]; - EIGEN_ALIGN16 Scalar ref[internal::packet_traits<Scalar>::size*4]; + EIGEN_ALIGN32 Scalar data1[internal::packet_traits<Scalar>::size*4]; + EIGEN_ALIGN32 Scalar data2[internal::packet_traits<Scalar>::size*4]; + EIGEN_ALIGN32 Scalar ref[internal::packet_traits<Scalar>::size*4]; Array<Scalar,Dynamic,1>::Map(data1, internal::packet_traits<Scalar>::size*4).setRandom(); @@ -317,10 +322,10 @@ template<typename Scalar> void packetmath_complex() const int PacketSize = internal::packet_traits<Scalar>::size; const int size = PacketSize*4; - EIGEN_ALIGN16 Scalar data1[PacketSize*4]; - EIGEN_ALIGN16 Scalar data2[PacketSize*4]; - EIGEN_ALIGN16 Scalar ref[PacketSize*4]; - EIGEN_ALIGN16 Scalar pval[PacketSize*4]; + EIGEN_ALIGN32 Scalar data1[PacketSize*4]; + EIGEN_ALIGN32 Scalar data2[PacketSize*4]; + EIGEN_ALIGN32 Scalar ref[PacketSize*4]; + EIGEN_ALIGN32 Scalar pval[PacketSize*4]; for (int i=0; i<size; ++i) { diff --git a/test/unalignedcount.cpp b/test/unalignedcount.cpp index ca7e159f3..d6ffeafdf 100644 --- a/test/unalignedcount.cpp +++ b/test/unalignedcount.cpp @@ -30,7 +30,14 @@ static int nb_storeu; void test_unalignedcount() { - #ifdef EIGEN_VECTORIZE_SSE + #if defined(EIGEN_VECTORIZE_AVX) + VectorXf a(40), b(40); + VERIFY_ALIGNED_UNALIGNED_COUNT(a += b, 10, 0, 5, 0); + VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) += b.segment(0,40), 5, 5, 5, 0); + VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) -= b.segment(0,40), 5, 5, 5, 0); + VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) *= 3.5, 5, 0, 5, 0); + VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) /= 3.5, 5, 0, 5, 0); + #elif defined(EIGEN_VECTORIZE_SSE) VectorXf a(40), b(40); VERIFY_ALIGNED_UNALIGNED_COUNT(a += b, 20, 0, 10, 0); VERIFY_ALIGNED_UNALIGNED_COUNT(a.segment(0,40) += b.segment(0,40), 10, 10, 10, 0); |