【问题标题】:stack overflow in a simple float array initialization简单浮点数组初始化中的堆栈溢出
【发布时间】:2014-03-13 18:53:20
【问题描述】:

我正在尝试让在 Linux 上运行的代码也可以在我的 Windows 7 上运行。

当我重试相同的代码时,它因堆栈溢出而崩溃。然后我删除了所有我能找到的导致它崩溃的行,它给我留下了这个:

#include <stdio.h>
#include <stdlib.h>

#include <cuda_runtime.h>

/* 256k == 2^18 */
#define ARRAY_SIZE 262144
#define ARRAY_SIZE_IN_BYTES (sizeof(float) * (ARRAY_SIZE))


int main(void)
{

    float a[ARRAY_SIZE] = { };

    float result = 0;

    printf("sum was: %f (should be around 1 300 000 with even random distribution)\n", result);

    return 0;
}

如果我将 ARRAY_SIZE 更改为 256,代码运行良好。但是,对于当前值,float a[ARRAY_SIZE] 行会因堆栈溢出而导致运行时崩溃。无论我使用float a[ARRAY_SIZE]; 还是float a[ARRAY_SIZE] = { };,它们都以相同的方式崩溃。

有什么想法可能是错的吗?

使用 Visual Studio 2010 进行编译。


好的,堆栈大小似乎解释了here,说 1M 是 Windows 上的默认值。

显然,它可以在 VS 2010 中通过转到 Properties -> Linker -> System -> Stack Reserve Size 并给它更多一些来增加。我进行了测试,代码通过将堆栈提升到 8M 来工作。

从长远来看,我可能应该走 malloc 的方式。

【问题讨论】:

  • 我的猜测是您的堆栈太小,无法容纳 256K floats。
  • 我认为这与 CUDA 无关。
  • 是的,可能不是。我可以删除引用。

标签: c windows-7


【解决方案1】:

您的数组太大而无法放入堆栈,请尝试使用堆:

float *a;
a = malloc(sizeof(float) * ARRAY_SIZE);

Segmentation fault when allocating large arrays on the stack

【讨论】:

    【解决方案2】:

    好吧,让我猜猜。我听说 Windows 上的默认堆栈大小是 1 MB。你的 ARRAY_SIZE_IN_BYTES 正好是 1 MB btw(假设 float 是 4 个字节)。大概就是这个原因

    查看此链接:C/C++ maximum stack size of program

    【讨论】:

    • 正确。堆栈大小似乎在这里指定:cs.nyu.edu/exact/core/doc/stackOverflow.txt,说 1M 是 Windows 上的默认值,显然它可以在 VS 2010 中通过属性 -> 链接器 -> 系统 -> 堆栈保留大小并给它更多来增加。从长远来看,我可能应该走 malloc 的方式。谢谢。
    猜你喜欢
    • 2023-04-09
    • 2022-09-30
    • 1970-01-01
    • 2014-10-02
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    • 2023-03-14
    • 2011-03-29
    相关资源
    最近更新 更多