Выпуск MSVC + AVX-512 Eigen 5.0.0 с EIGEN_USE_MKL_ALL не хватает памяти при связывании с LTCG (SparseLU/принудительная вC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Выпуск MSVC + AVX-512 Eigen 5.0.0 с EIGEN_USE_MKL_ALL не хватает памяти при связывании с LTCG (SparseLU/принудительная в

Сообщение Anonymous »

Я поддерживаю большой проект C++, который использует Eigen для решения больших разреженных систем (через SparseLU) и других плотных операций.
Что изменилось
Я обновил 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 минут)
Я компилирую с включенной полной поддержкой MKL: EIGEN_USE_MKL_ALL
Симптомы
В неудачной конфигурации (Выпуск + 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: включено (

    Код: Выделить всё

    EIGEN_USE_MKL_ALL
    ) Версия: 2025.1.0.798 (То же самое поведение, что и 2025.3.1.9)
  • Неудачная конфигурация: выпуск x64, AVX-512

    Код: Выделить всё

    /arch:AVX512
    , /O2 /GL и ссылка /LTCG
  • Другие конфигурации ОК: Отладка AVX-512; Выпуск/отладка AVX/AVX2


Подробнее здесь: https://stackoverflow.com/questions/798 ... memory-whi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»