6

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

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

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

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

案例 2:在与上述相同的情况下,如果我进行了优化编译,代码将按预期运行。"g++ -O2 file.cpp"(现在arraybss吗???)

案例3:如果我创建变量global/static,那么它编译得很好,但它仍然没有运行,只是killed在终端上给出一条消息“”并终止。

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

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

所以对我来说最重要的问题是 --> 在g++使用linux clusters.

感谢您的耐心阅读。

4

2 回答 2

7

无论优化标志如何,局部变量都将始终在堆栈上。这个数组大约有 7 GB!比任何可能的堆栈都大。

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

于 2013-04-04T05:43:30.983 回答
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 个向量的元数据。

于 2013-04-04T06:09:03.503 回答