SWDEV-296922 : Incorrect rounding due to integer division in rocprofiler metrics

Changed derived metrics to double from int64.
Fixed standalone test due to int64 to float change
Fixed intercept test due to int64 to float change.

Change-Id: I49631c187406ae9dd94a869b3bb13772012e8cdf
This commit is contained in:
Chun Yang
2021-08-11 19:55:31 -07:00
parent ca059e1aa9
commit f9017cbdc5
6 ha cambiato i file con 22 aggiunte e 8 eliminazioni
+4 -1
Vedi File
@@ -115,7 +115,10 @@ def parse_res(infile):
beg_pattern = re.compile("^dispatch\[(\d*)\], (.*) kernel-name\(\"([^\"]*)\"\)")
prop_pattern = re.compile("([\w-]+)\((\w+)\)");
ts_pattern = re.compile(", time\((\d*),(\d*),(\d*),(\d*)\)")
var_pattern = re.compile("^\s*([^\s]*)\s+\((\d*)\)")
# var pattern below matches a variable name and a variable value from a one
# line text in the format of for example "WRITE_SIZE (0.2500000000)" or
# "GRBM_GUI_ACTIVE (27867)"
var_pattern = re.compile("^\s*([a-zA-Z0-9_]+)\s+\((\d+(?:\.\d+)?)\)")
dispatch_number = 0
for line in inp.readlines():
+3 -3
Vedi File
@@ -55,7 +55,7 @@ inline unsigned align_size(unsigned size, unsigned alignment) {
template <class Map> class MetricArgs : public xml::args_cache_t {
public:
MetricArgs(const Map& map) : map_(map) {}
bool Lookup(const std::string& name, uint64_t& result) const {
bool Lookup(const std::string& name, double& result) const {
rocprofiler_feature_t* info = NULL;
auto it = map_.find(name);
if (it == map_.end()) EXC_RAISING(HSA_STATUS_ERROR, "var '" << name << "' is not found");
@@ -311,8 +311,8 @@ class Context {
if (it == info_map_.end())
EXC_RAISING(HSA_STATUS_ERROR, "metric '" << name << "', rocprofiler info is not found " << this);
rocprofiler_feature_t* info = it->second;
info->data.result_int64 = expr->Eval(args);
info->data.kind = ROCPROFILER_DATA_KIND_INT64;
info->data.result_double = expr->Eval(args);
info->data.kind = ROCPROFILER_DATA_KIND_DOUBLE;
}
}
}
+3 -2
Vedi File
@@ -29,6 +29,7 @@ THE SOFTWARE.
#include <iostream>
#include <sstream>
#include <string.h>
#include <float.h>
namespace xml {
class exception_t : public std::exception {
@@ -45,8 +46,8 @@ class div_zero_exception_t : public exception_t {
explicit div_zero_exception_t(const std::string& msg) : exception_t("Divide by zero exception " + msg) {}
};
typedef uint64_t args_t;
static const args_t ARGS_MAX = UINT64_MAX;
typedef double args_t;
static const args_t ARGS_MAX = DBL_MAX;
typedef std::map<std::string, args_t> args_map_t;
class Expr;
+3
Vedi File
@@ -124,6 +124,9 @@ void dump_context_entry(context_entry_t* entry, rocprofiler_feature_t* features,
case ROCPROFILER_DATA_KIND_INT64:
fprintf(stdout, "= (%lu)\n", p->data.result_int64);
break;
case ROCPROFILER_DATA_KIND_DOUBLE:
fprintf(stdout, "= (%lf)\n", p->data.result_double);
break;
default:
fprintf(stderr, "Undefined data kind(%u)\n", p->data.kind);
abort();
+3
Vedi File
@@ -78,6 +78,9 @@ void print_features(rocprofiler_feature_t* feature, uint32_t feature_count) {
case ROCPROFILER_DATA_KIND_INT64:
std::cout << std::dec << " result64 (" << p->data.result_int64 << ")" << std::endl;
break;
case ROCPROFILER_DATA_KIND_DOUBLE:
std::cout << " result64 (" << p->data.result_double << ")" << std::endl;
break;
case ROCPROFILER_DATA_KIND_BYTES: {
const char* ptr = reinterpret_cast<const char*>(p->data.result_bytes.ptr);
uint64_t size = 0;
+6 -2
Vedi File
@@ -351,6 +351,9 @@ void output_results(const context_entry_t* entry, const char* label) {
case ROCPROFILER_DATA_KIND_INT64:
fprintf(file, "(%lu)\n", p->data.result_int64);
break;
case ROCPROFILER_DATA_KIND_DOUBLE:
fprintf(file, "(%.10lf)\n", p->data.result_double);
break;
default:
fprintf(stderr, "RPL-tool: undefined data kind(%u)\n", p->data.kind);
abort();
@@ -358,12 +361,13 @@ void output_results(const context_entry_t* entry, const char* label) {
}
}
// Output group intermeadate profiling results, created internally for complex metrics
// Output group intermediate profiling results, created internally for complex metrics
void output_group(const context_entry_t* entry, const char* label) {
const rocprofiler_group_t* group = &(entry->group);
context_entry_t group_entry = *entry;
for (unsigned i = 0; i < group->feature_count; ++i) {
if (group->features[i]->data.kind == ROCPROFILER_DATA_KIND_INT64) {
if (group->features[i]->data.kind == ROCPROFILER_DATA_KIND_INT64 ||
group->features[i]->data.kind == ROCPROFILER_DATA_KIND_DOUBLE) {
group_entry.features = group->features[i];
group_entry.feature_count = 1;
output_results(&group_entry, label);