【发布时间】:2015-11-19 22:07:11
【问题描述】:
我的代码中的中心函数如下所示(其他都是普通的输入和输出):
const int n = 40000;
double * foo (double const * const x)
{
double * y = malloc (n*sizeof(double));
y[0] = x[0] + (0.2*x[1]*x[0] - x[2]*x[2]);
y[1] = x[1] + (0.2*x[1]*x[0] - x[2]*x[2]);
// …
// 39997 lines of similar code
// that cannot be simplified to fewer lines
// …
y[40000] = 0.5*x[40000] - x[12345] + 5*x[0];
return y;
}
为了这个问题的目的,假设像这样(或非常相似)对这 40000 行进行硬编码是非常必要的。所有这些行仅包含具有固定数字和x 条目的基本算术运算(平均每行四十个);没有调用任何函数。源文件的总大小为 14MB。
在尝试编译此代码时,我面临编译器大量使用内存的问题。我可以让 Clang 用 -O0 编译它(只需要 20 秒),但我使用 GCC(即使使用 -O0)或 -O1 都失败了。
虽然在代码端或全局范围内几乎没有什么可以优化的(即,通过以另一种顺序计算各个行),但我相信编译器会找到一些可以在局部范围内优化的东西(例如,计算 y[0] 和 y[1] 所需的括号内的项。
我的问题是:
- 是否有一些编译器标志只激活不需要太多额外内存的优化?
- 是否有其他方法可以使编译器更好地处理此源代码(不会损失比通过优化获得的速度更多的速度)?
【问题讨论】:
-
注意:你有什么理由让
xconst,而不是它指向的数组? -
把它分成 4 个文件,每个文件 10000 行?
-
出于好奇,您的计算机(托管 gcc/clang)有多少内存?
-
@Foon:在一种情况下,编译器使用了我所有的 4GB RAM 和几乎所有的另外 8GB 交换空间。
-
您能否详细说明每个表达式的复杂程度?我编写了一个 python 脚本来生成看起来与您所包含的相似的样本......我的源代码“仅”2.7 MB,使用 gcc -O2 “仅”编译需要 4 分钟(使用 gcc 编译,没有指定 O 标志只需要 20.7秒)
标签: c compilation compiler-optimization compiler-flags