编译时g ++挂起[重复]

Posted

技术标签:

【中文标题】编译时g ++挂起[重复]【英文标题】:g++ hangs when compile [duplicate] 【发布时间】:2014-07-22 23:01:30 【问题描述】:

我有一些代码可以用 g++ 很好地编译。然后我让一些数组更大:

complex<double> densop[a][b][c] 

其中 a=b=400,g=500。当我用

编译时
g++ -L/.../gsl  -I/../gsl -O2 -lgsl -lgslcblas  -Wall -o sim1 sim1.cp 

编译器挂起 (5h+) 没有额外的警告,而不是在它编译的情况下。

我以为它可能是内存,但顶部显示 CPU 运行在 100% 和 %MEM 大约一半。顺便说一句,我还全局声明了数组,这样它就不会在堆栈上很重。

在编译成功与否的情况之间有所不同的另一件事是,当我#include 两个数据文件时,在第二种情况下更大(30 和 15 MB)。

gcc 版本 4.1.2,内存 30GB。尝试使用 -O0 和 -O2 标志。

提前谢谢你!

【问题讨论】:

围绕变量声明显示更多代码。例如,它是在函数中声明还是在文件范围内声明或作为静态声明? 请注意,写入的数组是double80000000 元素,总大小为640 MB。根据您列出的规格,这应该不是问题,但我想我会包括那个细节,以防它跳出任何人。 @Cyber​​ 元素类型是complex&lt;double&gt;,实际上是两个双精度数的大小。所以总内存使用量为 1280MB。 是的,内存可能应该是动态分配的,否则你将拥有一个可执行文件大小的地狱...... 可惜机器是共享的,我没有更新g++的权限,时间有点短! 【参考方案1】:

我确实见过 g++ 在将大型常量数据数组解析为 C++ 源代码时性能不佳的情况。改善这一点的一种方法是将大数据数组存储在输入文件中,并在程序启动时将它们加载到内存中。这将在运行时以少量启动处理为代价解决编译性能问题。

请注意,即使您的常量数组编译并运行,它们仍然需要调用 complex&lt;double&gt; 构造函数几百万次,因此从文件中读取可能不会花费太多。

【讨论】:

“他们仍然需要调用复杂的构造函数几百万次”-O2?当然? complex&lt;T&gt; 是文字类型,它们的 ctor 是 constexpr 好吧,也许不是,这取决于编译器的实现。我不一定相信 g++ 4.1 会做这样的事情。 我有点困惑,数组没有被填充,但在运行时。您的意思是将数组保存在单独的文本文件中吗? @user3744868:也许我很困惑;您说“当我#include 两个数据文件时”-这些数据文件中有什么?我假设您包含大型常量数据文件。 那些数据文件包含文本。它们使用#include 导入,并替换了一些变量(大约 10 个)。然后将它们用于处理数组的不同函数中。 “在程序启动时将它们加载到内存中”是什么意思。

以上是关于编译时g ++挂起[重复]的主要内容,如果未能解决你的问题,请参考以下文章

编译和链接项目时 Visual Studio 2015 挂起

使用 cl 编译的代码在第一次运行时挂起太久[关闭]

Python for Windows 在调用 MinGW-w64 编译库的函数时挂起

在文件更改时自动重新编译和重新加载服务器

“git push”:slug 编译挂起

Swift 编译器挂起!这是一个错误吗?