2

我只是使用 valgrind 来测试 openmpi-1.4/example 中提供的示例:

mpirun.openmpi --np 2 valgrind --log-file=output.dat --leak-check=full --tool=memcheck ./ring_c

然后我在 output.dat 中找到了以下内容:

==30450== 系统调用参数 writev(vector[...]) 指向未初始化的字节

==30450== 在 0x54DC150: __writev_nocancel (syscall-template.S:81)

==30450== 由 0x7E3B312:mca_oob_tcp_msg_send_handler(在 /usr/lib/openmpi/lib/openmpi/mca_oob_tcp.so 中)

==30450== 由 0x7E3C50A:mca_oob_tcp_peer_send(在 /usr/lib/openmpi/lib/openmpi/mca_oob_tcp.so 中)

==30450== 0x7E40266:mca_oob_tcp_send_nb(在 /usr/lib/openmpi/lib/openmpi/mca_oob_tcp.so 中)

==30450== 0x7C2FFB7:orte_rml_oob_send(在 /usr/lib/openmpi/lib/openmpi/mca_rml_oob.so 中)

==30450== 0x7C30637:orte_rml_oob_send_buffer(在 /usr/lib/openmpi/lib/openmpi/mca_rml_oob.so 中)

==30450== 由 0x824CBAE: ??? (在 /usr/lib/openmpi/lib/openmpi/mca_grpcomm_bad.so 中)

==30450== 通过 0x4E900FB:ompi_mpi_init(在 /usr/lib/openmpi/lib/libmpi.so.1.0.8 中)==30450== 通过 0x4EA8499:PMPI_Init(在 /usr/lib/openmpi/lib/libmpi.所以.1.0.8)

==30450== by 0x4009AD: main (ring_c.c:19)

==30450== 地址 0x65c0321 在大小为 256 的块内是 161 个字节,已分配

==30450== 在 0x4C2DEAE:realloc(在 /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so 中)

==30450== 0x4F1E619:opal_dss_buffer_extend(在 /usr/lib/openmpi/lib/libmpi.so.1.0.8 中)

==30450== 0x4F1E9D0:opal_dss_copy_payload(在 /usr/lib/openmpi/lib/libmpi.so.1.0.8 中)

==30450== 由 0x4EFA3DD:orte_grpcomm_base_pack_modex_entries(在 /usr/lib/openmpi/lib/libmpi.so.1.0.8 中)

==30450== 由 0x824CA8F: ??? (在 /usr/lib/openmpi/lib/openmpi/mca_grpcomm_bad.so 中)

==30450== 由 0x4E900FB:ompi_mpi_init(在 /usr/lib/openmpi/lib/libmpi.so.1.0.8 中)

==30450== 由 0x4EA8499:PMPI_Init(在 /usr/lib/openmpi/lib/libmpi.so.1.0.8 中)

==30450== by 0x4009AD: main (ring_c.c:19)

==30450== 堆摘要:

==30450== 退出时使用:1,482 个块中的 298,974 个字节

==30450== 总堆使用量:7,740 次分配,6,258 次释放,13,223,431 字节分配

…………

==30450== 泄漏摘要:

==30450== 肯定丢失:69 个块中的 51,132 个字节

==30450== 间接丢失:39 个块中的 14,378 个字节

==30450== 可能丢失:0 个块中的 0 个字节

==30450== 仍然可以访问:1,374 个块中的 233,464 个字节

==30450== 抑制:0 个块中的 0 个字节

==30450== 未显示可达块(找到指针的块)。

==30450== 要查看它们,请重新运行: --leak-check=full --show-leak-kinds=all

==30450==

==30450== 对于检测到和抑制的错误计数,重新运行:-v

==30450== 使用 --track-origins=yes 查看未初始化值的来源

==30450== 错误摘要:来自 63 个上下文的 63 个错误(抑制:0 来自 0)

它有基于内存检查结果的内存泄漏。既然例子是由openmpi-1.4开发者提供的,是不是说每一个使用openmpi-1.4作为库的程序都会遇到内存泄漏呢?弗雷德

4

1 回答 1

2

出于性能原因,OpenMPI 不是 valgrind-clean。但是,根据常见问题解答,提供了一个抑制文件。

mpirun -np 2 valgrind --suppressions=$PREFIX/share/openmpi/openmpi-valgrind.supp
于 2016-03-11T15:58:43.930 回答