我正在尝试获取在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 - &gt;链接器 - &gt;系统 - &gt;堆栈预留大小并给它一些。我测试了代码的工作原理是将堆栈加到8M。
从长远来看,我应该采用malloc方式。
答案 0 :(得分:1)
你的数组太大而无法放入堆栈,请尝试使用堆:
float *a;
a = malloc(sizeof(float) * ARRAY_SIZE);
Segmentation fault when allocating large arrays on the stack
答案 1 :(得分:0)
好吧,让我猜一下。我听说Windows上的默认堆栈大小是1 MB。你的ARRAY_SIZE_IN_BYTES
正好是1 MB btw(假设浮点数是4个字节)。那可能就是原因