1. 介绍

mcSOLVER库是一个基于mcBLAS和mcSPARSE库的高级软件包。 它在沐曦 MXMACA® Runtime(MXMACA Toolkit的一部分)上实现了类似 LAPACK 的功能,例如稠密矩阵的常用矩阵分解和三角求解例程、稀疏最小二乘法求解器和特征值求解器等。 包括两个模块,对应两个API集合:

  1. 在单GPU上的 mcSOLVER API

  2. 在单节点多GPU上的 mcsolverMG API

mcsolverMG适用于多GPU应用程序。它在当前版本不受支持。

mcSOLVER将三个独立的组件整合到了统一的框架下。 mcSOLVER的第一部分叫做mcsolverDN,主要用于处理稠密矩阵分解和求解例程,例如LU分解、QR分解、SVD分解和LDLT分解,mcSOLVER还提供了一些有用的工具函数,如矩阵和向量置换。 其次,mcsolverSP基于稀疏QR分解方法(sparse QR factorization)提供了一组新的稀疏例程(sparse routines)。 由于在因式分解中,并不是所有矩阵都具有适合并行处理(parallelism)的良好稀疏性模式(sparsity pattern),所以mcsolverSP库还提供了处理类顺序矩阵(sequential-like matrices)的CPU路径。对于那些具有高并行性的矩阵,这种GPU路径将提供更高的性能。 最后一部分是 mcsolverRF,这是一个稀疏重因式分解(sparse re-factorization)软件包,在解决一系列具有相同稀疏性模式但系数变化的矩阵时可以提供非常好的性能。

当前版本暂不支持mcsolverSp和mcsolverRf。

1.1. mcsolverDN:Dense LAPACK

mcsolverDN库被设计用于求解形如以下的稠密线性系统(dense linear systems)

\[Ax=b \]

其中系数矩阵 \(A \in R^{nxn}\) ,右端向量 \(b \in R^{n}\) 和结果向量 \(x \in R^{n}\)。 mcsolverDN库提供了QR分解(QR factorization)和使用部分主元消元法(partial pivoting)的LU分解以处理可能是非对称的一般矩阵 A 。 Cholesky分解(Cholesky factorization)也用于对称/厄米特矩阵(symmetric/Hermitian matrices)。 对于对称不定矩阵(symmetric indefinite matrices),我们提供了Bunch-Kaufman(LDL)分解。

mcsolverDN库还提供了非常有用的双对角化例程(bidiagonalization routine)和奇异值分解(singular value decomposition, SVD)。

mcsolverDN库主要面向LAPACK中广受欢迎的计算稠密型(computationally-intensive)例程,而且提供了与LAPACK兼容的API。 用户可以使用mcsolverDN加速这些耗时的例程,其他例程继续在LAPACK中,无需对现有代码进行重大修改。

1.2. 命名约定(Naming Conventions)

mcsolverDN库提供两个不同的API: legacygeneric

传统 API 中的函数支持 float, double, mcComplexmcDoubleComplex 这些数据类型。 传统 API 的命名约定如下:

mcsolverDn<t><operation>

<t> 可以是 S, D, C, Z, 或 X, 分别对应数据类型 float, double, mcComplex, mcDoubleComplex, 和通用类型。 <operation> 可以是 Cholesky分解 (potrf), 使用部分主元消元法的 LU分解 (getrf), QR分解 (geqrf) 和 Bunch-Kaufman 分解 (sytrf)。

通用 API 中的函数为每个例程提供了单一的入口点,并支持使用 64 位整数定义矩阵和向量维度。 通用 API 的命名约定与数据无关,并遵循以下规则:

mcsolverDn<t><operation>

<operation> 可以是 Cholesky分解 (potrf) ,使用部分主元消元法的 LU分解 (getrf) 和QR分解 (geqrf)。

1.3. 异步执行(Asynchronous Execution)

mcsolver库函数倾向于尽可能保持异步执行。 开发人员可以始终使用 mcDeviceSynchronize() 函数来确保特定的mcSOLVER库例程已执行完成。

开发人员还可以通过 mcMemcpy() 例程,分别使用 mcMemcpyDeviceToHostmcMemcpyHostToDevice 参数,将数据从设备复制到主机,或者从主机复制到设备。 在这种情况下,不需要添加对 mcDeviceSynchronize() 的调用,因为使用上述参数调用 mcMemcpy() 是阻塞的,只有当结果在主机上准备好后才会完成。

1.4. 库属性

libraryPropertyType 数据类型是库属性数据类型的枚举。(例如 MXMACA 版本 X.Y.Z 会产生 MAJOR_VERSION=X, MINOR_VERSION=Y, PATCH_LEVEL=Z

typedef enum libraryPropertyType_t
{
        MAJOR_VERSION,
        MINOR_VERSION,
        PATCH_LEVEL
} libraryPropertyType;

以下代码可以显示 mcSOLVER 库的版本。

int major=-1,minor=-1,patch=-1;
mcsolverGetProperty(MAJOR_VERSION, &major);
mcsolverGetProperty(MINOR_VERSION, &minor);
mcsolverGetProperty(PATCH_LEVEL, &patch);