uBLAS Медленное умножение матрицы на разреженные векторы

StackOverflow https://stackoverflow.com/questions/6330936

Вопрос

Я конвертирую часть своего кода векторной алгебры, чтобы использовать оптимизированную библиотеку 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-файл содержит довольно подробное сравнение различных библиотек линейной алгебры.Я наткнулся на это в этом ответе от Computational Science Stack Exchange , который, возможно, лучше подходит для такого рода вопросов.

Не уверен, является ли это причиной замедления (вы профилировали, чтобы получить свой 4-кратный номер?), но этот цикл может быть медленным:

родовое слово

Если большая часть времени уходит на обработку циклов в вашем коде, этот дополнительный цикл может удвоить время (и не имеет ничего общего с ublas).Я бы порекомендовал вместо этого использовать std::copy:

родовое слово

Большинство компиляторов должны увидеть, что это копирование двойника, и сделать оптимальную копию, что может несколько решить вашу проблему.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top