---
title: 函数说明
description: "线性代数运算库（Linear Algebra PACKage），通过分块、求解算法组合、多线程、BLAS接口优化等手段，基于鲲鹏架构对LAPACK的计算效率进行了优化。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_kml_16_0204.html
sourcePath: /source/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_kml_16_0204.html
indexId: dc7cc799f02e351ab21e4074a554f248dbea79b58eb0b43194aa04a71e072ff976
---
# 函数说明

线性代数运算库（Linear Algebra PACKage），通过分块、求解算法组合、多线程、BLAS接口优化等手段，基于鲲鹏架构对LAPACK的计算效率进行了优化。

LAPACK原本用Fortran语言实现并由Fortran语言调用，也可由C语言直接调用。以下采用C语法说明标准Fortran接口。

由于LAPACK部分接口会在内部分配额外的内存，且这些额外内存主要受矩阵规模及线程数大小的影响，其具体关系如表1所示（其他接口所需额外内存均小于这三类接口）。因此，在机器内存配置为256GB的典型场景下，为更好的使用优化接口，我们建议最大规模不超过45000（涉及表1中函数接口除外，其以表1中建议规模为准）。


**表1 LAPACK额外内存使用及建议规模说明**

| 函数 | 额外内存占用空间（单位为元素个数） | 建议最大规模（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个线程，则所需内存的计算如下：

1. 额外的内存占用：
  ((18000 * 18000 + 18000 * 8 + 10000) * 96 + 10000000) * 8 = 249,030,272,000字节（约231.9 GB）

2. 必须的内存占用包含：

  - 矩阵本身内存占用：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。
