175 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			175 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/* Copyright 2017 The TensorFlow Authors. All Rights Reserved.
 | 
						|
 | 
						|
Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
you may not use this file except in compliance with the License.
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
    http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, software
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
==============================================================================*/
 | 
						|
 | 
						|
#ifndef TENSORFLOW_COMPILER_XLA_METRIC_TABLE_REPORT_H_
 | 
						|
#define TENSORFLOW_COMPILER_XLA_METRIC_TABLE_REPORT_H_
 | 
						|
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include "absl/strings/str_cat.h"
 | 
						|
#include "tensorflow/compiler/xla/util.h"
 | 
						|
 | 
						|
namespace xla {
 | 
						|
 | 
						|
// Class for creating a text format table showing entries with a metric
 | 
						|
// (e.g. cycles) and a text (e.g. name of function taking that many
 | 
						|
// cycles). Entries are grouped by a category and sorted in decreasing order of
 | 
						|
// the metric.
 | 
						|
//
 | 
						|
// Example of a categories table generated using this class:
 | 
						|
//
 | 
						|
// ********** microseconds report **********
 | 
						|
// There are 3,912,517 microseconds in total.
 | 
						|
// There are 123 microseconds ( 0.00%) not accounted for by the data.
 | 
						|
// There are 3002 ops.
 | 
						|
//
 | 
						|
// ********** categories table **********
 | 
						|
// The left hand side numbers are microseconds.
 | 
						|
// 1,749,414 (44.71% Σ44.72%)   convolution (206 ops)
 | 
						|
//                             * 10.51% %convolution.202
 | 
						|
//                             * 10.51% %convolution.204
 | 
						|
//                             * 10.51% %convolution.203
 | 
						|
//                             * ... (203 more ops)
 | 
						|
//   884,939 (22.62% Σ67.33%)   convolution window-dilated (7 ops)
 | 
						|
//                             *  7.50% %convolution-window-dilated.7
 | 
						|
// [...]
 | 
						|
//
 | 
						|
// The entry table is similar, it just has the entries directly as the entries
 | 
						|
// instead of grouping by categories first.
 | 
						|
class MetricTableReport {
 | 
						|
 public:
 | 
						|
  // Represents an entry in the table.
 | 
						|
  struct Entry {
 | 
						|
    // Text to show in the entry table for this entry.
 | 
						|
    string text;
 | 
						|
 | 
						|
    // Text to show in the category table for this entry.
 | 
						|
    string short_text;
 | 
						|
 | 
						|
    // Text that represents the category of this entry - entries with the same
 | 
						|
    // category are grouped together in the category table.
 | 
						|
    string category_text;
 | 
						|
 | 
						|
    // The value of the metric for this entry.
 | 
						|
    double metric = 0.0;
 | 
						|
  };
 | 
						|
 | 
						|
  void AddEntry(Entry entry);
 | 
						|
 | 
						|
  // The default name for the metric is "units", this function allows setting a
 | 
						|
  // more meaningful name.
 | 
						|
  void SetMetricName(string metric_name);
 | 
						|
 | 
						|
  // The default name for referring to entries is "entries", this functions
 | 
						|
  // allows setting a more meaningful name.
 | 
						|
  void SetEntryName(string entry_name);
 | 
						|
 | 
						|
  // By default the size of the table is limited. Calling this function forces
 | 
						|
  // all entries to be shown no matter how many there are.
 | 
						|
  void SetShowAllEntries();
 | 
						|
 | 
						|
  // Set option to show a table with data on the categories of entries.
 | 
						|
  void SetShowCategoryTable();
 | 
						|
 | 
						|
  // Set option to show a table with data on the entries.
 | 
						|
  void SetShowEntryTable();
 | 
						|
 | 
						|
  // Returns the report as a string. expected_metric_sum is the expected sum of
 | 
						|
  // the metric across the entries. It is not an error for the actual sum to be
 | 
						|
  // different from the expectation - the report will include the
 | 
						|
  // discrepancy. All metric percentages are for the ratio with respect to the
 | 
						|
  // expected sum, not the actual sum.
 | 
						|
  string MakeReport(double expected_metric_sum);
 | 
						|
 | 
						|
  // As MakeReport(), but writes the report to the INFO log in a way that avoids
 | 
						|
  // cutting the report off if it is longer than the maximum line length for a
 | 
						|
  // logged line. Individual lines in the report may still be cut off, but they
 | 
						|
  // would have to be very long for that to happen.
 | 
						|
  void WriteReportToInfoLog(double expected_metric_sum);
 | 
						|
 | 
						|
 private:
 | 
						|
  static constexpr double kDefaultMaxMetricProportionToShow = 0.99;
 | 
						|
  static constexpr int64 kDefaultMaxEntriesToShow = 100;
 | 
						|
  static constexpr int64 kDefaultMaxEntriesPerCategoryToShow = 5;
 | 
						|
 | 
						|
  // Append all parameters to the report.
 | 
						|
  template <typename... Args>
 | 
						|
  void AppendLine(Args... args) {
 | 
						|
    absl::StrAppend(&report_, std::forward<Args>(args)..., "\n");
 | 
						|
  }
 | 
						|
 | 
						|
  // Represents a set of entries with the same category_text.
 | 
						|
  struct Category {
 | 
						|
    string category_text;
 | 
						|
    double metric_sum = 0.0;  // Sum of metric across entries.
 | 
						|
    std::vector<const Entry*> entries;
 | 
						|
  };
 | 
						|
 | 
						|
  // Returns a vector of categories of entries with the same category_text. The
 | 
						|
  // vector is sorted in order of decreasing metric sum.
 | 
						|
  //
 | 
						|
  // The returned categories contain pointers into the entries parameter. The
 | 
						|
  // style guide requires parameters to which references/pointers are retained
 | 
						|
  // to be taken by pointer, even for const parameters, so that is why entries
 | 
						|
  // is taken by pointer.
 | 
						|
  static std::vector<Category> MakeCategories(
 | 
						|
      const std::vector<Entry>* entries);
 | 
						|
 | 
						|
  // Append a header to the report.
 | 
						|
  void AppendHeader();
 | 
						|
 | 
						|
  // Append a table of categories to the report.
 | 
						|
  void AppendCategoryTable();
 | 
						|
 | 
						|
  // Append a table of entries to the report.
 | 
						|
  void AppendEntryTable();
 | 
						|
 | 
						|
  // Appends a row of a table to the report.
 | 
						|
  void AppendTableRow(const string& text, const double metric,
 | 
						|
                      const double running_metric_sum);
 | 
						|
 | 
						|
  // Returns the discrepancy between the expected sum of the metric of the
 | 
						|
  // entries and the actual sum.
 | 
						|
  double UnaccountedMetric();
 | 
						|
 | 
						|
  // Formats the metric value as a string.
 | 
						|
  string MetricString(double metric);
 | 
						|
 | 
						|
  // Returns a string representing the metric value as a proportion of the
 | 
						|
  // expected metric sum.
 | 
						|
  string MetricPercent(double metric);
 | 
						|
 | 
						|
  // The entries to make a report about.
 | 
						|
  std::vector<Entry> entries_;
 | 
						|
 | 
						|
  double expected_metric_sum_ = 0.0;
 | 
						|
  string metric_name_ = "units";
 | 
						|
  string entry_name_ = "entries";
 | 
						|
  bool show_category_table_ = false;
 | 
						|
  bool show_entry_table_ = false;
 | 
						|
 | 
						|
  // These members control how many categories and entries to show in tables.
 | 
						|
  int64 max_entries_to_show_ = kDefaultMaxEntriesToShow;
 | 
						|
  int64 max_entries_per_category_to_show_ = kDefaultMaxEntriesPerCategoryToShow;
 | 
						|
  double max_metric_proportion_to_show_ = kDefaultMaxMetricProportionToShow;
 | 
						|
 | 
						|
  // The report that is being created.
 | 
						|
  string report_;
 | 
						|
};
 | 
						|
 | 
						|
}  // namespace xla
 | 
						|
 | 
						|
#endif  // TENSORFLOW_COMPILER_XLA_METRIC_TABLE_REPORT_H_
 |