Прежде всего, чтобы избежать временных значений в ваших примерах, вы должны написать
b.noalias() += w1 * A * a;
Это потому, что Eigen не может сказать во время компиляции, что b
, A
и a
делаютне псевдоним, а потому оценивает продукт как временный. Подробнее см. Здесь .
Godbolt-demo: https://godbolt.org/g/VSfekp (Обратите внимание, что -DEIGEN_USE_BLAS
по существу эквивалентно -DEIGEN_USE_MKL_ALL
, но Godbolt в настоящее время не поддерживает MKL).
К вашему актуальному вопросу: Чтобы определить, нужна ли операции временная операция, вы можете скомпилировать с -DEIGEN_RUNTIME_NO_MALLOC
и разделами окружения, которые, по вашему мнению, не должны выделяться на
Eigen::set_is_malloc_allowed(false); // mallocs after this cause assertions
// some code
Eigen::set_is_malloc_allowed(true); // mallocs are allowed again
Для этого требуется, чтобы у объекта результата был правильный размер перед входом в этот раздел.
Кроме того, это не поможет для выражений фиксированного размера, поскольку они никогда не будут выделять кучу памяти, но для выражений фиксированного размераиспользование MKL обычно менее эффективно, чем Eigen (который в зависимости от размера полностью развернет необходимые операции).