You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:15:21