MNghia's picture
Add files using upload-large-folder tool
563c80f verified
#include <Metric.h>
#include <Parser.h>
#include <Utils.h>
#include <nvperf_host.h>
#include <nvperf_cuda_host.h>
#include <iostream>
#include <ScopeExit.h>
namespace NV {
namespace Metric {
namespace Config {
bool GetRawMetricRequests(std::string chipName,
const std::vector<std::string>& metricNames,
std::vector<NVPA_RawMetricRequest>& rawMetricRequests,
const uint8_t* pCounterAvailabilityImage)
{
NVPW_CUDA_MetricsEvaluator_CalculateScratchBufferSize_Params calculateScratchBufferSizeParam = {NVPW_CUDA_MetricsEvaluator_CalculateScratchBufferSize_Params_STRUCT_SIZE};
calculateScratchBufferSizeParam.pChipName = chipName.c_str();
calculateScratchBufferSizeParam.pCounterAvailabilityImage = pCounterAvailabilityImage;
RETURN_IF_NVPW_ERROR(false, NVPW_CUDA_MetricsEvaluator_CalculateScratchBufferSize(&calculateScratchBufferSizeParam));
std::vector<uint8_t> scratchBuffer(calculateScratchBufferSizeParam.scratchBufferSize);
NVPW_CUDA_MetricsEvaluator_Initialize_Params metricEvaluatorInitializeParams = {NVPW_CUDA_MetricsEvaluator_Initialize_Params_STRUCT_SIZE};
metricEvaluatorInitializeParams.scratchBufferSize = scratchBuffer.size();
metricEvaluatorInitializeParams.pScratchBuffer = scratchBuffer.data();
metricEvaluatorInitializeParams.pChipName = chipName.c_str();
metricEvaluatorInitializeParams.pCounterAvailabilityImage = pCounterAvailabilityImage;
RETURN_IF_NVPW_ERROR(false, NVPW_CUDA_MetricsEvaluator_Initialize(&metricEvaluatorInitializeParams));
NVPW_MetricsEvaluator* metricEvaluator = metricEvaluatorInitializeParams.pMetricsEvaluator;
bool isolated = true;
bool keepInstances = true;
std::vector<const char*> rawMetricNames;
for (auto& metricName : metricNames)
{
std::string reqName;
NV::Metric::Parser::ParseMetricNameString(metricName, &reqName, &isolated, &keepInstances);
keepInstances = true;
NVPW_MetricEvalRequest metricEvalRequest;
NVPW_MetricsEvaluator_ConvertMetricNameToMetricEvalRequest_Params convertMetricToEvalRequest = {NVPW_MetricsEvaluator_ConvertMetricNameToMetricEvalRequest_Params_STRUCT_SIZE};
convertMetricToEvalRequest.pMetricsEvaluator = metricEvaluator;
convertMetricToEvalRequest.pMetricName = reqName.c_str();
convertMetricToEvalRequest.pMetricEvalRequest = &metricEvalRequest;
convertMetricToEvalRequest.metricEvalRequestStructSize = NVPW_MetricEvalRequest_STRUCT_SIZE;
RETURN_IF_NVPW_ERROR(false, NVPW_MetricsEvaluator_ConvertMetricNameToMetricEvalRequest(&convertMetricToEvalRequest));
std::vector<const char*> rawDependencies;
NVPW_MetricsEvaluator_GetMetricRawDependencies_Params getMetricRawDependenciesParms = {NVPW_MetricsEvaluator_GetMetricRawDependencies_Params_STRUCT_SIZE};
getMetricRawDependenciesParms.pMetricsEvaluator = metricEvaluator;
getMetricRawDependenciesParms.pMetricEvalRequests = &metricEvalRequest;
getMetricRawDependenciesParms.numMetricEvalRequests = 1;
getMetricRawDependenciesParms.metricEvalRequestStructSize = NVPW_MetricEvalRequest_STRUCT_SIZE;
getMetricRawDependenciesParms.metricEvalRequestStrideSize = sizeof(NVPW_MetricEvalRequest);
RETURN_IF_NVPW_ERROR(false, NVPW_MetricsEvaluator_GetMetricRawDependencies(&getMetricRawDependenciesParms));
rawDependencies.resize(getMetricRawDependenciesParms.numRawDependencies);
getMetricRawDependenciesParms.ppRawDependencies = rawDependencies.data();
RETURN_IF_NVPW_ERROR(false, NVPW_MetricsEvaluator_GetMetricRawDependencies(&getMetricRawDependenciesParms));
for (size_t i = 0; i < rawDependencies.size(); ++i)
{
rawMetricNames.push_back(rawDependencies[i]);
}
}
for (auto& rawMetricName : rawMetricNames)
{
NVPA_RawMetricRequest metricRequest = { NVPA_RAW_METRIC_REQUEST_STRUCT_SIZE };
metricRequest.pMetricName = rawMetricName;
metricRequest.isolated = isolated;
metricRequest.keepInstances = keepInstances;
rawMetricRequests.push_back(metricRequest);
}
NVPW_MetricsEvaluator_Destroy_Params metricEvaluatorDestroyParams = { NVPW_MetricsEvaluator_Destroy_Params_STRUCT_SIZE };
metricEvaluatorDestroyParams.pMetricsEvaluator = metricEvaluator;
RETURN_IF_NVPW_ERROR(false, NVPW_MetricsEvaluator_Destroy(&metricEvaluatorDestroyParams));
return true;
}
bool GetConfigImage(std::string chipName, const std::vector<std::string>& metricNames, std::vector<uint8_t>& configImage, const uint8_t* pCounterAvailabilityImage)
{
std::vector<NVPA_RawMetricRequest> rawMetricRequests;
GetRawMetricRequests(chipName, metricNames, rawMetricRequests, pCounterAvailabilityImage);
NVPW_CUDA_RawMetricsConfig_Create_V2_Params rawMetricsConfigCreateParams = { NVPW_CUDA_RawMetricsConfig_Create_V2_Params_STRUCT_SIZE };
rawMetricsConfigCreateParams.activityKind = NVPA_ACTIVITY_KIND_PROFILER;
rawMetricsConfigCreateParams.pChipName = chipName.c_str();
rawMetricsConfigCreateParams.pCounterAvailabilityImage = pCounterAvailabilityImage;
RETURN_IF_NVPW_ERROR(false, NVPW_CUDA_RawMetricsConfig_Create_V2(&rawMetricsConfigCreateParams));
NVPA_RawMetricsConfig* pRawMetricsConfig = rawMetricsConfigCreateParams.pRawMetricsConfig;
if(pCounterAvailabilityImage)
{
NVPW_RawMetricsConfig_SetCounterAvailability_Params setCounterAvailabilityParams = {NVPW_RawMetricsConfig_SetCounterAvailability_Params_STRUCT_SIZE};
setCounterAvailabilityParams.pRawMetricsConfig = pRawMetricsConfig;
setCounterAvailabilityParams.pCounterAvailabilityImage = pCounterAvailabilityImage;
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_SetCounterAvailability(&setCounterAvailabilityParams));
}
NVPW_RawMetricsConfig_Destroy_Params rawMetricsConfigDestroyParams = { NVPW_RawMetricsConfig_Destroy_Params_STRUCT_SIZE };
rawMetricsConfigDestroyParams.pRawMetricsConfig = pRawMetricsConfig;
SCOPE_EXIT([&]() { NVPW_RawMetricsConfig_Destroy((NVPW_RawMetricsConfig_Destroy_Params *)&rawMetricsConfigDestroyParams); });
NVPW_RawMetricsConfig_BeginPassGroup_Params beginPassGroupParams = { NVPW_RawMetricsConfig_BeginPassGroup_Params_STRUCT_SIZE };
beginPassGroupParams.pRawMetricsConfig = pRawMetricsConfig;
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_BeginPassGroup(&beginPassGroupParams));
NVPW_RawMetricsConfig_AddMetrics_Params addMetricsParams = { NVPW_RawMetricsConfig_AddMetrics_Params_STRUCT_SIZE };
addMetricsParams.pRawMetricsConfig = pRawMetricsConfig;
addMetricsParams.pRawMetricRequests = rawMetricRequests.data();
addMetricsParams.numMetricRequests = rawMetricRequests.size();
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_AddMetrics(&addMetricsParams));
NVPW_RawMetricsConfig_EndPassGroup_Params endPassGroupParams = { NVPW_RawMetricsConfig_EndPassGroup_Params_STRUCT_SIZE };
endPassGroupParams.pRawMetricsConfig = pRawMetricsConfig;
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_EndPassGroup(&endPassGroupParams));
NVPW_RawMetricsConfig_GenerateConfigImage_Params generateConfigImageParams = { NVPW_RawMetricsConfig_GenerateConfigImage_Params_STRUCT_SIZE };
generateConfigImageParams.pRawMetricsConfig = pRawMetricsConfig;
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_GenerateConfigImage(&generateConfigImageParams));
NVPW_RawMetricsConfig_GetConfigImage_Params getConfigImageParams = { NVPW_RawMetricsConfig_GetConfigImage_Params_STRUCT_SIZE };
getConfigImageParams.pRawMetricsConfig = pRawMetricsConfig;
getConfigImageParams.bytesAllocated = 0;
getConfigImageParams.pBuffer = NULL;
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_GetConfigImage(&getConfigImageParams));
configImage.resize(getConfigImageParams.bytesCopied);
getConfigImageParams.bytesAllocated = configImage.size();
getConfigImageParams.pBuffer = configImage.data();
RETURN_IF_NVPW_ERROR(false, NVPW_RawMetricsConfig_GetConfigImage(&getConfigImageParams));
return true;
}
bool GetCounterDataPrefixImage(std::string chipName, const std::vector<std::string>& metricNames, std::vector<uint8_t>& counterDataImagePrefix, const uint8_t* pCounterAvailabilityImage)
{
std::vector<NVPA_RawMetricRequest> rawMetricRequests;
GetRawMetricRequests(chipName, metricNames, rawMetricRequests, pCounterAvailabilityImage);
NVPW_CUDA_CounterDataBuilder_Create_Params counterDataBuilderCreateParams = { NVPW_CUDA_CounterDataBuilder_Create_Params_STRUCT_SIZE };
counterDataBuilderCreateParams.pChipName = chipName.c_str();
counterDataBuilderCreateParams.pCounterAvailabilityImage = pCounterAvailabilityImage;
RETURN_IF_NVPW_ERROR(false, NVPW_CUDA_CounterDataBuilder_Create(&counterDataBuilderCreateParams));
NVPW_CounterDataBuilder_Destroy_Params counterDataBuilderDestroyParams = { NVPW_CounterDataBuilder_Destroy_Params_STRUCT_SIZE };
counterDataBuilderDestroyParams.pCounterDataBuilder = counterDataBuilderCreateParams.pCounterDataBuilder;
SCOPE_EXIT([&]() { NVPW_CounterDataBuilder_Destroy((NVPW_CounterDataBuilder_Destroy_Params *)&counterDataBuilderDestroyParams); });
NVPW_CounterDataBuilder_AddMetrics_Params addMetricsParams = { NVPW_CounterDataBuilder_AddMetrics_Params_STRUCT_SIZE };
addMetricsParams.pCounterDataBuilder = counterDataBuilderCreateParams.pCounterDataBuilder;
addMetricsParams.pRawMetricRequests = rawMetricRequests.data();
addMetricsParams.numMetricRequests = rawMetricRequests.size();
RETURN_IF_NVPW_ERROR(false, NVPW_CounterDataBuilder_AddMetrics(&addMetricsParams));
size_t counterDataPrefixSize = 0;
NVPW_CounterDataBuilder_GetCounterDataPrefix_Params getCounterDataPrefixParams = { NVPW_CounterDataBuilder_GetCounterDataPrefix_Params_STRUCT_SIZE };
getCounterDataPrefixParams.pCounterDataBuilder = counterDataBuilderCreateParams.pCounterDataBuilder;
getCounterDataPrefixParams.bytesAllocated = 0;
getCounterDataPrefixParams.pBuffer = NULL;
RETURN_IF_NVPW_ERROR(false, NVPW_CounterDataBuilder_GetCounterDataPrefix(&getCounterDataPrefixParams));
counterDataImagePrefix.resize(getCounterDataPrefixParams.bytesCopied);
getCounterDataPrefixParams.bytesAllocated = counterDataImagePrefix.size();
getCounterDataPrefixParams.pBuffer = counterDataImagePrefix.data();
RETURN_IF_NVPW_ERROR(false, NVPW_CounterDataBuilder_GetCounterDataPrefix(&getCounterDataPrefixParams));
return true;
}
}
}
}