线性代数算法的演进:从 LAPACK 到多线程优化
1. LAPACK 代码生产力与递归 LU 算法
1.1 LAPACK 代码生产力探讨
在编写和阅读 LAPACK 代码的生产力方面,目前尚无定论。从数学描述生成代码的难度是一个值得探讨的问题。与 LAPACK 的矩阵公式相比,LINPACK 中使用的向量符号可能更自然。仅使用矩阵来描述算法的数学公式通常比混合向量 - 矩阵符号更复杂。
1.2 LAPACK 的 LU 算法问题
LAPACK 的 LU 算法在设置块大小参数时,起初看似简单,但实际上,对于不同的精度和矩阵大小,需要进行大量的调整。许多用户最终选择不更改设置,即使这种调整只需在安装时进行一次。此外,LAPACK 的 LU 算法中的 DGETF2 例程在处理高而窄的列面板时,使用了 Level - 1 BLAS,随着 20 世纪 90 年代处理器速度的提升,而内存带宽没有相应增加,这成为了一个瓶颈。
1.3 递归 LU 算法的出现
递归 LU 算法是一种解决方案,它采用分治法递归的思想。与 LAPACK 的循环结构不同,新的递归 LU 算法将工作分成两半,对矩阵的左半部分进行分解,更新矩阵的其余部分,然后对右半部分进行分解。这种方法将 Level - 1 BLAS 的使用减少到可接受的最低限度,并且大多数对 Level - 3 BLAS 的调用操作的矩阵部分比 LAPACK 算法更大。此外,不再需要调整块大小。
递归 LU 算法需要使用 Fortran 90,它是第一个允许递归子例程的 Fortran 标准。使用 Fortran 90 的一个副作用是 LDA 参数(A 的领先维度)的重要性增加。L
超级会员免费看
订阅专栏 解锁全文
89

被折叠的 条评论
为什么被折叠?



