Предварительное выделение памяти для разреженных матричных операций в Eigen - PullRequest
0 голосов
/ 17 октября 2019

Я пишу программу, использующую Eigen (если быть точным оптимизатором), которая имеет «горячую петлю», внутри которой я бы хотел избежать выделения памяти, когда это возможно.

При использовании Eigen / Dense IМне удалось организовать вещи так, чтобы все мое выделение памяти выполнялось в конструкторе (с разумным использованием .noalias () и факторизаций LLT на месте) путем вычисления размеров всех рабочих областей, которые мне нужны, заранее и предварительного выделения.

Я бы хотел сделать что-то похожее с собственным / разреженным вариантом кода (насколько это возможно). Конструктор потребует от пользователя предоставить шаблоны разреженности для всех данных, которые я могу использовать для определения размеров и шаблонов разреженности для всех последующих необходимых мне матриц, включая рабочие пространства. Мне нужно выполнить 4 вида операций:

  1. Разреженные матрично-векторные произведения
  2. Разложения Холецкого
  3. Дополнения Шура вида E = H + A '* B* A, где B - диагональная матрица, а H, A - общие разреженные матрицы.

В настоящее время я понимаю следующее:

  • Я могу использовать x.noalias ()= A * y (A - разреженные, x, y плотные векторы) для матричных векторных произведений без проблем
  • Я могу выполнить матричное сложение, используя приемы с коэффициентами, заполнив их явными нулями, как, например, Какчтобы избежать выделения памяти в разреженных выражениях с Eigen . Это в основном для таких операций, как B = A + s I, где A разрежено, а sI - скалярное кратное тождественности. Я могу просто убедиться, что главная диагональ включена в шаблон разреженности B и выполнить сложение в цикле.
  • Начиная с 2017 года, нет способа избежать временного распределения в продуктах с разреженной матрицей, например, C = A * B (https://forum.kde.org/viewtopic.php?f=74&t=140031&p=376933&hilit=sparse+memory#p376933),, и я пока не вижу никаких встроенных функций для разреженных матриц, поэтомуМне придется прикусить этот пункт и принять временное создание.
  • По причинам лицензирования я использую пакет факторизации собственного внешнего ЛПНП, который позволяет мне предварительно распределяться на основе этапа символического анализа.

Может ли кто-нибудь предложить быстрый способ организации вычисления Шура E = H + A '* B * A? (Используя заранее известную мне структуру разреженности)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...