【问题标题】:A int[2²⁰] array cause OpenMP Segmentation Fault一个 int[2²⁰] 数组导致 OpenMP 分段错误
【发布时间】:2013-11-06 02:09:40
【问题描述】:

我有一个int flags[(1<<20)]; 数组,似乎有问题,导致分段错误。这是堆栈溢出问题吗?我应该设置多少堆栈大小以及如何设置?

【问题讨论】:

  • 请添加一个标签,指明您使用的语言。 (C?C++?)

标签: arrays gcc openmp stack-overflow icc


【解决方案1】:

如果您的编程语言是 C++,则使用 std::vector,而不是 C 样式数组:

std::vector<int> flags(1<<20);
flags[0] = 1;

如果您的编程语言是C,请阅读 Lưu Vĩnh Phúc 的答案

【讨论】:

    【解决方案2】:

    该大小的int 数组为 4MB。根据系统,这个数字可能很大也可能不大。在 x86 Linux 中,默认堆栈大小通常为 8-10MB,但在其他平台上可能会有所不同

    在 Linux 中,您可以通过以下命令设置堆栈大小(以 KB 为单位)

    ulimit -s 8192
    

    但这会影响所有进程的堆栈大小,不推荐。要仅增加您自己进程的堆栈大小,然后use setrlimit

    在 Windows stack size is set at link time 中,但同样,它应该只在必要的情况下增加

    堆栈只能用于中小型变量。对于这么大的数组,你应该在堆上分配

    int *flags = malloc((1 << 20)*sizeof(int));
    

    使用后记得释放

    【讨论】:

    • int *flags = malloc((1&lt;&lt;20) * sizeof *flags);
    • 请注意,ulimit -s 仅更改主 OpenMP 线程的堆栈大小限制。其他 OpenMP 线程的堆栈大小由 OMP_STACKSIZE 环境变量控制 - 请参阅 here
    • ulimit -s 和 OMP_STACKSIZE 都试过了,最大到 81920KB,还是不行……就两个 int[(1
    • 你尝试过堆分配吗?程序在哪里停止或故障一开始出现在哪里?
    • 是的,我试过了。程序一开始就停止了“Segmentation Fault”
    猜你喜欢
    • 2022-12-25
    • 2016-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-25
    • 2010-12-18
    • 2017-02-25
    相关资源
    最近更新 更多