Собственный максимальный размер матрицы для 32-битных приложений - PullRequest
3 голосов
/ 10 августа 2010

Итак, я обнаружил, что пакет Eigen вылетает, когда я пытаюсь объявить матрицу размером более 10000x10000. Мне нужно объявить матрицу, как это .. около 13000x13000 элементов надежно. Я провел тест, как:

for( int tortureEigen = 1 ; tortureEigen < 50000 ; tortureEigen++ )
{
  printf( "Torturing Eigen with %dx%d..\n", tortureEigen, tortureEigen ) ;
  Eigen::MatrixXd m( tortureEigen, tortureEigen ) ;
}

Сбои на моей машине (6 ГБ ОЗУ) при 14008 элементах.

Я немного разочарован! Я думал, что Eigen был похож на MATLAB или октаву и не должен падать, используя большие массивы, даже если он попадает на диск или что-то еще ...

И более того, когда я запускаю этот тест и держу TaskMan открытым, процесс, который создает эти матрицы, даже не использует столько памяти. TaskMan сообщает при использовании 2k.

Использование стабильной версии Eigen 2.0.15

Ответы [ 4 ]

5 голосов
/ 11 августа 2010

Собственный разработчик здесь.Вам было бы гораздо лучше задавать вопросы Eigen на наших каналах поддержки, например на форуме ...; -)

Краткий ответ: вы используете матрицы фиксированного или динамического размера?

  • если фиксированный размер, переключитесь на динамический размер (для таких огромных размеров это все равно просто)

  • если вы получаете ошибку с матрицами динамического размераЯ удивлен, но в то же время я вижу, откуда берется значение 10000.В любом случае, если вы обновитесь до eigen3 (ветка разработки), ваша проблема исчезнет.

4 голосов
/ 14 августа 2010

Все ответы здесь полезны!

Оказывается, что при компиляции как 32-битное приложение, Eigen вылетит, если вы попытаетесь объявить плотный MatrixXd , как я, больше, чем 14000 элементов или около того. Сбой происходит при _aligned_malloc, возвращающем 0 в коде Eigen alloc (MatrixXd :: resize ()), что означает, что 1,5 ГБ непрерывной, выровненной ОЗУ не может быть выделено под 32-битной, что имеет смысл , так как это приближается к половине максимальной адресуемой памяти loc. Полагаю, что найти более 1,5 ГБ смежных из 4,0 очень маловероятно! К сожалению, обновление до Eigen 3.0 не не решит проблему.

Решение № 1

Хорошо, тогда я скомпилировал 64-битную версию, и на моем компьютере с 6 ГБ программа успешно работает, а плотное распределение MatrixXd и решение работают просто отлично.

Решение № 2

Другое решение использует DynamicSparseMatrix<double>. Sparse не дает сбой при выделении огромного размера, даже как 32-битное приложение, но поддержка API для решения - это другая история (API, кажется, хочет преобразовать в плотный тип MatrixXd для решения, что оставляет нас с той же исходной проблемой.)

1 голос
/ 10 августа 2010

Учитывая характеристики вашего аппаратного обеспечения, я могу предположить, что вы работаете только на 64-битной ОС.

Вы все еще можете потерпеть крах, даже если память выгружается в файл подкачки. Это может означать, что память фрагментирована или файл вашей страницы все еще слишком мал. Если это так, вам следует увеличить размер файла подкачки до 8 или 12 ГБ или около того.

1 голос
/ 10 августа 2010

Out of Eigen doc:

Плотный или разреженный: этот класс Matrix обрабатывает плотные, не разреженные матрицы и векторы.Для разреженных матриц и векторов см. Модуль Sparse.
Плотные матрицы и векторы представляют собой обычные обычные массивы коэффициентов.Все коэффициенты хранятся в обычном непрерывном массиве.Это отличается от разреженных матриц и векторов, где коэффициенты хранятся в виде списка ненулевых коэффициентов.

Давайте посмотрим, 10000x10000x8 (двойная матрица) составляет около 1,5 ГБ.Можно ожидать, что это максимальный размер непрерывного блока кучи под 32-битной ОС.Попробуйте разреженные матрицы.

Если вам действительно нужны такие большие плотные матрицы, то у вас есть ряд других проблем: Закончатся ли вычисления до следующего отключения электроэнергии?

...