Enable MPI tracing for Fortran (#185)

- Move the MPI gotcha functionality from Timemory to the repo.
- Add the PMPI Fortran MPI functions to the existing mpi gotcha handle.
This commit is contained in:
Sajina PK
2025-06-04 18:06:18 -04:00
committad av GitHub
förälder b98c3c8b86
incheckning 4fcd8cc78d
13 ändrade filer med 1576 tillägg och 55 borttagningar
+4 -8
Visa fil
@@ -210,13 +210,12 @@ set(_ROCPROFSYS_MPI_HEADERS_ALLOW_MPICH ${MPI_HEADERS_ALLOW_MPICH})
if(ROCPROFSYS_USE_MPI)
find_package(MPI ${rocprofiler_systems_FIND_QUIETLY} REQUIRED)
target_link_libraries(rocprofiler-systems-mpi INTERFACE MPI::MPI_C MPI::MPI_CXX)
rocprofiler_systems_target_compile_definitions(
rocprofiler-systems-mpi INTERFACE TIMEMORY_USE_MPI=1 ROCPROFSYS_USE_MPI)
rocprofiler_systems_target_compile_definitions(rocprofiler-systems-mpi
INTERFACE ROCPROFSYS_USE_MPI)
elseif(ROCPROFSYS_USE_MPI_HEADERS)
find_package(MPI-Headers ${rocprofiler_systems_FIND_QUIETLY} REQUIRED)
rocprofiler_systems_target_compile_definitions(
rocprofiler-systems-mpi INTERFACE TIMEMORY_USE_MPI_HEADERS=1
ROCPROFSYS_USE_MPI_HEADERS)
rocprofiler_systems_target_compile_definitions(rocprofiler-systems-mpi
INTERFACE ROCPROFSYS_USE_MPI_HEADERS)
target_link_libraries(rocprofiler-systems-mpi INTERFACE MPI::MPI_HEADERS)
endif()
@@ -543,9 +542,6 @@ set(TIMEMORY_QUIET_CONFIG
CACHE BOOL "Make timemory configuration quieter")
# timemory feature settings
set(TIMEMORY_USE_MPI
${ROCPROFSYS_USE_MPI}
CACHE BOOL "Enable MPI support in timemory" FORCE)
set(TIMEMORY_USE_GOTCHA
ON
CACHE BOOL "Enable GOTCHA support in timemory")
+1 -1
Visa fil
@@ -41,7 +41,7 @@ if((NOT CMAKE_CXX_COMPILER_IS_HIPCC OR (NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang
return()
endif()
option(TRANSPOSE_USE_MPI "Enable MPI support in transpose exe" ${TIMEMORY_USE_MPI})
option(TRANSPOSE_USE_MPI "Enable MPI support in transpose exe" ${ROCPROFSYS_USE_MPI})
find_package(Threads REQUIRED)
if(TRANSPOSE_USE_MPI)
@@ -1711,8 +1711,10 @@ main(int argc, char** argv)
{ "rocprofsys_user_stop_thread_trace" });
#if ROCPROFSYS_USE_MPI > 0 || ROCPROFSYS_USE_MPI_HEADERS > 0
// if any of the below MPI functions are found, enable MPI support
for(const auto* itr : { "MPI_Init", "MPI_Init_thread", "MPI_Finalize",
"MPI_Comm_rank", "MPI_Comm_size" })
for(const auto* itr :
{ "MPI_Init", "MPI_Init_thread", "MPI_Finalize", "MPI_Comm_rank", "MPI_Comm_size",
"MPI_INIT", "mpi_init", "mpi_init_", "mpi_init__", "MPI_INIT_THREAD",
"mpi_init_thread", "mpi_init_thread_", "mpi_init_thread__" })
{
if(find_function(app_image, itr) != nullptr)
{
+1
Visa fil
@@ -31,6 +31,7 @@ set(core_headers
${CMAKE_CURRENT_LIST_DIR}/exception.hpp
${CMAKE_CURRENT_LIST_DIR}/gpu.hpp
${CMAKE_CURRENT_LIST_DIR}/locking.hpp
${CMAKE_CURRENT_LIST_DIR}/mpi.hpp
${CMAKE_CURRENT_LIST_DIR}/mproc.hpp
${CMAKE_CURRENT_LIST_DIR}/perf.hpp
${CMAKE_CURRENT_LIST_DIR}/perfetto.hpp
+3 -3
Visa fil
@@ -1046,7 +1046,7 @@ configure_settings(bool _init)
settings::use_output_suffix() = _config->get<bool>("ROCPROFSYS_USE_PID");
if(settings::use_output_suffix())
settings::default_process_suffix() = process::get_id();
#if !defined(TIMEMORY_USE_MPI) && defined(TIMEMORY_USE_MPI_HEADERS)
#if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS)
if(tim::dmp::is_initialized()) settings::default_process_suffix() = tim::dmp::rank();
#endif
@@ -1367,7 +1367,7 @@ configure_disabled_settings(const std::shared_ptr<settings>& _config)
_config->find(itr)->second->set_hidden(true);
#endif
#if !defined(TIMEMORY_USE_MPI) || TIMEMORY_USE_MPI == 0
#if !defined(ROCPROFSYS_USE_MPI) || ROCPROFSYS_USE_MPI == 0
_config->disable("ROCPROFSYS_PERFETTO_COMBINE_TRACES");
_config->disable("ROCPROFSYS_COLLAPSE_PROCESSES");
_config->find("ROCPROFSYS_PERFETTO_COMBINE_TRACES")->second->set_hidden(true);
@@ -1991,7 +1991,7 @@ get_perfetto_buffer_size()
bool
get_perfetto_combined_traces()
{
#if defined(TIMEMORY_USE_MPI) && TIMEMORY_USE_MPI > 0
#if defined(ROCPROFSYS_USE_MPI) && ROCPROFSYS_USE_MPI > 0
static auto _v = get_config()->find("ROCPROFSYS_PERFETTO_COMBINE_TRACES");
return static_cast<tim::tsettings<bool>&>(*_v->second).get();
#else
+2 -2
Visa fil
@@ -159,9 +159,9 @@ as_hex<void*>(void*, size_t);
#endif
#if !defined(ROCPROFSYS_DEBUG_PROCESS_IDENTIFIER)
# if defined(TIMEMORY_USE_MPI)
# if defined(ROCPROFSYS_USE_MPI)
# define ROCPROFSYS_DEBUG_PROCESS_IDENTIFIER static_cast<int>(::tim::dmp::rank())
# elif defined(TIMEMORY_USE_MPI_HEADERS)
# elif defined(ROCPROFSYS_USE_MPI_HEADERS)
# define ROCPROFSYS_DEBUG_PROCESS_IDENTIFIER \
(::tim::dmp::is_initialized()) ? static_cast<int>(::tim::dmp::rank()) \
: static_cast<int>(::tim::process::get_id())
+725
Visa fil
@@ -0,0 +1,725 @@
// MIT License
//
// Copyright (c) 2022-2025 Advanced Micro Devices, Inc. All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
/*
* Defines mpi functions and dummy functions when compiled without MPI
*
*/
#pragma once
#include "debug.hpp"
#include <timemory/timemory.hpp>
#include <timemory/environment/declaration.hpp>
#include <timemory/utility/types.hpp>
#include <cstdint>
#include <map>
#include <unordered_map>
#if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS) && \
!defined(OMPI_SKIP_MPICXX)
# define ROCPROFSYS_UNDEFINE_OMPI_SKIP_MPICXX 1
# define OMPI_SKIP_MPICXX 1
#endif
#if defined(ROCPROFSYS_USE_MPI) || defined(ROCPROFSYS_USE_MPI_HEADERS)
# include <mpi.h>
#endif
#if defined(MPICH) && MPICH > 0
# define ROCPROFSYS_MPI_MPICH 1
#elif defined(OMPI_MAJOR_VERSION) && defined(OMPI_MINOR_VERSION) && \
defined(OMPI_PATCH_VERSION)
# define ROCPROFSYS_MPI_OPENMPI 1
#endif
namespace rocprofsys
{
namespace mpi
{
//--------------------------------------------------------------------------------------//
#if !defined(ROCPROFSYS_USE_MPI)
struct dummy_data_type
{
enum type
{
int_t,
float_t,
double_t
};
};
#endif
//--------------------------------------------------------------------------------------//
#if !defined(ROCPROFSYS_USE_MPI) && !defined(MPI_INT)
# define MPI_INT ::rocprofsys::mpi::dummy_data_type::int_t
#endif
#if !defined(ROCPROFSYS_USE_MPI) && !defined(MPI_FLOAT)
# define MPI_FLOAT ::rocprofsys::mpi::dummy_data_type::float_t
#endif
#if !defined(ROCPROFSYS_USE_MPI) && !defined(MPI_DOUBLE)
# define MPI_DOUBLE ::rocprofsys::mpi::dummy_data_type::double_t
#endif
//--------------------------------------------------------------------------------------//
#if defined(ROCPROFSYS_USE_MPI) || defined(ROCPROFSYS_USE_MPI_HEADERS)
# if defined(MPICH) && (MPICH > 0)
static constexpr bool is_mpich = true;
# else
static constexpr bool is_mpich = false;
# endif
# if defined(OPEN_MPI) && (OPEN_MPI > 0)
static constexpr bool is_openmpi = true;
# else
static constexpr bool is_openmpi = false;
# endif
#endif
//--------------------------------------------------------------------------------------//
#if defined(ROCPROFSYS_USE_MPI) || defined(ROCPROFSYS_USE_MPI_HEADERS)
using comm_t = MPI_Comm;
using info_t = MPI_Info;
using data_type_t = MPI_Datatype;
using status_t = MPI_Status;
# if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS) && \
defined(OPEN_MPI) && (OPEN_MPI > 0)
static const comm_t comm_world_v = nullptr;
static const comm_t comm_self_v = nullptr;
static const info_t info_null_v = nullptr;
# else
static const comm_t comm_world_v = MPI_COMM_WORLD;
static const comm_t comm_self_v = MPI_COMM_SELF;
static const info_t info_null_v = MPI_INFO_NULL;
# endif
static const int success_v = MPI_SUCCESS;
static const int comm_type_shared_v = MPI_COMM_TYPE_SHARED;
namespace threading
{
enum : int
{
/// Only one thread will execute.
single = MPI_THREAD_SINGLE,
/// Only main thread will do MPI calls. The process may be multi-threaded, but only
/// the main thread will make MPI calls (all MPI calls are funneled to the main
/// thread)
funneled = MPI_THREAD_FUNNELED,
/// Only one thread at the time do MPI calls. The process may be multi-threaded, and
/// multiple threads may make MPI calls, but only one at a time: MPI calls are not
/// made concurrently from two distinct threads (all MPI calls are serialized).
serialized = MPI_THREAD_SERIALIZED,
/// Multiple thread may do MPI calls with no restrictions.
multiple = MPI_THREAD_MULTIPLE
};
} // namespace threading
#else // dummy MPI types
using comm_t = int32_t;
using info_t = int32_t;
using data_type_t = int32_t;
using status_t = int32_t;
static const comm_t comm_world_v = 0;
static const comm_t comm_self_v = 0;
static const info_t info_null_v = 0;
static const int success_v = 0;
static const int comm_type_shared_v = 0;
namespace threading
{
enum : int
{
/// Only one thread will execute.
single = 0,
/// Only main thread will do MPI calls. The process may be multi-threaded, but only
/// the main thread will make MPI calls (all MPI calls are funneled to the main
/// thread)
funneled = 1,
/// Only one thread at the time do MPI calls. The process may be multi-threaded, and
/// multiple threads may make MPI calls, but only one at a time: MPI calls are not
/// made concurrently from two distinct threads (all MPI calls are serialized).
serialized = 2,
/// Multiple thread may do MPI calls with no restrictions.
multiple = 3
};
} // namespace threading
#endif
//--------------------------------------------------------------------------------------//
namespace threading
{
inline auto
get_id()
{
return ::tim::threading::get_id();
}
} // namespace threading
template <typename Tp>
using communicator_map_t = std::unordered_map<comm_t, Tp>;
inline int32_t rank(comm_t = comm_world_v);
inline int32_t size(comm_t = comm_world_v);
inline void set_rank(int32_t, comm_t = comm_world_v);
inline void set_size(int32_t, comm_t = comm_world_v);
//--------------------------------------------------------------------------------------//
// Currently ROCPROFSYS_MPI_THREAD is just a placeholder for future
// implementation.
inline bool&
use_mpi_thread()
{
static bool _instance = tim::get_env("ROCPROFSYS_MPI_THREAD", true);
return _instance;
}
//--------------------------------------------------------------------------------------//
inline std::string&
use_mpi_thread_type()
{
static std::string _instance =
tim::get_env<std::string>("ROCPROFSYS_MPI_THREAD_TYPE", "");
return _instance;
}
//--------------------------------------------------------------------------------------//
inline bool&
fail_on_error()
{
static bool _instance = tim::get_env("ROCPROFSYS_MPI_FAIL_ON_ERROR", false);
return _instance;
}
//--------------------------------------------------------------------------------------//
inline bool&
quiet()
{
static bool _instance = tim::get_env("ROCPROFSYS_MPI_QUIET", false);
return _instance;
}
//--------------------------------------------------------------------------------------//
#if !defined(ROCPROFSYS_MPI_ERROR_FUNCTION)
# define ROCPROFSYS_MPI_ERROR_FUNCTION(FUNC, ...) # FUNC
#endif
#if !defined(ROCPROFSYS_MPI_ERROR_CHECK)
# define ROCPROFSYS_MPI_ERROR_CHECK(...) \
::rocprofsys::mpi::check_error(ROCPROFSYS_MPI_ERROR_FUNCTION(__VA_ARGS__, ""), \
__VA_ARGS__)
#endif
//--------------------------------------------------------------------------------------//
inline bool
check_error(const char* _func, int err_code, comm_t _comm = mpi::comm_world_v)
{
#if defined(ROCPROFSYS_USE_MPI)
bool _success = (err_code == MPI_SUCCESS);
if(!_success && !mpi::quiet())
{
int len = 0;
char msg[1024];
PMPI_Error_string(err_code, msg, &len);
msg[std::min<int>(len, 1023)] = '\0';
int _rank = rank();
fprintf(stderr, "[rank=%i][pid=%i][tid=%i][%s]> Error code (%i): %s\n", _rank,
(int) process::get_id(), (int) threading::get_id(), _func, err_code, msg);
}
if(!_success && fail_on_error()) PMPI_Abort(_comm, err_code);
return (err_code == MPI_SUCCESS);
#else
tim::consume_parameters(_func, err_code, _comm);
return false;
#endif
}
//--------------------------------------------------------------------------------------//
inline void
barrier(comm_t comm = comm_world_v);
inline bool
is_supported()
{
#if defined(ROCPROFSYS_USE_MPI)
return true;
#else
return false;
#endif
}
//--------------------------------------------------------------------------------------//
inline bool&
is_finalized()
{
#if defined(ROCPROFSYS_USE_MPI)
int32_t _fini = 0;
PMPI_Finalized(&_fini);
static bool _instance = static_cast<bool>(_fini);
if(!_instance) _instance = static_cast<bool>(_fini);
#else
static bool _instance = true;
#endif
return _instance;
}
//--------------------------------------------------------------------------------------//
template <typename ApiT = TIMEMORY_API>
inline std::function<bool()>&
is_initialized_callback()
{
static std::function<bool()> _v = []() -> bool {
int32_t _init = 0;
#if defined(ROCPROFSYS_USE_MPI)
if(!is_finalized()) PMPI_Initialized(&_init);
#endif
return (_init != 0) ? true : false;
};
return _v;
}
//--------------------------------------------------------------------------------------//
inline bool
is_initialized()
{
return is_initialized_callback()();
}
//--------------------------------------------------------------------------------------//
inline void
initialize(int& argc, char**& argv)
{
#if defined(ROCPROFSYS_USE_MPI)
if(!is_initialized())
{
using namespace threading;
bool _success_v = false;
if(use_mpi_thread())
{
auto _init = [&argc, &argv](int itr, const std::string& _type) {
int _actual = -1;
auto ret = MPI_Init_thread(&argc, &argv, itr, &_actual);
if(_actual != itr)
{
fprintf(stderr, "Warning! MPI_Init_thread does not support: %s\n",
_type.c_str());
}
return ROCPROFSYS_MPI_ERROR_CHECK(ret);
};
// ROCPROFSYS_MPI_ERROR_CHECK(MPI_Init(&argc, &argv));
// int _provided = 0;
// MPI_Query_thread(&_provided);
auto _mpi_type = use_mpi_thread_type();
if(_mpi_type == "single")
{
_success_v = _init(single, _mpi_type);
}
else if(_mpi_type == "serialized")
{
_success_v = _init(serialized, _mpi_type);
}
else if(_mpi_type == "funneled")
{
_success_v = _init(funneled, _mpi_type);
}
else if(_mpi_type == "multiple")
{
_success_v = _init(multiple, _mpi_type);
}
else
{
_success_v = _init(multiple, "multiple");
}
}
if(!_success_v) ROCPROFSYS_MPI_ERROR_CHECK(MPI_Init(&argc, &argv));
}
#else
tim::consume_parameters(argc, argv);
#endif
}
//--------------------------------------------------------------------------------------//
inline void
initialize(int* argc, char*** argv)
{
initialize(*argc, *argv);
}
//--------------------------------------------------------------------------------------//
inline void
finalize()
{
#if defined(ROCPROFSYS_USE_MPI)
if(is_initialized())
{
// barrier();
MPI_Finalize();
is_finalized() = true;
// finalized
}
#endif
}
//--------------------------------------------------------------------------------------//
#if defined(ROCPROFSYS_USE_MPI)
int32_t
rank(comm_t comm)
{
int32_t _rank = 0;
if(is_initialized())
{
// this is used to guard against the queries that might happen after an
// application calls MPI_Finalize() directly
static communicator_map_t<int32_t>* _instance = new communicator_map_t<int32_t>();
if(_instance->find(comm) == _instance->end())
{
PMPI_Comm_rank(comm, &_rank);
(*_instance)[comm] = _rank;
}
else
{
_rank = (*_instance)[comm];
}
}
return std::max(_rank, (int32_t) 0);
}
int32_t
size(comm_t comm)
{
int32_t _size = 1;
if(is_initialized())
{
// this is used to guard against the queries that might happen after an
// application calls MPI_Finalize() directly
static communicator_map_t<int32_t>* _instance = new communicator_map_t<int32_t>();
if(_instance->find(comm) == _instance->end())
{
PMPI_Comm_size(comm, &_size);
(*_instance)[comm] = _size;
}
else
{
_size = (*_instance)[comm];
}
}
return std::max(_size, (int32_t) 1);
}
void set_rank(int32_t, comm_t) {}
void set_size(int32_t, comm_t) {}
#else
struct comm_data
{
using entry_t = std::array<int32_t, 2>;
static int32_t rank(comm_t _comm) { return std::max<int32_t>(m_data()[_comm][0], 0); }
static int32_t size(comm_t _comm) { return std::max<int32_t>(m_data()[_comm][1], 1); }
friend void set_rank(int32_t, comm_t);
friend void set_size(int32_t, comm_t);
private:
static std::map<comm_t, entry_t>& m_data()
{
static std::map<comm_t, entry_t> _v = { { 0, entry_t{ 0, 1 } } };
return _v;
}
};
int32_t
rank(comm_t comm)
{
return comm_data::rank(comm);
}
int32_t
size(comm_t comm)
{
return comm_data::size(comm);
}
void
set_rank(int32_t _rank, comm_t comm)
{
comm_data::m_data()[comm][0] = _rank;
}
void
set_size(int32_t _size, comm_t comm)
{
comm_data::m_data()[comm][1] = _size;
}
#endif
//--------------------------------------------------------------------------------------//
inline void
barrier(comm_t comm)
{
#if defined(ROCPROFSYS_USE_MPI)
if(is_initialized()) PMPI_Barrier(comm);
#else
tim::consume_parameters(comm);
#endif
}
//--------------------------------------------------------------------------------------//
inline void
comm_split(comm_t comm, int split_size, int rank, comm_t* local_comm)
{
#if defined(ROCPROFSYS_USE_MPI)
if(is_initialized())
ROCPROFSYS_MPI_ERROR_CHECK(PMPI_Comm_split(comm, split_size, rank, local_comm));
#else
tim::consume_parameters(comm, split_size, rank, local_comm);
#endif
}
//--------------------------------------------------------------------------------------//
inline void
comm_split_type(comm_t comm, int split_size, int key, info_t info, comm_t* local_comm)
{
#if defined(ROCPROFSYS_USE_MPI)
if(is_initialized())
{
ROCPROFSYS_MPI_ERROR_CHECK(
PMPI_Comm_split_type(comm, split_size, key, info, local_comm));
}
#else
tim::consume_parameters(comm, split_size, key, info, local_comm);
#endif
}
//--------------------------------------------------------------------------------------//
/// returns the communicator for the node
inline comm_t
get_node_comm()
{
if(!is_initialized()) return comm_world_v;
auto _get_node_comm = []() {
comm_t local_comm;
comm_split_type(mpi::comm_world_v, mpi::comm_type_shared_v, 0, mpi::info_null_v,
&local_comm);
return local_comm;
};
static comm_t _instance = _get_node_comm();
return _instance;
}
//--------------------------------------------------------------------------------------//
/// returns the number of ranks on a node
inline int32_t
get_num_ranks_per_node()
{
if(!is_initialized()) return 1;
return size(get_node_comm());
}
//--------------------------------------------------------------------------------------//
inline int32_t
get_num_nodes()
{
if(!is_initialized()) return 1;
auto _world_size = size(comm_world_v);
auto _ncomm_size = get_num_ranks_per_node();
return (_world_size >= _ncomm_size) ? (_world_size / _ncomm_size) : 1;
}
//--------------------------------------------------------------------------------------//
inline int32_t
get_node_index()
{
if(!is_initialized()) return 0;
return rank() / get_num_ranks_per_node();
}
//--------------------------------------------------------------------------------------//
inline void
send(const std::string& str, int dest, int tag, comm_t comm = mpi::comm_world_v)
{
#if defined(ROCPROFSYS_USE_MPI)
using ulli_t = unsigned long long;
ulli_t len = str.size();
ROCPROFSYS_MPI_ERROR_CHECK(
PMPI_Send(&len, 1, MPI_UNSIGNED_LONG_LONG, dest, tag, comm));
if(len != 0)
{
ulli_t _cmax = std::numeric_limits<int>::max();
if(len <= _cmax)
{
ROCPROFSYS_MPI_ERROR_CHECK(
PMPI_Send(const_cast<char*>(str.data()), len, MPI_CHAR, dest, tag, comm));
}
else
{
auto _len = str.length() / sizeof(long);
auto _rem = str.length() % sizeof(long);
auto _str = str;
if(_rem > 0)
{
_str.resize(_str.length() + _rem, '\0');
_len += 1;
}
ROCPROFSYS_MPI_ERROR_CHECK(PMPI_Send(const_cast<char*>(_str.data()), _len,
MPI_LONG, dest, tag, comm));
}
}
#else
tim::consume_parameters(str, dest, tag, comm);
#endif
}
//--------------------------------------------------------------------------------------//
inline void
recv(std::string& str, int src, int tag, comm_t comm = mpi::comm_world_v)
{
#if defined(ROCPROFSYS_USE_MPI)
using ulli_t = unsigned long long;
ulli_t len = 0;
MPI_Status s;
ROCPROFSYS_MPI_ERROR_CHECK(
PMPI_Recv(&len, 1, MPI_UNSIGNED_LONG_LONG, src, tag, comm, &s));
if(len != 0)
{
ulli_t _cmax = std::numeric_limits<int>::max();
if(len <= _cmax)
{
std::vector<char> tmp(len);
ROCPROFSYS_MPI_ERROR_CHECK(
PMPI_Recv(tmp.data(), len, MPI_CHAR, src, tag, comm, &s));
str.assign(tmp.begin(), tmp.end());
}
else
{
auto _len = len / sizeof(long);
auto _rem = len % sizeof(long);
if(_rem > 0) _len += 1;
std::vector<long> tmp(_len);
ROCPROFSYS_MPI_ERROR_CHECK(
PMPI_Recv(tmp.data(), _len, MPI_LONG, src, tag, comm, &s));
std::vector<char> chars = {};
auto _ratio = sizeof(long) / sizeof(char);
chars.reserve(_len * _ratio);
for(auto& itr : tmp)
{
for(size_t i = 0; i < _ratio; ++i)
{
chars.emplace_back(itr >> (i * sizeof(void*)));
if(chars.size() == len) break;
}
}
str.assign(chars.begin(), chars.end());
}
}
else
{
str.clear();
}
#else
tim::consume_parameters(str, src, tag, comm);
#endif
}
//--------------------------------------------------------------------------------------//
inline void
gather(const void* sendbuf, int sendcount, data_type_t sendtype, void* recvbuf,
int recvcount, data_type_t recvtype, int root, comm_t comm = mpi::comm_world_v)
{
#if defined(ROCPROFSYS_USE_MPI)
if(is_initialized())
{
ROCPROFSYS_MPI_ERROR_CHECK(PMPI_Gather(sendbuf, sendcount, sendtype, recvbuf,
recvcount, recvtype, root, comm));
}
#else
tim::consume_parameters(sendbuf, sendcount, sendtype, recvbuf, recvcount, recvtype,
root, comm);
#endif
}
//--------------------------------------------------------------------------------------//
inline void
comm_spawn_multiple(int count, char** commands, char*** argv, const int* maxprocs,
const info_t* info, int root, comm_t comm, comm_t* intercomm,
int* errcodes)
{
#if defined(ROCPROFSYS_USE_MPI)
if(is_initialized())
{
ROCPROFSYS_MPI_ERROR_CHECK(PMPI_Comm_spawn_multiple(
count, commands, argv, maxprocs, info, root, comm, intercomm, errcodes));
}
#else
tim::consume_parameters(count, commands, argv, maxprocs, info, root, comm, intercomm,
errcodes);
#endif
}
//--------------------------------------------------------------------------------------//
} // namespace mpi
} // namespace rocprofsys
#if defined(ROCPROFSYS_UNDEFINE_OMPI_SKIP_MPICXX) && ROCPROFSYS_UNDEFINE_OMPI_SKIP_MPICXX
# undef OMPI_SKIP_MPICXX
#endif
+1 -1
Visa fil
@@ -209,7 +209,7 @@ post_process(tim::manager* _timemory_manager, bool& _perfetto_output_error)
};
auto trace_data = char_vec_t{};
#if defined(TIMEMORY_USE_MPI) && TIMEMORY_USE_MPI > 0
#if defined(ROCPROFSYS_USE_MPI) && ROCPROFSYS_USE_MPI > 0
if(get_perfetto_combined_traces())
{
using perfetto_mpi_get_t = tim::operation::finalize::mpi_get<char_vec_t, true>;
+1 -2
Visa fil
@@ -27,11 +27,9 @@
#include "defines.hpp"
#include <timemory/api.hpp>
#include <timemory/backends/mpi.hpp>
#include <timemory/backends/process.hpp>
#include <timemory/backends/threading.hpp>
#include <timemory/components.hpp>
#include <timemory/components/gotcha/mpip.hpp>
#include <timemory/config.hpp>
#include <timemory/environment.hpp>
#include <timemory/manager.hpp>
@@ -40,6 +38,7 @@
#include <timemory/runtime.hpp>
#include <timemory/settings.hpp>
#include <timemory/storage.hpp>
#include <timemory/utility.hpp>
#include <timemory/utility/signals.hpp>
#include <timemory/variadic.hpp>
@@ -26,6 +26,7 @@ set(component_headers
${CMAKE_CURRENT_LIST_DIR}/ensure_storage.hpp
${CMAKE_CURRENT_LIST_DIR}/exit_gotcha.hpp
${CMAKE_CURRENT_LIST_DIR}/fork_gotcha.hpp
${CMAKE_CURRENT_LIST_DIR}/mpip.hpp
${CMAKE_CURRENT_LIST_DIR}/mpi_gotcha.hpp
${CMAKE_CURRENT_LIST_DIR}/numa_gotcha.hpp
${CMAKE_CURRENT_LIST_DIR}/vaapi_gotcha.hpp
@@ -25,11 +25,12 @@
#include "core/components/fwd.hpp"
#include "core/config.hpp"
#include "core/debug.hpp"
#include "core/mpi.hpp"
#include "core/mproc.hpp"
#include "library/components/category_region.hpp"
#include "library/components/comm_data.hpp"
#include "mpip.hpp"
#include <timemory/backends/mpi.hpp>
#include <timemory/backends/process.hpp>
#include <timemory/mpl/types.hpp>
#include <timemory/signals/signal_mask.hpp>
@@ -46,8 +47,7 @@ namespace component
{
namespace
{
using mpip_bundle_t =
tim::component_tuple<category_region<category::mpi>, comp::comm_data>;
using mpip_bundle_t = tim::component_tuple<category_region<category::mpi>, comm_data>;
struct comm_rank_data
{
@@ -102,7 +102,7 @@ auto mpi_comm_records = std::map<uintptr_t, comm_rank_data>{};
using tim::auto_lock_t;
using tim::type_mutex;
#if defined(TIMEMORY_USE_MPI)
#if defined(ROCPROFSYS_USE_MPI)
int
rocprofsys_mpi_copy(MPI_Comm, int, void*, void*, void*, int*)
{
@@ -117,7 +117,7 @@ rocprofsys_mpi_fini(MPI_Comm, int, void*, void*)
if(!_blocked.empty())
tim::signals::block_signals(_blocked, tim::signals::sigmask_scope::process);
if(mpip_index != std::numeric_limits<uint64_t>::max())
comp::deactivate_mpip<mpip_bundle_t, project::rocprofsys>(mpip_index);
deactivate_mpip<mpip_bundle_t, project::rocprofsys>(mpip_index);
if(is_root_process()) rocprofsys_finalize_hidden();
return MPI_SUCCESS;
}
@@ -127,7 +127,7 @@ rocprofsys_mpi_fini(MPI_Comm, int, void*, void*)
void
rocprofsys_mpi_set_attr()
{
#if defined(TIMEMORY_USE_MPI)
#if defined(ROCPROFSYS_USE_MPI)
auto _blocked = get_sampling_signals();
if(!_blocked.empty())
tim::signals::block_signals(_blocked, tim::signals::sigmask_scope::process);
@@ -162,17 +162,28 @@ mpi_gotcha::configure()
mpi_gotcha_t::get_initializer() = []() {
mpi_gotcha_t::template configure<0, int, int*, char***>("MPI_Init");
mpi_gotcha_t::template configure<1, int, int*, char***, int, int*>(
mpi_gotcha_t::template configure<1, int, int*, char***>("PMPI_Init");
mpi_gotcha_t::template configure<2, int, int*, char***, int, int*>(
"MPI_Init_thread");
mpi_gotcha_t::template configure<2, int>("MPI_Finalize");
mpi_gotcha_t::template configure<3, int, int*, char***, int, int*>(
"PMPI_Init_thread");
mpi_gotcha_t::template configure<4, int>("MPI_Finalize");
mpi_gotcha_t::template configure<5, int>("PMPI_Finalize");
reject_bindings.emplace("MPI_Init");
reject_bindings.emplace("PMPI_Init");
reject_bindings.emplace("MPI_Init_thread");
reject_bindings.emplace("PMPI_Init_thread");
reject_bindings.emplace("MPI_Finalize");
reject_bindings.emplace("PMPI_Finalize");
#if defined(ROCPROFSYS_USE_MPI_HEADERS) && ROCPROFSYS_USE_MPI_HEADERS > 0
mpi_gotcha_t::template configure<3, int, comm_t, int*>("MPI_Comm_rank");
mpi_gotcha_t::template configure<4, int, comm_t, int*>("MPI_Comm_size");
mpi_gotcha_t::template configure<6, int, comm_t, int*>("MPI_Comm_rank");
mpi_gotcha_t::template configure<7, int, comm_t, int*>("PMPI_Comm_rank");
mpi_gotcha_t::template configure<8, int, comm_t, int*>("MPI_Comm_size");
mpi_gotcha_t::template configure<9, int, comm_t, int*>("PMPI_Comm_size");
reject_bindings.emplace("MPI_Comm_rank");
reject_bindings.emplace("PMPI_Comm_rank");
reject_bindings.emplace("MPI_Comm_size");
reject_bindings.emplace("PMPI_Comm_size");
#endif
};
}
@@ -207,13 +218,13 @@ mpi_gotcha::update()
auto _rank = _rank_data.rank;
auto _size = _rank_data.size;
tim::mpi::set_rank(_rank);
tim::mpi::set_size(_size);
tim::settings::default_process_suffix() = _rank;
rocprofsys::mpi::set_rank(_rank);
rocprofsys::mpi::set_size(_size);
rocprofsys::settings::default_process_suffix() = _rank;
ROCPROFSYS_BASIC_VERBOSE(0, "[pid=%i] MPI rank: %i (%i), MPI size: %i (%i)\n",
process::get_id(), tim::mpi::rank(), _rank,
tim::mpi::size(), _size);
process::get_id(), rocprofsys::mpi::rank(), _rank,
rocprofsys::mpi::size(), _size);
last_comm_record = _rank_data;
config::get_use_pid() = true;
return true;
@@ -236,9 +247,9 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::incoming, int*, char***)
ROCPROFSYS_BASIC_DEBUG_F("%s(int*, char***)\n", _data.tool_id.c_str());
rocprofsys_push_trace_hidden(_data.tool_id.c_str());
#if !defined(TIMEMORY_USE_MPI) && defined(TIMEMORY_USE_MPI_HEADERS)
tim::mpi::is_initialized_callback() = []() { return true; };
tim::mpi::is_finalized() = false;
#if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS)
rocprofsys::mpi::is_initialized_callback() = []() { return true; };
rocprofsys::mpi::is_finalized() = false;
#endif
}
@@ -248,9 +259,9 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::incoming, int*, char***, in
ROCPROFSYS_BASIC_DEBUG_F("%s(int*, char***, int, int*)\n", _data.tool_id.c_str());
rocprofsys_push_trace_hidden(_data.tool_id.c_str());
#if !defined(TIMEMORY_USE_MPI) && defined(TIMEMORY_USE_MPI_HEADERS)
tim::mpi::is_initialized_callback() = []() { return true; };
tim::mpi::is_finalized() = false;
#if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS)
rocprofsys::mpi::is_initialized_callback() = []() { return true; };
rocprofsys::mpi::is_finalized() = false;
#endif
}
@@ -264,11 +275,11 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::incoming)
tim::signals::block_signals(_blocked, tim::signals::sigmask_scope::process);
if(mpip_index != std::numeric_limits<uint64_t>::max())
comp::deactivate_mpip<mpip_bundle_t, project::rocprofsys>(mpip_index);
deactivate_mpip<mpip_bundle_t, project::rocprofsys>(mpip_index);
#if !defined(TIMEMORY_USE_MPI) && defined(TIMEMORY_USE_MPI_HEADERS)
tim::mpi::is_initialized_callback() = []() { return false; };
tim::mpi::is_finalized() = true;
#if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS)
rocprofsys::mpi::is_initialized_callback() = []() { return false; };
rocprofsys::mpi::is_finalized() = true;
#else
if(is_root_process() && rocprofsys::get_state() < rocprofsys::State::Finalized)
rocprofsys_finalize_hidden();
@@ -278,15 +289,17 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::incoming)
void
mpi_gotcha::audit(const gotcha_data_t& _data, audit::incoming, comm_t _comm, int* _val)
{
ROCPROFSYS_BASIC_DEBUG_F("%s()\n", _data.tool_id.c_str());
ROCPROFSYS_BASIC_DEBUG_F("%s(comm_t _comm, int* _val)\n", _data.tool_id.c_str());
rocprofsys_push_trace_hidden(_data.tool_id.c_str());
if(_data.tool_id == "MPI_Comm_rank")
if(_data.tool_id.find("MPI_Comm_rank") == 0 ||
_data.tool_id.find("PMPI_Comm_rank") == 0)
{
m_comm_val = (uintptr_t) _comm; // NOLINT
m_rank_ptr = _val;
}
else if(_data.tool_id == "MPI_Comm_size")
else if(_data.tool_id.find("MPI_Comm_size") == 0 ||
_data.tool_id.find("PMPI_Comm_size") == 0)
{
m_comm_val = (uintptr_t) _comm; // NOLINT
m_size_ptr = _val;
@@ -305,7 +318,8 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::outgoing, int _retval)
if(!settings::use_output_suffix()) settings::use_output_suffix() = true;
if(_retval == tim::mpi::success_v && _data.tool_id.find("MPI_Init") == 0)
if(_retval == rocprofsys::mpi::success_v &&
(_data.tool_id.find("MPI_Init") == 0 || _data.tool_id.find("PMPI_Init") == 0))
{
rocprofsys_mpi_set_attr();
// rocprof-sys will set this environement variable to true in binary rewrite mode
@@ -319,9 +333,9 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::outgoing, int _retval)
// use env vars ROCPROFSYS_MPIP_PERMIT_LIST and ROCPROFSYS_MPIP_REJECT_LIST
// to control the gotcha bindings at runtime
comp::configure_mpip<mpip_bundle_t, project::rocprofsys>(permit_bindings,
reject_bindings);
mpip_index = comp::activate_mpip<mpip_bundle_t, project::rocprofsys>();
configure_mpip<mpip_bundle_t, project::rocprofsys>(permit_bindings,
reject_bindings);
mpip_index = activate_mpip<mpip_bundle_t, project::rocprofsys>();
}
auto_lock_t _lk{ type_mutex<mpi_gotcha>() };
@@ -339,7 +353,9 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::outgoing, int _retval)
}
}
}
else if(_retval == tim::mpi::success_v && _data.tool_id.find("MPI_Comm_") == 0)
else if(_retval == rocprofsys::mpi::success_v &&
(_data.tool_id.find("MPI_Comm_") == 0 ||
_data.tool_id.find("PMPI_Comm_") == 0))
{
auto_lock_t _lk{ type_mutex<mpi_gotcha>() };
if(m_comm_val != null_comm())
@@ -356,7 +372,8 @@ mpi_gotcha::audit(const gotcha_data_t& _data, audit::outgoing, int _retval)
: std::max<int>(m_size, _get_rank() + 1);
};
if(_data.tool_id == "MPI_Comm_rank" || _data.tool_id == "MPI_Comm_size")
if(_data.tool_id == "MPI_Comm_rank" || _data.tool_id == "MPI_Comm_size" ||
_data.tool_id == "PMPI_Comm_rank" || _data.tool_id == "PMPI_Comm_size")
{
_comm_entry.rank = m_rank = std::max<int>(_comm_entry.rank, _get_rank());
_comm_entry.size = m_size = std::max<int>(_comm_entry.size, _get_size());
@@ -24,6 +24,7 @@
#include "core/common.hpp"
#include "core/defines.hpp"
#include "core/mpi.hpp"
#include "core/timemory.hpp"
#include <cstdint>
@@ -35,7 +36,7 @@ namespace component
// this is used to wrap MPI_Init and MPI_Init_thread
struct mpi_gotcha : comp::base<mpi_gotcha, void>
{
using comm_t = tim::mpi::comm_t;
using comm_t = rocprofsys::mpi::comm_t;
using gotcha_data_t = comp::gotcha_data;
ROCPROFSYS_DEFAULT_OBJECT(mpi_gotcha)
@@ -81,5 +82,5 @@ private:
} // namespace component
using mpi_gotcha_t =
comp::gotcha<5, tim::component_tuple<component::mpi_gotcha>, project::rocprofsys>;
comp::gotcha<10, tim::component_tuple<component::mpi_gotcha>, project::rocprofsys>;
} // namespace rocprofsys
@@ -0,0 +1,779 @@
// MIT License
//
// Copyright (c) 2022-2025 Advanced Micro Devices, Inc. All Rights Reserved.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all
// copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
// SOFTWARE.
#pragma once
#include "core/timemory.hpp"
#include <timemory/components/base.hpp>
#include <timemory/components/gotcha/backends.hpp>
#include <timemory/components/gotcha/types.hpp>
#include <timemory/manager/declaration.hpp>
#include <timemory/mpl/apply.hpp>
#include <timemory/mpl/types.hpp>
#include <timemory/units.hpp>
#include <timemory/utility/demangle.hpp>
#include <timemory/variadic/types.hpp>
#include <memory>
#include <set>
#include <string>
#include <unordered_map>
#if !defined(ROCPROFSYS_USE_MPI) && defined(ROCPROFSYS_USE_MPI_HEADERS) && \
!defined(OMPI_SKIP_MPICXX)
# define ROCPROFSYS_UNDEFINE_OMPI_SKIP_MPICXX 1
# define OMPI_SKIP_MPICXX 1
#endif
#if defined(ROCPROFSYS_USE_MPI) || defined(ROCPROFSYS_USE_MPI_HEADERS)
# include <mpi.h>
#endif
#if !defined(NUM_ROCPROFSYS_MPIP_WRAPPERS)
# define NUM_ROCPROFSYS_MPIP_WRAPPERS 500
#endif
namespace rocprofsys
{
namespace component
{
//
//--------------------------------------------------------------------------------------//
//
template <typename Toolset, typename Tag>
TIMEMORY_VISIBILITY("default")
TIMEMORY_NOINLINE void configure_mpip(const std::set<std::string>& permit = {},
const std::set<std::string>& reject = {});
//
//--------------------------------------------------------------------------------------//
//
template <typename Toolset, typename Tag>
TIMEMORY_VISIBILITY("default")
TIMEMORY_NOINLINE uint64_t activate_mpip();
//
//--------------------------------------------------------------------------------------//
//
template <typename Toolset, typename Tag>
TIMEMORY_VISIBILITY("default")
TIMEMORY_NOINLINE uint64_t deactivate_mpip(uint64_t);
//
//--------------------------------------------------------------------------------------//
//
template <typename Toolset, typename Tag>
struct mpip_handle : base<mpip_handle<Toolset, Tag>, void>
{
static constexpr size_t mpip_wrapper_count = NUM_ROCPROFSYS_MPIP_WRAPPERS;
using value_type = void;
using this_type = mpip_handle<Toolset, Tag>;
using base_type = base<this_type, value_type>;
using mpi_toolset_t = Toolset;
using mpip_gotcha_t = tim::component::gotcha<mpip_wrapper_count, mpi_toolset_t, Tag>;
using mpip_tuple_t = tim::component_tuple<mpip_gotcha_t>;
using toolset_ptr_t = std::shared_ptr<mpip_tuple_t>;
static std::string label() { return "mpip_handle"; }
static std::string description() { return "Handle for activating MPI wrappers"; }
void get() {}
void start()
{
if(get_tool_count()++ == 0)
{
get_tool_instance() = std::make_shared<mpip_tuple_t>("rocprofsys_mpip");
get_tool_instance()->start();
}
}
void stop()
{
auto idx = --get_tool_count();
if(get_tool_instance().get())
{
get_tool_instance()->stop();
if(idx == 0) get_tool_instance().reset();
}
}
int get_count() { return get_tool_count().load(); }
private:
struct persistent_data
{
std::atomic<short> m_configured;
std::atomic<int64_t> m_count;
toolset_ptr_t m_tool;
};
static persistent_data& get_persistent_data()
{
static persistent_data _instance;
return _instance;
}
static std::atomic<short>& get_configured()
{
return get_persistent_data().m_configured;
}
static toolset_ptr_t& get_tool_instance() { return get_persistent_data().m_tool; }
static std::atomic<int64_t>& get_tool_count()
{
return get_persistent_data().m_count;
}
};
//
//======================================================================================//
//
} // namespace component
} // namespace rocprofsys
//
//======================================================================================//
//
#include <timemory/timemory.hpp>
//
//======================================================================================//
//
/// \fn uint64_t rocprofsys::component::activate_mpip()
/// \brief The thread that first activates mpip will be the thread that turns it off.
/// Function returns the number of new mpip handles
///
template <typename Toolset, typename Tag>
uint64_t
rocprofsys::component::activate_mpip()
{
using handle_t = rocprofsys::component::mpip_handle<Toolset, Tag>;
static std::shared_ptr<handle_t> _handle;
if(!_handle.get())
{
_handle = std::make_shared<handle_t>();
_handle->start();
auto cleanup_functor = [=]() {
if(_handle)
{
_handle->stop();
_handle.reset();
}
};
static std::string _label = []() {
std::stringstream ss;
ss << "rocprofsys-mpip-" << demangle<Toolset>() << "-" << demangle<Tag>();
return ss.str();
}();
ROCPROFSYS_BASIC_DEBUG_F("Adding cleanup for %s", _label.c_str());
tim::manager::instance()->add_cleanup(_label, cleanup_functor);
return 1;
}
return 0;
}
//
//======================================================================================//
//
/// \fn uint64_t rocprofsys::component::deactivate_mpip(uint64_t id)
/// \brief The thread that created the initial mpip handle will turn off. Returns
/// the number of handles active
///
template <typename Toolset, typename Tag>
uint64_t
rocprofsys::component::deactivate_mpip(uint64_t id)
{
if(id > 0)
{
static std::string _label = []() {
std::stringstream ss;
ss << "rocprofsys-mpip-" << demangle<Toolset>() << "-" << demangle<Tag>();
return ss.str();
}();
ROCPROFSYS_BASIC_DEBUG_F("Removing cleanup for %s", _label.c_str());
tim::manager::instance()->cleanup(_label);
return 0;
}
return 1;
}
//
//======================================================================================//
//
#if !defined(TIMEMORY_USE_GOTCHA) || \
(!defined(ROCPROFSYS_USE_MPI) && !defined(ROCPROFSYS_USE_MPI_HEADERS))
//
template <typename Toolset, typename Tag>
void
rocprofsys::component::configure_mpip(const std::set<std::string>&,
const std::set<std::string>&)
{}
//
#else
//
template <typename Toolset, typename Tag>
void
rocprofsys::component::configure_mpip(const std::set<std::string>& permit,
const std::set<std::string>& reject)
{
static constexpr size_t mpip_wrapper_count = NUM_ROCPROFSYS_MPIP_WRAPPERS;
static bool is_initialized = false;
using mpip_gotcha_t = tim::component::gotcha<mpip_wrapper_count, Toolset, Tag>;
if(!is_initialized)
{
// generate the gotcha wrappers
mpip_gotcha_t::get_initializer() = []() {
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 0, MPI_Accumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 1, MPI_Add_error_class);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 2, MPI_Add_error_code);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 3, MPI_Add_error_string);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 4, MPI_Aint_add);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 5, MPI_Aint_diff);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 6, MPI_Allgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 7, MPI_Allgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 8, MPI_Alloc_mem);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 9, MPI_Allreduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 10, MPI_Alltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 11, MPI_Alltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 12, MPI_Alltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 13, MPI_Barrier);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 14, MPI_Bcast);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 15, MPI_Bsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 16, MPI_Bsend_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 17, MPI_Buffer_attach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 18, MPI_Buffer_detach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 19, MPI_Cancel);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 20, MPI_Cart_coords);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 21, MPI_Cart_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 22, MPI_Cart_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 23, MPI_Cart_map);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 24, MPI_Cart_rank);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 25, MPI_Cart_shift);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 26, MPI_Cart_sub);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 27, MPI_Cartdim_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 28, MPI_Close_port);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 29, MPI_Comm_accept);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 30, MPI_Comm_call_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 31, MPI_Comm_compare);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 32, MPI_Comm_connect);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 33, MPI_Comm_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 34, MPI_Comm_create_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 35, MPI_Comm_create_group);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 36, MPI_Comm_create_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 37, MPI_Comm_delete_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 38, MPI_Comm_disconnect);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 39, MPI_Comm_dup);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 40, MPI_Comm_dup_with_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 41, MPI_Comm_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 42, MPI_Comm_free_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 43, MPI_Comm_get_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 44, MPI_Comm_get_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 45, MPI_Comm_get_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 46, MPI_Comm_get_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 47, MPI_Comm_get_parent);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 48, MPI_Comm_group);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 49, MPI_Comm_idup);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 50, MPI_Comm_join);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 51, MPI_Comm_rank);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 52, MPI_Comm_remote_group);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 53, MPI_Comm_remote_size);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 54, MPI_Comm_set_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 55, MPI_Comm_set_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 56, MPI_Comm_set_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 57, MPI_Comm_set_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 58, MPI_Comm_size);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 59, MPI_Comm_spawn);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 60, MPI_Comm_spawn_multiple);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 61, MPI_Comm_split);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 62, MPI_Comm_split_type);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 63, MPI_Comm_test_inter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 64, MPI_Compare_and_swap);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 65, MPI_Dims_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 66, MPI_Dist_graph_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 67, MPI_Dist_graph_create_adjacent);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 68, MPI_Dist_graph_neighbors);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 69, MPI_Dist_graph_neighbors_count);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 70, MPI_Error_class);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 71, MPI_Error_string);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 72, MPI_Exscan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 73, MPI_Fetch_and_op);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 74, MPI_File_call_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 75, MPI_File_create_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 76, MPI_File_get_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 77, MPI_File_set_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 78, MPI_Free_mem);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 79, MPI_Gather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 80, MPI_Gatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 81, MPI_Get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 82, MPI_Get_accumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 83, MPI_Get_address);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 84, MPI_Get_count);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 85, MPI_Get_elements);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 86, MPI_Get_elements_x);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 87, MPI_Get_library_version);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 88, MPI_Get_processor_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 89, MPI_Get_version);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 90, MPI_Graph_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 91, MPI_Graph_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 92, MPI_Graph_map);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 93, MPI_Graph_neighbors);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 94, MPI_Graph_neighbors_count);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 95, MPI_Graphdims_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 96, MPI_Grequest_complete);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 97, MPI_Grequest_start);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 98, MPI_Group_compare);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 99, MPI_Group_difference);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 100, MPI_Group_excl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 101, MPI_Group_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 102, MPI_Group_incl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 103, MPI_Group_intersection);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 104, MPI_Group_range_excl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 105, MPI_Group_range_incl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 106, MPI_Group_rank);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 107, MPI_Group_size);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 108, MPI_Group_translate_ranks);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 109, MPI_Group_union);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 110, MPI_Iallgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 111, MPI_Iallgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 112, MPI_Iallreduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 113, MPI_Ialltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 114, MPI_Ialltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 115, MPI_Ialltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 116, MPI_Ibarrier);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 117, MPI_Ibcast);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 118, MPI_Ibsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 119, MPI_Iexscan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 120, MPI_Igather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 121, MPI_Igatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 122, MPI_Improbe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 123, MPI_Imrecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 124, MPI_Ineighbor_allgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 125, MPI_Ineighbor_allgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 126, MPI_Ineighbor_alltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 127, MPI_Ineighbor_alltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 128, MPI_Ineighbor_alltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 129, MPI_Info_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 130, MPI_Info_delete);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 131, MPI_Info_dup);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 132, MPI_Info_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 133, MPI_Info_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 134, MPI_Info_get_nkeys);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 135, MPI_Info_get_nthkey);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 136, MPI_Info_get_valuelen);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 137, MPI_Info_set);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 138, MPI_Intercomm_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 139, MPI_Intercomm_merge);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 140, MPI_Iprobe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 141, MPI_Irecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 142, MPI_Ireduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 143, MPI_Ireduce_scatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 144, MPI_Ireduce_scatter_block);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 145, MPI_Irsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 146, MPI_Is_thread_main);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 147, MPI_Iscan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 148, MPI_Iscatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 149, MPI_Iscatterv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 150, MPI_Isend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 151, MPI_Issend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 152, MPI_Lookup_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 153, MPI_Mprobe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 154, MPI_Mrecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 155, MPI_Neighbor_allgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 156, MPI_Neighbor_allgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 157, MPI_Neighbor_alltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 158, MPI_Neighbor_alltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 159, MPI_Neighbor_alltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 160, MPI_Op_commutative);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 161, MPI_Op_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 162, MPI_Op_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 163, MPI_Open_port);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 164, MPI_Pack);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 165, MPI_Pack_external);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 166, MPI_Pack_external_size);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 167, MPI_Pack_size);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 168, MPI_Probe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 169, MPI_Publish_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 170, MPI_Put);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 171, MPI_Query_thread);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 172, MPI_Raccumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 173, MPI_Recv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 174, MPI_Recv_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 175, MPI_Reduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 176, MPI_Reduce_local);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 177, MPI_Reduce_scatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 178, MPI_Reduce_scatter_block);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 179, MPI_Request_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 180, MPI_Request_get_status);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 181, MPI_Rget);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 182, MPI_Rget_accumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 183, MPI_Rput);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 184, MPI_Rsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 185, MPI_Rsend_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 186, MPI_Scan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 187, MPI_Scatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 188, MPI_Scatterv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 189, MPI_Send);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 190, MPI_Send_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 191, MPI_Sendrecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 192, MPI_Sendrecv_replace);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 193, MPI_Ssend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 194, MPI_Ssend_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 195, MPI_Start);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 196, MPI_Startall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 197, MPI_Status_f2c);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 198, MPI_Status_set_cancelled);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 199, MPI_Status_set_elements);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 200, MPI_Status_set_elements_x);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 201, MPI_Topo_test);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 202, MPI_Unpack);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 203, MPI_Unpack_external);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 204, MPI_Unpublish_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 205, MPI_Wait);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 206, MPI_Waitall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 207, MPI_Waitany);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 208, MPI_Waitsome);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 209, MPI_Win_allocate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 210, MPI_Win_allocate_shared);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 211, MPI_Win_attach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 212, MPI_Win_call_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 213, MPI_Win_complete);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 214, MPI_Win_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 215, MPI_Win_create_dynamic);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 216, MPI_Win_create_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 217, MPI_Win_create_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 218, MPI_Win_delete_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 219, MPI_Win_detach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 220, MPI_Win_fence);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 221, MPI_Win_flush);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 222, MPI_Win_flush_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 223, MPI_Win_flush_local);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 224, MPI_Win_flush_local_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 225, MPI_Win_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 226, MPI_Win_free_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 227, MPI_Win_get_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 228, MPI_Win_get_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 229, MPI_Win_get_group);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 230, MPI_Win_get_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 231, MPI_Win_get_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 232, MPI_Win_lock);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 233, MPI_Win_lock_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 234, MPI_Win_post);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 235, MPI_Win_set_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 236, MPI_Win_set_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 237, MPI_Win_set_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 238, MPI_Win_set_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 239, MPI_Win_shared_query);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 240, MPI_Win_start);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 241, MPI_Win_sync);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 242, MPI_Win_test);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 243, MPI_Win_unlock);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 244, MPI_Win_unlock_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 245, MPI_Win_wait);
// MPI profiling interface wrappers
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 250, PMPI_Accumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 251, PMPI_Add_error_class);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 252, PMPI_Add_error_code);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 253, PMPI_Add_error_string);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 254, PMPI_Aint_add);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 255, PMPI_Aint_diff);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 256, PMPI_Allgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 257, PMPI_Allgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 258, PMPI_Alloc_mem);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 259, PMPI_Allreduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 260, PMPI_Alltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 261, PMPI_Alltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 262, PMPI_Alltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 263, PMPI_Barrier);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 264, PMPI_Bcast);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 265, PMPI_Bsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 266, PMPI_Bsend_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 267, PMPI_Buffer_attach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 268, PMPI_Buffer_detach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 269, PMPI_Cancel);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 270, PMPI_Cart_coords);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 271, PMPI_Cart_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 272, PMPI_Cart_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 273, PMPI_Cart_map);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 274, PMPI_Cart_rank);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 275, PMPI_Cart_shift);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 276, PMPI_Cart_sub);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 277, PMPI_Cartdim_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 278, PMPI_Close_port);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 279, PMPI_Comm_accept);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 280, PMPI_Comm_call_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 281, PMPI_Comm_compare);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 282, PMPI_Comm_connect);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 283, PMPI_Comm_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 284, PMPI_Comm_create_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 285, PMPI_Comm_create_group);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 286, PMPI_Comm_create_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 287, PMPI_Comm_delete_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 288, PMPI_Comm_disconnect);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 289, PMPI_Comm_dup);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 290, PMPI_Comm_dup_with_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 291, PMPI_Comm_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 292, PMPI_Comm_free_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 293, PMPI_Comm_get_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 294, PMPI_Comm_get_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 295, PMPI_Comm_get_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 296, PMPI_Comm_get_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 297, PMPI_Comm_get_parent);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 298, PMPI_Comm_group);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 299, PMPI_Comm_idup);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 300, PMPI_Comm_join);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 301, PMPI_Comm_rank);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 302, PMPI_Comm_remote_group);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 303, PMPI_Comm_remote_size);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 304, PMPI_Comm_set_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 305, PMPI_Comm_set_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 306, PMPI_Comm_set_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 307, PMPI_Comm_set_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 308, PMPI_Comm_size);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 309, PMPI_Comm_spawn);
// TIMEMORY_C_GOTCHA(mpip_gotcha_t, 310, PMPI_Comm_spawn_multiple);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 311, PMPI_Comm_split);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 312, PMPI_Comm_split_type);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 313, PMPI_Comm_test_inter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 314, PMPI_Compare_and_swap);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 315, PMPI_Dims_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 316, PMPI_Dist_graph_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 317, PMPI_Dist_graph_create_adjacent);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 318, PMPI_Dist_graph_neighbors);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 319, PMPI_Dist_graph_neighbors_count);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 320, PMPI_Error_class);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 321, PMPI_Error_string);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 322, PMPI_Exscan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 323, PMPI_Fetch_and_op);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 324, PMPI_File_call_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 325, PMPI_File_create_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 326, PMPI_File_get_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 327, PMPI_File_set_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 328, PMPI_Free_mem);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 329, PMPI_Gather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 330, PMPI_Gatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 331, PMPI_Get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 332, PMPI_Get_accumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 333, PMPI_Get_address);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 334, PMPI_Get_count);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 335, PMPI_Get_elements);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 336, PMPI_Get_elements_x);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 337, PMPI_Get_library_version);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 338, PMPI_Get_processor_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 339, PMPI_Get_version);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 340, PMPI_Graph_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 341, PMPI_Graph_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 342, PMPI_Graph_map);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 343, PMPI_Graph_neighbors);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 344, PMPI_Graph_neighbors_count);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 345, PMPI_Graphdims_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 346, PMPI_Grequest_complete);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 347, PMPI_Grequest_start);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 348, PMPI_Group_compare);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 349, PMPI_Group_difference);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 350, PMPI_Group_excl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 351, PMPI_Group_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 352, PMPI_Group_incl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 353, PMPI_Group_intersection);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 354, PMPI_Group_range_excl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 355, PMPI_Group_range_incl);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 356, PMPI_Group_rank);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 357, PMPI_Group_size);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 358, PMPI_Group_translate_ranks);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 359, PMPI_Group_union);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 360, PMPI_Iallgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 361, PMPI_Iallgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 362, PMPI_Iallreduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 363, PMPI_Ialltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 364, PMPI_Ialltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 365, PMPI_Ialltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 366, PMPI_Ibarrier);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 367, PMPI_Ibcast);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 368, PMPI_Ibsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 369, PMPI_Iexscan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 370, PMPI_Igather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 371, PMPI_Igatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 372, PMPI_Improbe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 373, PMPI_Imrecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 374, PMPI_Ineighbor_allgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 375, PMPI_Ineighbor_allgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 376, PMPI_Ineighbor_alltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 377, PMPI_Ineighbor_alltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 378, PMPI_Ineighbor_alltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 379, PMPI_Info_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 380, PMPI_Info_delete);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 381, PMPI_Info_dup);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 382, PMPI_Info_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 383, PMPI_Info_get);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 384, PMPI_Info_get_nkeys);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 385, PMPI_Info_get_nthkey);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 386, PMPI_Info_get_valuelen);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 387, PMPI_Info_set);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 388, PMPI_Intercomm_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 389, PMPI_Intercomm_merge);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 390, PMPI_Iprobe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 391, PMPI_Irecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 392, PMPI_Ireduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 393, PMPI_Ireduce_scatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 394, PMPI_Ireduce_scatter_block);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 395, PMPI_Irsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 396, PMPI_Is_thread_main);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 397, PMPI_Iscan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 398, PMPI_Iscatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 399, PMPI_Iscatterv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 400, PMPI_Isend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 401, PMPI_Issend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 402, PMPI_Lookup_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 403, PMPI_Mprobe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 404, PMPI_Mrecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 405, PMPI_Neighbor_allgather);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 406, PMPI_Neighbor_allgatherv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 407, PMPI_Neighbor_alltoall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 408, PMPI_Neighbor_alltoallv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 409, PMPI_Neighbor_alltoallw);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 410, PMPI_Op_commutative);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 411, PMPI_Op_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 412, PMPI_Op_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 413, PMPI_Open_port);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 414, PMPI_Pack);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 415, PMPI_Pack_external);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 416, PMPI_Pack_external_size);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 417, PMPI_Pack_size);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 418, PMPI_Probe);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 419, PMPI_Publish_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 420, PMPI_Put);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 421, PMPI_Query_thread);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 422, PMPI_Raccumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 423, PMPI_Recv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 424, PMPI_Recv_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 425, PMPI_Reduce);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 426, PMPI_Reduce_local);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 427, PMPI_Reduce_scatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 428, PMPI_Reduce_scatter_block);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 429, PMPI_Request_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 430, PMPI_Request_get_status);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 431, PMPI_Rget);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 432, PMPI_Rget_accumulate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 433, PMPI_Rput);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 434, PMPI_Rsend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 435, PMPI_Rsend_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 436, PMPI_Scan);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 437, PMPI_Scatter);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 438, PMPI_Scatterv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 439, PMPI_Send);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 440, PMPI_Send_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 441, PMPI_Sendrecv);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 442, PMPI_Sendrecv_replace);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 443, PMPI_Ssend);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 444, PMPI_Ssend_init);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 445, PMPI_Start);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 446, PMPI_Startall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 447, PMPI_Status_f2c);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 448, PMPI_Status_set_cancelled);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 449, PMPI_Status_set_elements);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 450, PMPI_Status_set_elements_x);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 451, PMPI_Topo_test);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 452, PMPI_Unpack);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 453, PMPI_Unpack_external);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 454, PMPI_Unpublish_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 455, PMPI_Wait);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 456, PMPI_Waitall);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 457, PMPI_Waitany);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 458, PMPI_Waitsome);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 459, PMPI_Win_allocate);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 460, PMPI_Win_allocate_shared);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 461, PMPI_Win_attach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 462, PMPI_Win_call_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 463, PMPI_Win_complete);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 464, PMPI_Win_create);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 465, PMPI_Win_create_dynamic);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 466, PMPI_Win_create_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 467, PMPI_Win_create_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 468, PMPI_Win_delete_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 469, PMPI_Win_detach);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 470, PMPI_Win_fence);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 471, PMPI_Win_flush);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 472, PMPI_Win_flush_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 473, PMPI_Win_flush_local);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 474, PMPI_Win_flush_local_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 475, PMPI_Win_free);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 476, PMPI_Win_free_keyval);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 477, PMPI_Win_get_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 478, PMPI_Win_get_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 479, PMPI_Win_get_group);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 480, PMPI_Win_get_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 481, PMPI_Win_get_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 482, PMPI_Win_lock);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 483, PMPI_Win_lock_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 484, PMPI_Win_post);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 485, PMPI_Win_set_attr);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 486, PMPI_Win_set_errhandler);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 487, PMPI_Win_set_info);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 488, PMPI_Win_set_name);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 489, PMPI_Win_shared_query);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 490, PMPI_Win_start);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 491, PMPI_Win_sync);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 492, PMPI_Win_test);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 493, PMPI_Win_unlock);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 494, PMPI_Win_unlock_all);
TIMEMORY_C_GOTCHA(mpip_gotcha_t, 495, PMPI_Win_wait);
};
// provide environment variable for suppressing wrappers
mpip_gotcha_t::get_reject_list() = [reject]() {
auto _reject = reject;
// check environment
auto reject_list = tim::get_env<std::string>(
TIMEMORY_SETTINGS_PREFIX "ROCPROFSYS_MPIP_REJECT_LIST", "");
// add environment setting
for(const auto& itr : tim::delimit(reject_list))
_reject.insert(itr);
return _reject;
};
// provide environment variable for selecting wrappers
mpip_gotcha_t::get_permit_list() = [permit]() {
auto _permit = permit;
// check environment
auto permit_list = tim::get_env<std::string>(
TIMEMORY_SETTINGS_PREFIX "ROCPROFSYS_MPIP_PERMIT_LIST", "");
// add environment setting
for(const auto& itr : tim::delimit(permit_list))
_permit.insert(itr);
return _permit;
};
is_initialized = true;
}
}
//
#endif
//
//======================================================================================//
//
#if defined(ROCPROFSYS_UNDEFINE_OMPI_SKIP_MPICXX) && ROCPROFSYS_UNDEFINE_OMPI_SKIP_MPICXX
# undef OMPI_SKIP_MPICXX
#endif