基于GPU的批量QR分解:设计、优化与调优
1. 引言与相关工作
在稠密线性代数领域,批量例程可对一批相对较小的矩阵执行标准线性代数算法,这与处理单个大矩阵的工作负载有很大不同。多年来,许多软件包,如LAPACK、PLASMA、MAGMA、BLIS和Intel的MKL,主要服务于处理单个大矩阵的工作负载。而批量工作负载是近年来才受到众多科学领域的广泛关注,其应用包括量子化学、稀疏直接求解器、天体物理学和信号处理等。如今,Intel的MKL、NVIDIA的cuBLAS和AMD的hipBLAS等供应商软件库也为多个BLAS和LAPACK操作提供了许多批量例程。
在GPU上进行批量例程的性能优化需要不同的思路。由于处理的是小矩阵,尽可能减少内存流量至关重要。例如,对于能完全放入GPU寄存器文件的非常小的矩阵,完全展开和无分块的内核可以实现优于其他方法的性能。但对于相对较大的矩阵,为了在不同尺寸范围内保持高性能,需要做出不同的假设。
2. 算法背景
QR分解将一个稠密矩阵$A_{m×n}$分解为$Q_{m×m} × R_{m×n}$的乘积,其中$Q$是正交矩阵,$R$是上三角矩阵,且假设$m ≥ n$。标准的LAPACK实现不会显式计算$Q$,完成分解后,矩阵$A$会被矩阵$V$和$R$覆盖。矩阵$V$是单位对角的下三角矩阵(不存储),每一列$v_i$代表一个基本的Householder反射器$H_i = I - τ_iv_iv_i^T$,其中$τ$是一个标量(单独存储),$Q$因子可计算为$Q = \prod_{i} H_i$。
标准的LAPACK实现(双精度下为dgeqrf例程)有两种主要的构建块:dgeqr2和dgeqrf。dgeqr2是
超级会员免费看
订阅专栏 解锁全文
1706

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



