私のアプリケーションは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が呼び出されます。
OpenMPIで実行するたびに、MPI_Wait内からセグメンテーション違反が発生し続けます。
次のようにブール変数*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 );
}
ここの誰かがこのエラーについて何か考えを持っていますか?
乾杯。