我正在进行一个项目,该项目需要计算复杂函数的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无关,事实上,由于缺乏细节,没有办法明确回答它。也就是说,这里有一些建议:
- 将标题拆分为更小的标题,例如,为各自的函数提供三个单独的标题,并且只包括在任何给定点所需的标题。(我怀疑这不会有多大帮助。(
- 手动重写头以声明函数模板,并将定义与显式模板实例化一起移动到CPP文件中。这假设您需要固定数量的实例化(例如
double
和某个间隔类( - 通过将包含这些标头的CPP文件拆分为组件,将其重写为更小的文件
最终,g++
的每次调用都在一个翻译单元(传统上是.cpp
文件(上,因此在某个时刻,您需要找出哪个翻译单元导致g++
内存不足,并将其拆分。
在系统端,您可以增加可用的交换数量。