我是高性能计算的新手,也是我在这个论坛上的第一个问题,我长期以来一直是读者.
基本上我需要对非常大的数组进行算术运算
double variable [9][4][300][300][300] (uninitialized)
情况1:如果我将上面的数组声明为本地/自动,那么如果我编译时没有像“g file.cpp”这样的优化,我会得到运行时错误..(错误是分段错误 – 堆栈溢出???)
情况2:如果我使用优化进行编译,则与上述情况相同,代码按预期运行. “g -O2 file.cpp”(现在是bss中的数组???)
情况3:如果我将变量设置为global / static,那么它编译得很好,但是它不会运行,只是在终端上发出“kill”消息并终止.
没有真正的问题,但我很好奇,想要了解声明超大型数组时会发生什么,以及它们根据数据类型驻留在内存中的位置.
我也知道使用malloc或new在运行时生成这些数组的方法.然后当然会在堆上.
所以对我来说最重要的问题是 – >这是在使用g进行编译并在linux集群上运行时处理大型数组的最有效方法(即计算内存中数组时的最小运行时间).
感谢您耐心等待阅读.
解决方法
无论优化标志如何,局部变量总是在堆栈上.那个阵列大概是7千兆字节!比任何可能的堆栈大的方式.
大小也可能是它无法启动的原因,就好像你把它作为全局/静态变量一样,那么你需要有超过7 GB或虚拟内存空闲且连续的才能加载程序.