When using MPI, how can I fix the error: "_int_malloc: Assertion `(unsigned long) (size) >= (unsigned long) (nb)' failed"?

When using MPI, how can I fix the error: "_int_malloc: Assertion `(unsigned long) (size) >= (unsigned long) (nb)' failed"?

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

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 来启动和停止程序,以便我可以将调试器会话附加到单个内核上的其中一个实例。当第一次调用自定义矩阵函数并请求 space 约 4000 行和 4 列,每个元素都是一个 8 字节整数时,输入网格(使用 metis)的分区过程中会发生错误。这个特定的函数(如下)使用一个 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 上的自动资源分配有关。因此,我最近尝试将 mpi运行 中的 -rf 选项与指定要使用的内核的排名文件结合使用,但这产生了类似的间歇性结果;有时是单个进程崩溃,有时是多个进程崩溃,有时 运行 没问题。它总是 运行 串行可靠,但在单核上计算非常慢。

有谁知道我可以对服务器配置或代码本身进行更改(除了全局禁用超线程),这将允许每次 运行 肯定?

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

使用 n 建议的编译器标志后。 1.8e9-其中's-my-share米。诊断内存访问冲突我发现内存损坏确实是由一个函数引起的,该函数在我最初的问题中的函数之前被调用。

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

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