C++ 推回过程中的分段故障
我在下面的循环中遇到了一个非常奇怪的分段错误。 目标是让每个处理器对存储在以下向量上的x/y点进行一些检查 只是想澄清一下:这是一个多处理器代码,而不是多线程。这就是我获得排名的方式:C++ 推回过程中的分段故障,c++,segmentation-fault,stdvector,push-back,C++,Segmentation Fault,Stdvector,Push Back,我在下面的循环中遇到了一个非常奇怪的分段错误。 目标是让每个处理器对存储在以下向量上的x/y点进行一些检查 只是想澄清一下:这是一个多处理器代码,而不是多线程。这就是我获得排名的方式: int my_rank = Utilities::MPI::this_mpi_process(mpi_communicator); std::vector<std::vector<double> > Xcoord(n_proc); std::vector<std::vect
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);
该代码甚至可以与4个处理器一起工作
我还注意到分段错误总是与秩2相关。因此,如果我在上面两行中的一行前面设置条件if(my_rank!=2),代码在4个处理器中工作
关于这个问题,我看到的帖子很少,但在大多数情况下,错误都是由传递到push_back()的空指针引起的
在这里,我只回推一个整数,对我来说,当它被推到一个向量时,它显然是存在的
你知道我怎么能抓住这个错误吗
谢谢你当你同时尝试
推送包
时,你经常会出现分段错误的原因是,在一个线程中,你可以尝试推送回
,向量被重新分配(因此所有迭代器都无效),而另一个线程尝试推送回
到现在无效的内存中(另一个线程“不知道”向量同时被重新分配,即将使用无效的迭代器)
可能重复的嗯,你说用4个处理器来编写代码。你是说用OpenMP之类的东西来并行外环吗?如果是这样的话,我希望这些线路会发生故障,因为它们在同一个阵列上运行。你是想用
哪个点[I]
而不是哪个点[my\u rank]
?每个处理器上指向不同的向量。这应该是指向[my\u rank]的向量。显示您的并行代码。您承认单线程工作正常,因此我们不得不猜测错误是如何引入的。您使用术语“rank”让我觉得你在使用MPI,如果是的话,那么就意识到多进程不同于多线程。@Adam你是对的,我在使用MPI。我已经在问题中做了澄清。谢谢你,并且n\u proc
初始化正确了吗?my\u rank
是否可以等于或大于n\u proc
(不应该是,但可能你在其他地方有个bug)。我不是这方面的专家,但我相信这是另一种情况。处理器不共享内存,至少这是我的意图。此外,循环结束时的向量,应该具有不同的属性sizes@giorgk我只是认为这两个push_back
是并行完成的,即which_proc[my_rank].push_back(i);哪个点[我的排名]。push_back(j);
,如果是这样的话,就有麻烦了。另外,这真的是多进程代码还是多线程代码?这会产生很大的不同。我已经对这个问题做了澄清。这是一个多进程代码。
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);
}
}
}
}
}
which_proc[my_rank].push_back(i); or
which_point[my_rank].push_back(j);