SuperLU dgstrf возвращает ошибку выделения памяти при увеличении размера моей разреженной матрицы - PullRequest
0 голосов
/ 19 октября 2018

Я создаю программу ВЭД и имею дело с матрицами порядка 290-96 тысяч квадратных или 27-9 миллиардов элементов.Эти матрицы в значительной степени редки, поэтому я использую SuperLU для их решения.Мне удалось успешно использовать SuperLU для решения проблемы, которая достаточно хорошо совпала с данными валидации с меньшими матрицами.Однако, когда я увеличиваю размер моих матриц, функция SuperLU dgstrf выводит информационное значение примерно 900 миллионов (914459273 один раз, 893813121 другой).

В документации говорится, что это информационное значение равно «числу байтов».выделяется при сбое выделения памяти, плюс A-> ncol. "Однако это не дает никакой информации о том, как работать с этой ошибкой.Что ограничивает память в этом случае?Библиотека ограничивает память?Это жестко закодировано в библиотеке или определяется во время компиляции?Ограничена ли память при компиляции моего кода на Фортране?

Я пишу свой код на Фортране и использую предварительно созданный файл c_fortran_dgssv.c для связи с SuperLU.Этот файл позволяет системе «распределять пространство внутри системы с помощью malloc» (lwork = 0).Это то, что я мог бы изменить, чтобы иметь больше места.

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

nrhs = 1
ldb = Dim3DFull
iopt = 1
call c_fortran_dgssv(iopt,Dim3DFull,TotalNonZeroElements_BCs,nrhs, &
    Global_Matrix_T_Value_BC_CSC,Global_Matrix_T_Row_BC_CSC, &
    Global_Matrix_T_Col_BC_CSC,Global_Temp,ldb,factors,info)
if (info .eq. 0) then
    write (*,*) 'Factorization succeeded'
else
    write(*,*) 'INFO from factorization = ', info
endif
!Second, solve the system using the existing factors.
iopt = 2
call c_fortran_dgssv(iopt,Dim3DFull,TotalNonZeroElements_BCs,nrhs, &
    Global_Matrix_T_Value_BC_CSC,Global_Matrix_T_Row_BC_CSC, &
    Global_Matrix_T_Col_BC_CSC,Global_Temp,ldb,factors,info)
if (info .eq. 0) then
    write (*,*) 'Solve succeeded'
else
    write(*,*) 'INFO from triangular solve = ', info
endif
!Last, free the storage allocated inside SuperLU
iopt = 3
call c_fortran_dgssv(iopt,Dim3DFull,TotalNonZeroElements_BCs,nrhs, &
    Global_Matrix_T_Value_BC_CSC,Global_Matrix_T_Row_BC_CSC, &
    Global_Matrix_T_Col_BC_CSC,Global_Temp,ldb,factors,info)

1 Ответ

0 голосов
/ 24 октября 2018

Ваша матрица слишком велика, чтобы использовать прямой (т.е. основанный на факторизации) решатель.Прямые решатели создают огромное количество новых ненулевых элементов;что приводит к тому, что программе не хватает оперативной памяти.Итеративный решатель является единственным решением;здесь слишком мало места для обсуждения, вам может быть интересно увидеть более подробную информацию в следующем блоге (и задать там также любые вопросы): http://comecau.blogspot.com/2018_09_05_archive.html

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