我在 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 时出现!
如果你使用的是 GNU glibc,你可以在运行程序之前将环境变量 MALLOC_CHECK_ 设置为 2,以启用对内存分配调用的额外检查 — 详情请点击此处。
你上面的消息,
警告:忽略了在 sigaction(( 中设置SIGRT32处理程序的尝试; SIGRT32信号由Valgrind内部使用cr_libinit.c:XXX cri_init:sigaction(( 失败:参数无效
与 MPI 有关(我的是 mpich-3.1.4-9(使用 BLCR 检查点库(我的是 BLCR-0.8.5(
当我不支持 BLCR 时(运行"mpiexec -info"并查看"可用的检查点库"行(,Valgrind 在我的测试阶段运行良好。
当我为BLCR支持(用于检查点实验(重新编译我的MPI时,Valgrind心脏病发作。他完全停止了工作。
这个错误(正如程序员所说(非常糟糕,因为显然这两个程序使用相同的信号来中断正在运行的程序,而它们根本无法这样做。(在我们的例子中,MPI的BLCR首先得到了它,现在Valgrind在空中行走(。
我将尝试在同一台机器上运行两种不同的 MPI 安装(一种支持 blcr,另一种没有(,我希望我能在 Valgrind 和 Checkpoint 之间愉快地交替。
更新:
即使检查点本身在工作,也不可能运行任何mpiexec并行可执行文件(它们以前工作的程序(。Mpiexec 命令本身,当我使用(编译(检查点库 BLCR 时崩溃。
溶液:
我在没有BLCR支持的情况下重新编译了MPI(mpich-3.1.4-9((我完全放弃了BLCR(,并且我安装了DMTCP检查点解决方案(dmtcp-2.4.4(,它不仅透明地工作,而且比BLCR更快(您可以在参考书目中找到基准(。
现在一切都按预期运行:)检查点作业的处理也正确完成。将来,我将对DMTCP进行更繁重的测试(我将使用本地文件,这些文件将具有来自并行程序的繁重/活动IO(。
附言。我还发现 mpich 已经从他们的发行版(2016 年 7 月(中完全推出了 BLCR。