1/*******************************************************************************
2* Copyright 2017-2022 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#include <float.h>
18#include <math.h>
19#include <stdio.h>
20#include <stdlib.h>
21#include <string.h>
22
23#include "oneapi/dnnl/dnnl.h"
24
25#include "common.hpp"
26#include "dnnl_common.hpp"
27#include "dnnl_memory.hpp"
28#include "utils/parser.hpp"
29
30#include "binary/binary.hpp"
31#include "bnorm/bnorm.hpp"
32#include "brgemm/brgemm.hpp"
33#include "concat/concat.hpp"
34#include "conv/conv.hpp"
35#include "deconv/deconv.hpp"
36#include "eltwise/eltwise.hpp"
37#include "ip/ip.hpp"
38#include "lnorm/lnorm.hpp"
39#include "lrn/lrn.hpp"
40#include "matmul/matmul.hpp"
41#include "pool/pool.hpp"
42#include "prelu/prelu.hpp"
43#include "reduction/reduction.hpp"
44#include "reorder/reorder.hpp"
45#include "resampling/resampling.hpp"
46#include "rnn/rnn.hpp"
47#include "self/self.hpp"
48#include "shuffle/shuffle.hpp"
49#include "softmax/softmax.hpp"
50#include "sum/sum.hpp"
51#include "zeropad/zeropad.hpp"
52
53int verbose {0};
54bool canonical {false};
55bool mem_check {true};
56std::string skip_impl;
57bench_mode_t bench_mode {CORR};
58stat_t benchdnn_stat {0};
59std::string driver_name;
60
61double max_ms_per_prb {3e3};
62int min_times_per_prb {5};
63int fix_times_per_prb {0};
64
65bool fast_ref_gpu {DNNL_CPU_RUNTIME != DNNL_RUNTIME_NONE};
66
67bool allow_enum_tags_only {true};
68int test_start {0};
69bool attr_same_pd_check {false};
70
71int main(int argc, char **argv) {
72 using namespace parser;
73
74 if (argc < 2) {
75 fprintf(stderr, "err: no arguments passed\n");
76 return 1;
77 }
78
79 --argc;
80 ++argv;
81
82 if (parse_main_help(argv[0])) return 0;
83
84 init_fp_mode();
85
86 for (; argc > 0; --argc, ++argv)
87 if (!parse_bench_settings(argv[0])) break;
88
89 if (!strcmp("--self", argv[0])) {
90 self::bench(--argc, ++argv);
91 } else if (!strcmp("--conv", argv[0])) {
92 conv::bench(--argc, ++argv);
93 } else if (!strcmp("--deconv", argv[0])) {
94 deconv::bench(--argc, ++argv);
95 } else if (!strcmp("--ip", argv[0])) {
96 ip::bench(--argc, ++argv);
97 } else if (!strcmp("--shuffle", argv[0])) {
98 shuffle::bench(--argc, ++argv);
99 } else if (!strcmp("--reorder", argv[0])) {
100 reorder::bench(--argc, ++argv);
101 } else if (!strcmp("--bnorm", argv[0])) {
102 bnorm::bench(--argc, ++argv);
103 } else if (!strcmp("--lnorm", argv[0])) {
104 lnorm::bench(--argc, ++argv);
105 } else if (!strcmp("--rnn", argv[0])) {
106 rnn::bench(--argc, ++argv);
107 } else if (!strcmp("--softmax", argv[0])) {
108 softmax::bench(--argc, ++argv);
109 } else if (!strcmp("--pool", argv[0])) {
110 pool::bench(--argc, ++argv);
111 } else if (!strcmp("--prelu", argv[0])) {
112 prelu::bench(--argc, ++argv);
113 } else if (!strcmp("--sum", argv[0])) {
114 sum::bench(--argc, ++argv);
115 } else if (!strcmp("--eltwise", argv[0])) {
116 eltwise::bench(--argc, ++argv);
117 } else if (!strcmp("--concat", argv[0])) {
118 concat::bench(--argc, ++argv);
119 } else if (!strcmp("--lrn", argv[0])) {
120 lrn::bench(--argc, ++argv);
121 } else if (!strcmp("--binary", argv[0])) {
122 binary::bench(--argc, ++argv);
123 } else if (!strcmp("--matmul", argv[0])) {
124 matmul::bench(--argc, ++argv);
125 } else if (!strcmp("--resampling", argv[0])) {
126 resampling::bench(--argc, ++argv);
127 } else if (!strcmp("--reduction", argv[0])) {
128 reduction::bench(--argc, ++argv);
129 } else if (!strcmp("--zeropad", argv[0])) {
130 zeropad::bench(--argc, ++argv);
131 } else if (!strcmp("--brgemm", argv[0])) {
132 brgemm::bench(--argc, ++argv);
133 } else {
134 fprintf(stderr, "err: unknown driver\n");
135 }
136
137 printf("tests:%d passed:%d skipped:%d mistrusted:%d unimplemented:%d "
138 "invalid_arguments:%d failed:%d listed:%d\n",
139 benchdnn_stat.tests, benchdnn_stat.passed, benchdnn_stat.skipped,
140 benchdnn_stat.mistrusted, benchdnn_stat.unimplemented,
141 benchdnn_stat.invalid_arguments, benchdnn_stat.failed,
142 benchdnn_stat.listed);
143 if (is_bench_mode(PERF)) {
144 printf("total perf: min(ms):%g avg(ms):%g\n",
145 benchdnn_stat.ms[timer::timer_t::min],
146 benchdnn_stat.ms[timer::timer_t::avg]);
147 }
148 if (is_bench_mode(CORR)) {
149 const auto compute_ref_time_s = benchdnn_stat.ms[timer::timer_t::sum];
150 printf("total compute_ref: sum(s):%.2f\n", compute_ref_time_s);
151 }
152
153 reset_gpu_profiling();
154
155 return !!benchdnn_stat.failed;
156}
157