0

セットを使用すると、非常に奇妙な動作が発生します (実際にはセットの 3d ベクトルです)。ループの最後に次のものがあります(コメントはループが4回発生したときの動作であるため、すぐには発生しません)

cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][0]=i*xgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][1]=(i+1)*xgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][2]=j*ygridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][3]=(j+1)*ygridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][4]=k*zgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl; 
//returns 4

grid_locations[box_counter][5]=(k+1)*zgridlength;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

grid_rank_lookup[box_counter]=use_rank;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

box_counter++;
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

use_rank=(use_rank+1)%world.size();
cout<<"size of set at 3 0 0 is "<<particles_celllist.at(3).at(0).at(0).size()<<endl;
// returns 1071644672

particles_celllistgrid_rank_lookup、およびの定義は次のgrid_locationsとおりです。

vector<vector<vector<set<int> > > > particles_celllist;
map<int,vector<double> > grid_locations
map<int,int> grid_rank_lookup

注: 1 つ目はローカル変数で、残りの 2 つは関数への入力です。

何が原因なのか、何が問題なのかを突き止める方法さえわかりません。コード自体の範囲内で論理的な説明が見当たらないので、おそらくメモリと関係があるのでしょうか? コメントは、単一のプロセッサで実行するとどうなるかですが、2 つのプロセッサ (mpi コードです) で実行すると、ランダムなプロセッサでランダムな時間に発生するようです (すべての詳細は含まれていません)。コードは非常に長いため、ここに記載しますが、ここに記載されている情報だけでは何が問題なのかを推測するのに十分ではないと思われる場合は、投稿できます)

ありがとう

4

1 に答える 1

1

10716446721.75(32 ビット値 として) と同じ値表現を持ちます。

grid_locations[box_counter][5]=(k+1)*zgridlength;

に付属のメモリを上書きしていますparticles_celllist。メモリに正しくアクセスするにgrid_locations[box_counter]は、サイズが不十分である可能性があります。grid_locations[box_counter][5]に変更してみてgrid_locations[box_counter].at(5)、壊れるかどうかを確認してください。

于 2012-08-17T20:33:38.823 に答える