Improve error reporting and error codes
Make error codes more informative and have negative values. This is an ABI break but it does not appear known tools are relying on the exact error codes. Use logging for all errors so that roctracer_error_string will be able to return last error message. Make internal errors fatal and abort. Do not use the tracer API exceptions in the tracer tool. Change-Id: Ie8ed3d50e5ad26625ac9d1263f7e048edb5584c0
This commit is contained in:
+64
-21
@@ -114,32 +114,65 @@ typedef enum {
|
||||
/**
|
||||
* A generic error has occurred.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR = 1,
|
||||
ROCTRACER_STATUS_ERROR = -1,
|
||||
/**
|
||||
* The domain ID is invalid.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID = -2,
|
||||
/**
|
||||
* An invalid argument was given to the function.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT = -3,
|
||||
/**
|
||||
* No default pool is defined.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR_DEFAULT_POOL_UNDEFINED = -4,
|
||||
/**
|
||||
* The default pool is already defined.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR_DEFAULT_POOL_ALREADY_DEFINED = -5,
|
||||
/**
|
||||
* Memory allocation error.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR_MEMORY_ALLOCATION = -6,
|
||||
/**
|
||||
* External correlation ID pop mismatch.
|
||||
*/
|
||||
ROCTRACER_STATUS_ERROR_MISMATCHED_EXTERNAL_CORRELATION_ID = -7,
|
||||
/**
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_UNINIT = 2,
|
||||
/**
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_BREAK = 3,
|
||||
/**
|
||||
* The domain is invalid.
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_BAD_DOMAIN = 4,
|
||||
ROCTRACER_STATUS_BAD_DOMAIN = ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID,
|
||||
/**
|
||||
* A parameter is invalid.
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_BAD_PARAMETER = 5,
|
||||
ROCTRACER_STATUS_BAD_PARAMETER = ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT,
|
||||
/**
|
||||
* An error in a HIP API domain operation.
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_HIP_API_ERR = 6,
|
||||
/**
|
||||
* An error in a HIP asynchronous operation domain operation.
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_HIP_OPS_ERR = 7,
|
||||
/**
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_HCC_OPS_ERR = ROCTRACER_STATUS_HIP_OPS_ERR,
|
||||
/**
|
||||
* An error in a HSA domain operation.
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_HSA_ERR = 7,
|
||||
/**
|
||||
* An error in a ROCTX domain operation.
|
||||
* Deprecated error code.
|
||||
*/
|
||||
ROCTRACER_STATUS_ROCTX_ERR = 8,
|
||||
} roctracer_status_t;
|
||||
@@ -203,9 +236,11 @@ const char* roctracer_op_string(uint32_t domain,
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully. \p op and \p kind have been updated.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_PARAMETER Then \p op is invalid for \p domain.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT The \p op is invalid for
|
||||
* \p domain.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_DOMAIN The domain is invalid or not supported.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID The domain is invalid or
|
||||
* not supported.
|
||||
*/
|
||||
roctracer_status_t roctracer_op_code(uint32_t domain,
|
||||
const char* str,
|
||||
@@ -261,9 +296,10 @@ typedef activity_rtapi_callback_t roctracer_rtapi_callback_t;
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_DOMAIN \p domain is invalid.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID \p domain is invalid.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_PARAMETER \p op is invalid.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT \p op is invalid for \p
|
||||
* domain.
|
||||
*/
|
||||
roctracer_status_t roctracer_enable_op_callback(
|
||||
activity_domain_t domain,
|
||||
@@ -284,7 +320,7 @@ roctracer_status_t roctracer_enable_op_callback(
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_DOMAIN \p domain is invalid.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID \p domain is invalid.
|
||||
*/
|
||||
roctracer_status_t roctracer_enable_domain_callback(
|
||||
activity_domain_t domain,
|
||||
@@ -316,9 +352,10 @@ roctracer_status_t roctracer_enable_callback(
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_DOMAIN \p domain is invalid.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID \p domain is invalid.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_PARAMETER \p op is invalid.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT \p op is invalid for \p
|
||||
* domain.
|
||||
*/
|
||||
roctracer_status_t roctracer_disable_op_callback(activity_domain_t domain,
|
||||
uint32_t op);
|
||||
@@ -331,7 +368,7 @@ roctracer_status_t roctracer_disable_op_callback(activity_domain_t domain,
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully.
|
||||
*
|
||||
* @retval ::ROCTRACER_STATUS_BAD_DOMAIN \p domain is invalid.
|
||||
* @retval ::ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID \p domain is invalid.
|
||||
*/
|
||||
roctracer_status_t roctracer_disable_domain_callback(activity_domain_t domain);
|
||||
|
||||
@@ -480,8 +517,11 @@ typedef void roctracer_pool_t;
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully.
|
||||
*
|
||||
* @retval ROCTRACER_STATUS_ERROR \p pool is NULL and the default pool is
|
||||
* already defined. Unable to create the pool.
|
||||
* @retval ROCTRACER_STATUS_ERROR_DEFAULT_POOL_ALREADY_DEFINED \p pool is NULL
|
||||
* and the default pool is already defined. Unable to create the pool.
|
||||
*
|
||||
* @retval ROCTRACER_STATUS_ERROR_MEMORY_ALLOCATION Unable to allocate memory
|
||||
* for the \p pool. Unable to create the pool.
|
||||
*/
|
||||
roctracer_status_t roctracer_open_pool_expl(
|
||||
const roctracer_properties_t* properties,
|
||||
@@ -498,8 +538,11 @@ roctracer_status_t roctracer_open_pool_expl(
|
||||
* @retval ::ROCTRACER_STATUS_SUCCESS The function has been executed
|
||||
* successfully.
|
||||
*
|
||||
* @retval ROCTRACER_STATUS_ERROR The default pool is already defined. Unable
|
||||
* to create the pool.
|
||||
* @retval ROCTRACER_STATUS_ERROR_DEFAULT_POOL_ALREADY_DEFINED The default pool
|
||||
* is already defined. Unable to create the pool.
|
||||
*
|
||||
* @retval ROCTRACER_STATUS_ERROR_MEMORY_ALLOCATION Unable to allocate memory
|
||||
* for the \p pool. Unable to create the pool.
|
||||
*/
|
||||
roctracer_status_t roctracer_open_pool(const roctracer_properties_t* properties);
|
||||
|
||||
|
||||
@@ -47,13 +47,12 @@
|
||||
#define CONSTRUCTOR_API __attribute__((constructor))
|
||||
#define DESTRUCTOR_API __attribute__((destructor))
|
||||
|
||||
#define CHECK_STATUS(msg, status) \
|
||||
#define CHECK_HSA_STATUS(msg, status) \
|
||||
do { \
|
||||
if ((status) != HSA_STATUS_SUCCESS) { \
|
||||
const char* status_string = nullptr; \
|
||||
hsa_status_string(status, &status_string); \
|
||||
ERR_LOGGING(msg << ": " << (status_string ? status_string : "<unknown error>")); \
|
||||
abort(); \
|
||||
FATAL_LOGGING(msg << ": " << (status_string ? status_string : "<unknown error>")); \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
@@ -61,7 +60,7 @@
|
||||
do { \
|
||||
hipError_t err = call; \
|
||||
if (err != hipSuccess) { \
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR, "HIP error: " #call " error(" << err << ")"); \
|
||||
FATAL_LOGGING("HIP error: " #call " error(" << err << ")"); \
|
||||
} \
|
||||
} while (false)
|
||||
|
||||
@@ -155,13 +154,13 @@ uint64_t timestamp_ns() {
|
||||
|
||||
hsa_status_t status = hsa_support::hsa_system_get_info_fn(HSA_SYSTEM_INFO_TIMESTAMP, &sysclock);
|
||||
if (status == HSA_STATUS_ERROR_NOT_INITIALIZED) return 0;
|
||||
CHECK_STATUS("hsa_system_get_info()", status);
|
||||
CHECK_HSA_STATUS("hsa_system_get_info()", status);
|
||||
|
||||
static uint64_t sysclock_period = []() {
|
||||
uint64_t sysclock_hz = 0;
|
||||
hsa_status_t status =
|
||||
hsa_support::hsa_system_get_info_fn(HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY, &sysclock_hz);
|
||||
CHECK_STATUS("hsa_system_get_info()", status);
|
||||
CHECK_HSA_STATUS("hsa_system_get_info()", status);
|
||||
return (uint64_t)1000000000 / sysclock_hz;
|
||||
}();
|
||||
|
||||
@@ -548,7 +547,7 @@ PUBLIC_API const char* roctracer_op_string(uint32_t domain, uint32_t op, uint32_
|
||||
case ACTIVITY_DOMAIN_EXT_API:
|
||||
return "EXT_API";
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
API_METHOD_CATCH(nullptr)
|
||||
}
|
||||
@@ -561,7 +560,7 @@ PUBLIC_API roctracer_status_t roctracer_op_code(uint32_t domain, const char* str
|
||||
case ACTIVITY_DOMAIN_HSA_API: {
|
||||
*op = hsa_support::GetApiCode(str);
|
||||
if (*op == HSA_API_ID_NUMBER) {
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_PARAMETER,
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT,
|
||||
"Invalid API name \"" << str << "\", domain ID(" << domain << ")");
|
||||
}
|
||||
if (kind != nullptr) *kind = 0;
|
||||
@@ -570,14 +569,14 @@ PUBLIC_API roctracer_status_t roctracer_op_code(uint32_t domain, const char* str
|
||||
case ACTIVITY_DOMAIN_HIP_API: {
|
||||
*op = hipApiIdByName(str);
|
||||
if (*op == HIP_API_ID_NONE) {
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_PARAMETER,
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT,
|
||||
"Invalid API name \"" << str << "\", domain ID(" << domain << ")");
|
||||
}
|
||||
if (kind != nullptr) *kind = 0;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "limited domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "limited domain ID(" << domain << ")");
|
||||
}
|
||||
API_METHOD_SUFFIX
|
||||
}
|
||||
@@ -599,7 +598,7 @@ static inline uint32_t get_op_begin(uint32_t domain) {
|
||||
case ACTIVITY_DOMAIN_ROCTX:
|
||||
return 0;
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -621,33 +620,35 @@ static inline uint32_t get_op_end(uint32_t domain) {
|
||||
case ACTIVITY_DOMAIN_ROCTX:
|
||||
return ROCTX_API_ID_NUMBER;
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Enable runtime API callbacks
|
||||
static roctracer_status_t roctracer_enable_callback_fun(roctracer_domain_t domain, uint32_t op,
|
||||
roctracer_rtapi_callback_t callback,
|
||||
void* user_data) {
|
||||
static void roctracer_enable_callback_fun(roctracer_domain_t domain, uint32_t op,
|
||||
roctracer_rtapi_callback_t callback, void* user_data) {
|
||||
switch (domain) {
|
||||
case ACTIVITY_DOMAIN_HSA_OPS:
|
||||
break;
|
||||
case ACTIVITY_DOMAIN_HSA_API: {
|
||||
#if 0
|
||||
if (op == HSA_API_ID_DISPATCH) {
|
||||
if (!RocpLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data)) EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::RegisterApiCallback error(" << op << ") failed");
|
||||
if (!RocpLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data))
|
||||
FATAL_LOGGING("HSA::RegisterApiCallback error(" << op << ") failed");
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (op >= HSA_API_ID_NUMBER) return ROCTRACER_STATUS_BAD_PARAMETER;
|
||||
if (op >= HSA_API_ID_NUMBER)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT,
|
||||
"invalid HSA API operation ID(" << op << ")");
|
||||
|
||||
hsa_support::cb_table.Set(op, callback, user_data);
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_HSA_EVT: {
|
||||
if (!RocpLoader::Instance().RegisterEvtCallback(op, (void*)callback, user_data))
|
||||
EXC_RAISING(ROCTRACER_STATUS_HSA_ERR,
|
||||
"HSA::RegisterEvtCallback error(" << op << ") failed");
|
||||
FATAL_LOGGING("HSA::RegisterEvtCallback error(" << op << ") failed");
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_HIP_OPS:
|
||||
@@ -659,29 +660,26 @@ static roctracer_status_t roctracer_enable_callback_fun(roctracer_domain_t domai
|
||||
hipError_t hip_err =
|
||||
HipLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIP::RegisterApiCallback(" << op << ") error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIP::RegisterApiCallback(" << op << ") error(" << hip_err << ")");
|
||||
|
||||
if (HipApiActivityEnableCheck(op) == 0) {
|
||||
hip_err = HipLoader::Instance().RegisterActivityCallback(op, (void*)HIP_SyncApiDataCallback,
|
||||
(void*)1);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(
|
||||
ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIPAPI: HIP::RegisterActivityCallback(" << op << ") error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIPAPI: HIP::RegisterActivityCallback(" << op << ") error(" << hip_err
|
||||
<< ")");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_ROCTX: {
|
||||
if (RocTxLoader::Instance().Enabled() &&
|
||||
!RocTxLoader::Instance().RegisterApiCallback(op, (void*)callback, user_data))
|
||||
EXC_RAISING(ROCTRACER_STATUS_ROCTX_ERR, "ROCTX::RegisterApiCallback(" << op << ") failed");
|
||||
FATAL_LOGGING("ROCTX::RegisterApiCallback(" << op << ") failed");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
return ROCTRACER_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void roctracer_enable_callback_impl(roctracer_domain_t domain, uint32_t op,
|
||||
@@ -720,16 +718,19 @@ PUBLIC_API roctracer_status_t roctracer_enable_callback(roctracer_rtapi_callback
|
||||
}
|
||||
|
||||
// Disable runtime API callbacks
|
||||
static roctracer_status_t roctracer_disable_callback_fun(roctracer_domain_t domain, uint32_t op) {
|
||||
static void roctracer_disable_callback_fun(roctracer_domain_t domain, uint32_t op) {
|
||||
switch (domain) {
|
||||
case ACTIVITY_DOMAIN_HSA_OPS:
|
||||
break;
|
||||
case ACTIVITY_DOMAIN_HSA_API: {
|
||||
#if 0
|
||||
if (op == HSA_API_ID_DISPATCH && !RocpLoader::Instance().RemoveApiCallback(op)) EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::RemoveActivityCallback error(" << op << ") failed");
|
||||
if (op == HSA_API_ID_DISPATCH && !RocpLoader::Instance().RemoveApiCallback(op))
|
||||
FATAL_LOGGING("HSA::RemoveActivityCallback error(" << op << ") failed");
|
||||
break;
|
||||
#endif
|
||||
if (op >= HSA_API_ID_NUMBER) return ROCTRACER_STATUS_BAD_PARAMETER;
|
||||
if (op >= HSA_API_ID_NUMBER)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_ARGUMENT,
|
||||
"invalid HSA API operation ID(" << op << ")");
|
||||
hsa_support::cb_table.Set(op, nullptr, nullptr);
|
||||
break;
|
||||
}
|
||||
@@ -741,32 +742,29 @@ static roctracer_status_t roctracer_disable_callback_fun(roctracer_domain_t doma
|
||||
|
||||
const hipError_t hip_err = HipLoader::Instance().RemoveApiCallback(op);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIP::RemoveApiCallback(" << op << "), error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIP::RemoveApiCallback(" << op << "), error(" << hip_err << ")");
|
||||
|
||||
if (HipApiActivityDisableCheck(op) == 0) {
|
||||
const hipError_t hip_err = HipLoader::Instance().RemoveActivityCallback(op);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(
|
||||
ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIPAPI: HIP::RemoveActivityCallback op(" << op << "), error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIPAPI: HIP::RemoveActivityCallback op(" << op << "), error(" << hip_err
|
||||
<< ")");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_HSA_EVT: {
|
||||
if (!RocpLoader::Instance().RemoveEvtCallback(op))
|
||||
EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::RemoveEvtCallback error(" << op << ") failed");
|
||||
FATAL_LOGGING("HSA::RemoveEvtCallback error(" << op << ") failed");
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_ROCTX: {
|
||||
if (RocTxLoader::Instance().Enabled() && !RocTxLoader::Instance().RemoveApiCallback(op))
|
||||
EXC_RAISING(ROCTRACER_STATUS_ROCTX_ERR, "ROCTX::RemoveApiCallback(" << op << ") failed");
|
||||
FATAL_LOGGING("ROCTX::RemoveApiCallback(" << op << ") failed");
|
||||
break;
|
||||
}
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
return ROCTRACER_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void roctracer_disable_callback_impl(roctracer_domain_t domain, uint32_t op) {
|
||||
@@ -817,10 +815,10 @@ static void roctracer_open_pool_impl(const roctracer_properties_t* properties,
|
||||
roctracer_pool_t** pool) {
|
||||
std::lock_guard lock(memory_pool_mutex);
|
||||
if ((pool == nullptr) && (default_memory_pool != nullptr)) {
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR, "default pool already set");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_DEFAULT_POOL_ALREADY_DEFINED, "default pool already set");
|
||||
}
|
||||
MemoryPool* p = new MemoryPool(*properties);
|
||||
if (p == nullptr) EXC_RAISING(ROCTRACER_STATUS_ERROR, "MemoryPool() error");
|
||||
if (p == nullptr) EXC_RAISING(ROCTRACER_STATUS_ERROR_MEMORY_ALLOCATION, "MemoryPool() error");
|
||||
if (pool != nullptr)
|
||||
*pool = p;
|
||||
else
|
||||
@@ -846,13 +844,14 @@ PUBLIC_API roctracer_status_t roctracer_next_record(
|
||||
const activity_record_t* record,
|
||||
const activity_record_t** next)
|
||||
{
|
||||
API_METHOD_PREFIX
|
||||
*next = record + 1;
|
||||
return ROCTRACER_STATUS_SUCCESS;
|
||||
API_METHOD_SUFFIX
|
||||
}
|
||||
|
||||
// Enable activity records logging
|
||||
static roctracer_status_t roctracer_enable_activity_fun(roctracer_domain_t domain, uint32_t op,
|
||||
roctracer_pool_t* pool) {
|
||||
static void roctracer_enable_activity_fun(roctracer_domain_t domain, uint32_t op,
|
||||
roctracer_pool_t* pool) {
|
||||
assert(pool != nullptr);
|
||||
switch (domain) {
|
||||
case ACTIVITY_DOMAIN_HSA_OPS: {
|
||||
@@ -868,7 +867,7 @@ static roctracer_status_t roctracer_enable_activity_fun(roctracer_domain_t domai
|
||||
(void*)pool);
|
||||
}
|
||||
if (!RocpLoader::Instance().EnableActivityCallback(op, true))
|
||||
EXC_RAISING(ROCTRACER_STATUS_HSA_ERR, "HSA::EnableActivityCallback error");
|
||||
FATAL_LOGGING("HSA::EnableActivityCallback error");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -887,7 +886,7 @@ static roctracer_status_t roctracer_enable_activity_fun(roctracer_domain_t domai
|
||||
HipLoader::Instance().InitActivityDone() = true;
|
||||
}
|
||||
if (!HipLoader::Instance().EnableActivityCallback(op, true))
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_OPS_ERR, "HIP::EnableActivityCallback error");
|
||||
FATAL_LOGGING("HIP::EnableActivityCallback error");
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_HIP_API: {
|
||||
@@ -898,23 +897,22 @@ static roctracer_status_t roctracer_enable_activity_fun(roctracer_domain_t domai
|
||||
const hipError_t hip_err = HipLoader::Instance().RegisterActivityCallback(
|
||||
op, (void*)HIP_SyncActivityCallback, (void*)pool);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIP::RegisterActivityCallback(" << op << " error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIP::RegisterActivityCallback(" << op << " error(" << hip_err << ")");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_ROCTX:
|
||||
break;
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
return ROCTRACER_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void roctracer_enable_activity_impl(roctracer_domain_t domain, uint32_t op,
|
||||
roctracer_pool_t* pool) {
|
||||
if (pool == nullptr) pool = default_memory_pool;
|
||||
if (pool == nullptr) EXC_RAISING(ROCTRACER_STATUS_ERROR, "no default pool");
|
||||
if (pool == nullptr)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_DEFAULT_POOL_UNDEFINED, "no default pool");
|
||||
act_journal.Insert(domain, op, {pool});
|
||||
roctracer_enable_activity_fun(domain, op, pool);
|
||||
}
|
||||
@@ -974,7 +972,7 @@ PUBLIC_API roctracer_status_t roctracer_enable_activity() {
|
||||
}
|
||||
|
||||
// Disable activity records logging
|
||||
static roctracer_status_t roctracer_disable_activity_fun(roctracer_domain_t domain, uint32_t op) {
|
||||
static void roctracer_disable_activity_fun(roctracer_domain_t domain, uint32_t op) {
|
||||
switch (domain) {
|
||||
case ACTIVITY_DOMAIN_HSA_OPS: {
|
||||
if (op == HSA_OP_ID_COPY) {
|
||||
@@ -983,8 +981,7 @@ static roctracer_status_t roctracer_disable_activity_fun(roctracer_domain_t doma
|
||||
} else {
|
||||
if (RocpLoader::GetRef() == nullptr) break;
|
||||
if (!RocpLoader::Instance().EnableActivityCallback(op, false))
|
||||
EXC_RAISING(ROCTRACER_STATUS_HSA_ERR,
|
||||
"HSA::EnableActivityCallback(false) error, op(" << op << ")");
|
||||
FATAL_LOGGING("HSA::EnableActivityCallback(false) error, op(" << op << ")");
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -995,8 +992,7 @@ static roctracer_status_t roctracer_disable_activity_fun(roctracer_domain_t doma
|
||||
case ACTIVITY_DOMAIN_HIP_OPS: {
|
||||
if (HipLoader::Instance().Enabled() &&
|
||||
!HipLoader::Instance().EnableActivityCallback(op, false))
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_OPS_ERR,
|
||||
"HIP::EnableActivityCallback(nullptr) error, op(" << op << ")");
|
||||
FATAL_LOGGING("HIP::EnableActivityCallback(nullptr) error, op(" << op << ")");
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_HIP_API: {
|
||||
@@ -1006,24 +1002,21 @@ static roctracer_status_t roctracer_disable_activity_fun(roctracer_domain_t doma
|
||||
if (HipActActivityDisableCheck(op) == 0) {
|
||||
const hipError_t hip_err = HipLoader::Instance().RemoveActivityCallback(op);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIP::RemoveActivityCallback op(" << op << "), error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIP::RemoveActivityCallback op(" << op << "), error(" << hip_err << ")");
|
||||
} else {
|
||||
const hipError_t hip_err = HipLoader::Instance().RegisterActivityCallback(
|
||||
op, (void*)HIP_SyncApiDataCallback, (void*)1);
|
||||
if (hip_err != hipSuccess)
|
||||
EXC_RAISING(
|
||||
ROCTRACER_STATUS_HIP_API_ERR,
|
||||
"HIPACT: HIP::RegisterActivityCallback(" << op << ") error(" << hip_err << ")");
|
||||
FATAL_LOGGING("HIPACT: HIP::RegisterActivityCallback(" << op << ") error(" << hip_err
|
||||
<< ")");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case ACTIVITY_DOMAIN_ROCTX:
|
||||
break;
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
return ROCTRACER_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static void roctracer_disable_activity_impl(roctracer_domain_t domain, uint32_t op) {
|
||||
@@ -1123,16 +1116,11 @@ PUBLIC_API roctracer_status_t
|
||||
roctracer_activity_pop_external_correlation_id(activity_correlation_id_t* last_id) {
|
||||
API_METHOD_PREFIX
|
||||
if (last_id != nullptr) *last_id = 0;
|
||||
|
||||
if (external_id_stack.empty() != true) {
|
||||
if (last_id != nullptr) *last_id = external_id_stack.top();
|
||||
external_id_stack.pop();
|
||||
} else {
|
||||
#if 0
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR, "not matching external range pop");
|
||||
#endif
|
||||
return ROCTRACER_STATUS_ERROR;
|
||||
}
|
||||
if (external_id_stack.empty())
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_MISMATCHED_EXTERNAL_CORRELATION_ID,
|
||||
"not matching external range pop");
|
||||
if (last_id != nullptr) *last_id = external_id_stack.top();
|
||||
external_id_stack.pop();
|
||||
API_METHOD_SUFFIX
|
||||
}
|
||||
|
||||
@@ -1231,7 +1219,7 @@ PUBLIC_API roctracer_status_t roctracer_set_properties(roctracer_domain_t domain
|
||||
break;
|
||||
}
|
||||
default:
|
||||
EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")");
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR_INVALID_DOMAIN_ID, "invalid domain ID(" << domain << ")");
|
||||
}
|
||||
API_METHOD_SUFFIX
|
||||
}
|
||||
|
||||
@@ -81,11 +81,11 @@ class Tracker {
|
||||
// Creating a proxy signal
|
||||
status = hsa_signal_create(1, 0, NULL, &(entry->signal));
|
||||
if (status != HSA_STATUS_SUCCESS)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR, "hsa_signal_create failed");
|
||||
FATAL_LOGGING("hsa_signal_create failed");
|
||||
status =
|
||||
hsa_amd_signal_async_handler(entry->signal, HSA_SIGNAL_CONDITION_LT, 1, Handler, entry);
|
||||
if (status != HSA_STATUS_SUCCESS)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR, "hsa_amd_signal_async_handler failed");
|
||||
FATAL_LOGGING("hsa_amd_signal_async_handler failed");
|
||||
}
|
||||
|
||||
// Delete tracker entry
|
||||
@@ -101,7 +101,7 @@ class Tracker {
|
||||
uint64_t sysclock_hz = 0;
|
||||
hsa_status_t status = hsa_system_get_info(HSA_SYSTEM_INFO_TIMESTAMP_FREQUENCY, &sysclock_hz);
|
||||
if (status != HSA_STATUS_SUCCESS)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR, "hsa_system_get_info failed");
|
||||
FATAL_LOGGING("hsa_system_get_info failed");
|
||||
return (uint64_t)1000000000 / sysclock_hz;
|
||||
}();
|
||||
|
||||
@@ -109,7 +109,7 @@ class Tracker {
|
||||
hsa_amd_profiling_async_copy_time_t async_copy_time{};
|
||||
hsa_status_t status = hsa_amd_profiling_get_async_copy_time(entry->signal, &async_copy_time);
|
||||
if (status != HSA_STATUS_SUCCESS)
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR, "hsa_amd_profiling_get_async_copy_time failed");
|
||||
FATAL_LOGGING("hsa_amd_profiling_get_async_copy_time failed");
|
||||
entry->begin = async_copy_time.start * sysclock_period;
|
||||
entry->end = async_copy_time.end * sysclock_period;
|
||||
} else {
|
||||
|
||||
@@ -852,13 +852,14 @@ void tool_load() {
|
||||
uint32_t ctrl_rate = 0;
|
||||
|
||||
if (sscanf(ctrl_str, "%d:%d:%d", &ctrl_delay, &ctrl_len, &ctrl_rate) != 3) {
|
||||
EXC_RAISING(
|
||||
ROCTRACER_STATUS_ERROR,
|
||||
"Invalid ROCP_CTRL_RATE var(" << ctrl_str << "), expected ctrl_delay:ctrl_len:ctrl_rate");
|
||||
fprintf(stderr,
|
||||
"ROCTracer: Invalid ROCP_CTRL_RATE var(%s), expected ctrl_delay:ctrl_len:ctrl_rate",
|
||||
ctrl_str);
|
||||
abort();
|
||||
}
|
||||
if (ctrl_len > ctrl_rate) {
|
||||
EXC_RAISING(ROCTRACER_STATUS_ERROR,
|
||||
"Control length value " << ctrl_len << " > rate value " << ctrl_rate);
|
||||
fprintf(stderr, "ROCTracer: Control length value %u > rate value %u", ctrl_len, ctrl_rate);
|
||||
abort();
|
||||
}
|
||||
control_dist_us = ctrl_rate - ctrl_len;
|
||||
control_len_us = ctrl_len;
|
||||
|
||||
@@ -39,8 +39,7 @@
|
||||
#include <mutex>
|
||||
#include <map>
|
||||
|
||||
namespace roctracer {
|
||||
namespace util {
|
||||
namespace roctracer::util {
|
||||
|
||||
class Logger {
|
||||
public:
|
||||
@@ -164,8 +163,14 @@ class Logger {
|
||||
std::map<uint32_t, std::string> message_;
|
||||
};
|
||||
|
||||
} // namespace util
|
||||
} // namespace roctracer
|
||||
} // namespace roctracer::util
|
||||
|
||||
#define FATAL_LOGGING(stream) \
|
||||
do { \
|
||||
roctracer::util::Logger::Instance() \
|
||||
<< "fatal: " << roctracer::util::Logger::begm << stream << roctracer::util::Logger::endl; \
|
||||
abort(); \
|
||||
} while (0)
|
||||
|
||||
#define ERR_LOGGING(stream) \
|
||||
do { \
|
||||
|
||||
Reference in New Issue
Block a user