Мое приложение работает с LAM / MPI, но происходит сбой с OpenMPI.
Ниже показан мой код.
void Comm::nonblocking_send( int s_idx , int e_idx )
{
MPI_Wait(&mpireq,&mpistat);
buffer.clear();
list<class vertex*>::iterator vit;
for( vit=our_dag->cur_block_intmeds.begin() ; vit!=our_dag->cur_block_intmeds.end() ; vit++ )
{
vertex * v = (*vit);
list<class edge*> in_edges = v->in_edges;
list<class edge*>::iterator eit;
for( eit=in_edges.begin() ; eit!=in_edges.end() ; eit++ )
{
int x_idx = (*eit)->src->idx;
int y_idx = (*eit)->tgt->idx;
double dydx = (*eit)->partial;
struct partial * p = new partial();
//ownership info
p->rank = our_dag->rank;
//structural info
p->x_idx = x_idx;
p->y_idx = y_idx;
p->dydx = dydx;
//block info
p->block_idx = our_dag->block_idx;
p->s_idx = s_idx;
p->e_idx = e_idx;
buffer.push_back(*p);
delete p;
}
}
MPI_Isend( &buffer[0] , buffer.size() , MPI_PARTIAL , 0 , DAG_MERG_REQ , MPI_COMM_WORLD , &mpireq );
}
Как видите, в начале функции вызывается MPI_Wait, после чего выполняются некоторые вычисления и, в конце концов, соответствующий MPI_ISend в конце функции.
Iпродолжайте получать ошибку сегментации изнутри MPI_Wait при каждом запуске с OpenMPI.
Я исправил это, проверив, вызывается ли функция в первый раз с логической переменной * first_time * следующим образом.
void Comm::nonblocking_send( int s_idx , int e_idx )
{
if(first_time)
first_time = false;
else
MPI_Wait(&mpireq,&mpistat);
buffer.clear();
list<class vertex*>::iterator vit;
for( vit=our_dag->cur_block_intmeds.begin() ; vit!=our_dag->cur_block_intmeds.end() ; vit++ )
{
vertex * v = (*vit);
list<class edge*> in_edges = v->in_edges;
list<class edge*>::iterator eit;
for( eit=in_edges.begin() ; eit!=in_edges.end() ; eit++ )
{
int x_idx = (*eit)->src->idx;
int y_idx = (*eit)->tgt->idx;
double dydx = (*eit)->partial;
struct partial * p = new partial();
//ownership info
p->rank = our_dag->rank;
//structural info
p->x_idx = x_idx;
p->y_idx = y_idx;
p->dydx = dydx;
//block info
p->block_idx = our_dag->block_idx;
p->s_idx = s_idx;
p->e_idx = e_idx;
buffer.push_back(*p);
delete p;
}
}
MPI_Isend( &buffer[0] , buffer.size() , MPI_PARTIAL , 0 , DAG_MERG_REQ , MPI_COMM_WORLD , &mpireq );
}
Кто-нибудь здесь имеет какое-либо представление об этой ошибке?
Приветствия.