uBLAS Медленное умножение матрицы на разреженные векторы
-
27-10-2019 - |
Вопрос
Я конвертирую часть своего кода векторной алгебры, чтобы использовать оптимизированную библиотеку boost uBLAS.Однако, когда я попытался выполнить умножение SymmetricMatrix-SparseVector, я обнаружил, что он примерно в 4 раза медленнее, чем моя собственная реализация.Размер вектора обычно составляет около 0-500, и около 70-80% записей равны нулю.
Вот мой код
родовое словоsparseVectorIndexes хранит индексы ненулевых значений входного вектора, vectorLength - это длина вектора, а sparseLength - количество ненулевых значений в векторе.Матрица хранится как симметричный матричный кодовый код.
Моя собственная реализация представляет собой простую итерацию вложенного цикла, где матрица представляет собой просто двумерный двойной массив:
родовое слово}
Почему uBLAS в 4 раза медленнее?Я неправильно пишу умножение?Или есть другая библиотека, более подходящая для этого?
РЕДАКТИРОВАТЬ: Если вместо этого я использую плотный векторный массив, uBLAS будет только в 2 раза медленнее ...
Решение
uBlas не создавался для достижения первой цели.Есть библиотеки, которые значительно быстрее, чем uBlas.См. Например http://eigen.tuxfamily.org/index.php?title=Benchmark
Другие советы
Этот PDF-файл содержит довольно подробное сравнение различных библиотек линейной алгебры.Я наткнулся на это в этом ответе от
Не уверен, является ли это причиной замедления (вы профилировали, чтобы получить свой 4-кратный номер?), но этот цикл может быть медленным:
родовое слово Если большая часть времени уходит на обработку циклов в вашем коде, этот дополнительный цикл может удвоить время (и не имеет ничего общего с ublas).Я бы порекомендовал вместо этого использовать std::copy
:
Большинство компиляторов должны увидеть, что это копирование двойника, и сделать оптимальную копию, что может несколько решить вашу проблему.