CUDA程序输入大数据时退出码-1073741571的原因分析
问题原因与解决方案
核心原因:栈内存溢出
退出码 -1073741571 对应Windows系统的 STATUS_STACK_OVERFLOW,也就是栈内存耗尽。你的代码里,矩阵数组a、b、c都是直接在栈上声明的:
int a[max_n * max_n] = {0}; int b[max_n * max_n] = {0}; int c[max_n* max_n] ;
Windows系统默认栈大小通常只有1MB左右,内存占用计算如下:
- 单个
int占4字节,当max_n=291时,单个数组大小是291*291*4≈338KB,三个数组加起来接近1MB,刚好卡在栈的极限; - 当
max_n>292时,单个数组大小超过292*292*4≈341KB,三个数组总内存直接突破1MB,栈空间不够就会触发溢出,导致程序崩溃。
你提到所有大数据输入的CUDA程序都有这个问题,大概率是这些程序都存在栈上分配大数组的情况。
解决方案
把栈上的数组改成堆内存动态分配即可,堆的大小受系统物理内存限制,远大于栈:
修改后的核心代码片段
int main() { const int max_n = 500; // 可设置更大值 int n ; printf("Enter order of matrix: "); scanf("%d", &n); // 改用malloc在堆上分配内存 int* a = (int*)malloc(max_n * max_n * sizeof(int)); int* b = (int*)malloc(max_n * max_n * sizeof(int)); int* c = (int*)malloc(max_n * max_n * sizeof(int)); // 初始化数组为0,避免脏数据 memset(a, 0, max_n * max_n * sizeof(int)); memset(b, 0, max_n * max_n * sizeof(int)); // 原有的输入、计算逻辑保持不变 // 用完释放堆内存,避免泄漏 free(a); free(b); free(c); return 0; }
额外注意事项
- 如果用C++编写,可替换为
new/delete,原理一致; - 不要手动调整编译器栈大小(如VS修改栈预留值),这种方法不通用,还可能隐藏其他问题;
- 大数据存储变量优先用堆分配,栈仅适合小变量、局部临时数据。
内容的提问来源于stack exchange,提问作者Mehul
相关产品推荐
相关产品推荐

