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