C / C ++中非常大的静态数组的算术运算

时间:2013-04-04 05:36:43

标签: c++ c arrays static stack

我是High Performance Computing的新手,也是我在这个论坛上的第一个问题,我长期以来一直是读者。

基本上我需要对非常大的数组进行算术运算,例如

double variable [9][4][300][300][300] (uninitialized)

案例1:如果我将上面的数组声明为local/automatic,那么如果我在没有优化的情况下进行编译,则会出现运行时错误,如“{{1 “..(错误是分段错误 - 堆栈溢出???)

案例2:如果我使用优化进行编译,则在上述相同的情况下,代码按预期运行。 g++ file.cpp p“(现在是"g++ -O2 file.cp中的array ???)

案例3:如果我创建变量bss,那么它编译得很好,但是它不会运行,只是在终端上发出消息“global/static”并终止。

没有真正的问题,但我很好奇,想要了解声明超大型数组时会发生什么,以及它们根据数据类型驻留在内存中的位置。

我也知道使用malloc或new在运行时生成这些数组的方法。当然它会在堆上。

所以对我来说最重要的问题是 - >这是在使用killed进行编译并在g++上运行时处理大型数组的最有效方法(即计算内存中数组时的最小运行时间)。

感谢您耐心阅读。

2 个答案:

答案 0 :(得分:7)

无论优化标志如何,

局部变量总是在堆栈上。那个阵列大概是7千兆字节!比任何可能的堆栈都大。

大小也可能是它无法启动的原因,就像你把它作为全局/静态变量那样你需要有超过7 GB或虚拟内存 free 连续甚至可以加载程序。

答案 1 :(得分:3)

我可以提出以下建议:

typedef double slice[300][300][300];

std::vector<slice> variable[9] = { 4, 4, 4, 4, 4, 4, 4, 4, 4 };

这样,将动态分配4个slice个对象的每个向量,9个向量的内容不需要彼此连续,并且堆栈消耗仅足以用于9个向量的元数据。