CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
248 lines
7.6 KiB
C++
248 lines
7.6 KiB
C++
// Copyright (c) Advanced Micro Devices, Inc.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
#pragma once
|
|
|
|
#include "fwd.hpp"
|
|
#include "module_function.hpp"
|
|
|
|
#include <spdlog/fmt/fmt.h>
|
|
#include <timemory/log/color.hpp>
|
|
#include <timemory/mpl/policy.hpp>
|
|
#include <timemory/settings.hpp>
|
|
#include <timemory/settings/types.hpp>
|
|
#include <timemory/tpls/cereal/cereal.hpp>
|
|
#include <timemory/utility/filepath.hpp>
|
|
|
|
static inline void
|
|
dump_info(std::ostream& _os, const fmodset_t& _data)
|
|
{
|
|
module_function::reset_width();
|
|
for(const auto& itr : _data)
|
|
module_function::update_width(itr);
|
|
|
|
module_function::write_header(_os);
|
|
for(const auto& itr : _data)
|
|
_os << itr << '\n';
|
|
|
|
module_function::reset_width();
|
|
}
|
|
//
|
|
template <typename ArchiveT>
|
|
requires tim::concepts::is_archive<ArchiveT>::value
|
|
static inline void
|
|
dump_info(ArchiveT& _ar, const fmodset_t& _data)
|
|
{
|
|
_ar(tim::cereal::make_nvp("module_functions", _data));
|
|
}
|
|
//
|
|
static inline void
|
|
dump_info(const string_t& _label, string_t _oname, const string_t& _ext,
|
|
const fmodset_t& _data, int _level, bool _fail)
|
|
{
|
|
namespace cereal = tim::cereal;
|
|
namespace policy = tim::policy;
|
|
|
|
auto _cfg = tim::settings::compose_filename_config{};
|
|
_cfg.subdirectory = "instrumentation";
|
|
_oname = tim::settings::compose_output_filename(_oname, _ext, _cfg);
|
|
auto _handle_error = [&]() {
|
|
std::stringstream _msg{};
|
|
_msg << "[dump_info] Error opening '" << _oname << " for output";
|
|
verbprintf(_level, "%s\n", _msg.str().c_str());
|
|
if(_fail)
|
|
throw std::runtime_error(std::string{ "[rocprof-sys][exe]" } + _msg.str());
|
|
};
|
|
|
|
if(!debug_print && verbose_level < _level) return;
|
|
|
|
if(_ext == "txt")
|
|
{
|
|
std::ofstream ofs{};
|
|
if(!tim::filepath::open(ofs, _oname))
|
|
_handle_error();
|
|
else
|
|
{
|
|
verbprintf_bare(_level, "%s", ::tim::log::color::source());
|
|
verbprintf(_level, "Outputting '%s'... ", _oname.c_str());
|
|
dump_info(ofs, _data);
|
|
verbprintf_bare(_level, "Done\n%s", ::tim::log::color::end());
|
|
}
|
|
ofs.close();
|
|
}
|
|
else if(_ext == "xml")
|
|
{
|
|
std::stringstream oss{};
|
|
{
|
|
using output_policy = policy::output_archive<cereal::XMLOutputArchive>;
|
|
output_policy::indent() = true;
|
|
auto ar = output_policy::get(oss);
|
|
|
|
ar->setNextName("rocprofsys");
|
|
ar->startNode();
|
|
ar->setNextName(_label.c_str());
|
|
ar->startNode();
|
|
(*ar)(cereal::make_nvp("module_functions", _data));
|
|
ar->finishNode();
|
|
ar->finishNode();
|
|
}
|
|
|
|
std::ofstream ofs{};
|
|
if(!tim::filepath::open(ofs, _oname))
|
|
_handle_error();
|
|
else
|
|
{
|
|
verbprintf_bare(_level, "%s", ::tim::log::color::source());
|
|
verbprintf(_level, "Outputting '%s'... ", _oname.c_str());
|
|
ofs << oss.str() << std::endl;
|
|
verbprintf_bare(_level, "Done\n%s", ::tim::log::color::end());
|
|
}
|
|
ofs.close();
|
|
}
|
|
else if(_ext == "json")
|
|
{
|
|
std::stringstream oss{};
|
|
{
|
|
using output_policy = policy::output_archive<cereal::PrettyJSONOutputArchive>;
|
|
auto ar = output_policy::get(oss);
|
|
|
|
ar->setNextName("rocprofsys");
|
|
ar->startNode();
|
|
ar->setNextName(_label.c_str());
|
|
ar->startNode();
|
|
(*ar)(cereal::make_nvp("module_functions", _data));
|
|
ar->finishNode();
|
|
ar->finishNode();
|
|
}
|
|
|
|
std::ofstream ofs{};
|
|
if(!tim::filepath::open(ofs, _oname))
|
|
_handle_error();
|
|
else
|
|
{
|
|
verbprintf_bare(_level, "%s", ::tim::log::color::source());
|
|
verbprintf(_level, "Outputting '%s'... ", _oname.c_str());
|
|
ofs << oss.str() << std::endl;
|
|
verbprintf_bare(_level, "Done\n%s", ::tim::log::color::end());
|
|
}
|
|
ofs.close();
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error(
|
|
fmt::format("[rocprof-sys][exe] Error in {} :: filename '{}' does not have "
|
|
"one of recognized file extensions: txt, json, xml",
|
|
__FUNCTION__, _oname));
|
|
}
|
|
}
|
|
//
|
|
static inline void
|
|
dump_info(const string_t& _oname, const fmodset_t& _data, int _level, bool _fail,
|
|
const string_t& _type, const strset_t& _ext)
|
|
{
|
|
for(const auto& itr : _ext)
|
|
dump_info(_type, _oname, itr, _data, _level, _fail);
|
|
}
|
|
//
|
|
static inline void
|
|
load_info(const string_t& _label, const string_t& _iname, fmodset_t& _data, int _level)
|
|
{
|
|
namespace cereal = tim::cereal;
|
|
namespace policy = tim::policy;
|
|
|
|
auto _pos = _iname.find_last_of('.');
|
|
std::string _ext = {};
|
|
if(_pos != std::string::npos) _ext = _iname.substr(_pos + 1);
|
|
|
|
auto _handle_error = [&]() {
|
|
std::stringstream _msg{};
|
|
_msg << "[load_info] Error opening '" << _iname << " for input";
|
|
verbprintf(_level, "%s\n", _msg.str().c_str());
|
|
throw std::runtime_error(std::string{ "[rocprof-sys][exe]" } + _msg.str());
|
|
};
|
|
|
|
if(_ext == "xml")
|
|
{
|
|
verbprintf(_level, "Reading '%s'... ", _iname.c_str());
|
|
std::ifstream ifs{ _iname };
|
|
if(!ifs)
|
|
_handle_error();
|
|
else
|
|
{
|
|
using input_policy = policy::input_archive<cereal::XMLInputArchive>;
|
|
auto ar = input_policy::get(ifs);
|
|
|
|
ar->setNextName("rocprofsys");
|
|
ar->startNode();
|
|
ar->setNextName(_label.c_str());
|
|
ar->startNode();
|
|
(*ar)(cereal::make_nvp("module_functions", _data));
|
|
ar->finishNode();
|
|
ar->finishNode();
|
|
}
|
|
verbprintf_bare(_level, "Done\n");
|
|
ifs.close();
|
|
}
|
|
else if(_ext == "json")
|
|
{
|
|
verbprintf(_level, "Reading '%s'... ", _iname.c_str());
|
|
std::ifstream ifs{ _iname };
|
|
if(!ifs)
|
|
_handle_error();
|
|
else
|
|
{
|
|
using input_policy = policy::input_archive<cereal::JSONInputArchive>;
|
|
auto ar = input_policy::get(ifs);
|
|
|
|
ar->setNextName("rocprofsys");
|
|
ar->startNode();
|
|
ar->setNextName(_label.c_str());
|
|
ar->startNode();
|
|
(*ar)(cereal::make_nvp("module_functions", _data));
|
|
ar->finishNode();
|
|
ar->finishNode();
|
|
}
|
|
verbprintf_bare(_level, "Done\n");
|
|
ifs.close();
|
|
}
|
|
else
|
|
{
|
|
throw std::runtime_error(
|
|
fmt::format("[rocprof-sys][exe] Error in {} :: filename '{}' does not have "
|
|
"one of recognized extentions: txt, json, xml :: {}",
|
|
__FUNCTION__, _iname, _ext));
|
|
}
|
|
}
|
|
//
|
|
static inline void
|
|
load_info(const string_t& _inp, std::map<std::string, fmodset_t*>& _data, int _level)
|
|
{
|
|
std::vector<std::string> _exceptions{};
|
|
_exceptions.reserve(_data.size());
|
|
for(auto& itr : _data)
|
|
{
|
|
try
|
|
{
|
|
fmodset_t _tmp{};
|
|
load_info(itr.first, _inp, _tmp, _level);
|
|
// add to the existing
|
|
itr.second->insert(_tmp.begin(), _tmp.end());
|
|
// if it did not throw it was successfully loaded
|
|
_exceptions.clear();
|
|
break;
|
|
} catch(std::exception& _e)
|
|
{
|
|
_exceptions.emplace_back(_e.what());
|
|
}
|
|
}
|
|
if(!_exceptions.empty())
|
|
{
|
|
std::stringstream _msg{};
|
|
for(auto& itr : _exceptions)
|
|
{
|
|
_msg << "[rocprof-sys][exe] " << itr << "\n";
|
|
}
|
|
throw std::runtime_error(_msg.str());
|
|
}
|
|
}
|