diff --git a/inc/roctracer.h b/inc/roctracer.h index f804b8b8eb..b635cb85df 100644 --- a/inc/roctracer.h +++ b/inc/roctracer.h @@ -99,7 +99,7 @@ const char* roctracer_error_string(); // Traced API domains typedef enum { - ROCTRACER_API_DOMAIN_ANY = 0, // HIP API domain + ROCTRACER_API_DOMAIN_ANY = 0, // Any domain ROCTRACER_API_DOMAIN_HIP = 1, // HIP API domain } roctracer_api_domain_t; @@ -112,8 +112,14 @@ typedef uint64_t roctracer_correletion_id_t; // Return method name by given API domain and call ID // NULL returned on the error and the library errno is set const char* roctracer_get_api_name( - roctracer_api_domain_t domain, // API domain - roctracer_hip_api_cid_t cid); // API call ID + const uint32_t& domain, // API domain + const uint32_t& cid); // API call ID + +// Return activity name by given API domain operation ID and activity kind +// NULL returned on the error and the library errno is set +const char* roctracer_get_activity_name( + const uint32_t& domain, // API domain + const uint32_t& kind); // Activity kind //////////////////////////////////////////////////////////////////////////////// // Callback API diff --git a/src/core/roctracer.cpp b/src/core/roctracer.cpp index af33702ff2..172ec8f304 100644 --- a/src/core/roctracer.cpp +++ b/src/core/roctracer.cpp @@ -46,8 +46,17 @@ } \ return err; +#define API_METHOD_CATCH(X) \ + } \ + catch (std::exception & e) { \ + ERR_LOGGING(__FUNCTION__ << "(), " << e.what()); \ + } \ + (void)err; \ + return X; + // HCC API declaration extern "C" void HSAOp_set_activity_record(const uint64_t& record); +extern "C" const char* HSAOp_get_name(const uint32_t& id); /////////////////////////////////////////////////////////////////////////////////////////////////// // Internal library methods @@ -387,8 +396,32 @@ PUBLIC_API const char* roctracer_error_string() { // Return method name by given API domain and call ID // NULL returned on the error and the library errno is set -PUBLIC_API const char* roctracer_get_api_name(roctracer_api_domain_t domain, roctracer_hip_api_cid_t cid) { - return NULL; +PUBLIC_API const char* roctracer_get_api_name(const uint32_t& domain, const uint32_t& cid) { + API_METHOD_PREFIX + switch (domain) { + case ROCTRACER_API_DOMAIN_HIP: { + return hipApiName(cid); + break; + } + default: + EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")"); + } + API_METHOD_CATCH(NULL) +} + +// Return activity name by given API domain and activity kind +// NULL returned on the error and the library errno is set +PUBLIC_API const char* roctracer_get_activity_name(const uint32_t& domain, const uint32_t& kind) { + API_METHOD_PREFIX + switch (domain) { + case ROCTRACER_API_DOMAIN_HIP: { + return HSAOp_get_name(kind); + break; + } + default: + EXC_RAISING(ROCTRACER_STATUS_BAD_DOMAIN, "invalid domain ID(" << domain << ")"); + } + API_METHOD_CATCH(NULL) } // Enable runtime API callbacks diff --git a/test/MatrixTranspose/Makefile b/test/MatrixTranspose/Makefile index 861a0e21c9..eb93cbe96e 100644 --- a/test/MatrixTranspose/Makefile +++ b/test/MatrixTranspose/Makefile @@ -3,8 +3,8 @@ LIB_PATH=$(ROOT_PATH)/b LIB_NAME=roctracer64 ROC_LIBS=-L$(LIB_PATH) -l$(LIB_NAME) -HIP_PATH=/home/evgeny/work/roc-1.8.x/hip -HCC_PATH=/home/evgeny/work/roc-1.8.x/hcc/b +HIP_PATH?=/home/evgeny/work/roc-1.8.x/hip +HCC_PATH?=/home/evgeny/work/roc-1.8.x/hcc/b HIPCC=$(HIP_PATH)/bin/hipcc HCC_LIBS=-L$(HCC_PATH)/lib -lmcwamp_hsa diff --git a/test/MatrixTranspose/MatrixTranspose.cpp b/test/MatrixTranspose/MatrixTranspose.cpp index 90ffc84251..c564303650 100644 --- a/test/MatrixTranspose/MatrixTranspose.cpp +++ b/test/MatrixTranspose/MatrixTranspose.cpp @@ -165,7 +165,7 @@ extern "C" void hip_api_callback( (void)arg; const hip_cb_data_t* data = reinterpret_cast(callback_data); fprintf(stdout, "<%s id(%u)\tcorrelation_id(%lu) %s> ", - data->name, + roctracer_get_api_name(ROCTRACER_API_DOMAIN_HIP, cid), cid, data->correlation_id, (data->phase == ROCTRACER_API_PHASE_ENTER) ? "on-enter" : "on-exit"); @@ -188,12 +188,12 @@ extern "C" void hip_api_callback( data->args.hipFree.ptr); break; case HIP_API_ID_hipModuleLaunchKernel: - fprintf(stdout, "kernel(\"%s\") straem(%p)", + fprintf(stdout, "kernel(\"%s\") stream(%p)", data->args.hipModuleLaunchKernel.f->_name.c_str(), data->args.hipModuleLaunchKernel.stream); break; case HIP_API_ID_hipLaunchKernel: - fprintf(stdout, "kernel(%p) straem(%p)", + fprintf(stdout, "kernel(%p) stream(%p)", data->args.hipLaunchKernel.kernel, data->args.hipLaunchKernel.stream); break; @@ -226,14 +226,23 @@ void activity_callback(const char* begin, const char* end, void* arg) { ROCTRACER_CALL(roctracer_next_record(record, &next)); fprintf(stdout, "\tActivity records:\n"); fflush(stdout); while (reinterpret_cast(next) <= end) { - fprintf(stdout, "\tid(%u.%u.%u)\tcorrelation_id(%lu) host_ns(%lu:%lu)\n", - record->async, + const char * name = (record->op_id == 0) ? + roctracer_get_api_name(ROCTRACER_API_DOMAIN_HIP, record->activity_kind) : + roctracer_get_activity_name(ROCTRACER_API_DOMAIN_HIP, record->activity_kind); + fprintf(stdout, "\t%s op(%u) id(%u)\tcorrelation_id(%lu) time_ns(%lu:%lu)", + name, record->op_id, record->activity_kind, record->correlation_id, record->begin_ns, record->end_ns ); + if (record->op_id != 0) { + const roctracer_async_record_t* async_record = reinterpret_cast(record); + fprintf(stdout, " device_id(%d) stream_id(%lu)", async_record->device_id, async_record->stream_id); + if (record->op_id == 2) fprintf(stdout, " bytes(0x%zx)", async_record->bytes); + } + fprintf(stdout, "\n"); fflush(stdout); record = next; ROCTRACER_CALL(roctracer_next_record(record, &next)); @@ -250,7 +259,7 @@ void init_tracing() { // Enable HIP activity tracing roctracer_properties_t properties{}; - properties.buffer_size = 8; + properties.buffer_size = 16; properties.buffer_callback_fun = activity_callback; ROCTRACER_CALL(roctracer_open_pool(&properties)); ROCTRACER_CALL(roctracer_enable_api_activity(ROCTRACER_API_DOMAIN_HIP, HIP_API_ID_hipMemcpy));