Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C/C++;_C++_C_Arrays_Static_Stack - Fatal编程技术网

C++ C/C++;

C++ C/C++;,c++,c,arrays,static,stack,C++,C,Arrays,Static,Stack,我是新来的高性能计算,也是我在这个论坛上的第一个问题,我在这里已经做了很长时间的读者 基本上我需要对非常大的数组进行算术运算,比如 double variable [9][4][300][300][300] (uninitialized) 案例1:如果我将上面的数组声明为local/automatic,那么如果我在编译时没有进行优化,比如“g++file.cpp”,就会出现运行时错误。。(错误是分段错误--堆栈溢出??) 案例2:在与上面相同的情况下,如果我进行了优化编译,代码将按预期运行“g

我是新来的
高性能计算
,也是我在这个论坛上的第一个问题,我在这里已经做了很长时间的读者

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

double variable [9][4][300][300][300] (uninitialized)
案例1:如果我将上面的数组声明为
local/automatic
,那么如果我在编译时没有进行优化,比如“
g++file.cpp
”,就会出现运行时错误。。(错误是分段错误--堆栈溢出??)

案例2:在与上面相同的情况下,如果我进行了优化编译,代码将按预期运行
“g++-O2 file.cp
p”(
bss
中的
数组现在是不是?)

案例3:如果我将变量
设置为全局/静态
,那么它可以很好地编译,但它不会运行,只会在终端上发出一条消息“
已终止
”,并终止

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

我还知道在运行时使用malloc或new生成这些数组的方法。那当然是堆了

因此,对我来说最重要的问题是-->在使用
g++
编译并在
linux集群上运行时,哪种方法是处理大型数组的最有效方法(即内存中数组计算期间的最小运行时间)

感谢您耐心阅读。

无论优化标志如何,局部变量都将始终在堆栈上。该阵列的容量大约为7G!比任何可能的堆栈都大


大小也可能是它无法启动的原因,如果将其作为全局/静态变量,则需要有超过7 GB或虚拟内存可用且连续,才能加载该程序。

我可以提出以下建议:

typedef double slice[300][300][300];

std::vector<slice> variable[9] = { 4, 4, 4, 4, 4, 4, 4, 4, 4 };
typedef双片[300][300][300];
向量变量[9]={4,4,4,4,4,4,4,4,4};

这样,4个
切片
对象的每个向量都将被动态分配,9个向量的内容不需要彼此相邻,堆栈消耗量只够9个向量的元数据。

那个数组纯粹是疯了。您需要使用更智能的解决方案来处理这些数据量,除非您的目标平台是某种动物机器。由于情况似乎并非如此,所以将数据从磁盘分块或类似的方式进行流式传输。这些数组是不可避免的。它们表示四维空间中的变量。并通过记忆运算求解复杂的非线性微分方程。最终,该代码将在50个节点的集群上运行,该集群的内存超过100GB。数据确实是从磁盘读取的。我的好奇心在于理解这些数据在运行时的位置,以及哪个部分(bss/stack/heap)可以提供最快的运行时性能。我真的建议您基于一些数学库(如armadillo或BLAS)进行工作。无论你做什么,我是说什么,都不可能打败这些库的性能。考虑从一开始就使用它们:)物理学家:数据是不可避免的,存储和处理方法不是。正如我所说的,将该数组存储在可执行文件中是不可能的,除非您可以假设代码只会在能够处理它的机器上运行。由于情况并非如此,你必须改变你的方法。您可以将数据存储在磁盘上,并一次读取数据块。分解它,处理它,存储相关信息并阅读下一部分。不要在这里重新发明轮子。如果你是这类计算的新手,那么你想用一些东西使它尽可能地无痛。我使用过的两个非线性偏微分方程库是和,它们可以满足您的需要(包括集群支持等)。如果没有,那么还有很多类似的库。所以对于案例2(从问题中),数组仍然在堆栈中。我以为堆栈的大小限制是8kb?我对你的理解对吗?我没有给任何编译时选项来增加堆栈限制。除非变量被优化掉,否则它就不存在了。@物理学家大多数现代系统上的堆栈都在1到4兆字节的范围内。对于某些系统,可能会有一些标志可以传递给链接器进行更改,但是对于整个程序来说,堆栈的大小就是这样,并且大多数情况下,只会使用一小部分(可能不到7GB的一半)。大量浪费内存。在普通家用电脑上处理大型数据集有更好的方法,比如内存映射文件。@物理学家堆栈与BSS、数据与堆不是“速度”的因素。特别是因为它无论如何都会被放在CPU缓存中。@物理学家:虽然如此大的数据结构不是任何程序员的首选,但如果你需要它们,堆的设计就是为了让它工作。OTOH自动变量和全局变量的设计不支持如此大的大小。这是一个有趣的方法。让我试试看。非常感谢。