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

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

当前，Netlib LAPACK标准定义了2000多个LAPACK接口规范，包括接口名称、参数列表和功能说明。鲲鹏HPCKit已对其中的200余个接口进行了优化，具体清单请参见表1。其余接口将在后续版本中通过统一打包为完整的LAPACK函数库发布。目前社区文档中仅包含已优化的200多个接口说明，其余接口的文档请参见Netlib LAPACK文档(https://netlib.org/lapack/explore-html/d9/d8b/group__lapack__top.html)。

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。
