一般来说,迭代求解器比直接求解器需要更多的浮点运算吗?我有一些用于求解混合 FE 泊松方程的科学代码(用 PETSc 和 FEniCS 编写),并且分析摘要似乎总是显示直接求解器(例如,腮腺炎,superlu)使用更少的触发器至少一个订单。此外,对于超过 100 万自由度的问题,求解器似乎需要更多时间,因此产生的 FLOPS/s 效率比我使用像 GMRES(带有 bjacobi 预处理器)这样的迭代求解器时还要小。
这是预期的吗?还是我的实现可能有问题?谢谢
一般来说,迭代求解器比直接求解器需要更多的浮点运算吗?我有一些用于求解混合 FE 泊松方程的科学代码(用 PETSc 和 FEniCS 编写),并且分析摘要似乎总是显示直接求解器(例如,腮腺炎,superlu)使用更少的触发器至少一个订单。此外,对于超过 100 万自由度的问题,求解器似乎需要更多时间,因此产生的 FLOPS/s 效率比我使用像 GMRES(带有 bjacobi 预处理器)这样的迭代求解器时还要小。
这是预期的吗?还是我的实现可能有问题?谢谢
你是如何计算 FLOPS 的?如果您在从 Westmere 和更高版本开始的 Intel 芯片上使用硬件性能计数器,那么您可能会大大高估它们。这些计数器计算“执行”的指令而不是“退出”的指令,但这些芯片上的已执行指令可能尚未真正执行完成,并且如果数据还不能从 RAM 中获得,则可能会重试几次。这很可能发生在迭代求解器上,它更可能基于矩阵向量乘积,因此更可能受到内存带宽的限制。这些代码可能会花费大量时间等待数据从内存中可用,并且会多次重新发出浮点指令。如果您使用 SandyBridge 上的硬件计数器计算 FLOPS 以进行 STREAM Triad 基准测试,
这并没有开始解决您的其他问题,但它可能是您的问题的解释,具体取决于您是否尝试使用硬件计数器。
这在很大程度上取决于问题。以我的经验,直接求解器对于具有中等(例如,高达大约一百万左右)自由度的二维问题非常有效。
如果要处理非常大的问题,通常需要使用迭代求解器。但是,您需要非常好的预处理器才能获得良好的性能;最常见的是多重网格预条件子,无论是几何类型还是代数类型。Jacobi 预处理器根本不会给出好的结果。