【问题标题】:When using MPI, how can I fix the error: "_int_malloc: Assertion `(unsigned long) (size) >= (unsigned long) (nb)' failed"?使用 MPI 时,如何修复错误:“_int_malloc: Assertion `(unsigned long) (size) >= (unsigned long) (nb)' failed”?
【发布时间】:2021-08-10 16:15:30
【问题描述】:

我正在使用我的主管大约 10 年前编写的科学模拟代码来运行一些计算。使用 mpirun 在我们的集群(启用了超线程)上并行运行它时,会不断出现间歇性问题。它产生的错误非常简洁,只是告诉我内存分配失败。

program-name: malloc.c:4036: _int_malloc: Assertion `(unsigned long) (size) >= (unsigned long) (nb)' failed.
[MKlabgroup:3448077] *** Process received signal ***
[MKlabgroup:3448077] Signal: Aborted (6)
[MKlabgroup:3448077] Signal code:  (-6)

我已使用建议 here 来启动和停止程序,以便我可以将调试器会话附加到单核上的其中一个实例。错误发生在第一次调用自定义矩阵函数时输入网格(使用metis)的分区过程中,并请求大约4000行和4列的空间,每个元素都是一个8字节的整数。这个特定的函数(如下)使用一个包含 n 个指针的数组来寻址 m 个整数指针数组:

int **matrix_int(int n, int m)
{
    int i;
    int **mat;
      
    // First: Assign the rows [n]
    mat = (int **) malloc(n*sizeof(int*));
    if (!mat)
    {
        program_error("ERROR[0]: Memory allocation failure for the rows @[matrix_int()]");
    }
    
    // Second: Assign the columns [m]
    for (i = 0; i <= n-1; i++)
    {
        mat[i] = (int *) malloc(m*sizeof(int));
        if (!mat[i])
        {
            program_error("ERROR[0]: Memory allocation failure for the columns @[matrix_int()]");
        }
    }

    return mat;
}

我的主管认为问题与 CPU 上的自动资源分配有关。因此,我最近尝试将 mpirun 中的 -rf 选项与指定要使用的内核的 rankfile 结合使用,但这产生了类似的间歇性结果;有时一个进程崩溃,有时几个,有时它运行良好。它始终以串行方式可靠运行,但在单核上计算速度极慢。

是否有人知道我可以对服务器配置或代码本身进行更改(除了全局禁用超线程),这将允许它每次都运行一定的时间?

(任何关于并行调试的一般技巧也将不胜感激!我对 C/C++ 和 MPI 还是很陌生,并且有另一个错误要追查,这可能是相关的。) em>

【问题讨论】:

  • 1.根据您的描述,它似乎与 MPI 没有太大关系。 2. 你能发布所有参数的堆栈跟踪吗? 3. 该代码 sn-p 中的两个 malloc 中的哪一个导致错误? 4. 以这种方式分配矩阵通常不是一个好主意。最好分配一个大小为m*n 的数组,然后将任何i,j 索引转换为线性i+j*m 或类似的。但是保存它以供以后重写:您的代码应该可以工作。
  • 这段代码没有问题。如果它在这段代码中的某处崩溃,那么在这段代码有机会运行之前某处发生了致命问题。我建议使用-fsanitize=address,undefined 编译器开关或valgrind。另请阅读this
  • 尝试mat = (int **) malloc((long)n*sizeof(int*));(稍后再做同样的事情)以确保n*sizeof(int*)不会被截断为int
  • @n.1.8e9-where's-my-sharem。我已经使用您建议的编译器标志(也使用 -fsanitize=thread)编译并运行,并且由于分配期间的 segv 错误,malloc 中的断言似乎失败了。程序中早些时候还报告了一个数组读取溢出错误(我目前正在调查这个问题)。我目前认为这个较早的问题可能会导致后续分配失败。
  • @VictorEijkhout 这是导致错误的第一个。自从第一次发布问题以来,我已经看到串行运行时发生错误,所以正如你所说,它可能不是 MPI。并行运行只会增加错误出现的几率。 (我还是不明白怎么会断断续续)

标签: c parallel-processing malloc mpi


【解决方案1】:

使用 n 建议的编译器标志后。 1.8e9-where's-my-share m。为了诊断内存访问违规,我发现内存损坏确实是由在我原来的问题之前调用的函数引起的。

有问题的函数使用sscanf 从文本文件中读取数据,并为文件的每一行分配一个 3 元素数组(每行读取 3 个数字)。下一部分是猜想,但我认为问题出现是因为sscanf 在它读取的序列末尾返回一个NULL。我猜测这个NULL 是从分配的3 个字节中写入下一个字节的,这样下次malloc 尝试分配数据时,它看到的第一件事就是NULL,导致它实际上没有返回已分配任何空间。然后下一个尝试使用已分配内存的函数会出现并崩溃,因为它正在尝试访问 malloc 报告已分配的未分配内存。

我能够通过将读取函数中分配的数组的大小从 3 个元素更改为 4 个元素来修复该错误。这似乎允许存储 NULL 字符,而不会干扰后续的内存分配。

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2012-01-27
    相关资源
    最近更新 更多