1 /*******************************************************************************
2 * Copyright 2019-2021 Intel Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16 
17 #ifndef SUM_HPP
18 #define SUM_HPP
19 
20 #include <iostream>
21 
22 #include "oneapi/dnnl/dnnl.h"
23 
24 #include "common.hpp"
25 #include "dnn_types.hpp"
26 #include "dnnl_common.hpp"
27 #include "dnnl_memory.hpp"
28 #include "utils/perf_report.hpp"
29 
30 namespace sum {
31 
32 struct settings_t {
33     settings_t() = default;
34 
35     // ctor to save certain fields from resetting
settings_tsum::settings_t36     settings_t(const char *perf_template) : settings_t() {
37         this->perf_template = perf_template;
38     }
39 
40     prb_dims_t prb_dims;
41 
42     std::vector<std::vector<dnnl_data_type_t>> sdt {{dnnl_f32, dnnl_f32}};
43     std::vector<dnnl_data_type_t> ddt {dnnl_f32};
44     std::vector<std::vector<std::string>> stag {{tag::abx}};
45     std::vector<std::string> dtag {tag::undef};
46     std::vector<std::vector<float>> scales {{1}};
47     std::vector<dnnl_scratchpad_mode_t> scratchpad_mode {
48             dnnl_scratchpad_mode_library};
49 
50     const char *perf_template_csv
51             = "perf,%engine%,%impl%,%sdt%,%ddt%,%stag%,%dtag%,%DESC%,%-time%,%"
52               "0time%";
53     const char *perf_template_def
54             = "perf,%engine%,%impl%,%prb%,%-time%,%0time%";
55     const char *perf_template = perf_template_def;
56 
resetsum::settings_t57     void reset() { *this = settings_t(perf_template); }
58 };
59 
60 struct prb_t : public prb_dims_t {
prb_tsum::prb_t61     prb_t(const prb_dims_t &prb_dims, const std::vector<dnnl_data_type_t> &sdt,
62             dnnl_data_type_t ddt, const std::vector<std::string> &stag,
63             const std::string &dtag, const std::vector<float> &scales,
64             const attr_t &attr)
65         : prb_dims_t(prb_dims)
66         , sdt(sdt)
67         , ddt(ddt)
68         , stag(stag)
69         , dtag(dtag)
70         , scales(sdt.size())
71         , attr(attr) {
72         // if there is a single scale then broadcast it
73         for (int i_input = 0; i_input < n_inputs(); i_input++)
74             this->scales[i_input]
75                     = ((int)scales.size() == 1) ? scales[0] : scales[i_input];
76     }
~prb_tsum::prb_t77     ~prb_t() {}
78 
79     std::vector<dnnl_data_type_t> sdt;
80     dnnl_data_type_t ddt;
81     std::vector<std::string> stag;
82     std::string dtag;
83     std::vector<float> scales;
84     attr_t attr;
85 
n_inputssum::prb_t86     int n_inputs() const { return (int)sdt.size(); }
87 };
88 std::ostream &operator<<(std::ostream &s, const prb_t &prb);
89 
90 struct perf_report_t : public base_perf_report_t {
perf_report_tsum::perf_report_t91     perf_report_t(const prb_t *prb, const char *perf_template)
92         : base_perf_report_t(perf_template)
93         , p_(prb)
94         , stag_({})
95         , dtag_(normalize_tag(p_->dtag, p_->ndims)) {
96         for (size_t d = 0; d < p_->stag.size(); d++)
97             stag_.push_back(normalize_tag(p_->stag[d], p_->ndims));
98     }
99 
dump_descsum::perf_report_t100     void dump_desc(std::ostream &s) const override {
101         s << static_cast<const prb_dims_t &>(*p_);
102     }
103 
dump_desc_csvsum::perf_report_t104     void dump_desc_csv(std::ostream &s) const override { dump_desc(s); }
105 
sdtsum::perf_report_t106     const std::vector<dnnl_data_type_t> *sdt() const override {
107         return &p_->sdt;
108     }
ddtsum::perf_report_t109     const dnnl_data_type_t *ddt() const override { return &p_->ddt; }
stagsum::perf_report_t110     const std::vector<std::string> *stag() const override { return &stag_; }
dtagsum::perf_report_t111     const std::string *dtag() const override { return &dtag_; }
112 
113 private:
114     const prb_t *p_;
115     std::vector<std::string> stag_;
116     std::string dtag_;
117 };
118 
119 void compute_ref(
120         const prb_t *prb, const std::vector<dnn_mem_t> &src, dnn_mem_t &dst);
121 
122 int doit(const prb_t *prb, res_t *res);
123 int bench(int argc, char **argv);
124 
125 } // namespace sum
126 
127 #endif
128