Чтение из двоичного файла изменяет размер MPI_COMM на одном процессоре - PullRequest
0 голосов
/ 10 марта 2019

Я пишу программу, которая записывает в двоичный файл, а затем читает из созданного двоичного файла, чтобы проверить правильность его содержимого. Сначала это делается на корневом процессоре, как показано в моем коде ниже. При чтении из двоичного файла на корневом узле размер MPI_COMM изменяется на ноль, оставаясь неизменным на других процессорах. Я не понимаю, почему чтение из файла сделало бы это. Операторы печати должны возвращать размер. Я использовал 2 процессора, поэтому операторы rpint должны возвращать 2

Я скомпилировал код, используя mpicxx -O0 -std = c ++ 11.

Вот код:

#include <mpi.h>
#include <fstream>
#include <sstream>
#include <vector>

int main(int argc, char *argv[])
{
  //----------------------------------------------------------------
  // Initialise MPI
  //----------------------------------------------------------------
  int my_rank = 0; //variable to store rank of each processor
  int size = 2; //No. processors in MPI_COMM_WORLD
  bool root = false; //flag identifying root process
  int N = 100000000; //Number array elements to write to output file

  //Initialise mpi with c bindings
  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); //get rank
  MPI_Comm_size(MPI_COMM_WORLD, &size); //get No. processors

  std::cout << size << std::endl;

  //set root processor as 0
  if (my_rank == 0)
    {
      root = true;
    }


  MPI_Barrier(MPI_COMM_WORLD);

  //Define a vector of int array to store ints
  std::vector<int> write_int_array(N,0);

  // Open file on root process
  if (root)
    {
      std::ofstream outFile_1("output_serial.txt", 
std::fstream::binary); //create output file

      for(int i = 0; i < N; i++)
        {
      outFile_1.write(reinterpret_cast<const char*>(&write_int_array[i]), sizeof(write_int_array));
        }

      outFile_1.close();//close file
    }

  MPI_Barrier(MPI_COMM_WORLD);



  std::vector<int> read_int_array(N); // create vector to store files

  if (root)
    {

      std::ifstream inFile_1("output_serial.txt", std::fstream::binary);

      std::cout << "3. " << size << std::endl;

      inFile_1.read(reinterpret_cast<char*>(&read_int_array), sizeof(read_int_array)*sizeof(int));

      std::cout << "4. " << size << std::endl;

      inFile_1.close();

      if (read_int_array == write_int_array)
        {
          std::cout << "Serial write to output_serial.txt successful" << std::endl;
        }
      else
        {
          std::cout << "Serial write to output_serial.txt unsuccessful" << std::endl;
       }
    }

   MPI_Finalize;
  return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...