C/C++中对非常大的静态数组进行算术操作

6

我是新手,对于高性能计算一窍不通。这是我在这个论坛上的第一个问题,虽然我已经是读者很长时间了。

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

double variable [9][4][300][300][300] (uninitialized)
情况 1:如果我将上面的数组声明为局部/自动变量,并且像"g++ file.cpp"一样没有进行优化,那么运行时会出现错误(错误是分段故障--堆栈溢出?)。 情况 2:在与上述情况相同的情况下,如果我编译优化,则代码按预期运行。"g++ -O2 file.cpp"(array现在在中吗?)。 情况 3:如果我将变量设为全局/静态,则编译可以通过,但仍然无法运行,并在终端上显示一个"killed"消息后终止。
实际上并没有问题,但我很好奇,想知道当声明极大的数组时会发生什么,取决于它们的数据类型它们存储在内存中的位置。
我也知道使用malloc或new在运行时生成这些数组的方法。然后,它将位于堆上。
因此,对我来说最重要的问题是->在使用g++编译并在Linux集群上运行时,处理大型数组的最有效方法(即内存计算期间运行时间最短)是什么。
感谢您的耐心阅读。

1
那个数组纯粹就是疯狂。除非你的目标平台是某种野兽般的机器,否则你需要使用更智能的解决方案来处理那么多的数据。既然似乎不是这种情况,那就从磁盘中以块的形式流式传输数据或类似的方法。 - Ed S.
这些数组是不可避免的。它们代表了4维空间中的变量。内存操作解决了复杂的非线性微分方程。最终,代码将在50个节点的集群上运行,具有超过100 GB的内存。数据确实从磁盘读取。我很好奇要理解这些数据在运行时位于哪里,哪个部分(bss/stack/heap)会提供最快的运行时间性能。 - physicist
1
我真的建议你基于一些数学库(如armadillo或BLAS)来完成你的工作。任何你所做的事情,我是指任何事情,都不可能超过这些库的性能。考虑从一开始就使用它们 :) - amas
2
@物理学家:数据是不可避免的,存储和处理方法却不是。就像我说的,将那个数组存储在你的可执行文件中是行不通的,除非你能做出这样的假设,即你的代码只会在可以处理它的机器上运行。由于情况并非如此,你必须改变你的方法。你可以将数据存储在磁盘上,并一次读取一部分。将其分解、处理、存储相关信息并读取下一块。 - Ed S.
2
不要在这里重新发明轮子。如果你是新手,想让一切尽可能无痛,则需要使用某些工具。我曾经使用过/参与开发的两个非线性偏微分方程库是http://www.dealii.org/和http://libmesh.sourceforge.net/,它们可能可以满足你的需求(包括集群支持等)。如果它们不能满足你的需求,那么还有许多类似的库可供选择。 - Michael Anderson
显示剩余2条评论
2个回答

7

无论优化标志如何,本地变量始终会在堆栈上。而那个数组将达到7 GB!比任何可能的堆栈大小都要大得多。

数组的大小也可能是导致它无法启动的原因,因为如果将其作为全局/静态变量放置,则需要有超过7GB或虚拟内存空间自由连续才能加载程序。


所以对于第二种情况(来自问题),数组仍然在堆栈中。我认为堆栈有8kb的大小限制?我理解你的意思了吗?我没有给出任何编译时选项来增加堆栈限制。 - physicist
2
除非变量被优化掉,否则它就不存在了。 - Ben Voigt
1
@physicist 大多数现代系统的堆栈大小在1到4兆字节之间。对于某些特定系统可能有一些标志可以传递给链接器来更改它,但是那么整个程序的堆栈大小都将为该大小,并且大部分时间只使用其一小部分(可能不到7GB的一半)。这会浪费大量内存。有更好的方法来处理普通家用电脑上的大型数据集,例如内存映射文件。 - Some programmer dude
3
堆、栈、BSS和数据段对于“速度”来说并不重要,特别是因为它们都将被放入CPU缓存中。 - Some programmer dude
2
@物理学家:虽然这样大的数据结构不是任何程序员的首选,但如果你需要它们,堆被设计成可以使其工作。另一方面,自动和全局变量并不适合支持如此大的大小。 - Ben Voigt
显示剩余10条评论

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个向量的元数据。


那是一个有趣的方法。让我试试看。谢谢。 - physicist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接