2

クラスター上の512プロセスでこの単純なコードを実行すると、 MPIコードがデッドロックします。私はメモリの限界には程遠いです。プロセスの数を2048に増やすと、この問題には多すぎるため、コードが再び実行されます。を含む行でデッドロックが発生します。MPI_File_write_all

助言がありますか?

int count = imax*jmax*kmax;

// CREATE THE SUBARRAY
MPI_Datatype subarray;
int totsize [3] = {kmax, jtot, itot};
int subsize [3] = {kmax, jmax, imax};
int substart[3] = {0, mpicoordy*jmax, mpicoordx*imax};
MPI_Type_create_subarray(3, totsize, subsize, substart, MPI_ORDER_C, MPI_DOUBLE, &subarray);
MPI_Type_commit(&subarray);

// SET THE VALUE OF THE GRID EQUAL TO THE PROCESS ID FOR CHECKING
if(mpiid == 0) std::printf("Setting the value of the array\n");
for(int i=0; i<count; i++)
  u[i] = (double)mpiid;

// WRITE THE FULL GRID USING MPI-IO
if(mpiid == 0) std::printf("Write the full array to disk\n");
char filename[] = "u.dump";
MPI_File fh;
if(MPI_File_open(commxy, filename, MPI_MODE_CREATE | MPI_MODE_WRONLY | MPI_MODE_EXCL, MPI_INFO_NULL, &fh))
  return 1;

// select noncontiguous part of 3d array to store the selected data
MPI_Offset fileoff = 0; // the offset within the file (header size)
char name[] = "native";

if(MPI_File_set_view(fh, fileoff, MPI_DOUBLE, subarray, name, MPI_INFO_NULL))
  return 1;

if(MPI_File_write_all(fh, u, count, MPI_DOUBLE, MPI_STATUS_IGNORE))
  return 1;

if(MPI_File_close(&fh))
  return 1;
4

1 に答える 1

2

あなたのコードは、簡単な検査で正しく見えます。MPI-IO ライブラリに何が問題なのかを教えてもらうことをお勧めします。エラーから戻るのではなく、少なくともエラーを表示しないのはなぜですか? 役立つコードを次に示します。


static void handle_error(int errcode, char *str)
{
        char msg[MPI_MAX_ERROR_STRING];
        int resultlen;
        MPI_Error_string(errcode, msg, &resultlen);
        fprintf(stderr, "%s: %s\n", str, msg);
        MPI_Abort(MPI_COMM_WORLD, 1);
}

MPI_SUCCESS は 0 であることが保証されていますか? むしろ見たい


 errcode = MPI_File_routine();
 if (errcode != MPI_SUCCESS) handle_error(errcode, "MPI_File_open(1)");

それを入れて、単調に減少しないオフセットでファイルビューを設定するなどのトリッキーなことをしている場合、エラー文字列は何が悪いのかを示唆している可能性があります。

于 2012-09-15T19:06:30.450 に答える