代码之美:从算法实现到实际应用
1. 多线程算法与误差分析
在多线程算法中,主循环会让每个线程依次遍历每个面板。若有必要,所属线程会对面板进行分解,而其他线程(若在更新时恰好需要此面板)则需等待。前瞻逻辑嵌套在循环内,它替代了先前算法中的 DGEMM 或 PDGEMM。每个线程在更新其面板前,会检查是否可对首个未分解的面板进行分解,以此减少线程等待次数,消除潜在瓶颈。
多线程版本虽不如某些版本优雅,但性能是关键考量。随着核心数量增加,传统代码效率会降低,因此在相关层面直接控制执行线程至关重要,并行性不能仅封装在库调用中。不过,该代码不像 ScaLAPACK 那样复杂,高效的 BLAS 仍能发挥作用。
误差分析方面,所有算法的数值特性很关键。为提升性能牺牲优雅是可接受的,但数值稳定性是算法正确性的内在要求,不可牺牲。尽管不同代码片段对相同输入可能无法产生完全相同的输出,但所有算法本质相同。
误差可用公式 $ ||r||/||A|| ≤ ||e|| ≤ ||A^{-1}|| ||r|| $ 表示,其中误差 $ e = x – y $ 是计算解 $ y $ 与正确解 $ x $ 的差值,$ r = Ay – b $ 是“残差”。该公式表明,误差大小取决于矩阵 $ A $ 的质量。若矩阵在数值上接近奇异,算法结果可能不准确;否则,可得到较好结果。
所有版本的算法操作计数相同,均执行 $ 2/3n^3 $ 次浮点乘法和/或加法,只是操作顺序不同。部分算法会增加浮点运算量以节省内存或网络传输,由于这些算法操作计数相同,可通过计算速率(每秒浮点运算次数)比较性能,尤其在矩阵大小不同时,计算速率比较更具优势。
超级会员免费看
订阅专栏 解锁全文

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



