潜在收益 - Matlab vs C/C++ - 汇编和特征值

计算科学 matlab 表现 C
2021-12-01 23:38:04

我有一个 Matlab 代码计算特征值 PDE 的解决方案。它由两部分组成:刚度/刚度矩阵的组装和解决广义特征值问题。我提到组装是使用 Matlab 中的矢量化代码完成的。我可能需要在一个相当大的测试用例数据库(几百万个案例)上运行该程序。在这种情况下,计算时间方面的性能变得明显。

我想知道如果我尝试用 C/C++ 编写算法会有什么好处?(不确定我是否有能力...... :) 但我想权衡潜在的好处)

我猜组装可能会更快,但特征值求解器在 Matlab 中非常有效。

你对这样的情况有什么经验?与 Matlab 相比,使用更快的语言进行编码可以显着减少计算时间吗?


根据要求提供有关该问题的更多详细信息:

  • Laplace-Beltrami 算子在球体的一部分上的特征值计算
  • 我在表面域的三角形网格上使用拉格朗日 P1 有限元
  • 大约 780000 个点(自由度)的 Matlab 计算时间示例:装配 3 秒,特征值计算 26 秒

显然,计算的重要部分是找到特征值。也许使用 SlepC 可以帮助解决这个问题……(在一些旧手册中,我看到了 Matlab 的 SlepC 接口,但在新手册中没有……)

1个回答

用 C++ 重写此特定代码不太可能使您受益匪浅。

主要原因:

  • 您已经使用 Matlab 特定的稀疏矩阵框架组装了一个稀疏矩阵
  • 热点是特征值计算,Matlab 将为此调用高度优化的 LAPACK 实现。这类似于您可以使用 C++ 实现的目标。

C++ 中的实现通常会给您带来好处:

  • 使用外部库时更灵活(不一定容易做到)
  • 更好的并行化和 GPU 使用选项(同样,并行计算的高效编码通常需要大量工作)
  • 以可维护和可扩展的方式扩展代码的选项
  • 在不是“线性代数调用的包装器”的函数中更有效

现在,据我所知,这些都不适用于您的具体情况。

我明白了,您对 Matlab 的 SLEPc 使用的问题来自哪里。我会说,这是你最好的选择。