Skip to content

Commit

Permalink
misc cleanup for replay
Browse files Browse the repository at this point in the history
  • Loading branch information
cyrush committed May 30, 2024
1 parent 6011600 commit 14ec61d
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 189 deletions.
162 changes: 0 additions & 162 deletions src/libs/ascent/hola/ascent_hola.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,168 +42,6 @@ using namespace std;
namespace ascent
{

// todo: this belongs in conduit relay io

class BlueprintTreePathGenerator
{
public:
//-------------------------------------------------------------------//
BlueprintTreePathGenerator(const std::string &file_pattern,
const std::string &tree_pattern,
int num_files,
int num_trees,
const std::string &protocol,
const Node &mesh_index)
: m_file_pattern(file_pattern),
m_tree_pattern(tree_pattern),
m_num_files(num_files),
m_num_trees(num_trees),
m_protocol(protocol),
m_mesh_index(mesh_index)
{

}

//-------------------------------------------------------------------//
~BlueprintTreePathGenerator()
{

}

//-------------------------------------------------------------------//
std::string Expand(const std::string pattern,
int idx) const
{
//
// Note: This currently only handles format strings:
// "%05d" "%06d" "%07d"
//

std::size_t pattern_idx = pattern.find("%05d");

if(pattern_idx != std::string::npos)
{
char buff[16];
snprintf(buff,16,"%05d",idx);
std::string res = pattern;
res.replace(pattern_idx,4,std::string(buff));
return res;
}

pattern_idx = pattern.find("%06d");

if(pattern_idx != std::string::npos)
{
char buff[16];
snprintf(buff,16,"%06d",idx);
std::string res = pattern;
res.replace(pattern_idx,4,std::string(buff));
return res;
}

pattern_idx = pattern.find("%07d");

if(pattern_idx != std::string::npos)
{
char buff[16];
snprintf(buff,16,"%07d",idx);
std::string res = pattern;
res.replace(pattern_idx,4,std::string(buff));
return res;
}
return pattern;
}

void gen_domain_to_file_map(int num_domains,
int num_files,
Node &out) const
{
int num_domains_per_file = num_domains / num_files;
int left_overs = num_domains % num_files;

out["global_domains_per_file"].set(DataType::int32(num_files));
out["global_domain_offsets"].set(DataType::int32(num_files));
out["global_domain_to_file"].set(DataType::int32(num_domains));

int32_array v_domains_per_file = out["global_domains_per_file"].value();
int32_array v_domains_offsets = out["global_domain_offsets"].value();
int32_array v_domain_to_file = out["global_domain_to_file"].value();

// setup domains per file
for(int f=0; f < num_files; f++)
{
v_domains_per_file[f] = num_domains_per_file;
if( f < left_overs)
v_domains_per_file[f]+=1;
}

// prefix sum to calc offsets
for(int f=0; f < num_files; f++)
{
v_domains_offsets[f] = v_domains_per_file[f];
if(f > 0)
v_domains_offsets[f] += v_domains_offsets[f-1];
}

// do assignment, create simple map
int f_idx = 0;
for(int d=0; d < num_domains; d++)
{
if(d >= v_domains_offsets[f_idx])
f_idx++;
v_domain_to_file[d] = f_idx;
}
}
//-------------------------------------------------------------------//
std::string GenerateFilePath(int tree_id) const
{
int file_id = -1;

if(m_num_trees == m_num_files)
{
file_id = tree_id;
}
else if(m_num_files == 1)
{
file_id = 0;
}
else
{
Node d2f_map;
gen_domain_to_file_map(m_num_trees,
m_num_files,
d2f_map);
int num_domains_per_file = m_num_trees / m_num_files;
int left_overs = m_num_trees % m_num_files;
int32_array v_domain_to_file = d2f_map["global_domain_to_file"].value();
file_id = v_domain_to_file[tree_id];
}

return Expand(m_file_pattern,file_id);
}

//-------------------------------------------------------------------//
std::string GenerateTreePath(int tree_id) const
{
// the tree path should always end in a /
std::string res = Expand(m_tree_pattern,tree_id);
if( (res.size() > 0) && (res[res.size()-1] != '/') )
{
res += "/";
}
return res;
}

private:
std::string m_file_pattern;
std::string m_tree_pattern;
int m_num_files;
int m_num_trees;
std::string m_protocol;
Node m_mesh_index;

};

//-----------------------------------------------------------------------------
void hola(const std::string &source,
const Node &options,
Expand Down
6 changes: 3 additions & 3 deletions src/utilities/replay/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ if (ENABLE_SERIAL)
NAME replay_ser
SOURCES ${REPLAY_SOURCES}
DEPENDS_ON ${replay_deps}
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})

# install target for replay serial
install(TARGETS replay_ser
Expand All @@ -46,9 +46,9 @@ if(MPI_FOUND)
NAME replay_mpi
SOURCES ${REPLAY_SOURCES}
DEPENDS_ON ${replay_mpi_deps}
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})

blt_add_target_compile_flags(TO replay_mpi FLAGS "-DREPLAY_MPI=1")
blt_add_target_compile_flags(TO replay_mpi FLAGS "-DASCENT_REPLAY_MPI=1")

