如何为程序分配更多内存(GCC)

时间:2010-09-15 14:20:33

标签: c gcc

我想为program.l分配更多内存。允许你这样做的gcc标志是什么?

仅供参考我想要做的是创建一个非常大的矩阵(非常大),稍后将通过压缩算法。所以我无法避免创建这么大的矩阵来存储数据。

4 个答案:

答案 0 :(得分:3)

如果矩阵非常大,则可能必须在较小的段中分配内存,以便在虚拟内存空间中找到空间。在32位Windows上,我发现在一次分配中你根本无法获得大于980 MB的任何东西。在Linux上,它正在推动它试图获得超过1.5 GB的数据。

在64位系统中,您可以获得更多。

但无论如何,我建议使用一个可以为你处理内存和算法的矩阵库。制作快速矩阵计算有许多微妙的技巧。线程技巧,缓存大小的块计算,预取数据,SSE向量操作等等。

您可能希望使用英特尔或AMD的数学库。

答案 1 :(得分:3)

您不需要任何特殊的gcc标志。

使用malloc在运行时动态分配数组。

如果以某种方式强制使用静态数组,或者默认设置环境以限制程序对虚拟内存的访问,则可能需要使用ulimit命令。

ulimit -v unlimited
ulimit -d unlimited

否则,您需要更清楚地指定您所获得的错误,以防止您获得足够的内存,并且可能还告诉我们您的矩阵有多大。

答案 2 :(得分:3)

您的问题非常不清楚,但我怀疑您正在尝试创建一个大型多维数组(矩阵)作为局部变量(自动变量)到某个函数(可能是主函数),这是失败的。

int foo(int boo, int doo) {
    int big_array[REALLY_BIG];
    ...

这会失败,因为C编译器试图在程序系统堆栈上为这样的变量腾出空间。编译器可能只是在尝试思考关于堆栈中存在大的东西时失败(特别是对齐问题可能会使其更大),或者它可能会生成代码以尝试执行此操作并且CPU可以不要运行它,因为堆栈指针相对索引是有限的,或者因为操作系统对程序系统堆栈的大小设置了限制。

可能有一些方法可以更改操作系统限制,但如果是CPU限制,则只需要采取不同的操作。

对于某些事情,最简单的事情是使用全局或static变量来处理大型数据。这样做最终会在编译时或程序加载时(在运行时之前)为数据分配空间,但会限制您拥有多个副本的能力,因为您必须提前计划将足够的全局变量声明为保存你想要的所有直播

您也可以尝试使用malloccalloc为您分配内存。

第三个选项是(如果您使用* nix系统)内存映射包含矩阵的文件。查看mmap系统调用。

使用mmapstatic或全局变量的另一个好处是,在大多数操作系统下,虚拟内存管理器可以使用原始文件(包含mmap矩阵的文件或可执行文件)对于静态或全局)作为数据使用的内存的交换空间。这使得程序可以在不对物理内存或虚拟内存管理器造成太大压力的情况下运行。

答案 3 :(得分:2)

使用堆! malloc()和朋友是你的朋友。