我在以下循环中遇到了一个非常奇怪的分段错误。 目标是让每个处理器对x / y点进行一些检查,这些检查存储在以下向量
中只是为了澄清:这是一个多处理器代码而不是多线程。这就是我获得排名的方式:
int my_rank = Utilities::MPI::this_mpi_process(mpi_communicator);
std::vector<std::vector<double> > Xcoord(n_proc);
std::vector<std::vector<double> > Ycoord(n_proc);
Xcoord [i]是来自i处理器的x坐标向量,当前处理器会对它们进行一些检查,我不在下面对它们进行检查:
代码循环遍历n个处理器,首先检查它是否有关于关节点的任何信息,如果是,则保存点的id和处理器的id。
std::vector<std::vector<int> > which_point(n_proc);
std::vector<std::vector<int> > which_proc(n_proc);
for (int i = 0; i < n_proc; ++i){
if (i == my_rank) continue;
for (unsigned int j = 0; j < Xcoord[i].size(); ++j){
bool yit = getYiterator(yxmap, Ycoord[i][j], itY);
if (yit){
bool xit = getXiterator(itY->second, Xcoord[i][j], itX);
if (xit){
itZ = itX->second.zmap.begin();
for (; itZ != itX->second.zmap.end(); ++itZ){
which_point[my_rank].push_back(j);
which_proc[my_rank].push_back(i);
}
}
}
}
}
(在最里面的循环中,itX-&gt; second.zmap.size()是3)
当我在一个处理器中运行代码时,一切正常。
当我使用4个处理器时,我遇到了分段错误。
如果我删除两行中的一行
which_proc[my_rank].push_back(i); or
which_point[my_rank].push_back(j);
即使有4个处理器,代码也能正常工作。
我还注意到,分段错误总是与秩2相关联。因此,如果我在上述两行中的一行之前设置条件if(my_rank!= 2),则代码在4个处理器中工作。
我在这个问题上看到的帖子很少,但在大多数情况下,错误是从传递给push_back()的空指针发生的。
在这里,我只是推回一个整数,当它被推到一个向量时,这显然存在。
知道我怎么能抓住这个错误吗?
谢谢
答案 0 :(得分:0)
最常见的是,当你同时尝试push_pack
时,你最终会发生segfaulting的原因是因为在一个线程中你可能会尝试push_back
,所以向量被重新分配(所有迭代器都被无效),而另一个线程尝试push_back
到现在无效的内存(另一个线程&#34;不知道&#34;同时重新分配向量,即将使用无效的迭代器)。