Аномальное потребление памяти в разреженной блочной матрице Trilinos - PullRequest
1 голос
/ 05 марта 2011

Я создаю приложение на основе распределенной линейной алгебры с использованием Трилино , основная проблема заключается в том, что потребление памяти намного выше, чем ожидалось.

Я создал простой тестовый пример для создания Epetra :: VbrMatrix с 1,5 миллионами пар, сгруппированных в 5 миллионов блоков по 3 пары, что должно быть около 115 МБ.

После построения матрицы на 2 процессорах, по половине данных каждый, я получаю потребление памяти 500 МБ на каждом процессоре, что примерно в 7,5 раз больше данных, для меня это выглядит неоправданно, матрица должна просто иметь несколько целочисленных массивов для определения местоположения. ненулевые блоки.

Я спросил в списке рассылки trilinos-users, они говорят, что использование памяти выглядит слишком высоким, но надеюсь, что здесь вам помогут.

Я тестировал как на своем ноутбуке с Ubuntu + gcc 4.4.5 + Trilinos 10.0, так и на кластере с компилятором PGI и Trilinos 10.4.0, результат примерно одинаков.

Мой тестовый код находится в gist https://gist.github.com/848310,, где я также записал потребление памяти на разных этапах моего тестирования с 2 процессами MPI на моем ноутбуке.

Если у кого-нибудь есть предложения, которые были бы действительно полезны. Также, если бы вы могли просто создавать, запускать и сообщать о потреблении памяти, это было бы здорово.

1 Ответ

2 голосов
/ 31 марта 2011

ответ Алана Уильямса из списка пользователей trilinos, короче говоря, VBRmatrix не подходит для таких маленьких блоков, так как объем памяти больше, чем сами данные:

Определенно формат хранения VbrMatrixЭто связано с некоторыми дополнительными затратами на хранение по сравнению с простым числом хранимых значений двойной точности.

В вашей программе хранится 5 000 000 X 1 X 3 == 15 миллионов удвоений.С 8 байтами на удвоение, что составляет 120 миллионов байтов.

Матричный класс Epetra_VbrMatrix (который является базовым классом для Epetra_FEVbrMatrix) внутренне хранит объект Epetra_CrsGraph, который представляет структуру разреженности.Для этого требуется пара целых чисел на строку блока и 1 целое на ненулевой блок.(В вашем случае 5 миллионов блочных строк с 1 ненулевым блоком на строку, итого минимум 15 миллионов целых чисел.)

Кроме того, класс Epetra_VbrMatrix хранит объект Epetra_SerialDenseMatrix для каждого ненулевого блока.Это добавляет пару целых чисел, а также bool и указатель для каждого ненулевого блока.В вашем случае, поскольку ваши ненулевые блоки малы (1x3 удваивается), это существенные накладные расходы.Формат VbrMatrix пропорционально меньше накладных расходов, чем больше ваши ненулевые блоки.Но в вашем случае, с блоками 1x3, VbrMatrix действительно занимает в несколько раз больше памяти, чем требуется для 15 миллионов удвоений.

...