私の大学での練習中、私は変数の変な振る舞いに出くわしました。変わったグローバル変数の振る舞い、変数名が変更されると問題がなくなります
/* Main parameters */
double sizeX, sizeY; /* Size of the global domain */
int nPartX, nPartY; /* Particle number in x, y direction */
int nPart; /* Total number of particles */
int nCellX, nCellY; /* (Global) number of cells in x, y direction */
int steps; /* Number of timesteps */
double dt; /* Stepsize for timesteps */
int logs; /* Whether or not we want to keep logfiles */
void ReadInput(const char *fname)
{
FILE *fp;
char c;
Debug("ReadInput", 0);
if(rank == 0)
{
fp = fopen(fname, "r");
if(!fp) Debug("Cannot open input file", 1);
if(fscanf(fp, "sizeX: %lf\n", &sizeX) != 1) Debug("sizeX?", 1);
if(fscanf(fp, "sizeY: %lf\n", &sizeY) != 1) Debug("sizeY?", 1);
if(fscanf(fp, "nPartX:%i\n", &nPartX) != 1) Debug("nPartX?", 1);
if(fscanf(fp, "nPartY:%i\n", &nPartY) != 1) Debug("nPartY?", 1);
if(fscanf(fp, "nCellX:%i\n", &nCellX) != 1) Debug("nCellX?", 1); //read value is 10
if(fscanf(fp, "nCellY:%i\n", &nCellY) != 1) Debug("nCellY?", 1);
if(fscanf(fp, "steps: %li\n", &steps) != 1) Debug("steps?", 1);
//here the nCellX variable value 10 is changed somehow to 0
if(fscanf(fp, "dt: %lf\n", &dt) != 1) Debug("dt?", 1);
if(fscanf(fp, "logs: %c\n", &c) != 1) Debug("logs?", 1);
logs = (c == 'y');
fclose(fp);
}
printf("(%i) reporting in...\n", rank);
MPI_Bcast(&sizeX, 1, MPI_DOUBLE, 0, grid_comm);
MPI_Bcast(&sizeY, 1, MPI_DOUBLE, 0, grid_comm);
MPI_Bcast(&nPartX,1, MPI_INT, 0, grid_comm);
MPI_Bcast(&nPartY,1, MPI_INT, 0, grid_comm);
MPI_Bcast(&nCellX,1, MPI_INT, 0, grid_comm);
MPI_Bcast(&nCellY,1, MPI_INT, 0, grid_comm);
MPI_Bcast(&steps, 1, MPI_INT, 0, grid_comm);
MPI_Bcast(&dt, 1, MPI_DOUBLE, 0, grid_comm);
MPI_Bcast(&logs, 1, MPI_INT, 0, grid_comm);
nPart = nPartX * nPartY;
dt2 = dt * dt;
}
先生と私たちは「nCellX_2」に「nCellX」から変数名を変更した場合、問題が消えて、期待通りのコードが動作することを結論付けています。もう一つ興味深いのは、唯一、この単一のグローバル変数は、この問題を持っていることを、他の変数が正しく動作しています。誰もこの種の問題に遭遇したのだろうかと疑問に思っていた。どんなガイドライン/説明も認められるでしょう。
この問題が十分に解明されていない場合は、完全なコードが必要な場合にもお知らせください。一般に、コードはParticle-In-Cellの並列アルゴリズムです。
は、あなたのプログラムがマルチスレッドですか? 'DEBUG'のコードは何ですか? – Shahbaz
コンパイラの警告が表示されますか? '-Wall -Wextra -pedantic'を使ってコンパイルして、何かが得られるかどうか調べてください。 – Collin
また、 'nCellX'をいくつかの初期値に設定して定義してみてください。その名前がエラーの原因となる前に(たとえば、MPIのどこかで)初期化されていた場合は、 – Collin