Skip to content

Commit 68d881a

Browse files
authored
Merge pull request #92 from jcarpent/devel
Fix heap allocation in dense solver
2 parents c4aaad3 + 2ec747d commit 68d881a

File tree

5 files changed

+30
-14
lines changed

5 files changed

+30
-14
lines changed

include/proxsuite/linalg/dense/core.hpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -792,6 +792,12 @@ noalias_mul_add_impl(Dst dst, Lhs lhs, Rhs rhs, T factor)
792792
return;
793793
}
794794

795+
#if !EIGEN_VERSION_AT_LEAST(3, 3, 8)
796+
#define LAZY_PRODUCT(a, b) a.lazyProduct(b)
797+
#else
798+
#define LAZY_PRODUCT(a, b) a.operator*(b)
799+
#endif
800+
795801
#if !EIGEN_VERSION_AT_LEAST(3, 3, 8)
796802
if ((dst.rows() < 20) && (dst.cols() < 20) && (rhs.rows() < 20)) {
797803
// gemm
@@ -804,12 +810,14 @@ noalias_mul_add_impl(Dst dst, Lhs lhs, Rhs rhs, T factor)
804810

805811
auto dst_ =
806812
MapMut(dst.data(), dst.rows(), dst.cols(), { dst.outerStride() });
807-
dst_.noalias().operator+=(lhs.operator*(rhs).operator*(factor));
813+
dst_.noalias().operator+=(factor * LAZY_PRODUCT(lhs, rhs));
808814
} else
809815
#endif
810816
{
811-
dst.noalias().operator+=(lhs.operator*(rhs).operator*(factor));
817+
dst.noalias().operator+=(factor * LAZY_PRODUCT(lhs, rhs));
812818
}
819+
820+
#undef LAZY_PRODUCT
813821
}
814822
} // namespace _detail
815823
namespace util {

include/proxsuite/linalg/veg/memory/alloc.hpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#ifndef VEG_ALLOC_HPP_TAWYRUICS
22
#define VEG_ALLOC_HPP_TAWYRUICS
33

4+
#include "proxsuite/fwd.hpp"
45
#include "proxsuite/linalg/veg/ref.hpp"
56
#include "proxsuite/linalg/veg/type_traits/constructible.hpp"
67
#include "proxsuite/linalg/veg/type_traits/assignable.hpp"
@@ -168,15 +169,15 @@ aligned_alloc(usize align, usize size) noexcept -> void*
168169
#if defined(_WIN32)
169170
return _aligned_malloc((size + mask) & ~mask, align);
170171
#elif defined(__APPLE__)
171-
#if defined(PROXSUITE_WITH_CPP_17)
172+
#ifdef PROXSUITE_WITH_CPP_17
172173
return alignment::aligned_alloc(align, (size + mask) & ~mask);
173-
#elif defined(PROXSUITE_WITH_CPP_14)
174+
#else
174175
return alignment::detail::aligned_alloc(align, (size + mask) & ~mask);
175176
#endif
176177
#else
177178
#ifdef PROXSUITE_WITH_CPP_17
178179
return std::aligned_alloc(align, (size + mask) & ~mask);
179-
#elif defined(PROXSUITE_WITH_CPP_14)
180+
#else
180181
return alignment::detail::aligned_alloc(align, (size + mask) & ~mask);
181182
#endif
182183
#endif

include/proxsuite/proxqp/dense/helpers.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ setup_factorization(Workspace<T>& qpwork,
8787
.segment(qpmodel.dim, qpmodel.n_eq)
8888
.setConstant(-qpresults.info.mu_eq);
8989

90-
qpwork.ldl.factorize(qpwork.kkt, stack);
90+
qpwork.ldl.factorize(qpwork.kkt.transpose(), stack);
9191
}
9292
/*!
9393
* Performs the equilibration of the QP problem for reducing its

include/proxsuite/proxqp/dense/solver.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ refactorize(const Model<T>& qpmodel,
5555
proxsuite::linalg::veg::dynstack::DynStackMut stack{
5656
proxsuite::linalg::veg::from_slice_mut, qpwork.ldl_stack.as_mut()
5757
};
58-
qpwork.ldl.factorize(qpwork.kkt, stack);
58+
qpwork.ldl.factorize(qpwork.kkt.transpose(), stack);
5959

6060
isize n = qpmodel.dim;
6161
isize n_eq = qpmodel.n_eq;

include/proxsuite/proxqp/dense/views.hpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1117,6 +1117,12 @@ noalias_mul_add(MatrixViewMut<T, colmajor> dst,
11171117
return;
11181118
}
11191119

1120+
#if !EIGEN_VERSION_AT_LEAST(3, 3, 8)
1121+
#define LAZY_PRODUCT(a, b) a.lazyProduct(b)
1122+
#else
1123+
#define LAZY_PRODUCT(a, b) a.operator*(b)
1124+
#endif
1125+
11201126
if (dst.cols == 1 && dst.rows == 1) {
11211127
// dot
11221128
auto rhs_col = rhs.col(0);
@@ -1133,7 +1139,7 @@ noalias_mul_add(MatrixViewMut<T, colmajor> dst,
11331139
auto rhs_col = rhs.col(0);
11341140
auto dst_col = dst.col(0);
11351141
dst_col.to_eigen().noalias().operator+=(
1136-
factor * (lhs.to_eigen().operator*(rhs_col.to_eigen())));
1142+
factor * LAZY_PRODUCT(lhs.to_eigen(), rhs_col.to_eigen()));
11371143
}
11381144

11391145
#if !EIGEN_VERSION_AT_LEAST(3, 3, 8)
@@ -1151,19 +1157,20 @@ noalias_mul_add(MatrixViewMut<T, colmajor> dst,
11511157
.noalias()
11521158
.
11531159
operator+=(
1154-
Map(lhs.data, lhs.rows, lhs.cols, Stride(lhs.outer_stride))
1155-
.
1156-
operator*(Map(rhs.data, rhs.rows, rhs.cols, Stride(rhs.outer_stride))
1157-
.
1158-
operator*(factor)));
1160+
factor *
1161+
LAZY_PRODUCT(
1162+
Map(lhs.data, lhs.rows, lhs.cols, Stride(lhs.outer_stride)),
1163+
Map(rhs.data, rhs.rows, rhs.cols, Stride(rhs.outer_stride))));
11591164
}
11601165
#endif
11611166

11621167
else {
11631168
// gemm
11641169
dst.to_eigen().noalias().operator+=(
1165-
lhs.to_eigen().operator*(rhs.to_eigen().operator*(factor)));
1170+
factor * LAZY_PRODUCT(lhs.to_eigen(), rhs.to_eigen()));
11661171
}
1172+
1173+
#undef LAZY_PRODUCT
11671174
}
11681175

11691176
template<typename T>

0 commit comments

Comments
 (0)