Я пишу программу, которая записывает в двоичный файл, а затем читает из созданного двоичного файла, чтобы проверить правильность его содержимого. Сначала это делается на корневом процессоре, как показано в моем коде ниже. При чтении из двоичного файла на корневом узле размер 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;
}