3

我在我的 mpi 程序中释放分配的内存时遇到一个奇怪的问题:

这是一个为我产生错误的代码示例:

void *out, *in;
int cnt = 2501; //if cnt<=2500: works perfectly. cnt>2500: crashes at free!

if((out = malloc(cnt * sizeof(double))) == NULL) 
    MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OP);
if((in = malloc(cnt * sizeof(double))) == NULL) 
    MPI_Abort(MPI_COMM_WORLD, MPI_ERR_OP);

//Test data generation
//usage of MPI_Send and MPI_Reduce_local
//doing a lot of memcpy, assigning pointer synonyms to in and out, changing data to in and out

free(in);    //crashes here with "munmap_chunk(): invalid pointer" 
free(out);   //and here (if above line is commented out) with "double free or corruption (!prev)"

我使用 valgrind 运行它:

 mpirun -np 2 valgrind  --leak-check=full --show-reachable=yes  ./foo

并得到以下信息:

==6248== Warning: ignored attempt to set SIGRT32 handler in sigaction();
==6248==          the SIGRT32 signal is used internally by Valgrind
cr_libinit.c:183 cri_init: sigaction() failed: Invalid argument

==6248== HEAP SUMMARY:
==6248==     in use at exit: 0 bytes in 0 blocks
==6248==   total heap usage: 1 allocs, 1 frees, 25 bytes allocated
==6248== 
==6248== All heap blocks were freed -- no leaks are possible
==6248== 
=====================================================================================
=   BAD TERMINATION OF ONE OF YOUR APPLICATION PROCESSES
=   EXIT CODE: 134

关于如何追踪此错误的任何想法?请注意,它仅在 cnt>2500 时出现!

4

2 回答 2

3

如果您使用的是 GNU glibc,则可以在运行程序之前将环境变量 MALLOC_CHECK_ 设置为 2,以启用对内存分配调用的额外检查 — 详情请点击此处

于 2012-05-17T09:58:45.217 回答
1

你上面的消息,

警告:忽略在 sigaction() 中设置 SIGRT32 处理程序的尝试;Valgrind cr_libinit.c:XXX cri_init: sigaction() failed: Invalid argument 在内部使用 SIGRT32 信号

与 MPI(我的是 mpich-3.1.4-9)使用 BLCR 检查点库(我的是 blcr-0.8.5)有关

当我不支持 BLCR(运行“mpiexec -info”并查看“可用的检查点库”行)时,Valgrind 在我的测试阶段运行良好。

当我重新编译我的 MPI 以支持 BLCR(用于检查点实验)时,Valgrind 心脏病发作了。他完全停止了工作。

这个错误(正如程序员所说的那样)非常糟糕,因为显然这两个程序使用相同的信号来中断您正在运行的程序,而且他们不能这样做。(在我们的例子中,用于 MPI 的 BLCR 首先得到了它,现在 Valgrind 被留在空中行走)。

我将尝试在同一台机器上运行两个不同的 MPI 安装(一个支持 blcr,一个不支持),我希望我能在 Valgrind 和 Checkpoint 之间愉快地交替。

更新:

即使 Checkpoint 本身正在运行,也无法运行任何 mpiexec 并行可执行文件(它们之前正在运行的程序)。Mpiexec 命令本身在我使用(编译入)检查点库 BLCR 时崩溃。

解决方案:

我重新编译了没有BLCR 支持的 MPI (mpich-3.1.4-9) (我完全放弃了 BLCR)并安装了 DMTCP 检查点解决方案(dmtcp-2.4.4),它不仅可以透明地工作,而且比 BLCR 更快(您将在参考书目中找到基准)。

现在一切都按预期运行:) 并且检查点作业的处理也正确完成。将来我将对 DMTCP 进行更多的重度测试(我将使用本地文件,这些文件将具有来自并行程序的重度/活动 IO)。

PS。我还发现 mpich 已经完全从他们的发行版中删除了 BLCR(2016 年 7 月)。

于 2016-06-05T15:21:22.747 回答