【发布时间】:2013-03-26 01:26:32
【问题描述】:
我是High Performance Computing 的新手,也是我在这个论坛上的第一个问题,我已经阅读了很长时间。
基本上我需要对非常大的数组进行算术运算,例如
double variable [9][4][300][300][300] (uninitialized)
案例 1: 如果我将上面的数组声明为 local/automatic,那么如果我在没有优化的情况下编译 like "g++ file.cpp" 就会出现运行时错误。 .(错误是分段错误——堆栈溢出???)
案例 2: 在与上述相同的情况下,如果我进行了优化编译,代码将按预期运行。 "g++ -O2 file.cpp"(现在是bss 中的array???)
案例3:如果我创建变量global/static,那么它编译得很好,但它仍然没有运行,只是在终端上给出一条消息“killed”并终止。
没有真正的问题,但我很好奇,想了解当声明超大数组时会发生什么,以及它们驻留在内存中的位置,具体取决于它们的数据类型。
我也知道在运行时使用 malloc 或 new 生成这些数组的方法。那么它当然会在堆上。
所以对我来说最重要的问题是 --> 当使用g++ 编译并在linux clusters 上运行时,这是处理大型数组的最有效方法(即内存中数组计算期间的最小运行时间) .
感谢您的耐心阅读。
【问题讨论】:
-
那个数组简直是疯了。您需要使用更智能的解决方案来处理大量数据,除非您的目标平台是某种野兽般的机器。由于情况似乎并非如此,因此请以块或类似的方式从磁盘流式传输数据。
-
这些数组是不可避免的。它们代表 4 维空间中的变量。并且记忆操作解决了复杂的非线性微分方程。最终,代码将在 50 个节点的集群上运行,并且内存超过 100 GB。数据确实是从磁盘读取的。我的好奇心是了解这些数据在运行时的位置以及哪个部分(bss/stack/heap)会提供最快的运行时性能。
-
我真的建议您根据一些数学库(如犰狳或 BLAS)来完成您的工作。你做的任何事情,我的意思是任何事情,都无法超越这些库的性能。考虑从一开始就使用它们:)
-
@physicist:数据是不可避免的,存储和处理方法不是。就像我说的那样,将该数组 存储在您的可执行文件中 是行不通的,除非您可以假设您的代码只会在可以处理它的机器上运行。由于情况并非如此,因此您必须改变方法。您可以将数据存储在磁盘上并一次读取块。分解、处理、存储相关信息并读取下一个块。
-
不要在这里重新发明轮子。如果您是这种计算的新手,那么您想使用一些东西来使这一切尽可能轻松。我使用过的两个非线性偏微分方程库是dealii.org 和libmesh.sourceforge.net,它们可以满足您的需求(包括集群支持等)。如果他们没有,那里有很多类似的库。