memory - 当我增加稀疏矩阵的大小时,SuperLU dgstrf 返回内存分配失败

标签 memory fortran

我正在创建一个 FEA 程序,我正在处理 290-96 千平方或 27-90 亿个元素的矩阵。这些矩阵在很大程度上是稀疏的,所以我使用 SuperLU 来解决它们。我已经能够成功地使用 SuperLU 来解决这个问题,该问题与较小矩阵的验证数据相当匹配。但是,随着我增加矩阵的大小,SuperLU 的 dgstrf 函数输出的信息值大约为 9 亿(一次为 914459273,另一次为 893813121)。

文档说这个信息值是“发生内存分配失败时分配的字节数,加上 A->ncol”。但是,这并没有提供有关如何解决此错误的任何信息。在这种情况下是什么限制了内存?图书馆是否限制了内存?它是硬编码到库中还是在编译期间确定?编译我的 Fortran 代码时内存是否有限?

我正在用 Fortran 编写代码,并使用预构建的 c_fortran_dgssv.c 文件与 SuperLU 链接。该文件确实允许系统“通过系统 malloc 在内部分配空间”(lwork=0)。这是我可以改变的东西,以便有更多的空间。

我使用与 fortran 示例类似的调用来调用代码。

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)

最佳答案

您的矩阵太大而无法使用直接(即基于因式分解)的求解器。直接求解器创建大量新的非零元素;这会导致程序耗尽 RAM。迭代求解器是唯一的解决方案;这里的讨论空间太小,您可能有兴趣在以下博客中查看更多详细信息(并在那里提出任何问题):http://comecau.blogspot.com/2018_09_05_archive.html

关于memory - 当我增加稀疏矩阵的大小时,SuperLU dgstrf 返回内存分配失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52894029/

相关文章:

c++ - 如何正确地覆盖从注入(inject)的 DLL 加载到内存中的指令?

ios - 在循环中重复分配 NSString 同时避免内存泄漏

php - php中允许的内存大小为33554432字节耗尽(尝试分配93字节)错误

dependencies - CMake Fortran 依赖检查

c++ - BLAS 是如何获得如此极致的性能的?

php - 使用 PHPExcel 将 XLS 文件中的单个工作表转换为 CSV - 内存耗尽

c - memmove 是否为其临时数组使用动态内存

class - 如何覆盖用户定义的I/O过程?

fortran - fortran中使用openmp并行创建稀疏矩阵

performance - 矩阵的行主要与列主要布局