коммит произвёл
GitHub
родитель
dae6df6d16
Коммит
b617aecc31
@@ -8,6 +8,7 @@
|
||||
#define NCCL_NVTX_H_
|
||||
|
||||
#include "nvtx3/nvtx3.hpp"
|
||||
#include "roctx.h"
|
||||
|
||||
#if __cpp_constexpr >= 201304L && !defined(NVTX3_CONSTEXPR_IF_CPP14)
|
||||
#define NVTX3_CONSTEXPR_IF_CPP14 constexpr
|
||||
@@ -22,11 +23,16 @@
|
||||
#define NVTX_SID_CommAbort 3 // same schema as NVTX_SID_CommInitRank
|
||||
#define NVTX_SID_AllGather 4
|
||||
#define NVTX_SID_AllReduce 5
|
||||
#define NVTX_SID_Broadcast 6
|
||||
#define NVTX_SID_ReduceScatter 7
|
||||
#define NVTX_SID_Reduce 8
|
||||
#define NVTX_SID_Send 9
|
||||
#define NVTX_SID_Recv 10
|
||||
#define NVTX_SID_AllToAll 6
|
||||
#define NVTX_SID_AllToAllv 7
|
||||
#define NVTX_SID_Broadcast 8
|
||||
#define NVTX_SID_Gather 9
|
||||
#define NVTX_SID_MSCCL 10
|
||||
#define NVTX_SID_ReduceScatter 11
|
||||
#define NVTX_SID_Reduce 12
|
||||
#define NVTX_SID_Scatter 13
|
||||
#define NVTX_SID_Send 14
|
||||
#define NVTX_SID_Recv 15
|
||||
|
||||
// Define static schema ID for the reduction operation.
|
||||
#define NVTX_PAYLOAD_ENTRY_NCCL_REDOP 11 + NVTX_PAYLOAD_ENTRY_TYPE_SCHEMA_ID_STATIC_START
|
||||
@@ -71,6 +77,12 @@ class payload_schema {
|
||||
// @param N schema name
|
||||
// @param S schema (entries)
|
||||
// @param P payload (struct)
|
||||
#if defined(__HIP_PLATFORM_HCC__) || defined(__HCC__) || defined(__HIPCC__)
|
||||
#define NVTX3_FUNC_WITH_PARAMS(ID, S, P) \
|
||||
nvtxPayloadData_t nvtx3_bpl__[] = { \
|
||||
{NVTX_PAYLOAD_ENTRY_TYPE_SCHEMA_ID_STATIC_START + NVTX_SID_##ID, sizeof(P), &(P)}}; \
|
||||
roctx_scoped_range_in const roctx_range__{S, nvtx3_bpl__, std::extent<decltype(S)>::value, "RCCL_" #ID};
|
||||
#else
|
||||
#define NVTX3_FUNC_WITH_PARAMS(ID, S, P) \
|
||||
static const payload_schema schema{S, std::extent<decltype(S)>::value, \
|
||||
NVTX_PAYLOAD_ENTRY_TYPE_SCHEMA_ID_STATIC_START + NVTX_SID_##ID, #ID}; \
|
||||
@@ -79,6 +91,7 @@ class payload_schema {
|
||||
{NVTX_PAYLOAD_ENTRY_TYPE_SCHEMA_ID_STATIC_START + NVTX_SID_##ID, sizeof(P), &(P)}}; \
|
||||
::nvtx3::v1::event_attributes const nvtx3_func_attr__{nvtx3_func_name__, nvtx3_bpl__}; \
|
||||
::nvtx3::v1::scoped_range_in<nccl_domain> const nvtx3_range__{nvtx3_func_attr__};
|
||||
#endif
|
||||
|
||||
extern void initNvtxRegisteredEnums();
|
||||
|
||||
|
||||
@@ -2777,10 +2777,15 @@ inline void mark(Args const&... args) noexcept
|
||||
* `domain` to which the `registered_string_in` belongs. Else,
|
||||
* `domain::global` to indicate that the global NVTX domain should be used.
|
||||
*/
|
||||
#if !defined(__HIP_PLATFORM_HCC__) && !defined(__HCC__) && !defined(__HIPCC__)
|
||||
#define NVTX3_V1_FUNC_RANGE_IN(D) \
|
||||
static ::nvtx3::v1::registered_string_in<D> const nvtx3_func_name__{__func__}; \
|
||||
static ::nvtx3::v1::event_attributes const nvtx3_func_attr__{nvtx3_func_name__}; \
|
||||
::nvtx3::v1::scoped_range_in<D> const nvtx3_range__{nvtx3_func_attr__};
|
||||
#else
|
||||
#define NVTX3_V1_FUNC_RANGE_IN(D) \
|
||||
roctx_scoped_range_in const roctx_range__{__func__};
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief Convenience macro for generating a range in the specified `domain`
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
/*************************************************************************
|
||||
* Copyright (c) 2024, Advanced Micro Devices, Inc. All rights reserved.
|
||||
*
|
||||
* See LICENSE.txt for license information
|
||||
************************************************************************/
|
||||
|
||||
#ifndef RCCL_ROCTX_H
|
||||
#define RCCL_ROCTX_H
|
||||
|
||||
#include <iostream>
|
||||
#include <string.h>
|
||||
#include <map>
|
||||
|
||||
#include <roctracer/roctx.h>
|
||||
#include "nvtx3/nvtx3.hpp"
|
||||
#include "device.h"
|
||||
|
||||
#define MAX_MESSAGE_LENGTH 1024
|
||||
#define NVTX_PAYLOAD_ENTRY_TYPE_REDOP 11 + NVTX_PAYLOAD_ENTRY_TYPE_SCHEMA_ID_STATIC_START
|
||||
|
||||
/**
|
||||
* \brief Equivalent of nvtx types for roctx.
|
||||
*/
|
||||
enum roctxPayloadEntryType {
|
||||
/**
|
||||
* Only include the required/used types by rccl,
|
||||
* and needs to be updated in case of new type
|
||||
* tracing.
|
||||
*/
|
||||
ROCTX_PAYLOAD_ENTRY_TYPE_INT,
|
||||
ROCTX_PAYLOAD_ENTRY_TYPE_SIZE,
|
||||
ROCTX_PAYLOAD_ENTRY_TYPE_REDOP,
|
||||
ROCTX_PAYLOAD_NUM_ENTRY_TYPES
|
||||
};
|
||||
|
||||
/**
|
||||
* \brief Stores the contents of the message that will be used by roctx.
|
||||
*/
|
||||
struct roctxPayloadSchemaEntryInfo {
|
||||
/**
|
||||
* Description of the data.
|
||||
*/
|
||||
const char* name;
|
||||
|
||||
/**
|
||||
* Type of the data.
|
||||
*/
|
||||
roctxPayloadEntryType type;
|
||||
|
||||
/**
|
||||
* Union of possible payload types.
|
||||
*
|
||||
* Should be in sync with roctxPayloadEntryType.
|
||||
*/
|
||||
union {
|
||||
int typeInt;
|
||||
size_t typeSize;
|
||||
ncclDevRedOp_t typeRedOp;
|
||||
} payload;
|
||||
};
|
||||
|
||||
struct roctxPayloadInfo {
|
||||
/**
|
||||
* Payload name. Usually the name of the function/API
|
||||
* being called from.
|
||||
*/
|
||||
const char* id;
|
||||
|
||||
/**
|
||||
* Number of paylod entries
|
||||
*/
|
||||
size_t numEntries;
|
||||
|
||||
/**
|
||||
* Pointer to roctxPayloadSchemaEntryInfo elements in memory.
|
||||
*/
|
||||
roctxPayloadSchemaEntryInfo* payloadEntries = nullptr;
|
||||
|
||||
/**
|
||||
* Message that will be used by roctx
|
||||
*/
|
||||
char* message = nullptr;
|
||||
};
|
||||
|
||||
typedef roctxPayloadInfo* roctxPayloadInfo_t;
|
||||
|
||||
extern const char* roctxEntryTypeStr[ROCTX_PAYLOAD_NUM_ENTRY_TYPES];
|
||||
extern const char* ncclRedOpStr[ncclNumDevRedOps];
|
||||
|
||||
/**
|
||||
* \brief Maps nvtx types to roctx types.
|
||||
*/
|
||||
extern std::map<uint64_t, roctxPayloadEntryType> nvtxToRoctx;
|
||||
|
||||
/**
|
||||
* \brief Allocate required memory for roctx
|
||||
*/
|
||||
void roctxAlloc(roctxPayloadInfo_t payloadInfo, const size_t numEntries);
|
||||
|
||||
/**
|
||||
* \brief Free all the resources used by roctx
|
||||
*/
|
||||
void roctxFree(roctxPayloadInfo_t payloadInfo);
|
||||
|
||||
/**
|
||||
* \brief Extracts payload schema entry info from nvtxPayloadSchemaEntry_t and,
|
||||
* nvtxPayloadData_t and stores in an array.
|
||||
*/
|
||||
void extractPayloadInfo(const nvtxPayloadSchemaEntry_t* schema, const nvtxPayloadData_t* data, const size_t numEntries,
|
||||
const char* schemaName, roctxPayloadInfo_t payloadInfo);
|
||||
|
||||
/**
|
||||
* \brief Stringify roctxPayloadInfo_t struct. Used as roctx message.
|
||||
*/
|
||||
void stringify(roctxPayloadInfo_t payloadInfo);
|
||||
|
||||
/**
|
||||
* \brief Class to make roctx calls scoped.
|
||||
*/
|
||||
class roctx_scoped_range_in {
|
||||
public:
|
||||
/**
|
||||
* Construct a 'roctx_scoped_range_in' with specified NVTX params,
|
||||
* 'numEntries', and 'schemaName'
|
||||
*/
|
||||
explicit roctx_scoped_range_in(const nvtxPayloadSchemaEntry_t* schema, const nvtxPayloadData_t* data,
|
||||
const size_t numEntries, const char* schemaName) noexcept
|
||||
{
|
||||
#ifndef ROCTX_NO_IMPL
|
||||
roctxAlloc(&payloadInfo, numEntries);
|
||||
extractPayloadInfo(schema, data, numEntries, schemaName, &payloadInfo);
|
||||
roctxRangePushA(payloadInfo.message);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Construct a 'roctx_scoped_range_in' with the specified 'message'
|
||||
*/
|
||||
explicit roctx_scoped_range_in(const char* message) noexcept
|
||||
{
|
||||
#ifndef ROCTX_NO_IMPL
|
||||
roctxRangePushA(message);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Default constructor 'roctx_scoped_range_in'
|
||||
*/
|
||||
roctx_scoped_range_in() noexcept : roctx_scoped_range_in{""} {/*no impl*/}
|
||||
|
||||
/**
|
||||
* Destroy the roctx_scoped_range_in, ending the ROCTX range event.
|
||||
*/
|
||||
~roctx_scoped_range_in() noexcept
|
||||
{
|
||||
#ifndef ROCTX_NO_IMPL
|
||||
roctxRangePop();
|
||||
roctxFree(&payloadInfo);
|
||||
#endif
|
||||
}
|
||||
private:
|
||||
roctxPayloadInfo payloadInfo;
|
||||
};
|
||||
|
||||
#endif // RCCL_ROCTX_H
|
||||
Ссылка в новой задаче
Block a user