- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正试图在我的一个使用电围栏的程序中查找一些内存错误。我的程序使用 OpenMPI,当我尝试运行它时,它会出现以下回溯跟踪的段错误:
Program received signal SIGSEGV, Segmentation fault.
2001 ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S: No such file or directory.
__memcpy_ssse3_back () at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:2001
(gdb) bt
#0 __memcpy_ssse3_back ()
at ../sysdeps/x86_64/multiarch/memcpy-ssse3-back.S:2001
#1 0x00007ffff72d6b7f in ompi_ddt_copy_content_same_ddt ()
from /usr/lib/libmpi.so.0
#2 0x00007ffff72d4d0d in ompi_ddt_sndrcv () from /usr/lib/libmpi.so.0
#3 0x00007ffff72dd5b3 in PMPI_Allgather () from /usr/lib/libmpi.so.0
#4 0x00000000004394f1 in ppl::gvec<unsigned int>::gvec (this=0x7fffffffdd60,
length=1) at qppl/gvec.h:32
#5 0x0000000000434a35 in TreeBuilder::TreeBuilder (this=0x7fffffffdc60,
octree=..., mygbodytab=..., mylbodytab=..., cellpool=0x7fffef705fc8,
---Type <return> to continue, or q <return> to quit---
leafpool=0x7fffef707fc8, bodypool=0x7fffef6bdfc0) at treebuild.cxx:93
#6 0x000000000042fb6b in BarnesHut::BuildOctree (this=0x7fffffffde50)
at barnes.cxx:155
#7 0x000000000042af52 in BarnesHut::Run (this=0x7fffffffde50)
at barnes.cxx:386
#8 0x000000000042b164 in main (argc=1, argv=0x7fffffffe118) at barnes.cxx:435
我的代码的相关部分是:
me = spr_locale_id();
world_size = spr_num_locales();
my_elements = std::shared_ptr<T>(new T[1]);
world_element_pointers = std::shared_ptr<T*>(new T*[world_size]);
MPI_Allgather(my_elements.get(), sizeof(T*), MPI_BYTE,
world_element_pointers.get(), sizeof(T*), MPI_BYTE,
MPI_COMM_WORLD);
我不确定为什么 __memcpy_ssse3_back 会导致段错误。当我在没有电围栏的情况下运行时,这部分程序不会出现段错误。有谁知道发生了什么事?我正在使用 openmpi 版本 1.4.3
最佳答案
有两种可能的错误原因:
有一个bug在数据复制例程中,存在于较旧的 Open MPI 版本中,似乎已在版本 1.4.4 中修复。如果是这种情况,将 Open MPI 库升级到更新版本将解决问题。
另一个可能的原因是 my_elements
是 T
类型的单个项目的数组。在 MPI_Allgather
调用中,您将指针传递给该元素,但您指定 sizeof(T*)
作为要发送的字节数。默认情况下,Electric Fence 将新分配的内存放在内存页的末尾,然后紧接着插入一个不可访问的内存页。如果 T
恰好比指针类型短(例如 T
是 int
并且您在 64 位 LP64 平台上运行),则将发生对不可访问的内存页面的访问,因此会发生段错误。由于您的意图是实际发送一个指向数据的指针,因此您应该向 MPI_Allgather
传递一个指向由 my_elements.get()
返回的值的指针。
顺便说一句,传递指针并不是一件好事。 MPI 提供了自己的可移植 RDMA 实现。查看One-sided Communications MPI 标准的章节。虽然有点笨重,但至少应该是便携的。
关于segmentation-fault - 使用电子围栏时 Openmpi 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14367857/
我是一名优秀的程序员,十分优秀!