1033257950 发表于 2023-2-15 10:53:19

MKL库GETRS函数access violation问题

求助各位大佬,我现在需要进行一个大型线性方程组求解,系数矩阵的维度为(N*N=34000*34000),使用的类型是REAL(kind=4),在调用MKL库GETRS函数的时候出现access violation问题,请问怎么解决?堆栈上限已经调到最大,数组也都是动态数组,使用的代码也没有问题,因为降低数组维度后(N=500)可以成功计算。另外,在计算时监控了CPU的温度,发现几乎不变,而在matlab上使用LU分解求解+左除矩阵时运行时,CPU占用率和温度都会有大幅升高,这是否也能说明一些问题。
调用代码如下,A_1为系数矩阵,B_1为右端项

CALL GETRF(A_1,IPIV,INFO)   !LU分解
CALL GETRS(A_1,IPIV,B_1)!A_1,B_1均被覆盖
P.S:同一个系数矩阵我需要解个不同的右端项,上述只是其中一个,GETRS函数是不是可以解多列右端项,请大佬们指点一下




1033257950 发表于 2023-2-16 07:31:01

已解决,改用单精度SGETRF和SGETRS函数后可以正常运行。CPU占用率低是因为没有打开MKL库的并行模式,在项目-属性-Fortran-Libraries-Use Intel Math Kernel Library 中选择Paralle即可

cqflhl 发表于 2023-4-28 12:10:19

1033257950 发表于 2023-2-16 07:31
已解决,改用单精度SGETRF和SGETRS函数后可以正常运行。CPU占用率低是因为没有打开MKL库的并行模式,在项目 ...

我用ggevx求特征值及向量也碰到同样的问题, REAL8, 阶数<=100可以求解, 超过了在调试状态下也可求.
按你的方法改成sggevx, 报错, 好像这个函数只能在F77下使用,
如果用REAL4, 但仍然用ggevx, 提示错误        1       error #6285: There is no matching specific subroutine for this generic subroutine call.   

之所以用双精度, 因为以前在CVF+IMSL的时候发现双精度和单精度求解的结果相差非常大, 可以说单精度得到的结果是错误的       

cqflhl 发表于 2023-4-28 12:15:07

堆栈我一般只设置reserve size 1000000000
按你的设置commit size 1000000000
结果直接报错
OMP: Warning #2: Cannot open message catalog "2052\libiomp5ui.dll":
OMP: System error #126: 找不到指定的模块。
OMP: Info #3: Default messages will be used.
OMP: Error #136: Cannot create thread.
OMP: System error #8: 内存资源不足,无法处理此命令。
页: [1]
查看完整版本: MKL库GETRS函数access violation问题