我是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++
上运行时处理大型数组的最有效方法(即计算内存中数组时的最小运行时间)。
感谢您耐心阅读。
答案 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个向量的元数据。