函数说明
线性代数运算库(Linear Algebra PACKage),通过分块、求解算法组合、多线程、BLAS接口优化等手段,基于鲲鹏架构对LAPACK的计算效率进行了优化。
LAPACK原本用Fortran语言实现并由Fortran语言调用,也可由C语言直接调用。以下采用C语法说明标准Fortran接口。
由于LAPACK部分接口会在内部分配额外的内存,且这些额外内存主要受矩阵规模及线程数大小的影响,其具体关系如表1所示(其他接口所需额外内存均小于这三类接口)。因此,在机器内存配置为256GB的典型场景下,为更好的使用优化接口,我们建议最大规模不超过45000(涉及表1中函数接口除外,其以表1中建议规模为准)。
函数 |
额外内存占用空间(单位为元素个数) |
建议最大规模(256GB机器内存) |
---|---|---|
?potri |
6400 * ldb + 640000 |
45000 |
?getri |
2000 * ldb + 40000 * 线程数 + 400000 |
45000 |
?stedc |
(n * n + 8 * n + 10000) * 线程数 + 10000000 |
18000 |
需要注意的是,当矩阵规模超过建议值时,可能调用到性能较低的接口而非优化接口,进而会导致最终使用的性能下降。换言之,若机器内存足够大,能满足额外内存的需求,则可在更大矩阵规模下获得最佳性能。
举例:以dsyevd为例,其实现需要调用dstedc接口。则在典型场景下,假定元素类型为双精度(8字节每元素),矩阵大小为18000x18000,使用96个线程,则所需内存的计算如下:
- 额外的内存占用:
((18000 * 18000 + 18000 * 8 + 10000) * 96 + 10000000) * 8 = 249,030,272,000字节(约231.9 GB)
- 必须的内存占用包含:
- 矩阵本身内存占用:18000 * 18000 * 8 = 2,592,000,000字节(约2.4GB)
- 工作数组work(6n+2n*n + 3+5n)内存占用:(1 * 6 * 18000 + 2 * 18000 * 18000 + 3 + 5 * 18000) * 8=5,185,584,024字节(约4.8GB)
故在此情形下,调用dsyevd时,共需要内存约为231.9 + 2.4 + 4.8 = 239.1GB。