g++详尽的内存使用编译自动生成的代码



我正在进行一个项目,该项目需要计算复杂函数的Jacobian和Hessian矩阵。为了生成正确的数学表达式,我使用符号微分和Python的SymPy模块来生成相应的C++代码。它产生了一个带有三个函数(函数本身、jacobian和hessian(的C++头文件。例如,粗麻布有以下形式的11x11表达式:

hessian(0,0) = <long-long-mathematical-function-with-abs-and-tanh-etc>;

此外,这些函数/表达式是模板函数,因为我需要向它们传递不同的类型(标量、区间(。

当我编译该程序时,它需要高达70 GB的RAM,带有g++(GCC(10.2.1 20201016(Red Hat 10.2.1-6(。最初,我收到了一个警告g++ note: variable tracking size limit exceeded

我添加了-fno-var-tracking标志,但它并没有以任何显著的方式减少所需的内存。

这个问题可能源于单个表达式右手边的大小吗?

是否有任何方法(可能是编译器标志或类似方法(可以减少编译过程中的内存使用?

我使用带有自定义标量类型的Eigen3来执行数学运算。

这个问题实际上与本征3无关,事实上,由于缺乏细节,没有办法明确回答它。也就是说,这里有一些建议:

  1. 将标题拆分为更小的标题,例如,为各自的函数提供三个单独的标题,并且只包括在任何给定点所需的标题。(我怀疑这不会有多大帮助。(
  2. 手动重写头以声明函数模板,并将定义与显式模板实例化一起移动到CPP文件中。这假设您需要固定数量的实例化(例如double和某个间隔类(
  3. 通过将包含这些标头的CPP文件拆分为组件,将其重写为更小的文件

最终,g++的每次调用都在一个翻译单元(传统上是.cpp文件(上,因此在某个时刻,您需要找出哪个翻译单元导致g++内存不足,并将其拆分。

在系统端,您可以增加可用的交换数量。

相关内容

  • 没有找到相关文章

最新更新