Skip to content

Commit

Permalink
Upgrade write_vtu_in_parallel based on mpi large IO update
Browse files Browse the repository at this point in the history
Updating author name

fixing work

update indent

Remove the broadcast and fix some comment and fix author name

updates

updates!

last fix

fixing indent
  • Loading branch information
pengfej committed May 25, 2022
1 parent 9dd448b commit e4b1579
Showing 1 changed file with 54 additions and 10 deletions.
64 changes: 54 additions & 10 deletions source/base/data_out_base.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include <deal.II/base/data_out_base.h>
#include <deal.II/base/memory_consumption.h>
#include <deal.II/base/mpi.h>
#include <deal.II/base/mpi_large_count.h>
#include <deal.II/base/parameter_handler.h>
#include <deal.II/base/thread_management.h>
#include <deal.II/base/utilities.h>
Expand Down Expand Up @@ -7673,6 +7674,7 @@ DataOutInterface<dim, spacedim>::write_svg(std::ostream &out) const
out);
}


template <int dim, int spacedim>
void
DataOutInterface<dim, spacedim>::write_vtu_in_parallel(
Expand All @@ -7689,7 +7691,7 @@ DataOutInterface<dim, spacedim>::write_vtu_in_parallel(
#else

const int myrank = Utilities::MPI::this_mpi_process(comm);

const int n_ranks = Utilities::MPI::n_mpi_processes(comm);
MPI_Info info;
int ierr = MPI_Info_create(&info);
AssertThrowMPI(ierr);
Expand All @@ -7707,6 +7709,7 @@ DataOutInterface<dim, spacedim>::write_vtu_in_parallel(
ierr = MPI_Info_free(&info);
AssertThrowMPI(ierr);

// Define header size so we can broadcast later.
unsigned int header_size;

// write header
Expand All @@ -7715,13 +7718,15 @@ DataOutInterface<dim, spacedim>::write_vtu_in_parallel(
std::stringstream ss;
DataOutBase::write_vtu_header(ss, vtk_flags);
header_size = ss.str().size();
// Write the header on rank 0 and automatically move the
// shared file pointer to the location after header;
ierr = MPI_File_write_shared(
fh, ss.str().c_str(), header_size, MPI_CHAR, MPI_STATUS_IGNORE);
// Write the header on rank 0 at the starting of a file, i.e., offset 0.
ierr = MPI_File_write_at(
fh, 0, ss.str().c_str(), header_size, MPI_CHAR, MPI_STATUS_IGNORE);
AssertThrowMPI(ierr);
}

ierr = MPI_Bcast(&header_size, 1, MPI_UNSIGNED, 0, comm);
AssertThrowMPI(ierr);


{
const auto &patches = get_patches();
Expand All @@ -7741,19 +7746,58 @@ DataOutInterface<dim, spacedim>::write_vtu_in_parallel(
vtk_flags,
ss);

ierr = MPI_File_write_ordered(
fh, ss.str().c_str(), ss.str().size(), MPI_CHAR, MPI_STATUS_IGNORE);
// using prefix sum to find specific offset to write at.
const std::uint64_t size_on_proc = ss.str().size();
std::uint64_t prefix_sum = 0;
ierr =
MPI_Exscan(&size_on_proc, &prefix_sum, 1, MPI_UINT64_T, MPI_SUM, comm);
AssertThrowMPI(ierr);

// Locate specific offset for each processor.
const MPI_Offset offset = static_cast<MPI_Offset>(header_size) + prefix_sum;

ierr =
Utilities::MPI::LargeCount::MPI_File_write_at_all_c(fh,
offset,
ss.str().c_str(),
ss.str().size(),
MPI_CHAR,
MPI_STATUS_IGNORE);
AssertThrowMPI(ierr);

// Sending the offset for writing the footer to rank 0.
if (myrank == n_ranks - 1)
{
const std::uint64_t footer_offset = size_on_proc + offset;
ierr = MPI_Send(&footer_offset, 1, MPI_UINT64_T, 0, 0, comm);
AssertThrowMPI(ierr);
}
}

// write footer
if (myrank == 0)
{
std::stringstream ss;
DataOutBase::write_vtu_footer(ss);
unsigned int footer_size = ss.str().size();
ierr = MPI_File_write_shared(
fh, ss.str().c_str(), footer_size, MPI_CHAR, MPI_STATUS_IGNORE);
const unsigned int footer_size = ss.str().size();

std::uint64_t footer_offset;
ierr = MPI_Recv(&footer_offset,
1,
MPI_UINT64_T,
n_ranks - 1,
0,
comm,
MPI_STATUS_IGNORE);
AssertThrowMPI(ierr);

// Writing Footer.
ierr = MPI_File_write_at(fh,
footer_offset,
ss.str().c_str(),
footer_size,
MPI_CHAR,
MPI_STATUS_IGNORE);
AssertThrowMPI(ierr);
}
ierr = MPI_File_close(&fh);
Expand Down

0 comments on commit e4b1579

Please sign in to comment.