“Program received signal SIGSEGV: Segmentation fault - invalid memory reference.”(程序接收信号 SIGSEGV:分段故障 - 内存引用无效)“(当使用大型数组和MPI_BARRIER时)

"Program received signal SIGSEGV: Segmentation fault - invalid memory reference." when using large-size array and MPI_BARRIER

提问人:Aaron Wang 提问时间:1/12/2023 最后编辑:Ian BushAaron Wang 更新时间:1/12/2023 访问量:223

问:

我使用带有 MPI(CRAY 的编译器)的 Fortran 作为我的代码。我使用了 512 个内核,我发现当我的变量超过一定大小时,代码在 MPI_BARRIER 时崩溃,错误消息是

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
.
.
.

一个可能有用的信息是,我在执行MPI_BARRIER之前打印出一个标签(即 write() “tag”),我发现输出的标签数量 (426) 加上重复错误消息的数量 (86) 等于我使用的内核 (512)。

我认为这是内存问题。我使用 slurm 提交我的工作,我记得我尝试过类似“ulimit -s unlimited”(现在找不到网络......)之类的东西,但我无法解决这个问题。

Fortran MPI slurm mpich

评论

1赞 Victor Eijkhout 1/12/2023
在调试器中运行。如果你有 Cray,你可能有一些该环境附带的调试器。或者,将您的代码包装在一个脚本中,该脚本仅针对排名 0 弹出一个带有 gdb 的 xterm。另外:几乎从不需要。除非你这样做是为了同步计时器,否则我敢打赌你的代码不需要它。MPI_Barrier
1赞 Vladimir F Героям слава 1/12/2023
请参阅如何提问,特别是最小的可重复示例。这里需要一些重现代码。还可以尝试编译器提供的错误检查功能。
1赞 Vladimir F Героям слава 1/12/2023
我同意通常不需要障碍。我只在初始化阶段使用它们来同步输出消息,宣布程序初始化的进度。
0赞 Ian Bush 1/12/2023
第三个障碍几乎总是不需要的 - 但你可能只是说障碍只是为了调试,它不是 100% 清楚的。但这很可能是其他地方的错误。您是否已在打开所有运行时检查的情况下编译并运行?如果我没记错的话,那是 -R 和 Cray 编译器的一些额外选项。
0赞 Ian Bush 1/12/2023
是 - 使用 -Rbcdps 检查手册页重新编译。您还需要 -g 或 -G 选项之一。请参见手册页。还要看看你是否可以在较少数量的进程和/或问题规模较小的问题上重现错误 - 你会让你的生活更轻松。

答: 暂无答案