【发布时间】: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