# install target for replay mpi
install(TARGETS replay_mpi
Expand Down
64 changes: 40 additions & 24 deletions src/utilities/replay/replay.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,25 @@
//-----------------------------------------------------------------------------
#include <ascent.hpp>
#include <flow_timer.hpp>
#include <ascent_hola.hpp>
#include <conduit_relay_io_blueprint.hpp>

#include <fstream>
#include <vector>
#include <algorithm>
#ifdef REPLAY_MPI

#ifdef defined(ASCENT_REPLAY_MPI)
#include <mpi.h>
#include <conduit_relay_mpi.hpp>
#include <conduit_relay_mpi_io_blueprint.hpp>
#endif

//-----------------------------------------------------------------------------
// ascent includes
//-----------------------------------------------------------------------------
#include <ascent_logging.hpp>

#include <fstream>

void usage()
{
std::cout<<"replay usage:\n";
Expand All @@ -31,18 +41,18 @@ void usage()
std::cout<<" --root : the root file for a blueprint hdf5 set of files.\n";
std::cout<<" --cycles : a text file containing a list of root files, one per line.\n";
std::cout<<" Each file will be loaded and sent to Ascent in order.\n";
std::cout<<" --actions : a json file containing ascent actions. Default value\n";
std::cout<<" is 'ascent_actions.json'.\n\n";
std::cout<<" --actions : a yaml file containing ascent actions. Default value\n";
std::cout<<" is 'ascent_actions.yaml'.\n\n";
std::cout<<"======================== Examples =========================\n";
std::cout<<"./replay_ser --root=clover.cycle_000060.root\n";
std::cout<<"./replay_ser --root=clover.cycle_000060.root --actions=my_actions.json\n";
std::cout<<"./replay_ser --root=clover.cycle_000060.root --actions=my_actions.yaml\n";
std::cout<<"srun -n 4 replay_mpi --cycles=cycles_file\n";
std::cout<<"\n\n";
}

struct Options
{
std::string m_actions_file = "ascent_actions.json";
std::string m_actions_file = "ascent_actions.yaml";
std::string m_root_file;
std::string m_cycles_file;

Expand Down Expand Up @@ -146,7 +156,9 @@ void trim(std::string &s)
s.end());
}

int main (int argc, char *argv[])
//---------------------------------------------------------------------------//
int
main(int argc, char *argv[])
{
Options options;
options.parse(argc, argv);
Expand Down Expand Up @@ -176,21 +188,19 @@ int main (int argc, char *argv[])
int comm_size = 1;
int rank = 0;

#ifdef REPLAY_MPI
#ifdef ASCENT_REPLAY_MPI
MPI_Init(NULL,NULL);
MPI_Comm_size(MPI_COMM_WORLD, &comm_size);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
#endif

conduit::Node replay_data, replay_opts;
#ifdef REPLAY_MPI
replay_opts["mpi_comm"] = MPI_Comm_c2f(MPI_COMM_WORLD);
#endif
conduit::Node replay_data

//replay_data.print();
conduit::Node ascent_opts;
ascent_opts["actions_file"] = options.m_actions_file;
ascent_opts["ascent_info"] = "verbose";
#ifdef REPLAY_MPI
#ifdef ASCENT_REPLAY_MPI
ascent_opts["mpi_comm"] = MPI_Comm_c2f(MPI_COMM_WORLD);
#endif

Expand All @@ -204,42 +214,48 @@ int main (int argc, char *argv[])

for(int i = 0; i < time_steps.size(); ++i)
{
replay_opts["root_file"] = time_steps[i];
if(rank == 0)
{
std::cout<<"Root file "<<time_steps[i]<<"\n";
std::cout<< "[" << i << "]: Root file "<<time_steps[i]<<"\n";
}
flow::Timer load;
ascent::hola("relay/blueprint/mesh", replay_opts, replay_data);
#ifdef REPLAY_MPI

#if defined(ASCENT_MPI_ENABLED)
MPI_Comm comm = MPI_Comm_f2c(options["mpi_comm"].to_int());
conduit::relay::mpi::io::blueprint::load_mesh(time_steps[i],replay_data,comm);
#else
conduit::relay::io::blueprint::load_mesh(time_steps[i],replay_data);
#endif

#ifdef ASCENT_REPLAY_MPI
MPI_Barrier(MPI_COMM_WORLD);
#endif
float load_time = load.elapsed();

flow::Timer publish;
ascent.publish(replay_data);
#ifdef REPLAY_MPI
#ifdef ASCENT_REPLAY_MPI
MPI_Barrier(MPI_COMM_WORLD);
#endif
float publish_time = publish.elapsed();

flow::Timer execute;
ascent.execute(actions);
#ifdef REPLAY_MPI
#ifdef ASCENT_REPLAY_MPI
MPI_Barrier(MPI_COMM_WORLD);
#endif
float execute_time = execute.elapsed();
if(rank == 0)
{
std::cout<<" Load -----: "<<load_time<<"\n";
std::cout<<" Publish --: "<<publish_time<<"\n";
std::cout<<" Execute --: "<<execute_time<<"\n";
std::cout<< "[" << i << "]: Load -----: "<<load_time<<"\n";
std::cout<< "[" << i << "]: Publish --: "<<publish_time<<"\n";
std::cout<< "[" << i << "]: Execute --: "<<execute_time<<"\n";
}
}

ascent.close();

#ifdef REPLAY_MPI
#ifdef ASCENT_REPLAY_MPI
MPI_Finalize();
#endif
return 0;
Expand Down

0 comments on commit 14ec61d

Please sign in to comment.