Что изменилось
Я обновил Eigen 3.4.1 до Eigen 5.0.0. После обновления одна конкретная конфигурация больше не собирается:
- Debug + AVX-512: ссылки работают нормально
- Release/Debug + AVX или AVX2: ссылки работают нормально (≤ ~2 мин)
- Eigen 3.4.1 (тот же проект/настройки): ссылки отлично
- Release + AVX-512 + /GL + /LTCG: шаг компоновки потребляет огромный объем памяти и в конечном итоге завершается сбоем с OOM (через ~90 минут)
Симптомы
В неудачной конфигурации (Выпуск + AVX-512 + /GL + /LTCG) компоновщик начинает потреблять очень большое количество частных байтов и в конечном итоге аварийно завершает работу из-за нехватки памяти.
Если я отключу оптимизацию (удалить /GL и /LTCG), сборка «застрять» при компиляции одной единицы перевода (возможно, это связано с чрезвычайно дорогостоящей оптимизацией/встраиванием).
К чему я это отследил
Похоже, это связано с использованием Eigen::SparseLU. Если я удалю путь кода, вызывающий SparseLU, сборка будет выполнена нормально.
При использовании Visual Studio Build Insights компилятор тратит очень много времени на встраивание внутренних ядер, особенно это видно при расчленении:
Код: Выделить всё
public: void __cdecl Eigen::internal::gemm_class::compute_kern(void)
public: void __cdecl Eigen::internal::triSolve(double*, double*, __int64, __int64, __int64, __int64)
- Если я переопределяю EIGEN_STRONG_INLINE на обычный встроенный (вместо __forceinline), сборка завершается успешно.
- Определение EIGEN_DONT_VECTORIZE также позволяет избежать этой проблемы.
В настоящее время я не могу воспроизвести проблему с помощью небольшого автономного проекта, поэтому для ее запуска может потребоваться давление шаблона «в масштабе проекта».
Вопросы
- Кто-нибудь видел MSVC Release + AVX-512 раздувается (компилируется или связывается с памятью) с помощью Eigen 5.x, особенно вокруг SparseLU /gemm_class / triSolve?
- Рекомендуются ли меры по смягчению последствий на стороне Eigen, помимо отключения векторизации или глобального ослабления встраивания?
- Есть Параметры MSVC/LTCG, которые здесь помогают (например, управление встраиванием/генерацией кода) или известные ограничения для AVX-512 + LTCG?
- ОС: Windows (x64)
- Компилятор: MSVC (Visual Studio) 17.14.23, c++20)
- Eigen: 3.4.1 ОК → 5.0.0 не работает (5.0.1 также не работает)
- MKL: включено () Версия: 2025.1.0.798 (То же самое поведение, что и 2025.3.1.9)
Код: Выделить всё
EIGEN_USE_MKL_ALL - Неудачная конфигурация: выпуск x64, AVX-512, /O2 /GL и ссылка /LTCG
Код: Выделить всё
/arch:AVX512 - Другие конфигурации ОК: Отладка AVX-512; Выпуск/отладка AVX/AVX2
Подробнее здесь: https://stackoverflow.com/questions/798 ... memory-whi
Мобильная версия