From a0f39b7d797c4d775eea5df5a40bedf5f0d22ae1 Mon Sep 17 00:00:00 2001 From: vicvbcun Date: Sat, 16 Jul 2022 12:38:11 +0200 Subject: gnu: eigen: Update to 3.4.0. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * gnu/packages/algebra.scm (eigen): Update to 3.4.0. * gnu/packages/patches/eigen-fix-strict-aliasing-bug.patch: New file. * gnu/packages/patches/eigen-remove-openmp-error-counting.patch, gnu/packages/patches/eigen-stabilise-sparseqr-test.patch: Delete files. * gnu/local.mk (dist_patch_DATA): Update accordingly. Signed-off-by: Ludovic Courtès --- gnu/local.mk | 3 +- gnu/packages/algebra.scm | 19 +++--- .../patches/eigen-fix-strict-aliasing-bug.patch | 73 +++++++++++++++++++++ .../eigen-remove-openmp-error-counting.patch | 64 ------------------- .../patches/eigen-stabilise-sparseqr-test.patch | 74 ---------------------- 5 files changed, 82 insertions(+), 151 deletions(-) create mode 100644 gnu/packages/patches/eigen-fix-strict-aliasing-bug.patch delete mode 100644 gnu/packages/patches/eigen-remove-openmp-error-counting.patch delete mode 100644 gnu/packages/patches/eigen-stabilise-sparseqr-test.patch (limited to 'gnu') diff --git a/gnu/local.mk b/gnu/local.mk index 412d512775..5c71848616 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -1018,8 +1018,7 @@ dist_patch_DATA = \ %D%/packages/patches/ecl-16-libffi.patch \ %D%/packages/patches/efibootmgr-remove-extra-decl.patch \ %D%/packages/patches/efivar-211.patch \ - %D%/packages/patches/eigen-remove-openmp-error-counting.patch \ - %D%/packages/patches/eigen-stabilise-sparseqr-test.patch \ + %D%/packages/patches/eigen-fix-strict-aliasing-bug.patch \ %D%/packages/patches/einstein-build.patch \ %D%/packages/patches/elfutils-tests-ptrace.patch \ %D%/packages/patches/elixir-path-length.patch \ diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm index 95fbdb5e36..bb71373aa9 100644 --- a/gnu/packages/algebra.scm +++ b/gnu/packages/algebra.scm @@ -986,20 +986,17 @@ extends it by a set of algebraic capabilities.") (define-public eigen (package (name "eigen") - (version "3.3.8") + (version "3.4.0") (source (origin - (method url-fetch) - (uri (list - (string-append "https://bitbucket.org/eigen/eigen/get/" - version ".tar.bz2") - (string-append "mirror://debian/pool/main/e/eigen3/eigen3_" - version ".orig.tar.bz2"))) + (method git-fetch) + (uri (git-reference + (url "https://gitlab.com/libeigen/eigen.git") + (commit version))) (sha256 (base32 - "1vxrsncfnkyq6gwxpsannpryp12mk7lc8f42ybvz3saf7icwc582")) - (file-name (string-append name "-" version ".tar.bz2")) - (patches (search-patches "eigen-remove-openmp-error-counting.patch" - "eigen-stabilise-sparseqr-test.patch")) + "0k1c4qnymwwvm68rv6s0cyk08xbw65ixvwqccsh36c2axcqk3znp")) + (file-name (git-file-name name version)) + (patches (search-patches "eigen-fix-strict-aliasing-bug.patch")) (modules '((guix build utils))) (snippet ;; There are 3 test failures in the "unsupported" directory, diff --git a/gnu/packages/patches/eigen-fix-strict-aliasing-bug.patch b/gnu/packages/patches/eigen-fix-strict-aliasing-bug.patch new file mode 100644 index 0000000000..139d633c44 --- /dev/null +++ b/gnu/packages/patches/eigen-fix-strict-aliasing-bug.patch @@ -0,0 +1,73 @@ +From f046e326d9e30772725d8fb26dc33328e418d9d3 Mon Sep 17 00:00:00 2001 +From: Antonio Sanchez +Date: Fri, 17 Sep 2021 12:49:01 -0700 +Subject: [PATCH] Fix strict aliasing bug causing product_small failure. + +Packet loading is skipped due to aliasing violation, leading to nullopt matrix +multiplication. + +Fixes #2327. + + +(cherry picked from commit 3c724c44cff3f9e2e9e35351abff0b5c022b320d) +--- + Eigen/src/Core/arch/AVX/Complex.h | 4 +++- + Eigen/src/Core/arch/AVX512/Complex.h | 4 +++- + Eigen/src/Core/arch/SSE/Complex.h | 11 +++-------- + 3 files changed, 9 insertions(+), 10 deletions(-) + +diff --git a/Eigen/src/Core/arch/AVX/Complex.h b/Eigen/src/Core/arch/AVX/Complex.h +index ab7bd6c65..e9096c0a1 100644 +--- a/Eigen/src/Core/arch/AVX/Complex.h ++++ b/Eigen/src/Core/arch/AVX/Complex.h +@@ -99,7 +99,9 @@ template<> EIGEN_STRONG_INLINE Packet4cf ploadu(const std::complex EIGEN_STRONG_INLINE Packet4cf pset1(const std::complex& from) + { +- return Packet4cf(_mm256_castpd_ps(_mm256_broadcast_sd((const double*)(const void*)&from))); ++ const float re = std::real(from); ++ const float im = std::imag(from); ++ return Packet4cf(_mm256_set_ps(im, re, im, re, im, re, im, re)); + } + + template<> EIGEN_STRONG_INLINE Packet4cf ploaddup(const std::complex* from) +diff --git a/Eigen/src/Core/arch/AVX512/Complex.h b/Eigen/src/Core/arch/AVX512/Complex.h +index 49c72b3f1..074253859 100644 +--- a/Eigen/src/Core/arch/AVX512/Complex.h ++++ b/Eigen/src/Core/arch/AVX512/Complex.h +@@ -97,7 +97,9 @@ template<> EIGEN_STRONG_INLINE Packet8cf ploadu(const std::complex EIGEN_STRONG_INLINE Packet8cf pset1(const std::complex& from) + { +- return Packet8cf(_mm512_castpd_ps(pload1((const double*)(const void*)&from))); ++ const float re = std::real(from); ++ const float im = std::imag(from); ++ return Packet8cf(_mm512_set_ps(im, re, im, re, im, re, im, re, im, re, im, re, im, re, im, re)); + } + + template<> EIGEN_STRONG_INLINE Packet8cf ploaddup(const std::complex* from) +diff --git a/Eigen/src/Core/arch/SSE/Complex.h b/Eigen/src/Core/arch/SSE/Complex.h +index 8fe22da46..215bfd7bb 100644 +--- a/Eigen/src/Core/arch/SSE/Complex.h ++++ b/Eigen/src/Core/arch/SSE/Complex.h +@@ -106,14 +106,9 @@ template<> EIGEN_STRONG_INLINE Packet2cf ploadu(const std::complex EIGEN_STRONG_INLINE Packet2cf pset1(const std::complex& from) + { +- Packet2cf res; +-#ifdef EIGEN_VECTORIZE_SSE3 +- res.v = _mm_castpd_ps(_mm_loaddup_pd(reinterpret_cast(&from))); +-#else +- res.v = _mm_castpd_ps(_mm_load_sd(reinterpret_cast(&from))); +- res.v = _mm_movelh_ps(res.v, res.v); +-#endif +- return res; ++ const float re = std::real(from); ++ const float im = std::imag(from); ++ return Packet2cf(_mm_set_ps(im, re, im, re)); + } + + template<> EIGEN_STRONG_INLINE Packet2cf ploaddup(const std::complex* from) { return pset1(*from); } +-- +2.37.0 + diff --git a/gnu/packages/patches/eigen-remove-openmp-error-counting.patch b/gnu/packages/patches/eigen-remove-openmp-error-counting.patch deleted file mode 100644 index 556474e8b3..0000000000 --- a/gnu/packages/patches/eigen-remove-openmp-error-counting.patch +++ /dev/null @@ -1,64 +0,0 @@ -From ef3cc72cb65e2d500459c178c63e349bacfa834f Mon Sep 17 00:00:00 2001 -From: Luke Peterson -Date: Thu, 8 Oct 2020 12:16:53 -0700 -Subject: [PATCH] Remove error counting in OpenMP parallelize_gemm - -This resolves a compilation error associated with -Eigen::eigen_assert_exception. It also eliminates the counting of -exceptions that may occur in the OpenMP parallel section. If an -unhandled exception occurs in this section, the behavior is non-conforming -according to the OpenMP specification. ---- - Eigen/src/Core/products/Parallelizer.h | 14 +++++--------- - test/CMakeLists.txt | 2 +- - 2 files changed, 6 insertions(+), 10 deletions(-) - -diff --git a/Eigen/src/Core/products/Parallelizer.h b/Eigen/src/Core/products/Parallelizer.h -index 67b2442b5..a3cc05b77 100644 ---- a/Eigen/src/Core/products/Parallelizer.h -+++ b/Eigen/src/Core/products/Parallelizer.h -@@ -132,8 +132,7 @@ void parallelize_gemm(const Functor& func, Index rows, Index cols, Index depth, - - ei_declare_aligned_stack_constructed_variable(GemmParallelInfo,info,threads,0); - -- int errorCount = 0; -- #pragma omp parallel num_threads(threads) reduction(+: errorCount) -+ #pragma omp parallel num_threads(threads) - { - Index i = omp_get_thread_num(); - // Note that the actual number of threads might be lower than the number of request ones. -@@ -152,14 +151,11 @@ void parallelize_gemm(const Functor& func, Index rows, Index cols, Index depth, - info[i].lhs_start = r0; - info[i].lhs_length = actualBlockRows; - -- EIGEN_TRY { -- if(transpose) func(c0, actualBlockCols, 0, rows, info); -- else func(0, rows, c0, actualBlockCols, info); -- } EIGEN_CATCH(...) { -- ++errorCount; -- } -+ if(transpose) -+ func(c0, actualBlockCols, 0, rows, info); -+ else -+ func(0, rows, c0, actualBlockCols, info); - } -- if (errorCount) EIGEN_THROW_X(Eigen::eigen_assert_exception()); - #endif - } - -diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt -index 0747aa6cb..b02577780 100644 ---- a/test/CMakeLists.txt -+++ b/test/CMakeLists.txt -@@ -163,7 +163,7 @@ ei_add_test(constructor) - ei_add_test(linearstructure) - ei_add_test(integer_types) - ei_add_test(unalignedcount) --if(NOT EIGEN_TEST_NO_EXCEPTIONS) -+if(NOT EIGEN_TEST_NO_EXCEPTIONS AND NOT EIGEN_TEST_OPENMP) - ei_add_test(exceptions) - endif() - ei_add_test(redux) --- -GitLab - diff --git a/gnu/packages/patches/eigen-stabilise-sparseqr-test.patch b/gnu/packages/patches/eigen-stabilise-sparseqr-test.patch deleted file mode 100644 index b95b46077a..0000000000 --- a/gnu/packages/patches/eigen-stabilise-sparseqr-test.patch +++ /dev/null @@ -1,74 +0,0 @@ -From: Tobias Geerinckx-Rice -Date: Mon, 16 Mar 2020 22:51:37 +0000 -Subject: gnu: eigen: Stabilise sparseqr test. - -Taken verbatim from this[0] upstream commit. - -[0]: https://gitlab.com/libeigen/eigen/-/commit/3b5deeb546d4017b24846f5b0dc3296a50a039fe - -From 3b5deeb546d4017b24846f5b0dc3296a50a039fe Mon Sep 17 00:00:00 2001 -From: Gael Guennebaud -Date: Tue, 19 Feb 2019 22:57:51 +0100 -Subject: [PATCH] bug #899: make sparseqr unit test more stable by 1) trying - with larger threshold and 2) relax rank computation for rank-deficient - problems. - ---- - test/sparseqr.cpp | 31 ++++++++++++++++++++++++++----- - 1 file changed, 26 insertions(+), 5 deletions(-) - -diff --git a/test/sparseqr.cpp b/test/sparseqr.cpp -index 3ffe62314..3576cc626 100644 ---- a/test/sparseqr.cpp -+++ b/test/sparseqr.cpp -@@ -43,6 +43,7 @@ int generate_sparse_rectangular_problem(MatrixType& A, DenseMat& dA, int maxRows - - template void test_sparseqr_scalar() - { -+ typedef typename NumTraits::Real RealScalar; - typedef SparseMatrix MatrixType; - typedef Matrix DenseMat; - typedef Matrix DenseVector; -@@ -91,14 +92,34 @@ template void test_sparseqr_scalar() - exit(0); - return; - } -- -- VERIFY_IS_APPROX(A * x, b); -- -- //Compare with a dense QR solver -+ -+ // Compare with a dense QR solver - ColPivHouseholderQR dqr(dA); - refX = dqr.solve(b); - -- VERIFY_IS_EQUAL(dqr.rank(), solver.rank()); -+ bool rank_deficient = A.cols()>A.rows() || dqr.rank() we might have to increase the threshold -+ // to get a correct solution. -+ RealScalar th = RealScalar(20)*dA.colwise().norm().maxCoeff()*(A.rows()+A.cols()) * NumTraits::epsilon(); -+ for(Index k=0; (k<16) && !test_isApprox(A*x,b); ++k) -+ { -+ th *= RealScalar(10); -+ solver.setPivotThreshold(th); -+ solver.compute(A); -+ x = solver.solve(b); -+ } -+ } -+ -+ VERIFY_IS_APPROX(A * x, b); -+ -+ // For rank deficient problem, the estimated rank might -+ // be slightly off, so let's only raise a warning in such cases. -+ if(rank_deficient) ++g_test_level; -+ VERIFY_IS_EQUAL(solver.rank(), dqr.rank()); -+ if(rank_deficient) --g_test_level; -+ - if(solver.rank()==A.cols()) // full rank - VERIFY_IS_APPROX(x, refX); - // else --- -2.24.1 - -- cgit v1.2.3