Intel MKL 稀疏矩阵求解PARDISO 函数
来源:互联网 发布:康有为 梁启超 知乎 编辑:程序博客网 时间:2024/05/14 06:27
Intel MKL提供了针对稀疏矩阵求解的PARDISO 接口,它是在共享内存机器上,实现的稀疏矩阵的直接求解方法,对于一些大规模的计算问题, PARDISO的算法表现了非常好的计算效率与并行性。一些数值测试表明,随着计算节点数目增加, PARDISO具有接近线性的加速比例。
PARDISO对应求解过程包括如下步骤:
1. 矩阵重排与符号分解(Reordering and Symbolic Factorization):PARDISO Solver根据不同的矩阵类型,计算不同类型的行列交换矩阵P与对角矩阵D,对A矩阵进行交换重排。新得到的矩阵分解后会包括尽量少的非零元素。
2. 矩阵LU 分解: 对 进行 LU 分解。
3. 方程求解与迭代:根据LU分解的结果,求解方程,如果对结果的精度有进一步要求,使用迭代法进一步提高解精度。
4. 迭代结束,释放计算过程的内存。
使用PARDISO 的时候,可能会有一些常见的问题:
第一,Paridso 提示内存不足:
出现这类问题的时候,可以首先检查一下Pardiso 对求解该问题的内存需求,Paridiso计算时,可以通过下面的数据求得:
max(iparm(15), iparm(16)+iparm(17))
可以对比一下这个数据,查看系统的内存是否满足需求。
Paridso 同时支持,in-core 与 out-of-core的计算。 如果, 计算的数据太大,而不能完全在内存求解的时候,可以的使用out-of-core 的pardiso(设置 iparm(60) 参数)。 Out-of-core 的计算会将中间计算数据保存于硬盘上,从而能够解决一些大的计算问题。
实际中,还常常遇到的一个问题是,许多应用是32位的程序, 这样,即使使用out-of-core 的pardiso来求解,仍然会受到32位的地址空间的限制。 如果计算数据非常的大,需要改写为64 位的计算程序。
第二,检查输入数据的合法性:
使用Pardiso 在进行计算的时候,常常会出现中间计算错误。由于Pardiso采用CSR格式的压缩存储的矩阵。 很多情况下,计算错误是由于输入了不合法的计算数据而导致。对于这类问题,可以在调用Pardiso 的时候, 进行输入数据的检查(设置iparm(27) 的参数), Paridso如果发现输入数据的错误,会给出错误提示。这类检查,可以帮助发现一些简单的,特别是与输入数据的索引相关的输入错误。
第三,使用缺省参数:
Pardiso 中提供了丰富的输入参数选项。 用户在调用的时候,需要确保正确的输入参数。 很多在计算过程中发生的错误,往往与不正确的输入参数相关。 一个常用的检查方法是输入缺省的paridso 的参数(iparm(1) =0),Paridso 使用缺省参数进行计算,来检验程序的正确性。
第四,在C/C++语言的调用Pardiso:
在Intel MKL 函数手册中, Pardiso 相关参数的说明是以Fortran语言的形式给出。 如果我们在C/C++语言中,调用Pardiso 函数,需要注意输入数据的数组下标。 C语言中对应的数组下标是从0开始,程序中对应于Fortran的下标需要减一(比如,手册中提到,iparm(10)的参数,在C程序中,需要写为 iparm[9]).
PARDISO对应求解过程包括如下步骤:
1. 矩阵重排与符号分解(Reordering and Symbolic Factorization):PARDISO Solver根据不同的矩阵类型,计算不同类型的行列交换矩阵P与对角矩阵D,对A矩阵进行交换重排。新得到的矩阵分解后会包括尽量少的非零元素。
2. 矩阵LU 分解: 对 进行 LU 分解。
3. 方程求解与迭代:根据LU分解的结果,求解方程,如果对结果的精度有进一步要求,使用迭代法进一步提高解精度。
4. 迭代结束,释放计算过程的内存。
使用PARDISO 的时候,可能会有一些常见的问题:
第一,Paridso 提示内存不足:
出现这类问题的时候,可以首先检查一下Pardiso 对求解该问题的内存需求,Paridiso计算时,可以通过下面的数据求得:
max(iparm(15), iparm(16)+iparm(17))
可以对比一下这个数据,查看系统的内存是否满足需求。
Paridso 同时支持,in-core 与 out-of-core的计算。 如果, 计算的数据太大,而不能完全在内存求解的时候,可以的使用out-of-core 的pardiso(设置 iparm(60) 参数)。 Out-of-core 的计算会将中间计算数据保存于硬盘上,从而能够解决一些大的计算问题。
实际中,还常常遇到的一个问题是,许多应用是32位的程序, 这样,即使使用out-of-core 的pardiso来求解,仍然会受到32位的地址空间的限制。 如果计算数据非常的大,需要改写为64 位的计算程序。
第二,检查输入数据的合法性:
使用Pardiso 在进行计算的时候,常常会出现中间计算错误。由于Pardiso采用CSR格式的压缩存储的矩阵。 很多情况下,计算错误是由于输入了不合法的计算数据而导致。对于这类问题,可以在调用Pardiso 的时候, 进行输入数据的检查(设置iparm(27) 的参数), Paridso如果发现输入数据的错误,会给出错误提示。这类检查,可以帮助发现一些简单的,特别是与输入数据的索引相关的输入错误。
第三,使用缺省参数:
Pardiso 中提供了丰富的输入参数选项。 用户在调用的时候,需要确保正确的输入参数。 很多在计算过程中发生的错误,往往与不正确的输入参数相关。 一个常用的检查方法是输入缺省的paridso 的参数(iparm(1) =0),Paridso 使用缺省参数进行计算,来检验程序的正确性。
第四,在C/C++语言的调用Pardiso:
在Intel MKL 函数手册中, Pardiso 相关参数的说明是以Fortran语言的形式给出。 如果我们在C/C++语言中,调用Pardiso 函数,需要注意输入数据的数组下标。 C语言中对应的数组下标是从0开始,程序中对应于Fortran的下标需要减一(比如,手册中提到,iparm(10)的参数,在C程序中,需要写为 iparm[9]).
0 0
- Intel MKL 稀疏矩阵求解PARDISO 函数
- 基于 intel MKL 的对称矩阵特征值求解器
- Intel MKL基础(3)MKL函数分类
- Intel MKL基础(3)MKL函数分类
- VS2012上使用intel mkl矩阵
- INTEL MKL中的矩阵特征值和特征向量函数的调用和测试
- mkl中dsytri求解矩阵的逆
- mkl中dsytri求解矩阵的逆
- 比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- CUDA的cublas 和 Intel的MKL 矩阵运算对比
- Visual Studio下实现Eigen+Intel MKL的矩阵乘法
- 比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能
- Matlab 稀疏矩阵函数
- mkl中dgeev求解矩阵的特征向量和特征值
- 使用MKL求解矩阵的行列式值与逆
- Ubuntu下使用cholmod求解稀疏矩阵
- 使用UMFPACK求解大型稀疏矩阵方程
- 稀疏矩阵求解的一点总结
- 二进制中1的个数
- SRM 516 NetworkXMessageRecovery
- 网关和游戏服务器的概念
- spring data rest1
- 从零使用QEMU模拟器搭建ARM运行环境
- Intel MKL 稀疏矩阵求解PARDISO 函数
- ELK(ElasticSearch+Logstash+ Kibana)搭建实时日志分析平台
- 1029. Median
- HDU - 1150 最小顶点覆盖
- 基于Openembedded开发环境打内核补丁
- 2016总结
- postgresql
- 1.0 算法本机调试方法
- Android 开发软件架构思考以及经验总结