函数说明
线性代数运算库(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。